blob: 26accef24183f7c362585e2d2ab331e72d98aa8f [file] [log] [blame]
// Copyright 2020 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.
#ifndef UI_GFX_X_XLIB_SUPPORT_H_
#define UI_GFX_X_XLIB_SUPPORT_H_
#include <memory>
#include <string>
#include "base/component_export.h"
struct _XDisplay;
struct xcb_connection_t;
namespace x11 {
// Specifies the behavior of XlibDisplayWrapper.
enum class XlibDisplayType {
// No action taken on wrapper construction or destruction.
kNormal,
// Flushes the connection on destruction.
kFlushing,
// Synchronizes all requests while the wrapper is alive.
kSyncing,
};
// Loads Xlib, initializes threads, and sets a default error handler.
COMPONENT_EXPORT(X11) void InitXlib();
// Sets an async error handler which only logs an error message.
COMPONENT_EXPORT(X11) void SetXlibErrorHandler();
// Wraps XFree().
COMPONENT_EXPORT(X11) void XlibFree(void* data);
// A scoped Xlib display.
class COMPONENT_EXPORT(X11) XlibDisplay {
public:
~XlibDisplay();
private:
friend class Connection;
friend class XlibDisplayWrapper;
explicit XlibDisplay(const std::string& address);
struct _XDisplay* display_ = nullptr;
};
// A temporary wrapper around an unowned Xlib display that adds behavior
// on construction and destruction (see XlibDisplayType).
class COMPONENT_EXPORT(X11) XlibDisplayWrapper {
public:
~XlibDisplayWrapper();
struct _XDisplay* display() {
return display_;
}
operator struct _XDisplay *() { return display_; }
struct xcb_connection_t* GetXcbConnection();
XlibDisplayWrapper(XlibDisplayWrapper&& other);
XlibDisplayWrapper& operator=(XlibDisplayWrapper&& other);
private:
XlibDisplayWrapper(struct _XDisplay* display, XlibDisplayType type);
friend class Connection;
struct _XDisplay* display_;
XlibDisplayType type_;
};
} // namespace x11
#endif // UI_GFX_X_XLIB_SUPPORT_H_