From fdc92ca868c76a2e7d7cdb701a7a27262858b23a Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Mon, 25 Sep 2017 15:51:19 -0700 Subject: [PATCH] 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);