437 lines
18 KiB
Diff
437 lines
18 KiB
Diff
From c28f4e53b548b8094ddb83e6e69be835d6133e49 Mon Sep 17 00:00:00 2001
|
|
From: Bilal Elmoussaoui <belmouss@redhat.com>
|
|
Date: Mon, 28 Oct 2024 09:44:40 +0100
|
|
Subject: [PATCH 01/10] window: Replace barely used macros with func
|
|
equivalents
|
|
|
|
To avoid mostly going through struct fields in macros as we might soon
|
|
move those first to a WindowConfiguration & maybe even make the window
|
|
struct private with time.
|
|
|
|
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4111>
|
|
(cherry picked from commit 8e5433d82a3f737374316fef9ea76d60f1125752)
|
|
---
|
|
src/compositor/edge-resistance.c | 4 +-
|
|
src/compositor/meta-window-drag.c | 19 +++++-----
|
|
src/core/constraints.c | 17 +++++----
|
|
src/core/keybindings.c | 6 +--
|
|
src/core/window-private.h | 31 ++++-----------
|
|
src/core/window.c | 57 ++++++++++++++++++++++++----
|
|
src/wayland/meta-wayland-gtk-shell.c | 6 +--
|
|
src/wayland/meta-wayland-xdg-shell.c | 2 +-
|
|
src/wayland/meta-window-wayland.c | 2 +-
|
|
src/x11/session.c | 2 +-
|
|
10 files changed, 88 insertions(+), 58 deletions(-)
|
|
|
|
diff --git a/src/compositor/edge-resistance.c b/src/compositor/edge-resistance.c
|
|
index 36b448f9ca..f5386e5de5 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 786bfda0f1..2638da59d3 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 4017ecbe07..6f20d087e2 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 1304531ef5..41559c9719 100644
|
|
--- a/src/core/keybindings.c
|
|
+++ b/src/core/keybindings.c
|
|
@@ -2198,8 +2198,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);
|
|
}
|
|
@@ -2224,7 +2224,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 07fb4d68b5..856ce53c17 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 5af39137cb..b1d6426987 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 9d38dd5cb0..8a82d3507a 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 fccd91a593..48f110b7c3 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 1fd7a0752b..48a6122a30 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 19c0a0236a..fc720d9bc7 100644
|
|
--- a/src/x11/session.c
|
|
+++ b/src/x11/session.c
|
|
@@ -1029,7 +1029,7 @@ save_state (MetaContext *context)
|
|
fputs (" <minimized/>\n", outfile);
|
|
|
|
/* Maximized */
|
|
- if (META_WINDOW_MAXIMIZED (window))
|
|
+ if (meta_window_is_maximized (window))
|
|
{
|
|
fprintf (outfile,
|
|
" <maximized saved_x=\"%d\" saved_y=\"%d\" saved_width=\"%d\" saved_height=\"%d\"/>\n",
|
|
--
|
|
2.49.0
|
|
|