summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVictor Kareh <[email protected]>2017-09-12 13:23:46 -0400
committerraveit65 <[email protected]>2017-11-10 19:51:41 +0100
commit0400a53706337b83598a1f7a51cffbecacd8b9f4 (patch)
tree65ea7e72d6d70805c574aee6cb7c10fdd8089407 /src
parentac93ac087d5a443eae0d052ba9d0bbb38ca44214 (diff)
downloadmarco-0400a53706337b83598a1f7a51cffbecacd8b9f4.tar.bz2
marco-0400a53706337b83598a1f7a51cffbecacd8b9f4.tar.xz
Cancel present_pending flag when erroring out
Diffstat (limited to 'src')
-rw-r--r--src/compositor/compositor-xrender.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/src/compositor/compositor-xrender.c b/src/compositor/compositor-xrender.c
index 34122a9f..c34f759a 100644
--- a/src/compositor/compositor-xrender.c
+++ b/src/compositor/compositor-xrender.c
@@ -1373,21 +1373,34 @@ paint_all (MetaScreen *screen,
paint_windows (screen, info->windows, info->root_buffers[b], region);
- /* FIXME: Things break here... */
- /* XPresentPixmap(xdisplay, */
- /* info->output, */
- /* info->root_pixmaps[b], */
- /* ++info->present_serial, */
- /* None, */
- /* region, */
- /* 0, 0, */
- /* None, None, None, PresentOptionNone, */
- /* 0, 1, 0, NULL, 0); */
- /* info->present_pending = True; */
XFixesSetPictureClipRegion (xdisplay, info->root_buffers[b], 0, 0, region);
XRenderComposite (xdisplay, PictOpSrc, info->root_buffers[b], None,
info->root_picture, 0, 0, 0, 0, 0, 0,
screen_width, screen_height);
+
+ /* FIXME: Things break here with BadWindow error */
+ g_message("XPresentPixmap");
+ meta_error_trap_push (display);
+ XPresentPixmap(xdisplay,
+ info->output,
+ info->root_pixmaps[b],
+ ++info->present_serial,
+ None,
+ region,
+ 0, 0,
+ None, None, None, PresentOptionNone,
+ 0, 1, 0, NULL, 0);
+ int error_code;
+ error_code = meta_error_trap_pop_with_return (display, FALSE);
+ g_message("error_code: %d", error_code);
+ if (error_code == BadWindow || error_code == BadMatch)
+ {
+ info->present_pending = False;
+ }
+ else
+ {
+ info->present_pending = True;
+ }
}
static void
@@ -2484,6 +2497,7 @@ static void
xrender_present_complete(MetaScreen *screen,
XPresentCompleteNotifyEvent *ce)
{
+ g_message("xrender_present_complete");
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
info->present_pending = False;
@@ -2494,15 +2508,20 @@ static void
process_generic(MetaCompositorXRender *compositor,
XGenericEvent *event)
{
+ g_message("process_generic");
XGenericEventCookie *ge = (XGenericEventCookie *) event;
+ g_message("ge->extension: %s", ge->extension);
+ g_message("compositor->present_major: %s", compositor->present_major);
if (ge->extension == compositor->present_major) {
Display *xdisplay = meta_display_get_xdisplay (compositor->display);
XGetEventData(xdisplay, ge);
switch (ge->evtype) {
case PresentConfigureNotify:
+ g_message("PresentConfigureNotify");
break;
case PresentCompleteNotify: {
+ g_message("PresentCompleteNotify");
XPresentCompleteNotifyEvent *ce = ge->data;
MetaScreen *screen = find_screen_from_output(compositor->display, ce->window);
if (screen) {
@@ -3173,6 +3192,7 @@ meta_compositor_xrender_new (MetaDisplay *display)
xrc->show_redraw = FALSE;
xrc->debug = FALSE;
xrc->has_present = XPresentQueryExtension(xdisplay, &xrc->present_major, NULL, NULL);
+ g_message("has_present: %d", xrc->has_present);
#ifdef USE_IDLE_REPAINT
meta_verbose ("Using idle repaint\n");