From d2515a119ef886de0ad925414c5b118471e05082 Mon Sep 17 00:00:00 2001 From: Viktor Kojouharov Date: Tue, 24 Oct 2006 14:32:22 +0000 Subject: [PATCH] the pager and iconbox now emit a signal when a border changes state from urgent to normal and the other way around. for the themers: the iconbox icon, the pager window and the pager desk, receive the signals e,state,urgent and e,state,not_urgent, so you can do something nice with those. SVN revision: 26772 --- src/bin/e_border.c | 23 ++++++++++++++--- src/bin/e_border.h | 7 +++++ src/modules/ibox/e_mod_main.c | 30 ++++++++++++++++++++++ src/modules/pager/e_mod_main.c | 47 ++++++++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 3 deletions(-) diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 5ad5c176d..52237abd9 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -67,6 +67,7 @@ static void _e_border_event_border_zone_set_free(void *data, void *ev); static void _e_border_event_border_desk_set_free(void *data, void *ev); static void _e_border_event_border_stack_free(void *data, void *ev); static void _e_border_event_border_icon_change_free(void *data, void *ev); +static void _e_border_event_border_urgent_change_free(void *data, void *ev); static void _e_border_event_border_focus_in_free(void *data, void *ev); static void _e_border_event_border_focus_out_free(void *data, void *ev); static void _e_border_event_border_resize_free(void *data, void *ev); @@ -130,6 +131,7 @@ EAPI int E_EVENT_BORDER_STICK = 0; EAPI int E_EVENT_BORDER_UNSTICK = 0; EAPI int E_EVENT_BORDER_STACK = 0; EAPI int E_EVENT_BORDER_ICON_CHANGE = 0; +EAPI int E_EVENT_BORDER_URGENT_CHANGE = 0; EAPI int E_EVENT_BORDER_FOCUS_IN = 0; EAPI int E_EVENT_BORDER_FOCUS_OUT = 0; EAPI int E_EVENT_BORDER_PROPERTY = 0; @@ -183,6 +185,7 @@ e_border_init(void) E_EVENT_BORDER_UNSTICK = ecore_event_type_new(); E_EVENT_BORDER_STACK = ecore_event_type_new(); E_EVENT_BORDER_ICON_CHANGE = ecore_event_type_new(); + E_EVENT_BORDER_URGENT_CHANGE = ecore_event_type_new(); E_EVENT_BORDER_FOCUS_IN = ecore_event_type_new(); E_EVENT_BORDER_FOCUS_OUT = ecore_event_type_new(); E_EVENT_BORDER_PROPERTY = ecore_event_type_new(); @@ -6421,9 +6424,13 @@ _e_border_eval(E_Border *bd) edje_object_signal_emit(bd->bg_object, "e,state,urgent", "e"); else edje_object_signal_emit(bd->bg_object, "e,state,not_urgent", "e"); - /* FIXME: we should probably do something with the pager or - * maybe raising the window if it becomes urgent - */ + E_Event_Border_Urgent_Change *ev; + + ev = calloc(1, sizeof(E_Event_Border_Urgent_Change)); + ev->border = bd; + e_object_ref(E_OBJECT(bd)); + ecore_event_add(E_EVENT_BORDER_URGENT_CHANGE, ev, + _e_border_event_border_urgent_change_free, NULL); } bd->new_client = 0; @@ -6871,6 +6878,16 @@ _e_border_event_border_icon_change_free(void *data, void *ev) free(e); } +static void +_e_border_event_border_urgent_change_free(void *data, void *ev) +{ + E_Event_Border_Urgent_Change *e; + + e = ev; + e_object_unref(E_OBJECT(e->border)); + free(e); +} + static void _e_border_event_border_focus_in_free(void *data, void *ev) { diff --git a/src/bin/e_border.h b/src/bin/e_border.h index 1375953c7..8de87c239 100644 --- a/src/bin/e_border.h +++ b/src/bin/e_border.h @@ -87,6 +87,7 @@ typedef struct _E_Event_Border_Zone_Set E_Event_Border_Zone_Set; typedef struct _E_Event_Border_Desk_Set E_Event_Border_Desk_Set; typedef struct _E_Event_Border_Stack E_Event_Border_Stack; typedef struct _E_Event_Border_Icon_Change E_Event_Border_Icon_Change; +typedef struct _E_Event_Border_Urgent_Change E_Event_Border_Urgent_Change; typedef struct _E_Event_Border_Focus_In E_Event_Border_Focus_In; typedef struct _E_Event_Border_Focus_Out E_Event_Border_Focus_Out; typedef struct _E_Event_Border_Property E_Event_Border_Property; @@ -545,6 +546,11 @@ struct _E_Event_Border_Focus_Out E_Border *border; }; +struct _E_Event_Border_Urgent_Change +{ + E_Border *border; +}; + struct _E_Event_Border_Property { E_Border *border; @@ -642,6 +648,7 @@ extern EAPI int E_EVENT_BORDER_ZONE_SET; extern EAPI int E_EVENT_BORDER_DESK_SET; extern EAPI int E_EVENT_BORDER_STACK; extern EAPI int E_EVENT_BORDER_ICON_CHANGE; +extern EAPI int E_EVENT_BORDER_URGENT_CHANGE; extern EAPI int E_EVENT_BORDER_FOCUS_IN; extern EAPI int E_EVENT_BORDER_FOCUS_OUT; extern EAPI int E_EVENT_BORDER_PROPERTY; diff --git a/src/modules/ibox/e_mod_main.c b/src/modules/ibox/e_mod_main.c index 7d73e78f0..ec64011e4 100644 --- a/src/modules/ibox/e_mod_main.c +++ b/src/modules/ibox/e_mod_main.c @@ -113,6 +113,7 @@ static int _ibox_cb_event_border_remove(void *data, int type, void *event); static int _ibox_cb_event_border_iconify(void *data, int type, void *event); static int _ibox_cb_event_border_uniconify(void *data, int type, void *event); static int _ibox_cb_event_border_icon_change(void *data, int type, void *event); +static int _ibox_cb_event_border_urgent_change(void *data, int type, void *event); static int _ibox_cb_event_border_zone_set(void *data, int type, void *event); static int _ibox_cb_event_desk_show(void *data, int type, void *event); static Config_Item *_ibox_config_item_get(const char *id); @@ -1145,6 +1146,31 @@ _ibox_cb_event_border_icon_change(void *data, int type, void *event) return 1; } +static int +_ibox_cb_event_border_urgent_change(void *data, int type, void *event) +{ + E_Event_Border_Urgent_Change *ev; + IBox *b; + IBox_Icon *ic; + Evas_List *l, *ibox; + + ev = event; + /* update icon */ + ibox = _ibox_zone_find(ev->border->zone); + for (l = ibox; l; l = l->next) + { + b = l->data; + ic = _ibox_icon_find(b, ev->border); + if (!ic) continue; + if (ev->border->client.icccm.urgent) + edje_object_signal_emit(ic->o_holder2, "e,state,urgent", "e"); + else + edje_object_signal_emit(ic->o_holder2, "e,state,not_urgent", "e"); + } + + return 1; +} + static int _ibox_cb_event_border_zone_set(void *data, int type, void *event) { @@ -1318,6 +1344,10 @@ e_modapi_init(E_Module *m) ibox_config->handlers = evas_list_append (ibox_config->handlers, ecore_event_handler_add (E_EVENT_BORDER_ICON_CHANGE, _ibox_cb_event_border_icon_change, NULL)); + ibox_config->handlers = evas_list_append + (ibox_config->handlers, ecore_event_handler_add + (E_EVENT_BORDER_URGENT_CHANGE, + _ibox_cb_event_border_urgent_change, NULL)); ibox_config->handlers = evas_list_append (ibox_config->handlers, ecore_event_handler_add (E_EVENT_BORDER_ZONE_SET, _ibox_cb_event_border_zone_set, NULL)); diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 03e2f3825..0c8936b77 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -109,6 +109,7 @@ static int _pager_cb_event_border_unstick(void *data, int type, void *event); static int _pager_cb_event_border_desk_set(void *data, int type, void *event); static int _pager_cb_event_border_stack(void *data, int type, void *event); static int _pager_cb_event_border_icon_change(void *data, int type, void *event); +static int _pager_cb_event_border_urgent_change(void *data, int type, void *event); static int _pager_cb_event_zone_desk_count_set(void *data, int type, void *event); static int _pager_cb_event_desk_show(void *data, int type, void *event); static int _pager_cb_event_desk_name_change(void *data, int type, void *event); @@ -1143,6 +1144,48 @@ _pager_cb_event_border_icon_change(void *data, int type, void *event) return 1; } +static int +_pager_cb_event_border_urgent_change(void *data, int type, void *event) +{ + E_Event_Border_Urgent_Change *ev; + Evas_List *l, *l2; + + ev = event; + for (l = pager_config->instances; l; l = l->next) + { + Instance *inst; + + inst = l->data; + if (inst->pager->zone != ev->border->zone) continue; + for (l2 = inst->pager->desks; l2; l2 = l2->next) + { + Pager_Desk *pd; + Pager_Win *pw; + + pd = l2->data; + pw = _pager_desk_window_find(pd, ev->border); + if (pw) + { + if (ev->border->client.icccm.urgent) + { + edje_object_signal_emit(pd->o_desk, + "e,state,urgent", "e"); + edje_object_signal_emit(pw->o_window, + "e,state,urgent", "e"); + } + else + { + edje_object_signal_emit(pd->o_desk, + "e,state,not_urgent", "e"); + edje_object_signal_emit(pw->o_window, + "e,state,not_urgent", "e"); + } + } + } + } + return 1; +} + static int _pager_cb_event_zone_desk_count_set(void *data, int type, void *event) { @@ -1714,6 +1757,10 @@ e_modapi_init(E_Module *m) pager_config->handlers = evas_list_append (pager_config->handlers, ecore_event_handler_add (E_EVENT_BORDER_ICON_CHANGE, _pager_cb_event_border_icon_change, NULL)); + pager_config->handlers = evas_list_append + (pager_config->handlers, ecore_event_handler_add + (E_EVENT_BORDER_URGENT_CHANGE, + _pager_cb_event_border_urgent_change, NULL)); pager_config->handlers = evas_list_append (pager_config->handlers, ecore_event_handler_add (E_EVENT_ZONE_DESK_COUNT_SET, _pager_cb_event_zone_desk_count_set, NULL));