diff options
-rw-r--r-- | src/core/constraints.c | 30 | ||||
-rw-r--r-- | src/core/window-private.h | 3 | ||||
-rw-r--r-- | src/core/window.c | 19 |
3 files changed, 30 insertions, 22 deletions
diff --git a/src/core/constraints.c b/src/core/constraints.c index 558e43d31..d1a775eb2 100644 --- a/src/core/constraints.c +++ b/src/core/constraints.c @@ -1020,8 +1020,6 @@ constrain_tiling (MetaWindow *window, gboolean check_only) { MetaRectangle target_size; - MetaRectangle min_size, max_size; - gboolean hminbad, vminbad; gboolean horiz_equal, vert_equal; gboolean constraint_already_satisfied; @@ -1032,24 +1030,13 @@ constrain_tiling (MetaWindow *window, if (!META_WINDOW_TILED_SIDE_BY_SIDE (window)) return TRUE; - /* Calculate target_size - as the tile previews need this as well, we - * use an external function for the actual calculation - */ - meta_window_get_tile_area_for_mode (window, - window->tile_mode, - window->tile_mode, - window->tile_monitor_number, - TRUE, - &target_size); - - /* Check min size constraints; max size constraints are ignored as for - * maximized windows. - */ - get_size_limits (window, &min_size, &max_size); - hminbad = target_size.width < min_size.width; - vminbad = target_size.height < min_size.height; - if (hminbad || vminbad) - return TRUE; + target_size.x = info->work_area_monitor.x; + target_size.y = info->work_area_monitor.y; + target_size.width = info->work_area_monitor.width * window->hpercentage; + target_size.height = info->work_area_monitor.height * window->vpercentage; + + if (window->tile_mode == META_TILE_RIGHT) + target_size.x += info->work_area_monitor.width - target_size.width; /* Determine whether constraint is already satisfied; exit if it is */ horiz_equal = target_size.x == info->current.x && @@ -1061,13 +1048,14 @@ constrain_tiling (MetaWindow *window, return constraint_already_satisfied; /*** Enforce constraint ***/ + info->current.x = target_size.x; info->current.y = target_size.y; + info->current.width = target_size.width; info->current.height = target_size.height; return TRUE; } - static gboolean constrain_fullscreen (MetaWindow *window, ConstraintInfo *info, diff --git a/src/core/window-private.h b/src/core/window-private.h index ce1157475..0c58675b3 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -213,6 +213,9 @@ struct _MetaWindow guint previous_tile_mode : 2; guint preview_tile_mode : 2; + gdouble hpercentage; + gdouble vpercentage; + int preferred_output_winsys_id; /* Whether we're shaded */ diff --git a/src/core/window.c b/src/core/window.c index ed67aa235..a57f59b29 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -3004,7 +3004,8 @@ meta_window_tile (MetaWindow *window, meta_window_move_resize_internal (window, (META_MOVE_RESIZE_MOVE_ACTION | META_MOVE_RESIZE_RESIZE_ACTION | - META_MOVE_RESIZE_STATE_CHANGED), + META_MOVE_RESIZE_STATE_CHANGED | + META_MOVE_RESIZE_USER_ACTION), NorthWestGravity, new_rect); @@ -3733,6 +3734,18 @@ meta_window_update_monitor (MetaWindow *window, } } +static void +meta_window_update_screen_ratio (MetaWindow *window, + MetaRectangle rect) +{ + MetaRectangle workarea; + + meta_window_get_work_area_current_monitor (window, &workarea); + + window->hpercentage = rect.width / (gdouble) workarea.width; + window->vpercentage = rect.height / (gdouble) workarea.height; +} + void meta_window_move_resize_internal (MetaWindow *window, MetaMoveResizeFlags flags, @@ -3811,6 +3824,10 @@ meta_window_move_resize_internal (MetaWindow *window, else g_assert_not_reached (); + /* Only update percentage when the user resizes the window */ + if ((flags & META_MOVE_RESIZE_USER_ACTION) && (flags & META_MOVE_RESIZE_RESIZE_ACTION)) + meta_window_update_screen_ratio (window, unconstrained_rect); + constrained_rect = unconstrained_rect; if (flags & (META_MOVE_RESIZE_MOVE_ACTION | META_MOVE_RESIZE_RESIZE_ACTION) && window->monitor) |