diff --git a/src/client.c b/src/client.c index b964b60ac41fb530521beaba8d248aeed134ef9c..e184eb239634ae0853c3807f2fc00476eff26763 100644 --- a/src/client.c +++ b/src/client.c @@ -2500,9 +2500,12 @@ clientShade (Client * c) clientSetNetState (c); if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_MANAGED)) { + clientConstrainPos (c, FALSE); + wc.x = c->x; + wc.y = c->y; wc.width = c->width; wc.height = c->height; - clientConfigure (c, &wc, CWWidth | CWHeight, CFG_FORCE_REDRAW); + clientConfigure (c, &wc, CWX | CWY | CWWidth | CWHeight, CFG_FORCE_REDRAW); } } @@ -3512,6 +3515,7 @@ clientResize_event_filter (XEvent * xevent, gpointer data) int move_top, move_bottom, move_left, move_right; GdkRectangle rect; gint monitor_nbr; + gint min_visible; TRACE ("entering clientResize_event_filter"); @@ -3527,6 +3531,7 @@ clientResize_event_filter (XEvent * xevent, gpointer data) frame_left = frameLeft (c); frame_right = frameRight (c); frame_bottom = frameBottom (c); + min_visible = MAX (frame_top, CLIENT_MIN_VISIBLE); cx = frame_x + (frame_width / 2); cy = frame_y + (frame_height / 2); @@ -3626,13 +3631,13 @@ clientResize_event_filter (XEvent * xevent, gpointer data) } else { - if ((c->x + c->width < disp_x + CLIENT_MIN_VISIBLE) - || (c->x + c->width < screen_info->margins [LEFT] + CLIENT_MIN_VISIBLE)) + if ((c->x + c->width < disp_x + min_visible) + || (c->x + c->width < screen_info->margins [LEFT] + min_visible)) { c->width = prev_width; } - if ((c->y + c->height < disp_y + CLIENT_MIN_VISIBLE) - || (c->y + c->height < screen_info->margins [TOP] + CLIENT_MIN_VISIBLE)) + if ((c->y + c->height < disp_y + min_visible) + || (c->y + c->height < screen_info->margins [TOP] + min_visible)) { c->height = prev_height; } @@ -3744,9 +3749,9 @@ clientResize_event_filter (XEvent * xevent, gpointer data) if (move_top) { - if ((c->y > disp_max_y - CLIENT_MIN_VISIBLE) + if ((c->y > disp_max_y - min_visible) || (c->y > gdk_screen_get_height (screen_info->gscr) - - screen_info->margins [BOTTOM] - CLIENT_MIN_VISIBLE)) + - screen_info->margins [BOTTOM] - min_visible)) { c->y = prev_y; c->height = prev_height; @@ -3754,17 +3759,17 @@ clientResize_event_filter (XEvent * xevent, gpointer data) } else if (move_bottom) { - if ((c->y + c->height < disp_y + CLIENT_MIN_VISIBLE) - || (c->y + c->height < screen_info->margins [TOP] + CLIENT_MIN_VISIBLE)) + if ((c->y + c->height < disp_y + min_visible) + || (c->y + c->height < screen_info->margins [TOP] + min_visible)) { c->height = prev_height; } } if (move_left) { - if ((c->x > disp_max_x - CLIENT_MIN_VISIBLE) + if ((c->x > disp_max_x - min_visible) || (c->x > gdk_screen_get_width (screen_info->gscr) - - screen_info->margins [RIGHT] - CLIENT_MIN_VISIBLE)) + - screen_info->margins [RIGHT] - min_visible)) { c->x = prev_x; c->width = prev_width; @@ -3772,8 +3777,8 @@ clientResize_event_filter (XEvent * xevent, gpointer data) } else if (move_right) { - if ((c->x + c->width < disp_x + CLIENT_MIN_VISIBLE) - || (c->x + c->width < screen_info->margins [LEFT] + CLIENT_MIN_VISIBLE)) + if ((c->x + c->width < disp_x + min_visible) + || (c->x + c->width < screen_info->margins [LEFT] + min_visible)) { c->width = prev_width; } diff --git a/src/client.h b/src/client.h index 6337907be74817687c182de9c9f35a0a9e896e37..4dfe345cffec2503ef222186147c3750f1bb7719 100644 --- a/src/client.h +++ b/src/client.h @@ -79,77 +79,79 @@ UPDATE_GRAVITY | \ UPDATE_CACHE) -#define CLIENT_MIN_VISIBLE 10 /* pixels */ +#ifndef CLIENT_MIN_VISIBLE +#define CLIENT_MIN_VISIBLE 15 +#endif -#define XFWM_FLAG_HAS_BORDER (1L<<0) -#define XFWM_FLAG_HAS_MENU (1L<<1) -#define XFWM_FLAG_HAS_MAXIMIZE (1L<<2) -#define XFWM_FLAG_HAS_CLOSE (1L<<3) -#define XFWM_FLAG_HAS_HIDE (1L<<4) -#define XFWM_FLAG_HAS_MOVE (1L<<5) -#define XFWM_FLAG_HAS_RESIZE (1L<<6) -#define XFWM_FLAG_HAS_STICK (1L<<7) -#define XFWM_FLAG_FOCUS (1L<<8) -#define XFWM_FLAG_IS_RESIZABLE (1L<<9) -#define XFWM_FLAG_MAP_PENDING (1L<<10) -#define XFWM_FLAG_VISIBLE (1L<<11) -#define XFWM_FLAG_MANAGED (1L<<13) -#define XFWM_FLAG_SESSION_MANAGED (1L<<14) -#define XFWM_FLAG_WORKSPACE_SET (1L<<15) -#define XFWM_FLAG_WAS_SHOWN (1L<<16) -#define XFWM_FLAG_DRAW_ACTIVE (1L<<17) -#define XFWM_FLAG_SEEN_ACTIVE (1L<<18) -#define XFWM_FLAG_FIRST_MAP (1L<<19) -#define XFWM_FLAG_LEGACY_FULLSCREEN (1L<<20) -#define XFWM_FLAG_MOVING_RESIZING (1L<<21) +#define XFWM_FLAG_HAS_BORDER (1L<<0) +#define XFWM_FLAG_HAS_MENU (1L<<1) +#define XFWM_FLAG_HAS_MAXIMIZE (1L<<2) +#define XFWM_FLAG_HAS_CLOSE (1L<<3) +#define XFWM_FLAG_HAS_HIDE (1L<<4) +#define XFWM_FLAG_HAS_MOVE (1L<<5) +#define XFWM_FLAG_HAS_RESIZE (1L<<6) +#define XFWM_FLAG_HAS_STICK (1L<<7) +#define XFWM_FLAG_FOCUS (1L<<8) +#define XFWM_FLAG_IS_RESIZABLE (1L<<9) +#define XFWM_FLAG_MAP_PENDING (1L<<10) +#define XFWM_FLAG_VISIBLE (1L<<11) +#define XFWM_FLAG_MANAGED (1L<<13) +#define XFWM_FLAG_SESSION_MANAGED (1L<<14) +#define XFWM_FLAG_WORKSPACE_SET (1L<<15) +#define XFWM_FLAG_WAS_SHOWN (1L<<16) +#define XFWM_FLAG_DRAW_ACTIVE (1L<<17) +#define XFWM_FLAG_SEEN_ACTIVE (1L<<18) +#define XFWM_FLAG_FIRST_MAP (1L<<19) +#define XFWM_FLAG_LEGACY_FULLSCREEN (1L<<20) +#define XFWM_FLAG_MOVING_RESIZING (1L<<21) -#define CLIENT_FLAG_HAS_STRUT (1L<<0) -#define CLIENT_FLAG_HAS_STRUT_PARTIAL (1L<<1) -#define CLIENT_FLAG_HAS_USER_TIME (1L<<2) -#define CLIENT_FLAG_ABOVE (1L<<3) -#define CLIENT_FLAG_BELOW (1L<<4) -#define CLIENT_FLAG_FULLSCREEN (1L<<5) -#define CLIENT_FLAG_ICONIFIED (1L<<6) -#define CLIENT_FLAG_MAXIMIZED_VERT (1L<<7) -#define CLIENT_FLAG_MAXIMIZED_HORIZ (1L<<8) -#define CLIENT_FLAG_MAXIMIZED (CLIENT_FLAG_MAXIMIZED_VERT | \ - CLIENT_FLAG_MAXIMIZED_HORIZ) -#define CLIENT_FLAG_SHADED (1L<<9) -#define CLIENT_FLAG_SKIP_PAGER (1L<<10) -#define CLIENT_FLAG_SKIP_TASKBAR (1L<<11) -#define CLIENT_FLAG_STATE_MODAL (1L<<12) -#define CLIENT_FLAG_STICKY (1L<<13) -#define CLIENT_FLAG_NAME_CHANGED (1L<<15) -#define CLIENT_FLAG_DEMANDS_ATTENTION (1L<<16) -#define CLIENT_FLAG_HAS_SHAPE (1L<<17) +#define CLIENT_FLAG_HAS_STRUT (1L<<0) +#define CLIENT_FLAG_HAS_STRUT_PARTIAL (1L<<1) +#define CLIENT_FLAG_HAS_USER_TIME (1L<<2) +#define CLIENT_FLAG_ABOVE (1L<<3) +#define CLIENT_FLAG_BELOW (1L<<4) +#define CLIENT_FLAG_FULLSCREEN (1L<<5) +#define CLIENT_FLAG_ICONIFIED (1L<<6) +#define CLIENT_FLAG_MAXIMIZED_VERT (1L<<7) +#define CLIENT_FLAG_MAXIMIZED_HORIZ (1L<<8) +#define CLIENT_FLAG_MAXIMIZED (CLIENT_FLAG_MAXIMIZED_VERT | \ + CLIENT_FLAG_MAXIMIZED_HORIZ) +#define CLIENT_FLAG_SHADED (1L<<9) +#define CLIENT_FLAG_SKIP_PAGER (1L<<10) +#define CLIENT_FLAG_SKIP_TASKBAR (1L<<11) +#define CLIENT_FLAG_STATE_MODAL (1L<<12) +#define CLIENT_FLAG_STICKY (1L<<13) +#define CLIENT_FLAG_NAME_CHANGED (1L<<15) +#define CLIENT_FLAG_DEMANDS_ATTENTION (1L<<16) +#define CLIENT_FLAG_HAS_SHAPE (1L<<17) -#define WM_FLAG_DELETE (1L<<0) -#define WM_FLAG_INPUT (1L<<1) -#define WM_FLAG_TAKEFOCUS (1L<<2) -#define WM_FLAG_CONTEXT_HELP (1L<<3) -#define WM_FLAG_URGENT (1L<<4) +#define WM_FLAG_DELETE (1L<<0) +#define WM_FLAG_INPUT (1L<<1) +#define WM_FLAG_TAKEFOCUS (1L<<2) +#define WM_FLAG_CONTEXT_HELP (1L<<3) +#define WM_FLAG_URGENT (1L<<4) -#define CLIENT_FLAG_INITIAL_VALUES XFWM_FLAG_HAS_BORDER | \ - XFWM_FLAG_HAS_MENU | \ - XFWM_FLAG_HAS_MAXIMIZE | \ - XFWM_FLAG_HAS_STICK | \ - XFWM_FLAG_HAS_HIDE | \ - XFWM_FLAG_HAS_CLOSE | \ - XFWM_FLAG_HAS_MOVE | \ - XFWM_FLAG_HAS_RESIZE | \ - XFWM_FLAG_FIRST_MAP +#define CLIENT_FLAG_INITIAL_VALUES XFWM_FLAG_HAS_BORDER | \ + XFWM_FLAG_HAS_MENU | \ + XFWM_FLAG_HAS_MAXIMIZE | \ + XFWM_FLAG_HAS_STICK | \ + XFWM_FLAG_HAS_HIDE | \ + XFWM_FLAG_HAS_CLOSE | \ + XFWM_FLAG_HAS_MOVE | \ + XFWM_FLAG_HAS_RESIZE | \ + XFWM_FLAG_FIRST_MAP -#define ALL_WORKSPACES (int) 0xFFFFFFFF +#define ALL_WORKSPACES (int) 0xFFFFFFFF -#define CONSTRAINED_WINDOW(c) ((c->win_layer > WIN_LAYER_DESKTOP) && \ - (c->win_layer < WIN_LAYER_ABOVE_DOCK) && \ - !(c->type & (WINDOW_DESKTOP | WINDOW_DOCK)) && \ - !FLAG_TEST(c->xfwm_flags, XFWM_FLAG_LEGACY_FULLSCREEN)) +#define CONSTRAINED_WINDOW(c) ((c->win_layer > WIN_LAYER_DESKTOP) && \ + (c->win_layer < WIN_LAYER_ABOVE_DOCK) && \ + !(c->type & (WINDOW_DESKTOP | WINDOW_DOCK)) && \ + !FLAG_TEST(c->xfwm_flags, XFWM_FLAG_LEGACY_FULLSCREEN)) -#define WINDOW_TYPE_DIALOG (WINDOW_DIALOG | WINDOW_MODAL_DIALOG) -#define WINDOW_TYPE_DONT_PLACE (WINDOW_DESKTOP | WINDOW_DOCK | WINDOW_SPLASHSCREEN) -#define WINDOW_REGULAR_FOCUSABLE (WINDOW_NORMAL | WINDOW_UTILITY | WINDOW_DIALOG | WINDOW_MODAL_DIALOG) -#define WINDOW_TYPE_DONT_FOCUS (WINDOW_DOCK) +#define WINDOW_TYPE_DIALOG (WINDOW_DIALOG | WINDOW_MODAL_DIALOG) +#define WINDOW_TYPE_DONT_PLACE (WINDOW_DESKTOP | WINDOW_DOCK | WINDOW_SPLASHSCREEN) +#define WINDOW_REGULAR_FOCUSABLE (WINDOW_NORMAL | WINDOW_UTILITY | WINDOW_DIALOG | WINDOW_MODAL_DIALOG) +#define WINDOW_TYPE_DONT_FOCUS (WINDOW_DOCK) diff --git a/src/placement.c b/src/placement.c index 76dcf3e86b429f4c549a9b7e09c5e93ac57c1b6c..40d4f14293b63e7454c54344e0771bc3c218da21 100644 --- a/src/placement.c +++ b/src/placement.c @@ -221,6 +221,7 @@ clientConstrainPos (Client * c, gboolean show_full) unsigned int ret = 0; GdkRectangle rect; gint monitor_nbr; + gint min_visible; g_return_val_if_fail (c != NULL, 0); TRACE ("entering clientConstrainPos %s", @@ -235,6 +236,7 @@ clientConstrainPos (Client * c, gboolean show_full) frame_top = frameTop (c); frame_left = frameLeft (c); frame_visible = (frame_top ? frame_top : frame_height); + min_visible = MAX (frame_top, CLIENT_MIN_VISIBLE); cx = frame_x + (frame_width / 2); cy = frame_y + (frame_height / 2); @@ -361,27 +363,27 @@ clientConstrainPos (Client * c, gboolean show_full) } else { - if (frame_x + frame_width < disp_x + CLIENT_MIN_VISIBLE) + if (frame_x + frame_width < disp_x + min_visible) { - c->x = disp_x + CLIENT_MIN_VISIBLE - frame_width + frame_left; + c->x = disp_x + min_visible - frame_width + frame_left; frame_x = frameX (c); - ret |= CLIENT_CONSTRAINED_LEFT; + ret |= CLIENT_CONSTRAINED_LEFT; } - if (frame_x + CLIENT_MIN_VISIBLE > disp_max_x) + if (frame_x + min_visible > disp_max_x) { - c->x = disp_max_x - CLIENT_MIN_VISIBLE + frame_left; + c->x = disp_max_x - min_visible + frame_left; frame_x = frameX (c); - ret |= CLIENT_CONSTRAINED_RIGHT; + ret |= CLIENT_CONSTRAINED_RIGHT; } - if (frame_y + frame_height < disp_y + CLIENT_MIN_VISIBLE) + if (frame_y + frame_height < disp_y + min_visible) { - c->y = disp_y + CLIENT_MIN_VISIBLE - frame_height + frame_top; + c->y = disp_y + min_visible - frame_height + frame_top; frame_y = frameY (c); - ret |= CLIENT_CONSTRAINED_TOP; + ret |= CLIENT_CONSTRAINED_TOP; } - if (frame_y + CLIENT_MIN_VISIBLE > disp_max_y) + if (frame_y + min_visible > disp_max_y) { - c->y = disp_max_y - CLIENT_MIN_VISIBLE + frame_top; + c->y = disp_max_y - min_visible + frame_top; frame_y = frameY (c); ret |= CLIENT_CONSTRAINED_BOTTOM; } @@ -402,9 +404,9 @@ clientConstrainPos (Client * c, gboolean show_full) if (overlapY (frame_y, frame_y + frame_height, c2->struts[RIGHT_START_Y], c2->struts[RIGHT_END_Y])) { - if (frame_x > screen_width - c2->struts[RIGHT] - CLIENT_MIN_VISIBLE) + if (frame_x > screen_width - c2->struts[RIGHT] - min_visible) { - c->x = screen_width - c2->struts[RIGHT] - CLIENT_MIN_VISIBLE + frame_left; + c->x = screen_width - c2->struts[RIGHT] - min_visible + frame_left; frame_x = frameX (c); ret |= CLIENT_CONSTRAINED_RIGHT; } @@ -414,9 +416,9 @@ clientConstrainPos (Client * c, gboolean show_full) if (overlapY (frame_y, frame_y + frame_height, c2->struts[LEFT_START_Y], c2->struts[LEFT_END_Y])) { - if (frame_x + frame_width < c2->struts[LEFT] + CLIENT_MIN_VISIBLE) + if (frame_x + frame_width < c2->struts[LEFT] + min_visible) { - c->x = c2->struts[LEFT] + CLIENT_MIN_VISIBLE - frame_width + frame_left; + c->x = c2->struts[LEFT] + min_visible - frame_width + frame_left; frame_x = frameX (c); ret |= CLIENT_CONSTRAINED_LEFT; } @@ -426,9 +428,9 @@ clientConstrainPos (Client * c, gboolean show_full) if (overlapX (frame_x, frame_x + frame_width, c2->struts[BOTTOM_START_X], c2->struts[BOTTOM_END_X])) { - if (frame_y > screen_height - c2->struts[BOTTOM] - CLIENT_MIN_VISIBLE) + if (frame_y > screen_height - c2->struts[BOTTOM] - min_visible) { - c->y = screen_height - c2->struts[BOTTOM] - CLIENT_MIN_VISIBLE + frame_top; + c->y = screen_height - c2->struts[BOTTOM] - min_visible + frame_top; frame_y = frameY (c); ret |= CLIENT_CONSTRAINED_BOTTOM; } @@ -444,9 +446,9 @@ clientConstrainPos (Client * c, gboolean show_full) frame_y = frameY (c); ret |= CLIENT_CONSTRAINED_TOP; } - if (frame_y + frame_height < c2->struts[TOP] + CLIENT_MIN_VISIBLE) + if (frame_y + frame_height < c2->struts[TOP] + min_visible) { - c->y = c2->struts[TOP] + CLIENT_MIN_VISIBLE - frame_height + frame_top; + c->y = c2->struts[TOP] + min_visible - frame_height + frame_top; frame_y = frameY (c); ret |= CLIENT_CONSTRAINED_TOP; }