aboutsummaryrefslogtreecommitdiff
path: root/tools/Vulkan-Tools/cube/xlib_loader.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Vulkan-Tools/cube/xlib_loader.h')
-rw-r--r--tools/Vulkan-Tools/cube/xlib_loader.h110
1 files changed, 110 insertions, 0 deletions
diff --git a/tools/Vulkan-Tools/cube/xlib_loader.h b/tools/Vulkan-Tools/cube/xlib_loader.h
new file mode 100644
index 00000000..5553558d
--- /dev/null
+++ b/tools/Vulkan-Tools/cube/xlib_loader.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2024 The Khronos Group Inc.
+ * Copyright (c) 2024 Valve Corporation
+ * Copyright (c) 2024 LunarG, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: Charles Giessen <charles@lunarg.com>
+ */
+
+#pragma once
+
+#include <dlfcn.h>
+#include <stdlib.h>
+
+#include <X11/Xutil.h>
+
+typedef int (*PFN_XDestroyWindow)(Display*, Window);
+typedef Display* (*PFN_XOpenDisplay)(_Xconst char*);
+typedef Colormap (*PFN_XCreateColormap)(Display*, Window, Visual*, int);
+typedef Window (*PFN_XCreateWindow)(Display*, Window, int, int, unsigned int, unsigned int, unsigned int, int, unsigned int,
+ Visual*, unsigned long, XSetWindowAttributes*);
+typedef int (*PFN_XSelectInput)(Display*, Window, long);
+typedef int (*PFN_XMapWindow)(Display*, Window);
+typedef Atom (*PFN_XInternAtom)(Display*, _Xconst char*, Bool);
+typedef int (*PFN_XNextEvent)(Display*, XEvent*);
+typedef int (*PFN_XPending)(Display*);
+typedef XVisualInfo* (*PFN_XGetVisualInfo)(Display*, long, XVisualInfo*, int*);
+typedef int (*PFN_XCloseDisplay)(Display* /* display */
+);
+typedef Status (*PFN_XInitThreads)(void);
+typedef int (*PFN_XFlush)(Display* /* display */
+);
+typedef Status (*PFN_XSetWMProtocols)(Display*, Window, Atom*, int);
+
+static PFN_XDestroyWindow cube_XDestroyWindow = NULL;
+static PFN_XOpenDisplay cube_XOpenDisplay = NULL;
+static PFN_XCreateColormap cube_XCreateColormap = NULL;
+static PFN_XCreateWindow cube_XCreateWindow = NULL;
+static PFN_XSelectInput cube_XSelectInput = NULL;
+static PFN_XMapWindow cube_XMapWindow = NULL;
+static PFN_XInternAtom cube_XInternAtom = NULL;
+static PFN_XNextEvent cube_XNextEvent = NULL;
+static PFN_XPending cube_XPending = NULL;
+static PFN_XGetVisualInfo cube_XGetVisualInfo = NULL;
+static PFN_XCloseDisplay cube_XCloseDisplay = NULL;
+static PFN_XInitThreads cube_XInitThreads = NULL;
+static PFN_XFlush cube_XFlush = NULL;
+static PFN_XSetWMProtocols cube_XSetWMProtocols = NULL;
+
+#define XDestroyWindow cube_XDestroyWindow
+#define XOpenDisplay cube_XOpenDisplay
+#define XCreateColormap cube_XCreateColormap
+#define XCreateWindow cube_XCreateWindow
+#define XSelectInput cube_XSelectInput
+#define XMapWindow cube_XMapWindow
+#define XInternAtom cube_XInternAtom
+#define XNextEvent cube_XNextEvent
+#define XPending cube_XPending
+#define XGetVisualInfo cube_XGetVisualInfo
+#define XCloseDisplay cube_XCloseDisplay
+#define XInitThreads cube_XInitThreads
+#define XFlush cube_XFlush
+#define XSetWMProtocols cube_XSetWMProtocols
+
+void* initialize_xlib() {
+ void* xlib_library = NULL;
+ if (NULL == xlib_library) {
+ xlib_library = dlopen("libX11.so.6", RTLD_NOW | RTLD_LOCAL);
+ }
+ if (NULL == xlib_library) {
+ xlib_library = dlopen("libX11.so", RTLD_NOW | RTLD_LOCAL);
+ }
+ if (NULL == xlib_library) {
+ return NULL;
+ }
+
+#ifdef __cplusplus
+#define TYPE_CONVERSION(type) reinterpret_cast<type>
+#else
+#define TYPE_CONVERSION(type)
+#endif
+
+ cube_XDestroyWindow = TYPE_CONVERSION(PFN_XDestroyWindow)(dlsym(xlib_library, "XDestroyWindow"));
+ cube_XOpenDisplay = TYPE_CONVERSION(PFN_XOpenDisplay)(dlsym(xlib_library, "XOpenDisplay"));
+ cube_XCreateColormap = TYPE_CONVERSION(PFN_XCreateColormap)(dlsym(xlib_library, "XCreateColormap"));
+ cube_XCreateWindow = TYPE_CONVERSION(PFN_XCreateWindow)(dlsym(xlib_library, "XCreateWindow"));
+ cube_XSelectInput = TYPE_CONVERSION(PFN_XSelectInput)(dlsym(xlib_library, "XSelectInput"));
+ cube_XMapWindow = TYPE_CONVERSION(PFN_XMapWindow)(dlsym(xlib_library, "XMapWindow"));
+ cube_XInternAtom = TYPE_CONVERSION(PFN_XInternAtom)(dlsym(xlib_library, "XInternAtom"));
+ cube_XNextEvent = TYPE_CONVERSION(PFN_XNextEvent)(dlsym(xlib_library, "XNextEvent"));
+ cube_XPending = TYPE_CONVERSION(PFN_XPending)(dlsym(xlib_library, "XPending"));
+ cube_XGetVisualInfo = TYPE_CONVERSION(PFN_XGetVisualInfo)(dlsym(xlib_library, "XGetVisualInfo"));
+ cube_XCloseDisplay = TYPE_CONVERSION(PFN_XCloseDisplay)(dlsym(xlib_library, "XCloseDisplay"));
+ cube_XInitThreads = TYPE_CONVERSION(PFN_XInitThreads)(dlsym(xlib_library, "XInitThreads"));
+ cube_XFlush = TYPE_CONVERSION(PFN_XFlush)(dlsym(xlib_library, "XFlush"));
+ cube_XSetWMProtocols = TYPE_CONVERSION(PFN_XSetWMProtocols)(dlsym(xlib_library, "XSetWMProtocols"));
+
+ return xlib_library;
+}