diff options
author | Victor Kareh <[email protected]> | 2017-08-29 15:36:19 -0400 |
---|---|---|
committer | Victor Kareh <[email protected]> | 2017-08-29 15:36:19 -0400 |
commit | c577f51e1e1258f8a6c55764a8b86d3421c466e7 (patch) | |
tree | dffc4a03b5344df3724bc246d34a7694fe59d67c /src/core | |
parent | a5439d2175395763e06e8bec10ad7b914742882a (diff) | |
download | marco-c577f51e1e1258f8a6c55764a8b86d3421c466e7.tar.bz2 marco-c577f51e1e1258f8a6c55764a8b86d3421c466e7.tar.xz |
Allow tiled windows to be resized horizontally
Determine whether the user is initiating a resize action on a tiled
window. If the user is trying to grab the window for resizing
horizontally from the edge that's farther away from the screen edge,
allow the resize to occur. Otherwise maintain the current tile geometry.
Also modified the window hints to allow resizing from the window menu.
Fixes #250
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/constraints.c | 33 | ||||
-rw-r--r-- | src/core/window-private.h | 4 |
2 files changed, 33 insertions, 4 deletions
diff --git a/src/core/constraints.c b/src/core/constraints.c index 69263a51..783449d3 100644 --- a/src/core/constraints.c +++ b/src/core/constraints.c @@ -876,6 +876,7 @@ constrain_tiling (MetaWindow *window, gboolean hminbad, vminbad; gboolean horiz_equal, vert_equal; gboolean constraint_already_satisfied; + gboolean allow_resize = FALSE; if (priority > PRIORITY_TILING) return TRUE; @@ -908,9 +909,37 @@ constrain_tiling (MetaWindow *window, if (check_only || constraint_already_satisfied) return constraint_already_satisfied; + /* Allow the user to resize horizontally when tiled */ + if (info->is_user_action) + { + /* Only allow resizing from the window side farther from the screen edge */ + switch (info->resize_gravity) + { + case NorthEastGravity: + case EastGravity: + case SouthEastGravity: + if (window->tile_mode == META_TILE_RIGHT) + allow_resize = TRUE; + break; + case NorthWestGravity: + case WestGravity: + case SouthWestGravity: + if (window->tile_mode == META_TILE_LEFT) + allow_resize = TRUE; + break; + } + + /* Maintain current tile size for all other user-initiated alternatives */ + target_size.x = info->orig.x; + target_size.width = info->orig.width; + } + /*** Enforce constraint ***/ - info->current.x = target_size.x; - info->current.width = target_size.width; + if (!allow_resize) + { + info->current.x = target_size.x; + info->current.width = target_size.width; + } info->current.y = target_size.y; info->current.height = target_size.height; diff --git a/src/core/window-private.h b/src/core/window-private.h index b3871bb8..e449b172 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -408,12 +408,12 @@ struct _MetaWindow #define META_WINDOW_TILED_RIGHT(w) (META_WINDOW_TILED(w) && \ (w)->tile_mode == META_TILE_RIGHT) #define META_WINDOW_ALLOWS_MOVE(w) ((w)->has_move_func && !(w)->fullscreen) -#define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w) ((w)->has_resize_func && !META_WINDOW_MAXIMIZED (w) && !META_WINDOW_TILED(w) && !(w)->fullscreen && !(w)->shaded) +#define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w) ((w)->has_resize_func && !META_WINDOW_MAXIMIZED (w) && !(w)->fullscreen && !(w)->shaded) #define META_WINDOW_ALLOWS_RESIZE(w) (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && \ (((w)->size_hints.min_width < (w)->size_hints.max_width) || \ ((w)->size_hints.min_height < (w)->size_hints.max_height))) #define META_WINDOW_ALLOWS_HORIZONTAL_RESIZE(w) (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && (w)->size_hints.min_width < (w)->size_hints.max_width) -#define META_WINDOW_ALLOWS_VERTICAL_RESIZE(w) (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && (w)->size_hints.min_height < (w)->size_hints.max_height) +#define META_WINDOW_ALLOWS_VERTICAL_RESIZE(w) (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && !META_WINDOW_TILED(w) && (w)->size_hints.min_height < (w)->size_hints.max_height) MetaWindow* meta_window_new (MetaDisplay *display, Window xwindow, |