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