From 08c021a0c6fb894685d4a714dd8617db472c07d0 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 15 Nov 2008 06:09:04 +0000 Subject: [PATCH] handle changes in scaling... a bit... SVN revision: 37654 --- legacy/elementary/src/lib/elm_button.c | 32 +++++++++++++++- legacy/elementary/src/lib/elm_main.c | 51 ++++++++++++++++++++++++-- legacy/elementary/src/lib/elm_priv.h | 3 ++ legacy/elementary/src/lib/elm_widget.c | 20 ++++++++++ legacy/elementary/src/lib/elm_win.c | 8 ++++ 5 files changed, 109 insertions(+), 5 deletions(-) diff --git a/legacy/elementary/src/lib/elm_button.c b/legacy/elementary/src/lib/elm_button.c index 2ea01539b2..e12e646e92 100644 --- a/legacy/elementary/src/lib/elm_button.c +++ b/legacy/elementary/src/lib/elm_button.c @@ -7,9 +7,11 @@ struct _Widget_Data { Evas_Object *btn; Evas_Object *icon; + const char *label; }; static void _del_hook(Evas_Object *obj); +static void _theme_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _sub_del(void *data, Evas_Object *obj, void *event_info); @@ -19,9 +21,29 @@ static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); + if (wd->label) eina_stringshare_del(wd->label); free(wd); } +static void +_theme_hook(Evas_Object *obj) +{ + const char *label; + Evas_Object *icon; + Widget_Data *wd = elm_widget_data_get(obj); + // FIXME: this is wrong. edje needs to handle more of this. + label = eina_stringshare_add(wd->label); + icon = wd->icon; + _elm_theme_set(wd->btn, "x", "base", "default"); + elm_button_label_set(obj, NULL); + elm_button_icon_set(obj, NULL); + _elm_theme_set(wd->btn, "button", "base", "default"); + elm_button_label_set(obj, label); + elm_button_icon_set(obj, icon); + eina_stringshare_del(label); + _sizing_eval(obj); +} + static void _sizing_eval(Evas_Object *obj) { @@ -76,6 +98,7 @@ elm_button_add(Evas_Object *parent) obj = elm_widget_add(e); elm_widget_data_set(obj, wd); elm_widget_del_hook_set(obj, _del_hook); + elm_widget_theme_hook_set(obj, _theme_hook); wd->btn = edje_object_add(e); _elm_theme_set(wd->btn, "button", "base", "default"); @@ -94,13 +117,16 @@ elm_button_label_set(Evas_Object *obj, const char *label) Widget_Data *wd = elm_widget_data_get(obj); Evas_Coord mw, mh; + if (wd->label) eina_stringshare_del(wd->label); if (label) { + wd->label = eina_stringshare_add(label); edje_object_signal_emit(wd->btn, "elm,state,text,visible", "elm"); edje_object_message_signal_process(wd->btn); } else { + wd->label = NULL; edje_object_signal_emit(wd->btn, "elm,state,text,hidden", "elm"); edje_object_message_signal_process(wd->btn); } @@ -114,9 +140,9 @@ elm_button_icon_set(Evas_Object *obj, Evas_Object *icon) Widget_Data *wd = elm_widget_data_get(obj); if ((wd->icon != icon) && (wd->icon)) elm_widget_sub_object_del(obj, wd->icon); - wd->icon = icon; - if (icon) + if ((icon) && (wd->icon != icon)) { + wd->icon = icon; elm_widget_sub_object_add(obj, icon); edje_object_part_swallow(wd->btn, "elm.swallow.content", icon); edje_object_signal_emit(wd->btn, "elm,state,icon,visible", "elm"); @@ -124,4 +150,6 @@ elm_button_icon_set(Evas_Object *obj, Evas_Object *icon) _changed_size_hints, obj); _sizing_eval(obj); } + else + wd->icon = icon; } diff --git a/legacy/elementary/src/lib/elm_main.c b/legacy/elementary/src/lib/elm_main.c index 678fb51d7e..0975471242 100644 --- a/legacy/elementary/src/lib/elm_main.c +++ b/legacy/elementary/src/lib/elm_main.c @@ -1,9 +1,15 @@ #include #include "elm_priv.h" +static int _elm_signal_exit(void *data, int ev_type, void *ev); +static int _elm_window_property_change(void *data, int ev_type, void *ev); +static void _elm_rescale(void); + char *_elm_appname = NULL; Elm_Config *_elm_config = NULL; - +Ecore_Event_Handler *_elm_event_property_change = NULL; +Ecore_X_Atom _elm_atom_enlightenment_scale = 0; + static int _elm_signal_exit(void *data, int ev_type, void *ev) { @@ -11,6 +17,40 @@ _elm_signal_exit(void *data, int ev_type, void *ev) return 1; } +static int +_elm_window_property_change(void *data, int ev_type, void *ev) +{ + Ecore_X_Event_Window_Property *event = ev; + + if (event->win == ecore_x_window_root_first_get()) + { + if (event->atom == _elm_atom_enlightenment_scale) + { + int val = 1000; + + if (ecore_x_window_prop_card32_get(event->win, + event->atom, + &val, 1) > 0) + { + double pscale; + + pscale = _elm_config->scale; + if (val > 0) _elm_config->scale = (double)val / 1000.0; + if (pscale != _elm_config->scale) _elm_rescale(); + } + } + } + return 1; +} + +static void +_elm_rescale(void) +{ + printf("Scale %3.3f\n", _elm_config->scale); + edje_scale_set(_elm_config->scale); + _elm_win_rescale(); +} + EAPI void elm_init(int argc, char **argv) { @@ -47,15 +87,20 @@ elm_init(int argc, char **argv) int val = 1000; ecore_x_init(NULL); + _elm_atom_enlightenment_scale = ecore_x_atom_get("ENLIGHTENMENT_SCALE"); + ecore_x_event_mask_set(ecore_x_window_root_first_get(), + ECORE_X_EVENT_MASK_WINDOW_PROPERTY); + _elm_event_property_change = ecore_event_handler_add + (ECORE_X_EVENT_WINDOW_PROPERTY, _elm_window_property_change, NULL); if (ecore_x_window_prop_card32_get(ecore_x_window_root_first_get(), - ecore_x_atom_get("ENLIGHTENMENT_SCALE"), + _elm_atom_enlightenment_scale, &val, 1) > 0) { if (val > 0) _elm_config->scale = (double)val / 1000.0; } if (!ecore_x_screen_is_composited(0)) _elm_config->compositing = 0; - } + } } diff --git a/legacy/elementary/src/lib/elm_priv.h b/legacy/elementary/src/lib/elm_priv.h index ca664c70f1..370760df76 100644 --- a/legacy/elementary/src/lib/elm_priv.h +++ b/legacy/elementary/src/lib/elm_priv.h @@ -35,6 +35,7 @@ struct _Elm_Config #define ELM_NEW(t) calloc(1, sizeof(t)) void _elm_win_shutdown(void); +void _elm_win_rescale(void); int _elm_theme_set(Evas_Object *o, const char *clas, const char *group, const char *style); int _elm_theme_icon_set(Evas_Object *o, const char *group, const char *style); @@ -46,6 +47,8 @@ EAPI void elm_widget_del_pre_hook_set(Evas_Object *obj, void (*func) (Ev EAPI void elm_widget_focus_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); EAPI void elm_widget_activate_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); EAPI void elm_widget_disable_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void elm_widget_theme_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)); +EAPI void elm_widget_theme(Evas_Object *obj); EAPI void elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); EAPI void elm_widget_on_change_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); EAPI void elm_widget_on_show_region_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data); diff --git a/legacy/elementary/src/lib/elm_widget.c b/legacy/elementary/src/lib/elm_widget.c index 8d9050ccbe..940c1f9e42 100644 --- a/legacy/elementary/src/lib/elm_widget.c +++ b/legacy/elementary/src/lib/elm_widget.c @@ -19,6 +19,7 @@ struct _Smart_Data void (*focus_func) (Evas_Object *obj); void (*activate_func) (Evas_Object *obj); void (*disable_func) (Evas_Object *obj); + void (*theme_func) (Evas_Object *obj); void (*on_focus_func) (void *data, Evas_Object *obj); void *on_focus_data; void (*on_change_func) (void *data, Evas_Object *obj); @@ -110,6 +111,25 @@ elm_widget_disable_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) sd->disable_func = func; } +EAPI void +elm_widget_theme_hook_set(Evas_Object *obj, void (*func) (Evas_Object *obj)) +{ + API_ENTRY return; + sd->theme_func = func; +} + +EAPI void +elm_widget_theme(Evas_Object *obj) +{ + Eina_List *l; + + API_ENTRY return; + if (sd->theme_func) sd->theme_func(obj); + for (l = sd->subobjs; l; l = l->next) elm_widget_theme(l->data); + if (sd->resize_obj) elm_widget_theme(sd->resize_obj); + if (sd->hover_obj) elm_widget_theme(sd->hover_obj); +} + EAPI void elm_widget_on_focus_hook_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj), void *data) { diff --git a/legacy/elementary/src/lib/elm_win.c b/legacy/elementary/src/lib/elm_win.c index 1b4bfca22c..bbabccdfb6 100644 --- a/legacy/elementary/src/lib/elm_win.c +++ b/legacy/elementary/src/lib/elm_win.c @@ -336,6 +336,14 @@ _elm_win_shutdown(void) while (_elm_win_list) evas_object_del(_elm_win_list->data); } +void +_elm_win_rescale(void) +{ + Eina_List *l; + + for (l = _elm_win_list; l; l = l->next) elm_widget_theme(l->data); +} + EAPI Evas_Object * elm_win_add(Evas_Object *parent, const char *name, Elm_Win_Type type) {