[metacity] compositor-xrender: simplify shadow handling
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [metacity] compositor-xrender: simplify shadow handling
- Date: Sun, 20 Oct 2019 12:28:48 +0000 (UTC)
commit ffc6af9d31c70de0e5961e5854fbbcf1185a7da7
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Sat Oct 19 19:50:07 2019 +0300
compositor-xrender: simplify shadow handling
src/compositor/meta-compositor-xrender.c | 190 ++++++++++---------------------
1 file changed, 58 insertions(+), 132 deletions(-)
---
diff --git a/src/compositor/meta-compositor-xrender.c b/src/compositor/meta-compositor-xrender.c
index 009a93e8..a841ccdd 100644
--- a/src/compositor/meta-compositor-xrender.c
+++ b/src/compositor/meta-compositor-xrender.c
@@ -102,6 +102,8 @@ typedef struct _MetaCompWindow
int shadow_dy;
int shadow_width;
int shadow_height;
+
+ gboolean shadow_changed;
} MetaCompWindow;
struct _MetaCompositorXRender
@@ -920,6 +922,32 @@ window_has_shadow (MetaCompositorXRender *xrender,
return FALSE;
}
+static void
+shadow_changed (MetaCompositorXRender *xrender,
+ MetaCompWindow *cw)
+{
+ MetaCompositor *compositor;
+
+ compositor = META_COMPOSITOR (xrender);
+
+ if (cw->extents != None)
+ {
+ meta_compositor_add_damage (compositor, "shadow_changed", cw->extents);
+ XFixesDestroyRegion (xrender->xdisplay, cw->extents);
+ cw->extents = None;
+ }
+
+ if (cw->shadow != None)
+ {
+ XRenderFreePicture (xrender->xdisplay, cw->shadow);
+ cw->shadow = None;
+ }
+
+ meta_compositor_queue_redraw (compositor);
+
+ cw->shadow_changed = TRUE;
+}
+
static XserverRegion
win_extents (MetaCompositorXRender *xrender,
MetaCompWindow *cw)
@@ -1211,38 +1239,14 @@ notify_appears_focused_cb (MetaWindow *window,
GParamSpec *pspec,
MetaCompositorXRender *xrender)
{
- MetaCompositor *compositor;
MetaCompWindow *cw;
- Display *xdisplay;
- compositor = META_COMPOSITOR (xrender);
cw = find_comp_window_by_window (xrender, window);
if (cw == NULL)
return;
- xdisplay = window->display->xdisplay;
-
- if (meta_window_appears_focused (window))
- cw->shadow_type = META_SHADOW_LARGE;
- else
- cw->shadow_type = META_SHADOW_MEDIUM;
-
- if (cw->shadow)
- {
- XRenderFreePicture (xdisplay, cw->shadow);
- cw->shadow = None;
- }
-
- if (cw->extents)
- {
- meta_compositor_add_damage (compositor,
- "notify_appears_focused_cb",
- cw->extents);
-
- XFixesDestroyRegion (xdisplay, cw->extents);
- cw->extents = None;
- }
+ shadow_changed (xrender, cw);
}
static void
@@ -1250,32 +1254,15 @@ notify_decorated_cb (MetaWindow *window,
GParamSpec *pspec,
MetaCompositorXRender *xrender)
{
- MetaCompositor *compositor;
MetaCompWindow *cw;
- compositor = META_COMPOSITOR (xrender);
cw = find_comp_window_by_window (xrender, window);
if (cw == NULL)
return;
- if (cw->extents != None)
- {
- meta_compositor_add_damage (compositor, "notify_decorated_cb", cw->extents);
- XFixesDestroyRegion (xrender->xdisplay, cw->extents);
- cw->extents = None;
- }
-
- if (cw->shadow != None)
- {
- XRenderFreePicture (xrender->xdisplay, cw->shadow);
- cw->shadow = None;
- }
-
determine_mode (xrender, cw);
- cw->needs_shadow = window_has_shadow (xrender, cw);
-
- meta_compositor_queue_redraw (compositor);
+ shadow_changed (xrender, cw);
}
static void
@@ -1283,31 +1270,14 @@ notify_window_type_cb (MetaWindow *window,
GParamSpec *pspec,
MetaCompositorXRender *xrender)
{
- MetaCompositor *compositor;
MetaCompWindow *cw;
- compositor = META_COMPOSITOR (xrender);
cw = find_comp_window_by_window (xrender, window);
if (cw == NULL)
return;
- if (cw->extents != None)
- {
- meta_compositor_add_damage (compositor, "notify_window_type_cb", cw->extents);
- XFixesDestroyRegion (xrender->xdisplay, cw->extents);
- cw->extents = None;
- }
-
- if (cw->shadow != None)
- {
- XRenderFreePicture (xrender->xdisplay, cw->shadow);
- cw->shadow = None;
- }
-
- cw->needs_shadow = window_has_shadow (xrender, cw);
-
- meta_compositor_queue_redraw (compositor);
+ shadow_changed (xrender, cw);
}
/* event processors must all be called with an error trap in place */
@@ -1407,13 +1377,7 @@ update_shadows (MetaPreference pref,
surface = META_SURFACE (index->data);
cw = g_object_get_data (G_OBJECT (surface), "cw");
- if (cw->shadow != None)
- {
- XRenderFreePicture (xrender->xdisplay, cw->shadow);
- cw->shadow = None;
- }
-
- cw->needs_shadow = window_has_shadow (xrender, cw);
+ shadow_changed (xrender, cw);
}
}
@@ -1602,20 +1566,9 @@ meta_compositor_xrender_add_window (MetaCompositor *compositor,
G_CALLBACK (notify_window_type_cb),
xrender, 0);
- cw->extents = None;
- cw->shadow = None;
- cw->shadow_dx = 0;
- cw->shadow_dy = 0;
- cw->shadow_width = 0;
- cw->shadow_height = 0;
-
- if (meta_window_appears_focused (window))
- cw->shadow_type = META_SHADOW_LARGE;
- else
- cw->shadow_type = META_SHADOW_MEDIUM;
-
determine_mode (xrender, cw);
- cw->needs_shadow = window_has_shadow (xrender, cw);
+
+ cw->shadow_changed = TRUE;
xwindow = meta_window_get_xwindow (window);
g_hash_table_insert (xrender->windows_by_xid, (gpointer) xwindow, cw);
@@ -1639,12 +1592,7 @@ meta_compositor_xrender_remove_window (MetaCompositor *compositor,
if (cw == NULL)
return;
- if (cw->extents != None)
- {
- meta_compositor_add_damage (compositor, "remove_window", cw->extents);
- XFixesDestroyRegion (xrender->xdisplay, cw->extents);
- cw->extents = None;
- }
+ shadow_changed (xrender, cw);
xwindow = meta_window_get_xwindow (window);
g_hash_table_remove (xrender->windows_by_xid, (gpointer) xwindow);
@@ -1662,18 +1610,7 @@ meta_compositor_xrender_hide_window (MetaCompositor *compositor,
cw = g_object_get_data (G_OBJECT (surface), "cw");
- if (cw->extents != None)
- {
- meta_compositor_add_damage (compositor, "hide_window", cw->extents);
- XFixesDestroyRegion (xrender->xdisplay, cw->extents);
- cw->extents = None;
- }
-
- if (cw->shadow)
- {
- XRenderFreePicture (xrender->xdisplay, cw->shadow);
- cw->shadow = None;
- }
+ shadow_changed (xrender, cw);
}
static void
@@ -1688,23 +1625,7 @@ meta_compositor_xrender_window_opacity_changed (MetaCompositor *compositor,
cw = g_object_get_data (G_OBJECT (surface), "cw");
determine_mode (xrender, cw);
- cw->needs_shadow = window_has_shadow (xrender, cw);
-
- if (cw->shadow)
- {
- XRenderFreePicture (xrender->xdisplay, cw->shadow);
- cw->shadow = None;
- }
-
- if (cw->extents)
- {
- meta_compositor_add_damage (compositor,
- "window_opacity_changed",
- cw->extents);
-
- XFixesDestroyRegion (xrender->xdisplay, cw->extents);
- cw->extents = None;
- }
+ shadow_changed (xrender, cw);
}
static void
@@ -1770,30 +1691,24 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
cw = g_object_get_data (G_OBJECT (surface), "cw");
- cw->needs_shadow = window_has_shadow (xrender, cw);
-
- meta_error_trap_push (cw->window->display);
-
old_rect = cw->rect;
meta_window_get_input_rect (cw->window, &cw->rect);
if (cw->rect.width != old_rect.width || cw->rect.height != old_rect.height)
{
- if (cw->shadow != None)
- {
- XRenderFreePicture (xrender->xdisplay, cw->shadow);
- cw->shadow = None;
- }
+ shadow_changed (xrender, cw);
}
-
- if (cw->extents != None)
+ else if (cw->extents != None)
{
meta_compositor_add_damage (compositor, "sync_window_geometry", cw->extents);
- XFixesDestroyRegion (xrender->xdisplay, cw->extents);
- cw->extents = None;
- }
- meta_error_trap_pop (cw->window->display);
+ XFixesTranslateRegion (xrender->xdisplay,
+ cw->extents,
+ cw->rect.x - old_rect.x,
+ cw->rect.y - old_rect.y);
+
+ meta_compositor_add_damage (compositor, "sync_window_geometry", cw->extents);
+ }
}
static void
@@ -1818,8 +1733,17 @@ meta_compositor_xrender_pre_paint (MetaCompositor *compositor)
surface = META_SURFACE (l->data);
cw = g_object_get_data (G_OBJECT (surface), "cw");
- if (cw->extents == None)
+ if (cw->shadow_changed)
{
+ if (meta_window_appears_focused (cw->window))
+ cw->shadow_type = META_SHADOW_LARGE;
+ else
+ cw->shadow_type = META_SHADOW_MEDIUM;
+
+ determine_mode (xrender, cw);
+ cw->needs_shadow = window_has_shadow (xrender, cw);
+
+ g_assert (cw->extents == None);
cw->extents = win_extents (xrender, cw);
if (cw->extents != None)
@@ -1828,6 +1752,8 @@ meta_compositor_xrender_pre_paint (MetaCompositor *compositor)
"meta_compositor_xrender_pre_paint",
cw->extents);
}
+
+ cw->shadow_changed = FALSE;
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]