x11_platform.h (16584B)
1 //======================================================================== 2 // GLFW 3.3 X11 - www.glfw.org 3 //------------------------------------------------------------------------ 4 // Copyright (c) 2002-2006 Marcus Geelnard 5 // Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org> 6 // 7 // This software is provided 'as-is', without any express or implied 8 // warranty. In no event will the authors be held liable for any damages 9 // arising from the use of this software. 10 // 11 // Permission is granted to anyone to use this software for any purpose, 12 // including commercial applications, and to alter it and redistribute it 13 // freely, subject to the following restrictions: 14 // 15 // 1. The origin of this software must not be misrepresented; you must not 16 // claim that you wrote the original software. If you use this software 17 // in a product, an acknowledgment in the product documentation would 18 // be appreciated but is not required. 19 // 20 // 2. Altered source versions must be plainly marked as such, and must not 21 // be misrepresented as being the original software. 22 // 23 // 3. This notice may not be removed or altered from any source 24 // distribution. 25 // 26 //======================================================================== 27 28 #include <unistd.h> 29 #include <signal.h> 30 #include <stdint.h> 31 #include <dlfcn.h> 32 33 #include <X11/Xlib.h> 34 #include <X11/keysym.h> 35 #include <X11/Xatom.h> 36 #include <X11/Xcursor/Xcursor.h> 37 38 // The XRandR extension provides mode setting and gamma control 39 #include <X11/extensions/Xrandr.h> 40 41 // The Xkb extension provides improved keyboard support 42 #include <X11/XKBlib.h> 43 44 // The Xinerama extension provides legacy monitor indices 45 #include <X11/extensions/Xinerama.h> 46 47 // The XInput extension provides raw mouse motion input 48 #include <X11/extensions/XInput2.h> 49 50 typedef XRRCrtcGamma* (* PFN_XRRAllocGamma)(int); 51 typedef void (* PFN_XRRFreeCrtcInfo)(XRRCrtcInfo*); 52 typedef void (* PFN_XRRFreeGamma)(XRRCrtcGamma*); 53 typedef void (* PFN_XRRFreeOutputInfo)(XRROutputInfo*); 54 typedef void (* PFN_XRRFreeScreenResources)(XRRScreenResources*); 55 typedef XRRCrtcGamma* (* PFN_XRRGetCrtcGamma)(Display*,RRCrtc); 56 typedef int (* PFN_XRRGetCrtcGammaSize)(Display*,RRCrtc); 57 typedef XRRCrtcInfo* (* PFN_XRRGetCrtcInfo) (Display*,XRRScreenResources*,RRCrtc); 58 typedef XRROutputInfo* (* PFN_XRRGetOutputInfo)(Display*,XRRScreenResources*,RROutput); 59 typedef RROutput (* PFN_XRRGetOutputPrimary)(Display*,Window); 60 typedef XRRScreenResources* (* PFN_XRRGetScreenResourcesCurrent)(Display*,Window); 61 typedef Bool (* PFN_XRRQueryExtension)(Display*,int*,int*); 62 typedef Status (* PFN_XRRQueryVersion)(Display*,int*,int*); 63 typedef void (* PFN_XRRSelectInput)(Display*,Window,int); 64 typedef Status (* PFN_XRRSetCrtcConfig)(Display*,XRRScreenResources*,RRCrtc,Time,int,int,RRMode,Rotation,RROutput*,int); 65 typedef void (* PFN_XRRSetCrtcGamma)(Display*,RRCrtc,XRRCrtcGamma*); 66 typedef int (* PFN_XRRUpdateConfiguration)(XEvent*); 67 #define XRRAllocGamma _glfw.x11.randr.AllocGamma 68 #define XRRFreeCrtcInfo _glfw.x11.randr.FreeCrtcInfo 69 #define XRRFreeGamma _glfw.x11.randr.FreeGamma 70 #define XRRFreeOutputInfo _glfw.x11.randr.FreeOutputInfo 71 #define XRRFreeScreenResources _glfw.x11.randr.FreeScreenResources 72 #define XRRGetCrtcGamma _glfw.x11.randr.GetCrtcGamma 73 #define XRRGetCrtcGammaSize _glfw.x11.randr.GetCrtcGammaSize 74 #define XRRGetCrtcInfo _glfw.x11.randr.GetCrtcInfo 75 #define XRRGetOutputInfo _glfw.x11.randr.GetOutputInfo 76 #define XRRGetOutputPrimary _glfw.x11.randr.GetOutputPrimary 77 #define XRRGetScreenResourcesCurrent _glfw.x11.randr.GetScreenResourcesCurrent 78 #define XRRQueryExtension _glfw.x11.randr.QueryExtension 79 #define XRRQueryVersion _glfw.x11.randr.QueryVersion 80 #define XRRSelectInput _glfw.x11.randr.SelectInput 81 #define XRRSetCrtcConfig _glfw.x11.randr.SetCrtcConfig 82 #define XRRSetCrtcGamma _glfw.x11.randr.SetCrtcGamma 83 #define XRRUpdateConfiguration _glfw.x11.randr.UpdateConfiguration 84 85 typedef XcursorImage* (* PFN_XcursorImageCreate)(int,int); 86 typedef void (* PFN_XcursorImageDestroy)(XcursorImage*); 87 typedef Cursor (* PFN_XcursorImageLoadCursor)(Display*,const XcursorImage*); 88 #define XcursorImageCreate _glfw.x11.xcursor.ImageCreate 89 #define XcursorImageDestroy _glfw.x11.xcursor.ImageDestroy 90 #define XcursorImageLoadCursor _glfw.x11.xcursor.ImageLoadCursor 91 92 typedef Bool (* PFN_XineramaIsActive)(Display*); 93 typedef Bool (* PFN_XineramaQueryExtension)(Display*,int*,int*); 94 typedef XineramaScreenInfo* (* PFN_XineramaQueryScreens)(Display*,int*); 95 #define XineramaIsActive _glfw.x11.xinerama.IsActive 96 #define XineramaQueryExtension _glfw.x11.xinerama.QueryExtension 97 #define XineramaQueryScreens _glfw.x11.xinerama.QueryScreens 98 99 typedef XID xcb_window_t; 100 typedef XID xcb_visualid_t; 101 typedef struct xcb_connection_t xcb_connection_t; 102 typedef xcb_connection_t* (* PFN_XGetXCBConnection)(Display*); 103 #define XGetXCBConnection _glfw.x11.x11xcb.GetXCBConnection 104 105 typedef Bool (* PFN_XF86VidModeQueryExtension)(Display*,int*,int*); 106 typedef Bool (* PFN_XF86VidModeGetGammaRamp)(Display*,int,int,unsigned short*,unsigned short*,unsigned short*); 107 typedef Bool (* PFN_XF86VidModeSetGammaRamp)(Display*,int,int,unsigned short*,unsigned short*,unsigned short*); 108 typedef Bool (* PFN_XF86VidModeGetGammaRampSize)(Display*,int,int*); 109 #define XF86VidModeQueryExtension _glfw.x11.vidmode.QueryExtension 110 #define XF86VidModeGetGammaRamp _glfw.x11.vidmode.GetGammaRamp 111 #define XF86VidModeSetGammaRamp _glfw.x11.vidmode.SetGammaRamp 112 #define XF86VidModeGetGammaRampSize _glfw.x11.vidmode.GetGammaRampSize 113 114 typedef Status (* PFN_XIQueryVersion)(Display*,int*,int*); 115 typedef int (* PFN_XISelectEvents)(Display*,Window,XIEventMask*,int); 116 #define XIQueryVersion _glfw.x11.xi.QueryVersion 117 #define XISelectEvents _glfw.x11.xi.SelectEvents 118 119 typedef Bool (* PFN_XRenderQueryExtension)(Display*,int*,int*); 120 typedef Status (* PFN_XRenderQueryVersion)(Display*dpy,int*,int*); 121 typedef XRenderPictFormat* (* PFN_XRenderFindVisualFormat)(Display*,Visual const*); 122 #define XRenderQueryExtension _glfw.x11.xrender.QueryExtension 123 #define XRenderQueryVersion _glfw.x11.xrender.QueryVersion 124 #define XRenderFindVisualFormat _glfw.x11.xrender.FindVisualFormat 125 126 typedef VkFlags VkXlibSurfaceCreateFlagsKHR; 127 typedef VkFlags VkXcbSurfaceCreateFlagsKHR; 128 129 typedef struct VkXlibSurfaceCreateInfoKHR 130 { 131 VkStructureType sType; 132 const void* pNext; 133 VkXlibSurfaceCreateFlagsKHR flags; 134 Display* dpy; 135 Window window; 136 } VkXlibSurfaceCreateInfoKHR; 137 138 typedef struct VkXcbSurfaceCreateInfoKHR 139 { 140 VkStructureType sType; 141 const void* pNext; 142 VkXcbSurfaceCreateFlagsKHR flags; 143 xcb_connection_t* connection; 144 xcb_window_t window; 145 } VkXcbSurfaceCreateInfoKHR; 146 147 typedef VkResult (APIENTRY *PFN_vkCreateXlibSurfaceKHR)(VkInstance,const VkXlibSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*); 148 typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice,uint32_t,Display*,VisualID); 149 typedef VkResult (APIENTRY *PFN_vkCreateXcbSurfaceKHR)(VkInstance,const VkXcbSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*); 150 typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice,uint32_t,xcb_connection_t*,xcb_visualid_t); 151 152 #include "posix_thread.h" 153 #include "posix_time.h" 154 #include "xkb_unicode.h" 155 #include "glx_context.h" 156 #include "egl_context.h" 157 #include "osmesa_context.h" 158 #if defined(__linux__) 159 #include "linux_joystick.h" 160 #else 161 #include "null_joystick.h" 162 #endif 163 164 #define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL) 165 #define _glfw_dlclose(handle) dlclose(handle) 166 #define _glfw_dlsym(handle, name) dlsym(handle, name) 167 168 #define _GLFW_EGL_NATIVE_WINDOW ((EGLNativeWindowType) window->x11.handle) 169 #define _GLFW_EGL_NATIVE_DISPLAY ((EGLNativeDisplayType) _glfw.x11.display) 170 171 #define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 x11 172 #define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 x11 173 #define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorX11 x11 174 #define _GLFW_PLATFORM_CURSOR_STATE _GLFWcursorX11 x11 175 176 177 // X11-specific per-window data 178 // 179 typedef struct _GLFWwindowX11 180 { 181 Colormap colormap; 182 Window handle; 183 Window parent; 184 XIC ic; 185 186 GLFWbool overrideRedirect; 187 GLFWbool iconified; 188 GLFWbool maximized; 189 190 // Whether the visual supports framebuffer transparency 191 GLFWbool transparent; 192 193 // Cached position and size used to filter out duplicate events 194 int width, height; 195 int xpos, ypos; 196 197 // The last received cursor position, regardless of source 198 int lastCursorPosX, lastCursorPosY; 199 // The last position the cursor was warped to by GLFW 200 int warpCursorPosX, warpCursorPosY; 201 202 // The time of the last KeyPress event per keycode, for discarding 203 // duplicate key events generated for some keys by ibus 204 Time keyPressTimes[256]; 205 206 } _GLFWwindowX11; 207 208 // X11-specific global data 209 // 210 typedef struct _GLFWlibraryX11 211 { 212 Display* display; 213 int screen; 214 Window root; 215 216 // System content scale 217 float contentScaleX, contentScaleY; 218 // Helper window for IPC 219 Window helperWindowHandle; 220 // Invisible cursor for hidden cursor mode 221 Cursor hiddenCursorHandle; 222 // Context for mapping window XIDs to _GLFWwindow pointers 223 XContext context; 224 // XIM input method 225 XIM im; 226 // Most recent error code received by X error handler 227 int errorCode; 228 // Primary selection string (while the primary selection is owned) 229 char* primarySelectionString; 230 // Clipboard string (while the selection is owned) 231 char* clipboardString; 232 // Key name string 233 char keynames[GLFW_KEY_LAST + 1][5]; 234 // X11 keycode to GLFW key LUT 235 short int keycodes[256]; 236 // GLFW key to X11 keycode LUT 237 short int scancodes[GLFW_KEY_LAST + 1]; 238 // Where to place the cursor when re-enabled 239 double restoreCursorPosX, restoreCursorPosY; 240 // The window whose disabled cursor mode is active 241 _GLFWwindow* disabledCursorWindow; 242 243 // Window manager atoms 244 Atom NET_SUPPORTED; 245 Atom NET_SUPPORTING_WM_CHECK; 246 Atom WM_PROTOCOLS; 247 Atom WM_STATE; 248 Atom WM_DELETE_WINDOW; 249 Atom NET_WM_NAME; 250 Atom NET_WM_ICON_NAME; 251 Atom NET_WM_ICON; 252 Atom NET_WM_PID; 253 Atom NET_WM_PING; 254 Atom NET_WM_WINDOW_TYPE; 255 Atom NET_WM_WINDOW_TYPE_NORMAL; 256 Atom NET_WM_STATE; 257 Atom NET_WM_STATE_ABOVE; 258 Atom NET_WM_STATE_FULLSCREEN; 259 Atom NET_WM_STATE_MAXIMIZED_VERT; 260 Atom NET_WM_STATE_MAXIMIZED_HORZ; 261 Atom NET_WM_STATE_DEMANDS_ATTENTION; 262 Atom NET_WM_BYPASS_COMPOSITOR; 263 Atom NET_WM_FULLSCREEN_MONITORS; 264 Atom NET_WM_WINDOW_OPACITY; 265 Atom NET_WM_CM_Sx; 266 Atom NET_WORKAREA; 267 Atom NET_CURRENT_DESKTOP; 268 Atom NET_ACTIVE_WINDOW; 269 Atom NET_FRAME_EXTENTS; 270 Atom NET_REQUEST_FRAME_EXTENTS; 271 Atom MOTIF_WM_HINTS; 272 273 // Xdnd (drag and drop) atoms 274 Atom XdndAware; 275 Atom XdndEnter; 276 Atom XdndPosition; 277 Atom XdndStatus; 278 Atom XdndActionCopy; 279 Atom XdndDrop; 280 Atom XdndFinished; 281 Atom XdndSelection; 282 Atom XdndTypeList; 283 Atom text_uri_list; 284 285 // Selection (clipboard) atoms 286 Atom TARGETS; 287 Atom MULTIPLE; 288 Atom INCR; 289 Atom CLIPBOARD; 290 Atom PRIMARY; 291 Atom CLIPBOARD_MANAGER; 292 Atom SAVE_TARGETS; 293 Atom NULL_; 294 Atom UTF8_STRING; 295 Atom COMPOUND_STRING; 296 Atom ATOM_PAIR; 297 Atom GLFW_SELECTION; 298 299 struct { 300 GLFWbool available; 301 void* handle; 302 int eventBase; 303 int errorBase; 304 int major; 305 int minor; 306 GLFWbool gammaBroken; 307 GLFWbool monitorBroken; 308 PFN_XRRAllocGamma AllocGamma; 309 PFN_XRRFreeCrtcInfo FreeCrtcInfo; 310 PFN_XRRFreeGamma FreeGamma; 311 PFN_XRRFreeOutputInfo FreeOutputInfo; 312 PFN_XRRFreeScreenResources FreeScreenResources; 313 PFN_XRRGetCrtcGamma GetCrtcGamma; 314 PFN_XRRGetCrtcGammaSize GetCrtcGammaSize; 315 PFN_XRRGetCrtcInfo GetCrtcInfo; 316 PFN_XRRGetOutputInfo GetOutputInfo; 317 PFN_XRRGetOutputPrimary GetOutputPrimary; 318 PFN_XRRGetScreenResourcesCurrent GetScreenResourcesCurrent; 319 PFN_XRRQueryExtension QueryExtension; 320 PFN_XRRQueryVersion QueryVersion; 321 PFN_XRRSelectInput SelectInput; 322 PFN_XRRSetCrtcConfig SetCrtcConfig; 323 PFN_XRRSetCrtcGamma SetCrtcGamma; 324 PFN_XRRUpdateConfiguration UpdateConfiguration; 325 } randr; 326 327 struct { 328 GLFWbool available; 329 GLFWbool detectable; 330 int majorOpcode; 331 int eventBase; 332 int errorBase; 333 int major; 334 int minor; 335 unsigned int group; 336 } xkb; 337 338 struct { 339 int count; 340 int timeout; 341 int interval; 342 int blanking; 343 int exposure; 344 } saver; 345 346 struct { 347 int version; 348 Window source; 349 Atom format; 350 } xdnd; 351 352 struct { 353 void* handle; 354 PFN_XcursorImageCreate ImageCreate; 355 PFN_XcursorImageDestroy ImageDestroy; 356 PFN_XcursorImageLoadCursor ImageLoadCursor; 357 } xcursor; 358 359 struct { 360 GLFWbool available; 361 void* handle; 362 int major; 363 int minor; 364 PFN_XineramaIsActive IsActive; 365 PFN_XineramaQueryExtension QueryExtension; 366 PFN_XineramaQueryScreens QueryScreens; 367 } xinerama; 368 369 struct { 370 void* handle; 371 PFN_XGetXCBConnection GetXCBConnection; 372 } x11xcb; 373 374 struct { 375 GLFWbool available; 376 void* handle; 377 int eventBase; 378 int errorBase; 379 PFN_XF86VidModeQueryExtension QueryExtension; 380 PFN_XF86VidModeGetGammaRamp GetGammaRamp; 381 PFN_XF86VidModeSetGammaRamp SetGammaRamp; 382 PFN_XF86VidModeGetGammaRampSize GetGammaRampSize; 383 } vidmode; 384 385 struct { 386 GLFWbool available; 387 void* handle; 388 int majorOpcode; 389 int eventBase; 390 int errorBase; 391 int major; 392 int minor; 393 PFN_XIQueryVersion QueryVersion; 394 PFN_XISelectEvents SelectEvents; 395 } xi; 396 397 struct { 398 GLFWbool available; 399 void* handle; 400 int major; 401 int minor; 402 int eventBase; 403 int errorBase; 404 PFN_XRenderQueryExtension QueryExtension; 405 PFN_XRenderQueryVersion QueryVersion; 406 PFN_XRenderFindVisualFormat FindVisualFormat; 407 } xrender; 408 409 } _GLFWlibraryX11; 410 411 // X11-specific per-monitor data 412 // 413 typedef struct _GLFWmonitorX11 414 { 415 RROutput output; 416 RRCrtc crtc; 417 RRMode oldMode; 418 419 // Index of corresponding Xinerama screen, 420 // for EWMH full screen window placement 421 int index; 422 423 } _GLFWmonitorX11; 424 425 // X11-specific per-cursor data 426 // 427 typedef struct _GLFWcursorX11 428 { 429 Cursor handle; 430 431 } _GLFWcursorX11; 432 433 434 void _glfwPollMonitorsX11(void); 435 void _glfwSetVideoModeX11(_GLFWmonitor* monitor, const GLFWvidmode* desired); 436 void _glfwRestoreVideoModeX11(_GLFWmonitor* monitor); 437 438 Cursor _glfwCreateCursorX11(const GLFWimage* image, int xhot, int yhot); 439 440 unsigned long _glfwGetWindowPropertyX11(Window window, 441 Atom property, 442 Atom type, 443 unsigned char** value); 444 GLFWbool _glfwIsVisualTransparentX11(Visual* visual); 445 446 void _glfwGrabErrorHandlerX11(void); 447 void _glfwReleaseErrorHandlerX11(void); 448 void _glfwInputErrorX11(int error, const char* message); 449 450 void _glfwPushSelectionToManagerX11(void); 451