123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/logging.h"
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/gfx/x/x11_error_tracker.h"
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/gfx/x/x11_types.h"
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace {
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)unsigned char g_x11_error_code = 0;
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochstatic gfx::X11ErrorTracker* g_handler = NULL;
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)int X11ErrorHandler(Display* display, XErrorEvent* error) {
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  g_x11_error_code = error->error_code;
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return 0;
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace gfx {
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)X11ErrorTracker::X11ErrorTracker() {
240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // This is a poor-man's check for incorrect usage. It disallows nested
250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // X11ErrorTracker instances on the same thread.
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(g_handler == NULL);
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  g_handler = this;
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  XSync(GetXDisplay(), False);
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  old_handler_ = XSetErrorHandler(X11ErrorHandler);
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  g_x11_error_code = 0;
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
330529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochX11ErrorTracker::~X11ErrorTracker() {
340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  g_handler = NULL;
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  XSetErrorHandler(old_handler_);
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool X11ErrorTracker::FoundNewError() {
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  XSync(GetXDisplay(), False);
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  unsigned char error = g_x11_error_code;
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  g_x11_error_code = 0;
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return error != 0;
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace gfx
46