Home | History | Annotate | Download | only in x
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/logging.h"
      6 #include "ui/gfx/x/x11_error_tracker.h"
      7 
      8 #include "ui/gfx/x/x11_types.h"
      9 
     10 namespace {
     11 
     12 unsigned char g_x11_error_code = 0;
     13 static gfx::X11ErrorTracker* g_handler = NULL;
     14 
     15 int X11ErrorHandler(Display* display, XErrorEvent* error) {
     16   g_x11_error_code = error->error_code;
     17   return 0;
     18 }
     19 }
     20 
     21 namespace gfx {
     22 
     23 X11ErrorTracker::X11ErrorTracker() {
     24   // This is a poor-man's check for incorrect usage. It disallows nested
     25   // X11ErrorTracker instances on the same thread.
     26   DCHECK(g_handler == NULL);
     27   g_handler = this;
     28   XSync(GetXDisplay(), False);
     29   old_handler_ = XSetErrorHandler(X11ErrorHandler);
     30   g_x11_error_code = 0;
     31 }
     32 
     33 X11ErrorTracker::~X11ErrorTracker() {
     34   g_handler = NULL;
     35   XSetErrorHandler(old_handler_);
     36 }
     37 
     38 bool X11ErrorTracker::FoundNewError() {
     39   XSync(GetXDisplay(), False);
     40   unsigned char error = g_x11_error_code;
     41   g_x11_error_code = 0;
     42   return error != 0;
     43 }
     44 
     45 }  // namespace gfx
     46