From c6ed8b0feff49608b5cdfc28d4faa11a1b13dda7 Mon Sep 17 00:00:00 2001 From: Jaehwan Kim Date: Tue, 16 Jun 2015 13:52:23 +0900 Subject: [PATCH] elm_config: remove X dependency. Summary: In wayland, elm_config_all_flush doesn't work. It has X dependency totally. It uses ecore_file_monitor instead of X property. Reviewers: Hermet, devilhorns, raster, cedric Differential Revision: https://phab.enlightenment.org/D2502 Conflicts: src/lib/elm_config.c Change-Id: If80f5eb945256f432b92c267b65edd7bbafebc64 origin: upstream --- src/lib/elm_config.c | 224 ++++++++++++++++++------------------------- 1 file changed, 94 insertions(+), 130 deletions(-) diff --git a/src/lib/elm_config.c b/src/lib/elm_config.c index 7a8cd2d1c..2ba4dbfe4 100644 --- a/src/lib/elm_config.c +++ b/src/lib/elm_config.c @@ -29,6 +29,8 @@ Eina_List *_color_overlays_del = NULL; static Ecore_Poller *_elm_cache_flush_poller = NULL; static void _elm_config_key_binding_hash(void); +static Ecore_Timer *_config_change_delay_timer = NULL; +Eio_Monitor *_eio_monitor = NULL; Eina_Hash *_elm_key_bindings = NULL; @@ -113,6 +115,7 @@ static void _config_free(Elm_Config *cfg); static void _config_apply(void); static void _config_sub_apply(void); static void _config_update(void); +static void _config_get(void); static void _env_get(void); static void _color_overlays_cancel(void); @@ -127,7 +130,6 @@ static Ecore_Timer *_prop_change_delay_timer = NULL; static Ecore_X_Window _config_win = 0; #define ATOM_COUNT 3 static Ecore_X_Atom _atom[ATOM_COUNT]; -static Ecore_X_Atom _atom_config = 0; static const char *_atom_names[ATOM_COUNT] = { "ELM_PROFILE", @@ -138,119 +140,6 @@ static const char *_atom_names[ATOM_COUNT] = #define ATOM_E_CONFIG 1 #define ATOM_E_CONFIG_WIN 2 -static Eina_Bool _prop_config_get(void); -static void _prop_config_set(void); -static Eina_Bool _prop_change(void *data EINA_UNUSED, - int ev_type EINA_UNUSED, - void *ev); - -static void -_elm_font_overlays_del_free(void) -{ - char *text_class; - Eina_List *l; - EINA_LIST_FOREACH(_font_overlays_del, l, text_class) - eina_stringshare_del(text_class); - _font_overlays_del = eina_list_free(_font_overlays_del); -} - -static void -_elm_config_font_overlays_cancel(void) -{ - Elm_Font_Overlay *efd; - Eina_List *l; - EINA_LIST_FOREACH(_elm_config->font_overlays, l, efd) - edje_text_class_del(efd->text_class); -} - -static Eina_Bool -_prop_config_get(void) -{ - int size = 0; - Ecore_X_Atom atom; - char buf[512]; - unsigned char *data = NULL; - Elm_Config *config_data; - - snprintf(buf, sizeof(buf), "ELM_CONFIG_%s", _elm_profile); - atom = ecore_x_atom_get(buf); - _atom_config = atom; - if (!ecore_x_window_prop_property_get(_config_win, - atom, _atom[ATOM_E_CONFIG], - 8, &data, &size)) - { - if (!ecore_x_window_prop_property_get(_config_win, - _atom[ATOM_E_CONFIG], - _atom[ATOM_E_CONFIG], - 8, &data, &size)) - return EINA_FALSE; - else - _atom_config = _atom[ATOM_E_CONFIG]; - } - else - _atom_config = atom; - if (size < 1) - { - free(data); - return EINA_FALSE; - } - config_data = eet_data_descriptor_decode(_config_edd, data, size); - free(data); - if (!config_data) return EINA_FALSE; - - /* What do we do on version mismatch when someone changes the - * config in the rootwindow? */ - /* Most obvious case, new version and we are still linked to - * whatever was there before, we just ignore until user restarts us */ - if (config_data->config_version > ELM_CONFIG_VERSION) - { - _config_free(config_data); - return EINA_TRUE; - } - /* What in the case the version is older? Do we even support those - * cases or we only check for equality above? */ - - _elm_config_font_overlays_cancel(); - _color_overlays_cancel(); - _config_free(_elm_config); - _elm_config = config_data; - _env_get(); - _config_apply(); - _config_sub_apply(); - _elm_config_font_overlay_apply(); - _elm_config_color_overlay_apply(); - _elm_rescale(); - _elm_recache(); - _elm_clouseau_reload(); - _elm_config_key_binding_hash(); - _elm_win_access(_elm_config->access_mode); - ecore_event_add(ELM_EVENT_CONFIG_ALL_CHANGED, NULL, NULL, NULL); - return EINA_TRUE; -} - -static void -_prop_config_set(void) -{ - unsigned char *config_data = NULL; - int size = 0; - - config_data = eet_data_descriptor_encode(_config_edd, _elm_config, &size); - if (config_data) - { - Ecore_X_Atom atom; - char buf[512]; - - snprintf(buf, sizeof(buf), "ELM_CONFIG_%s", _elm_profile); - atom = ecore_x_atom_get(buf); - _atom_config = atom; - - ecore_x_window_prop_property_set(_config_win, _atom_config, - _atom[ATOM_E_CONFIG], 8, - config_data, size); - free(config_data); - } -} - static Eina_Bool _prop_change_delay_cb(void *data EINA_UNUSED) { @@ -265,7 +154,7 @@ _prop_change_delay_cb(void *data EINA_UNUSED) _elm_profile = s; } } - _prop_config_get(); + _config_get(); _prop_change_delay_timer = NULL; return ECORE_CALLBACK_CANCEL; @@ -285,18 +174,30 @@ _prop_change(void *data EINA_UNUSED, ecore_timer_del(_prop_change_delay_timer); _prop_change_delay_timer = ecore_timer_add(0.1, _prop_change_delay_cb, NULL); } - else if (((_atom_config > 0) && (event->atom == _atom_config)) || - (event->atom == _atom[ATOM_E_CONFIG])) - { - ecore_timer_del(_prop_change_delay_timer); - _prop_change_delay_timer = ecore_timer_add(0.1, _prop_change_delay_cb, NULL); - } } return ECORE_CALLBACK_PASS_ON; } - #endif +static void +_elm_font_overlays_del_free(void) +{ + char *text_class; + Eina_List *l; + EINA_LIST_FOREACH(_font_overlays_del, l, text_class) + eina_stringshare_del(text_class); + _font_overlays_del = eina_list_free(_font_overlays_del); +} + +static void +_elm_config_font_overlays_cancel(void) +{ + Elm_Font_Overlay *efd; + Eina_List *l; + EINA_LIST_FOREACH(_elm_config->font_overlays, l, efd) + edje_text_class_del(efd->text_class); +} + static void _desc_init(void) { @@ -1615,6 +1516,28 @@ _config_load(void) _elm_config->atspi_mode = ELM_ATSPI_MODE_OFF; } +static void +_config_get(void) +{ + _elm_config_font_overlays_cancel(); + _color_overlays_cancel(); + _config_free(_elm_config); + _elm_config = NULL; + _config_load(); + _env_get(); + _config_apply(); + _config_sub_apply(); + evas_font_reinit(); + _elm_config_font_overlay_apply(); + _elm_config_color_overlay_apply(); + _elm_rescale(); + _elm_recache(); + _elm_clouseau_reload(); + _elm_config_key_binding_hash(); + _elm_win_access(_elm_config->access_mode); + ecore_event_add(ELM_EVENT_CONFIG_ALL_CHANGED, NULL, NULL, NULL); +} + static const char * _elm_config_eet_close_error_get(Eet_File *ef, char *file) @@ -3185,12 +3108,16 @@ elm_config_all_flush(void) { #ifdef HAVE_ELEMENTARY_X if (ecore_x_display_get()) - { - _prop_config_set(); - ecore_x_window_prop_string_set(_config_win, _atom[ATOM_E_PROFILE], - _elm_profile); - } + ecore_x_window_prop_string_set(_config_win, _atom[ATOM_E_PROFILE], + _elm_profile); #endif + char buf[PATH_MAX]; + + _elm_config_user_dir_snprintf(buf, sizeof(buf), "config/%s/flush", + _elm_profile); + FILE *fp = fopen(buf, "w+"); + fprintf(fp, "flush"); + fclose(fp); } static void @@ -3246,6 +3173,32 @@ _elm_config_sub_shutdown(void) ELM_SAFE_FREE(_prop_change_delay_timer, ecore_timer_del); if (ecore_x_display_get()) ecore_x_shutdown(); #endif + ELM_SAFE_FREE(_eio_monitor, eio_monitor_del); + ELM_SAFE_FREE(_config_change_delay_timer, ecore_timer_del); +} + +static Eina_Bool +_config_change_delay_cb(void *data EINA_UNUSED) +{ + _config_get(); + _config_change_delay_timer = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static Eina_Bool +_elm_config_file_monitor_cb(void *data EINA_UNUSED, + int type EINA_UNUSED, + void *event) +{ + Eio_Monitor_Event *ev = event; + + if (ev->monitor != _eio_monitor) return ECORE_CALLBACK_PASS_ON; + + ecore_timer_del(_config_change_delay_timer); + _config_change_delay_timer = ecore_timer_add(0.1, _config_change_delay_cb, NULL); + + return ECORE_CALLBACK_PASS_ON; } void @@ -3327,7 +3280,7 @@ _elm_config_sub_init(void) free(_elm_profile); } _elm_profile = s; - if (changed) _prop_config_get(); + if (changed) _config_get(); s = strchr(_elm_profile, '/'); if (s) *s = 0; } @@ -3367,6 +3320,19 @@ _elm_config_sub_init(void) ecore_wl_init(NULL); } #endif + char buf[PATH_MAX]; + + _elm_config_user_dir_snprintf(buf, sizeof(buf), "config/%s/flush", + _elm_profile); + if (!ecore_file_exists(buf)) + { + FILE *fp = fopen(buf, "w+"); + fprintf(fp, "flush"); + fclose(fp); + } + _eio_monitor = eio_monitor_add(buf); + ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, _elm_config_file_monitor_cb, NULL); + _config_sub_apply(); } @@ -3495,9 +3461,7 @@ _elm_config_shutdown(void) ELM_SAFE_FREE(_elm_preferred_engine, eina_stringshare_del); ELM_SAFE_FREE(_elm_accel_preference, eina_stringshare_del); ELM_SAFE_FREE(_elm_profile, free); -#ifdef HAVE_ELEMENTARY_X _elm_font_overlays_del_free(); -#endif _desc_shutdown(); -- 2.34.1