redo client urgency again with separate flag for actual urgent state
authorMike Blumenkrantz <zmike@samsung.com>
Wed, 5 Mar 2014 13:16:35 +0000 (08:16 -0500)
committerMike Blumenkrantz <zmike@samsung.com>
Wed, 5 Mar 2014 15:08:09 +0000 (10:08 -0500)
preserve icccm flag for accurate detection

src/bin/e_client.c
src/bin/e_client.h
src/bin/e_comp_object.c
src/bin/e_comp_x.c
src/modules/ibox/e_mod_main.c
src/modules/pager/e_mod_main.c
src/modules/pager16/e_mod_main.c
src/modules/tasks/e_mod_main.c

index 0be08a1..f0b6ab3 100644 (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;
index 194f0f3..a825375 100644 (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;
index 056f428..2ba7b6f 100644 (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");
index cc04fe3..078e9d3 100644 (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. */
index edfc2a5..95126fc 100644 (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");
index 0715c82..26254d2 100644 (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))
                          {
index 057d006..69c05a5 100644 (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;
index 177feeb..947408b 100644 (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");