Newer
Older
Olivier Fourdan
committed
else if (ev->window == c->window)
clientPassGrabMouseButton (c);
if (((screen_info->params->raise_with_any_button) && (c->type & WINDOW_REGULAR_FOCUSABLE)) || (ev->button == Button1))
if (!(c->type & WINDOW_TYPE_DONT_FOCUS))
{
clientSetFocus (screen_info, c, ev->time, NO_FOCUS_FLAG);
}
if ((screen_info->params->raise_on_click) ||
Olivier Fourdan
committed
!FLAG_TEST (c->xfwm_flags, XFWM_FLAG_HAS_BORDER))
/* Clear timeout */
clear_timeout ();
Olivier Fourdan
committed
clientRaise (c, None);
Olivier Fourdan
committed
replay = TRUE;
}
if (replay)
{
XAllowEvents (display_info->dpy, ReplayPointer, CurrentTime);
}
else
{
XAllowEvents (display_info->dpy, SyncPointer, CurrentTime);
The event did not occur in one of our known good client...
Get the screen structure from the root of the event.
*/
screen_info = myDisplayGetScreenFromRoot (display_info, ev->root);
if (!screen_info)
{
return;
if ((ev->window == screen_info->xroot) && (screen_info->params->scroll_workspaces)
&& ((ev->button == Button4) || (ev->button == Button5)))
Olivier Fourdan
committed
}
Olivier Fourdan
committed
XUngrabPointer (display_info->dpy, myDisplayGetCurrentTime (display_info));
Olivier Fourdan
committed
XSendEvent (display_info->dpy, screen_info->xfwm4_win, FALSE, SubstructureNotifyMask, (XEvent *) ev);
handleButtonRelease (DisplayInfo *display_info, XButtonEvent * ev)
TRACE ("entering handleButtonRelease");
Olivier Fourdan
committed
#if CHECK_BUTTON_TIME
Olivier Fourdan
committed
/* Avoid treating the same event twice */
if (!check_button_time (ev))
{
TRACE ("ignoring ButtonRelease event because it has been already handled");
return;
}
Olivier Fourdan
committed
#endif
Olivier Fourdan
committed
/* Get the screen structure from the root of the event */
screen_info = myDisplayGetScreenFromRoot (display_info, ev->root);
if (!screen_info)
{
return;
}
Olivier Fourdan
committed
XSendEvent (display_info->dpy, screen_info->xfwm4_win, FALSE, SubstructureNotifyMask, (XEvent *) ev);
handleDestroyNotify (DisplayInfo *display_info, XDestroyWindowEvent * ev)
TRACE ("entering handleDestroyNotify");
TRACE ("DestroyNotify on window (0x%lx)", ev->window);
#ifdef ENABLE_KDE_SYSTRAY_PROXY
screen_info = myDisplayGetScreenFromSystray (display_info, ev->window);
/* systray window is gone */
screen_info->systray = None;
#endif
c = myDisplayGetClientFromWindow (display_info, ev->window, WINDOW);
TRACE ("DestroyNotify for \"%s\" (0x%lx)", c->name, c->window);
Olivier Fourdan
committed
clientPassFocus (c->screen_info, c, c);
clientUnframe (c, FALSE);
}
}
handleMapRequest (DisplayInfo *display_info, XMapRequestEvent * ev)
TRACE ("entering handleMapRequest");
TRACE ("MapRequest on window (0x%lx)", ev->window);
if (ev->window == None)
TRACE ("Mapping None ???");
return;
c = myDisplayGetClientFromWindow (display_info, ev->window, WINDOW);
ScreenInfo *screen_info = c->screen_info;
if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_MAP_PENDING))
{
TRACE ("Ignoring MapRequest on window (0x%lx)", ev->window);
return;
}
Olivier Fourdan
committed
clientShow (c, TRUE);
Olivier Fourdan
committed
clientClearAllShowDesktop (screen_info);
if (FLAG_TEST (c->flags, CLIENT_FLAG_STICKY) ||
(c->win_workspace == screen_info->current_ws))
Olivier Fourdan
committed
clientFocusNew(c);
clientFrame (display_info, ev->window, FALSE);
handleMapNotify (DisplayInfo *display_info, XMapEvent * ev)
TRACE ("MapNotify on window (0x%lx)", ev->window);
c = myDisplayGetClientFromWindow (display_info, ev->window, WINDOW);
if (c)
{
TRACE ("MapNotify for \"%s\" (0x%lx)", c->name, c->window);
if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_MAP_PENDING))
FLAG_UNSET (c->xfwm_flags, XFWM_FLAG_MAP_PENDING);
handleUnmapNotify (DisplayInfo *display_info, XUnmapEvent * ev)
TRACE ("entering handleUnmapNotify");
TRACE ("UnmapNotify on window (0x%lx)", ev->window);
if (ev->from_configure)
{
TRACE ("Ignoring UnmapNotify caused by parent's resize");
screen_info = myDisplayGetScreenFromWindow (display_info, ev->window);
if (screen_info && (ev->event != ev->window) && (ev->event != screen_info->xroot || !ev->send_event))
TRACE ("handleUnmapNotify (): Event ignored");
return;
}
c = myDisplayGetClientFromWindow (display_info, ev->window, WINDOW);
if (c)
{
TRACE ("UnmapNotify for \"%s\" (0x%lx)", c->name, c->window);
Olivier Fourdan
committed
TRACE ("ignore_unmap for \"%s\" is %i", c->name, c->ignore_unmap);
if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_MAP_PENDING))
* This UnmapNotify event is caused by reparenting
* so we just ignore it, so the window won't return
* to withdrawn state by mistake.
*/
TRACE ("Client \"%s\" is not mapped, event ignored", c->name);
/*
* ICCCM spec states that a client wishing to switch
* to WithdrawnState should send a synthetic UnmapNotify
* with the event field set to root if the client window
* is already unmapped.
* Therefore, bypass the ignore_unmap counter and
* unframe the client.
*/
Olivier Fourdan
committed
if ((ev->event == screen_info->xroot) && (ev->send_event))
{
TRACE ("ICCCM UnmapNotify for \"%s\"", c->name);
Olivier Fourdan
committed
clientPassFocus (screen_info, c, c);
clientUnframe (c, FALSE);
return;
}
Olivier Fourdan
committed
if (c->ignore_unmap)
{
c->ignore_unmap--;
TRACE ("ignore_unmap for \"%s\" is now %i",
c->name, c->ignore_unmap);
}
else
{
TRACE ("unmapping \"%s\" as ignore_unmap is %i",
Olivier Fourdan
committed
clientPassFocus (screen_info, c, c);
clientUnframe (c, FALSE);
Olivier Fourdan
committed
static gboolean
update_screen_idle_cb (gpointer data)
{
ScreenInfo *screen_info;
DisplayInfo *display_info;
Olivier Fourdan
committed
TRACE ("entering update_screen_idle_cb");
Olivier Fourdan
committed
g_return_val_if_fail (screen_info, FALSE);
Olivier Fourdan
committed
display_info = screen_info->display_info;
setNetWorkarea (display_info, screen_info->xroot, screen_info->workspace_count,
screen_info->width, screen_info->height, screen_info->margins);
Olivier Fourdan
committed
placeSidewalks (screen_info, screen_info->params->wrap_workspaces);
clientScreenResize (screen_info);
compositorUpdateScreenSize (screen_info);
Olivier Fourdan
committed
Olivier Fourdan
committed
return FALSE;
}
handleConfigureNotify (DisplayInfo *display_info, XConfigureEvent * ev)
screen_info = myDisplayGetScreenFromRoot (display_info, ev->window);
if (!screen_info)
{
return;
}
if (display_info->have_xrandr)
XRRUpdateConfiguration ((XEvent *) ev);
#endif
}
else
Olivier Fourdan
committed
TRACE ("ConfigureNotify on the screen_info->xroot win (0x%lx)", ev->window);
Olivier Fourdan
committed
screen_info->xscreen->width = ev->width;
screen_info->xscreen->height = ev->height;
screen_info->width = WidthOfScreen (screen_info->xscreen);
screen_info->height = HeightOfScreen (screen_info->xscreen);
Olivier Fourdan
committed
We need to use an idle function to update our screen layout to give gdk the
time to update its internal structures for Xinerama and monitor size,
otherwise the functions gdk_screen_get_monitor_geometry () don't return
accurate values...
Olivier Fourdan
committed
*/
g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, update_screen_idle_cb, screen_info, NULL);
handleConfigureRequest (DisplayInfo *display_info, XConfigureRequestEvent * ev)
Olivier Fourdan
committed
Client *c = NULL;
TRACE ("entering handleConfigureRequest");
TRACE ("ConfigureRequest on window (0x%lx)", ev->window);
wc.x = ev->x;
wc.y = ev->y;
wc.width = ev->width;
wc.height = ev->height;
wc.sibling = ev->above;
wc.stack_mode = ev->detail;
wc.border_width = ev->border_width;
c = myDisplayGetClientFromWindow (display_info, ev->window, WINDOW);
if (!c)
{
/* Some app tend or try to manipulate the wm frame to achieve fullscreen mode */
c = myDisplayGetClientFromWindow (display_info, ev->window, FRAME);
TRACE ("client %s (0x%lx) is attempting to manipulate its frame!", c->name, c->window);
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
if (ev->value_mask & CWX)
{
wc.x += frameLeft (c);
}
if (ev->value_mask & CWY)
{
wc.y += frameTop (c);
}
if (ev->value_mask & CWWidth)
{
wc.width -= frameLeft (c) + frameRight (c);
}
if (ev->value_mask & CWHeight)
{
wc.height -= frameTop (c) + frameBottom (c);
}
/* We don't allow changing stacking order by accessing the frame
window because that would break the layer management in xfwm4
*/
ev->value_mask &= ~(CWSibling | CWStackMode);
}
}
if (c)
{
gboolean constrained = FALSE;
TRACE ("handleConfigureRequest managed window \"%s\" (0x%lx)", c->name, c->window);
if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_MOVING_RESIZING))
{
/* Sorry, but it's not the right time for configure request */
return;
}
if (c->type == WINDOW_DESKTOP)
{
/* Ignore stacking request for DESKTOP windows */
ev->value_mask &= ~(CWSibling | CWStackMode);
}
clientCoordGravitate (c, APPLY, &wc.x, &wc.y);
if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN))
Olivier Fourdan
committed
GdkRectangle rect;
gint monitor_nbr;
int cx, cy;
/* size request from fullscreen windows get fullscreen */
cx = frameX (c) + (frameWidth (c) / 2);
cy = frameY (c) + (frameHeight (c) / 2);
monitor_nbr = find_monitor_at_point (screen_info->gscr, cx, cy);
gdk_screen_get_monitor_geometry (screen_info->gscr, monitor_nbr, &rect);
Olivier Fourdan
committed
wc.x = rect.x;
wc.y = rect.y;
wc.width = rect.width;
wc.height = rect.height;
else if (FLAG_TEST_ALL (c->flags, CLIENT_FLAG_MAXIMIZED)
&& (screen_info->params->borderless_maximize))
{
wc.x = c->x;
wc.y = c->y;
wc.width = c->width;
wc.height = c->height;
}
/* Clean up buggy requests that set all flags */
if ((ev->value_mask & CWX) && (wc.x == c->x))
{
ev->value_mask &= ~CWX;
}
if ((ev->value_mask & CWY) && (wc.y == c->y))
{
ev->value_mask &= ~CWY;
}
if ((ev->value_mask & CWWidth) && (wc.width == c->width))
{
ev->value_mask &= ~CWWidth;
}
if ((ev->value_mask & CWHeight) && (wc.height == c->height))
{
ev->value_mask &= ~CWHeight;
}
/* Still a move/resize after cleanup? */
if (ev->value_mask & (CWX | CWY | CWWidth | CWHeight))
{
if (FLAG_TEST (c->flags, CLIENT_FLAG_MAXIMIZED))
{
clientRemoveMaximizeFlag (c);
}
constrained = TRUE;
}
Olivier Fourdan
committed
Olivier Fourdan
committed
/*
Let's say that if the client performs a XRaiseWindow, we show the window if focus
stealing prevention is not activated, otherwise we just set the "demands attention"
flag...
*/
if ((ev->value_mask & CWStackMode) && (wc.stack_mode == Above) && (wc.sibling == None))
Olivier Fourdan
committed
Client *last_raised;
last_raised = clientGetLastRaise (screen_info);
if (last_raised && (c != last_raised))
Olivier Fourdan
committed
{
if (screen_info->params->prevent_focus_stealing)
{
Olivier Fourdan
committed
ev->value_mask &= ~CWStackMode;
TRACE ("Setting WM_STATE_DEMANDS_ATTENTION flag on \"%s\" (0x%lx)", c->name, c->window);
FLAG_SET (c->flags, CLIENT_FLAG_DEMANDS_ATTENTION);
clientSetNetState (c);
}
else
{
Olivier Fourdan
committed
clientActivate (c, getXServerTime (display_info));
}
Olivier Fourdan
committed
clientConfigure (c, &wc, ev->value_mask, (constrained ? CFG_CONSTRAINED : 0) | CFG_REQUEST);
TRACE ("unmanaged configure request for win 0x%lx", ev->window);
XConfigureWindow (display_info->dpy, ev->window, ev->value_mask, &wc);
handleEnterNotify (DisplayInfo *display_info, XCrossingEvent * ev)
Olivier Fourdan
committed
static Time lastresist = (Time) CurrentTime;
ScreenInfo *screen_info;
Client *c;
gboolean warp_pointer;
/* See http://rfc-ref.org/RFC-TEXTS/1013/chapter12.html for details */
TRACE ("entering handleEnterNotify");
if ((ev->mode == NotifyGrab) || (ev->mode == NotifyUngrab)
|| (ev->detail > NotifyNonlinearVirtual))
/* We're not interested in such notifications */
return;
TRACE ("EnterNotify on window (0x%lx)", ev->window);
c = myDisplayGetClientFromWindow (display_info, ev->window, FRAME);
if (c)
if (!(screen_info->params->click_to_focus) && clientAcceptFocus (c))
TRACE ("EnterNotify window is \"%s\"", c->name);
if (!(c->type & (WINDOW_DOCK | WINDOW_DESKTOP)))
Olivier Fourdan
committed
{
clientSetFocus (c->screen_info, c, ev->time, NO_FOCUS_FLAG);
Olivier Fourdan
committed
}
Olivier Fourdan
committed
/* No need to process the event any further */
return;
}
Olivier Fourdan
committed
/* The event was not for a client window */
if (display_info->nb_screens > 1)
{
/* Wrap workspace/wrap windows is disabled with multiscreen */
return;
}
Olivier Fourdan
committed
/* Get the screen structure from the root of the event */
screen_info = myDisplayGetScreenFromRoot (display_info, ev->root);
if (!screen_info)
{
return;
}
Olivier Fourdan
committed
if (screen_info->workspace_count && screen_info->params->wrap_workspaces
&& screen_info->params->wrap_resistance)
{
int msx, msy, maxx, maxy;
int rx, ry;
msx = ev->x_root;
msy = ev->y_root;
maxx = screen_info->width - 1;
maxy = screen_info->height - 1;
warp_pointer = FALSE;
if ((msx == 0) || (msx == maxx))
Olivier Fourdan
committed
{
if ((ev->time - lastresist) > 250) /* ms */
{
edge_scroll_x = 0;
}
else
{
edge_scroll_x++;
}
if (msx == 0)
lastresist = ev->time;
}
if ((msy == 0) || (msy == maxy))
{
if ((ev->time - lastresist) > 250) /* ms */
{
edge_scroll_y = 0;
}
else
{
edge_scroll_y++;
}
if (msy == 0)
}
else
{
lastresist = ev->time;
}
Olivier Fourdan
committed
if (edge_scroll_x > screen_info->params->wrap_resistance)
{
Olivier Fourdan
committed
edge_scroll_x = 0;
Olivier Fourdan
committed
{
Olivier Fourdan
committed
if (workspaceMove (screen_info, 0, -1, NULL, ev->time))
Olivier Fourdan
committed
}
Olivier Fourdan
committed
{
Olivier Fourdan
committed
if (workspaceMove (screen_info, 0, 1, NULL, ev->time))
Olivier Fourdan
committed
}
warp_pointer = TRUE;
}
if (edge_scroll_y > screen_info->params->wrap_resistance)
{
edge_scroll_y = 0;
Olivier Fourdan
committed
{
Olivier Fourdan
committed
if (workspaceMove (screen_info, -1, 0, NULL, ev->time))
}
}
Olivier Fourdan
committed
if (workspaceMove (screen_info, 1, 0, NULL, ev->time))
}
}
warp_pointer = TRUE;
}
if (warp_pointer)
{
XWarpPointer (display_info->dpy, None, None, 0, 0, 0, 0, rx, ry);
XFlush (display_info->dpy);
Olivier Fourdan
committed
}
handleLeaveNotify (DisplayInfo *display_info, XCrossingEvent * ev)
Olivier Fourdan
committed
{
TRACE ("entering handleLeaveNotify");
Olivier Fourdan
committed
}
handleFocusIn (DisplayInfo *display_info, XFocusChangeEvent * ev)
Client *c, *user_focus, *current_focus;
/* See http://rfc-ref.org/RFC-TEXTS/1013/chapter12.html for details */
TRACE ("entering handleFocusIn");
Olivier Fourdan
committed
TRACE ("handleFocusIn (0x%lx) mode = %s",
ev->window,
(ev->mode == NotifyNormal) ?
"NotifyNormal" :
(ev->mode == NotifyWhileGrabbed) ?
"NotifyWhileGrabbed" :
(ev->mode == NotifyGrab) ?
"NotifyGrab" :
(ev->mode == NotifyUngrab) ?
"NotifyUngrab" :
Olivier Fourdan
committed
TRACE ("handleFocusIn (0x%lx) detail = %s",
ev->window,
(ev->detail == NotifyAncestor) ?
"NotifyAncestor" :
(ev->detail == NotifyVirtual) ?
"NotifyVirtual" :
(ev->detail == NotifyInferior) ?
"NotifyInferior" :
(ev->detail == NotifyNonlinear) ?
"NotifyNonlinear" :
(ev->detail == NotifyNonlinearVirtual) ?
"NotifyNonlinearVirtual" :
(ev->detail == NotifyPointer) ?
"NotifyPointer" :
(ev->detail == NotifyPointerRoot) ?
"NotifyPointerRoot" :
(ev->detail == NotifyDetailNone) ?
"NotifyDetailNone" :
"(unknown)");
screen_info = myDisplayGetScreenFromWindow (display_info, ev->window);
if (!screen_info)
{
/* Not for us */
return;
}
if ((ev->window == screen_info->xroot)
&& ((ev->detail == NotifyDetailNone)
|| ((ev->mode == NotifyNormal) && (ev->detail == NotifyInferior))))
Olivier Fourdan
committed
{
Handle unexpected focus transition to root (means that an unknown
window has vanished and the focus is returned to the root).
Olivier Fourdan
committed
*/
Olivier Fourdan
committed
c = clientGetFocusOrPending ();
Olivier Fourdan
committed
clientSetFocus (screen_info, c, getXServerTime (display_info), FOCUS_FORCE);
Olivier Fourdan
committed
return;
}
Olivier Fourdan
committed
if ((ev->mode == NotifyGrab) || (ev->mode == NotifyUngrab))
{
/* We're not interested in such notifications */
return;
}
Olivier Fourdan
committed
c = myDisplayGetClientFromWindow (display_info, ev->window, ANY);
user_focus = clientGetUserFocus ();
current_focus = clientGetFocus ();
TRACE ("FocusIn on window (0x%lx)", ev->window);
if ((c) && (c != current_focus))
Olivier Fourdan
committed
TRACE ("Focus transfered to \"%s\" (0x%lx)", c->name, c->window);
clientUpdateFocus (screen_info, c, FOCUS_SORT);
if ((user_focus != c) && (user_focus != NULL))
/*
Focus stealing prevention:
Olivier Fourdan
committed
Some apps tend to focus the window directly. If focus stealing prevention is enabled,
we revert the user set focus to the window that we think has focus and then set the
demand attention flag.
*/
if (screen_info->params->prevent_focus_stealing)
{
Olivier Fourdan
committed
TRACE ("Setting focus back to \"%s\" (0x%lx)", user_focus->name, user_focus->window);
clientSetFocus (user_focus->screen_info, user_focus, getXServerTime (display_info), NO_FOCUS_FLAG);
Olivier Fourdan
committed
Olivier Fourdan
committed
if (current_focus)
{
TRACE ("Setting WM_STATE_DEMANDS_ATTENTION flag on \"%s\" (0x%lx)", c->name, c->window);
FLAG_SET (c->flags, CLIENT_FLAG_DEMANDS_ATTENTION);
clientSetNetState (c);
}
if (screen_info->params->raise_on_focus)
handleFocusOut (DisplayInfo *display_info, XFocusChangeEvent * ev)
/* See http://rfc-ref.org/RFC-TEXTS/1013/chapter12.html for details */
TRACE ("entering handleFocusOut");
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
TRACE ("handleFocusOut (0x%lx) mode = %s",
ev->window,
(ev->mode == NotifyNormal) ?
"NotifyNormal" :
(ev->mode == NotifyWhileGrabbed) ?
"NotifyWhileGrabbed" :
"(unknown)");
TRACE ("handleFocusOut (0x%lx) detail = %s",
ev->window,
(ev->detail == NotifyAncestor) ?
"NotifyAncestor" :
(ev->detail == NotifyVirtual) ?
"NotifyVirtual" :
(ev->detail == NotifyInferior) ?
"NotifyInferior" :
(ev->detail == NotifyNonlinear) ?
"NotifyNonlinear" :
(ev->detail == NotifyNonlinearVirtual) ?
"NotifyNonlinearVirtual" :
(ev->detail == NotifyPointer) ?
"NotifyPointer" :
(ev->detail == NotifyPointerRoot) ?
"NotifyPointerRoot" :
(ev->detail == NotifyDetailNone) ?
"NotifyDetailNone" :
"(unknown)");
Olivier Fourdan
committed
if ((ev->mode == NotifyGrab) || (ev->mode == NotifyUngrab) ||
(ev->detail == NotifyInferior) || (ev->detail > NotifyNonlinearVirtual))
{
/* We're not interested in such notifications */
return;
}
&& ((ev->detail == NotifyNonlinear)
|| (ev->detail == NotifyNonlinearVirtual)))
Olivier Fourdan
committed
{
Olivier Fourdan
committed
c = myDisplayGetClientFromWindow (display_info, ev->window, ANY);
TRACE ("FocusOut on window (0x%lx)", ev->window);
Olivier Fourdan
committed
if ((c) && (c == clientGetFocus ()))
{
TRACE ("focus lost from \"%s\" (0x%lx)", c->name, c->window);
Olivier Fourdan
committed
clientPassGrabMouseButton (NULL);
clientUpdateFocus (c->screen_info, NULL, NO_FOCUS_FLAG);
/* Clear timeout */
clear_timeout ();
}
Olivier Fourdan
committed
}
handlePropertyNotify (DisplayInfo *display_info, XPropertyEvent * ev)
TRACE ("entering handlePropertyNotify");
c = myDisplayGetClientFromWindow (display_info, ev->window, WINDOW);
if (c)
{
screen_info = c->screen_info;
if (ev->atom == XA_WM_NORMAL_HINTS)
{
TRACE ("client \"%s\" (0x%lx) has received a XA_WM_NORMAL_HINTS notify", c->name, c->window);
else if ((ev->atom == XA_WM_NAME) ||
(ev->atom == display_info->atoms[NET_WM_NAME]) ||
(ev->atom == display_info->atoms[WM_CLIENT_MACHINE]))
TRACE ("client \"%s\" (0x%lx) has received a XA_WM_NAME/NET_WM_NAME/WM_CLIENT_MACHINE notify", c->name, c->window);
if (c->name)
{
Olivier Fourdan
committed
g_free (c->name);
getWindowName (display_info, c->window, &c->name);
FLAG_SET (c->flags, CLIENT_FLAG_NAME_CHANGED);
Olivier Fourdan
committed
frameDraw (c, TRUE);
else if (ev->atom == display_info->atoms[MOTIF_WM_HINTS])
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a MOTIF_WM_HINTS notify", c->name, c->window);
}
else if (ev->atom == XA_WM_HINTS)
{
TRACE ("client \"%s\" (0x%lx) has received a XA_WM_HINTS notify", c->name, c->window);
c->wmhints = XGetWMHints (display_info->dpy, c->window);
if (c->wmhints)
{
if (c->wmhints->flags & WindowGroupHint)
{
c->group_leader = c->wmhints->window_group;
}
if ((c->wmhints->flags & IconPixmapHint) && (screen_info->params->show_app_icon))
{
clientUpdateIcon (c);
}
if (HINTS_ACCEPT_INPUT (c->wmhints))
{
FLAG_SET (c->wm_flags, WM_FLAG_INPUT);
}
else
{
FLAG_UNSET (c->wm_flags, WM_FLAG_INPUT);
}
else if (ev->atom == display_info->atoms[WM_PROTOCOLS])
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a WM_PROTOCOLS notify", c->name, c->window);
else if (ev->atom == display_info->atoms[WM_TRANSIENT_FOR])
{
Window w;
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a WM_TRANSIENT_FOR notify", c->name, c->window);
getTransientFor (display_info, c->screen_info->xroot, c->window, &w);
if (clientCheckTransientWindow (c, w))
{
c->transient_for = w;
#if 0
/*
Java 1.6 updates the WM_TRANSIENT_FOR properties "on-the-fly"
of its windows to maintain the z-order.
If we raise the transient then, we clearly have a race
condition between the WM and Java... And that breaks
the z-order. Bug #2483.
I still think that raising here makes sense, to ensure
that the newly promoted transient window is placed above
its parent.
Chances are that Java 1.6 won't change any time soon (heh,
it's not even released yet), so let's adjust the WM to
work with Java 1.6...
*/
Olivier Fourdan
committed
clientRaise (c, w);
#endif
}
}
else if (ev->atom == display_info->atoms[WIN_HINTS])
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a WIN_HINTS notify", c->name, c->window);
getHint (display_info, c->window, WIN_HINTS, (long *) &c->win_hints);
else if (ev->atom == display_info->atoms[NET_WM_WINDOW_TYPE])
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a NET_WM_WINDOW_TYPE notify", c->name, c->window);
clientGetNetWmType (c);
Olivier Fourdan
committed
frameDraw (c, TRUE);
else if ((ev->atom == display_info->atoms[NET_WM_STRUT]) ||
(ev->atom == display_info->atoms[NET_WM_STRUT_PARTIAL]))
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a NET_WM_STRUT notify", c->name, c->window);
if (clientGetNetStruts (c) && FLAG_TEST (c->xfwm_flags, XFWM_FLAG_VISIBLE))
{
workspaceUpdateArea (c->screen_info);
}
else if (ev->atom == display_info->atoms[WM_COLORMAP_WINDOWS])
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a WM_COLORMAP_WINDOWS notify", c->name, c->window);
clientUpdateColormaps (c);
if (c == clientGetFocus ())
{
clientInstallColormaps (c);
}
}
else if (ev->atom == display_info->atoms[NET_WM_USER_TIME])
Olivier Fourdan
committed
{
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a NET_WM_USER_TIME notify", c->name, c->window);
if (getNetWMUserTime (display_info, c->window, &c->user_time))
Olivier Fourdan
committed
{
Olivier Fourdan
committed
myDisplaySetLastUserTime (display_info, c->user_time);
Olivier Fourdan
committed
FLAG_SET (c->flags, CLIENT_FLAG_HAS_USER_TIME);
Olivier Fourdan
committed
}
Olivier Fourdan
committed
}
else if (ev->atom == display_info->atoms[NET_WM_WINDOW_OPACITY])
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a NET_WM_OPACITY notify", c->name, c->window);
if (!getOpacity (display_info, c->window, &c->opacity))
compositorWindowSetOpacity (display_info, c->frame, c->opacity);
else if (ev->atom == display_info->atoms[NET_WM_WINDOW_OPACITY_LOCKED])
{
Olivier Fourdan
committed
TRACE ("client \"%s\" (0x%lx) has received a NET_WM_OPACITY_LOCKED notify", c->name, c->window);
c->opacity_locked = getOpacityLock (display_info, c->window);
}
else if ((screen_info->params->show_app_icon) &&
((ev->atom == display_info->atoms[NET_WM_ICON]) ||
(ev->atom == display_info->atoms[KWM_WIN_ICON])))
{
clientUpdateIcon (c);
}
#ifdef HAVE_STARTUP_NOTIFICATION
else if (ev->atom == display_info->atoms[NET_STARTUP_ID])
{
if (c->startup_id)
{
Olivier Fourdan
committed
g_free (c->startup_id);
c->startup_id = NULL;
}
getWindowStartupId (display_info, c->window, &c->startup_id);
#endif /* HAVE_STARTUP_NOTIFICATION */
#ifdef HAVE_XSYNC
else if (ev->atom == display_info->atoms[NET_WM_SYNC_REQUEST_COUNTER])
{
getXSyncCounter (display_info, c->window, &c->xsync_counter);
TRACE ("Window 0x%lx has NET_WM_SYNC_REQUEST_COUNTER set to 0x%lx", c->window, c->xsync_counter);
}
#endif /* HAVE_XSYNC */
screen_info = myDisplayGetScreenFromWindow (display_info, ev->window);
if (!screen_info)
{
return;
if (ev->atom == display_info->atoms[NET_DESKTOP_NAMES])
{
Olivier Fourdan
committed
gchar **names;
int items;
Olivier Fourdan
committed
TRACE ("root has received a NET_DESKTOP_NAMES notify");
if (getUTF8StringList (display_info, screen_info->xroot, NET_DESKTOP_NAMES, &names, &items))
{
workspaceSetNames (screen_info, names, items);
}
}
else if (ev->atom == display_info->atoms[GNOME_PANEL_DESKTOP_AREA])
Olivier Fourdan
committed
TRACE ("root has received a GNOME_PANEL_DESKTOP_AREA notify");
getGnomeDesktopMargins (display_info, screen_info->xroot, screen_info->gnome_margins);
else if (ev->atom == display_info->atoms[NET_DESKTOP_LAYOUT])
Olivier Fourdan
committed
{
Olivier Fourdan
committed
TRACE ("root has received a NET_DESKTOP_LAYOUT notify");
getDesktopLayout(display_info, screen_info->xroot, screen_info->workspace_count, &screen_info->desktop_layout);
Olivier Fourdan
committed
placeSidewalks(screen_info, screen_info->params->wrap_workspaces);
Olivier Fourdan
committed
}
handleClientMessage (DisplayInfo *display_info, XClientMessageEvent * ev)
ScreenInfo *screen_info;
Client *c;
gboolean is_transient;