MetaFrame: Cache borders
Cache the computed border size so we can fetch the border size at any time without worrying that we'll be spending too much time in the theme code (in some cases we might allocate a PangoFontDescription or do other significant work.) The main effort here is clearing the cache when various bits of window state change that could potentially affect the computed borders. https://bugzilla.gnome.org/show_bug.cgi?id=707194
This commit is contained in:
parent
4ee9f3563b
commit
b4036e061a
@ -171,6 +171,7 @@ meta_core_queue_frame_resize (Display *xdisplay,
|
|||||||
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
||||||
|
|
||||||
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -4549,6 +4549,7 @@ meta_display_queue_retheme_all_windows (MetaDisplay *display)
|
|||||||
MetaWindow *window = tmp->data;
|
MetaWindow *window = tmp->data;
|
||||||
|
|
||||||
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
{
|
{
|
||||||
meta_frame_queue_draw (window->frame);
|
meta_frame_queue_draw (window->frame);
|
||||||
|
@ -68,6 +68,7 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
|
|
||||||
frame->mapped = FALSE;
|
frame->mapped = FALSE;
|
||||||
frame->is_flashing = FALSE;
|
frame->is_flashing = FALSE;
|
||||||
|
frame->borders_cached = FALSE;
|
||||||
|
|
||||||
meta_verbose ("Framing window %s: visual %s default, depth %d default depth %d\n",
|
meta_verbose ("Framing window %s: visual %s default, depth %d default depth %d\n",
|
||||||
window->desc,
|
window->desc,
|
||||||
@ -327,9 +328,23 @@ meta_frame_calc_borders (MetaFrame *frame,
|
|||||||
if (frame == NULL)
|
if (frame == NULL)
|
||||||
meta_frame_borders_clear (borders);
|
meta_frame_borders_clear (borders);
|
||||||
else
|
else
|
||||||
meta_ui_get_frame_borders (frame->window->screen->ui,
|
{
|
||||||
frame->xwindow,
|
if (!frame->borders_cached)
|
||||||
borders);
|
{
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -41,6 +41,8 @@ struct _MetaFrame
|
|||||||
*/
|
*/
|
||||||
MetaRectangle rect;
|
MetaRectangle rect;
|
||||||
|
|
||||||
|
MetaFrameBorders cached_borders; /* valid if borders_cached is set */
|
||||||
|
|
||||||
/* position of client, size of frame */
|
/* position of client, size of frame */
|
||||||
int child_x;
|
int child_x;
|
||||||
int child_y;
|
int child_y;
|
||||||
@ -50,6 +52,7 @@ struct _MetaFrame
|
|||||||
guint mapped : 1;
|
guint mapped : 1;
|
||||||
guint need_reapply_frame_shape : 1;
|
guint need_reapply_frame_shape : 1;
|
||||||
guint is_flashing : 1; /* used by the visual bell flash */
|
guint is_flashing : 1; /* used by the visual bell flash */
|
||||||
|
guint borders_cached : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
void meta_window_ensure_frame (MetaWindow *window);
|
void meta_window_ensure_frame (MetaWindow *window);
|
||||||
@ -68,6 +71,8 @@ gboolean meta_frame_sync_to_window (MetaFrame *frame,
|
|||||||
gboolean need_move,
|
gboolean need_move,
|
||||||
gboolean need_resize);
|
gboolean need_resize);
|
||||||
|
|
||||||
|
void meta_frame_clear_cached_borders (MetaFrame *frame);
|
||||||
|
|
||||||
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
|
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
|
||||||
|
|
||||||
void meta_frame_get_mask (MetaFrame *frame,
|
void meta_frame_get_mask (MetaFrame *frame,
|
||||||
|
@ -515,6 +515,7 @@ void meta_window_update_fullscreen_monitors (MetaWindow *window,
|
|||||||
unsigned long left,
|
unsigned long left,
|
||||||
unsigned long right);
|
unsigned long right);
|
||||||
|
|
||||||
|
|
||||||
/* args to move are window pos, not frame pos */
|
/* args to move are window pos, not frame pos */
|
||||||
void meta_window_move (MetaWindow *window,
|
void meta_window_move (MetaWindow *window,
|
||||||
gboolean user_op,
|
gboolean user_op,
|
||||||
@ -658,6 +659,8 @@ void meta_window_recalc_features (MetaWindow *window);
|
|||||||
|
|
||||||
void meta_window_recalc_window_type (MetaWindow *window);
|
void meta_window_recalc_window_type (MetaWindow *window);
|
||||||
|
|
||||||
|
void meta_window_frame_size_changed (MetaWindow *window);
|
||||||
|
|
||||||
void meta_window_stack_just_below (MetaWindow *window,
|
void meta_window_stack_just_below (MetaWindow *window,
|
||||||
MetaWindow *below_this_one);
|
MetaWindow *below_this_one);
|
||||||
|
|
||||||
|
@ -4074,6 +4074,7 @@ meta_window_set_above (MetaWindow *window,
|
|||||||
window->wm_state_above = new_value;
|
window->wm_state_above = new_value;
|
||||||
meta_window_update_layer (window);
|
meta_window_update_layer (window);
|
||||||
set_net_wm_state (window);
|
set_net_wm_state (window);
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
g_object_notify (G_OBJECT (window), "above");
|
g_object_notify (G_OBJECT (window), "above");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4213,6 +4214,7 @@ meta_window_shade (MetaWindow *window,
|
|||||||
window->shaded = TRUE;
|
window->shaded = TRUE;
|
||||||
|
|
||||||
meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING);
|
meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING);
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
|
|
||||||
/* After queuing the calc showing, since _focus flushes it,
|
/* After queuing the calc showing, since _focus flushes it,
|
||||||
* and we need to focus the frame
|
* and we need to focus the frame
|
||||||
@ -4238,6 +4240,7 @@ meta_window_unshade (MetaWindow *window,
|
|||||||
{
|
{
|
||||||
window->shaded = FALSE;
|
window->shaded = FALSE;
|
||||||
meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING);
|
meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING);
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
|
|
||||||
/* focus the window */
|
/* focus the window */
|
||||||
meta_topic (META_DEBUG_FOCUS,
|
meta_topic (META_DEBUG_FOCUS,
|
||||||
@ -6105,6 +6108,7 @@ window_stick_impl (MetaWindow *window)
|
|||||||
* toggled back off.
|
* toggled back off.
|
||||||
*/
|
*/
|
||||||
window->on_all_workspaces_requested = TRUE;
|
window->on_all_workspaces_requested = TRUE;
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
meta_window_update_on_all_workspaces (window);
|
meta_window_update_on_all_workspaces (window);
|
||||||
|
|
||||||
meta_window_queue(window, META_QUEUE_CALC_SHOWING);
|
meta_window_queue(window, META_QUEUE_CALC_SHOWING);
|
||||||
@ -6119,6 +6123,7 @@ window_unstick_impl (MetaWindow *window)
|
|||||||
/* Revert to window->workspaces */
|
/* Revert to window->workspaces */
|
||||||
|
|
||||||
window->on_all_workspaces_requested = FALSE;
|
window->on_all_workspaces_requested = FALSE;
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
meta_window_update_on_all_workspaces (window);
|
meta_window_update_on_all_workspaces (window);
|
||||||
|
|
||||||
/* We change ourselves to the active workspace, since otherwise you'd get
|
/* We change ourselves to the active workspace, since otherwise you'd get
|
||||||
@ -7194,6 +7199,7 @@ static void
|
|||||||
meta_window_appears_focused_changed (MetaWindow *window)
|
meta_window_appears_focused_changed (MetaWindow *window)
|
||||||
{
|
{
|
||||||
set_net_wm_state (window);
|
set_net_wm_state (window);
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (window), "appears-focused");
|
g_object_notify (G_OBJECT (window), "appears-focused");
|
||||||
|
|
||||||
@ -8366,6 +8372,13 @@ recalc_window_type (MetaWindow *window)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_frame_size_changed (MetaWindow *window)
|
||||||
|
{
|
||||||
|
if (window->frame)
|
||||||
|
meta_frame_clear_cached_borders (window->frame);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_allowed_actions_hint (MetaWindow *window)
|
set_allowed_actions_hint (MetaWindow *window)
|
||||||
{
|
{
|
||||||
@ -8664,6 +8677,8 @@ recalc_window_features (MetaWindow *window)
|
|||||||
if (window->has_resize_func != old_has_resize_func)
|
if (window->has_resize_func != old_has_resize_func)
|
||||||
g_object_notify (G_OBJECT (window), "resizeable");
|
g_object_notify (G_OBJECT (window), "resizeable");
|
||||||
|
|
||||||
|
meta_window_frame_size_changed (window);
|
||||||
|
|
||||||
/* FIXME perhaps should ensure if we don't have a shade func,
|
/* FIXME perhaps should ensure if we don't have a shade func,
|
||||||
* we aren't shaded, etc.
|
* we aren't shaded, etc.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user