Lumiera  0.pre.03
»edit your freedom«
notification-service.cpp File Reference

Go to the source code of this file.

Description

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

See also
ui-dispatcher.hpp

Definition in file notification-service.cpp.

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)\ " 2008, Hermann Vosseler< Ichthyostega @web.de >"; }), LUMIERA_INTERFACE_INLINE(license, const char *,(LumieraInterface ifa), {(void) ifa; return " **Lumiera **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. See the file COPYING for further details." ; }), 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.