elementary: provide a new initialization macro that support lifecycle.
authorCedric BAIL <cedric@osg.samsung.com>
Mon, 25 Sep 2017 22:51:19 +0000 (15:51 -0700)
committerCedric BAIL <cedric@osg.samsung.com>
Mon, 25 Sep 2017 22:51:19 +0000 (15:51 -0700)
EFL_MAIN_EX require efl_main, efl_resume, efl_pause and efl_terminate
to be working. Quicklaunch support added too.

src/lib/elementary/elm_general.h
src/lib/elementary/elm_main.c

index 4259bea..2ef86cf 100644 (file)
@@ -110,12 +110,32 @@ extern EAPI double _elm_startup_time;
 
 #ifndef ELM_LIB_QUICKLAUNCH
 #define EFL_MAIN() int main(int argc, char **argv) { int ret__; _EFL_APP_VERSION_SET(); _elm_startup_time = ecore_time_unix_get(); elm_init(argc, argv); efl_event_callback_add(ecore_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, efl_main, NULL); ret__ = efl_loop_begin(ecore_main_loop_get()); elm_shutdown(); return ret__; }
+
+#define EFL_MAIN_EX()                                                   \
+  EFL_CALLBACKS_ARRAY_DEFINE(_efl_main_ex,                              \
+                             { EFL_LOOP_EVENT_ARGUMENTS, efl_main },    \
+                             { EFL_LOOP_EVENT_PAUSE, efl_pause },       \
+                             { EFL_LOOP_EVENT_RESUME, efl_resume },     \
+                             { EFL_EVENT_DEL, efl_terminate });         \
+  int main(int argc, char **argv)                                       \
+  {                                                                     \
+     int ret__;                                                         \
+     _EFL_APP_VERSION_SET();                                            \
+     _elm_startup_time = ecore_time_unix_get();                         \
+     elm_init(argc, argv);                                              \
+     efl_event_callback_array_add(ecore_main_loop_get(), _efl_main_ex(), NULL); \
+     ret__ = efl_loop_begin(ecore_main_loop_get());                     \
+     elm_shutdown();                                                    \
+     return ret__;                                                      \
+  }
+
 #else
 /** @deprecated macro to be used after the elm_main() function.
  * Do not define ELM_LIB_QUICKLAUNCH
  * Compile your programs with -fpie and -pie -rdynamic instead, to generate a single binary (linkable executable).
  */
-#define EFL_MAIN() int main(int argc, char **argv) { int ret__; _EFL_APP_VERSION_SET(); _elm_startup_time = ecore_time_unix_get(); ret__ = efl_quicklaunch_fallback(argc, argv); elm_shutdown(); return ret__; }
+#define EFL_MAIN() int main(int argc, char **argv) { int ret__; _EFL_APP_VERSION_SET(); _elm_startup_time = ecore_time_unix_get(); ret__ = efl_quicklaunch_fallback(argc, argv); elm_shutdown(); return ret__; (void) efl_main(NULL, NULL); return 0; }
+#define EFL_MAIN_EX() int main(int argc, char **argv) { int ret__; _EFL_APP_VERSION_SET(); _elm_startup_time = ecore_time_unix_get(); ret__ = efl_quicklaunch_fallback(argc, argv); elm_shutdown(); return ret__; (void) efl_main(NULL, NULL);  (void) efl_pause(NULL, NULL);  (void) efl_resume(NULL, NULL); (void) efl_terminate(NULL, NULL); return 0; }
 #endif
 
 #endif /* EFL_BETA_API_SUPPORT */
index c82050e..4d65e56 100644 (file)
@@ -930,6 +930,18 @@ static int (*qr_main)(int    argc,
                       char **argv) = NULL;
 static void (*qre_main)(void *data,
                         const Efl_Event *ev) = NULL;
+static void (*qre_pause)(void *data,
+                        const Efl_Event *ev) = NULL;
+static void (*qre_resume)(void *data,
+                        const Efl_Event *ev) = NULL;
+static void (*qre_terminate)(void *data,
+                        const Efl_Event *ev) = NULL;
+
+EFL_CALLBACKS_ARRAY_DEFINE(_qre_main_ex,
+                           { EFL_LOOP_EVENT_ARGUMENTS, qre_main },
+                           { EFL_LOOP_EVENT_PAUSE, qre_pause },
+                           { EFL_LOOP_EVENT_RESUME, qre_resume },
+                           { EFL_EVENT_DEL, qre_terminate });
 
 EAPI Eina_Bool
 elm_quicklaunch_prepare(int    argc,
@@ -1057,6 +1069,9 @@ efl_quicklaunch_prepare(int    argc,
      {
         INF("dlopen('%s') = %p", exe, qr_handle);
         qre_main = dlsym(qr_handle, "efl_main");
+        qre_pause = dlsym(qr_handle, "efl_pause");
+        qre_resume = dlsym(qr_handle, "efl_resume");
+        qre_terminate = dlsym(qr_handle, "efl_terminate");
         if (qre_main)
           {
              INF("dlsym(%p, 'elm_main') = %p", qr_handle, qre_main);
@@ -1090,6 +1105,9 @@ efl_quicklaunch_prepare(int    argc,
    INF("dlopen('%s') = %p", exe2, qr_handle);
    qre_main = dlsym(qr_handle, "efl_main");
    INF("dlsym(%p, 'elm_main') = %p", qr_handle, qre_main);
+   qre_pause = dlsym(qr_handle, "efl_pause");
+   qre_resume = dlsym(qr_handle, "efl_resume");
+   qre_terminate = dlsym(qr_handle, "efl_terminate");
    if (!qre_main)
      {
         WRN("not quicklauncher capable: no efl_main in '%s'", exe2);
@@ -1210,7 +1228,14 @@ elm_quicklaunch_fork(int    argc,
 
    if (qre_main)
      {
-        efl_event_callback_add(ecore_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, qre_main, NULL);
+        if (qre_pause && qre_resume && qre_terminate)
+          {
+             efl_event_callback_array_add(ecore_main_loop_get(), _qre_main_ex(), NULL);
+          }
+        else
+          {
+             efl_event_callback_add(ecore_main_loop_get(), EFL_LOOP_EVENT_ARGUMENTS, qre_main, NULL);
+          }
         ret = efl_loop_begin(ecore_main_loop_get());
         elm_shutdown();
         exit(ret);