Lumiera  0.pre.03
»edit your freedom«
gtk-lumiera.cpp
Go to the documentation of this file.
1 /*
2  GtkLumiera - entry point for the lumiera GUI loaded as shared module
3 
4  Copyright (C) Lumiera.org
5  2007-2008, Joel Holdsworth <joel@airwebreathe.org.uk>
6  2009, Hermann Vosseler <Ichthyostega@web.de>
7  Christian Thaeter <ct@pipapo.org>
8 
9  This program is free software; you can redistribute it and/or
10  modify it under the terms of the GNU General Public License as
11  published by the Free Software Foundation; either version 2 of
12  the License, or (at your option) any later version.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 
23 * *****************************************************/
24 
25 
49 #include "stage/gtk-base.hpp"
50 
51 #include "lib/error.hpp"
52 #include "lib/thread.hpp"
53 #include "stage/ui-bus.hpp"
54 #include "stage/guifacade.hpp"
56 #include "common/subsys.hpp"
57 #include "lib/nocopy.hpp"
58 
59 extern "C" {
60 #include "common/interface.h"
62 }
63 
64 #include <string>
65 
66 
67 
68 using lumiera::Subsys;
70 using lumiera::error::LUMIERA_ERROR_STATE;
71 using stage::LUMIERA_INTERFACE_INAME(lumieraorg_Gui, 1);
72 
73 using std::string;
74 
75 
76 namespace stage {
77 
78  /* == definition common error marks for the UI, declared in gtk-base.hpp == */
79  LUMIERA_ERROR_DEFINE (UIWIRING, "GUI state contradicts assumptions in signal wiring");
80 
81  namespace { // implementation details
82 
83  using ctrl::UiManager;
84 
85 
86  /**************************************************************************/
92  class GtkLumiera
94  {
95  UiBus uiBus_;
96  UiManager uiManager_;
97 
98  public:
99  GtkLumiera ()
100  : uiBus_{}
101  , uiManager_{uiBus_}
102  { }
103 
104 
105  string
106  run()
107  {
108  string errorMsgBuff;
109  try
110  {
111  // execute the GTK Event Loop____________
112  uiManager_.createApplicationWindow();
113  uiManager_.performMainLoop();
114  } // all went well, regular shutdown
115 
116  catch (lumiera::Error& problem)
117  {
118  errorMsgBuff = problem.what();
119  lumiera_error(); // clear error flag
120  }
121  catch (...)
122  {
123  errorMsgBuff = "unexpected error terminated the GUI.";
124  }
125  if (lumiera_error_peek())
126  errorMsgBuff = string{lumiera_error()};
127 
128  return errorMsgBuff;
129  }
130  };
131  //(End) GUI-Thread.
132  }//(End) impl details
133 
134 
135 
136 
137  bool
138  launchUI (Subsys::SigTerm& reportOnTermination)
139  {
140  try
141  {
142  launchDetached ("GUI-Main"
143  , [reportOnTermination]
144  {
145  string shutdownLog = GtkLumiera{}.run();
146  // inform main thread that the GUI has been shut down...
147  reportOnTermination (&shutdownLog);
148  });
149  return true; // if we reach this line...
150  }
151  catch(...)
152  {
153  const char* errID = lumiera_error(); // clear C-style error flag
154  WARN (stage, "Unexpected error while starting the GUI thread.");
155  if (errID)
156  TRACE (stage, "Error flag was: %s", errID);
157  return false;
158  }
159  }
160 
161 } // namespace stage
162 
163 
164 
165 
166 
167 
168 extern "C" { /* ================== define a lumieraorg_Gui instance ======================= */
169 
170 
171  LUMIERA_INTERFACE_INSTANCE (lumieraorg_interfacedescriptor, 0
172  ,lumieraorg_GuiStarterPlugin_descriptor
173  , NULL, NULL, NULL
174  , LUMIERA_INTERFACE_INLINE (name,
175  const char*, (LumieraInterface ifa),
176  { (void)ifa; return "GuiStarterPlugin"; }
177  )
178  , LUMIERA_INTERFACE_INLINE (brief,
179  const char*, (LumieraInterface ifa),
180  { (void)ifa; return "entry point to start up the Lumiera GTK GUI contained in this dynamic module"; }
181  )
182  , LUMIERA_INTERFACE_INLINE (homepage,
183  const char*, (LumieraInterface ifa),
184  { (void)ifa; return "http://www.lumiera.org/develompent.html" ;}
185  )
186  , LUMIERA_INTERFACE_INLINE (version,
187  const char*, (LumieraInterface ifa),
188  { (void)ifa; return "0.1~pre"; }
189  )
190  , LUMIERA_INTERFACE_INLINE (author,
191  const char*, (LumieraInterface ifa),
192  { (void)ifa; return "Joel Holdsworth, Christian Thaeter, Hermann Vosseler"; }
193  )
194  , LUMIERA_INTERFACE_INLINE (email,
195  const char*, (LumieraInterface ifa),
196  { (void)ifa; return "Lumiera@lists.lumiera.org"; }
197  )
198  , LUMIERA_INTERFACE_INLINE (copyright,
199  const char*, (LumieraInterface ifa),
200  {
201  (void)ifa;
202  return
203  "Copyright (C) Lumiera.org\n"
204  "2007-2008, Joel Holdsworth <joel@airwebreathe.org.uk>\n"
205  "2009, Christian Thaeter <ct@pipapo.org>\n"
206  " Hermann Vosseler <Ichthyostega@web.de>";
207  }
208  )
209  , LUMIERA_INTERFACE_INLINE (license,
210  const char*, (LumieraInterface ifa),
211  {
212  (void)ifa;
213  return
214  "This program is free software; you can redistribute it and/or modify\n"
215  "it under the terms of the GNU General Public License as published by\n"
216  "the Free Software Foundation; either version 2 of the License, or\n"
217  "(at your option) any later version.\n"
218  "\n"
219  "This program is distributed in the hope that it will be useful,\n"
220  "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
221  "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
222  "GNU General Public License for more details.\n"
223  "\n"
224  "You should have received a copy of the GNU General Public License\n"
225  "along with this program; if not, write to the Free Software\n"
226  "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA";
227  }
228  )
229  , LUMIERA_INTERFACE_INLINE (state,
230  int, (LumieraInterface ifa),
231  {(void)ifa; return LUMIERA_INTERFACE_EXPERIMENTAL; }
232  )
233  , LUMIERA_INTERFACE_INLINE (versioncmp,
234  int, (const char* a, const char* b),
235  {(void)a;(void)b; return 0;}
236  )
237  );
238 
239 
240  LUMIERA_EXPORT( /* ===================== PLUGIN EXPORTS ================================== */
241 
242  LUMIERA_INTERFACE_DEFINE (lumieraorg_Gui, 1
243  ,lumieraorg_GuiStarterPlugin
244  , LUMIERA_INTERFACE_REF(lumieraorg_interfacedescriptor, 0, lumieraorg_GuiStarterPlugin_descriptor)
245  , NULL /* on open */
246  , NULL /* on close */
247  , LUMIERA_INTERFACE_INLINE (launchUI,
248  bool, (void* termSig),
249  {
250  return stage::launchUI (*reinterpret_cast<Subsys::SigTerm *> (termSig));
251  }
252  )
253  )
254  );
255 
256 } // extern "C"
void performMainLoop()
start the GTK Main loop and thus activate the UI.
Definition: ui-manager.cpp:139
Dependencies and lifecycle of a partially independent Subsystem of the Application.
Definition: subsys.hpp:70
lumiera_err lumiera_error_peek(void)
Check current error state without clearing it Please avoid this function and use lumiera_error() if p...
Definition: error-state.c:142
void createApplicationWindow()
Set up the first top-level application window.
Definition: ui-manager.cpp:122
Under construction: the top level UI controller.
LUMIERA_EXPORT(LUMIERA_INTERFACE_DEFINE(lumieraorg_interface, 0, lumieraorg_interface, NULL, NULL, NULL, LUMIERA_INTERFACE_MAP(open, lumiera_interface_open), LUMIERA_INTERFACE_MAP(close, lumiera_interface_close), LUMIERA_INTERFACE_MAP(version, lumiera_interface_version),))
Definition of &#39;the mother of all interfaces&#39; since this interface is singleton and required for any c...
Definition: interface.c:318
Any copy and copy construction prohibited.
Definition: nocopy.hpp:46
virtual CStr what() const noexcept override
std::exception interface : yield a diagnostic message
Implement the necessary steps for actually making the Lumiera UI available.
Definition: gtk-lumiera.cpp:92
Backbone of the Lumiera GTK GUI.
Definition: ui-bus.hpp:159
Not finished development code.
#define LUMIERA_INTERFACE_INSTANCE(iname, version, name, descriptor, acquire, release,...)
Define an interface instance.
Definition: interface.h:194
Lumiera interface macros and structures.
Mix-Ins to allow or prohibit various degrees of copying and cloning.
Manager for global user interface concerns, framework integration and global state.
Describing dependencies and lifecycle of the application&#39;s primary parts.
#define LUMIERA_INTERFACE_REF(iname, version, dname)
Return a reference (pointer) to an interface implementation.
Definition: interface.h:128
Lumiera GTK UI implementation root.
Definition: guifacade.cpp:46
lumiera_err lumiera_error(void)
Get and clear current error state.
Definition: error-state.c:124
void launchDetached(ThreadHookable::Launch &&launchBuilder)
Launch an autonomous self-managing thread (and forget about it).
Definition: thread.hpp:748
Convenience front-end to simplify and codify basic thread handling.
Lumiera error handling (C++ interface).
#define LUMIERA_INTERFACE_INAME(name, version)
Construct a type identifier for an interface.
Definition: interface.h:102
A data record to describe interface, interface instances and plug-in instances.
The Lumiera UI framework and backbone object.
Definition: ui-manager.hpp:97
Interface for the GUI loader and for accessing the GUI interface from the lower layers of Lumiera...
A set of basic GTK includes for the UI.
Interface and Base definition for all Lumiera Exceptions.
Definition: error.hpp:69
ElementBoxWidget::Config::Qualifier name(string id)
define the name-ID displayed in the caption
#define LUMIERA_ERROR_DEFINE(err, msg)
Definition and initialisation of an error constant.
Definition: error.h:80