summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/atomnames.h2
-rw-r--r--src/core/window-private.h3
-rw-r--r--src/core/window-props.c56
-rw-r--r--src/core/window.c13
4 files changed, 71 insertions, 3 deletions
diff --git a/src/core/atomnames.h b/src/core/atomnames.h
index 20edcd2b..2775d3db 100644
--- a/src/core/atomnames.h
+++ b/src/core/atomnames.h
@@ -58,6 +58,7 @@ item(_MARCO_RESTART_MESSAGE)
item(_MARCO_RELOAD_THEME_MESSAGE)
item(_MARCO_SET_KEYBINDINGS_MESSAGE)
item(_MARCO_TOGGLE_VERBOSE)
+item(_GTK_FRAME_EXTENTS)
item(_MATE_PANEL_ACTION)
item(_MATE_PANEL_ACTION_MAIN_MENU)
item(_MATE_PANEL_ACTION_RUN_DIALOG)
@@ -70,7 +71,6 @@ item(MULTIPLE)
item(TIMESTAMP)
item(VERSION)
item(ATOM_PAIR)
-item(_GTK_FRAME_EXTENTS)
/* Oddities: These are used, and we need atoms for them,
* but when we need all _NET_WM hints (i.e. when we're making
diff --git a/src/core/window-private.h b/src/core/window-private.h
index 65359e15..e81fd7ac 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -355,6 +355,9 @@ struct _MetaWindow
*/
MetaRectangle rect;
+ gboolean has_custom_frame_extents;
+ GtkBorder custom_frame_extents;
+
/* The geometry to restore when we unmaximize. The position is in
* root window coords, even if there's a frame, which contrasts with
* window->rect above. Note that this gives the position and size
diff --git a/src/core/window-props.c b/src/core/window-props.c
index 3e870bc6..9aab46ea 100644
--- a/src/core/window-props.c
+++ b/src/core/window-props.c
@@ -215,12 +215,66 @@ reload_kwm_win_icon (MetaWindow *window,
reload_icon (window, window->display->atom__KWM_WIN_ICON);
}
+static gboolean
+gtk_border_equal (GtkBorder *a,
+ GtkBorder *b)
+{
+ return (a->left == b->left &&
+ a->right == b->right &&
+ a->top == b->top &&
+ a->bottom == b->bottom);
+}
+
+static void
+meta_window_set_custom_frame_extents (MetaWindow *window,
+ GtkBorder *extents)
+{
+ if (extents)
+ {
+ if (window->has_custom_frame_extents && gtk_border_equal (&window->custom_frame_extents, extents))
+ return;
+
+ window->has_custom_frame_extents = TRUE;
+ window->custom_frame_extents = *extents;
+ }
+ else
+ {
+ if (!window->has_custom_frame_extents)
+ return;
+
+ window->has_custom_frame_extents = FALSE;
+ memset (&window->custom_frame_extents, 0, sizeof (window->custom_frame_extents));
+ }
+
+ meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
+}
+
static void
reload_gtk_frame_extents (MetaWindow *window,
MetaPropValue *value,
gboolean initial)
{
- return;
+ if (value->type != META_PROP_VALUE_INVALID)
+ {
+ if (value->v.cardinal_list.n_cardinals != 4)
+ {
+ meta_verbose ("_GTK_FRAME_EXTENTS on %s has %d values instead of 4\n",
+ window->desc, value->v.cardinal_list.n_cardinals);
+ }
+ else
+ {
+ GtkBorder extents;
+ extents.left = (int)value->v.cardinal_list.cardinals[0];
+ extents.right = (int)value->v.cardinal_list.cardinals[1];
+ extents.top = (int)value->v.cardinal_list.cardinals[2];
+ extents.bottom = (int)value->v.cardinal_list.cardinals[3];
+ meta_window_set_custom_frame_extents (window, &extents);
+ }
+ }
+ else
+ {
+ meta_window_set_custom_frame_extents (window, NULL);
+ }
}
static void
diff --git a/src/core/window.c b/src/core/window.c
index 694ba99e..75923e29 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -4042,7 +4042,18 @@ meta_window_get_outer_rect (const MetaWindow *window,
if (window->frame)
*rect = window->frame->rect;
else
- *rect = window->rect;
+ {
+ *rect = window->rect;
+
+ if (window->has_custom_frame_extents)
+ {
+ const GtkBorder *extents = &window->custom_frame_extents;
+ rect->x += extents->left;
+ rect->y += extents->top;
+ rect->width -= extents->left + extents->right;
+ rect->height -= extents->top + extents->bottom;
+ }
+ }
}
void