diff options
-rw-r--r-- | src/core/atomnames.h | 2 | ||||
-rw-r--r-- | src/core/window-private.h | 3 | ||||
-rw-r--r-- | src/core/window-props.c | 56 | ||||
-rw-r--r-- | src/core/window.c | 13 |
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 |