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