diff options
Diffstat (limited to 'src/window.c')
-rw-r--r-- | src/window.c | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/src/window.c b/src/window.c index 13b54fe..29cc32b 100644 --- a/src/window.c +++ b/src/window.c @@ -122,6 +122,24 @@ void vwm_win_set_focused(vwm_t *vwm, vwm_window_t *vwin) } +/* Using the supplied rect and screen dimensions, discover "allscreen" windows. */ +/* If scr is NULL, the screen best fit to the supplied rect is used. */ +void vwm_win_autoconf_magic(vwm_t *vwm, vwm_window_t *vwin, const vwm_screen_t *scr, int x, int y, int width, int height) +{ + vwin->autoconfigured = VWM_WIN_AUTOCONF_NONE; + + if (!scr) + scr = vwm_screen_find(vwm, VWM_SCREEN_REL_RECT, x, y, width, height); + + if (!vwin->shelved && scr && + width == scr->width && + height == scr->height) { + VWM_TRACE_WIN(vwin->xwindow->id, "auto-allscreened window"); + vwin->autoconfigured = VWM_WIN_AUTOCONF_ALL; + } +} + + /* "autoconfigure" windows (configuration shortcuts like fullscreen/halfscreen/quarterscreen) and restoring the window */ void vwm_win_autoconf(vwm_t *vwm, vwm_window_t *vwin, vwm_screen_rel_t rel, vwm_win_autoconf_t conf, ...) { @@ -413,8 +431,7 @@ static void vwm_win_assimilate(vwm_t *vwm, vwm_window_t *vwin) { vwm_xwindow_t *xwin = vwin->xwindow; XWindowAttributes attrs; - XWindowChanges changes = {}; - unsigned changes_mask = (CWX | CWY); + XWindowChanges changes = { .border_width = WINDOW_BORDER_WIDTH }; const vwm_screen_t *scr = NULL; if (win_is_console(vwm, xwin->id)) { @@ -450,22 +467,18 @@ static void vwm_win_assimilate(vwm_t *vwm, vwm_window_t *vwin) XGetWMNormalHints(VWM_XDISPLAY(vwm), xwin->id, vwin->hints, &vwin->hints_supplied); XGetWindowAttributes(VWM_XDISPLAY(vwm), xwin->id, &attrs); - /* if the window size is precisely the screen size then directly "allscreen" the window right here */ - if (!vwin->shelved && scr && - attrs.width == scr->width && - attrs.height == scr->height) { - VWM_TRACE("auto-allscreened window \"%s\"", vwin->xwindow->name); + vwm_win_autoconf_magic(vwm, vwin, scr, changes.x, changes.y, attrs.width, attrs.height); + + if (vwin->autoconfigured == VWM_WIN_AUTOCONF_ALL) changes.border_width = 0; - changes_mask |= CWBorderWidth; - vwin->autoconfigured = VWM_WIN_AUTOCONF_ALL; - } vwin->client.x = changes.x; vwin->client.y = changes.y; vwin->client.height = attrs.height; vwin->client.width = attrs.width; + vwin->client.border_width = changes.border_width; - XConfigureWindow(VWM_XDISPLAY(vwm), xwin->id, changes_mask, &changes); + XConfigureWindow(VWM_XDISPLAY(vwm), xwin->id, (CWX | CWY | CWBorderWidth), &changes); } |