=== modified file 'src/composite-canvas-egl.cc'
@@ -301,6 +301,7 @@
std::stringstream ss;
+ ss << " EGL " << eglQueryString(egl_display_, EGL_VERSION) << std::endl;
ss << " OpenGL Information" << std::endl;
ss << " GL_VENDOR: " << glGetString(GL_VENDOR) << std::endl;
ss << " GL_RENDERER: " << glGetString(GL_RENDERER) << std::endl;
=== modified file 'src/composite-canvas-glx.cc'
@@ -254,6 +254,7 @@
std::stringstream ss;
+ ss << " GLX " << glXGetClientString(xdpy_, GLX_VERSION) << std::endl;
ss << " OpenGL Information" << std::endl;
ss << " GL_VENDOR: " << glGetString(GL_VENDOR) << std::endl;
ss << " GL_RENDERER: " << glGetString(GL_RENDERER) << std::endl;
=== modified file 'src/composite-canvas.cc'
@@ -368,7 +368,6 @@
{
XEvent event;
bool needs_redraw(false);
- Window window(0);
Profiler::ScopedSamples xevent_scoped(CompositeCanvas::profiler_xevent_pair());
if (Options::idle_redraw && !XPending(xdpy_))
@@ -376,16 +375,32 @@
XNextEvent(xdpy_, &event);
- if (event.type == damage_event_ + XDamageNotify) {
+ // We have to allow for the possibility that the window has actually
+ // been destroyed, but we saw the current event before the destroy event.
+ // So, check for a queued-up DestroyNotify event for our window before
+ // trying to update (bug 984058).
+ Window window = event.xany.window;
+ XEvent destroyEvent;
+ if (True == XCheckTypedWindowEvent(xdpy_, window, DestroyNotify, &destroyEvent)) {
+ Log::debug("--- Destroy Win: 0x%x\n", window);
+ remove_window(window);
+ // If we're using a user provided list of windows, prune this one
+ // out to make sure we don't create any new objects with a bad
+ // window list.
+ if (!Options::window_ids.empty())
+ {
+ Options::window_ids.remove(window);
+ }
+ needs_redraw = true;
+ }
+ else if (event.type == damage_event_ + XDamageNotify) {
// This is a little ugly, but then so is violating strict aliasing
// to make the hideous cast to reference this as an XDamageNotifyEvent.
- window = event.xany.window;
Log::debug("### Damage Win: 0x%x\n", window);
handle_damage(window);
needs_redraw = true;
}
else if (event.type == ConfigureNotify) {
- window = event.xconfigure.window;
Log::debug("Configure Win: 0x%x %d x %d\n",
window,
width_, height_);
@@ -398,24 +413,20 @@
update_window(window);
}
else if (event.type == Expose) {
- window = event.xexpose.window;
Log::debug("Expose Win: 0x%x\n", window);
needs_redraw = true;
}
else if (event.type == UnmapNotify) {
- window = event.xunmap.window;
Log::debug("--- Unmap Win: 0x%x\n", window);
update_window(window);
needs_redraw = true;
}
else if (event.type == MapNotify) {
- window = event.xmap.window;
Log::debug("+++ Map Win: 0x%x\n", window);
update_window(window);
needs_redraw = true;
}
else if (event.type == ReparentNotify) {
- window = event.xreparent.window;
Window parent = event.xreparent.parent;
Log::debug("+++ Reparent Win: 0x%x Parent: 0x%x\n", parent);
if (parent == root_)
@@ -425,13 +436,11 @@
needs_redraw = true;
}
else if (event.type == CreateNotify) {
- window = event.xcreatewindow.window;
Log::debug("+++ Add Win: 0x%x Parent: 0x%x\n",
window, event.xcreatewindow.parent);
add_window(window);
}
else if (event.type == DestroyNotify) {
- window = event.xdestroywindow.window;
Log::debug("--- Destroy Win: 0x%x\n", window);
remove_window(window);
needs_redraw = true;
=== modified file 'src/composite-window.cc'
@@ -34,7 +34,7 @@
if (pix_)
XFreePixmap(xdpy_, pix_);
- if (damage_)
+ if (damage_ && attr_.map_state == IsUnmapped)
XDamageDestroy(xdpy_, damage_);
}
@@ -72,12 +72,12 @@
width_, height_, attr_.map_state);
/* Update pixmap */
- if (!pix_ && attr_.map_state != 0) {
+ if (!pix_ && attr_.map_state != IsUnmapped) {
pix_ = XCompositeNameWindowPixmap(xdpy_, win_);
Log::debug(" => Pixmap <= 0x%x\n", (unsigned) pix_);
update_tfp = true;
}
- else if (pix_ && attr_.map_state == 0) {
+ else if (pix_ && attr_.map_state == IsUnmapped) {
Log::debug(" => Destroying Pixmap 0x%x\n", (unsigned) pix_);
pix_to_free = pix_;
pix_ = None;
@@ -85,11 +85,11 @@
Log::debug(" => Damage State <= 0x%x\n", (unsigned) damage_);
/* Update damage object */
- if (!damage_ && attr_.map_state != 0) {
+ if (!damage_ && attr_.map_state != IsUnmapped) {
damage_ = XDamageCreate(xdpy_, win_, XDamageReportNonEmpty);
Log::debug(" => Damage <= 0x%x\n", (unsigned) damage_);
}
- else if (damage_ && attr_.map_state == 0) {
+ else if (damage_ && attr_.map_state == IsUnmapped) {
Log::debug(" => Destroying damage 0x%x\n", (unsigned) damage_);
XDamageDestroy(xdpy_, damage_);
damage_ = None;