[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