diff options
author | Olivier Fourdan <fourdan.olivier@wanadoo.fr> | 2009-01-24 23:42:37 +0000 |
---|---|---|
committer | Olivier Fourdan <fourdan.olivier@wanadoo.fr> | 2009-01-24 23:42:37 +0000 |
commit | f128147411a235b1651520b7620f03b35c86c5a5 (patch) | |
tree | fd7c2b42cefe7961c13c4c3b630834366e7c092f /src/client.c | |
parent | a97cd94cbe32ebf35f4e721e2d6bb6886fd0239d (diff) | |
download | xfwm4-f128147411a235b1651520b7620f03b35c86c5a5.tar.gz |
* 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
(Old svn revision: 29311)
Diffstat (limited to 'src/client.c')
-rw-r--r-- | src/client.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/client.c b/src/client.c index 6abb4d790..b299ca705 100644 --- a/src/client.c +++ b/src/client.c @@ -1760,6 +1760,11 @@ clientFrame (DisplayInfo *display_info, Window w, gboolean recapture) 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 @@ clientToggleSticky (Client * c, gboolean include_transients) } } +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 clientToggleFullscreen (Client * c) } } +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); |