Author: olivier Date: 2009-01-24 23:42:37 +0000 (Sat, 24 Jan 2009) New Revision: 29311
Modified: xfwm4/trunk/ChangeLog xfwm4/trunk/NEWS xfwm4/trunk/README xfwm4/trunk/src/client.c xfwm4/trunk/src/client.h xfwm4/trunk/src/display.c xfwm4/trunk/src/display.h xfwm4/trunk/src/events.c xfwm4/trunk/src/hints.c xfwm4/trunk/src/hints.h xfwm4/trunk/src/netwm.c Log: * src/display.c, src/display.h, src/events.c, src/client.c src/client.h, src/hints.c, src/hints.h, src/netwm.c, README: Add support for NET_WM_FULLSCREEN_MONITORS Modified: xfwm4/trunk/ChangeLog =================================================================== --- xfwm4/trunk/ChangeLog 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/ChangeLog 2009-01-24 23:42:37 UTC (rev 29311) @@ -1,3 +1,9 @@ +2009-01-24 olivier + + * src/display.c, src/display.h, src/events.c, src/client.c + src/client.h, src/hints.c, src/hints.h, src/netwm.c, README: + Add support for NET_WM_FULLSCREEN_MONITORS + 2009-01-23 olivier * src/parserc.c, src/settings.c, src/settings.c: Fix settings not Modified: xfwm4/trunk/NEWS =================================================================== --- xfwm4/trunk/NEWS 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/NEWS 2009-01-24 23:42:37 UTC (rev 29311) @@ -6,6 +6,7 @@ the session manager (Bug #4839). - Fix settings not being set at startup (Bug #4845) - Flatten default theme +- Add support for NET_WM_FULLSCREEN_MONITORS 4.5.93 (Xfce 4.6beta3) ====================== Modified: xfwm4/trunk/README =================================================================== --- xfwm4/trunk/README 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/README 2009-01-24 23:42:37 UTC (rev 29311) @@ -20,14 +20,17 @@ NET_NUMBER_OF_DESKTOPS NET_REQUEST_FRAME_EXTENTS NET_SHOWING_DESKTOP - NET_STARTUP_ID NET_SUPPORTED NET_SUPPORTING_WM_CHECK NET_SYSTEM_TRAY_OPCODE + NET_WM_ACTION_ABOVE + NET_WM_ACTION_BELOW NET_WM_ACTION_CHANGE_DESKTOP NET_WM_ACTION_CLOSE + NET_WM_ACTION_FULLSCREEN NET_WM_ACTION_MAXIMIZE_HORZ NET_WM_ACTION_MAXIMIZE_VERT + NET_WM_ACTION_MINIMIZE NET_WM_ACTION_MOVE NET_WM_ACTION_RESIZE NET_WM_ACTION_SHADE @@ -35,13 +38,14 @@ NET_WM_ALLOWED_ACTIONS NET_WM_CONTEXT_HELP NET_WM_DESKTOP + NET_WM_FULLSCREEN_MONITORS NET_WM_ICON NET_WM_ICON_GEOMETRY NET_WM_ICON_NAME NET_WM_MOVERESIZE NET_WM_NAME - NET_WM_WINDOW_OPACITY - NET_WM_WINDOW_OPACITY_LOCKED + NET_WM_PID + NET_WM_PING NET_WM_STATE NET_WM_STATE_ABOVE NET_WM_STATE_BELOW @@ -60,6 +64,9 @@ NET_WM_SYNC_REQUEST NET_WM_SYNC_REQUEST_COUNTER NET_WM_USER_TIME + NET_WM_USER_TIME_WINDOW + NET_WM_WINDOW_OPACITY + NET_WM_WINDOW_OPACITY_LOCKED NET_WM_WINDOW_TYPE NET_WM_WINDOW_TYPE_DESKTOP NET_WM_WINDOW_TYPE_DIALOG Modified: xfwm4/trunk/src/client.c =================================================================== --- xfwm4/trunk/src/client.c 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/src/client.c 2009-01-24 23:42:37 UTC (rev 29311) @@ -1760,6 +1760,11 @@ c->ncmap = 0; } + c->fullscreen_monitors[0] = 0; + c->fullscreen_monitors[1] = 0; + c->fullscreen_monitors[2] = 0; + c->fullscreen_monitors[3] = 0; + /* Opacity for compositing manager */ c->opacity = NET_WM_OPAQUE; getOpacity (display_info, c->window, &c->opacity); @@ -2973,6 +2978,70 @@ } } +void +clientUpdateFullscreenSize (Client * c) +{ + ScreenInfo *screen_info; + DisplayInfo *display_info; + XWindowChanges wc; + GdkRectangle monitor, rect; + int i; + + g_return_if_fail (c != NULL); + TRACE ("entering clientUpdateFullscreenSize"); + TRACE ("Update fullscreen size for client \"%s\" (0x%lx)", c->name, c->window); + + screen_info = c->screen_info; + display_info = screen_info->display_info; + + if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) + { + if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREN_MONITORS)) + { + gdk_screen_get_monitor_geometry (screen_info->gscr, c->fullscreen_monitors[0], &rect); + for (i = 1; i < 4; i++) + { + gdk_screen_get_monitor_geometry (screen_info->gscr, c->fullscreen_monitors[i], &monitor); + gdk_rectangle_union (&rect, &monitor, &rect); + } + } + else + { + int cx, cy; + + cx = frameX (c) + (frameWidth (c) / 2); + cy = frameY (c) + (frameHeight (c) / 2); + + myScreenFindMonitorAtPoint (screen_info, cx, cy, &rect); + } + + wc.x = rect.x; + wc.y = rect.y; + wc.width = rect.width; + wc.height = rect.height; + } + + else + { + wc.x = c->fullscreen_old_x; + wc.y = c->fullscreen_old_y; + wc.width = c->fullscreen_old_width; + wc.height = c->fullscreen_old_height; + } + + if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_MANAGED)) + { + clientConfigure (c, &wc, CWX | CWY | CWWidth | CWHeight, CFG_FORCE_REDRAW); + } + else + { + c->x = wc.x; + c->y = wc.y; + c->height = wc.height; + c->width = wc.width; + } +} + void clientToggleFullscreen (Client * c) { g_return_if_fail (c != NULL); @@ -3003,6 +3072,48 @@ } } +void clientSetFullscreenMonitor (Client * c, gint top, gint bottom, gint left, gint right) +{ + ScreenInfo *screen_info; + DisplayInfo *display_info; + gint num_monitors; + + g_return_if_fail (c != NULL); + TRACE ("entering clientSetFullscreenMonitor"); + + screen_info = c->screen_info; + display_info = screen_info->display_info; + + num_monitors = gdk_screen_get_n_monitors (screen_info->gscr); + if ((top >= 0) && (top < num_monitors) && + (bottom >= 0) && (bottom < num_monitors) && + (left >= 0) && (left < num_monitors) && + (right >= 0) && (right < num_monitors)) + { + c->fullscreen_monitors[0] = top; + c->fullscreen_monitors[1] = bottom; + c->fullscreen_monitors[2] = left; + c->fullscreen_monitors[3] = right; + FLAG_SET (c->flags, CLIENT_FLAG_FULLSCREN_MONITORS); + } + else + { + c->fullscreen_monitors[0] = 0; + c->fullscreen_monitors[1] = 0; + c->fullscreen_monitors[2] = 0; + c->fullscreen_monitors[3] = 0; + FLAG_UNSET (c->flags, CLIENT_FLAG_FULLSCREN_MONITORS); + } + if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) + { + clientUpdateFullscreenSize (c); + } + if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREN_MONITORS)) + { + setNetFullscreenMonitors (display_info, c->window, top, bottom, left, right); + } +} + void clientToggleLayerAbove (Client * c) { g_return_if_fail (c != NULL); Modified: xfwm4/trunk/src/client.h =================================================================== --- xfwm4/trunk/src/client.h 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/src/client.h 2009-01-24 23:42:37 UTC (rev 29311) @@ -157,6 +157,7 @@ #define CLIENT_FLAG_NAME_CHANGED (1L<<16) #define CLIENT_FLAG_DEMANDS_ATTENTION (1L<<17) #define CLIENT_FLAG_HAS_SHAPE (1L<<18) +#define CLIENT_FLAG_FULLSCREN_MONITORS (1L<<19) #define WM_FLAG_DELETE (1L<<0) #define WM_FLAG_INPUT (1L<<1) @@ -298,6 +299,7 @@ unsigned long flags; unsigned long wm_flags; unsigned long xfwm_flags; + gint fullscreen_monitors[4]; /* Termination dialog */ int dialog_pid; @@ -408,7 +410,13 @@ gboolean); void clientToggleSticky (Client *, gboolean); +void clientUpdateFullscreenSize (Client *); void clientToggleFullscreen (Client *); +void clientSetFullscreenMonitor (Client *, + gint, + gint, + gint, + gint); void clientToggleLayerAbove (Client *); void clientToggleLayerBelow (Client *); void clientSetLayerNormal (Client *); Modified: xfwm4/trunk/src/display.c =================================================================== --- xfwm4/trunk/src/display.c 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/src/display.c 2009-01-24 23:42:37 UTC (rev 29311) @@ -113,6 +113,7 @@ "_NET_WM_ALLOWED_ACTIONS", "_NET_WM_CONTEXT_HELP", "_NET_WM_DESKTOP", + "_NET_WM_FULLSCREEN_MONITORS", "_NET_WM_ICON", "_NET_WM_ICON_GEOMETRY", "_NET_WM_ICON_NAME", Modified: xfwm4/trunk/src/display.h =================================================================== --- xfwm4/trunk/src/display.h 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/src/display.h 2009-01-24 23:42:37 UTC (rev 29311) @@ -207,6 +207,7 @@ NET_WM_ALLOWED_ACTIONS, NET_WM_CONTEXT_HELP, NET_WM_DESKTOP, + NET_WM_FULLSCREEN_MONITORS, NET_WM_ICON, NET_WM_ICON_GEOMETRY, NET_WM_ICON_NAME, Modified: xfwm4/trunk/src/events.c =================================================================== --- xfwm4/trunk/src/events.c 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/src/events.c 2009-01-24 23:42:37 UTC (rev 29311) @@ -2026,6 +2026,12 @@ setNetFrameExtents (display_info, c->window, frameTop (c), frameLeft (c), frameRight (c), frameBottom (c)); } + else if (ev->message_type == display_info->atoms[NET_WM_FULLSCREEN_MONITORS]) + { + TRACE ("client \"%s\" (0x%lx) has received a NET_WM_FULLSCREEN_MONITORS event", c->name, c->window); + clientSetFullscreenMonitor (c, (gint) ev->data.l[0], (gint) ev->data.l[1], + (gint) ev->data.l[2], (gint) ev->data.l[3]); + } } else { Modified: xfwm4/trunk/src/hints.c =================================================================== --- xfwm4/trunk/src/hints.c 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/src/hints.c 2009-01-24 23:42:37 UTC (rev 29311) @@ -423,6 +423,7 @@ atoms[i++] = display_info->atoms[NET_WM_ALLOWED_ACTIONS]; atoms[i++] = display_info->atoms[NET_WM_CONTEXT_HELP]; atoms[i++] = display_info->atoms[NET_WM_DESKTOP]; + atoms[i++] = display_info->atoms[NET_WM_FULLSCREEN_MONITORS]; atoms[i++] = display_info->atoms[NET_WM_ICON]; atoms[i++] = display_info->atoms[NET_WM_ICON_GEOMETRY]; atoms[i++] = display_info->atoms[NET_WM_ICON_NAME]; @@ -590,6 +591,20 @@ } void +setNetFullscreenMonitors (DisplayInfo *display_info, Window w, gint top, gint bottom, gint left, gint right) +{ + unsigned long data[4] = { 0, 0, 0, 0 }; + + TRACE ("entering setNetFullscreenMonitors"); + data[0] = (unsigned long) top;; + data[1] = (unsigned long) bottom; + data[2] = (unsigned long) left; + data[3] = (unsigned long) right; + XChangeProperty (display_info->dpy, w, display_info->atoms[NET_WM_FULLSCREEN_MONITORS], + XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 4); +} + +void initNetDesktopInfo (DisplayInfo *display_info, Window root, int workspace, int width, int height) { unsigned long data[2]; Modified: xfwm4/trunk/src/hints.h =================================================================== --- xfwm4/trunk/src/hints.h 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/src/hints.h 2009-01-24 23:42:37 UTC (rev 29311) @@ -205,6 +205,12 @@ int, int, int); +void setNetFullscreenMonitors (DisplayInfo *, + Window, + gint, + gint, + gint, + gint); void initNetDesktopInfo (DisplayInfo *, Window, int, Modified: xfwm4/trunk/src/netwm.c =================================================================== --- xfwm4/trunk/src/netwm.c 2009-01-24 21:03:15 UTC (rev 29310) +++ xfwm4/trunk/src/netwm.c 2009-01-24 23:42:37 UTC (rev 29311) @@ -728,7 +728,6 @@ { ScreenInfo *screen_info; DisplayInfo *display_info; - XWindowChanges wc; int layer; g_return_if_fail (c != NULL); @@ -740,46 +739,19 @@ if (FLAG_TEST (c->flags, CLIENT_FLAG_FULLSCREEN)) { - GdkRectangle rect; - int cx, cy; - - cx = frameX (c) + (frameWidth (c) / 2); - cy = frameY (c) + (frameHeight (c) / 2); - - myScreenFindMonitorAtPoint (screen_info, cx, cy, &rect); - c->fullscreen_old_x = c->x; c->fullscreen_old_y = c->y; c->fullscreen_old_width = c->width; c->fullscreen_old_height = c->height; c->fullscreen_old_layer = c->win_layer; - - wc.x = rect.x; - wc.y = rect.y; - wc.width = rect.width; - wc.height = rect.height; layer = WIN_LAYER_FULLSCREEN; } else { - wc.x = c->fullscreen_old_x; - wc.y = c->fullscreen_old_y; - wc.width = c->fullscreen_old_width; - wc.height = c->fullscreen_old_height; layer = c->fullscreen_old_layer; } - if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_MANAGED)) - { - clientConfigure (c, &wc, CWX | CWY | CWWidth | CWHeight, CFG_FORCE_REDRAW); - } - else - { - c->x = wc.x; - c->y = wc.y; - c->height = wc.height; - c->width = wc.width; - } clientSetLayer (c, layer); + clientUpdateFullscreenSize (c); /* Fullscreen has no decoration at all, update NET_FRAME_EXTENTS accordingly */ setNetFrameExtents (display_info, _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits