Index: app/x11_util.cc |
diff --git a/app/x11_util.cc b/app/x11_util.cc |
index ba014dcfab3b9601bbe9ba23799aa5c5269390d1..558fd6785031f25e32c9aff22d608f6b20b53e52 100644 |
--- a/app/x11_util.cc |
+++ b/app/x11_util.cc |
@@ -20,6 +20,7 @@ |
#include "base/command_line.h" |
#include "base/logging.h" |
+#include "base/stringprintf.h" |
#include "base/thread.h" |
#include "app/x11_util_internal.h" |
#include "gfx/rect.h" |
@@ -53,26 +54,19 @@ CachedPictFormats* get_cached_pict_formats() { |
// Maximum number of CachedPictFormats we keep around. |
const size_t kMaxCacheSize = 5; |
-int X11ErrorHandler(Display* d, XErrorEvent* e) { |
- LOG(FATAL) << "X Error detected: serial " << e->serial |
- << " error_code " << static_cast<unsigned int>(e->error_code) |
- << " request_code " << static_cast<unsigned int>(e->request_code) |
- << " minor_code " << static_cast<unsigned int>(e->minor_code); |
+int DefaultX11ErrorHandler(Display* d, XErrorEvent* e) { |
+ LOG(FATAL) << GetErrorEventDescription(e); |
return 0; |
} |
-int X11IOErrorHandler(Display* d) { |
+int DefaultX11IOErrorHandler(Display* d) { |
+ // If there's an IO error it likely means the X server has gone away |
LOG(FATAL) << "X IO Error detected"; |
return 0; |
} |
} // namespace |
-void SetX11ErrorHandlers() { |
- XSetErrorHandler(X11ErrorHandler); |
- XSetIOErrorHandler(X11IOErrorHandler); |
-} |
- |
bool XDisplayExists() { |
return (gdk_display_get_default() != NULL); |
} |
@@ -461,79 +455,6 @@ void RestackWindow(XID window, XID sibling, bool above) { |
XConfigureWindow(GetXDisplay(), window, CWSibling | CWStackMode, &changes); |
} |
-XRenderPictFormat* GetRenderVisualFormat(Display* dpy, Visual* visual) { |
- DCHECK(QueryRenderSupport(dpy)); |
- |
- CachedPictFormats* formats = get_cached_pict_formats(); |
- |
- for (CachedPictFormats::const_iterator i = formats->begin(); |
- i != formats->end(); ++i) { |
- if (i->equals(dpy, visual)) |
- return i->format; |
- } |
- |
- // Not cached, look up the value. |
- XRenderPictFormat* pictformat = XRenderFindVisualFormat(dpy, visual); |
- CHECK(pictformat) << "XRENDER does not support default visual"; |
- |
- // And store it in the cache. |
- CachedPictFormat cached_value; |
- cached_value.visual = visual; |
- cached_value.display = dpy; |
- cached_value.format = pictformat; |
- formats->push_front(cached_value); |
- |
- if (formats->size() == kMaxCacheSize) { |
- formats->pop_back(); |
- // We should really only have at most 2 display/visual combinations: |
- // one for normal browser windows, and possibly another for an argb window |
- // created to display a menu. |
- // |
- // If we get here it's not fatal, we just need to make sure we aren't |
- // always blowing away the cache. If we are, then we should figure out why |
- // and make it bigger. |
- NOTREACHED(); |
- } |
- |
- return pictformat; |
-} |
- |
-XRenderPictFormat* GetRenderARGB32Format(Display* dpy) { |
- static XRenderPictFormat* pictformat = NULL; |
- if (pictformat) |
- return pictformat; |
- |
- // First look for a 32-bit format which ignores the alpha value |
- XRenderPictFormat templ; |
- templ.depth = 32; |
- templ.type = PictTypeDirect; |
- templ.direct.red = 16; |
- templ.direct.green = 8; |
- templ.direct.blue = 0; |
- templ.direct.redMask = 0xff; |
- templ.direct.greenMask = 0xff; |
- templ.direct.blueMask = 0xff; |
- templ.direct.alphaMask = 0; |
- |
- static const unsigned long kMask = |
- PictFormatType | PictFormatDepth | |
- PictFormatRed | PictFormatRedMask | |
- PictFormatGreen | PictFormatGreenMask | |
- PictFormatBlue | PictFormatBlueMask | |
- PictFormatAlphaMask; |
- |
- pictformat = XRenderFindFormat(dpy, kMask, &templ, 0 /* first result */); |
- |
- if (!pictformat) { |
- // Not all X servers support xRGB32 formats. However, the XRENDER spec says |
- // that they must support an ARGB32 format, so we can always return that. |
- pictformat = XRenderFindStandardFormat(dpy, PictStandardARGB32); |
- CHECK(pictformat) << "XRENDER ARGB32 not supported."; |
- } |
- |
- return pictformat; |
-} |
- |
XSharedMemoryId AttachSharedMemory(Display* display, int shared_memory_key) { |
DCHECK(QuerySharedMemorySupport(display)); |
@@ -826,4 +747,103 @@ bool ChangeWindowDesktop(XID window, XID destination) { |
return result == Success; |
} |
+void SetDefaultX11ErrorHandlers() { |
+ SetX11ErrorHandlers(NULL, NULL); |
+} |
+ |
+// ---------------------------------------------------------------------------- |
+// These functions are declared in x11_util_internal.h because they require |
+// XLib.h to be included, and it conflicts with many other headers. |
+XRenderPictFormat* GetRenderARGB32Format(Display* dpy) { |
+ static XRenderPictFormat* pictformat = NULL; |
+ if (pictformat) |
+ return pictformat; |
+ |
+ // First look for a 32-bit format which ignores the alpha value |
+ XRenderPictFormat templ; |
+ templ.depth = 32; |
+ templ.type = PictTypeDirect; |
+ templ.direct.red = 16; |
+ templ.direct.green = 8; |
+ templ.direct.blue = 0; |
+ templ.direct.redMask = 0xff; |
+ templ.direct.greenMask = 0xff; |
+ templ.direct.blueMask = 0xff; |
+ templ.direct.alphaMask = 0; |
+ |
+ static const unsigned long kMask = |
+ PictFormatType | PictFormatDepth | |
+ PictFormatRed | PictFormatRedMask | |
+ PictFormatGreen | PictFormatGreenMask | |
+ PictFormatBlue | PictFormatBlueMask | |
+ PictFormatAlphaMask; |
+ |
+ pictformat = XRenderFindFormat(dpy, kMask, &templ, 0 /* first result */); |
+ |
+ if (!pictformat) { |
+ // Not all X servers support xRGB32 formats. However, the XRENDER spec says |
+ // that they must support an ARGB32 format, so we can always return that. |
+ pictformat = XRenderFindStandardFormat(dpy, PictStandardARGB32); |
+ CHECK(pictformat) << "XRENDER ARGB32 not supported."; |
+ } |
+ |
+ return pictformat; |
+} |
+ |
+XRenderPictFormat* GetRenderVisualFormat(Display* dpy, Visual* visual) { |
+ DCHECK(QueryRenderSupport(dpy)); |
+ |
+ CachedPictFormats* formats = get_cached_pict_formats(); |
+ |
+ for (CachedPictFormats::const_iterator i = formats->begin(); |
+ i != formats->end(); ++i) { |
+ if (i->equals(dpy, visual)) |
+ return i->format; |
+ } |
+ |
+ // Not cached, look up the value. |
+ XRenderPictFormat* pictformat = XRenderFindVisualFormat(dpy, visual); |
+ CHECK(pictformat) << "XRENDER does not support default visual"; |
+ |
+ // And store it in the cache. |
+ CachedPictFormat cached_value; |
+ cached_value.visual = visual; |
+ cached_value.display = dpy; |
+ cached_value.format = pictformat; |
+ formats->push_front(cached_value); |
+ |
+ if (formats->size() == kMaxCacheSize) { |
+ formats->pop_back(); |
+ // We should really only have at most 2 display/visual combinations: |
+ // one for normal browser windows, and possibly another for an argb window |
+ // created to display a menu. |
+ // |
+ // If we get here it's not fatal, we just need to make sure we aren't |
+ // always blowing away the cache. If we are, then we should figure out why |
+ // and make it bigger. |
+ NOTREACHED(); |
+ } |
+ |
+ return pictformat; |
+} |
+ |
+void SetX11ErrorHandlers(XErrorHandler error_handler, |
+ XIOErrorHandler io_error_handler) { |
+ XSetErrorHandler(error_handler ? error_handler : DefaultX11ErrorHandler); |
+ XSetIOErrorHandler( |
+ io_error_handler ? io_error_handler : DefaultX11IOErrorHandler); |
+} |
+ |
+std::string GetErrorEventDescription(XErrorEvent* error_event) { |
+ return base::StringPrintf( |
+ "X Error detected: %lu error_code %u request_code %u minor_code %u", |
+ error_event->serial, |
+ error_event->error_code, |
+ error_event->request_code, |
+ error_event->minor_code); |
+} |
+// ---------------------------------------------------------------------------- |
+// End of x11_util_internal.h |
+ |
+ |
} // namespace x11_util |