michael@0: /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: * vim: sw=2 ts=8 et : michael@0: */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "X11Util.h" michael@0: #include "nsDebug.h" // for NS_ASSERTION, etc michael@0: michael@0: namespace mozilla { michael@0: michael@0: void michael@0: FindVisualAndDepth(Display* aDisplay, VisualID aVisualID, michael@0: Visual** aVisual, int* aDepth) michael@0: { michael@0: const Screen* screen = DefaultScreenOfDisplay(aDisplay); michael@0: michael@0: for (int d = 0; d < screen->ndepths; d++) { michael@0: Depth *d_info = &screen->depths[d]; michael@0: for (int v = 0; v < d_info->nvisuals; v++) { michael@0: Visual* visual = &d_info->visuals[v]; michael@0: if (visual->visualid == aVisualID) { michael@0: *aVisual = visual; michael@0: *aDepth = d_info->depth; michael@0: return; michael@0: } michael@0: } michael@0: } michael@0: michael@0: NS_ASSERTION(aVisualID == None, "VisualID not on Screen."); michael@0: *aVisual = nullptr; michael@0: *aDepth = 0; michael@0: return; michael@0: } michael@0: michael@0: void michael@0: FinishX(Display* aDisplay) michael@0: { michael@0: unsigned long lastRequest = NextRequest(aDisplay) - 1; michael@0: if (lastRequest == LastKnownRequestProcessed(aDisplay)) michael@0: return; michael@0: michael@0: XSync(aDisplay, False); michael@0: } michael@0: michael@0: ScopedXErrorHandler::ErrorEvent* ScopedXErrorHandler::sXErrorPtr; michael@0: michael@0: int michael@0: ScopedXErrorHandler::ErrorHandler(Display *, XErrorEvent *ev) michael@0: { michael@0: // only record the error if no error was previously recorded. michael@0: // this means that in case of multiple errors, it's the first error that we report. michael@0: if (!sXErrorPtr->mError.error_code) michael@0: sXErrorPtr->mError = *ev; michael@0: return 0; michael@0: } michael@0: michael@0: ScopedXErrorHandler::ScopedXErrorHandler() michael@0: { michael@0: // let sXErrorPtr point to this object's mXError object, but don't reset this mXError object! michael@0: // think of the case of nested ScopedXErrorHandler's. michael@0: mOldXErrorPtr = sXErrorPtr; michael@0: sXErrorPtr = &mXError; michael@0: mOldErrorHandler = XSetErrorHandler(ErrorHandler); michael@0: } michael@0: michael@0: ScopedXErrorHandler::~ScopedXErrorHandler() michael@0: { michael@0: sXErrorPtr = mOldXErrorPtr; michael@0: XSetErrorHandler(mOldErrorHandler); michael@0: } michael@0: michael@0: bool michael@0: ScopedXErrorHandler::SyncAndGetError(Display *dpy, XErrorEvent *ev) michael@0: { michael@0: FinishX(dpy); michael@0: michael@0: bool retval = mXError.mError.error_code != 0; michael@0: if (ev) michael@0: *ev = mXError.mError; michael@0: mXError = ErrorEvent(); // reset michael@0: return retval; michael@0: } michael@0: michael@0: } // namespace mozilla