cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=fdc92ca868c76a2e7d7cdb701a7a27262858b23a

commit fdc92ca868c76a2e7d7cdb701a7a27262858b23a
Author: Cedric BAIL <ced...@osg.samsung.com>
Date:   Mon Sep 25 15:51:19 2017 -0700

    elementary: provide a new initialization macro that support lifecycle.
    
    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 | 22 +++++++++++++++++++++-
 src/lib/elementary/elm_main.c    | 27 ++++++++++++++++++++++++++-
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/lib/elementary/elm_general.h b/src/lib/elementary/elm_general.h
index 4259bea16c..2ef86cfaa1 100644
--- a/src/lib/elementary/elm_general.h
+++ b/src/lib/elementary/elm_general.h
@@ -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 */
diff --git a/src/lib/elementary/elm_main.c b/src/lib/elementary/elm_main.c
index c82050e944..4d65e56052 100644
--- a/src/lib/elementary/elm_main.c
+++ b/src/lib/elementary/elm_main.c
@@ -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);

-- 


Reply via email to