From 9ad04eb877ab7fa045685498b30672dd31babf27 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 5 Mar 2014 08:16:35 -0500 Subject: [PATCH] redo client urgency again with separate flag for actual urgent state preserve icccm flag for accurate detection --- src/bin/e_client.c | 17 +++++++++++------ src/bin/e_client.h | 1 + src/bin/e_comp_object.c | 2 +- src/bin/e_comp_x.c | 1 + src/modules/ibox/e_mod_main.c | 2 +- src/modules/pager/e_mod_main.c | 6 +++--- src/modules/pager16/e_mod_main.c | 4 ++-- src/modules/tasks/e_mod_main.c | 4 ++-- 8 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 0be08a1b3..f0b6ab3fb 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -2029,7 +2029,7 @@ _e_client_frame_update(E_Client *ec) ((!ec->icccm.accepts_focus) && (!ec->icccm.take_focus))) bordername = "nofocus"; - else if (ec->icccm.urgent) + else if (ec->urgent) bordername = "urgent"; else if ((ec->icccm.transient_for != 0) || (ec->dialog)) @@ -3682,13 +3682,18 @@ e_client_urgent_set(E_Client *ec, Eina_Bool urgent) E_OBJECT_TYPE_CHECK(ec, E_CLIENT_TYPE); urgent = !!urgent; - if (urgent == ec->icccm.urgent) return; - ec->icccm.urgent = urgent; + if (urgent == ec->urgent) return; _e_client_event_property(ec, E_CLIENT_PROPERTY_URGENCY); - if (urgent && (!ec->focused)) - e_comp_object_signal_emit(ec->frame, "e,state,urgent", "e"); + if (urgent && (!ec->focused) && (!ec->want_focus)) + { + e_comp_object_signal_emit(ec->frame, "e,state,urgent", "e"); + ec->urgent = urgent; + } else - e_comp_object_signal_emit(ec->frame, "e,state,not_urgent", "e"); + { + e_comp_object_signal_emit(ec->frame, "e,state,not_urgent", "e"); + ec->urgent = 0; + } if (urgent && e_screensaver_on_get() && e_config->screensaver_wake_on_urgent) { int x, y; diff --git a/src/bin/e_client.h b/src/bin/e_client.h index 194f0f3fe..a82537521 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -572,6 +572,7 @@ struct E_Client unsigned int iconic : 1; unsigned int deskshow : 1; unsigned int sticky : 1; + unsigned int urgent : 1; unsigned int shaped_input : 1; unsigned int need_shape_merge : 1; unsigned int need_shape_export : 1; diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c index 056f428be..2ba7b6f08 100644 --- a/src/bin/e_comp_object.c +++ b/src/bin/e_comp_object.c @@ -512,7 +512,7 @@ _e_comp_object_shadow_setup(E_Comp_Object *cw) e_comp_object_signal_emit(cw->smart_obj, "e,state,focused", "e"); else e_comp_object_signal_emit(cw->smart_obj, "e,state,unfocused", "e"); - if (urgent || cw->ec->icccm.urgent) + if (urgent || cw->ec->urgent) e_comp_object_signal_emit(cw->smart_obj, "e,state,urgent", "e"); else e_comp_object_signal_emit(cw->smart_obj, "e,state,not_urgent", "e"); diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c index cc04fe3a8..078e9d33b 100644 --- a/src/bin/e_comp_x.c +++ b/src/bin/e_comp_x.c @@ -3097,6 +3097,7 @@ _e_comp_x_hook_client_fetch(void *d EINA_UNUSED, E_Client *ec) &is_urgent)) { ec->icccm.accepts_focus = accepts_focus; + ec->icccm.urgent = is_urgent; e_client_urgent_set(ec, is_urgent); /* If this is a new window, set the state as requested. */ diff --git a/src/modules/ibox/e_mod_main.c b/src/modules/ibox/e_mod_main.c index edfc2a520..95126fcae 100644 --- a/src/modules/ibox/e_mod_main.c +++ b/src/modules/ibox/e_mod_main.c @@ -1172,7 +1172,7 @@ _ibox_cb_event_client_property(void *data __UNUSED__, int type __UNUSED__, E_Eve _ibox_icon_fill(ic); continue; } - if (ev->ec->icccm.urgent) + if (ev->ec->urgent) { e_gadcon_urgent_show(b->inst->gcc->gadcon); edje_object_signal_emit(ic->o_holder, "e,state,urgent", "e"); diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 0715c8221..26254d272 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -685,7 +685,7 @@ _pager_window_new(Pager_Desk *pd, E_Client *client) edje_object_part_swallow(pw->o_window, "e.swallow.icon", o); } - if (client->icccm.urgent && !client->focused) + if (client->urgent) { if (!(client->iconic)) edje_object_signal_emit(pd->o_desk, "e,state,urgent", "e"); @@ -1403,7 +1403,7 @@ _pager_cb_event_client_urgent_change(void *data __UNUSED__, int type __UNUSED__, if (!(ev->property & E_CLIENT_PROPERTY_URGENCY)) return ECORE_CALLBACK_RENEW; zone = ev->ec->zone; - urgent = ev->ec->icccm.urgent; + urgent = ev->ec->urgent || ev->ec->icccm.urgent; if (pager_config->popup_urgent && (pager_config->popup_urgent_focus || ((!pager_config->popup_urgent_focus) && (!ev->ec->focused) && (!ev->ec->want_focus)))) @@ -1430,7 +1430,7 @@ _pager_cb_event_client_urgent_change(void *data __UNUSED__, int type __UNUSED__, pw = _pager_desk_window_find(pd, ev->ec); if (pw) { - if (urgent && !ev->ec->focused) + if (ev->ec->urgent) { if (!(ev->ec->iconic)) { diff --git a/src/modules/pager16/e_mod_main.c b/src/modules/pager16/e_mod_main.c index 057d00600..69c05a5ff 100644 --- a/src/modules/pager16/e_mod_main.c +++ b/src/modules/pager16/e_mod_main.c @@ -682,7 +682,7 @@ _pager_window_new(Pager_Desk *pd, Evas_Object *mirror, E_Client *client) evas_object_event_callback_add(mirror, EVAS_CALLBACK_DEL, _pager_window_cb_del, pw); - if (client->icccm.urgent && !client->focused) + if (client->urgent) { if (!(client->iconic)) edje_object_signal_emit(pd->o_desk, "e,state,urgent", "e"); @@ -1015,7 +1015,7 @@ _pager_cb_event_client_urgent_change(void *data EINA_UNUSED, int type EINA_UNUSE pp = _pager_popup_find(ev->ec->zone); - if ((!pp) && (ev->ec->icccm.urgent) && (!ev->ec->iconic)) + if ((!pp) && (ev->ec->urgent || ev->ec->icccm.urgent) && (!ev->ec->iconic)) { pp = _pager_popup_new(ev->ec->zone, 0); if (!pp) return ECORE_CALLBACK_RENEW; diff --git a/src/modules/tasks/e_mod_main.c b/src/modules/tasks/e_mod_main.c index 177feebc4..947408b02 100644 --- a/src/modules/tasks/e_mod_main.c +++ b/src/modules/tasks/e_mod_main.c @@ -657,7 +657,7 @@ _tasks_item_fill(Tasks_Item *item) _tasks_item_signal_emit(item, "e,state,focused", "e"); else _tasks_item_signal_emit(item, "e,state,unfocused", "e"); - if (item->client->icccm.urgent && !item->client->focused) + if (item->client->urgent) _tasks_item_signal_emit(item, "e,state,urgent", "e"); else _tasks_item_signal_emit(item, "e,state,not_urgent", "e"); @@ -941,7 +941,7 @@ _tasks_cb_event_client_urgent_change(void *data __UNUSED__, int type __UNUSED__, E_Event_Client_Property *ev = event; if (!(ev->property & E_CLIENT_PROPERTY_URGENCY)) return ECORE_CALLBACK_RENEW; - if (ev->ec->icccm.urgent && (!ev->ec->focused)) + if (ev->ec->urgent) _tasks_signal_emit(ev->ec, "e,state,urgent", "e"); else _tasks_signal_emit(ev->ec, "e,state,not_urgent", "e");