redo client urgency again with separate flag for actual urgent state

preserve icccm flag for accurate detection
This commit is contained in:
Mike Blumenkrantz 2014-03-05 08:16:35 -05:00
parent f43279d839
commit 9ad04eb877
8 changed files with 22 additions and 15 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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");

View File

@ -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. */

View File

@ -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");

View File

@ -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))
{

View File

@ -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;

View File

@ -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");