/* * 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 */ #pragma once #include #include #include 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 #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; }