1e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org/* 2e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org * 4e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org * Use of this source code is governed by a BSD-style license 5e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org * that can be found in the LICENSE file in the root of the source 6e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org * tree. An additional intellectual property rights grant can be found 7e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org * in the file PATENTS. All contributing project authors may 8e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org * be found in the AUTHORS file in the root of the source tree. 9e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org */ 10e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 11e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#include "webrtc/modules/desktop_capture/x11/x_error_trap.h" 12e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 13e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#include <assert.h> 14e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 15e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#if defined(TOOLKIT_GTK) 16e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#include <gdk/gdk.h> 17e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#endif // !defined(TOOLKIT_GTK) 18e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 19e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.orgnamespace webrtc { 20e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 21e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.orgnamespace { 22e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 23e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#if !defined(TOOLKIT_GTK) 24e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 25e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org// TODO(sergeyu): This code is not thread safe. Fix it. Bug 2202. 26e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.orgstatic bool g_xserver_error_trap_enabled = false; 27e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.orgstatic int g_last_xserver_error_code = 0; 28e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 29e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.orgint XServerErrorHandler(Display* display, XErrorEvent* error_event) { 30e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org assert(g_xserver_error_trap_enabled); 31e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org g_last_xserver_error_code = error_event->error_code; 32e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org return 0; 33e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org} 34e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 35e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#endif // !defined(TOOLKIT_GTK) 36e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 37e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org} // namespace 38e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 39e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.orgXErrorTrap::XErrorTrap(Display* display) 40e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org : original_error_handler_(NULL), 41e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org enabled_(true) { 42e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#if defined(TOOLKIT_GTK) 43e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org gdk_error_trap_push(); 44e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#else // !defined(TOOLKIT_GTK) 45e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org assert(!g_xserver_error_trap_enabled); 46e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org original_error_handler_ = XSetErrorHandler(&XServerErrorHandler); 47e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org g_xserver_error_trap_enabled = true; 48e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org g_last_xserver_error_code = 0; 49e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#endif // !defined(TOOLKIT_GTK) 50e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org} 51e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 52e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.orgint XErrorTrap::GetLastErrorAndDisable() { 53e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org enabled_ = false; 54e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#if defined(TOOLKIT_GTK) 55e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org return gdk_error_trap_push(); 56e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#else // !defined(TOOLKIT_GTK) 57e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org assert(g_xserver_error_trap_enabled); 58e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org XSetErrorHandler(original_error_handler_); 59e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org g_xserver_error_trap_enabled = false; 60e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org return g_last_xserver_error_code; 61e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org#endif // !defined(TOOLKIT_GTK) 62e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org} 63e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 64e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.orgXErrorTrap::~XErrorTrap() { 65e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org if (enabled_) 66e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org GetLastErrorAndDisable(); 67e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org} 68e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org 69e562e02f31a3d39f06d6cdab11a28104c60bccd8sergeyu@chromium.org} // namespace webrtc 70