From d2738a223a4707c78de9ce0e22d2c0a573ff7642 Mon Sep 17 00:00:00 2001 From: Melroy van den Berg Date: Sun, 28 Mar 2021 22:56:10 +0200 Subject: [PATCH] Introduce Settings schema file (gsettings) --- src/CMakeLists.txt | 64 ++++++++++++++++++++++++---- src/mainwindow.cc | 32 ++++++++++++-- src/mainwindow.h | 5 ++- src/org.libreweb.browser.gschema.xml | 17 ++++++++ 4 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 src/org.libreweb.browser.gschema.xml diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3767114..0e770b4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -18,11 +18,11 @@ set(PROJECT_TARGET libreweb-browser) set(THREADS_PREFER_PTHREAD_FLAG ON) +# Find required dependencies find_package(Threads REQUIRED) - find_package(PkgConfig REQUIRED) -pkg_check_modules(GTKMM gtkmm-3.0) -pkg_check_modules(CAIRO cairomm-1.0) +pkg_check_modules(GTKMM REQUIRED gtkmm-3.0) +pkg_check_modules(GLIB REQUIRED glib-2.0) add_definitions(${GTKMM_CFLAGS_OTHER}) @@ -39,8 +39,39 @@ if(NOT json_POPULATED) add_subdirectory(${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL) endif() +# Generate Project version header file configure_file(${CMAKE_CURRENT_SOURCE_DIR}/project_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/project_config.h) + # Find the GLib path for schema installation + execute_process( + COMMAND + ${PKG_CONFIG_EXECUTABLE} + glib-2.0 + --variable prefix + OUTPUT_VARIABLE + _glib_prefix + OUTPUT_STRIP_TRAILING_WHITESPACE +) +set(GSETTINGS_DIR "${_glib_prefix}/share/glib-2.0/schemas/" CACHE INTERNAL "") + +# Fetch path for schema compiler from pkg-config +execute_process( + COMMAND + ${PKG_CONFIG_EXECUTABLE} + gio-2.0 + --variable + glib_compile_schemas + OUTPUT_VARIABLE + _glib_compile_schemas + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Set glib schema compiler command +set(glib_schema_compiler ${_glib_compile_schemas} CACHE INTERNAL "") + +set(SCHEMA_FILE ${CMAKE_CURRENT_SOURCE_DIR}/org.libreweb.browser.gschema.xml) + +# Source code set(HEADERS about.h file.h @@ -51,7 +82,6 @@ set(HEADERS draw.h source-code-dialog.h ) - set(SOURCES main.cc about.cc @@ -67,6 +97,21 @@ set(SOURCES add_executable(${PROJECT_TARGET} ${SOURCES}) +# Copy gschema.xml file to build directory +set(SCHEMA_DIR ${CMAKE_CURRENT_BINARY_DIR}/gsettings) +add_custom_command( + TARGET ${PROJECT_TARGET} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${SCHEMA_FILE} + ${SCHEMA_DIR}/org.libreweb.browser.gschema.xml +) + +add_custom_command( + TARGET ${PROJECT_TARGET} POST_BUILD + COMMAND ${glib_schema_compiler} ${SCHEMA_DIR} + COMMENT "Compiling schemas in folder: ${SCHEMA_DIR}" +) + # Add fallback for std filesystem in older GCC versions if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.4) @@ -88,15 +133,18 @@ target_include_directories(${PROJECT_TARGET} PRIVATE ${CMAKE_BINARY_DIR} ${CMAKE_EXTENSIONS_BINARY_DIR} ${GTKMM_INCLUDE_DIRS} - ${CAIRO_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/lib/ipfs-http-client/include - ) +) target_link_directories(${PROJECT_TARGET} PRIVATE ${GTKMM_LIBRARY_DIRS} - ${CAIRO_LIBRARY_DIRS} ) -target_link_libraries(${PROJECT_TARGET} PRIVATE LibCommonMarker LibCommonMarkerExtensions ipfs-http-client Threads::Threads ${CXX_FILESYSTEM_LIBRARIES} ${GTKMM_LIBRARIES} ${CAIRO_LIBRARIES} nlohmann_json::nlohmann_json) +target_link_libraries(${PROJECT_TARGET} PRIVATE LibCommonMarker LibCommonMarkerExtensions ipfs-http-client Threads::Threads ${CXX_FILESYSTEM_LIBRARIES} ${GTKMM_LIBRARIES} nlohmann_json::nlohmann_json) +# Install browser binary install(TARGETS ${PROJECT_TARGET} RUNTIME DESTINATION "bin" COMPONENT applications) + +# Install & compile GTK schema file +install(FILES ${SCHEMA_FILE} DESTINATION ${GSETTINGS_DIR}) +install(CODE "execute_process (COMMAND ${glib_schema_compiler} ${GSETTINGS_DIR})") diff --git a/src/mainwindow.cc b/src/mainwindow.cc index 288d598..f785a77 100644 --- a/src/mainwindow.cc +++ b/src/mainwindow.cc @@ -10,14 +10,16 @@ #include #include #include +#include #include #include #include #include MainWindow::MainWindow() - : accelGroup(Gtk::AccelGroup::create()), - m_menu(accelGroup), + : m_accelGroup(Gtk::AccelGroup::create()), + m_settings(), + m_menu(m_accelGroup), m_draw_main(*this), m_draw_secondary(*this), m_vbox(Gtk::ORIENTATION_VERTICAL, 0), @@ -41,7 +43,17 @@ MainWindow::MainWindow() set_title(m_appName); set_default_size(1000, 800); set_position(Gtk::WIN_POS_CENTER); - add_accel_group(accelGroup); + add_accel_group(m_accelGroup); + + // if(app is not installed/DEBUG?) + Glib::setenv("GSETTINGS_SCHEMA_DIR", "/media/melroy/Data/Projects/browser/build/src/gsettings", true); + m_settings = Gio::Settings::create("org.libreweb.browser"); + + m_settings->set_int("width", this->get_width()); + m_settings->set_int("height", this->get_height()); + m_settings->set_boolean("is-maximized", this->is_maximized()); + // Fullscreen will be availible with gtkmm-4.0 + //m_settings->set_boolean("is-fullscreen", this->is_fullscreen()); m_statusPopover.set_position(Gtk::POS_BOTTOM); m_statusPopover.set_size_request(200, 80); @@ -53,7 +65,10 @@ MainWindow::MainWindow() // Timeouts this->statusTimerHandler = Glib::signal_timeout().connect(sigc::mem_fun(this, &MainWindow::update_connection_status), 3000); - // Connect signals + // Window signals + this->signal_delete_event().connect(sigc::mem_fun(this, &MainWindow::delete_window)); + + // Menu & toolbar signals m_menu.new_doc.connect(sigc::mem_fun(this, &MainWindow::new_doc)); /*!< Menu item for new document */ m_menu.open.connect(sigc::mem_fun(this, &MainWindow::open)); /*!< Menu item for opening existing document */ m_menu.save.connect(sigc::mem_fun(this, &MainWindow::save)); /*!< Menu item for save document */ @@ -404,6 +419,15 @@ void MainWindow::doRequest(const std::string &path, bool setAddressBar, bool isH } } +/** + * \brief Called when Window is closed + */ +bool MainWindow::delete_window(GdkEventAny* any_event) +{ + std::cout << "Yes.." << std::endl; + return false; +} + /** * \brief Timeout slot: Update the IPFS connection status every x seconds */ diff --git a/src/mainwindow.h b/src/mainwindow.h index 5d0663d..4c1fea3 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -19,6 +19,7 @@ #include #include #include +#include #include /** @@ -33,6 +34,7 @@ public: protected: // Signal handlers + bool delete_window(GdkEventAny* any_event); bool update_connection_status(); void cut(); void copy(); @@ -60,7 +62,8 @@ protected: void show_source_code_dialog(); void get_heading(); - Glib::RefPtr accelGroup; /*!< Accelerator group, used for keyboard shortcut bindings */ + Glib::RefPtr m_accelGroup; /*!< Accelerator group, used for keyboard shortcut bindings */ + Glib::RefPtr m_settings; /*!< Settings to store our preferences, even during restarts */ // Child widgets Menu m_menu; diff --git a/src/org.libreweb.browser.gschema.xml b/src/org.libreweb.browser.gschema.xml new file mode 100644 index 0000000..f0ef68d --- /dev/null +++ b/src/org.libreweb.browser.gschema.xml @@ -0,0 +1,17 @@ + + + + + 1000 + Window width + + + 800 + Window height + + + false + Window maximized + + +