* 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.
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.
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
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)
{
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;
}
fprintf(stderr, "SYSTEM('%s')\n", edje_cc_command);
system(edje_cc_command);
read_watch_file(watchfile);
+ fprintf(stderr, "DONE\n");
ecore_main_loop_begin();
@EVIL_CFLAGS@ \
@EDJE_CFLAGS@ \
@ECORE_IMF_CFLAGS@ \
+@EIO_CFLAGS@ \
@EFL_EDJE_BUILD@ \
@REMIX_CFLAGS@ \
@SNDFILE_CFLAGS@
@echo "# include <Ecore_IMF.h>" >> edje_amalgamation.c
@echo "#endif" >> edje_amalgamation.c
+ @echo "#ifdef HAVE_EIO" >> edje_amalgamation.c
+ @echo "# include <Eio.h>" >> edje_amalgamation.c
+ @echo "#endif" >> edje_amalgamation.c
+
@echo "#include <edje_private.h>" >> edje_amalgamation.c
@for f in $(base_sources); do \
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"
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
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)
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)
{
}
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;
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;
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;
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;
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;
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));
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)
{
}
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)
_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); \
}
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);
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();
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",
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;
_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();
_edje_text_class_hash_free();
_edje_edd_shutdown();
+#ifdef HAVE_EIO
+ eio_shutdown();
+#endif
eet_shutdown();
embryo_shutdown();
ecore_shutdown();
#endif
#include <Embryo.h>
+#ifdef HAVE_EIO
+# include <Eio.h>
+#endif
+
#include "Edje.h"
EAPI extern int _edje_default_log_dom ;
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;
-DPACKAGE_LIB_DIR=\"$(libdir)/remix\" \
-DPACKAGE_DATA_DIR=\"$(datadir)/remix\" \
@EDJE_CFLAGS@ \
+@EIO_CFLAGS@ \
@REMIX_CFLAGS@ \
@ALSA_CFLAGS@
-DPACKAGE_LIB_DIR=\"$(libdir)/remix\" \
-DPACKAGE_DATA_DIR=\"$(datadir)/remix\" \
@EDJE_CFLAGS@ \
+@EIO_CFLAGS@ \
@REMIX_CFLAGS@
pkgdir = $(REMIX_PLUGIN_DIR)
-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)