Lumiera
0.pre.03
»edit your freedom«
|
Go to the source code of this file.
Implementation of notifications and updates within the GUI.
This is the actual service implementation and runs within the GUI plugin.
Since GTK is not threadsafe by design, any external invocation passed through this facade service will be dispatched explicitly into the GTK event loop thread. The implementation of this dispatch is based upon Glib::Dispatcher
and thus requires this service instance to be created from within the thread performing the GTK event loop. Moreover, to avoid segmentation faults on shutdown, the lifespan of this service instance must exceed the running of the event loop, since otherwise the event loop might invoke a lambda bound to the this
pointer of a NotificationService already decommissioned. The setup of the standard Lumiera UI top-level context ensures these requirements, since the UiManager::performMainLoop() maintains the NotificationService instance and also performs the blocking gtk_main()
call. Consequently, any invocation added from other threads after leaving the GTK main loop but before closing the GuiNotification facade will just be enqueued, but then dropped on destruction of the UiDispatcher PImpl.
Beyond that dispatching functionality, the NotificationService just serves as entry point to send messages through the UI-Bus towards UI elements identified by EntryID. Even notifications and error messages are handled this way, redirecting them toward a dedicated Log display
Definition in file notification-service.cpp.
#include "stage/ctrl/ui-manager.hpp"
#include "stage/ctrl/ui-dispatcher.hpp"
#include "stage/notification-service.hpp"
#include "stage/interact/wizard.hpp"
#include "include/ui-protocol.hpp"
#include "lib/diff/mutation-message.hpp"
#include "lib/diff/gen-node.hpp"
#include "include/logging.h"
#include "lib/format-string.hpp"
#include "lib/depend.hpp"
#include "lib/util.hpp"
#include "common/interface-descriptor.h"
#include <utility>
#include <string>
Functions | |
LUMIERA_INTERFACE_INSTANCE (lumieraorg_interfacedescriptor, 0, lumieraorg_GuiNotificationFacade_descriptor, NULL, NULL, NULL, LUMIERA_INTERFACE_INLINE(name, const char *,(LumieraInterface ifa), {(void) ifa;return "GuiNotification";}), LUMIERA_INTERFACE_INLINE(brief, const char *,(LumieraInterface ifa), {(void) ifa;return "Stage Interface: push state update and notification of events into the GUI";}), LUMIERA_INTERFACE_INLINE(homepage, const char *,(LumieraInterface ifa), {(void) ifa;return "http://www.lumiera.org/develompent.html" ;}), LUMIERA_INTERFACE_INLINE(version, const char *,(LumieraInterface ifa), {(void) ifa;return "0.1~pre";}), LUMIERA_INTERFACE_INLINE(author, const char *,(LumieraInterface ifa), {(void) ifa;return "Hermann Vosseler";}), LUMIERA_INTERFACE_INLINE(email, const char *,(LumieraInterface ifa), {(void) ifa;return "Ichthyostega@web.de";}), LUMIERA_INTERFACE_INLINE(copyright, const char *,(LumieraInterface ifa), {(void) ifa;return "Copyright (C) Lumiera.org\ " 2008 Hermann Vosseler< Ichthyostega @web.de >"; }), LUMIERA_INTERFACE_INLINE(license, const char *,(LumieraInterface ifa), {(void) ifa; return "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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"; }), LUMIERA_INTERFACE_INLINE(state, int,(LumieraInterface ifa), {(void) ifa; return LUMIERA_INTERFACE_EXPERIMENTAL;}), LUMIERA_INTERFACE_INLINE(versioncmp, int,(const char *a, const char *b), {(void) a;(void) b; return 0;})) | |
LUMIERA_INTERFACE_INSTANCE (lumieraorg_GuiNotification, 0, lumieraorg_GuiNotificationService, LUMIERA_INTERFACE_REF(lumieraorg_interfacedescriptor, 0, lumieraorg_GuiNotificationFacade_descriptor), NULL, NULL, LUMIERA_INTERFACE_INLINE(displayInfo, void,(uint severity, const char *text), { if(!_instance) lumiera_error_set(LUMIERA_ERROR_LIFECYCLE, text);else _instance().displayInfo(NotifyLevel(severity), text);}), LUMIERA_INTERFACE_INLINE(markError, void,(const void *element, const char *text), { if(!_instance) lumiera_error_set(LUMIERA_ERROR_LIFECYCLE, text);else _instance().markError(*static_cast< lib::idi::BareEntryID const *>(element), text);}), LUMIERA_INTERFACE_INLINE(markNote, void,(const void *element, const char *text), { if(!_instance) lumiera_error_set(LUMIERA_ERROR_LIFECYCLE, text);else _instance().markNote(*static_cast< lib::idi::BareEntryID const *>(element), text);}), LUMIERA_INTERFACE_INLINE(mark, void,(const void *element, void *stateMark), { if(!_instance) lumiera_error_set(LUMIERA_ERROR_LIFECYCLE, "passing state mark");else _instance().mark(*static_cast< lib::idi::BareEntryID const *>(element), move(*reinterpret_cast< GenNode *>(stateMark)));}), LUMIERA_INTERFACE_INLINE(mutate, void,(const void *element, void *diff), { if(!_instance) lumiera_error_set(LUMIERA_ERROR_LIFECYCLE, "passing diff message");else _instance().mutate(*static_cast< lib::idi::BareEntryID const *>(element), move(*reinterpret_cast< MutationMessage *>(diff)));}), LUMIERA_INTERFACE_INLINE(triggerGuiShutdown, void,(const char *cause), { if(!_instance) lumiera_error_set(LUMIERA_ERROR_LIFECYCLE, cause);else _instance().triggerGuiShutdown(cause);})) | |
Variables | |
lib::Depend< NotificationService > | _instance |
a backdoor for the C Language impl to access the actual SessionCommand implementation... | |
Namespaces | |
stage | |
Lumiera GTK UI implementation root. | |