window: Update the shape, input, and opaque regions immediately

... and individually. It turns out that updating the opaque region
was causing the shape region to be updated, which was causing a new
shape mask to be generated and uploaded to the GPU. Considering
GTK+ regenerates the opaque region on pretty much any focus change,
this is not good.
This commit is contained in:
Jasper St. Pierre 2014-02-26 19:42:31 -05:00
parent 41d5e69de5
commit c0d791cd6e
5 changed files with 41 additions and 10 deletions

View File

@ -917,7 +917,31 @@ is_grabbed_event (MetaDisplay *display,
}
void
meta_compositor_window_shape_changed (MetaCompositor *compositor,
meta_compositor_update_shape_region (MetaCompositor *compositor,
MetaWindow *window)
{
MetaWindowActor *window_actor;
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
if (!window_actor)
return;
meta_window_actor_update_shape_region (window_actor);
}
void
meta_compositor_update_input_region (MetaCompositor *compositor,
MetaWindow *window)
{
MetaWindowActor *window_actor;
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
if (!window_actor)
return;
meta_window_actor_update_input_region (window_actor);
}
void
meta_compositor_update_opaque_region (MetaCompositor *compositor,
MetaWindow *window)
{
MetaWindowActor *window_actor;
@ -925,7 +949,7 @@ meta_compositor_window_shape_changed (MetaCompositor *compositor,
if (!window_actor)
return;
meta_window_actor_update_shape (window_actor);
meta_window_actor_update_opaque_region (window_actor);
}
void

View File

@ -50,7 +50,6 @@ gboolean meta_window_actor_effect_in_progress (MetaWindowActor *self);
void meta_window_actor_sync_actor_geometry (MetaWindowActor *self,
gboolean did_placement);
void meta_window_actor_sync_visibility (MetaWindowActor *self);
void meta_window_actor_update_shape (MetaWindowActor *self);
void meta_window_actor_update_opacity (MetaWindowActor *self);
void meta_window_actor_mapped (MetaWindowActor *self);
void meta_window_actor_unmapped (MetaWindowActor *self);
@ -65,4 +64,8 @@ void meta_window_actor_effect_completed (MetaWindowActor *actor,
MetaSurfaceActor *meta_window_actor_get_surface (MetaWindowActor *self);
void meta_window_actor_update_surface (MetaWindowActor *self);
void meta_window_actor_update_shape_region (MetaWindowActor *self);
void meta_window_actor_update_input_region (MetaWindowActor *self);
void meta_window_actor_update_opaque_region (MetaWindowActor *self);
#endif /* META_WINDOW_ACTOR_PRIVATE_H */

View File

@ -1719,7 +1719,7 @@ build_and_scan_frame_mask (MetaWindowActor *self,
g_free (mask_data);
}
static void
void
meta_window_actor_update_shape_region (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;
@ -1756,7 +1756,7 @@ meta_window_actor_update_shape_region (MetaWindowActor *self)
meta_window_actor_invalidate_shadow (self);
}
static void
void
meta_window_actor_update_input_region (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;
@ -1800,7 +1800,7 @@ meta_window_actor_update_input_region (MetaWindowActor *self)
cairo_region_destroy (region);
}
static void
void
meta_window_actor_update_opaque_region (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;

View File

@ -261,7 +261,7 @@ meta_window_set_opaque_region (MetaWindow *window,
window->opaque_region = cairo_region_reference (region);
if (window->display->compositor)
meta_compositor_window_shape_changed (window->display->compositor, window);
meta_compositor_update_opaque_region (window->display->compositor, window);
}
void
@ -347,7 +347,7 @@ meta_window_set_input_region (MetaWindow *window,
window->input_region = cairo_region_reference (region);
if (window->display->compositor)
meta_compositor_window_shape_changed (window->display->compositor, window);
meta_compositor_update_input_region (window->display->compositor, window);
}
#if 0
@ -454,7 +454,7 @@ meta_window_set_shape_region (MetaWindow *window,
window->shape_region = cairo_region_reference (region);
if (window->display->compositor)
meta_compositor_window_shape_changed (window->display->compositor, window);
meta_compositor_update_shape_region (window->display->compositor, window);
}
void

View File

@ -62,7 +62,11 @@ void meta_compositor_manage_screen (MetaCompositor *compositor,
void meta_compositor_unmanage_screen (MetaCompositor *compositor,
MetaScreen *screen);
void meta_compositor_window_shape_changed (MetaCompositor *compositor,
void meta_compositor_update_shape_region (MetaCompositor *compositor,
MetaWindow *window);
void meta_compositor_update_input_region (MetaCompositor *compositor,
MetaWindow *window);
void meta_compositor_update_opaque_region (MetaCompositor *compositor,
MetaWindow *window);
void meta_compositor_window_opacity_changed (MetaCompositor *compositor,
MetaWindow *window);