From 15cabcb16a188912f49e99885896ed7ad7a13925 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 21 Jun 2007 05:49:08 +0000 Subject: [PATCH] only enable automatic composite redirection for the client windows, not the frames. maybe this will avoid screen artifacts with the crap server support --- openbox/composite.c | 15 ++++++++------- openbox/composite.h | 3 +++ openbox/frame.c | 15 ++++++++++----- openbox/screen.c | 1 + 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/openbox/composite.c b/openbox/composite.c index 93c025ff..deedf965 100644 --- a/openbox/composite.c +++ b/openbox/composite.c @@ -8,6 +8,8 @@ void composite_shutdown(gboolean reconfig) {} gboolean composite_window_has_alpha(Visual *vis) { return FALSE; } XID composite_get_window_picture(Window win, Visual *vis) { return None; } Pixmap composite_get_window_pixmap(Window win) { return None; } +void composite_setup_root_window() {} +void composite_enable_for_window(Window win) {} #else static Picture root_picture = None; @@ -16,13 +18,6 @@ void composite_startup(gboolean reconfig) { if (reconfig) return; if (!extensions_comp) return; - - /* Redirect window contents to offscreen pixmaps */ -/* - XCompositeRedirectSubwindows(ob_display, - RootWindow(ob_display, ob_screen), - CompositeRedirectAutomatic); -*/ } void composite_shutdown(gboolean reconfig) @@ -71,4 +66,10 @@ Pixmap composite_get_window_pixmap(Window win) return XCompositeNameWindowPixmap(ob_display, win); } +void composite_enable_for_window(Window win) +{ + /* Redirect window contents to offscreen pixmaps */ + XCompositeRedirectWindow(ob_display, win, CompositeRedirectAutomatic); +} + #endif diff --git a/openbox/composite.h b/openbox/composite.h index 94232ffa..d20abacb 100644 --- a/openbox/composite.h +++ b/openbox/composite.h @@ -7,6 +7,9 @@ void composite_startup(gboolean reconfig); void composite_shutdown(gboolean reconfig); +void composite_setup_root_window(); +void composite_enable_for_window(Window win); + gboolean composite_window_has_alpha(Visual *vis); XID composite_get_window_picture(Window win, Visual *vis); Pixmap composite_get_window_pixmap(Window win); diff --git a/openbox/frame.c b/openbox/frame.c index 0b852456..25a9214b 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -288,6 +288,12 @@ void frame_adjust_shape(ObFrame *self) self->client->window, ShapeBounding, ShapeSet); + /* shape the offscreen buffer to match the window */ + if (self->pixmap) + XShapeCombineShape(ob_display, self->pixmap, ShapeBounding, + 0, 0, self->client->window, + ShapeBounding, ShapeSet); + num = 0; if (self->decorations & OB_FRAME_DECOR_TITLEBAR) { xrect[0].x = 0; @@ -313,10 +319,6 @@ void frame_adjust_shape(ObFrame *self) ShapeUnion, Unsorted); } - if (self->pixmap) - XShapeCombineShape(ob_display, self->pixmap, ShapeBounding, - 0, 0, self->window, ShapeBounding, ShapeSet); - #endif } @@ -923,6 +925,9 @@ void frame_grab_client(ObFrame *self) /* reparent the client to the frame */ XReparentWindow(ob_display, self->client->window, self->window, 0, 0); + /* enable the offscreen composite buffer for the client window */ + composite_enable_for_window(self->client->window); + /* When reparenting the client window, it is usually not mapped yet, since this occurs from a MapRequest. However, in the case where Openbox is @@ -1754,7 +1759,7 @@ static void frame_get_offscreen_buffer(ObFrame *self) frame_free_offscreen_buffer(self); if (self->visible || frame_iconify_animating(self)) { - self->pixmap = composite_get_window_pixmap(self->window); + self->pixmap = composite_get_window_pixmap(self->client->window); /* self->picture = composite_create_picture(self->window, wattrib.visual, diff --git a/openbox/screen.c b/openbox/screen.c index 4abf5b6c..7e02bff4 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -27,6 +27,7 @@ #include "moveresize.h" #include "config.h" #include "screen.h" +#include "composite.h" #include "client.h" #include "session.h" #include "frame.h" -- 2.39.2