only enable automatic composite redirection for the client windows, not the frames. maybe this will avoid screen artifacts with the crap server support

This commit is contained in:
Dana Jansens 2007-06-21 05:49:08 +00:00
parent 4c5034aaeb
commit 15cabcb16a
4 changed files with 22 additions and 12 deletions

View file

@ -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

View file

@ -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);

View file

@ -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,

View file

@ -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"