// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/host/linux/x11_util.h"
#include "base/bind.h"
namespace remoting {
static ScopedXErrorHandler* g_handler = NULL;
ScopedXErrorHandler::ScopedXErrorHandler(const Handler& handler):
handler_(handler),
ok_(true) {
// This is a poor-man's check for incorrect usage. It doesn't handle the case
// where a mix of ScopedXErrorHandler and raw XSetErrorHandler calls are used,
// and it disallows nested ScopedXErrorHandlers on the same thread, despite
// these being perfectly safe.
DCHECK(g_handler == NULL);
g_handler = this;
previous_handler_ = XSetErrorHandler(HandleXErrors);
}
ScopedXErrorHandler::~ScopedXErrorHandler() {
g_handler = NULL;
XSetErrorHandler(previous_handler_);
}
namespace {
void IgnoreXErrors(Display* display, XErrorEvent* error) {}
} // namespace
// Static
ScopedXErrorHandler::Handler ScopedXErrorHandler::Ignore() {
return base::Bind(IgnoreXErrors);
}
int ScopedXErrorHandler::HandleXErrors(Display* display, XErrorEvent* error) {
DCHECK(g_handler != NULL);
g_handler->ok_ = false;
g_handler->handler_.Run(display, error);
return 0;
}
ScopedXGrabServer::ScopedXGrabServer(Display* display)
: display_(display) {
XGrabServer(display_);
}
ScopedXGrabServer::~ScopedXGrabServer() {
XUngrabServer(display_);
XFlush(display_);
}
} // namespace remoting