summaryrefslogtreecommitdiff
path: root/src/compositor
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-10-20 20:42:14 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2019-10-20 22:10:08 +0300
commit3eb4d02b01cc70be31248cc3b013a5e6eb259a87 (patch)
tree227b114fdab0cc496899ffb5ed0539829bd03287 /src/compositor
parentcc6832f02cf68e17f5436dd35015c6e8ed6b6a25 (diff)
downloadmetacity-3eb4d02b01cc70be31248cc3b013a5e6eb259a87.tar.gz
compositor-xrender: move Expose event handling to MetaCompositor
Diffstat (limited to 'src/compositor')
-rw-r--r--src/compositor/meta-compositor-xrender.c68
-rw-r--r--src/compositor/meta-compositor.c34
2 files changed, 33 insertions, 69 deletions
diff --git a/src/compositor/meta-compositor-xrender.c b/src/compositor/meta-compositor-xrender.c
index f76f86ab..841541ba 100644
--- a/src/compositor/meta-compositor-xrender.c
+++ b/src/compositor/meta-compositor-xrender.c
@@ -578,35 +578,6 @@ shadow_picture (MetaCompositorXRender *xrender,
return shadow_picture;
}
-static MetaCompWindow *
-find_comp_window_by_xwindow (MetaCompositorXRender *xrender,
- Window xwindow)
-{
- GHashTableIter iter;
- MetaCompWindow *cw;
-
- g_hash_table_iter_init (&iter, xrender->windows_by_xid);
- while (g_hash_table_iter_next (&iter, NULL, (gpointer) &cw))
- {
- MetaFrame *frame;
-
- frame = meta_window_get_frame (cw->window);
-
- if (frame)
- {
- if (meta_frame_get_xwindow (frame) == xwindow)
- return cw;
- }
- else
- {
- if (meta_window_get_xwindow (cw->window) == xwindow)
- return cw;
- }
- }
-
- return NULL;
-}
-
static Picture
solid_picture (Display *xdisplay,
gboolean argb,
@@ -1177,41 +1148,6 @@ process_property_notify (MetaCompositorXRender *xrender,
}
}
-static void
-expose_area (MetaCompositorXRender *xrender,
- XRectangle *rects,
- int nrects)
-{
- XserverRegion region;
-
- region = XFixesCreateRegion (xrender->xdisplay, rects, nrects);
-
- meta_compositor_add_damage (META_COMPOSITOR (xrender), "expose_area", region);
- XFixesDestroyRegion (xrender->xdisplay, region);
-}
-
-static void
-process_expose (MetaCompositorXRender *xrender,
- XExposeEvent *event)
-{
- MetaCompWindow *cw = find_comp_window_by_xwindow (xrender, event->window);
- XRectangle rect[1];
- int origin_x = 0, origin_y = 0;
-
- if (cw != NULL)
- {
- origin_x = cw->rect.x;
- origin_y = cw->rect.y;
- }
-
- rect[0].x = event->x + origin_x;
- rect[0].y = event->y + origin_y;
- rect[0].width = event->width;
- rect[0].height = event->height;
-
- expose_area (xrender, rect, 1);
-}
-
static int
timeout_debug (MetaCompositorXRender *compositor)
{
@@ -1488,10 +1424,6 @@ meta_compositor_xrender_process_event (MetaCompositor *compositor,
process_property_notify (xrender, (XPropertyEvent *) event);
break;
- case Expose:
- process_expose (xrender, (XExposeEvent *) event);
- break;
-
default:
break;
}
diff --git a/src/compositor/meta-compositor.c b/src/compositor/meta-compositor.c
index 9dc466fe..41324961 100644
--- a/src/compositor/meta-compositor.c
+++ b/src/compositor/meta-compositor.c
@@ -542,13 +542,45 @@ meta_compositor_process_event (MetaCompositor *compositor,
{
MetaCompositorPrivate *priv;
MetaCompositorClass *compositor_class;
+ int damage_event_base;
priv = meta_compositor_get_instance_private (compositor);
compositor_class = META_COMPOSITOR_GET_CLASS (compositor);
compositor_class->process_event (compositor, event, window);
- if (event->type == meta_display_get_damage_event_base (priv->display) + XDamageNotify)
+ damage_event_base = meta_display_get_damage_event_base (priv->display);
+
+ if (event->type == Expose)
+ {
+ XExposeEvent *expose_event;
+ MetaSurface *surface;
+ XRectangle rect;
+ XserverRegion region;
+
+ expose_event = (XExposeEvent *) event;
+
+ if (window != NULL)
+ surface = g_hash_table_lookup (priv->surfaces, window);
+ else
+ surface = find_surface_by_xwindow (compositor, expose_event->window);
+
+ rect.x = expose_event->x;
+ rect.y = expose_event->y;
+ rect.width = expose_event->width;
+ rect.height = expose_event->height;
+
+ if (surface != NULL)
+ {
+ rect.x += meta_surface_get_x (surface);
+ rect.y += meta_surface_get_y (surface);
+ }
+
+ region = XFixesCreateRegion (priv->display->xdisplay, &rect, 1);
+ meta_compositor_add_damage (compositor, "XExposeEvent", region);
+ XFixesDestroyRegion (priv->display->xdisplay, region);
+ }
+ else if (event->type == damage_event_base + XDamageNotify)
{
XDamageNotifyEvent *damage_event;
MetaSurface *surface;