From b786fe1ced33808cfbb22b888235f9b12d34a435 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 9 May 2012 09:16:52 +0000 Subject: [PATCH] edje: automatically emit ['edje,change,file', 'edje'] when the file change on disk. For the moment only edje_player use it. This means that when used with edje_watch, you don't need any more to type any kind of command line when you are testing value in your theme. As a side effect, this means that their is a real use case to make edje_cc faster ! SVN revision: 70890 --- legacy/edje/ChangeLog | 3 +- legacy/edje/NEWS | 2 + legacy/edje/src/bin/edje_player.c | 14 +++++ legacy/edje/src/bin/edje_watch.c | 1 + legacy/edje/src/lib/Makefile.am | 9 ++- legacy/edje/src/lib/edje_cache.c | 60 ++++++++++++++++++- legacy/edje/src/lib/edje_load.c | 23 +++++-- legacy/edje/src/lib/edje_main.c | 21 ++++++- legacy/edje/src/lib/edje_private.h | 11 ++++ .../src/modules/alsa_snd_player/Makefile.am | 1 + .../src/modules/eet_snd_reader/Makefile.am | 1 + .../modules/multisense_factory/Makefile.am | 1 + 12 files changed, 135 insertions(+), 12 deletions(-) diff --git a/legacy/edje/ChangeLog b/legacy/edje/ChangeLog index 2fa15b5882..7a3e2ad54f 100644 --- a/legacy/edje/ChangeLog +++ b/legacy/edje/ChangeLog @@ -432,4 +432,5 @@ * Fix bug in case of nesting edje_object_signal_emit and edje_object_signal_callback_{add,del} * Check that the file changed on disk when trying to reopen it. - + * Emit ['edje,change,file', 'edje'] when the file change on disk. + * Automatically reload edje file when it change in edje_player. diff --git a/legacy/edje/NEWS b/legacy/edje/NEWS index 2ca5c75546..024ef8dd76 100644 --- a/legacy/edje/NEWS +++ b/legacy/edje/NEWS @@ -5,6 +5,8 @@ Changes since Edje 1.2.0: Additions: * Add edje_watch to monitore change on edje source. + * Emit ['edje,change,file', 'edje'] when the file change on disk. + * edje_player will automatically reload the file when it change on disk. Improvements: * Allocate once and reuse Evas_Map. diff --git a/legacy/edje/src/bin/edje_player.c b/legacy/edje/src/bin/edje_player.c index 208fbb4e54..cac681b374 100644 --- a/legacy/edje/src/bin/edje_player.c +++ b/legacy/edje/src/bin/edje_player.c @@ -37,6 +37,8 @@ struct opts { char *title; }; +static Eina_Bool _edje_load_or_show_error(Evas_Object *edje, const char *file, const char *group); + static Ecore_Evas *win; static void @@ -456,6 +458,17 @@ _create_bg(Evas *evas, const struct opts *opts) return bg; } +static void +_edje_reload(void *data __UNUSED__, Evas_Object *obj, const char *emission __UNUSED__, const char *source __UNUSED__) +{ + const char *file; + const char *group; + edje_object_signal_callback_del(obj, "edje,change,file", "edje", _edje_reload); + + edje_object_file_get(obj, &file, &group); + _edje_load_or_show_error(obj, file, group); +} + static Eina_Bool _edje_load_or_show_error(Evas_Object *edje, const char *file, const char *group) { @@ -464,6 +477,7 @@ _edje_load_or_show_error(Evas_Object *edje, const char *file, const char *group) if (edje_object_file_set(edje, file, group)) { + edje_object_signal_callback_add(edje, "edje,change,file", "edje", _edje_reload, NULL);; evas_object_focus_set(edje, EINA_TRUE); return EINA_TRUE; } diff --git a/legacy/edje/src/bin/edje_watch.c b/legacy/edje/src/bin/edje_watch.c index f85029145e..c778d16e5d 100644 --- a/legacy/edje/src/bin/edje_watch.c +++ b/legacy/edje/src/bin/edje_watch.c @@ -116,6 +116,7 @@ main(int argc, char **argv) fprintf(stderr, "SYSTEM('%s')\n", edje_cc_command); system(edje_cc_command); read_watch_file(watchfile); + fprintf(stderr, "DONE\n"); ecore_main_loop_begin(); diff --git a/legacy/edje/src/lib/Makefile.am b/legacy/edje/src/lib/Makefile.am index 5a76ef3b32..6f0edada01 100644 --- a/legacy/edje/src/lib/Makefile.am +++ b/legacy/edje/src/lib/Makefile.am @@ -12,6 +12,7 @@ AM_CPPFLAGS = \ @EVIL_CFLAGS@ \ @EDJE_CFLAGS@ \ @ECORE_IMF_CFLAGS@ \ +@EIO_CFLAGS@ \ @EFL_EDJE_BUILD@ \ @REMIX_CFLAGS@ \ @SNDFILE_CFLAGS@ @@ -114,6 +115,10 @@ edje_amalgamation.c: $(base_sources) Makefile @echo "# include " >> edje_amalgamation.c @echo "#endif" >> edje_amalgamation.c + @echo "#ifdef HAVE_EIO" >> edje_amalgamation.c + @echo "# include " >> edje_amalgamation.c + @echo "#endif" >> edje_amalgamation.c + @echo "#include " >> edje_amalgamation.c @for f in $(base_sources); do \ @@ -123,7 +128,7 @@ edje_amalgamation.c: $(base_sources) Makefile file="$$f" ; \ fi ; \ echo "/* file: $$file */" >> edje_amalgamation.c; \ - grep -v -e '^# *include \+.\(config\|\|Evil\|Eina\|Eet\|Evas\|Ecore\|Embryo\|Ecore_IMF\|string\|math\|limits\|sys/stat\|errno\|time\|unistd\|locale\|lua\|lauxlib\|edje_private\)[.]h.*' $$file >> edje_amalgamation.c; \ + grep -v -e '^# *include \+.\(config\|\|Evil\|Eina\|Eet\|Evas\|Ecore\|Embryo\|Ecore_IMF\|Eio\|string\|math\|limits\|sys/stat\|errno\|time\|unistd\|locale\|lua\|lauxlib\|edje_private\)[.]h.*' $$file >> edje_amalgamation.c; \ done @echo "edje_amalgamation.c generated" @@ -131,7 +136,7 @@ else libedje_la_SOURCES = $(base_sources) endif -libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ @EVIL_LIBS@ @REMIX_LIBS@ @SNDFILE_LIBS@ -lm +libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ @EIO_LIBS@ @EVIL_LIBS@ @REMIX_LIBS@ @SNDFILE_LIBS@ -lm libedje_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ EXTRA_DIST = edje_private.h edje_container.h edje_convert.h diff --git a/legacy/edje/src/lib/edje_cache.c b/legacy/edje/src/lib/edje_cache.c index 477e6ec9c5..ab64dcf314 100644 --- a/legacy/edje/src/lib/edje_cache.c +++ b/legacy/edje/src/lib/edje_cache.c @@ -127,12 +127,47 @@ _edje_file_coll_open(Edje_File *edf, const char *coll) return edc; } +#ifdef HAVE_EIO +static Eina_Bool +_edje_file_warn(void *data) +{ + Edje_File *edf = data; + Eina_List *l, *ll; + Edje *ed; + + EINA_LIST_FOREACH_SAFE(edf->edjes, l, ll, ed) + { + _edje_emit(ed, "edje,change,file", "edje"); + } + + edf->timeout = NULL; + return EINA_FALSE; +} + +static Eina_Bool +_edje_file_change(void *data, int ev_type __UNUSED__, void *event) +{ + Edje_File *edf = data; + Eio_Monitor_Event *ev = event; + + if (ev->monitor == edf->monitor) + { + if (edf->timeout) ecore_timer_del(edf->timeout); + edf->timeout = ecore_timer_add(0.5, _edje_file_warn, edf); + } + return ECORE_CALLBACK_PASS_ON; +} +#endif + static Edje_File * _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, time_t mtime) { Edje_File *edf; Edje_Part_Collection *edc; Eet_File *ef; +#ifdef HAVE_EIO + Ecore_Event_Handler *ev; +#endif ef = eet_open(file, EET_FILE_MODE_READ); if (!ef) @@ -150,6 +185,17 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co edf->ef = ef; edf->mtime = mtime; +#ifdef HAVE_EIO + edf->monitor = eio_monitor_add(file); + ev = ecore_event_handler_add(EIO_MONITOR_FILE_DELETED, _edje_file_change, edf); + edf->handlers = eina_list_append(edf->handlers, ev); + ev = ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, _edje_file_change, edf); + edf->handlers = eina_list_append(edf->handlers, ev); + ev = ecore_event_handler_add(EIO_MONITOR_FILE_CREATED, _edje_file_change, edf); + edf->handlers = eina_list_append(edf->handlers, ev); + ev = ecore_event_handler_add(EIO_MONITOR_SELF_DELETED, _edje_file_change, edf); + edf->handlers = eina_list_append(edf->handlers, ev); +#endif if (edf->version != EDJE_FILE_VERSION) { @@ -203,7 +249,7 @@ _edje_file_dangling(Edje_File *edf) } Edje_File * -_edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret) +_edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, Edje *ed) { Edje_File *edf; Eina_List *l, *hist; @@ -259,6 +305,12 @@ open_new: if (!edf) return NULL; +#ifdef HAVE_EIO + if (ed) edf->edjes = eina_list_append(edf->edjes, ed); +#else + (void) ed; +#endif + eina_hash_add(_edje_file_hash, file, edf); return edf; @@ -364,6 +416,12 @@ open: edc->checked = 1; } } +#ifdef HAVE_EIO + if (edc && ed) edf->edjes = eina_list_append(edf->edjes, ed); +#else + (void) ed; +#endif + if (edc_ret) *edc_ret = edc; return edf; diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 8cb823c8b3..a3e151dc99 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -89,7 +89,7 @@ edje_file_collection_list(const char *file) int error_ret = 0; if ((!file) || (!*file)) return NULL; - edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL); + edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL, NULL); if (edf) { Eina_Iterator *i; @@ -129,7 +129,7 @@ edje_file_group_exists(const char *file, const char *glob) if ((!file) || (!*file) || (!glob)) return EINA_FALSE; - edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL); + edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL, NULL); if (!edf) return EINA_FALSE; @@ -189,7 +189,7 @@ edje_file_data_get(const char *file, const char *key) if (key) { - edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL); + edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL, NULL); if (edf) { str = (char*) edje_string_get(eina_hash_find(edf->data, key)); @@ -902,7 +902,8 @@ _edje_file_add(Edje *ed) if (!_edje_edd_edje_file) return; ed->file = _edje_cache_file_coll_open(ed->path, ed->group, &(ed->load_error), - &(ed->collection)); + &(ed->collection), + ed); if (!ed->collection) { @@ -1055,7 +1056,10 @@ _edje_file_del(Edje *ed) } if (ed->file) { - _edje_cache_file_unref(ed->file); +#ifdef HAVE_EIO + ed->file->edjes = eina_list_remove(ed->file->edjes, ed); +#endif + _edje_cache_file_unref(ed->file); ed->file = NULL; } if (ed->actions) @@ -1096,6 +1100,9 @@ void _edje_file_free(Edje_File *edf) { Edje_Color_Class *ecc; +#ifdef HAVE_EIO + Ecore_Event_Handler *event; +#endif #define HASH_FREE(Hash) \ if (Hash) eina_hash_free(Hash); \ @@ -1165,6 +1172,12 @@ _edje_file_free(Edje_File *edf) } if (edf->collection_patterns) edje_match_patterns_free(edf->collection_patterns); +#ifdef HAVE_EIO + if (edf->timeout) ecore_timer_del(edf->timeout); + EINA_LIST_FREE(edf->handlers, event) + ecore_event_handler_del(event); + eio_monitor_del(edf->monitor); +#endif if (edf->path) eina_stringshare_del(edf->path); if (edf->free_strings && edf->compiler) eina_stringshare_del(edf->compiler); _edje_textblock_style_cleanup(edf); diff --git a/legacy/edje/src/lib/edje_main.c b/legacy/edje/src/lib/edje_main.c index f70efb9531..846daf5087 100644 --- a/legacy/edje/src/lib/edje_main.c +++ b/legacy/edje/src/lib/edje_main.c @@ -50,6 +50,14 @@ edje_init(void) goto shutdown_embryo; } +#ifdef HAVE_EIO + if (!eio_init()) + { + ERR("Eio init failed"); + goto shutdown_eet; + } +#endif + _edje_scale = FROM_DOUBLE(1.0); _edje_edd_init(); @@ -66,7 +74,7 @@ edje_init(void) if (!_edje_real_part_mp) { ERR("Mempool for Edje_Real_Part cannot be allocated."); - goto shutdown_eet; + goto shutdown_all; } _edje_real_part_state_mp = eina_mempool_add("chained_mempool", @@ -75,12 +83,12 @@ edje_init(void) if (!_edje_real_part_state_mp) { ERR("Mempool for Edje_Real_Part_State cannot be allocated."); - goto shutdown_eet; + goto shutdown_all; } return _edje_init_count; - shutdown_eet: + shutdown_all: eina_mempool_del(_edje_real_part_state_mp); eina_mempool_del(_edje_real_part_mp); _edje_real_part_state_mp = NULL; @@ -92,6 +100,10 @@ edje_init(void) _edje_text_class_members_free(); _edje_text_class_hash_free(); _edje_edd_shutdown(); +#ifdef HAVE_EIO + eio_shutdown(); + shutdown_eet: +#endif eet_shutdown(); shutdown_embryo: embryo_shutdown(); @@ -130,6 +142,9 @@ _edje_shutdown_core(void) _edje_text_class_hash_free(); _edje_edd_shutdown(); +#ifdef HAVE_EIO + eio_shutdown(); +#endif eet_shutdown(); embryo_shutdown(); ecore_shutdown(); diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 4376fb3946..f19874448d 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -74,6 +74,10 @@ void *alloca (size_t); #endif #include +#ifdef HAVE_EIO +# include +#endif + #include "Edje.h" EAPI extern int _edje_default_log_dom ; @@ -466,6 +470,13 @@ struct _Edje_File Eet_File *ef; +#ifdef HAVE_EIO + Eio_Monitor *monitor; + Eina_List *edjes; + Eina_List *handlers; + Ecore_Timer *timeout; +#endif + unsigned char free_strings : 1; unsigned char dangling : 1; unsigned char warning : 1; diff --git a/legacy/edje/src/modules/alsa_snd_player/Makefile.am b/legacy/edje/src/modules/alsa_snd_player/Makefile.am index de015f8302..0907007e88 100644 --- a/legacy/edje/src/modules/alsa_snd_player/Makefile.am +++ b/legacy/edje/src/modules/alsa_snd_player/Makefile.am @@ -9,6 +9,7 @@ AM_CPPFLAGS = \ -DPACKAGE_LIB_DIR=\"$(libdir)/remix\" \ -DPACKAGE_DATA_DIR=\"$(datadir)/remix\" \ @EDJE_CFLAGS@ \ +@EIO_CFLAGS@ \ @REMIX_CFLAGS@ \ @ALSA_CFLAGS@ diff --git a/legacy/edje/src/modules/eet_snd_reader/Makefile.am b/legacy/edje/src/modules/eet_snd_reader/Makefile.am index c154dc2348..1e8f17fb39 100644 --- a/legacy/edje/src/modules/eet_snd_reader/Makefile.am +++ b/legacy/edje/src/modules/eet_snd_reader/Makefile.am @@ -7,6 +7,7 @@ AM_CPPFLAGS = \ -DPACKAGE_LIB_DIR=\"$(libdir)/remix\" \ -DPACKAGE_DATA_DIR=\"$(datadir)/remix\" \ @EDJE_CFLAGS@ \ +@EIO_CFLAGS@ \ @REMIX_CFLAGS@ pkgdir = $(REMIX_PLUGIN_DIR) diff --git a/legacy/edje/src/modules/multisense_factory/Makefile.am b/legacy/edje/src/modules/multisense_factory/Makefile.am index 768c8ce1c4..feefdd5384 100644 --- a/legacy/edje/src/modules/multisense_factory/Makefile.am +++ b/legacy/edje/src/modules/multisense_factory/Makefile.am @@ -11,6 +11,7 @@ AM_CPPFLAGS = \ -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \ -DPACKAGE_EXAMPLES_DIR=\"$(datadir)/$(PACKAGE)/multisense_factory\" \ @EDJE_CFLAGS@ \ +@EIO_CFLAGS@ \ @REMIX_CFLAGS@ pkgdir = $(libdir)/edje/modules/multisense_factory/$(MODULE_ARCH)