[mutter/wayland] Stop passing around MetaFrameBorders
- From: Owen Taylor <otaylor src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wayland] Stop passing around MetaFrameBorders
- Date: Tue, 19 Nov 2013 19:04:41 +0000 (UTC)
commit 097ee776c7073c7e5dc9e23666f24f894716177f
Author: Owen W. Taylor <otaylor fishsoup net>
Date: Fri Nov 15 18:03:50 2013 -0500
Stop passing around MetaFrameBorders
Instead of passing around MetaFrameBorders, compute it when we need it.
This also allows us to know that we are using MetaFrameBorders only for windows
with frames (where it is meaningful) and not for frameless windows, which
can have custom borders which we need to interpret differently.
https://bugzilla.gnome.org/show_bug.cgi?id=707194
src/core/constraints.c | 89 ++++++++++++++---------------------------------
src/core/constraints.h | 1 -
src/core/place.c | 35 +++++++------------
src/core/place.h | 1 -
src/core/window.c | 17 ++++++---
5 files changed, 52 insertions(+), 91 deletions(-)
---
diff --git a/src/core/constraints.c b/src/core/constraints.c
index a60595f..97e1e79 100644
--- a/src/core/constraints.c
+++ b/src/core/constraints.c
@@ -118,8 +118,6 @@ typedef struct
{
MetaRectangle orig;
MetaRectangle current;
- MetaFrameBorders *borders;
- gboolean must_free_borders;
ActionType action_type;
gboolean is_user_action;
@@ -195,7 +193,6 @@ static gboolean constrain_partially_onscreen (MetaWindow *window,
static void setup_constraint_info (ConstraintInfo *info,
MetaWindow *window,
- MetaFrameBorders *orig_borders,
MetaMoveResizeFlags flags,
int resize_gravity,
const MetaRectangle *orig,
@@ -208,9 +205,8 @@ static void extend_by_frame (MetaWindow *window,
MetaRectangle *rect);
static void unextend_by_frame (MetaWindow *window,
MetaRectangle *rect);
-static inline void get_size_limits (const MetaWindow *window,
- const MetaFrameBorders *borders,
- gboolean include_frame,
+static inline void get_size_limits (MetaWindow *window,
+ gboolean include_frame,
MetaRectangle *min_size,
MetaRectangle *max_size);
@@ -280,7 +276,6 @@ do_all_constraints (MetaWindow *window,
void
meta_window_constrain (MetaWindow *window,
- MetaFrameBorders *orig_borders,
MetaMoveResizeFlags flags,
int resize_gravity,
const MetaRectangle *orig,
@@ -303,7 +298,6 @@ meta_window_constrain (MetaWindow *window,
setup_constraint_info (&info,
window,
- orig_borders,
flags,
resize_gravity,
orig,
@@ -333,19 +327,11 @@ meta_window_constrain (MetaWindow *window,
* if this was a user move or user move-and-resize operation.
*/
update_onscreen_requirements (window, &info);
-
- /* Ew, what an ugly way to do things. Destructors (in a real OOP language,
- * not gobject-style--gobject would be more pain than it's worth) or
- * smart pointers would be so much nicer here. *shrug*
- */
- if (info.must_free_borders)
- g_free (info.borders);
}
static void
setup_constraint_info (ConstraintInfo *info,
MetaWindow *window,
- MetaFrameBorders *orig_borders,
MetaMoveResizeFlags flags,
int resize_gravity,
const MetaRectangle *orig,
@@ -357,18 +343,6 @@ setup_constraint_info (ConstraintInfo *info,
info->orig = *orig;
info->current = *new;
- /* Create a fake frame geometry if none really exists */
- if (orig_borders && !window->fullscreen)
- {
- info->borders = orig_borders;
- info->must_free_borders = FALSE;
- }
- else
- {
- info->borders = g_new0 (MetaFrameBorders, 1);
- info->must_free_borders = TRUE;
- }
-
if (flags & META_IS_MOVE_ACTION && flags & META_IS_RESIZE_ACTION)
info->action_type = ACTION_MOVE_AND_RESIZE;
else if (flags & META_IS_RESIZE_ACTION)
@@ -524,7 +498,7 @@ place_window_if_needed(MetaWindow *window,
const MetaMonitorInfo *monitor_info;
meta_window_get_outer_rect (window, &placed_rect);
- meta_window_place (window, info->borders, info->orig.x, info->orig.y,
+ meta_window_place (window, info->orig.x, info->orig.y,
&placed_rect.x, &placed_rect.y);
did_placement = TRUE;
@@ -588,10 +562,6 @@ place_window_if_needed(MetaWindow *window,
(window->maximize_vertically_after_placement ?
META_MAXIMIZE_VERTICAL : 0), &info->current);
- /* maximization may have changed frame geometry */
- if (!window->fullscreen)
- meta_frame_calc_borders (window->frame, info->borders);
-
if (window->fullscreen_after_placement)
{
window->saved_rect = info->current;
@@ -684,10 +654,13 @@ update_onscreen_requirements (MetaWindow *window,
*/
if (window->frame && window->decorated)
{
+ MetaFrameBorders borders;
MetaRectangle titlebar_rect;
+ meta_frame_calc_borders (window->frame, &borders);
+
titlebar_rect = info->current;
- titlebar_rect.height = info->borders->visible.top;
+ titlebar_rect.height = borders.visible.top;
old = window->require_titlebar_visible;
window->require_titlebar_visible =
meta_rectangle_overlaps_with_region (info->usable_screen_region,
@@ -718,15 +691,15 @@ unextend_by_frame (MetaWindow *window,
}
static inline void
-get_size_limits (const MetaWindow *window,
- const MetaFrameBorders *borders,
- gboolean include_frame,
+get_size_limits (MetaWindow *window,
+ gboolean include_frame,
MetaRectangle *min_size,
MetaRectangle *max_size)
{
/* We pack the results into MetaRectangle structs just for convienience; we
* don't actually use the position of those rects.
*/
+ min_size->x = min_size->y = max_size->x = max_size->y = 0;
min_size->width = window->size_hints.min_width;
min_size->height = window->size_hints.min_height;
max_size->width = window->size_hints.max_width;
@@ -734,22 +707,8 @@ get_size_limits (const MetaWindow *window,
if (include_frame)
{
- int fw = borders->visible.left + borders->visible.right;
- int fh = borders->visible.top + borders->visible.bottom;
-
- min_size->width += fw;
- min_size->height += fh;
- /* Do check to avoid overflow (e.g. max_size->width & max_size->height
- * may be set to G_MAXINT by meta_set_normal_hints()).
- */
- if (max_size->width < (G_MAXINT - fw))
- max_size->width += fw;
- else
- max_size->width = G_MAXINT;
- if (max_size->height < (G_MAXINT - fh))
- max_size->height += fh;
- else
- max_size->height = G_MAXINT;
+ meta_window_client_rect_to_outer_rect (window, min_size, min_size);
+ meta_window_client_rect_to_outer_rect (window, max_size, max_size);
}
}
@@ -859,7 +818,7 @@ constrain_maximization (MetaWindow *window,
/* Check min size constraints; max size constraints are ignored for maximized
* windows, as per bug 327543.
*/
- get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
+ get_size_limits (window, FALSE, &min_size, &max_size);
hminbad = target_size.width < min_size.width && window->maximized_horizontally;
vminbad = target_size.height < min_size.height && window->maximized_vertically;
if (hminbad || vminbad)
@@ -918,7 +877,7 @@ constrain_tiling (MetaWindow *window,
/* Check min size constraints; max size constraints are ignored as for
* maximized windows.
*/
- get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
+ get_size_limits (window, FALSE, &min_size, &max_size);
hminbad = target_size.width < min_size.width;
vminbad = target_size.height < min_size.height;
if (hminbad || vminbad)
@@ -961,7 +920,7 @@ constrain_fullscreen (MetaWindow *window,
monitor = info->entire_monitor;
- get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
+ get_size_limits (window, FALSE, &min_size, &max_size);
too_big = !meta_rectangle_could_fit_rect (&monitor, &min_size);
too_small = !meta_rectangle_could_fit_rect (&max_size, &monitor);
if (too_big || too_small)
@@ -1070,7 +1029,7 @@ constrain_size_limits (MetaWindow *window,
return TRUE;
/* Determine whether constraint is already satisfied; exit if it is */
- get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
+ get_size_limits (window, FALSE, &min_size, &max_size);
/* We ignore max-size limits for maximized windows; see #327543 */
if (window->maximized_horizontally)
max_size.width = MAX (max_size.width, info->current.width);
@@ -1262,7 +1221,7 @@ do_screen_and_monitor_relative_constraints (
/* Determine whether constraint applies; exit if it doesn't */
how_far_it_can_be_smushed = info->current;
- get_size_limits (window, info->borders, TRUE, &min_size, &max_size);
+ get_size_limits (window, TRUE, &min_size, &max_size);
extend_by_frame (window, &info->current);
if (info->action_type != ACTION_MOVE)
@@ -1420,8 +1379,11 @@ constrain_titlebar_visible (MetaWindow *window,
*/
if (window->frame)
{
- bottom_amount = info->current.height + info->borders->visible.bottom;
- vert_amount_onscreen = info->borders->visible.top;
+ MetaFrameBorders borders;
+ meta_frame_calc_borders (window->frame, &borders);
+
+ bottom_amount = info->current.height + borders.visible.bottom;
+ vert_amount_onscreen = borders.visible.top;
}
else
bottom_amount = vert_amount_offscreen;
@@ -1495,8 +1457,11 @@ constrain_partially_onscreen (MetaWindow *window,
*/
if (window->frame)
{
- bottom_amount = info->current.height + info->borders->visible.bottom;
- vert_amount_onscreen = info->borders->visible.top;
+ MetaFrameBorders borders;
+ meta_frame_calc_borders (window->frame, &borders);
+
+ bottom_amount = info->current.height + borders.visible.bottom;
+ vert_amount_onscreen = borders.visible.top;
}
else
bottom_amount = vert_amount_offscreen;
diff --git a/src/core/constraints.h b/src/core/constraints.h
index 0bea43d..07c6529 100644
--- a/src/core/constraints.h
+++ b/src/core/constraints.h
@@ -40,7 +40,6 @@ typedef enum
} MetaMoveResizeFlags;
void meta_window_constrain (MetaWindow *window,
- MetaFrameBorders *orig_borders,
MetaMoveResizeFlags flags,
int resize_gravity,
const MetaRectangle *orig,
diff --git a/src/core/place.c b/src/core/place.c
index 7835dee..a2c7df3 100644
--- a/src/core/place.c
+++ b/src/core/place.c
@@ -74,7 +74,6 @@ northwestcmp (gconstpointer a, gconstpointer b)
static void
find_next_cascade (MetaWindow *window,
- MetaFrameBorders *borders,
/* visible windows on relevant workspaces */
GList *windows,
int x,
@@ -105,10 +104,13 @@ find_next_cascade (MetaWindow *window,
* manually cascade.
*/
#define CASCADE_FUZZ 15
- if (borders)
+ if (window->frame)
{
- x_threshold = MAX (borders->visible.left, CASCADE_FUZZ);
- y_threshold = MAX (borders->visible.top, CASCADE_FUZZ);
+ MetaFrameBorders borders;
+
+ meta_frame_calc_borders (window->frame, &borders);
+ x_threshold = MAX (borders.visible.left, CASCADE_FUZZ);
+ y_threshold = MAX (borders.visible.top, CASCADE_FUZZ);
}
else
{
@@ -209,7 +211,6 @@ find_next_cascade (MetaWindow *window,
static void
find_most_freespace (MetaWindow *window,
- MetaFrameBorders *borders,
/* visible windows on relevant workspaces */
MetaWindow *focus_window,
int x,
@@ -321,7 +322,6 @@ window_overlaps_focus_window (MetaWindow *window)
static void
avoid_being_obscured_as_second_modal_dialog (MetaWindow *window,
- MetaFrameBorders *borders,
int *x,
int *y)
{
@@ -350,7 +350,7 @@ avoid_being_obscured_as_second_modal_dialog (MetaWindow *window,
meta_window_same_application (window, focus_window) &&
window_overlaps_focus_window (window))
{
- find_most_freespace (window, borders, focus_window, *x, *y, x, y);
+ find_most_freespace (window, focus_window, *x, *y, x, y);
meta_topic (META_DEBUG_PLACEMENT,
"Dialog window %s was denied focus but may be modal "
"to the focus window; had to move it to avoid the "
@@ -478,7 +478,6 @@ center_tile_rect_in_area (MetaRectangle *rect,
*/
static gboolean
find_first_fit (MetaWindow *window,
- MetaFrameBorders *borders,
/* visible windows on relevant workspaces */
GList *windows,
int monitor,
@@ -602,7 +601,6 @@ find_first_fit (MetaWindow *window,
void
meta_window_place (MetaWindow *window,
- MetaFrameBorders *borders,
int x,
int y,
int *new_x,
@@ -611,13 +609,6 @@ meta_window_place (MetaWindow *window,
GList *windows;
const MetaMonitorInfo *xi;
- /* frame member variables should NEVER be used in here, only
- * MetaFrameBorders. But remember borders == NULL
- * for undecorated windows. Also, this function should
- * NEVER have side effects other than computing the
- * placement coordinates.
- */
-
meta_topic (META_DEBUG_PLACEMENT, "Placing window %s\n", window->desc);
windows = NULL;
@@ -706,7 +697,7 @@ meta_window_place (MetaWindow *window,
{
meta_topic (META_DEBUG_PLACEMENT,
"Not placing window with PPosition or USPosition set\n");
- avoid_being_obscured_as_second_modal_dialog (window, borders, &x, &y);
+ avoid_being_obscured_as_second_modal_dialog (window, &x, &y);
goto done_no_constraints;
}
}
@@ -745,7 +736,7 @@ meta_window_place (MetaWindow *window,
meta_topic (META_DEBUG_PLACEMENT, "Centered window %s over transient parent\n",
window->desc);
- avoid_being_obscured_as_second_modal_dialog (window, borders, &x, &y);
+ avoid_being_obscured_as_second_modal_dialog (window, &x, &y);
goto done;
}
@@ -816,7 +807,7 @@ meta_window_place (MetaWindow *window,
x = xi->rect.x;
y = xi->rect.y;
- if (find_first_fit (window, borders, windows,
+ if (find_first_fit (window, windows,
xi->number,
x, y, &x, &y))
goto done_check_denied_focus;
@@ -850,7 +841,7 @@ meta_window_place (MetaWindow *window,
* fully overlapping window (e.g. starting multiple terminals)
* */
if (x == xi->rect.x && y == xi->rect.y)
- find_next_cascade (window, borders, windows, x, y, &x, &y);
+ find_next_cascade (window, windows, x, y, &x, &y);
done_check_denied_focus:
/* If the window is being denied focus and isn't a transient of the
@@ -881,7 +872,7 @@ meta_window_place (MetaWindow *window,
x = xi->rect.x;
y = xi->rect.y;
- found_fit = find_first_fit (window, borders, focus_window_list,
+ found_fit = find_first_fit (window, focus_window_list,
xi->number,
x, y, &x, &y);
g_list_free (focus_window_list);
@@ -891,7 +882,7 @@ meta_window_place (MetaWindow *window,
* as possible.
*/
if (!found_fit)
- find_most_freespace (window, borders, focus_window, x, y, &x, &y);
+ find_most_freespace (window, focus_window, x, y, &x, &y);
}
done:
diff --git a/src/core/place.h b/src/core/place.h
index 7a8c126..d9647e2 100644
--- a/src/core/place.h
+++ b/src/core/place.h
@@ -28,7 +28,6 @@
#include "frame.h"
void meta_window_place (MetaWindow *window,
- MetaFrameBorders *borders,
int x,
int y,
int *new_x,
diff --git a/src/core/window.c b/src/core/window.c
index f7b6284..e98aa84 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -5118,7 +5118,6 @@ meta_window_move_resize_internal (MetaWindow *window,
if (flags & (META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION))
{
meta_window_constrain (window,
- window->frame ? &borders : NULL,
flags,
gravity,
&old_rect,
@@ -6056,6 +6055,10 @@ meta_window_client_rect_to_frame_rect (MetaWindow *window,
*client_rect = *frame_rect;
+ /* The support for G_MAXINT here to mean infinity is a convenience for
+ * constraints.c:get_size_limits() and not something that we provide
+ * in other locations or document.
+ */
if (window->frame)
{
MetaFrameBorders borders;
@@ -6063,8 +6066,10 @@ meta_window_client_rect_to_frame_rect (MetaWindow *window,
client_rect->x -= borders.visible.left;
client_rect->y -= borders.visible.top;
- client_rect->width += borders.visible.left + borders.visible.right;
- client_rect->height += borders.visible.top + borders.visible.bottom;
+ if (client_rect->width != G_MAXINT)
+ client_rect->width += borders.visible.left + borders.visible.right;
+ if (client_rect->height != G_MAXINT)
+ client_rect->height += borders.visible.top + borders.visible.bottom;
}
else
{
@@ -6073,8 +6078,10 @@ meta_window_client_rect_to_frame_rect (MetaWindow *window,
const GtkBorder *extents = &window->custom_frame_extents;
client_rect->x += extents->left;
client_rect->y += extents->top;
- client_rect->width -= extents->left + extents->right;
- client_rect->height -= extents->top + extents->bottom;
+ if (client_rect->width != G_MAXINT)
+ client_rect->width -= extents->left + extents->right;
+ if (client_rect->height != G_MAXINT)
+ client_rect->height -= extents->top + extents->bottom;
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]