Home | History | Annotate | Download | only in linux
      1 // Copyright (c) 2012 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 "remoting/host/linux/x11_util.h"
      6 
      7 #include "base/bind.h"
      8 
      9 namespace remoting {
     10 
     11 static ScopedXErrorHandler* g_handler = NULL;
     12 
     13 ScopedXErrorHandler::ScopedXErrorHandler(const Handler& handler):
     14     handler_(handler),
     15     ok_(true) {
     16   // This is a poor-man's check for incorrect usage. It doesn't handle the case
     17   // where a mix of ScopedXErrorHandler and raw XSetErrorHandler calls are used,
     18   // and it disallows nested ScopedXErrorHandlers on the same thread, despite
     19   // these being perfectly safe.
     20   DCHECK(g_handler == NULL);
     21   g_handler = this;
     22   previous_handler_ = XSetErrorHandler(HandleXErrors);
     23 }
     24 
     25 ScopedXErrorHandler::~ScopedXErrorHandler() {
     26   g_handler = NULL;
     27   XSetErrorHandler(previous_handler_);
     28 }
     29 
     30 namespace {
     31 void IgnoreXErrors(Display* display, XErrorEvent* error) {}
     32 }  // namespace
     33 
     34 // Static
     35 ScopedXErrorHandler::Handler ScopedXErrorHandler::Ignore() {
     36   return base::Bind(IgnoreXErrors);
     37 }
     38 
     39 int ScopedXErrorHandler::HandleXErrors(Display* display, XErrorEvent* error) {
     40   DCHECK(g_handler != NULL);
     41   g_handler->ok_ = false;
     42   g_handler->handler_.Run(display, error);
     43   return 0;
     44 }
     45 
     46 
     47 ScopedXGrabServer::ScopedXGrabServer(Display* display)
     48     : display_(display) {
     49   XGrabServer(display_);
     50 }
     51 
     52 ScopedXGrabServer::~ScopedXGrabServer() {
     53   XUngrabServer(display_);
     54   XFlush(display_);
     55 }
     56 
     57 }  // namespace remoting
     58