summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper St. Pierre <jstpierre@mecheye.net>2014-02-26 19:42:31 -0500
committerJasper St. Pierre <jstpierre@mecheye.net>2014-02-26 19:43:57 -0500
commit64a82c8d7703186b8004d73299b4425545cab990 (patch)
tree76f0ffeb6d1e751cde1b11d1269ab9cb3caaecfd
parent29edefdfc5ca7ef9bb913af5df0b8150bc938ca4 (diff)
downloadmutter-64a82c8d7703186b8004d73299b4425545cab990.tar.gz
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.
-rw-r--r--src/compositor/compositor.c28
-rw-r--r--src/compositor/meta-window-actor-private.h5
-rw-r--r--src/compositor/meta-window-actor.c6
-rw-r--r--src/core/window.c6
-rw-r--r--src/meta/compositor.h6
5 files changed, 41 insertions, 10 deletions
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 51e27f3b6..f955ceea0 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -823,7 +823,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;
@@ -831,7 +855,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
diff --git a/src/compositor/meta-window-actor-private.h b/src/compositor/meta-window-actor-private.h
index 75a19e1a3..7d2a10f25 100644
--- a/src/compositor/meta-window-actor-private.h
+++ b/src/compositor/meta-window-actor-private.h
@@ -46,7 +46,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);
@@ -58,4 +57,8 @@ void meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
void meta_window_actor_effect_completed (MetaWindowActor *actor,
gulong event);
+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 */
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index 7ab4de479..63658b144 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -1973,7 +1973,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;
@@ -2011,7 +2011,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;
@@ -2049,7 +2049,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;
diff --git a/src/core/window.c b/src/core/window.c
index 115a93de9..5e47bd3ee 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -7677,7 +7677,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
@@ -7763,7 +7763,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
@@ -7848,7 +7848,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);
}
void
diff --git a/src/meta/compositor.h b/src/meta/compositor.h
index d1be47e36..eb5372dfb 100644
--- a/src/meta/compositor.h
+++ b/src/meta/compositor.h
@@ -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);