From 09dec65950ac1b5070cd847271a284059fc7de38 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Wed, 3 May 2017 22:31:03 +0200 Subject: [PATCH] UI-top-level: drop the UI Application singleton integrate the remaining functionality of GtkLumiera into the GUI starter plug-in --- src/gui/config-keys.hpp | 2 +- src/gui/ctrl/ui-manager.cpp | 9 ++- src/gui/gtk-base.hpp | 2 +- src/gui/{guistart.cpp => gtk-lumiera.cpp} | 44 ++++++------ src/gui/gtk-lumiera.hpp | 88 ----------------------- src/gui/guifacade.hpp | 2 +- 6 files changed, 33 insertions(+), 114 deletions(-) rename src/gui/{guistart.cpp => gtk-lumiera.cpp} (90%) delete mode 100644 src/gui/gtk-lumiera.hpp diff --git a/src/gui/config-keys.hpp b/src/gui/config-keys.hpp index eb8409737..a5c395381 100644 --- a/src/gui/config-keys.hpp +++ b/src/gui/config-keys.hpp @@ -34,7 +34,7 @@ ** to refer to the installation directory of the currently executing program. ** This allows for a relocatable Lumiera installation bundle. ** - ** @see guistart.cpp the plugin to pull up this GUI + ** @see gtk-lumiera.cpp the plugin to pull up this GUI ** @see lumiera::BasicSetup definition of the acceptable configuration values ** @see lumiera::AppState general Lumiera application main ** @see lumiera::Config diff --git a/src/gui/ctrl/ui-manager.cpp b/src/gui/ctrl/ui-manager.cpp index 4a3cc5d2d..dbc6a88e5 100644 --- a/src/gui/ctrl/ui-manager.cpp +++ b/src/gui/ctrl/ui-manager.cpp @@ -40,9 +40,8 @@ #include "lib/searchpath.hpp" #include "lib/util.hpp" -using Gtk::IconSize; -using Gtk::IconFactory; - +#include + using util::cStr; using util::isnil; @@ -50,8 +49,12 @@ using util::isnil; namespace gui { namespace ctrl { + using Gtk::IconSize; + using Gtk::IconFactory; + using workspace::StyleManager; + namespace { // dummy command line for GTK int argc =0; } diff --git a/src/gui/gtk-base.hpp b/src/gui/gtk-base.hpp index 7519fe07f..b981bbfc6 100644 --- a/src/gui/gtk-base.hpp +++ b/src/gui/gtk-base.hpp @@ -45,7 +45,7 @@ ** @warning include here only what is absolutely necessary, ** for sake of compilation times and (debug) executable size. ** - ** @see guistart.cpp the plugin to pull up this GUI + ** @see gtk-lumiera.cpp the plugin to pull up this GUI ** @see gui::GuiFacade access point for starting the GUI ** @see gui::GuiNotification interface for communication with the gui from the lower layers ** @see lumiera::Config diff --git a/src/gui/guistart.cpp b/src/gui/gtk-lumiera.cpp similarity index 90% rename from src/gui/guistart.cpp rename to src/gui/gtk-lumiera.cpp index 399d7f777..bcc8049e2 100644 --- a/src/gui/guistart.cpp +++ b/src/gui/gtk-lumiera.cpp @@ -1,5 +1,5 @@ /* - GuiStart - entry point for the lumiera GUI loaded as shared module + GtkLumiera - entry point for the lumiera GUI loaded as shared module Copyright (C) Lumiera.org 2007-2008, Joel Holdsworth @@ -23,7 +23,7 @@ * *****************************************************/ -/** @file guistart.cpp +/** @file gtk-lumiera.cpp ** Start up the Lumiera GTK GUI when loading it as dynamic module. ** This plugin is linked together with the Lumiera GUI code; when loaded as ** Lumiera plugin, it allows to kick off the GTK main event loop and thus to bring @@ -36,45 +36,43 @@ ** body, while the interface is opened via an InstanceHandle member. The `launchUI()` call ** starts a new thread, which then becomes the UI event thread and remains blocked within ** the main GTK event loop. Before entering this loop, the CoreService of the GUI and - ** especially the [UI-Bus](\ref ui-bus.hpp) is started see \ref GtkLumiera::main(). + ** especially the [UI-Bus](\ref ui-bus.hpp) is started see \ref GtkLumiera::run(). ** This entails also to open the primary "business" interface(s) of the GUI ** (currently as of 1/16 this is the interface gui::GuiNotification.) ** ** @see lumiera::AppState ** @see gui::GuiFacade ** @see guifacade.cpp - ** @see gui::GtkLumiera#main the GTK GUI main + ** @see ui-manager.hpp */ -//--------------------tricky special Include sequence -#include "lib/hash-standard.hpp"// need to be before any inclusion of -#include // need to include this to prevent errors when libintl.h defines textdomain (because gtk-lumiera removes the def when ENABLE_NLS isn't defined) - -#include "gui/gtk-lumiera.hpp" // need to include this before nobugcfg.h, because types.h from GTK tries to shaddow the ERROR macro from windows, which kills nobug's ERROR macro -//--------------------tricky special Include sequence +#include "gui/gtk-base.hpp" #include "lib/error.hpp" +#include "gui/ui-bus.hpp" #include "gui/guifacade.hpp" +#include "gui/ctrl/ui-manager.hpp" #include "gui/display-service.hpp" -#include "common/subsys.hpp" #include "backend/thread-wrapper.hpp" -#include "lib/depend.hpp" +#include "common/subsys.hpp" extern "C" { #include "common/interface.h" #include "common/interface-descriptor.h" } +#include #include -using std::string; using backend::Thread; using lumiera::Subsys; using lumiera::error::LUMIERA_ERROR_STATE; using gui::LUMIERA_INTERFACE_INAME(lumieraorg_Gui, 1); +using std::string; + namespace gui { @@ -82,17 +80,19 @@ namespace gui { /**************************************************************************//** * Implement the necessary steps for actually making the Lumiera Gui available. - * Open the business interface(s) and start up the GTK GUI main event loop. + * Establish the UI backbone services and start up the GTK GUI main event loop. * @todo to ensure invocation of the termination signal, any members * should be failsafe on initialisation (that means, we must not * open other interfaces here...) ///////////////////////////TICKET #82 */ - struct GuiLifecycle + class GtkLumiera + : boost::noncopyable { DisplayService activateDisplayService_; ///////////////////////////TICKET #82 will go away once we have a real OutputSlot offered by the UI - GuiLifecycle () - : activateDisplayService_() // opens the gui::Display facade interface + public: + GtkLumiera () + : activateDisplayService_() ///////////////////////////TICKET #82 obsolete (and incurs a race) { } @@ -102,8 +102,12 @@ namespace gui { string errorMsgBuff; try { + UiBus uiBus; + ctrl::UiManager uiManager(uiBus); + // execute the GTK Event Loop____________ - GtkLumiera::application().run(); /////////////TICKET #1048 : do not access GtkLumiera as singleton, rather just place it as local variable on the stack here + uiManager.createApplicationWindow(); + uiManager.performMainLoop(); } // all went well, regular shutdown catch (lumiera::Error& problem) @@ -126,7 +130,7 @@ namespace gui { void runGUI (Subsys::SigTerm& reportOnTermination) { - GuiLifecycle{}.run (reportOnTermination); + GtkLumiera{}.run (reportOnTermination); } } // (End) impl details @@ -238,7 +242,7 @@ extern "C" { /* ================== define a lumieraorg_Gui instance ============ , NULL /* on close */ , LUMIERA_INTERFACE_INLINE (launchUI, bool, (void* termSig), - { + { return gui::launchUI (*reinterpret_cast (termSig)); } ) diff --git a/src/gui/gtk-lumiera.hpp b/src/gui/gtk-lumiera.hpp deleted file mode 100644 index 7762921df..000000000 --- a/src/gui/gtk-lumiera.hpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - GTK-LUMIERA.hpp - The Lumiera GUI Application Object - - Copyright (C) Lumiera.org - 2008, Joel Holdsworth - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version 2 of - the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - - -/** @file gtk-lumiera.hpp - ** The main application object. - ** Invoking the GtkLumiera::main() function brings up the GUI; this - ** function will block in the GTK event thread until the Application gets - ** closed by user interaction or by triggering a shutdown via the GuiNotificationFacade. - ** GtkLumiera is a singleton and owns the central WindowList instance used for - ** opening all windows and registering and loading icons and resources. - ** - ** \par configuration and resource search - ** The GUI object retrieves the necessary configuration values from lumiera::Config, - ** the config facade in the application core. Currently as of 2/2011 these values are - ** loaded from setup.ini, because the full-blown config system is not yet implemented. - ** Amongst others, this configuration defines a search path for icons and a - ** separate search path for resources. These path specs may use the token \c $ORIGIN - ** to refer to the installation directory of the currently executing program. - ** This allows for a relocatable Lumiera installation bundle. - ** - ** @see guistart.cpp the plugin to pull up this GUI - ** @see gui::GuiFacade access point for starting the GUI - ** @see gui::GuiNotification interface for communication with the gui from the lower layers - ** @see lumiera::Config - ** @see lumiera::BasicSetup definition of the acceptable configuration values - ** @see lumiera::AppState general Lumiera application main - ** - */ - -#ifndef GUI_GTK_LUMIERA_H -#define GUI_GTK_LUMIERA_H - - -#include "gui/gtk-base.hpp" - -#include - - -namespace gui { - - - - - /* ====== The Application Class ====== */ - - /** - * Top level entry point: The Lumiera GTK UI. - * @todo as of 12/2016 this is a singleton, which is sketchy. - * It should be instantiated in local scope of GuiLifecycle - * within guistart.cpp and discarded right after shutdown ///////////////TICKET #1048 : rectify lifecycle - */ - class GtkLumiera - : boost::noncopyable - { - - public: - /** access the the global application object */ - static GtkLumiera& application(); ////////////////////////////TICKET #1048 : this loophole needs to be closed - - - - /** start up the GUI and run the event thread */ - void run(); - - }; - -}// namespace gui -#endif diff --git a/src/gui/guifacade.hpp b/src/gui/guifacade.hpp index b26288219..9c0c3f909 100644 --- a/src/gui/guifacade.hpp +++ b/src/gui/guifacade.hpp @@ -69,7 +69,7 @@ namespace gui { * somewhat special, as its sole purpose is to expose the subsystem * descriptor, which, when started, loads the GUI as a plugin and * invokes `launchUI(term)` there. For the implementation see - * gui::GuiRunner (guifacade.cpp) and guistart.cpp (the plugin). + * gui::GuiRunner (guifacade.cpp) and gtk-lumiera.cpp (the plugin). * * @note this facade is intended to be used by Lumiera main solely. * client code should always use the "business" interface(s).