[Xfce4-commits] r27080 - xfwm4/trunk/src

Olivier Fourdan olivier at xfce.org
Wed Jun 18 22:43:00 CEST 2008


Author: olivier
Date: 2008-06-18 20:43:00 +0000 (Wed, 18 Jun 2008)
New Revision: 27080

Modified:
   xfwm4/trunk/src/events.c
   xfwm4/trunk/src/focus.c
   xfwm4/trunk/src/netwm.c
   xfwm4/trunk/src/netwm.h
Log:
Rework focus transitioning

Modified: xfwm4/trunk/src/events.c
===================================================================
--- xfwm4/trunk/src/events.c	2008-06-17 21:39:47 UTC (rev 27079)
+++ xfwm4/trunk/src/events.c	2008-06-18 20:43:00 UTC (rev 27080)
@@ -1434,6 +1434,25 @@
         screen_info = c->screen_info;
 
         TRACE ("EnterNotify window is \"%s\"", c->name);
+        if (!(screen_info->params->click_to_focus) && clientAcceptFocus (c))
+        {
+            if (!(c->type & (WINDOW_DOCK | WINDOW_DESKTOP)))
+            {
+                if(screen_info->params->focus_delay)
+                {
+                    clientClearDelayedFocus ();
+                    clientAddDelayedFocus (c);
+                }
+                else
+                {
+                    clientSetFocus (c->screen_info, c, ev->time, NO_FOCUS_FLAG);
+                }
+            }
+            else
+            {
+                clientClearDelayedFocus ();
+            }
+        }
         if (c == clientGetFocus ())
         {
             for (b = 0; b < BUTTON_COUNT; b++)
@@ -1452,25 +1471,6 @@
                 frameQueueDraw (c, FALSE);
             }
         }
-        else if (!(screen_info->params->click_to_focus) && clientAcceptFocus (c))
-        {
-            if (!(c->type & (WINDOW_DOCK | WINDOW_DESKTOP)))
-            {
-                if(screen_info->params->focus_delay)
-                {
-                    clientClearDelayedFocus ();
-                    clientAddDelayedFocus (c);
-                }
-                else
-                {
-                    clientSetFocus (c->screen_info, c, ev->time, NO_FOCUS_FLAG);
-                }
-            }
-            else
-            {
-                clientClearDelayedFocus ();
-            }
-        }
 
         /* No need to process the event any further */
         return EVENT_FILTER_REMOVE;

Modified: xfwm4/trunk/src/focus.c
===================================================================
--- xfwm4/trunk/src/focus.c	2008-06-17 21:39:47 UTC (rev 27079)
+++ xfwm4/trunk/src/focus.c	2008-06-18 20:43:00 UTC (rev 27080)
@@ -465,12 +465,30 @@
     }
 }
 
+static void
+clientFocusNone (ScreenInfo *screen_info, Client *previous, Time timestamp)
+{
+    TRACE ("setting focus to none");
+
+    pending_focus = NULL;
+
+    if (previous)
+    {
+        frameQueueDraw (previous, FALSE);
+        if (previous->screen_info != screen_info)
+        {
+            clientSetNetActiveWindow (previous->screen_info, NULL, timestamp);
+        }
+    }
+    clientSetNetActiveWindow (screen_info, NULL, timestamp);
+    XSetInputFocus (myScreenGetXDisplay (screen_info), screen_info->xfwm4_win, RevertToPointerRoot, timestamp);
+}
+
 void
 clientUpdateFocus (ScreenInfo *screen_info, Client * c, unsigned short flags)
 {
     DisplayInfo *display_info;
     Client *c2;
-    unsigned long data[2];
 
     TRACE ("entering clientUpdateFocus");
 
@@ -513,29 +531,19 @@
             FLAG_UNSET (c->flags, CLIENT_FLAG_DEMANDS_ATTENTION);
             clientSetNetState (c);
         }
-        data[0] = c->window;
         clientAdjustFullscreenLayer (c, TRUE);
         frameQueueDraw (c, FALSE);
     }
