summaryrefslogtreecommitdiff
path: root/src/core/frame.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/frame.c')
-rw-r--r--src/core/frame.c46
1 files changed, 38 insertions, 8 deletions
diff --git a/src/core/frame.c b/src/core/frame.c
index e1eec2a4..a8ba65c0 100644
--- a/src/core/frame.c
+++ b/src/core/frame.c
@@ -85,6 +85,7 @@ meta_window_ensure_frame (MetaWindow *window)
frame->mapped = FALSE;
frame->need_reapply_frame_shape = TRUE;
frame->is_flashing = FALSE;
+ frame->borders_cached = FALSE;
meta_verbose ("Frame geometry %d,%d %dx%d\n",
frame->rect.x, frame->rect.y,
@@ -302,22 +303,51 @@ meta_frame_get_flags (MetaFrame *frame)
return flags;
}
+static void
+clear_border (GtkBorder *border)
+{
+ border->left = 0;
+ border->right = 0;
+ border->top = 0;
+ border->bottom = 0;
+}
+
void
-meta_frame_borders_clear (MetaFrameBorders *self)
+meta_frame_borders_clear (MetaFrameBorders *borders)
{
- self->visible.top = self->invisible.top = self->total.top = 0;
- self->visible.bottom = self->invisible.bottom = self->total.bottom = 0;
- self->visible.left = self->invisible.left = self->total.left = 0;
- self->visible.right = self->invisible.right = self->total.right = 0;
+ clear_border (&borders->visible);
+ clear_border (&borders->shadow);
+ clear_border (&borders->resize);
+ clear_border (&borders->invisible);
+ clear_border (&borders->total);
}
void
meta_frame_calc_borders (MetaFrame *frame,
MetaFrameBorders *borders)
{
- meta_ui_get_frame_borders (frame->window->screen->ui,
- frame->xwindow,
- borders);
+ if (frame == NULL)
+ {
+ meta_frame_borders_clear (borders);
+ }
+ else
+ {
+ if (!frame->borders_cached)
+ {
+ meta_ui_get_frame_borders (frame->window->screen->ui,
+ frame->xwindow,
+ &frame->cached_borders);
+ frame->borders_cached = TRUE;
+ }
+
+ *borders = frame->cached_borders;
+ }
+}
+
+void
+meta_frame_clear_cached_borders (MetaFrame *frame)
+{
+ frame->borders_cached = FALSE;
}
static gboolean