diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2019-10-20 20:42:14 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2019-10-20 22:10:08 +0300 |
commit | 3eb4d02b01cc70be31248cc3b013a5e6eb259a87 (patch) | |
tree | 227b114fdab0cc496899ffb5ed0539829bd03287 /src/compositor | |
parent | cc6832f02cf68e17f5436dd35015c6e8ed6b6a25 (diff) | |
download | metacity-3eb4d02b01cc70be31248cc3b013a5e6eb259a87.tar.gz |
compositor-xrender: move Expose event handling to MetaCompositor
Diffstat (limited to 'src/compositor')
-rw-r--r-- | src/compositor/meta-compositor-xrender.c | 68 | ||||
-rw-r--r-- | src/compositor/meta-compositor.c | 34 |
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; |