diff --git a/src/compositor/edge-resistance.c b/src/compositor/edge-resistance.c index 36b448f9c..f5386e5de 100644 --- a/src/compositor/edge-resistance.c +++ b/src/compositor/edge-resistance.c @@ -485,7 +485,7 @@ apply_edge_resistance_to_each_side (MetaEdgeResistanceData *edge_data, auto_snap = flags & META_EDGE_RESISTANCE_SNAP; keyboard_op = flags & META_EDGE_RESISTANCE_KEYBOARD_OP; - if (auto_snap && !META_WINDOW_TILED_SIDE_BY_SIDE (window)) + if (auto_snap && !meta_window_is_tiled_side_by_side (window)) { /* Do the auto snapping instead of normal edge resistance; in all * cases, we allow snapping to opposite kinds of edges (e.g. left @@ -520,7 +520,7 @@ apply_edge_resistance_to_each_side (MetaEdgeResistanceData *edge_data, FALSE, keyboard_op); } - else if (auto_snap && META_WINDOW_TILED_SIDE_BY_SIDE (window)) + else if (auto_snap && meta_window_is_tiled_side_by_side (window)) { MtkRectangle workarea; guint i; diff --git a/src/compositor/meta-window-drag.c b/src/compositor/meta-window-drag.c index 786bfda0f..2638da59d 100644 --- a/src/compositor/meta-window-drag.c +++ b/src/compositor/meta-window-drag.c @@ -102,12 +102,12 @@ update_tile_preview_timeout (MetaWindowDrag *window_drag) { case META_TILE_LEFT: case META_TILE_RIGHT: - if (!META_WINDOW_TILED_SIDE_BY_SIDE (window)) + if (!meta_window_is_tiled_side_by_side (window)) needs_preview = TRUE; break; case META_TILE_MAXIMIZED: - if (!META_WINDOW_MAXIMIZED (window)) + if (!meta_window_is_maximized (window)) needs_preview = TRUE; break; @@ -1247,8 +1247,8 @@ update_move (MetaWindowDrag *window_drag, window->tile_monitor_number = -1; } else if (meta_prefs_get_edge_tiling () && - !META_WINDOW_MAXIMIZED (window) && - !META_WINDOW_TILED_SIDE_BY_SIDE (window)) + !meta_window_is_maximized (window) && + !meta_window_is_tiled_side_by_side (window)) { update_move_maybe_tile (window_drag, shake_threshold, x, y); } @@ -1258,8 +1258,9 @@ update_move (MetaWindowDrag *window_drag, * loose via X motion. */ - if ((META_WINDOW_MAXIMIZED (window) && ABS (dy) >= shake_threshold) || - (META_WINDOW_TILED_SIDE_BY_SIDE (window) && (MAX (ABS (dx), ABS (dy)) >= shake_threshold))) + if ((meta_window_is_maximized (window) && ABS (dy) >= shake_threshold) || + (meta_window_is_tiled_side_by_side (window) && + (MAX (ABS (dx), ABS (dy)) >= shake_threshold))) { double prop; @@ -1294,7 +1295,7 @@ update_move (MetaWindowDrag *window_drag, /* remaximize window on another monitor if window has been shaken * loose or it is still maximized (then move straight) */ - else if ((window_drag->shaken_loose || META_WINDOW_MAXIMIZED (window)) && + else if ((window_drag->shaken_loose || meta_window_is_maximized (window)) && window->tile_mode != META_TILE_LEFT && window->tile_mode != META_TILE_RIGHT) { MetaDisplay *display = meta_window_get_display (window); @@ -1368,7 +1369,7 @@ update_move (MetaWindowDrag *window_drag, meta_window_get_frame_rect (window, &old); /* Don't allow movement in the maximized directions or while tiled */ - if (window->maximized_horizontally || META_WINDOW_TILED_SIDE_BY_SIDE (window)) + if (window->maximized_horizontally || meta_window_is_tiled_side_by_side (window)) new_x = old.x; if (window->maximized_vertically) new_y = old.y; @@ -1599,7 +1600,7 @@ maybe_maximize_tiled_window (MetaWindow *window) MtkRectangle work_area; gint shake_threshold; - if (!META_WINDOW_TILED_SIDE_BY_SIDE (window)) + if (!meta_window_is_tiled_side_by_side (window)) return; shake_threshold = meta_prefs_get_drag_threshold (); diff --git a/src/core/constraints.c b/src/core/constraints.c index 4017ecbe0..6f20d087e 100644 --- a/src/core/constraints.c +++ b/src/core/constraints.c @@ -1217,15 +1217,16 @@ constrain_maximization (MetaWindow *window, /* Determine whether constraint applies; exit if it doesn't */ if ((!window->maximized_horizontally && !window->maximized_vertically) || - META_WINDOW_TILED_SIDE_BY_SIDE (window)) + meta_window_is_tiled_side_by_side (window)) return TRUE; /* Calculate target_size = maximized size of (window + frame) */ - if (META_WINDOW_TILED_MAXIMIZED (window)) + if (meta_window_is_maximized (window) && + window->tile_mode == META_TILE_MAXIMIZED) { meta_window_get_tile_area (window, window->tile_mode, &target_size); } - else if (META_WINDOW_MAXIMIZED (window)) + else if (meta_window_is_maximized (window)) { target_size = info->work_area_monitor; } @@ -1304,7 +1305,7 @@ constrain_tiling (MetaWindow *window, return TRUE; /* Determine whether constraint applies; exit if it doesn't */ - if (!META_WINDOW_TILED_SIDE_BY_SIDE (window)) + if (!meta_window_is_tiled_side_by_side (window)) return TRUE; /* Calculate target_size - as the tile previews need this as well, we @@ -1391,8 +1392,8 @@ constrain_size_increments (MetaWindow *window, return TRUE; /* Determine whether constraint applies; exit if it doesn't */ - if (META_WINDOW_MAXIMIZED (window) || window->fullscreen || - META_WINDOW_TILED_SIDE_BY_SIDE (window) || + if (meta_window_is_maximized (window) || window->fullscreen || + meta_window_is_tiled_side_by_side (window) || info->action_type == ACTION_MOVE) return TRUE; @@ -1522,8 +1523,8 @@ constrain_aspect_ratio (MetaWindow *window, (double)window->size_hints.max_aspect.y; constraints_are_inconsistent = minr > maxr; if (constraints_are_inconsistent || - META_WINDOW_MAXIMIZED (window) || window->fullscreen || - META_WINDOW_TILED_SIDE_BY_SIDE (window) || + meta_window_is_maximized (window) || window->fullscreen || + meta_window_is_tiled_side_by_side (window) || info->action_type == ACTION_MOVE) return TRUE; diff --git a/src/core/keybindings.c b/src/core/keybindings.c index ba9a94aef..0baaa03af 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -2203,8 +2203,8 @@ handle_toggle_tiled (MetaDisplay *display, { MetaTileMode mode = binding->handler->data; - if ((META_WINDOW_TILED_LEFT (window) && mode == META_TILE_LEFT) || - (META_WINDOW_TILED_RIGHT (window) && mode == META_TILE_RIGHT)) + if ((meta_window_is_tiled_left (window) && mode == META_TILE_LEFT) || + (meta_window_is_tiled_right (window) && mode == META_TILE_RIGHT)) { meta_window_untile (window); } @@ -2229,7 +2229,7 @@ handle_toggle_maximized (MetaDisplay *display, MetaKeyBinding *binding, gpointer user_data) { - if (META_WINDOW_MAXIMIZED (window)) + if (meta_window_is_maximized (window)) meta_window_unmaximize (window, META_MAXIMIZE_BOTH); else if (window->has_maximize_func) meta_window_maximize (window, META_MAXIMIZE_BOTH); diff --git a/src/core/window-private.h b/src/core/window-private.h index 07fb4d68b..856ce53c1 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -630,29 +630,6 @@ struct _MetaWindowClass MtkRoundingStrategy rounding_strategy); }; -/* These differ from window->has_foo_func in that they consider - * the dynamic window state such as "maximized", not just the - * window's type - */ -#define META_WINDOW_MAXIMIZED(w) ((w)->maximized_horizontally && \ - (w)->maximized_vertically) -#define META_WINDOW_MAXIMIZED_VERTICALLY(w) ((w)->maximized_vertically) -#define META_WINDOW_MAXIMIZED_HORIZONTALLY(w) ((w)->maximized_horizontally) -#define META_WINDOW_TILED_SIDE_BY_SIDE(w) ((w)->maximized_vertically && \ - !(w)->maximized_horizontally && \ - (w)->tile_mode != META_TILE_NONE) -#define META_WINDOW_TILED_LEFT(w) (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \ - (w)->tile_mode == META_TILE_LEFT) -#define META_WINDOW_TILED_RIGHT(w) (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \ - (w)->tile_mode == META_TILE_RIGHT) -#define META_WINDOW_TILED_MAXIMIZED(w)(META_WINDOW_MAXIMIZED(w) && \ - (w)->tile_mode == META_TILE_MAXIMIZED) -#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) && !(w)->fullscreen) -#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))) - void meta_window_unmanage (MetaWindow *window, guint32 timestamp); void meta_window_queue (MetaWindow *window, @@ -909,3 +886,11 @@ void meta_window_protocol_to_stage_point (MetaWindow *window, int *stage_x, int *stage_y, MtkRoundingStrategy rounding_strategy); + +gboolean meta_window_is_maximized (MetaWindow *window); + +gboolean meta_window_is_tiled_side_by_side (MetaWindow *window); + +gboolean meta_window_is_tiled_left (MetaWindow *window); + +gboolean meta_window_is_tiled_right (MetaWindow *window); diff --git a/src/core/window.c b/src/core/window.c index b5193e0bf..8b66f7658 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -2695,7 +2695,7 @@ ensure_size_hints_satisfied (MtkRectangle *rect, static void meta_window_save_rect (MetaWindow *window) { - if (!(META_WINDOW_MAXIMIZED (window) || META_WINDOW_TILED_SIDE_BY_SIDE (window) || window->fullscreen)) + if (!(meta_window_is_maximized (window) || meta_window_is_tiled_side_by_side (window) || window->fullscreen)) { /* save size/pos as appropriate args for move_resize */ if (!window->maximized_horizontally) @@ -2837,6 +2837,18 @@ meta_window_get_maximized (MetaWindow *window) (window->maximized_vertically ? META_MAXIMIZE_VERTICAL : 0)); } +/** + * meta_window_is_maximized: + * @window: a #MetaWindow + * + * Return value: %TRUE if the window is maximized vertically and horizontally. + */ +gboolean +meta_window_is_maximized (MetaWindow *window) +{ + return (window->maximized_horizontally && window->maximized_vertically); +} + /** * meta_window_is_fullscreen: * @window: a #MetaWindow @@ -2937,7 +2949,7 @@ meta_window_get_tile_fraction (MetaWindow *window, *fraction = 1.; else if (tile_match) *fraction = 1. - tile_match->tile_hfraction; - else if (META_WINDOW_TILED_SIDE_BY_SIDE (window)) + else if (meta_window_is_tiled_side_by_side (window)) { if (window->tile_mode != tile_mode) *fraction = 1. - window->tile_hfraction; @@ -2957,7 +2969,7 @@ meta_window_update_tile_fraction (MetaWindow *window, MtkRectangle work_area; MetaWindowDrag *window_drag; - if (!META_WINDOW_TILED_SIDE_BY_SIDE (window)) + if (!meta_window_is_tiled_side_by_side (window)) return; meta_window_get_work_area_for_monitor (window, @@ -3031,6 +3043,28 @@ update_edge_constraints (MetaWindow *window) } } +gboolean +meta_window_is_tiled_side_by_side (MetaWindow *window) +{ + return window->maximized_vertically && + !window->maximized_horizontally && + window->tile_mode != META_TILE_NONE; +} + +gboolean +meta_window_is_tiled_left (MetaWindow *window) +{ + return window->tile_mode == META_TILE_LEFT && + meta_window_is_tiled_side_by_side (window); +} + +gboolean +meta_window_is_tiled_right (MetaWindow *window) +{ + return window->tile_mode == META_TILE_RIGHT && + meta_window_is_tiled_side_by_side (window); +} + void meta_window_untile (MetaWindow *window) { @@ -4269,7 +4303,7 @@ adjust_size_for_tile_match (MetaWindow *window, MtkRectangle work_area, rect; MetaWindow *tile_match = window->tile_match; - if (!META_WINDOW_TILED_SIDE_BY_SIDE (window) || !tile_match) + if (!meta_window_is_tiled_side_by_side (window) || !tile_match) return; meta_window_get_work_area_for_monitor (window, window->tile_monitor_number, &work_area); @@ -6077,7 +6111,7 @@ meta_window_get_default_layer (MetaWindow *window) { if (window->wm_state_below) return META_LAYER_BOTTOM; - else if (window->wm_state_above && !META_WINDOW_MAXIMIZED (window)) + else if (window->wm_state_above && !meta_window_is_maximized (window)) return META_LAYER_TOP; else if (window->type == META_WINDOW_DESKTOP) return META_LAYER_DESKTOP; @@ -7476,13 +7510,22 @@ meta_window_is_above (MetaWindow *window) gboolean meta_window_allows_move (MetaWindow *window) { - return META_WINDOW_ALLOWS_MOVE (window); + return window->has_move_func && !meta_window_is_fullscreen (window); } gboolean meta_window_allows_resize (MetaWindow *window) { - return META_WINDOW_ALLOWS_RESIZE (window); + gboolean allows_resize_except_hints, allows_resize; + + allows_resize_except_hints = window->has_resize_func && + !meta_window_is_maximized (window) && + !meta_window_is_fullscreen (window); + allows_resize = allows_resize_except_hints && + (window->size_hints.min_width < window->size_hints.max_width || + window->size_hints.min_height < window->size_hints.max_height); + + return allows_resize; } void diff --git a/src/wayland/meta-wayland-gtk-shell.c b/src/wayland/meta-wayland-gtk-shell.c index 9d38dd5cb..8a82d3507 100644 --- a/src/wayland/meta-wayland-gtk-shell.c +++ b/src/wayland/meta-wayland-gtk-shell.c @@ -261,7 +261,7 @@ gtk_surface_titlebar_gesture (struct wl_client *client, if (!window->has_maximize_func) break; - if (META_WINDOW_MAXIMIZED (window)) + if (meta_window_is_maximized (window)) meta_window_unmaximize (window, META_MAXIMIZE_BOTH); else meta_window_maximize (window, META_MAXIMIZE_BOTH); @@ -271,7 +271,7 @@ gtk_surface_titlebar_gesture (struct wl_client *client, if (!window->has_maximize_func) break; - if (META_WINDOW_MAXIMIZED_HORIZONTALLY (window)) + if (meta_window_get_maximized (window) & META_MAXIMIZE_HORIZONTAL) meta_window_unmaximize (window, META_MAXIMIZE_HORIZONTAL); else meta_window_maximize (window, META_MAXIMIZE_HORIZONTAL); @@ -281,7 +281,7 @@ gtk_surface_titlebar_gesture (struct wl_client *client, if (!window->has_maximize_func) break; - if (META_WINDOW_MAXIMIZED_VERTICALLY (window)) + if (meta_window_get_maximized (window) & META_MAXIMIZE_VERTICAL) meta_window_unmaximize (window, META_MAXIMIZE_VERTICAL); else meta_window_maximize (window, META_MAXIMIZE_VERTICAL); diff --git a/src/wayland/meta-wayland-xdg-shell.c b/src/wayland/meta-wayland-xdg-shell.c index fccd91a59..48f110b7c 100644 --- a/src/wayland/meta-wayland-xdg-shell.c +++ b/src/wayland/meta-wayland-xdg-shell.c @@ -722,7 +722,7 @@ fill_states (MetaWaylandXdgToplevel *xdg_toplevel, window_drag = meta_compositor_get_current_window_drag (window->display->compositor); - if (META_WINDOW_MAXIMIZED (window)) + if (meta_window_is_maximized (window)) add_state_value (states, XDG_TOPLEVEL_STATE_MAXIMIZED); if (meta_window_is_fullscreen (window)) add_state_value (states, XDG_TOPLEVEL_STATE_FULLSCREEN); diff --git a/src/wayland/meta-window-wayland.c b/src/wayland/meta-window-wayland.c index 1fd7a0752..48a6122a3 100644 --- a/src/wayland/meta-window-wayland.c +++ b/src/wayland/meta-window-wayland.c @@ -397,7 +397,7 @@ meta_window_wayland_move_resize_internal (MetaWindow *window, int bounds_height; if (!meta_wayland_surface_get_buffer (wl_window->surface) && - !META_WINDOW_MAXIMIZED (window) && + !meta_window_is_maximized (window) && window->tile_mode == META_TILE_NONE && !meta_window_is_fullscreen (window)) return; diff --git a/src/x11/session.c b/src/x11/session.c index 19c0a0236..fc720d9bc 100644 --- a/src/x11/session.c +++ b/src/x11/session.c @@ -1029,7 +1029,7 @@ save_state (MetaContext *context) fputs (" \n", outfile); /* Maximized */ - if (META_WINDOW_MAXIMIZED (window)) + if (meta_window_is_maximized (window)) { fprintf (outfile, " \n",