-    else
-    {
-        data[0] = None;
-    }
     if (c2)
     {
         if (c)
         {
             clientAdjustFullscreenLayer (c2, FALSE);
-            /* clientRaise (c, None); */
         }
         frameQueueDraw (c2, FALSE);
     }
-    data[1] = None;
-    XChangeProperty (display_info->dpy, screen_info->xroot,
-                     display_info->atoms[NET_ACTIVE_WINDOW], XA_WINDOW, 32,
-                     PropModeReplace, (unsigned char *) data, 2);
+    clientSetNetActiveWindow (screen_info, c, 0);
     clientClearDelayedFocus ();
-    clientUpdateOpacity (screen_info, c);
 }
 
 void
@@ -604,7 +612,7 @@
              * the previously focused window is unmapped (when iconifying or closing for example), the focus
              * will be reverted to the root window and focus transition will fail.
              */
-            XSetInputFocus (myScreenGetXDisplay (screen_info), screen_info->xfwm4_win, RevertToPointerRoot, timestamp);
+            clientFocusNone (screen_info, c2, timestamp);
         }
 
         if (FLAG_TEST(c->wm_flags, WM_FLAG_TAKEFOCUS))
@@ -615,23 +623,10 @@
     }
     else
     {
-        unsigned long data[2];
-
         TRACE ("setting focus to none");
 
-        data[0] = data[1] = None;
         client_focus = NULL;
-        pending_focus = NULL;
-
-        if (c2)
-        {
-            frameQueueDraw (c2, FALSE);
-            XChangeProperty (clientGetXDisplay (c2), c2->screen_info->xroot, display_info->atoms[NET_ACTIVE_WINDOW], XA_WINDOW, 32,
-                             PropModeReplace, (unsigned char *) data, 2);
-        }
-        XChangeProperty (myScreenGetXDisplay (screen_info), screen_info->xroot, display_info->atoms[NET_ACTIVE_WINDOW], XA_WINDOW, 32,
-                         PropModeReplace, (unsigned char *) data, 2);
-        XSetInputFocus (myScreenGetXDisplay (screen_info), screen_info->xfwm4_win, RevertToPointerRoot, timestamp);
+        clientFocusNone (screen_info, c2, timestamp);
         clientClearDelayedFocus ();
         clientUpdateOpacity (screen_info, c);
     }

Modified: xfwm4/trunk/src/netwm.c
===================================================================
--- xfwm4/trunk/src/netwm.c	2008-06-17 21:39:47 UTC (rev 27079)
+++ xfwm4/trunk/src/netwm.c	2008-06-18 20:43:00 UTC (rev 27080)
@@ -1353,3 +1353,23 @@
     clientSetLayer (c, layer);
 }
 
+void
+clientSetNetActiveWindow (ScreenInfo *screen_info, Client *c, Time timestamp)
+{
+    DisplayInfo *display_info;
+    unsigned long data[2];
+
+    g_return_if_fail (screen_info != NULL);
+    TRACE ("entering clientSetNetActiveWindow");
+
+    display_info = screen_info->display_info;
+    data[0] = (unsigned long) None;
+    data[1] = (unsigned long) timestamp;
+    if (c)
+    {
+        data[0] = (unsigned long) c->window;
+    }
+    XChangeProperty (myScreenGetXDisplay (screen_info), screen_info->xroot, display_info->atoms[NET_ACTIVE_WINDOW], XA_WINDOW, 32,
+                     PropModeReplace, (unsigned char *) data, 2);
+}
+

Modified: xfwm4/trunk/src/netwm.h
===================================================================
--- xfwm4/trunk/src/netwm.h	2008-06-17 21:39:47 UTC (rev 27079)
+++ xfwm4/trunk/src/netwm.h	2008-06-18 20:43:00 UTC (rev 27080)
@@ -51,5 +51,8 @@
 void                     clientWindowType                       (Client *);
 void                     clientUpdateAboveState                 (Client *);
 void                     clientUpdateBelowState                 (Client *);
+void                     clientSetNetActiveWindow               (ScreenInfo *,
+                                                                 Client *,
+                                                                 Time);
 
 #endif /* INC_NETWM_H */



More information about the Xfce4-commits mailing list