discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=9ad04eb877ab7fa045685498b30672dd31babf27

commit 9ad04eb877ab7fa045685498b30672dd31babf27
Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Mar 5 08:16:35 2014 -0500

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

-- 


Reply via email to