summaryrefslogtreecommitdiffstats
path: root/gfx/thebes/XlibDisplay.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/thebes/XlibDisplay.h')
-rw-r--r--gfx/thebes/XlibDisplay.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/gfx/thebes/XlibDisplay.h b/gfx/thebes/XlibDisplay.h
new file mode 100644
index 0000000000..0c0f8413a4
--- /dev/null
+++ b/gfx/thebes/XlibDisplay.h
@@ -0,0 +1,41 @@
+/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef GFX_XLIBDISPLAY_H
+#define GFX_XLIBDISPLAY_H
+
+#include <X11/Xlib.h>
+#include "X11UndefineNone.h"
+
+#include <memory>
+
+namespace mozilla::gfx {
+
+// Represents an X11 display connection which may be either borrowed
+// (e.g., from GTK) or owned; in the latter case it will be closed
+// with this object becomes unreferenced. See also the `EglDisplay`
+// class.
+class XlibDisplay final {
+ public:
+ ~XlibDisplay();
+
+ // Explicit `->get()` may be needed with some `Xlib.h` macros that
+ // expand to C-style pointer casts.
+ Display* get() const { return mDisplay; }
+ operator Display*() const { return mDisplay; }
+
+ static std::shared_ptr<XlibDisplay> Borrow(Display* aDisplay);
+ static std::shared_ptr<XlibDisplay> Open(const char* aDisplayName);
+
+ private:
+ Display* const mDisplay;
+ bool const mOwned;
+
+ XlibDisplay(Display*, bool);
+};
+
+} // namespace mozilla::gfx
+
+#endif // GFX_XLIBDISPLAY_H