Vendor GLFW 3.5.1 and rebuild the host layer on it
sokol_app is X11-only on Linux. GLFW 3.5.1, vendored as source under vendor/glfw (no local patches; VENDOR.md records the tag, the archive hash and the file list), builds both the Wayland and the X11 backend into one archive and picks one at glfwInit. Every platform library (libwayland-client, libxkbcommon, libdecor, libX11 and friends, EGL, GLX) is loaded at run time by GLFW, so the Linux link-flags are now empty: -lX11 -lXi -lXcursor are gone from the consumer's binary.
app.c drives the same Sigil API (app-run, frame-, mouse-, key-*, quit-requested?, request-quit; run-game and wait-frame are untouched) over a GLFW window with a GL 4.1 core context, vsync on, and the frame loop calling the Scheme frame callback then swapping. Key and mouse state keep the sokol model (down / pressed-this-frame / released-this-frame; a repeat is not a new press). frame-width and frame-height are framebuffer pixels; mouse-x and mouse-y are scaled from window units into the same pixels, so a scaled Wayland output keeps one coordinate system.
sokol-compat.c keeps the five symbols sigil-graphics links from this package (sapp_width, sapp_height, sapp_get_environment, sapp_get_swapchain, slog_func) so a consumer relocks and nothing else changes; sokol_app.h stays vendored for those declarations only.
The Wayland protocol code is pre-generated with wayland-scanner and checked in. package.sgl's compile step is procedural so the GLFW source list and defines follow the config's target (Linux, Windows, darwin file lists; the windows-amd64 config cross-builds and its objects link into a PE with kernel32/user32/shell32/gdi32).
SIGIL_APP_PLATFORM=wayland|x11 forces the platform (for tests under a private compositor or X server); SIGIL_APP_VERBOSE=1 prints the platform, window and framebuffer sizes and the content scale.
package.sgl | 140 ++-
src/c/app-internal.h | 50 +-
src/c/app.c | 389 ++++--
src/c/sokol-app.c | 13 -
src/c/sokol-compat.c | 57 +
vendor/glfw/LICENSE.md | 23 +
vendor/glfw/VENDOR.md | 180 +++
vendor/glfw/deps/wayland/fractional-scale-v1.xml | 102 ++
vendor/glfw/deps/wayland/idle-inhibit-unstable-v1.xml | 83 ++
vendor/glfw/deps/wayland/pointer-constraints-unstable-v1.xml | 339 ++++++
vendor/glfw/deps/wayland/relative-pointer-unstable-v1.xml | 136 +++
vendor/glfw/deps/wayland/viewporter.xml | 180 +++
vendor/glfw/deps/wayland/wayland.xml | 3151 +++++++++++++++++++++++++++++++++++++++++++++++++
vendor/glfw/deps/wayland/xdg-activation-v1.xml | 200 ++++
vendor/glfw/deps/wayland/xdg-decoration-unstable-v1.xml | 156 +++
vendor/glfw/deps/wayland/xdg-shell.xml | 1370 ++++++++++++++++++++++
vendor/glfw/include/GLFW/glfw3.h | 6577 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
vendor/glfw/include/GLFW/glfw3native.h | 709 +++++++++++
vendor/glfw/src/cocoa_init.m | 662 +++++++++++
vendor/glfw/src/cocoa_joystick.h | 49 +
vendor/glfw/src/cocoa_joystick.m | 485 ++++++++
vendor/glfw/src/cocoa_monitor.m | 646 ++++++++++
vendor/glfw/src/cocoa_platform.h | 300 +++++
vendor/glfw/src/cocoa_window.m | 2091 +++++++++++++++++++++++++++++++++
vendor/glfw/src/context.c | 770 ++++++++++++
vendor/glfw/src/egl_context.c | 988 ++++++++++++++++
vendor/glfw/src/glx_context.c | 738 ++++++++++++
vendor/glfw/src/init.c | 528 +++++++++
vendor/glfw/src/input.c | 1519 ++++++++++++++++++++++++
vendor/glfw/src/internal.h | 1023 ++++++++++++++++
vendor/glfw/src/linux_joystick.c | 437 +++++++
vendor/glfw/src/linux_joystick.h | 64 +
vendor/glfw/src/macos_time.c | 57 +
vendor/glfw/src/macos_time.h | 35 +
vendor/glfw/src/mappings.h | 1001 ++++++++++++++++
vendor/glfw/src/monitor.c | 556 +++++++++
vendor/glfw/src/nsgl_context.m | 378 ++++++
vendor/glfw/src/null_init.c | 265 +++++
vendor/glfw/src/null_joystick.c | 56 +
vendor/glfw/src/null_joystick.h | 32 +
vendor/glfw/src/null_monitor.c | 160 +++
vendor/glfw/src/null_platform.h | 282 +++++
vendor/glfw/src/null_window.c | 749 ++++++++++++
vendor/glfw/src/osmesa_context.c | 384 ++++++
vendor/glfw/src/platform.c | 210 ++++
vendor/glfw/src/platform.h | 213 ++++
vendor/glfw/src/posix_module.c | 54 +
vendor/glfw/src/posix_poll.c | 83 ++
vendor/glfw/src/posix_poll.h | 30 +
vendor/glfw/src/posix_thread.c | 107 ++
vendor/glfw/src/posix_thread.h | 49 +
vendor/glfw/src/posix_time.c | 65 +
vendor/glfw/src/posix_time.h | 41 +
vendor/glfw/src/vulkan.c | 365 ++++++
vendor/glfw/src/wayland-protocols/fractional-scale-v1-client-protocol-code.h | 74 ++
vendor/glfw/src/wayland-protocols/fractional-scale-v1-client-protocol.h | 264 +++++
vendor/glfw/src/wayland-protocols/idle-inhibit-unstable-v1-client-protocol-code.h | 69 ++
vendor/glfw/src/wayland-protocols/idle-inhibit-unstable-v1-client-protocol.h | 232 ++++
vendor/glfw/src/wayland-protocols/pointer-constraints-unstable-v1-client-protocol-code.h | 109 ++
vendor/glfw/src/wayland-protocols/pointer-constraints-unstable-v1-client-protocol.h | 667 +++++++++++
vendor/glfw/src/wayland-protocols/relative-pointer-unstable-v1-client-protocol-code.h | 80 ++
vendor/glfw/src/wayland-protocols/relative-pointer-unstable-v1-client-protocol.h | 297 +++++
vendor/glfw/src/wayland-protocols/viewporter-client-protocol-code.h | 75 ++
vendor/glfw/src/wayland-protocols/viewporter-client-protocol.h | 398 +++++++
vendor/glfw/src/wayland-protocols/wayland-client-protocol-code.h | 525 +++++++++
vendor/glfw/src/wayland-protocols/wayland-client-protocol.h | 6236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
vendor/glfw/src/wayland-protocols/xdg-activation-v1-client-protocol-code.h | 85 ++
vendor/glfw/src/wayland-protocols/xdg-activation-v1-client-protocol.h | 415 +++++++
vendor/glfw/src/wayland-protocols/xdg-decoration-unstable-v1-client-protocol-code.h | 76 ++
vendor/glfw/src/wayland-protocols/xdg-decoration-unstable-v1-client-protocol.h | 378 ++++++
vendor/glfw/src/wayland-protocols/xdg-shell-client-protocol-code.h | 184 +++
vendor/glfw/src/wayland-protocols/xdg-shell-client-protocol.h | 2307 ++++++++++++++++++++++++++++++++++++
vendor/glfw/src/wgl_context.c | 786 +++++++++++++
vendor/glfw/src/win32_init.c | 712 +++++++++++
vendor/glfw/src/win32_joystick.c | 767 ++++++++++++
vendor/glfw/src/win32_joystick.h | 51 +
vendor/glfw/src/win32_module.c | 52 +
vendor/glfw/src/win32_monitor.c | 574 +++++++++
vendor/glfw/src/win32_platform.h | 567 +++++++++
vendor/glfw/src/win32_thread.c | 100 ++
vendor/glfw/src/win32_thread.h | 53 +
vendor/glfw/src/win32_time.c | 54 +
vendor/glfw/src/win32_time.h | 43 +
vendor/glfw/src/win32_window.c | 2584 ++++++++++++++++++++++++++++++++++++++++
vendor/glfw/src/window.c | 1198 +++++++++++++++++++
vendor/glfw/src/wl_init.c | 1019 ++++++++++++++++
vendor/glfw/src/wl_monitor.c | 277 +++++
vendor/glfw/src/wl_platform.h | 736 ++++++++++++
vendor/glfw/src/wl_window.c | 3620 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
vendor/glfw/src/x11_init.c | 1621 +++++++++++++++++++++++++
vendor/glfw/src/x11_monitor.c | 652 +++++++++++
vendor/glfw/src/x11_platform.h | 1005 ++++++++++++++++
vendor/glfw/src/x11_window.c | 3387 +++++++++++++++++++++++++++++++++++++++++++++++++++++
vendor/glfw/src/xkb_unicode.c | 943 +++++++++++++++
94 files changed, 62441 insertions(+), 158 deletions(-)package.sglmodified
;;; sigil-app - Application framework for Sigil;;; sigil-app - Desktop host layer for Sigil;;;;;; Provides windowing, input handling, and application lifecycle management;;; via sokol_app. This is the base package for interactive applications.;;; Window, GL context, input, frame clock and quit for interactive;;; applications, over GLFW (vendored under vendor/glfw). On Linux one;;; binary runs as a native Wayland client or under X11, picked at startup;;;; GLFW loads every platform library at runtime, so nothing;;; platform-specific is linked.;; ---- GLFW source lists, per target OS -------------------------------;;;; The lists mirror vendor/glfw/src/CMakeLists.txt (see vendor/glfw/VENDOR.md;; for the pin and the file inventory). Compile-time defines pick the;; platform backends; on Linux both _GLFW_X11 and _GLFW_WAYLAND are built;; into the one archive and glfwInit picks one at startup.(define glfw-common-sources '("vendor/glfw/src/context.c" "vendor/glfw/src/init.c" "vendor/glfw/src/input.c" "vendor/glfw/src/monitor.c" "vendor/glfw/src/platform.c" "vendor/glfw/src/vulkan.c" "vendor/glfw/src/window.c" "vendor/glfw/src/egl_context.c" "vendor/glfw/src/osmesa_context.c" "vendor/glfw/src/null_init.c" "vendor/glfw/src/null_monitor.c" "vendor/glfw/src/null_window.c" "vendor/glfw/src/null_joystick.c"))(define glfw-linux-sources '("vendor/glfw/src/posix_module.c" "vendor/glfw/src/posix_time.c" "vendor/glfw/src/posix_thread.c" "vendor/glfw/src/posix_poll.c" "vendor/glfw/src/linux_joystick.c" ;; X11 "vendor/glfw/src/x11_init.c" "vendor/glfw/src/x11_monitor.c" "vendor/glfw/src/x11_window.c" "vendor/glfw/src/xkb_unicode.c" "vendor/glfw/src/glx_context.c" ;; Wayland (protocol code pre-generated under src/wayland-protocols) "vendor/glfw/src/wl_init.c" "vendor/glfw/src/wl_monitor.c" "vendor/glfw/src/wl_window.c"))(define glfw-windows-sources '("vendor/glfw/src/win32_module.c" "vendor/glfw/src/win32_time.c" "vendor/glfw/src/win32_thread.c" "vendor/glfw/src/win32_init.c" "vendor/glfw/src/win32_joystick.c" "vendor/glfw/src/win32_monitor.c" "vendor/glfw/src/win32_window.c" "vendor/glfw/src/wgl_context.c"));; Listed and vendored; compiled only on darwin. No macOS build has run yet.(define glfw-darwin-sources '("vendor/glfw/src/posix_module.c" "vendor/glfw/src/posix_thread.c" "vendor/glfw/src/macos_time.c" "vendor/glfw/src/cocoa_init.m" "vendor/glfw/src/cocoa_joystick.m" "vendor/glfw/src/cocoa_monitor.m" "vendor/glfw/src/cocoa_window.m" "vendor/glfw/src/nsgl_context.m"))(define (glfw-sources os) (append glfw-common-sources (case os ((linux) glfw-linux-sources) ((windows) glfw-windows-sources) ((darwin) glfw-darwin-sources) ;; Other OSes: the null platform only (compiles; no window). (else '()))));; _DEFAULT_SOURCE: GLFW's own CMake adds it on Linux because -std=c99;; hides the POSIX 2008 declarations it uses. HAVE_MEMFD_CREATE: glibc;; has memfd_create; GLFW's CMake probes for it and defines the same.(define (glfw-defines os) (case os ((linux) '("-D_GLFW_X11" "-D_GLFW_WAYLAND" "-D_DEFAULT_SOURCE" "-DHAVE_MEMFD_CREATE")) ((windows) '("-D_GLFW_WIN32" "-DUNICODE" "-D_UNICODE")) ((darwin) '("-D_GLFW_COCOA")) (else '())))(define app-sources '("src/c/app.c" "src/c/sokol-compat.c"))(define app-include-dirs '("vendor/glfw/include" "vendor/sokol" "src/c"))(define app-flags '("-std=c99" "-D_GNU_SOURCE" "-Wno-unused-parameter"));; GLFW's own warning set is -Wall; its sources are compiled as they;; ship, with only the platform defines above (no local patches).;; -U_GNU_SOURCE: sigil's toolchain passes -D_GNU_SOURCE=1 to every C;; compile, and GLFW's posix_poll.c defines _GNU_SOURCE itself; the -U;; removes the toolchain's copy so the file compiles in the feature-macro;; environment upstream builds it in, without a redefinition warning.(define glfw-include-dirs '("vendor/glfw/include" "vendor/glfw/src/wayland-protocols"))(define glfw-flags '("-std=c99" "-Wall" "-Wno-unused-parameter" "-U_GNU_SOURCE"));; The compile steps, procedural so the GLFW source list and the platform;; defines follow the config's target rather than the host (the same;; reason link-flags below is a lambda). Both steps register their;; objects on the context; create-static-library archives them all.(define (compile-app ctx) ((compile-c-sources sources: app-sources include-dirs: app-include-dirs flags: (with-sigil-c-flags app-flags)) ctx))(define (compile-glfw ctx) (let ((os (target-os ctx))) ((compile-c-sources sources: (glfw-sources os) include-dirs: glfw-include-dirs flags: (append glfw-flags (glfw-defines os))) ctx)))(package name: "sigil-app" version: "0.9.0" sigil: "0.20" description: "Application framework for Sigil (windowing, input, lifecycle)" description: "Desktop host layer for Sigil (window, GL context, input, frame clock) over GLFW" url: "https://codeberg.org/sigil/sigil-app" license: "BSD-3-Clause" authors: (list "David Wilson <david@daviwil.com>") libraries: (list (library name: 'sigil-app c-sources: '("src/c/sokol-app.c" "src/c/app.c") c-include-dirs: '("vendor/sokol" "src/c") ;; The platform-independent files; the build task adds the GLFW ;; backend files for the config's target OS. c-sources: '("src/c/app.c" "src/c/sokol-compat.c") c-include-dirs: '("vendor/glfw/include" "vendor/sokol" "src/c") native-init: "sigil__init_sigil_app_module" ;; Platform-specific linker flags for sokol_app. ;; Platform linker flags. ;; ;; Linux: none. GLFW dlopens libwayland-client, libwayland-egl, ;; libxkbcommon, libdecor, libX11 and friends, libGL/libEGL at ;; runtime; dlopen and pthread are in libc on glibc 2.34+. ;; Windows: the Win32 system libraries GLFW's win32 backend calls ;; directly (DirectInput/XInput are loaded at runtime). ;; Darwin: the frameworks GLFW's Cocoa backend needs. ;; ;; Procedural (lambda ctx) form so cross-compile configs evaluate ;; the right branch at link time. (case (host-os) ...) was evaluated ;; cross builds. link-flags: (lambda (ctx) (case (target-os ctx) ((linux) '("-lX11" "-lXi" "-lXcursor")) ((darwin) '("-framework" "Cocoa" "-framework" "QuartzCore")) ((linux) '()) ((darwin) '("-framework" "Cocoa" "-framework" "IOKit" "-framework" "CoreFoundation" "-framework" "QuartzCore")) ((windows) '("-lkernel32" "-luser32" "-lshell32" "-lgdi32")) (else '()))))) name: 'build description: "Build sigil-app" steps: (list (compile-c-sources sources: '("src/c/sokol-app.c" "src/c/app.c") include-dirs: '("vendor/sokol" "src/c") flags: (with-sigil-c-flags '("-std=c99" "-D_GNU_SOURCE" "-DSOKOL_NO_ENTRY" "-DSOKOL_GLCORE" "-Wno-unused-parameter"))) compile-app compile-glfw (create-static-library name: "sigil-app") (compile-sigil-modules sources: "src/**/*.sgl" output-dir: (config-output-subdir "lib"))))))src/c/app-internal.hmodified
/* * app-internal.h - Internal header for Sigil App package * app-internal.h - Internal header for the Sigil desktop host layer * * Provides application state for windowing, input, and app lifecycle. * Application state for the window, GL context, input, frame clock and * quit handling. The host is GLFW (vendored under vendor/glfw); the * platform (Wayland or X11 on Linux, Win32, Cocoa) is picked at startup * and every platform library is loaded at runtime by GLFW itself. */#ifndef SIGIL_APP_INTERNAL_H#include <sigil/sigil.h>#include <stdbool.h>/* GLFW_KEY_LAST is 348; sokol_app's table was 512 and the key symbols * only ever map into the GLFW range, so the same size is kept. */#define SIGIL_APP_MAX_KEYS 512#define SIGIL_APP_MAX_MOUSE_BUTTONS 3struct GLFWwindow;/* * Application state */ Value frame_callback; Value cleanup_callback; /* The window and its GL context */ struct GLFWwindow *window; /* Sizes: the framebuffer in pixels (what GL draws into and what * frame-width/frame-height report), the window in screen units (what * GLFW reports cursor positions in). They differ on a scaled Wayland * output; framebuffer / window is the device pixel ratio. */ int fb_width; int fb_height; int win_width; int win_height; /* Frame timing */ double last_time; /* glfwGetTime() at the previous frame */ double frame_time; /* Seconds since last frame */ double time_elapsed; /* Seconds since app start */ /* Input state - current frame */ bool keys_down[512]; bool keys_pressed[512]; bool keys_released[512]; bool keys_down[SIGIL_APP_MAX_KEYS]; bool keys_pressed[SIGIL_APP_MAX_KEYS]; bool keys_released[SIGIL_APP_MAX_KEYS]; bool mouse_buttons[3]; bool mouse_pressed[3]; bool mouse_released[3]; float mouse_x; float mouse_y; bool mouse_buttons[SIGIL_APP_MAX_MOUSE_BUTTONS]; bool mouse_pressed[SIGIL_APP_MAX_MOUSE_BUTTONS]; bool mouse_released[SIGIL_APP_MAX_MOUSE_BUTTONS]; /* Cursor position in window (screen) units as GLFW reports it; * mouse-x / mouse-y scale it into framebuffer pixels on read. */ double cursor_x; double cursor_y; /* Quit handling */ bool quit_requested;void sigil_app_clear_frame_input(void);int sigil_app_key_code_from_symbol(SigilVM *vm, Value sym);/* Framebuffer size in pixels (1x1 before the window exists), for the * sokol_app compatibility shim in sokol-compat.c. */int sigil_app_framebuffer_width(void);int sigil_app_framebuffer_height(void);#endif /* SIGIL_APP_INTERNAL_H */src/c/app.cmodified
/* * app.c - Sigil App Module * * Wraps sokol_app.h to provide windowing, input, and application lifecycle. * The desktop host layer: window, GL context, input, frame clock and quit, * over GLFW (vendored under vendor/glfw). One binary runs as a native * Wayland client or under X11 on Linux, picked at startup; GLFW loads the * platform libraries (libwayland-client, libxkbcommon, libX11, libGL/EGL, * ...) with dlopen, so nothing platform-specific is linked. * * The exported Sigil API is the one sokol_app provided before: app-run, * frame-*, mouse-*, key-*, quit-requested?, request-quit. */#include "app-internal.h"#include "sigil-internal.h"/* Sokol headers (implementation is in sokol.c) */#include "sokol_app.h"#include "sokol_time.h"#include "sokol_log.h"/* No GL header: this layer never calls GL itself; sokol_gfx (in * sigil-graphics) brings its own. */#define GLFW_INCLUDE_NONE#include <GLFW/glfw3.h>#include <stdio.h>#include <stdlib.h> g_app->init_callback = SIGIL_FALSE; g_app->frame_callback = SIGIL_FALSE; g_app->cleanup_callback = SIGIL_FALSE; g_app->fb_width = 1; g_app->fb_height = 1; g_app->win_width = 1; g_app->win_height = 1;}void sigil_app_state_shutdown(void) memset(g_app->mouse_released, 0, sizeof(g_app->mouse_released));}int sigil_app_framebuffer_width(void){ return (g_app && g_app->fb_width > 0) ? g_app->fb_width : 1;}int sigil_app_framebuffer_height(void){ return (g_app && g_app->fb_height > 0) ? g_app->fb_height : 1;}/* * Convert Scheme key symbol to Sokol keycode * Convert Scheme key symbol to a GLFW key code (GLFW_KEY_UNKNOWN when the * symbol names no key). The symbol set is the one sokol_app had: letters, * digits, space, return/enter, escape/esc, tab, backspace, the arrows, * shift, ctrl/control, alt. */int sigil_app_key_code_from_symbol(SigilVM *vm, Value sym){ (void)vm; if (!sigil_is_symbol(sym)) return SAPP_KEYCODE_INVALID; if (!sigil_is_symbol(sym)) return GLFW_KEY_UNKNOWN; SigilSymbol *s = (SigilSymbol *)sigil_as_ptr(sym); const char *name = s->name; /* Letters */ if (s->length == 1 && name[0] >= 'a' && name[0] <= 'z') { return SAPP_KEYCODE_A + (name[0] - 'a'); return GLFW_KEY_A + (name[0] - 'a'); } /* Numbers */ if (s->length == 1 && name[0] >= '0' && name[0] <= '9') { return SAPP_KEYCODE_0 + (name[0] - '0'); return GLFW_KEY_0 + (name[0] - '0'); } /* Special keys */ if (strcmp(name, "space") == 0) return SAPP_KEYCODE_SPACE; if (strcmp(name, "return") == 0 || strcmp(name, "enter") == 0) return SAPP_KEYCODE_ENTER; if (strcmp(name, "escape") == 0 || strcmp(name, "esc") == 0) return SAPP_KEYCODE_ESCAPE; if (strcmp(name, "tab") == 0) return SAPP_KEYCODE_TAB; if (strcmp(name, "backspace") == 0) return SAPP_KEYCODE_BACKSPACE; if (strcmp(name, "space") == 0) return GLFW_KEY_SPACE; if (strcmp(name, "return") == 0 || strcmp(name, "enter") == 0) return GLFW_KEY_ENTER; if (strcmp(name, "escape") == 0 || strcmp(name, "esc") == 0) return GLFW_KEY_ESCAPE; if (strcmp(name, "tab") == 0) return GLFW_KEY_TAB; if (strcmp(name, "backspace") == 0) return GLFW_KEY_BACKSPACE; /* Arrow keys */ if (strcmp(name, "left") == 0) return SAPP_KEYCODE_LEFT; if (strcmp(name, "right") == 0) return SAPP_KEYCODE_RIGHT; if (strcmp(name, "up") == 0) return SAPP_KEYCODE_UP; if (strcmp(name, "down") == 0) return SAPP_KEYCODE_DOWN; if (strcmp(name, "left") == 0) return GLFW_KEY_LEFT; if (strcmp(name, "right") == 0) return GLFW_KEY_RIGHT; if (strcmp(name, "up") == 0) return GLFW_KEY_UP; if (strcmp(name, "down") == 0) return GLFW_KEY_DOWN; /* Modifiers */ if (strcmp(name, "shift") == 0) return SAPP_KEYCODE_LEFT_SHIFT; if (strcmp(name, "ctrl") == 0 || strcmp(name, "control") == 0) return SAPP_KEYCODE_LEFT_CONTROL; if (strcmp(name, "alt") == 0) return SAPP_KEYCODE_LEFT_ALT; if (strcmp(name, "shift") == 0) return GLFW_KEY_LEFT_SHIFT; if (strcmp(name, "ctrl") == 0 || strcmp(name, "control") == 0) return GLFW_KEY_LEFT_CONTROL; if (strcmp(name, "alt") == 0) return GLFW_KEY_LEFT_ALT; return SAPP_KEYCODE_INVALID; return GLFW_KEY_UNKNOWN;}/* SigilSymbol *s = (SigilSymbol *)sigil_as_ptr(sym); const char *name = s->name; if (strcmp(name, "left") == 0) return 0; if (strcmp(name, "right") == 0) return 1; if (strcmp(name, "middle") == 0) return 2; if (strcmp(name, "left") == 0) return GLFW_MOUSE_BUTTON_LEFT; if (strcmp(name, "right") == 0) return GLFW_MOUSE_BUTTON_RIGHT; if (strcmp(name, "middle") == 0) return GLFW_MOUSE_BUTTON_MIDDLE; return -1;}/* ============================================================ * SOKOL CALLBACKS * GLFW CALLBACKS * ============================================================ */static uint64_t last_time = 0;/* Check for VM errors and print them */static void check_vm_error(const char *context){ if (err) { fprintf(stderr, "Scheme error in %s: %s\n", context, err); sigil_error_clear(g_app->vm); sapp_request_quit(); if (g_app->window) glfwSetWindowShouldClose(g_app->window, GLFW_TRUE); }}static void app_init(void)static void glfw_error_callback(int code, const char *description){ stm_setup(); last_time = stm_now(); fprintf(stderr, "sigil-app: GLFW error 0x%X: %s\n", code, description);} if (g_app && !sigil_is_false(g_app->init_callback)) { sigil_apply0(g_app->vm, g_app->init_callback); check_vm_error("init");static void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods){ (void)window; (void)scancode; (void)mods; if (!g_app) return; if (key < 0 || key >= SIGIL_APP_MAX_KEYS) return; if (action == GLFW_PRESS || action == GLFW_REPEAT) { /* A repeat is a held key, not a new press: pressed? fires once. */ if (!g_app->keys_down[key]) { g_app->keys_pressed[key] = true; } g_app->keys_down[key] = true; } else if (action == GLFW_RELEASE) { g_app->keys_down[key] = false; g_app->keys_released[key] = true; }}static void app_frame(void)static void mouse_button_callback(GLFWwindow *window, int button, int action, int mods){ /* Calculate frame time */ uint64_t now = stm_now(); g_app->frame_time = stm_sec(stm_diff(now, last_time)); g_app->time_elapsed += g_app->frame_time; last_time = now; (void)window; (void)mods; if (!g_app) return; if (button < 0 || button >= SIGIL_APP_MAX_MOUSE_BUTTONS) return; /* Call Scheme frame callback with delta time */ if (g_app && !sigil_is_false(g_app->frame_callback)) { Value dt = sigil_flonum(g_app->frame_time); sigil_apply1(g_app->vm, g_app->frame_callback, dt); check_vm_error("frame"); if (action == GLFW_PRESS) { if (!g_app->mouse_buttons[button]) { g_app->mouse_pressed[button] = true; } g_app->mouse_buttons[button] = true; } else if (action == GLFW_RELEASE) { g_app->mouse_buttons[button] = false; g_app->mouse_released[button] = true; }} /* Clear per-frame input state for next frame */ sigil_app_clear_frame_input();static void cursor_pos_callback(GLFWwindow *window, double x, double y){ (void)window; if (!g_app) return; g_app->cursor_x = x; g_app->cursor_y = y;}static void app_cleanup(void)static void window_close_callback(GLFWwindow *window){ if (g_app && !sigil_is_false(g_app->cleanup_callback)) { sigil_apply0(g_app->vm, g_app->cleanup_callback); check_vm_error("cleanup"); } (void)window; if (!g_app) return; /* The window manager asked; the game sees (quit-requested?) => #t * and the loop ends after this frame, as with sokol_app's * QUIT_REQUESTED event. */ g_app->quit_requested = true;}static void app_event(const sapp_event *ev)static void framebuffer_size_callback(GLFWwindow *window, int width, int height){ (void)window; if (!g_app) return; g_app->fb_width = width; g_app->fb_height = height;} switch (ev->type) { case SAPP_EVENTTYPE_KEY_DOWN: if (ev->key_code < 512) { if (!g_app->keys_down[ev->key_code]) { g_app->keys_pressed[ev->key_code] = true; } g_app->keys_down[ev->key_code] = true; } break;static void window_size_callback(GLFWwindow *window, int width, int height){ (void)window; if (!g_app) return; g_app->win_width = width; g_app->win_height = height;} case SAPP_EVENTTYPE_KEY_UP: if (ev->key_code < 512) { g_app->keys_down[ev->key_code] = false; g_app->keys_released[ev->key_code] = true; } break; case SAPP_EVENTTYPE_MOUSE_DOWN: if (ev->mouse_button < 3) { if (!g_app->mouse_buttons[ev->mouse_button]) { g_app->mouse_pressed[ev->mouse_button] = true; } g_app->mouse_buttons[ev->mouse_button] = true; } break;/* Cursor position scaled from window units into framebuffer pixels, so * mouse-x/mouse-y and frame-width/frame-height share one coordinate * system whatever the output scale is. */static double cursor_to_fb_x(void){ if (!g_app || g_app->win_width <= 0) return 0.0; return g_app->cursor_x * ((double)g_app->fb_width / (double)g_app->win_width);} case SAPP_EVENTTYPE_MOUSE_UP: if (ev->mouse_button < 3) { g_app->mouse_buttons[ev->mouse_button] = false; g_app->mouse_released[ev->mouse_button] = true;static double cursor_to_fb_y(void){ if (!g_app || g_app->win_height <= 0) return 0.0; return g_app->cursor_y * ((double)g_app->fb_height / (double)g_app->win_height);}/* ============================================================ * PLATFORM SELECTION * ============================================================ *//* * GLFW picks Wayland when XDG_SESSION_TYPE=wayland and WAYLAND_DISPLAY is * set, X11 when XDG_SESSION_TYPE=x11 and DISPLAY is set, and otherwise * tries Wayland then X11. SIGIL_APP_PLATFORM=wayland|x11 forces one, for * tests that run under a private compositor or X server and for users * whose session variables lie. */static void apply_platform_hint(void){ const char *want = getenv("SIGIL_APP_PLATFORM"); if (!want || !*want) return; if (strcmp(want, "wayland") == 0) { glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_WAYLAND); } else if (strcmp(want, "x11") == 0) { glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_X11); } else if (strcmp(want, "win32") == 0) { glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_WIN32); } else if (strcmp(want, "cocoa") == 0) { glfwInitHint(GLFW_PLATFORM, GLFW_PLATFORM_COCOA); } else { fprintf(stderr, "sigil-app: SIGIL_APP_PLATFORM=%s is not one of wayland, x11, win32, cocoa; ignored\n", want); }}static const char *platform_name(int platform){ switch (platform) { case GLFW_PLATFORM_WAYLAND: return "wayland"; case GLFW_PLATFORM_X11: return "x11"; case GLFW_PLATFORM_WIN32: return "win32"; case GLFW_PLATFORM_COCOA: return "cocoa"; case GLFW_PLATFORM_NULL: return "null"; default: return "unknown"; }}/* ============================================================ * MAIN LOOP * ============================================================ */static void run_main_loop(const char *title, int width, int height){ glfwSetErrorCallback(glfw_error_callback); apply_platform_hint(); if (!glfwInit()) { fprintf(stderr, "sigil-app: glfwInit failed; no usable display platform\n"); return; } /* GL 4.1 core, the profile sokol_app asked for (and the newest macOS * offers). Forward-compat is required by macOS for core profiles and * harmless elsewhere. Depth 24 / stencil 8 are GLFW's defaults and * match the sokol_app swapchain the graphics layer expects. */ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE); glfwWindowHint(GLFW_SCALE_FRAMEBUFFER, GLFW_TRUE); GLFWwindow *window = glfwCreateWindow(width, height, title, NULL, NULL); if (!window) { fprintf(stderr, "sigil-app: window creation failed (platform %s)\n", platform_name(glfwGetPlatform())); glfwTerminate(); return; } g_app->window = window; glfwMakeContextCurrent(window); glfwSwapInterval(1); glfwGetFramebufferSize(window, &g_app->fb_width, &g_app->fb_height); glfwGetWindowSize(window, &g_app->win_width, &g_app->win_height); glfwGetCursorPos(window, &g_app->cursor_x, &g_app->cursor_y); if (getenv("SIGIL_APP_VERBOSE")) { float sx = 1.0f, sy = 1.0f; glfwGetWindowContentScale(window, &sx, &sy); fprintf(stderr, "sigil-app: platform=%s window=%dx%d framebuffer=%dx%d content-scale=%.2fx%.2f gl=%s\n", platform_name(glfwGetPlatform()), g_app->win_width, g_app->win_height, g_app->fb_width, g_app->fb_height, sx, sy, glfwGetWindowAttrib(window, GLFW_CONTEXT_VERSION_MAJOR) == 4 ? "4.x" : "other"); } glfwSetKeyCallback(window, key_callback); glfwSetMouseButtonCallback(window, mouse_button_callback); glfwSetCursorPosCallback(window, cursor_pos_callback); glfwSetWindowCloseCallback(window, window_close_callback); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); glfwSetWindowSizeCallback(window, window_size_callback); /* init */ g_app->last_time = glfwGetTime(); if (!sigil_is_false(g_app->init_callback)) { sigil_apply0(g_app->vm, g_app->init_callback); check_vm_error("init"); } /* frames */ while (!glfwWindowShouldClose(window)) { glfwPollEvents(); double now = glfwGetTime(); g_app->frame_time = now - g_app->last_time; g_app->time_elapsed += g_app->frame_time; g_app->last_time = now; if (!sigil_is_false(g_app->frame_callback)) { Value dt = sigil_flonum(g_app->frame_time); sigil_apply1(g_app->vm, g_app->frame_callback, dt); check_vm_error("frame"); } break; case SAPP_EVENTTYPE_MOUSE_MOVE: g_app->mouse_x = ev->mouse_x; g_app->mouse_y = ev->mouse_y; break; /* The frame is drawn; present it. */ glfwSwapBuffers(window); case SAPP_EVENTTYPE_QUIT_REQUESTED: g_app->quit_requested = true; break; /* Clear per-frame input state for next frame */ sigil_app_clear_frame_input(); } default: break; /* cleanup */ if (!sigil_is_false(g_app->cleanup_callback)) { sigil_apply0(g_app->vm, g_app->cleanup_callback); check_vm_error("cleanup"); } g_app->window = NULL; glfwDestroyWindow(window); glfwTerminate();}/* ============================================================ height = (int)sigil_as_fixnum(args[5]); } /* Configure and run Sokol app */ sapp_desc desc = { .init_cb = app_init, .frame_cb = app_frame, .cleanup_cb = app_cleanup, .event_cb = app_event, .width = width, .height = height, .window_title = title, .icon.sokol_default = true, .logger.func = slog_func, }; sapp_run(&desc); run_main_loop(title, width, height); /* Cleanup */ sigil_app_state_shutdown();}/* * (frame-width) -> integer * (frame-width) -> integer, framebuffer pixels */static Value native_frame_width(SigilVM *vm, int argc, Value *args){ (void)vm; (void)argc; (void)args; return sigil_fixnum(sapp_width()); return sigil_fixnum(sigil_app_framebuffer_width());}/* * (frame-height) -> integer * (frame-height) -> integer, framebuffer pixels */static Value native_frame_height(SigilVM *vm, int argc, Value *args){ (void)vm; (void)argc; (void)args; return sigil_fixnum(sapp_height()); return sigil_fixnum(sigil_app_framebuffer_height());}/*}/* * (mouse-x) -> float * (mouse-x) -> float, framebuffer pixels */static Value native_mouse_x(SigilVM *vm, int argc, Value *args){ (void)vm; (void)argc; (void)args; if (!g_app) return sigil_flonum(0.0); return sigil_flonum(g_app->mouse_x);Showing the first 500 of 561 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
src/c/sokol-app.cdeleted
/* * sokol.c - Sokol implementation for sigil-app * * Implements sokol_app, sokol_time, and sokol_log. * Note: sokol_glue is in sigil-graphics since it bridges app and gfx. */#define SOKOL_IMPL/* SOKOL_GLCORE is defined via compiler flags */#include "sokol_app.h"#include "sokol_time.h"#include "sokol_log.h"src/c/sokol-compat.cadded
/* * sokol-compat.c - the sokol_app symbols sigil-graphics still links against * * The window no longer comes from sokol_app (see app.c: it is GLFW now), but * sigil-graphics' vendored sokol_glue.h calls sapp_get_environment() and * sapp_get_swapchain(), its graphics.c calls sapp_width()/sapp_height(), and * every sokol_gfx logger points at slog_func from sokol_log.h. This file * implements exactly those five symbols over the GLFW host state so a * consumer relocks sigil-app and nothing else changes. The types come from * the vendored sokol_app.h, included for declarations only (no SOKOL_IMPL), * so the struct layouts match what sigil-graphics compiled against. * * The values are the ones sokol_app's GL backend reported: RGBA8 colour, * a combined depth-stencil buffer (GLFW's default framebuffer is 24/8), no * MSAA, GL framebuffer 0. */#include "app-internal.h"#include <string.h>#define SOKOL_LOG_IMPL#include "sokol_log.h"#include "sokol_app.h"SOKOL_API_IMPL int sapp_width(void){ return sigil_app_framebuffer_width();}SOKOL_API_IMPL int sapp_height(void){ return sigil_app_framebuffer_height();}SOKOL_API_IMPL sapp_environment sapp_get_environment(void){ sapp_environment env; memset(&env, 0, sizeof(env)); env.defaults.color_format = SAPP_PIXELFORMAT_RGBA8; env.defaults.depth_format = SAPP_PIXELFORMAT_DEPTH_STENCIL; env.defaults.sample_count = 1; return env;}SOKOL_API_IMPL sapp_swapchain sapp_get_swapchain(void){ sapp_swapchain sc; memset(&sc, 0, sizeof(sc)); sc.width = sigil_app_framebuffer_width(); sc.height = sigil_app_framebuffer_height(); sc.sample_count = 1; sc.color_format = SAPP_PIXELFORMAT_RGBA8; sc.depth_format = SAPP_PIXELFORMAT_DEPTH_STENCIL; sc.gl.framebuffer = 0; return sc;}vendor/glfw/LICENSE.mdadded
Copyright (c) 2002-2006 Marcus GeelnardCopyright (c) 2006-2019 Camilla LöwyThis software is provided 'as-is', without any express or impliedwarranty. In no event will the authors be held liable for any damagesarising from the use of this software.Permission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute itfreely, subject to the following restrictions:1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.3. This notice may not be removed or altered from any source distribution.vendor/glfw/VENDOR.mdadded
# Vendored GLFW- Upstream: https://github.com/glfw/glfw- Tag: `3.5.1` (released 2026-07-31; there is no 3.5.0 release, see upstream `docs/news.md`)- Source archive: `https://github.com/glfw/glfw/archive/refs/tags/3.5.1.tar.gz`, sha256 `5234f4f29473e9a06bc7847d8371858dd135d38466eeeaa652fdc9f8f9ff0c20`- License: zlib/libpng, `LICENSE.md` (copied from the archive root)## RuleNo local patches. Every file under `include/`, `src/` (except`src/wayland-protocols/`) and `deps/` is byte-identical to the file of thesame path in the tagged archive. Configuration is done with compile-timedefines in `package.sgl` only (`_GLFW_X11`, `_GLFW_WAYLAND`, `_GLFW_WIN32`,`_GLFW_COCOA`, `_DEFAULT_SOURCE`, `HAVE_MEMFD_CREATE`, `UNICODE`).Upgrade by replacing the directory from a newer tag, regenerating`src/wayland-protocols/`, and updating this file.Re-derive the identity check:```shcurl -sSL -o /tmp/glfw.tar.gz https://github.com/glfw/glfw/archive/refs/tags/3.5.1.tar.gzsha256sum /tmp/glfw.tar.gz # 5234f4f2...tar xzf /tmp/glfw.tar.gz -C /tmpfor f in $(cd vendor/glfw && find include src deps LICENSE.md -type f | grep -v wayland-protocols); do cmp vendor/glfw/$f /tmp/glfw-3.5.1/$f || echo "DIFFERS $f"done```## What is vendored, and whyThe file selection follows `src/CMakeLists.txt` in the archive:- **common** (every platform): `context.c init.c input.c monitor.c platform.c vulkan.c window.c egl_context.c osmesa_context.c null_init.c null_monitor.c null_window.c null_joystick.c` and the headers `internal.h platform.h mappings.h null_platform.h null_joystick.h`.- **Linux** (`_GLFW_X11` + `_GLFW_WAYLAND`, both in one archive, picked at `glfwInit`): `posix_module.c posix_time.c posix_thread.c posix_poll.c linux_joystick.c`; X11 `x11_init.c x11_monitor.c x11_window.c xkb_unicode.c glx_context.c`; Wayland `wl_init.c wl_monitor.c wl_window.c`; headers `posix_*.h linux_joystick.h x11_platform.h wl_platform.h`.- **Windows** (`_GLFW_WIN32`): `win32_module.c win32_time.c win32_thread.c win32_init.c win32_joystick.c win32_monitor.c win32_window.c wgl_context.c`; headers `win32_*.h`.- **macOS** (`_GLFW_COCOA`; listed and vendored, compiled only for a darwin target, which no build has exercised yet): `posix_module.c posix_thread.c macos_time.c cocoa_init.m cocoa_joystick.m cocoa_monitor.m cocoa_window.m nsgl_context.m`; headers `macos_time.h cocoa_platform.h cocoa_joystick.h`.- **public headers**: `include/GLFW/glfw3.h`, `include/GLFW/glfw3native.h`.- **Wayland protocols**: the nine XML files under `deps/wayland/` as shipped, and under `src/wayland-protocols/` the C generated from them with `wayland-scanner 1.24.0` (`client-header` and `private-code` per XML, the exact commands GLFW's CMake runs). They are checked in so no consumer needs `wayland-scanner`. Regenerate with: ```sh cd vendor/glfw/src/wayland-protocols for x in ../../deps/wayland/*.xml; do b=$(basename $x .xml) wayland-scanner client-header $x $b-client-protocol.h wayland-scanner private-code $x $b-client-protocol-code.h done ```Not vendored: `CMake/`, `docs/`, `examples/`, `tests/`, `deps/` otherthan `wayland/`, `src/CMakeLists.txt`, `src/glfw.rc.in`, `src/mappings.h.in`.## Compile-time headers a build needsGLFW loads every platform library with `dlopen` at run time, but itsbackends still compile against the platform headers. A Linux build ofthis package needs the X11 headers (`libx11 libxcursor libxrandrlibxinerama libxi libxext xorgproto` in Guix), `wayland-client-core.h`(`wayland`) and `xkbcommon/xkbcommon.h` (`libxkbcommon`). No GL/EGL headers:GLFW declares its own GLX/EGL types, and `app.c` includes `glfw3.h` with`GLFW_INCLUDE_NONE`.## Runtime libraries GLFW loads (Linux)Wayland: `libwayland-client.so.0`, `libwayland-cursor.so.0`,`libwayland-egl.so.1`, `libxkbcommon.so.0`, `libEGL.so.1`, and optionally`libdecor-0.so.0` (client-side decorations where the compositor has noxdg-decoration). X11: `libX11.so.6`, and optionally `libXi`, `libXrandr`,`libXcursor`, `libXinerama`, `libXrender`, `libXext`, `libX11-xcb`,`libXxf86vm`; `libGL.so.1` for GLX.## File inventory (88 files, plus this one) LICENSE.md deps/wayland/fractional-scale-v1.xml deps/wayland/idle-inhibit-unstable-v1.xml deps/wayland/pointer-constraints-unstable-v1.xml deps/wayland/relative-pointer-unstable-v1.xml deps/wayland/viewporter.xml deps/wayland/wayland.xml deps/wayland/xdg-activation-v1.xml deps/wayland/xdg-decoration-unstable-v1.xml deps/wayland/xdg-shell.xml include/GLFW/glfw3.h include/GLFW/glfw3native.h src/cocoa_init.m src/cocoa_joystick.h src/cocoa_joystick.m src/cocoa_monitor.m src/cocoa_platform.h src/cocoa_window.m src/context.c src/egl_context.c src/glx_context.c src/init.c src/input.c src/internal.h src/linux_joystick.c src/linux_joystick.h src/macos_time.c src/macos_time.h src/mappings.h src/monitor.c src/nsgl_context.m src/null_init.c src/null_joystick.c src/null_joystick.h src/null_monitor.c src/null_platform.h src/null_window.c src/osmesa_context.c src/platform.c src/platform.h src/posix_module.c src/posix_poll.c src/posix_poll.h src/posix_thread.c src/posix_thread.h src/posix_time.c src/posix_time.h src/vulkan.c src/wayland-protocols/fractional-scale-v1-client-protocol-code.h src/wayland-protocols/fractional-scale-v1-client-protocol.h src/wayland-protocols/idle-inhibit-unstable-v1-client-protocol-code.h src/wayland-protocols/idle-inhibit-unstable-v1-client-protocol.h src/wayland-protocols/pointer-constraints-unstable-v1-client-protocol-code.h src/wayland-protocols/pointer-constraints-unstable-v1-client-protocol.h src/wayland-protocols/relative-pointer-unstable-v1-client-protocol-code.h src/wayland-protocols/relative-pointer-unstable-v1-client-protocol.h src/wayland-protocols/viewporter-client-protocol-code.h src/wayland-protocols/viewporter-client-protocol.h src/wayland-protocols/wayland-client-protocol-code.h src/wayland-protocols/wayland-client-protocol.h src/wayland-protocols/xdg-activation-v1-client-protocol-code.h src/wayland-protocols/xdg-activation-v1-client-protocol.h src/wayland-protocols/xdg-decoration-unstable-v1-client-protocol-code.h src/wayland-protocols/xdg-decoration-unstable-v1-client-protocol.h src/wayland-protocols/xdg-shell-client-protocol-code.h src/wayland-protocols/xdg-shell-client-protocol.h src/wgl_context.c src/win32_init.c src/win32_joystick.c src/win32_joystick.h src/win32_module.c src/win32_monitor.c src/win32_platform.h src/win32_thread.c src/win32_thread.h src/win32_time.c src/win32_time.h src/win32_window.c src/window.c src/wl_init.c src/wl_monitor.c src/wl_platform.h src/wl_window.c src/x11_init.c src/x11_monitor.c src/x11_platform.h src/x11_window.c src/xkb_unicode.cvendor/glfw/deps/wayland/fractional-scale-v1.xmladded
<?xml version="1.0" encoding="UTF-8"?><protocol name="fractional_scale_v1"> <copyright> Copyright © 2022 Kenny Levinsen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </copyright> <description summary="Protocol for requesting fractional surface scales"> This protocol allows a compositor to suggest for surfaces to render at fractional scales. A client can submit scaled content by utilizing wp_viewport. This is done by creating a wp_viewport object for the surface and setting the destination rectangle to the surface size before the scale factor is applied. The buffer size is calculated by multiplying the surface size by the intended scale. The wl_surface buffer scale should remain set to 1. If a surface has a surface-local size of 100 px by 50 px and wishes to submit buffers with a scale of 1.5, then a buffer of 150px by 75 px should be used and the wp_viewport destination rectangle should be 100 px by 50 px. For toplevel surfaces, the size is rounded halfway away from zero. The rounding algorithm for subsurface position and size is not defined. </description> <interface name="wp_fractional_scale_manager_v1" version="1"> <description summary="fractional surface scale information"> A global interface for requesting surfaces to use fractional scales. </description> <request name="destroy" type="destructor"> <description summary="unbind the fractional surface scale interface"> Informs the server that the client will not be using this protocol object anymore. This does not affect any other objects, wp_fractional_scale_v1 objects included. </description> </request> <enum name="error"> <entry name="fractional_scale_exists" value="0" summary="the surface already has a fractional_scale object associated"/> </enum> <request name="get_fractional_scale"> <description summary="extend surface interface for scale information"> Create an add-on object for the the wl_surface to let the compositor request fractional scales. If the given wl_surface already has a wp_fractional_scale_v1 object associated, the fractional_scale_exists protocol error is raised. </description> <arg name="id" type="new_id" interface="wp_fractional_scale_v1" summary="the new surface scale info interface id"/> <arg name="surface" type="object" interface="wl_surface" summary="the surface"/> </request> </interface> <interface name="wp_fractional_scale_v1" version="1"> <description summary="fractional scale interface to a wl_surface"> An additional interface to a wl_surface object which allows the compositor to inform the client of the preferred scale. </description> <request name="destroy" type="destructor"> <description summary="remove surface scale information for surface"> Destroy the fractional scale object. When this object is destroyed, preferred_scale events will no longer be sent. </description> </request> <event name="preferred_scale"> <description summary="notify of new preferred scale"> Notification of a new preferred scale for this surface that the compositor suggests that the client should use. The sent scale is the numerator of a fraction with a denominator of 120. </description> <arg name="scale" type="uint" summary="the new preferred scale"/> </event> </interface></protocol>vendor/glfw/deps/wayland/idle-inhibit-unstable-v1.xmladded
<?xml version="1.0" encoding="UTF-8"?><protocol name="idle_inhibit_unstable_v1"> <copyright> Copyright © 2015 Samsung Electronics Co., Ltd Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </copyright> <interface name="zwp_idle_inhibit_manager_v1" version="1"> <description summary="control behavior when display idles"> This interface permits inhibiting the idle behavior such as screen blanking, locking, and screensaving. The client binds the idle manager globally, then creates idle-inhibitor objects for each surface. Warning! The protocol described in this file is experimental and backward incompatible changes may be made. Backward compatible changes may be added together with the corresponding interface version bump. Backward incompatible changes are done by bumping the version number in the protocol and interface names and resetting the interface version. Once the protocol is to be declared stable, the 'z' prefix and the version number in the protocol and interface names are removed and the interface version number is reset. </description> <request name="destroy" type="destructor"> <description summary="destroy the idle inhibitor object"> Destroy the inhibit manager. </description> </request> <request name="create_inhibitor"> <description summary="create a new inhibitor object"> Create a new inhibitor object associated with the given surface. </description> <arg name="id" type="new_id" interface="zwp_idle_inhibitor_v1"/> <arg name="surface" type="object" interface="wl_surface" summary="the surface that inhibits the idle behavior"/> </request> </interface> <interface name="zwp_idle_inhibitor_v1" version="1"> <description summary="context object for inhibiting idle behavior"> An idle inhibitor prevents the output that the associated surface is visible on from being set to a state where it is not visually usable due to lack of user interaction (e.g. blanked, dimmed, locked, set to power save, etc.) Any screensaver processes are also blocked from displaying. If the surface is destroyed, unmapped, becomes occluded, loses visibility, or otherwise becomes not visually relevant for the user, the idle inhibitor will not be honored by the compositor; if the surface subsequently regains visibility the inhibitor takes effect once again. Likewise, the inhibitor isn't honored if the system was already idled at the time the inhibitor was established, although if the system later de-idles and re-idles the inhibitor will take effect. </description> <request name="destroy" type="destructor"> <description summary="destroy the idle inhibitor object"> Remove the inhibitor effect from the associated wl_surface. </description> </request> </interface></protocol>vendor/glfw/deps/wayland/pointer-constraints-unstable-v1.xmladded
<?xml version="1.0" encoding="UTF-8"?><protocol name="pointer_constraints_unstable_v1"> <copyright> Copyright © 2014 Jonas Ådahl Copyright © 2015 Red Hat Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </copyright> <description summary="protocol for constraining pointer motions"> This protocol specifies a set of interfaces used for adding constraints to the motion of a pointer. Possible constraints include confining pointer motions to a given region, or locking it to its current position. In order to constrain the pointer, a client must first bind the global interface "wp_pointer_constraints" which, if a compositor supports pointer constraints, is exposed by the registry. Using the bound global object, the client uses the request that corresponds to the type of constraint it wants to make. See wp_pointer_constraints for more details. Warning! The protocol described in this file is experimental and backward incompatible changes may be made. Backward compatible changes may be added together with the corresponding interface version bump. Backward incompatible changes are done by bumping the version number in the protocol and interface names and resetting the interface version. Once the protocol is to be declared stable, the 'z' prefix and the version number in the protocol and interface names are removed and the interface version number is reset. </description> <interface name="zwp_pointer_constraints_v1" version="1"> <description summary="constrain the movement of a pointer"> The global interface exposing pointer constraining functionality. It exposes two requests: lock_pointer for locking the pointer to its position, and confine_pointer for locking the pointer to a region. The lock_pointer and confine_pointer requests create the objects wp_locked_pointer and wp_confined_pointer respectively, and the client can use these objects to interact with the lock. For any surface, only one lock or confinement may be active across all wl_pointer objects of the same seat. If a lock or confinement is requested when another lock or confinement is active or requested on the same surface and with any of the wl_pointer objects of the same seat, an 'already_constrained' error will be raised. </description> <enum name="error"> <description summary="wp_pointer_constraints error values"> These errors can be emitted in response to wp_pointer_constraints requests. </description> <entry name="already_constrained" value="1" summary="pointer constraint already requested on that surface"/> </enum> <enum name="lifetime"> <description summary="constraint lifetime"> These values represent different lifetime semantics. They are passed as arguments to the factory requests to specify how the constraint lifetimes should be managed. </description> <entry name="oneshot" value="1"> <description summary="the pointer constraint is defunct once deactivated"> A oneshot pointer constraint will never reactivate once it has been deactivated. See the corresponding deactivation event (wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) for details. </description> </entry> <entry name="persistent" value="2"> <description summary="the pointer constraint may reactivate"> A persistent pointer constraint may again reactivate once it has been deactivated. See the corresponding deactivation event (wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) for details. </description> </entry> </enum> <request name="destroy" type="destructor"> <description summary="destroy the pointer constraints manager object"> Used by the client to notify the server that it will no longer use this pointer constraints object. </description> </request> <request name="lock_pointer"> <description summary="lock pointer to a position"> The lock_pointer request lets the client request to disable movements of the virtual pointer (i.e. the cursor), effectively locking the pointer to a position. This request may not take effect immediately; in the future, when the compositor deems implementation-specific constraints are satisfied, the pointer lock will be activated and the compositor sends a locked event. The protocol provides no guarantee that the constraints are ever satisfied, and does not require the compositor to send an error if the constraints cannot ever be satisfied. It is thus possible to request a lock that will never activate. There may not be another pointer constraint of any kind requested or active on the surface for any of the wl_pointer objects of the seat of the passed pointer when requesting a lock. If there is, an error will be raised. See general pointer lock documentation for more details. The intersection of the region passed with this request and the input region of the surface is used to determine where the pointer must be in order for the lock to activate. It is up to the compositor whether to warp the pointer or require some kind of user interaction for the lock to activate. If the region is null the surface input region is used. A surface may receive pointer focus without the lock being activated. The request creates a new object wp_locked_pointer which is used to interact with the lock as well as receive updates about its state. See the the description of wp_locked_pointer for further information. Note that while a pointer is locked, the wl_pointer objects of the corresponding seat will not emit any wl_pointer.motion events, but relative motion events will still be emitted via wp_relative_pointer objects of the same seat. wl_pointer.axis and wl_pointer.button events are unaffected. </description> <arg name="id" type="new_id" interface="zwp_locked_pointer_v1"/> <arg name="surface" type="object" interface="wl_surface" summary="surface to lock pointer to"/> <arg name="pointer" type="object" interface="wl_pointer" summary="the pointer that should be locked"/> <arg name="region" type="object" interface="wl_region" allow-null="true" summary="region of surface"/> <arg name="lifetime" type="uint" enum="lifetime" summary="lock lifetime"/> </request> <request name="confine_pointer"> <description summary="confine pointer to a region"> The confine_pointer request lets the client request to confine the pointer cursor to a given region. This request may not take effect immediately; in the future, when the compositor deems implementation- specific constraints are satisfied, the pointer confinement will be activated and the compositor sends a confined event. The intersection of the region passed with this request and the input region of the surface is used to determine where the pointer must be in order for the confinement to activate. It is up to the compositor whether to warp the pointer or require some kind of user interaction for the confinement to activate. If the region is null the surface input region is used. The request will create a new object wp_confined_pointer which is used to interact with the confinement as well as receive updates about its state. See the the description of wp_confined_pointer for further information. </description> <arg name="id" type="new_id" interface="zwp_confined_pointer_v1"/> <arg name="surface" type="object" interface="wl_surface" summary="surface to lock pointer to"/> <arg name="pointer" type="object" interface="wl_pointer" summary="the pointer that should be confined"/> <arg name="region" type="object" interface="wl_region" allow-null="true" summary="region of surface"/> <arg name="lifetime" type="uint" enum="lifetime" summary="confinement lifetime"/> </request> </interface> <interface name="zwp_locked_pointer_v1" version="1"> <description summary="receive relative pointer motion events"> The wp_locked_pointer interface represents a locked pointer state. While the lock of this object is active, the wl_pointer objects of the associated seat will not emit any wl_pointer.motion events. This object will send the event 'locked' when the lock is activated. Whenever the lock is activated, it is guaranteed that the locked surface will already have received pointer focus and that the pointer will be within the region passed to the request creating this object. To unlock the pointer, send the destroy request. This will also destroy the wp_locked_pointer object. If the compositor decides to unlock the pointer the unlocked event is sent. See wp_locked_pointer.unlock for details. When unlocking, the compositor may warp the cursor position to the set cursor position hint. If it does, it will not result in any relative motion events emitted via wp_relative_pointer. If the surface the lock was requested on is destroyed and the lock is not yet activated, the wp_locked_pointer object is now defunct and must be destroyed. </description> <request name="destroy" type="destructor"> <description summary="destroy the locked pointer object"> Destroy the locked pointer object. If applicable, the compositor will unlock the pointer. </description> </request> <request name="set_cursor_position_hint"> <description summary="set the pointer cursor position hint"> Set the cursor position hint relative to the top left corner of the surface. If the client is drawing its own cursor, it should update the position hint to the position of its own cursor. A compositor may use this information to warp the pointer upon unlock in order to avoid pointer jumps. The cursor position hint is double buffered. The new hint will only take effect when the associated surface gets it pending state applied. See wl_surface.commit for details. </description> <arg name="surface_x" type="fixed" summary="surface-local x coordinate"/> <arg name="surface_y" type="fixed" summary="surface-local y coordinate"/> </request> <request name="set_region"> <description summary="set a new lock region"> Set a new region used to lock the pointer. The new lock region is double-buffered. The new lock region will only take effect when the associated surface gets its pending state applied. See wl_surface.commit for details. For details about the lock region, see wp_locked_pointer. </description> <arg name="region" type="object" interface="wl_region" allow-null="true" summary="region of surface"/> </request> <event name="locked"> <description summary="lock activation event"> Notification that the pointer lock of the seat's pointer is activated. </description> </event> <event name="unlocked"> <description summary="lock deactivation event"> Notification that the pointer lock of the seat's pointer is no longer active. If this is a oneshot pointer lock (see wp_pointer_constraints.lifetime) this object is now defunct and should be destroyed. If this is a persistent pointer lock (see wp_pointer_constraints.lifetime) this pointer lock may again reactivate in the future. </description> </event> </interface> <interface name="zwp_confined_pointer_v1" version="1"> <description summary="confined pointer object"> The wp_confined_pointer interface represents a confined pointer state. This object will send the event 'confined' when the confinement is activated. Whenever the confinement is activated, it is guaranteed that the surface the pointer is confined to will already have received pointer focus and that the pointer will be within the region passed to the request creating this object. It is up to the compositor to decide whether this requires some user interaction and if the pointer will warp to within the passed region if outside. To unconfine the pointer, send the destroy request. This will also destroy the wp_confined_pointer object. If the compositor decides to unconfine the pointer the unconfined event is sent. The wp_confined_pointer object is at this point defunct and should be destroyed. </description> <request name="destroy" type="destructor"> <description summary="destroy the confined pointer object"> Destroy the confined pointer object. If applicable, the compositor will unconfine the pointer. </description> </request> <request name="set_region"> <description summary="set a new confine region"> Set a new region used to confine the pointer. The new confine region is double-buffered. The new confine region will only take effect when the associated surface gets its pending state applied. See wl_surface.commit for details. If the confinement is active when the new confinement region is applied and the pointer ends up outside of newly applied region, the pointer may warped to a position within the new confinement region. If warped, a wl_pointer.motion event will be emitted, but no wp_relative_pointer.relative_motion event. The compositor may also, instead of using the new region, unconfine the pointer. For details about the confine region, see wp_confined_pointer. </description> <arg name="region" type="object" interface="wl_region" allow-null="true" summary="region of surface"/> </request> <event name="confined"> <description summary="pointer confined"> Notification that the pointer confinement of the seat's pointer is activated. </description> </event> <event name="unconfined"> <description summary="pointer unconfined"> Notification that the pointer confinement of the seat's pointer is no longer active. If this is a oneshot pointer confinement (see wp_pointer_constraints.lifetime) this object is now defunct and should be destroyed. If this is a persistent pointer confinement (see wp_pointer_constraints.lifetime) this pointer confinement may again reactivate in the future. </description> </event> </interface></protocol>vendor/glfw/deps/wayland/relative-pointer-unstable-v1.xmladded
<?xml version="1.0" encoding="UTF-8"?><protocol name="relative_pointer_unstable_v1"> <copyright> Copyright © 2014 Jonas Ådahl Copyright © 2015 Red Hat Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </copyright> <description summary="protocol for relative pointer motion events"> This protocol specifies a set of interfaces used for making clients able to receive relative pointer events not obstructed by barriers (such as the monitor edge or other pointer barriers). To start receiving relative pointer events, a client must first bind the global interface "wp_relative_pointer_manager" which, if a compositor supports relative pointer motion events, is exposed by the registry. After having created the relative pointer manager proxy object, the client uses it to create the actual relative pointer object using the "get_relative_pointer" request given a wl_pointer. The relative pointer motion events will then, when applicable, be transmitted via the proxy of the newly created relative pointer object. See the documentation of the relative pointer interface for more details. Warning! The protocol described in this file is experimental and backward incompatible changes may be made. Backward compatible changes may be added together with the corresponding interface version bump. Backward incompatible changes are done by bumping the version number in the protocol and interface names and resetting the interface version. Once the protocol is to be declared stable, the 'z' prefix and the version number in the protocol and interface names are removed and the interface version number is reset. </description> <interface name="zwp_relative_pointer_manager_v1" version="1"> <description summary="get relative pointer objects"> A global interface used for getting the relative pointer object for a given pointer. </description> <request name="destroy" type="destructor"> <description summary="destroy the relative pointer manager object"> Used by the client to notify the server that it will no longer use this relative pointer manager object. </description> </request> <request name="get_relative_pointer"> <description summary="get a relative pointer object"> Create a relative pointer interface given a wl_pointer object. See the wp_relative_pointer interface for more details. </description> <arg name="id" type="new_id" interface="zwp_relative_pointer_v1"/> <arg name="pointer" type="object" interface="wl_pointer"/> </request> </interface> <interface name="zwp_relative_pointer_v1" version="1"> <description summary="relative pointer object"> A wp_relative_pointer object is an extension to the wl_pointer interface used for emitting relative pointer events. It shares the same focus as wl_pointer objects of the same seat and will only emit events when it has focus. </description> <request name="destroy" type="destructor"> <description summary="release the relative pointer object"/> </request> <event name="relative_motion"> <description summary="relative pointer motion"> Relative x/y pointer motion from the pointer of the seat associated with this object. A relative motion is in the same dimension as regular wl_pointer motion events, except they do not represent an absolute position. For example, moving a pointer from (x, y) to (x', y') would have the equivalent relative motion (x' - x, y' - y). If a pointer motion caused the absolute pointer position to be clipped by for example the edge of the monitor, the relative motion is unaffected by the clipping and will represent the unclipped motion. This event also contains non-accelerated motion deltas. The non-accelerated delta is, when applicable, the regular pointer motion delta as it was before having applied motion acceleration and other transformations such as normalization. Note that the non-accelerated delta does not represent 'raw' events as they were read from some device. Pointer motion acceleration is device- and configuration-specific and non-accelerated deltas and accelerated deltas may have the same value on some devices. Relative motions are not coupled to wl_pointer.motion events, and can be sent in combination with such events, but also independently. There may also be scenarios where wl_pointer.motion is sent, but there is no relative motion. The order of an absolute and relative motion event originating from the same physical motion is not guaranteed. If the client needs button events or focus state, it can receive them from a wl_pointer object of the same seat that the wp_relative_pointer object is associated with. </description> <arg name="utime_hi" type="uint" summary="high 32 bits of a 64 bit timestamp with microsecond granularity"/> <arg name="utime_lo" type="uint" summary="low 32 bits of a 64 bit timestamp with microsecond granularity"/> <arg name="dx" type="fixed" summary="the x component of the motion vector"/> <arg name="dy" type="fixed" summary="the y component of the motion vector"/> <arg name="dx_unaccel" type="fixed" summary="the x component of the unaccelerated motion vector"/> <arg name="dy_unaccel" type="fixed" summary="the y component of the unaccelerated motion vector"/> </event> </interface></protocol>vendor/glfw/deps/wayland/viewporter.xmladded
<?xml version="1.0" encoding="UTF-8"?><protocol name="viewporter"> <copyright> Copyright © 2013-2016 Collabora, Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </copyright> <interface name="wp_viewporter" version="1"> <description summary="surface cropping and scaling"> The global interface exposing surface cropping and scaling capabilities is used to instantiate an interface extension for a wl_surface object. This extended interface will then allow cropping and scaling the surface contents, effectively disconnecting the direct relationship between the buffer and the surface size. </description> <request name="destroy" type="destructor"> <description summary="unbind from the cropping and scaling interface"> Informs the server that the client will not be using this protocol object anymore. This does not affect any other objects, wp_viewport objects included. </description> </request> <enum name="error"> <entry name="viewport_exists" value="0" summary="the surface already has a viewport object associated"/> </enum> <request name="get_viewport"> <description summary="extend surface interface for crop and scale"> Instantiate an interface extension for the given wl_surface to crop and scale its content. If the given wl_surface already has a wp_viewport object associated, the viewport_exists protocol error is raised. </description> <arg name="id" type="new_id" interface="wp_viewport" summary="the new viewport interface id"/> <arg name="surface" type="object" interface="wl_surface" summary="the surface"/> </request> </interface> <interface name="wp_viewport" version="1"> <description summary="crop and scale interface to a wl_surface"> An additional interface to a wl_surface object, which allows the client to specify the cropping and scaling of the surface contents. This interface works with two concepts: the source rectangle (src_x, src_y, src_width, src_height), and the destination size (dst_width, dst_height). The contents of the source rectangle are scaled to the destination size, and content outside the source rectangle is ignored. This state is double-buffered, and is applied on the next wl_surface.commit. The two parts of crop and scale state are independent: the source rectangle, and the destination size. Initially both are unset, that is, no scaling is applied. The whole of the current wl_buffer is used as the source, and the surface size is as defined in wl_surface.attach. If the destination size is set, it causes the surface size to become dst_width, dst_height. The source (rectangle) is scaled to exactly this size. This overrides whatever the attached wl_buffer size is, unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface has no content and therefore no size. Otherwise, the size is always at least 1x1 in surface local coordinates. If the source rectangle is set, it defines what area of the wl_buffer is taken as the source. If the source rectangle is set and the destination size is not set, then src_width and src_height must be integers, and the surface size becomes the source rectangle size. This results in cropping without scaling. If src_width or src_height are not integers and destination size is not set, the bad_size protocol error is raised when the surface state is applied. The coordinate transformations from buffer pixel coordinates up to the surface-local coordinates happen in the following order: 1. buffer_transform (wl_surface.set_buffer_transform) 2. buffer_scale (wl_surface.set_buffer_scale) 3. crop and scale (wp_viewport.set*) This means, that the source rectangle coordinates of crop and scale are given in the coordinates after the buffer transform and scale, i.e. in the coordinates that would be the surface-local coordinates if the crop and scale was not applied. If src_x or src_y are negative, the bad_value protocol error is raised. Otherwise, if the source rectangle is partially or completely outside of the non-NULL wl_buffer, then the out_of_buffer protocol error is raised when the surface state is applied. A NULL wl_buffer does not raise the out_of_buffer error. If the wl_surface associated with the wp_viewport is destroyed, all wp_viewport requests except 'destroy' raise the protocol error no_surface. If the wp_viewport object is destroyed, the crop and scale state is removed from the wl_surface. The change will be applied on the next wl_surface.commit. </description> <request name="destroy" type="destructor"> <description summary="remove scaling and cropping from the surface"> The associated wl_surface's crop and scale state is removed. The change is applied on the next wl_surface.commit. </description> </request> <enum name="error"> <entry name="bad_value" value="0" summary="negative or zero values in width or height"/> <entry name="bad_size" value="1" summary="destination size is not integer"/> <entry name="out_of_buffer" value="2" summary="source rectangle extends outside of the content area"/> <entry name="no_surface" value="3" summary="the wl_surface was destroyed"/> </enum> <request name="set_source"> <description summary="set the source rectangle for cropping"> Set the source rectangle of the associated wl_surface. See wp_viewport for the description, and relation to the wl_buffer size. If all of x, y, width and height are -1.0, the source rectangle is unset instead. Any other set of values where width or height are zero or negative, or x or y are negative, raise the bad_value protocol error. The crop and scale state is double-buffered state, and will be applied on the next wl_surface.commit. </description> <arg name="x" type="fixed" summary="source rectangle x"/> <arg name="y" type="fixed" summary="source rectangle y"/> <arg name="width" type="fixed" summary="source rectangle width"/> <arg name="height" type="fixed" summary="source rectangle height"/> </request> <request name="set_destination"> <description summary="set the surface size for scaling"> Set the destination size of the associated wl_surface. See wp_viewport for the description, and relation to the wl_buffer size. If width is -1 and height is -1, the destination size is unset instead. Any other pair of values for width and height that contains zero or negative values raises the bad_value protocol error. The crop and scale state is double-buffered state, and will be applied on the next wl_surface.commit. </description> <arg name="width" type="int" summary="surface width"/> <arg name="height" type="int" summary="surface height"/> </request> </interface></protocol>vendor/glfw/deps/wayland/wayland.xmladded
<?xml version="1.0" encoding="UTF-8"?><protocol name="wayland"> <copyright> Copyright © 2008-2011 Kristian Høgsberg Copyright © 2010-2011 Intel Corporation Copyright © 2012-2013 Collabora, Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </copyright> <interface name="wl_display" version="1"> <description summary="core global object"> The core global object. This is a special singleton object. It is used for internal Wayland protocol features. </description> <request name="sync"> <description summary="asynchronous roundtrip"> The sync request asks the server to emit the 'done' event on the returned wl_callback object. Since requests are handled in-order and events are delivered in-order, this can be used as a barrier to ensure all previous requests and the resulting events have been handled. The object returned by this request will be destroyed by the compositor after the callback is fired and as such the client must not attempt to use it after that point. The callback_data passed in the callback is the event serial. </description> <arg name="callback" type="new_id" interface="wl_callback" summary="callback object for the sync request"/> </request> <request name="get_registry"> <description summary="get global registry object"> This request creates a registry object that allows the client to list and bind the global objects available from the compositor. It should be noted that the server side resources consumed in response to a get_registry request can only be released when the client disconnects, not when the client side proxy is destroyed. Therefore, clients should invoke get_registry as infrequently as possible to avoid wasting memory. </description> <arg name="registry" type="new_id" interface="wl_registry" summary="global registry object"/> </request> <event name="error"> <description summary="fatal error event"> The error event is sent out when a fatal (non-recoverable) error has occurred. The object_id argument is the object where the error occurred, most often in response to a request to that object. The code identifies the error and is defined by the object interface. As such, each interface defines its own set of error codes. The message is a brief description of the error, for (debugging) convenience. </description> <arg name="object_id" type="object" summary="object where the error occurred"/> <arg name="code" type="uint" summary="error code"/> <arg name="message" type="string" summary="error description"/> </event> <enum name="error"> <description summary="global error values"> These errors are global and can be emitted in response to any server request. </description> <entry name="invalid_object" value="0" summary="server couldn't find object"/> <entry name="invalid_method" value="1" summary="method doesn't exist on the specified interface or malformed request"/> <entry name="no_memory" value="2" summary="server is out of memory"/> <entry name="implementation" value="3" summary="implementation error in compositor"/> </enum> <event name="delete_id"> <description summary="acknowledge object ID deletion"> This event is used internally by the object ID management logic. When a client deletes an object that it had created, the server will send this event to acknowledge that it has seen the delete request. When the client receives this event, it will know that it can safely reuse the object ID. </description> <arg name="id" type="uint" summary="deleted object ID"/> </event> </interface> <interface name="wl_registry" version="1"> <description summary="global registry object"> The singleton global registry object. The server has a number of global objects that are available to all clients. These objects typically represent an actual object in the server (for example, an input device) or they are singleton objects that provide extension functionality. When a client creates a registry object, the registry object will emit a global event for each global currently in the registry. Globals come and go as a result of device or monitor hotplugs, reconfiguration or other events, and the registry will send out global and global_remove events to keep the client up to date with the changes. To mark the end of the initial burst of events, the client can use the wl_display.sync request immediately after calling wl_display.get_registry. A client can bind to a global object by using the bind request. This creates a client-side handle that lets the object emit events to the client and lets the client invoke requests on the object. </description> <request name="bind"> <description summary="bind an object to the display"> Binds a new, client-created object to the server using the specified name as the identifier. </description> <arg name="name" type="uint" summary="unique numeric name of the object"/> <arg name="id" type="new_id" summary="bounded object"/> </request> <event name="global"> <description summary="announce global object"> Notify the client of global objects. The event notifies the client that a global object with the given name is now available, and it implements the given version of the given interface. </description> <arg name="name" type="uint" summary="numeric name of the global object"/> <arg name="interface" type="string" summary="interface implemented by the object"/> <arg name="version" type="uint" summary="interface version"/> </event> <event name="global_remove"> <description summary="announce removal of global object"> Notify the client of removed global objects. This event notifies the client that the global identified by name is no longer available. If the client bound to the global using the bind request, the client should now destroy that object. The object remains valid and requests to the object will be ignored until the client destroys it, to avoid races between the global going away and a client sending a request to it. </description> <arg name="name" type="uint" summary="numeric name of the global object"/> </event> </interface> <interface name="wl_callback" version="1"> <description summary="callback object"> Clients can handle the 'done' event to get notified when the related request is done. Note, because wl_callback objects are created from multiple independent factory interfaces, the wl_callback interface is frozen at version 1. </description> <event name="done" type="destructor"> <description summary="done event"> Notify the client when the related request is done. </description> <arg name="callback_data" type="uint" summary="request-specific data for the callback"/> </event> </interface> <interface name="wl_compositor" version="6"> <description summary="the compositor singleton"> A compositor. This object is a singleton global. The compositor is in charge of combining the contents of multiple surfaces into one displayable output. </description> <request name="create_surface"> <description summary="create new surface"> Ask the compositor to create a new surface. </description> <arg name="id" type="new_id" interface="wl_surface" summary="the new surface"/> </request> <request name="create_region"> <description summary="create new region"> Ask the compositor to create a new region. </description> <arg name="id" type="new_id" interface="wl_region" summary="the new region"/> </request> </interface> <interface name="wl_shm_pool" version="1"> <description summary="a shared memory pool"> The wl_shm_pool object encapsulates a piece of memory shared between the compositor and client. Through the wl_shm_pool object, the client can allocate shared memory wl_buffer objects. All objects created through the same pool share the same underlying mapped memory. Reusing the mapped memory avoids the setup/teardown overhead and is useful when interactively resizing a surface or for many small buffers. </description> <request name="create_buffer"> <description summary="create a buffer from the pool"> Create a wl_buffer object from the pool. The buffer is created offset bytes into the pool and has width and height as specified. The stride argument specifies the number of bytes from the beginning of one row to the beginning of the next. The format is the pixel format of the buffer and must be one of those advertised through the wl_shm.format event. A buffer will keep a reference to the pool it was created from so it is valid to destroy the pool immediately after creating a buffer from it. </description> <arg name="id" type="new_id" interface="wl_buffer" summary="buffer to create"/> <arg name="offset" type="int" summary="buffer byte offset within the pool"/> <arg name="width" type="int" summary="buffer width, in pixels"/> <arg name="height" type="int" summary="buffer height, in pixels"/> <arg name="stride" type="int" summary="number of bytes from the beginning of one row to the beginning of the next row"/> <arg name="format" type="uint" enum="wl_shm.format" summary="buffer pixel format"/> </request> <request name="destroy" type="destructor"> <description summary="destroy the pool"> Destroy the shared memory pool. The mmapped memory will be released when all buffers that have been created from this pool are gone. </description> </request> <request name="resize"> <description summary="change the size of the pool mapping"> This request will cause the server to remap the backing memory for the pool from the file descriptor passed when the pool was created, but using the new size. This request can only be used to make the pool bigger. This request only changes the amount of bytes that are mmapped by the server and does not touch the file corresponding to the file descriptor passed at creation time. It is the client's responsibility to ensure that the file is at least as big as the new pool size. </description> <arg name="size" type="int" summary="new size of the pool, in bytes"/> </request> </interface> <interface name="wl_shm" version="1"> <description summary="shared memory support"> A singleton global object that provides support for shared memory. Clients can create wl_shm_pool objects using the create_pool request. On binding the wl_shm object one or more format events are emitted to inform clients about the valid pixel formats that can be used for buffers. </description> <enum name="error"> <description summary="wl_shm error values"> These errors can be emitted in response to wl_shm requests. </description> <entry name="invalid_format" value="0" summary="buffer format is not known"/> <entry name="invalid_stride" value="1" summary="invalid size or stride during pool or buffer creation"/> <entry name="invalid_fd" value="2" summary="mmapping the file descriptor failed"/> </enum> <enum name="format"> <description summary="pixel formats"> This describes the memory layout of an individual pixel. All renderers should support argb8888 and xrgb8888 but any other formats are optional and may not be supported by the particular renderer in use. The drm format codes match the macros defined in drm_fourcc.h, except argb8888 and xrgb8888. The formats actually supported by the compositor will be reported by the format event. For all wl_shm formats and unless specified in another protocol extension, pre-multiplied alpha is used for pixel values. </description> <!-- Note to protocol writers: don't update this list manually, instead run the automated script that keeps it in sync with drm_fourcc.h. --> <entry name="argb8888" value="0" summary="32-bit ARGB format, [31:0] A:R:G:B 8:8:8:8 little endian"/> <entry name="xrgb8888" value="1" summary="32-bit RGB format, [31:0] x:R:G:B 8:8:8:8 little endian"/> <entry name="c8" value="0x20203843" summary="8-bit color index format, [7:0] C"/> <entry name="rgb332" value="0x38424752" summary="8-bit RGB format, [7:0] R:G:B 3:3:2"/> <entry name="bgr233" value="0x38524742" summary="8-bit BGR format, [7:0] B:G:R 2:3:3"/> <entry name="xrgb4444" value="0x32315258" summary="16-bit xRGB format, [15:0] x:R:G:B 4:4:4:4 little endian"/> <entry name="xbgr4444" value="0x32314258" summary="16-bit xBGR format, [15:0] x:B:G:R 4:4:4:4 little endian"/> <entry name="rgbx4444" value="0x32315852" summary="16-bit RGBx format, [15:0] R:G:B:x 4:4:4:4 little endian"/> <entry name="bgrx4444" value="0x32315842" summary="16-bit BGRx format, [15:0] B:G:R:x 4:4:4:4 little endian"/> <entry name="argb4444" value="0x32315241" summary="16-bit ARGB format, [15:0] A:R:G:B 4:4:4:4 little endian"/> <entry name="abgr4444" value="0x32314241" summary="16-bit ABGR format, [15:0] A:B:G:R 4:4:4:4 little endian"/> <entry name="rgba4444" value="0x32314152" summary="16-bit RBGA format, [15:0] R:G:B:A 4:4:4:4 little endian"/> <entry name="bgra4444" value="0x32314142" summary="16-bit BGRA format, [15:0] B:G:R:A 4:4:4:4 little endian"/> <entry name="xrgb1555" value="0x35315258" summary="16-bit xRGB format, [15:0] x:R:G:B 1:5:5:5 little endian"/> <entry name="xbgr1555" value="0x35314258" summary="16-bit xBGR 1555 format, [15:0] x:B:G:R 1:5:5:5 little endian"/> <entry name="rgbx5551" value="0x35315852" summary="16-bit RGBx 5551 format, [15:0] R:G:B:x 5:5:5:1 little endian"/> <entry name="bgrx5551" value="0x35315842" summary="16-bit BGRx 5551 format, [15:0] B:G:R:x 5:5:5:1 little endian"/> <entry name="argb1555" value="0x35315241" summary="16-bit ARGB 1555 format, [15:0] A:R:G:B 1:5:5:5 little endian"/> <entry name="abgr1555" value="0x35314241" summary="16-bit ABGR 1555 format, [15:0] A:B:G:R 1:5:5:5 little endian"/> <entry name="rgba5551" value="0x35314152" summary="16-bit RGBA 5551 format, [15:0] R:G:B:A 5:5:5:1 little endian"/> <entry name="bgra5551" value="0x35314142" summary="16-bit BGRA 5551 format, [15:0] B:G:R:A 5:5:5:1 little endian"/> <entry name="rgb565" value="0x36314752" summary="16-bit RGB 565 format, [15:0] R:G:B 5:6:5 little endian"/> <entry name="bgr565" value="0x36314742" summary="16-bit BGR 565 format, [15:0] B:G:R 5:6:5 little endian"/> <entry name="rgb888" value="0x34324752" summary="24-bit RGB format, [23:0] R:G:B little endian"/> <entry name="bgr888" value="0x34324742" summary="24-bit BGR format, [23:0] B:G:R little endian"/> <entry name="xbgr8888" value="0x34324258" summary="32-bit xBGR format, [31:0] x:B:G:R 8:8:8:8 little endian"/> <entry name="rgbx8888" value="0x34325852" summary="32-bit RGBx format, [31:0] R:G:B:x 8:8:8:8 little endian"/> <entry name="bgrx8888" value="0x34325842" summary="32-bit BGRx format, [31:0] B:G:R:x 8:8:8:8 little endian"/> <entry name="abgr8888" value="0x34324241" summary="32-bit ABGR format, [31:0] A:B:G:R 8:8:8:8 little endian"/> <entry name="rgba8888" value="0x34324152" summary="32-bit RGBA format, [31:0] R:G:B:A 8:8:8:8 little endian"/> <entry name="bgra8888" value="0x34324142" summary="32-bit BGRA format, [31:0] B:G:R:A 8:8:8:8 little endian"/> <entry name="xrgb2101010" value="0x30335258" summary="32-bit xRGB format, [31:0] x:R:G:B 2:10:10:10 little endian"/> <entry name="xbgr2101010" value="0x30334258" summary="32-bit xBGR format, [31:0] x:B:G:R 2:10:10:10 little endian"/> <entry name="rgbx1010102" value="0x30335852" summary="32-bit RGBx format, [31:0] R:G:B:x 10:10:10:2 little endian"/> <entry name="bgrx1010102" value="0x30335842" summary="32-bit BGRx format, [31:0] B:G:R:x 10:10:10:2 little endian"/> <entry name="argb2101010" value="0x30335241" summary="32-bit ARGB format, [31:0] A:R:G:B 2:10:10:10 little endian"/> <entry name="abgr2101010" value="0x30334241" summary="32-bit ABGR format, [31:0] A:B:G:R 2:10:10:10 little endian"/> <entry name="rgba1010102" value="0x30334152" summary="32-bit RGBA format, [31:0] R:G:B:A 10:10:10:2 little endian"/> <entry name="bgra1010102" value="0x30334142" summary="32-bit BGRA format, [31:0] B:G:R:A 10:10:10:2 little endian"/> <entry name="yuyv" value="0x56595559" summary="packed YCbCr format, [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian"/> <entry name="yvyu" value="0x55595659" summary="packed YCbCr format, [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian"/> <entry name="uyvy" value="0x59565955" summary="packed YCbCr format, [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian"/> <entry name="vyuy" value="0x59555956" summary="packed YCbCr format, [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian"/> <entry name="ayuv" value="0x56555941" summary="packed AYCbCr format, [31:0] A:Y:Cb:Cr 8:8:8:8 little endian"/> <entry name="nv12" value="0x3231564e" summary="2 plane YCbCr Cr:Cb format, 2x2 subsampled Cr:Cb plane"/> <entry name="nv21" value="0x3132564e" summary="2 plane YCbCr Cb:Cr format, 2x2 subsampled Cb:Cr plane"/> <entry name="nv16" value="0x3631564e" summary="2 plane YCbCr Cr:Cb format, 2x1 subsampled Cr:Cb plane"/> <entry name="nv61" value="0x3136564e" summary="2 plane YCbCr Cb:Cr format, 2x1 subsampled Cb:Cr plane"/> <entry name="yuv410" value="0x39565559" summary="3 plane YCbCr format, 4x4 subsampled Cb (1) and Cr (2) planes"/> <entry name="yvu410" value="0x39555659" summary="3 plane YCbCr format, 4x4 subsampled Cr (1) and Cb (2) planes"/> <entry name="yuv411" value="0x31315559" summary="3 plane YCbCr format, 4x1 subsampled Cb (1) and Cr (2) planes"/> <entry name="yvu411" value="0x31315659" summary="3 plane YCbCr format, 4x1 subsampled Cr (1) and Cb (2) planes"/> <entry name="yuv420" value="0x32315559" summary="3 plane YCbCr format, 2x2 subsampled Cb (1) and Cr (2) planes"/> <entry name="yvu420" value="0x32315659" summary="3 plane YCbCr format, 2x2 subsampled Cr (1) and Cb (2) planes"/> <entry name="yuv422" value="0x36315559" summary="3 plane YCbCr format, 2x1 subsampled Cb (1) and Cr (2) planes"/> <entry name="yvu422" value="0x36315659" summary="3 plane YCbCr format, 2x1 subsampled Cr (1) and Cb (2) planes"/> <entry name="yuv444" value="0x34325559" summary="3 plane YCbCr format, non-subsampled Cb (1) and Cr (2) planes"/> <entry name="yvu444" value="0x34325659" summary="3 plane YCbCr format, non-subsampled Cr (1) and Cb (2) planes"/> <entry name="r8" value="0x20203852" summary="[7:0] R"/> <entry name="r16" value="0x20363152" summary="[15:0] R little endian"/> <entry name="rg88" value="0x38384752" summary="[15:0] R:G 8:8 little endian"/> <entry name="gr88" value="0x38385247" summary="[15:0] G:R 8:8 little endian"/> <entry name="rg1616" value="0x32334752" summary="[31:0] R:G 16:16 little endian"/> <entry name="gr1616" value="0x32335247" summary="[31:0] G:R 16:16 little endian"/> <entry name="xrgb16161616f" value="0x48345258" summary="[63:0] x:R:G:B 16:16:16:16 little endian"/> <entry name="xbgr16161616f" value="0x48344258" summary="[63:0] x:B:G:R 16:16:16:16 little endian"/> <entry name="argb16161616f" value="0x48345241" summary="[63:0] A:R:G:B 16:16:16:16 little endian"/> <entry name="abgr16161616f" value="0x48344241" summary="[63:0] A:B:G:R 16:16:16:16 little endian"/> <entry name="xyuv8888" value="0x56555958" summary="[31:0] X:Y:Cb:Cr 8:8:8:8 little endian"/> <entry name="vuy888" value="0x34325556" summary="[23:0] Cr:Cb:Y 8:8:8 little endian"/> <entry name="vuy101010" value="0x30335556" summary="Y followed by U then V, 10:10:10. Non-linear modifier only"/> <entry name="y210" value="0x30313259" summary="[63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 10:6:10:6:10:6:10:6 little endian per 2 Y pixels"/> <entry name="y212" value="0x32313259" summary="[63:0] Cr0:0:Y1:0:Cb0:0:Y0:0 12:4:12:4:12:4:12:4 little endian per 2 Y pixels"/> <entry name="y216" value="0x36313259" summary="[63:0] Cr0:Y1:Cb0:Y0 16:16:16:16 little endian per 2 Y pixels"/> <entry name="y410" value="0x30313459" summary="[31:0] A:Cr:Y:Cb 2:10:10:10 little endian"/> <entry name="y412" value="0x32313459" summary="[63:0] A:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian"/> <entry name="y416" value="0x36313459" summary="[63:0] A:Cr:Y:Cb 16:16:16:16 little endian"/> <entry name="xvyu2101010" value="0x30335658" summary="[31:0] X:Cr:Y:Cb 2:10:10:10 little endian"/> <entry name="xvyu12_16161616" value="0x36335658" summary="[63:0] X:0:Cr:0:Y:0:Cb:0 12:4:12:4:12:4:12:4 little endian"/> <entry name="xvyu16161616" value="0x38345658" summary="[63:0] X:Cr:Y:Cb 16:16:16:16 little endian"/> <entry name="y0l0" value="0x304c3059" summary="[63:0] A3:A2:Y3:0:Cr0:0:Y2:0:A1:A0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian"/> <entry name="x0l0" value="0x304c3058" summary="[63:0] X3:X2:Y3:0:Cr0:0:Y2:0:X1:X0:Y1:0:Cb0:0:Y0:0 1:1:8:2:8:2:8:2:1:1:8:2:8:2:8:2 little endian"/> <entry name="y0l2" value="0x324c3059" summary="[63:0] A3:A2:Y3:Cr0:Y2:A1:A0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian"/> <entry name="x0l2" value="0x324c3058" summary="[63:0] X3:X2:Y3:Cr0:Y2:X1:X0:Y1:Cb0:Y0 1:1:10:10:10:1:1:10:10:10 little endian"/> <entry name="yuv420_8bit" value="0x38305559"/> <entry name="yuv420_10bit" value="0x30315559"/> <entry name="xrgb8888_a8" value="0x38415258"/> <entry name="xbgr8888_a8" value="0x38414258"/> <entry name="rgbx8888_a8" value="0x38415852"/> <entry name="bgrx8888_a8" value="0x38415842"/> <entry name="rgb888_a8" value="0x38413852"/> <entry name="bgr888_a8" value="0x38413842"/> <entry name="rgb565_a8" value="0x38413552"/> <entry name="bgr565_a8" value="0x38413542"/> <entry name="nv24" value="0x3432564e" summary="non-subsampled Cr:Cb plane"/> <entry name="nv42" value="0x3234564e" summary="non-subsampled Cb:Cr plane"/> <entry name="p210" value="0x30313250" summary="2x1 subsampled Cr:Cb plane, 10 bit per channel"/> <entry name="p010" value="0x30313050" summary="2x2 subsampled Cr:Cb plane 10 bits per channel"/> <entry name="p012" value="0x32313050" summary="2x2 subsampled Cr:Cb plane 12 bits per channel"/> <entry name="p016" value="0x36313050" summary="2x2 subsampled Cr:Cb plane 16 bits per channel"/> <entry name="axbxgxrx106106106106" value="0x30314241" summary="[63:0] A:x:B:x:G:x:R:x 10:6:10:6:10:6:10:6 little endian"/> <entry name="nv15" value="0x3531564e" summary="2x2 subsampled Cr:Cb plane"/> <entry name="q410" value="0x30313451"/> <entry name="q401" value="0x31303451"/> <entry name="xrgb16161616" value="0x38345258" summary="[63:0] x:R:G:B 16:16:16:16 little endian"/> <entry name="xbgr16161616" value="0x38344258" summary="[63:0] x:B:G:R 16:16:16:16 little endian"/> <entry name="argb16161616" value="0x38345241" summary="[63:0] A:R:G:B 16:16:16:16 little endian"/> <entry name="abgr16161616" value="0x38344241" summary="[63:0] A:B:G:R 16:16:16:16 little endian"/> </enum> <request name="create_pool"> <description summary="create a shm pool"> Create a new wl_shm_pool object. The pool can be used to create shared memory based buffer objects. The server will mmap size bytes of the passed file descriptor, to use as backing memory for the pool. </description> <arg name="id" type="new_id" interface="wl_shm_pool" summary="pool to create"/> <arg name="fd" type="fd" summary="file descriptor for the pool"/> <arg name="size" type="int" summary="pool size, in bytes"/> </request> <event name="format"> <description summary="pixel format description"> Informs the client about a valid pixel format that can be used for buffers. Known formats include argb8888 and xrgb8888. </description> <arg name="format" type="uint" enum="format" summary="buffer pixel format"/> </event> </interface> <interface name="wl_buffer" version="1"> <description summary="content for a wl_surface"> A buffer provides the content for a wl_surface. Buffers are created through factory interfaces such as wl_shm, wp_linux_buffer_params (from the linux-dmabuf protocol extension) or similar. It has a width and a height and can be attached to a wl_surface, but the mechanism by which a client provides and updates the contents is defined by the buffer factory interface. If the buffer uses a format that has an alpha channel, the alpha channel is assumed to be premultiplied in the color channels unless otherwise specified. Note, because wl_buffer objects are created from multiple independent factory interfaces, the wl_buffer interface is frozen at version 1. </description> <request name="destroy" type="destructor"> <description summary="destroy a buffer"> Destroy a buffer. If and how you need to release the backing storage is defined by the buffer factory interface. For possible side-effects to a surface, see wl_surface.attach. </description> </request> <event name="release"> <description summary="compositor releases buffer"> Sent when this wl_buffer is no longer used by the compositor. The client is now free to reuse or destroy this buffer and its backing storage. If a client receives a release event before the frame callback requested in the same wl_surface.commit that attaches this wl_buffer to a surface, then the client is immediately free to reuse the buffer and its backing storage, and does not need a second buffer for the next surface content update. Typically this is possible, when the compositor maintains a copy of the wl_surface contents, e.g. as a GL texture. This is an important optimization for GL(ES) compositors with wl_shm clients. </description> </event> </interface> <interface name="wl_data_offer" version="3"> <description summary="offer to transfer data"> A wl_data_offer represents a piece of data offered for transfer by another client (the source client). It is used by the copy-and-paste and drag-and-drop mechanisms. The offer describes the different mime types that the data can be converted to and provides the mechanism for transferring the data directly from the source client. </description>Showing the first 500 of 3152 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/deps/wayland/xdg-activation-v1.xmladded
<?xml version="1.0" encoding="UTF-8"?><protocol name="xdg_activation_v1"> <copyright> Copyright © 2020 Aleix Pol Gonzalez <aleixpol@kde.org> Copyright © 2020 Carlos Garnacho <carlosg@gnome.org> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </copyright> <description summary="Protocol for requesting activation of surfaces"> The way for a client to pass focus to another toplevel is as follows. The client that intends to activate another toplevel uses the xdg_activation_v1.get_activation_token request to get an activation token. This token is then forwarded to the client, which is supposed to activate one of its surfaces, through a separate band of communication. One established way of doing this is through the XDG_ACTIVATION_TOKEN environment variable of a newly launched child process. The child process should unset the environment variable again right after reading it out in order to avoid propagating it to other child processes. Another established way exists for Applications implementing the D-Bus interface org.freedesktop.Application, which should get their token under activation-token on their platform_data. In general activation tokens may be transferred across clients through means not described in this protocol. The client to be activated will then pass the token it received to the xdg_activation_v1.activate request. The compositor can then use this token to decide how to react to the activation request. The token the activating client gets may be ineffective either already at the time it receives it, for example if it was not focused, for focus stealing prevention. The activating client will have no way to discover the validity of the token, and may still forward it to the to be activated client. The created activation token may optionally get information attached to it that can be used by the compositor to identify the application that we intend to activate. This can for example be used to display a visual hint about what application is being started. Warning! The protocol described in this file is currently in the testing phase. Backward compatible changes may be added together with the corresponding interface version bump. Backward incompatible changes can only be done by creating a new major version of the extension. </description> <interface name="xdg_activation_v1" version="1"> <description summary="interface for activating surfaces"> A global interface used for informing the compositor about applications being activated or started, or for applications to request to be activated. </description> <request name="destroy" type="destructor"> <description summary="destroy the xdg_activation object"> Notify the compositor that the xdg_activation object will no longer be used. The child objects created via this interface are unaffected and should be destroyed separately. </description> </request> <request name="get_activation_token"> <description summary="requests a token"> Creates an xdg_activation_token_v1 object that will provide the initiating client with a unique token for this activation. This token should be offered to the clients to be activated. </description> <arg name="id" type="new_id" interface="xdg_activation_token_v1"/> </request> <request name="activate"> <description summary="notify new interaction being available"> Requests surface activation. It's up to the compositor to display this information as desired, for example by placing the surface above the rest. The compositor may know who requested this by checking the activation token and might decide not to follow through with the activation if it's considered unwanted. Compositors can ignore unknown activation tokens when an invalid token is passed. </description> <arg name="token" type="string" summary="the activation token of the initiating client"/> <arg name="surface" type="object" interface="wl_surface" summary="the wl_surface to activate"/> </request> </interface> <interface name="xdg_activation_token_v1" version="1"> <description summary="an exported activation handle"> An object for setting up a token and receiving a token handle that can be passed as an activation token to another client. The object is created using the xdg_activation_v1.get_activation_token request. This object should then be populated with the app_id, surface and serial information and committed. The compositor shall then issue a done event with the token. In case the request's parameters are invalid, the compositor will provide an invalid token. </description> <enum name="error"> <entry name="already_used" value="0" summary="The token has already been used previously"/> </enum> <request name="set_serial"> <description summary="specifies the seat and serial of the activating event"> Provides information about the seat and serial event that requested the token. The serial can come from an input or focus event. For instance, if a click triggers the launch of a third-party client, the launcher client should send a set_serial request with the serial and seat from the wl_pointer.button event. Some compositors might refuse to activate toplevels when the token doesn't have a valid and recent enough event serial. Must be sent before commit. This information is optional. </description> <arg name="serial" type="uint" summary="the serial of the event that triggered the activation"/> <arg name="seat" type="object" interface="wl_seat" summary="the wl_seat of the event"/> </request> <request name="set_app_id"> <description summary="specifies the application being activated"> The requesting client can specify an app_id to associate the token being created with it. Must be sent before commit. This information is optional. </description> <arg name="app_id" type="string" summary="the application id of the client being activated."/> </request> <request name="set_surface"> <description summary="specifies the surface requesting activation"> This request sets the surface requesting the activation. Note, this is different from the surface that will be activated. Some compositors might refuse to activate toplevels when the token doesn't have a requesting surface. Must be sent before commit. This information is optional. </description> <arg name="surface" type="object" interface="wl_surface" summary="the requesting surface"/> </request> <request name="commit"> <description summary="issues the token request"> Requests an activation token based on the different parameters that have been offered through set_serial, set_surface and set_app_id. </description> </request> <event name="done"> <description summary="the exported activation token"> The 'done' event contains the unique token of this activation request and notifies that the provider is done. </description> <arg name="token" type="string" summary="the exported activation token"/> </event> <request name="destroy" type="destructor"> <description summary="destroy the xdg_activation_token_v1 object"> Notify the compositor that the xdg_activation_token_v1 object will no longer be used. The received token stays valid. </description> </request> </interface></protocol>vendor/glfw/deps/wayland/xdg-decoration-unstable-v1.xmladded
<?xml version="1.0" encoding="UTF-8"?><protocol name="xdg_decoration_unstable_v1"> <copyright> Copyright © 2018 Simon Ser Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </copyright> <interface name="zxdg_decoration_manager_v1" version="1"> <description summary="window decoration manager"> This interface allows a compositor to announce support for server-side decorations. A window decoration is a set of window controls as deemed appropriate by the party managing them, such as user interface components used to move, resize and change a window's state. A client can use this protocol to request being decorated by a supporting compositor. If compositor and client do not negotiate the use of a server-side decoration using this protocol, clients continue to self-decorate as they see fit. Warning! The protocol described in this file is experimental and backward incompatible changes may be made. Backward compatible changes may be added together with the corresponding interface version bump. Backward incompatible changes are done by bumping the version number in the protocol and interface names and resetting the interface version. Once the protocol is to be declared stable, the 'z' prefix and the version number in the protocol and interface names are removed and the interface version number is reset. </description> <request name="destroy" type="destructor"> <description summary="destroy the decoration manager object"> Destroy the decoration manager. This doesn't destroy objects created with the manager. </description> </request> <request name="get_toplevel_decoration"> <description summary="create a new toplevel decoration object"> Create a new decoration object associated with the given toplevel. Creating an xdg_toplevel_decoration from an xdg_toplevel which has a buffer attached or committed is a client error, and any attempts by a client to attach or manipulate a buffer prior to the first xdg_toplevel_decoration.configure event must also be treated as errors. </description> <arg name="id" type="new_id" interface="zxdg_toplevel_decoration_v1"/> <arg name="toplevel" type="object" interface="xdg_toplevel"/> </request> </interface> <interface name="zxdg_toplevel_decoration_v1" version="1"> <description summary="decoration object for a toplevel surface"> The decoration object allows the compositor to toggle server-side window decorations for a toplevel surface. The client can request to switch to another mode. The xdg_toplevel_decoration object must be destroyed before its xdg_toplevel. </description> <enum name="error"> <entry name="unconfigured_buffer" value="0" summary="xdg_toplevel has a buffer attached before configure"/> <entry name="already_constructed" value="1" summary="xdg_toplevel already has a decoration object"/> <entry name="orphaned" value="2" summary="xdg_toplevel destroyed before the decoration object"/> </enum> <request name="destroy" type="destructor"> <description summary="destroy the decoration object"> Switch back to a mode without any server-side decorations at the next commit. </description> </request> <enum name="mode"> <description summary="window decoration modes"> These values describe window decoration modes. </description> <entry name="client_side" value="1" summary="no server-side window decoration"/> <entry name="server_side" value="2" summary="server-side window decoration"/> </enum> <request name="set_mode"> <description summary="set the decoration mode"> Set the toplevel surface decoration mode. This informs the compositor that the client prefers the provided decoration mode. After requesting a decoration mode, the compositor will respond by emitting an xdg_surface.configure event. The client should then update its content, drawing it without decorations if the received mode is server-side decorations. The client must also acknowledge the configure when committing the new content (see xdg_surface.ack_configure). The compositor can decide not to use the client's mode and enforce a different mode instead. Clients whose decoration mode depend on the xdg_toplevel state may send a set_mode request in response to an xdg_surface.configure event and wait for the next xdg_surface.configure event to prevent unwanted state. Such clients are responsible for preventing configure loops and must make sure not to send multiple successive set_mode requests with the same decoration mode. </description> <arg name="mode" type="uint" enum="mode" summary="the decoration mode"/> </request> <request name="unset_mode"> <description summary="unset the decoration mode"> Unset the toplevel surface decoration mode. This informs the compositor that the client doesn't prefer a particular decoration mode. This request has the same semantics as set_mode. </description> </request> <event name="configure"> <description summary="suggest a surface change"> The configure event asks the client to change its decoration mode. The configured state should not be applied immediately. Clients must send an ack_configure in response to this event. See xdg_surface.configure and xdg_surface.ack_configure for details. A configure event can be sent at any time. The specified mode must be obeyed by the client. </description> <arg name="mode" type="uint" enum="mode" summary="the decoration mode"/> </event> </interface></protocol>vendor/glfw/deps/wayland/xdg-shell.xmladded
<?xml version="1.0" encoding="UTF-8"?><protocol name="xdg_shell"> <copyright> Copyright © 2008-2013 Kristian Høgsberg Copyright © 2013 Rafael Antognolli Copyright © 2013 Jasper St. Pierre Copyright © 2010-2013 Intel Corporation Copyright © 2015-2017 Samsung Electronics Co., Ltd Copyright © 2015-2017 Red Hat Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </copyright> <interface name="xdg_wm_base" version="6"> <description summary="create desktop-style surfaces"> The xdg_wm_base interface is exposed as a global object enabling clients to turn their wl_surfaces into windows in a desktop environment. It defines the basic functionality needed for clients and the compositor to create windows that can be dragged, resized, maximized, etc, as well as creating transient windows such as popup menus. </description> <enum name="error"> <entry name="role" value="0" summary="given wl_surface has another role"/> <entry name="defunct_surfaces" value="1" summary="xdg_wm_base was destroyed before children"/> <entry name="not_the_topmost_popup" value="2" summary="the client tried to map or destroy a non-topmost popup"/> <entry name="invalid_popup_parent" value="3" summary="the client specified an invalid popup parent surface"/> <entry name="invalid_surface_state" value="4" summary="the client provided an invalid surface state"/> <entry name="invalid_positioner" value="5" summary="the client provided an invalid positioner"/> <entry name="unresponsive" value="6" summary="the client didn’t respond to a ping event in time"/> </enum> <request name="destroy" type="destructor"> <description summary="destroy xdg_wm_base"> Destroy this xdg_wm_base object. Destroying a bound xdg_wm_base object while there are surfaces still alive created by this xdg_wm_base object instance is illegal and will result in a defunct_surfaces error. </description> </request> <request name="create_positioner"> <description summary="create a positioner object"> Create a positioner object. A positioner object is used to position surfaces relative to some parent surface. See the interface description and xdg_surface.get_popup for details. </description> <arg name="id" type="new_id" interface="xdg_positioner"/> </request> <request name="get_xdg_surface"> <description summary="create a shell surface from a surface"> This creates an xdg_surface for the given surface. While xdg_surface itself is not a role, the corresponding surface may only be assigned a role extending xdg_surface, such as xdg_toplevel or xdg_popup. It is illegal to create an xdg_surface for a wl_surface which already has an assigned role and this will result in a role error. This creates an xdg_surface for the given surface. An xdg_surface is used as basis to define a role to a given surface, such as xdg_toplevel or xdg_popup. It also manages functionality shared between xdg_surface based surface roles. See the documentation of xdg_surface for more details about what an xdg_surface is and how it is used. </description> <arg name="id" type="new_id" interface="xdg_surface"/> <arg name="surface" type="object" interface="wl_surface"/> </request> <request name="pong"> <description summary="respond to a ping event"> A client must respond to a ping event with a pong request or the client may be deemed unresponsive. See xdg_wm_base.ping and xdg_wm_base.error.unresponsive. </description> <arg name="serial" type="uint" summary="serial of the ping event"/> </request> <event name="ping"> <description summary="check if the client is alive"> The ping event asks the client if it's still alive. Pass the serial specified in the event back to the compositor by sending a "pong" request back with the specified serial. See xdg_wm_base.pong. Compositors can use this to determine if the client is still alive. It's unspecified what will happen if the client doesn't respond to the ping request, or in what timeframe. Clients should try to respond in a reasonable amount of time. The “unresponsive” error is provided for compositors that wish to disconnect unresponsive clients. A compositor is free to ping in any way it wants, but a client must always respond to any xdg_wm_base object it created. </description> <arg name="serial" type="uint" summary="pass this to the pong request"/> </event> </interface> <interface name="xdg_positioner" version="6"> <description summary="child surface positioner"> The xdg_positioner provides a collection of rules for the placement of a child surface relative to a parent surface. Rules can be defined to ensure the child surface remains within the visible area's borders, and to specify how the child surface changes its position, such as sliding along an axis, or flipping around a rectangle. These positioner-created rules are constrained by the requirement that a child surface must intersect with or be at least partially adjacent to its parent surface. See the various requests for details about possible rules. At the time of the request, the compositor makes a copy of the rules specified by the xdg_positioner. Thus, after the request is complete the xdg_positioner object can be destroyed or reused; further changes to the object will have no effect on previous usages. For an xdg_positioner object to be considered complete, it must have a non-zero size set by set_size, and a non-zero anchor rectangle set by set_anchor_rect. Passing an incomplete xdg_positioner object when positioning a surface raises an invalid_positioner error. </description> <enum name="error"> <entry name="invalid_input" value="0" summary="invalid input provided"/> </enum> <request name="destroy" type="destructor"> <description summary="destroy the xdg_positioner object"> Notify the compositor that the xdg_positioner will no longer be used. </description> </request> <request name="set_size"> <description summary="set the size of the to-be positioned rectangle"> Set the size of the surface that is to be positioned with the positioner object. The size is in surface-local coordinates and corresponds to the window geometry. See xdg_surface.set_window_geometry. If a zero or negative size is set the invalid_input error is raised. </description> <arg name="width" type="int" summary="width of positioned rectangle"/> <arg name="height" type="int" summary="height of positioned rectangle"/> </request> <request name="set_anchor_rect"> <description summary="set the anchor rectangle within the parent surface"> Specify the anchor rectangle within the parent surface that the child surface will be placed relative to. The rectangle is relative to the window geometry as defined by xdg_surface.set_window_geometry of the parent surface. When the xdg_positioner object is used to position a child surface, the anchor rectangle may not extend outside the window geometry of the positioned child's parent surface. If a negative size is set the invalid_input error is raised. </description> <arg name="x" type="int" summary="x position of anchor rectangle"/> <arg name="y" type="int" summary="y position of anchor rectangle"/> <arg name="width" type="int" summary="width of anchor rectangle"/> <arg name="height" type="int" summary="height of anchor rectangle"/> </request> <enum name="anchor"> <entry name="none" value="0"/> <entry name="top" value="1"/> <entry name="bottom" value="2"/> <entry name="left" value="3"/> <entry name="right" value="4"/> <entry name="top_left" value="5"/> <entry name="bottom_left" value="6"/> <entry name="top_right" value="7"/> <entry name="bottom_right" value="8"/> </enum> <request name="set_anchor"> <description summary="set anchor rectangle anchor"> Defines the anchor point for the anchor rectangle. The specified anchor is used derive an anchor point that the child surface will be positioned relative to. If a corner anchor is set (e.g. 'top_left' or 'bottom_right'), the anchor point will be at the specified corner; otherwise, the derived anchor point will be centered on the specified edge, or in the center of the anchor rectangle if no edge is specified. </description> <arg name="anchor" type="uint" enum="anchor" summary="anchor"/> </request> <enum name="gravity"> <entry name="none" value="0"/> <entry name="top" value="1"/> <entry name="bottom" value="2"/> <entry name="left" value="3"/> <entry name="right" value="4"/> <entry name="top_left" value="5"/> <entry name="bottom_left" value="6"/> <entry name="top_right" value="7"/> <entry name="bottom_right" value="8"/> </enum> <request name="set_gravity"> <description summary="set child surface gravity"> Defines in what direction a surface should be positioned, relative to the anchor point of the parent surface. If a corner gravity is specified (e.g. 'bottom_right' or 'top_left'), then the child surface will be placed towards the specified gravity; otherwise, the child surface will be centered over the anchor point on any axis that had no gravity specified. If the gravity is not in the ‘gravity’ enum, an invalid_input error is raised. </description> <arg name="gravity" type="uint" enum="gravity" summary="gravity direction"/> </request> <enum name="constraint_adjustment" bitfield="true"> <description summary="constraint adjustments"> The constraint adjustment value define ways the compositor will adjust the position of the surface, if the unadjusted position would result in the surface being partly constrained. Whether a surface is considered 'constrained' is left to the compositor to determine. For example, the surface may be partly outside the compositor's defined 'work area', thus necessitating the child surface's position be adjusted until it is entirely inside the work area. The adjustments can be combined, according to a defined precedence: 1) Flip, 2) Slide, 3) Resize. </description> <entry name="none" value="0"> <description summary="don't move the child surface when constrained"> Don't alter the surface position even if it is constrained on some axis, for example partially outside the edge of an output. </description> </entry> <entry name="slide_x" value="1"> <description summary="move along the x axis until unconstrained"> Slide the surface along the x axis until it is no longer constrained. First try to slide towards the direction of the gravity on the x axis until either the edge in the opposite direction of the gravity is unconstrained or the edge in the direction of the gravity is constrained. Then try to slide towards the opposite direction of the gravity on the x axis until either the edge in the direction of the gravity is unconstrained or the edge in the opposite direction of the gravity is constrained. </description> </entry> <entry name="slide_y" value="2"> <description summary="move along the y axis until unconstrained"> Slide the surface along the y axis until it is no longer constrained. First try to slide towards the direction of the gravity on the y axis until either the edge in the opposite direction of the gravity is unconstrained or the edge in the direction of the gravity is constrained. Then try to slide towards the opposite direction of the gravity on the y axis until either the edge in the direction of the gravity is unconstrained or the edge in the opposite direction of the gravity is constrained. </description> </entry> <entry name="flip_x" value="4"> <description summary="invert the anchor and gravity on the x axis"> Invert the anchor and gravity on the x axis if the surface is constrained on the x axis. For example, if the left edge of the surface is constrained, the gravity is 'left' and the anchor is 'left', change the gravity to 'right' and the anchor to 'right'. If the adjusted position also ends up being constrained, the resulting position of the flip_x adjustment will be the one before the adjustment. </description> </entry> <entry name="flip_y" value="8"> <description summary="invert the anchor and gravity on the y axis"> Invert the anchor and gravity on the y axis if the surface is constrained on the y axis. For example, if the bottom edge of the surface is constrained, the gravity is 'bottom' and the anchor is 'bottom', change the gravity to 'top' and the anchor to 'top'. The adjusted position is calculated given the original anchor rectangle and offset, but with the new flipped anchor and gravity values. If the adjusted position also ends up being constrained, the resulting position of the flip_y adjustment will be the one before the adjustment. </description> </entry> <entry name="resize_x" value="16"> <description summary="horizontally resize the surface"> Resize the surface horizontally so that it is completely unconstrained. </description> </entry> <entry name="resize_y" value="32"> <description summary="vertically resize the surface"> Resize the surface vertically so that it is completely unconstrained. </description> </entry> </enum> <request name="set_constraint_adjustment"> <description summary="set the adjustment to be done when constrained"> Specify how the window should be positioned if the originally intended position caused the surface to be constrained, meaning at least partially outside positioning boundaries set by the compositor. The adjustment is set by constructing a bitmask describing the adjustment to be made when the surface is constrained on that axis. If no bit for one axis is set, the compositor will assume that the child surface should not change its position on that axis when constrained. If more than one bit for one axis is set, the order of how adjustments are applied is specified in the corresponding adjustment descriptions. The default adjustment is none. </description> <arg name="constraint_adjustment" type="uint" summary="bit mask of constraint adjustments"/> </request> <request name="set_offset"> <description summary="set surface position offset"> Specify the surface position offset relative to the position of the anchor on the anchor rectangle and the anchor on the surface. For example if the anchor of the anchor rectangle is at (x, y), the surface has the gravity bottom|right, and the offset is (ox, oy), the calculated surface position will be (x + ox, y + oy). The offset position of the surface is the one used for constraint testing. See set_constraint_adjustment. An example use case is placing a popup menu on top of a user interface element, while aligning the user interface element of the parent surface with some user interface element placed somewhere in the popup surface. </description> <arg name="x" type="int" summary="surface position x offset"/> <arg name="y" type="int" summary="surface position y offset"/> </request> <!-- Version 3 additions --> <request name="set_reactive" since="3"> <description summary="continuously reconstrain the surface"> When set reactive, the surface is reconstrained if the conditions used for constraining changed, e.g. the parent window moved. If the conditions changed and the popup was reconstrained, an xdg_popup.configure event is sent with updated geometry, followed by an xdg_surface.configure event. </description> </request> <request name="set_parent_size" since="3"> <description summary=""> Set the parent window geometry the compositor should use when positioning the popup. The compositor may use this information to determine the future state the popup should be constrained using. If this doesn't match the dimension of the parent the popup is eventually positioned against, the behavior is undefined. The arguments are given in the surface-local coordinate space. </description> <arg name="parent_width" type="int" summary="future window geometry width of parent"/> <arg name="parent_height" type="int" summary="future window geometry height of parent"/> </request> <request name="set_parent_configure" since="3"> <description summary="set parent configure this is a response to"> Set the serial of an xdg_surface.configure event this positioner will be used in response to. The compositor may use this information together with set_parent_size to determine what future state the popup should be constrained using. </description> <arg name="serial" type="uint" summary="serial of parent configure event"/> </request> </interface> <interface name="xdg_surface" version="6"> <description summary="desktop user interface surface base interface"> An interface that may be implemented by a wl_surface, for implementations that provide a desktop-style user interface. It provides a base set of functionality required to construct user interface elements requiring management by the compositor, such as toplevel windows, menus, etc. The types of functionality are split into xdg_surface roles. Creating an xdg_surface does not set the role for a wl_surface. In order to map an xdg_surface, the client must create a role-specific object using, e.g., get_toplevel, get_popup. The wl_surface for any given xdg_surface can have at most one role, and may not be assigned any role not based on xdg_surface. A role must be assigned before any other requests are made to the xdg_surface object. The client must call wl_surface.commit on the corresponding wl_surface for the xdg_surface state to take effect. Creating an xdg_surface from a wl_surface which has a buffer attached or committed is a client error, and any attempts by a client to attach or manipulate a buffer prior to the first xdg_surface.configure call must also be treated as errors. After creating a role-specific object and setting it up, the client must perform an initial commit without any buffer attached. The compositor will reply with initial wl_surface state such as wl_surface.preferred_buffer_scale followed by an xdg_surface.configure event. The client must acknowledge it and is then allowed to attach a buffer to map the surface. Mapping an xdg_surface-based role surface is defined as making it possible for the surface to be shown by the compositor. Note that a mapped surface is not guaranteed to be visible once it is mapped. For an xdg_surface to be mapped by the compositor, the following conditions must be met: (1) the client has assigned an xdg_surface-based role to the surface (2) the client has set and committed the xdg_surface state and the role-dependent state to the surface (3) the client has committed a buffer to the surface A newly-unmapped surface is considered to have met condition (1) out of the 3 required conditions for mapping a surface if its role surface has not been destroyed, i.e. the client must perform the initial commit again before attaching a buffer. </description> <enum name="error"> <entry name="not_constructed" value="1" summary="Surface was not fully constructed"/> <entry name="already_constructed" value="2" summary="Surface was already constructed"/> <entry name="unconfigured_buffer" value="3" summary="Attaching a buffer to an unconfigured surface"/> <entry name="invalid_serial" value="4" summary="Invalid serial number when acking a configure event"/> <entry name="invalid_size" value="5" summary="Width or height was zero or negative"/> <entry name="defunct_role_object" value="6" summary="Surface was destroyed before its role object"/> </enum> <request name="destroy" type="destructor"> <description summary="destroy the xdg_surface"> Destroy the xdg_surface object. An xdg_surface must only be destroyed after its role object has been destroyed, otherwise a defunct_role_object error is raised. </description> </request> <request name="get_toplevel"> <description summary="assign the xdg_toplevel surface role"> This creates an xdg_toplevel object for the given xdg_surface and gives the associated wl_surface the xdg_toplevel role. See the documentation of xdg_toplevel for more details about what an xdg_toplevel is and how it is used. </description> <arg name="id" type="new_id" interface="xdg_toplevel"/> </request> <request name="get_popup"> <description summary="assign the xdg_popup surface role"> This creates an xdg_popup object for the given xdg_surface and gives the associated wl_surface the xdg_popup role.Showing the first 500 of 1371 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/include/GLFW/glfw3.hadded
/************************************************************************* * GLFW 3.5 - www.glfw.org * A library for OpenGL, window and input *------------------------------------------------------------------------ * Copyright (c) 2002-2006 Marcus Geelnard * Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org> * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would * be appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not * be misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source * distribution. * *************************************************************************/#ifndef _glfw3_h_#define _glfw3_h_#ifdef __cplusplusextern "C" {#endif/************************************************************************* * Doxygen documentation *************************************************************************//*! @file glfw3.h * @brief The header of the GLFW 3 API. * * This is the header file of the GLFW 3 API. It defines all its types and * declares all its functions. * * For more information about how to use this file, see @ref build_include. *//*! @defgroup context Context reference * @brief Functions and types related to OpenGL and OpenGL ES contexts. * * This is the reference documentation for OpenGL and OpenGL ES context related * functions. For more task-oriented information, see the @ref context_guide. *//*! @defgroup vulkan Vulkan support reference * @brief Functions and types related to Vulkan. * * This is the reference documentation for Vulkan related functions and types. * For more task-oriented information, see the @ref vulkan_guide. *//*! @defgroup init Initialization, version and error reference * @brief Functions and types related to initialization and error handling. * * This is the reference documentation for initialization and termination of * the library, version management and error handling. For more task-oriented * information, see the @ref intro_guide. *//*! @defgroup input Input reference * @brief Functions and types related to input handling. * * This is the reference documentation for input related functions and types. * For more task-oriented information, see the @ref input_guide. *//*! @defgroup monitor Monitor reference * @brief Functions and types related to monitors. * * This is the reference documentation for monitor related functions and types. * For more task-oriented information, see the @ref monitor_guide. *//*! @defgroup window Window reference * @brief Functions and types related to windows. * * This is the reference documentation for window related functions and types, * including creation, deletion and event polling. For more task-oriented * information, see the @ref window_guide. *//************************************************************************* * Compiler- and platform-specific preprocessor work *************************************************************************//* If we are we on Windows, we want a single define for it. */#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) #define _WIN32#endif /* _WIN32 *//* Include because most Windows GLU headers need wchar_t and * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h. * Include it unconditionally to avoid surprising side-effects. */#include <stddef.h>/* Include because it is needed by Vulkan and related functions. * Include it unconditionally to avoid surprising side-effects. */#include <stdint.h>#if defined(GLFW_INCLUDE_VULKAN) #include <vulkan/vulkan.h>#endif /* Vulkan header *//* The Vulkan header may have indirectly included windows.h (because of * VK_USE_PLATFORM_WIN32_KHR) so we offer our replacement symbols after it. *//* It is customary to use APIENTRY for OpenGL function pointer declarations on * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. */#if !defined(APIENTRY) #if defined(_WIN32) #define APIENTRY __stdcall #else #define APIENTRY #endif #define GLFW_APIENTRY_DEFINED#endif /* APIENTRY *//* Some Windows OpenGL headers need this. */#if !defined(WINGDIAPI) && defined(_WIN32) #define WINGDIAPI __declspec(dllimport) #define GLFW_WINGDIAPI_DEFINED#endif /* WINGDIAPI *//* Some Windows GLU headers need this. */#if !defined(CALLBACK) && defined(_WIN32) #define CALLBACK __stdcall #define GLFW_CALLBACK_DEFINED#endif /* CALLBACK *//* Include the chosen OpenGL or OpenGL ES headers. */#if defined(GLFW_INCLUDE_ES1) #include <GLES/gl.h> #if defined(GLFW_INCLUDE_GLEXT) #include <GLES/glext.h> #endif#elif defined(GLFW_INCLUDE_ES2) #include <GLES2/gl2.h> #if defined(GLFW_INCLUDE_GLEXT) #include <GLES2/gl2ext.h> #endif#elif defined(GLFW_INCLUDE_ES3) #include <GLES3/gl3.h> #if defined(GLFW_INCLUDE_GLEXT) #include <GLES2/gl2ext.h> #endif#elif defined(GLFW_INCLUDE_ES31) #include <GLES3/gl31.h> #if defined(GLFW_INCLUDE_GLEXT) #include <GLES2/gl2ext.h> #endif#elif defined(GLFW_INCLUDE_ES32) #include <GLES3/gl32.h> #if defined(GLFW_INCLUDE_GLEXT) #include <GLES2/gl2ext.h> #endif#elif defined(GLFW_INCLUDE_GLCOREARB) #if defined(__APPLE__) #include <OpenGL/gl3.h> #if defined(GLFW_INCLUDE_GLEXT) #include <OpenGL/gl3ext.h> #endif /*GLFW_INCLUDE_GLEXT*/ #else /*__APPLE__*/ #include <GL/glcorearb.h> #if defined(GLFW_INCLUDE_GLEXT) #include <GL/glext.h> #endif #endif /*__APPLE__*/#elif defined(GLFW_INCLUDE_GLU) #if defined(__APPLE__) #if defined(GLFW_INCLUDE_GLU) #include <OpenGL/glu.h> #endif #else /*__APPLE__*/ #if defined(GLFW_INCLUDE_GLU) #include <GL/glu.h> #endif #endif /*__APPLE__*/#elif !defined(GLFW_INCLUDE_NONE) && \ !defined(__gl_h_) && \ !defined(__gles1_gl_h_) && \ !defined(__gles2_gl2_h_) && \ !defined(__gles2_gl3_h_) && \ !defined(__gles2_gl31_h_) && \ !defined(__gles2_gl32_h_) && \ !defined(__gl_glcorearb_h_) && \ !defined(__gl2_h_) /*legacy*/ && \ !defined(__gl3_h_) /*legacy*/ && \ !defined(__gl31_h_) /*legacy*/ && \ !defined(__gl32_h_) /*legacy*/ && \ !defined(__glcorearb_h_) /*legacy*/ && \ !defined(__GL_H__) /*non-standard*/ && \ !defined(__gltypes_h_) /*non-standard*/ && \ !defined(__glee_h_) /*non-standard*/ #if defined(__APPLE__) #if !defined(GLFW_INCLUDE_GLEXT) #define GL_GLEXT_LEGACY #endif #include <OpenGL/gl.h> #else /*__APPLE__*/ #include <GL/gl.h> #if defined(GLFW_INCLUDE_GLEXT) #include <GL/glext.h> #endif #endif /*__APPLE__*/#endif /* OpenGL and OpenGL ES headers */#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) /* GLFW_DLL must be defined by applications that are linking against the DLL * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW * configuration header when compiling the DLL version of the library. */ #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined"#endif/* GLFWAPI is used to declare public API functions for export * from the DLL / shared library / dynamic library. */#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) /* We are building GLFW as a Win32 DLL */ #define GLFWAPI __declspec(dllexport)#elif defined(_WIN32) && defined(GLFW_DLL) /* We are calling a GLFW Win32 DLL */ #define GLFWAPI __declspec(dllimport)#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) /* We are building GLFW as a Unix shared library */ #define GLFWAPI __attribute__((visibility("default")))#else #define GLFWAPI#endif/************************************************************************* * GLFW API tokens *************************************************************************//*! @name GLFW version macros * @{ *//*! @brief The major version number of the GLFW header. * * The major version number of the GLFW header. This is incremented when the * API is changed in non-compatible ways. * @ingroup init */#define GLFW_VERSION_MAJOR 3/*! @brief The minor version number of the GLFW header. * * The minor version number of the GLFW header. This is incremented when * features are added to the API but it remains backward-compatible. * @ingroup init */#define GLFW_VERSION_MINOR 5/*! @brief The revision number of the GLFW header. * * The revision number of the GLFW header. This is incremented when a bug fix * release is made that does not contain any API changes. * @ingroup init */#define GLFW_VERSION_REVISION 1/*! @} *//*! @brief One. * * This is only semantic sugar for the number 1. You can instead use `1` or * `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal * to one. * * @ingroup init */#define GLFW_TRUE 1/*! @brief Zero. * * This is only semantic sugar for the number 0. You can instead use `0` or * `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is * equal to zero. * * @ingroup init */#define GLFW_FALSE 0/*! @name Key and button actions * @{ *//*! @brief The key or mouse button was released. * * The key or mouse button was released. * * @ingroup input */#define GLFW_RELEASE 0/*! @brief The key or mouse button was pressed. * * The key or mouse button was pressed. * * @ingroup input */#define GLFW_PRESS 1/*! @brief The key was held down until it repeated. * * The key was held down until it repeated. * * @ingroup input */#define GLFW_REPEAT 2/*! @} *//*! @defgroup hat_state Joystick hat states * @brief Joystick hat states. * * See [joystick hat input](@ref joystick_hat) for how these are used. * * @ingroup input * @{ */#define GLFW_HAT_CENTERED 0#define GLFW_HAT_UP 1#define GLFW_HAT_RIGHT 2#define GLFW_HAT_DOWN 4#define GLFW_HAT_LEFT 8#define GLFW_HAT_RIGHT_UP (GLFW_HAT_RIGHT | GLFW_HAT_UP)#define GLFW_HAT_RIGHT_DOWN (GLFW_HAT_RIGHT | GLFW_HAT_DOWN)#define GLFW_HAT_LEFT_UP (GLFW_HAT_LEFT | GLFW_HAT_UP)#define GLFW_HAT_LEFT_DOWN (GLFW_HAT_LEFT | GLFW_HAT_DOWN)/*! @ingroup input */#define GLFW_KEY_UNKNOWN -1/*! @} *//*! @defgroup keys Keyboard key tokens * @brief Keyboard key tokens. * * See [key input](@ref input_key) for how these are used. * * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), * but re-arranged to map to 7-bit ASCII for printable keys (function keys are * put in the 256+ range). * * The naming of the key codes follow these rules: * - The US keyboard layout is used * - Names of printable alphanumeric characters are used (e.g. "A", "R", * "3", etc.) * - For non-alphanumeric characters, Unicode:ish names are used (e.g. * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not * correspond to the Unicode standard (usually for brevity) * - Keys that lack a clear US mapping are named "WORLD_x" * - For non-printable keys, custom names are used (e.g. "F4", * "BACKSPACE", etc.) * * @ingroup input * @{ *//* Printable keys */#define GLFW_KEY_SPACE 32#define GLFW_KEY_APOSTROPHE 39 /* ' */#define GLFW_KEY_COMMA 44 /* , */#define GLFW_KEY_MINUS 45 /* - */#define GLFW_KEY_PERIOD 46 /* . */#define GLFW_KEY_SLASH 47 /* / */#define GLFW_KEY_0 48#define GLFW_KEY_1 49#define GLFW_KEY_2 50#define GLFW_KEY_3 51#define GLFW_KEY_4 52#define GLFW_KEY_5 53#define GLFW_KEY_6 54#define GLFW_KEY_7 55#define GLFW_KEY_8 56#define GLFW_KEY_9 57#define GLFW_KEY_SEMICOLON 59 /* ; */#define GLFW_KEY_EQUAL 61 /* = */#define GLFW_KEY_A 65#define GLFW_KEY_B 66#define GLFW_KEY_C 67#define GLFW_KEY_D 68#define GLFW_KEY_E 69#define GLFW_KEY_F 70#define GLFW_KEY_G 71#define GLFW_KEY_H 72#define GLFW_KEY_I 73#define GLFW_KEY_J 74#define GLFW_KEY_K 75#define GLFW_KEY_L 76#define GLFW_KEY_M 77#define GLFW_KEY_N 78#define GLFW_KEY_O 79#define GLFW_KEY_P 80#define GLFW_KEY_Q 81#define GLFW_KEY_R 82#define GLFW_KEY_S 83#define GLFW_KEY_T 84#define GLFW_KEY_U 85#define GLFW_KEY_V 86#define GLFW_KEY_W 87#define GLFW_KEY_X 88#define GLFW_KEY_Y 89#define GLFW_KEY_Z 90#define GLFW_KEY_LEFT_BRACKET 91 /* [ */#define GLFW_KEY_BACKSLASH 92 /* \ */#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */#define GLFW_KEY_WORLD_1 161 /* non-US #1 */#define GLFW_KEY_WORLD_2 162 /* non-US #2 *//* Function keys */#define GLFW_KEY_ESCAPE 256#define GLFW_KEY_ENTER 257#define GLFW_KEY_TAB 258#define GLFW_KEY_BACKSPACE 259#define GLFW_KEY_INSERT 260#define GLFW_KEY_DELETE 261#define GLFW_KEY_RIGHT 262#define GLFW_KEY_LEFT 263#define GLFW_KEY_DOWN 264#define GLFW_KEY_UP 265#define GLFW_KEY_PAGE_UP 266#define GLFW_KEY_PAGE_DOWN 267#define GLFW_KEY_HOME 268#define GLFW_KEY_END 269#define GLFW_KEY_CAPS_LOCK 280#define GLFW_KEY_SCROLL_LOCK 281#define GLFW_KEY_NUM_LOCK 282#define GLFW_KEY_PRINT_SCREEN 283#define GLFW_KEY_PAUSE 284#define GLFW_KEY_F1 290#define GLFW_KEY_F2 291#define GLFW_KEY_F3 292#define GLFW_KEY_F4 293#define GLFW_KEY_F5 294#define GLFW_KEY_F6 295#define GLFW_KEY_F7 296#define GLFW_KEY_F8 297#define GLFW_KEY_F9 298#define GLFW_KEY_F10 299#define GLFW_KEY_F11 300#define GLFW_KEY_F12 301#define GLFW_KEY_F13 302#define GLFW_KEY_F14 303#define GLFW_KEY_F15 304#define GLFW_KEY_F16 305#define GLFW_KEY_F17 306#define GLFW_KEY_F18 307#define GLFW_KEY_F19 308#define GLFW_KEY_F20 309#define GLFW_KEY_F21 310#define GLFW_KEY_F22 311#define GLFW_KEY_F23 312#define GLFW_KEY_F24 313#define GLFW_KEY_F25 314#define GLFW_KEY_KP_0 320#define GLFW_KEY_KP_1 321#define GLFW_KEY_KP_2 322#define GLFW_KEY_KP_3 323#define GLFW_KEY_KP_4 324#define GLFW_KEY_KP_5 325#define GLFW_KEY_KP_6 326#define GLFW_KEY_KP_7 327Showing the first 500 of 6578 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/include/GLFW/glfw3native.hadded
/************************************************************************* * GLFW 3.5 - www.glfw.org * A library for OpenGL, window and input *------------------------------------------------------------------------ * Copyright (c) 2002-2006 Marcus Geelnard * Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org> * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would * be appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not * be misrepresented as being the original software. * * 3. This notice may not be removed or altered from any source * distribution. * *************************************************************************/#ifndef _glfw3_native_h_#define _glfw3_native_h_#ifdef __cplusplusextern "C" {#endif/************************************************************************* * Doxygen documentation *************************************************************************//*! @file glfw3native.h * @brief The header of the native access functions. * * This is the header file of the native access functions. See @ref native for * more information. *//*! @defgroup native Native access * @brief Functions related to accessing native handles. * * **By using the native access functions you assert that you know what you're * doing and how to fix problems caused by using them. If you don't, you * shouldn't be using them.** * * Before the inclusion of @ref glfw3native.h, you may define zero or more * window system API macro and zero or more context creation API macros. * * The chosen backends must match those the library was compiled for. Failure * to do this will cause a link-time error. * * The available window API macros are: * * `GLFW_EXPOSE_NATIVE_WIN32` * * `GLFW_EXPOSE_NATIVE_COCOA` * * `GLFW_EXPOSE_NATIVE_X11` * * `GLFW_EXPOSE_NATIVE_WAYLAND` * * The available context API macros are: * * `GLFW_EXPOSE_NATIVE_WGL` * * `GLFW_EXPOSE_NATIVE_NSGL` * * `GLFW_EXPOSE_NATIVE_GLX` * * `GLFW_EXPOSE_NATIVE_EGL` * * `GLFW_EXPOSE_NATIVE_OSMESA` * * These macros select which of the native access functions that are declared * and which platform-specific headers to include. It is then up your (by * definition platform-specific) code to handle which of these should be * defined. * * If you do not want the platform-specific headers to be included, define * `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header. * * @code * #define GLFW_EXPOSE_NATIVE_WIN32 * #define GLFW_EXPOSE_NATIVE_WGL * #define GLFW_NATIVE_INCLUDE_NONE * #include <GLFW/glfw3native.h> * @endcode *//************************************************************************* * System headers and types *************************************************************************/#if !defined(GLFW_NATIVE_INCLUDE_NONE) #if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) /* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for * example to allow applications to correctly declare a GL_KHR_debug callback) * but windows.h assumes no one will define APIENTRY before it does */ #if defined(GLFW_APIENTRY_DEFINED) #undef APIENTRY #undef GLFW_APIENTRY_DEFINED #endif #include <windows.h> #endif #if defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) #if defined(__OBJC__) #import <Cocoa/Cocoa.h> #else #include <ApplicationServices/ApplicationServices.h> #include <objc/objc.h> #endif #endif #if defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) #include <X11/Xlib.h> #include <X11/extensions/Xrandr.h> #endif #if defined(GLFW_EXPOSE_NATIVE_WAYLAND) #include <wayland-client.h> #endif #if defined(GLFW_EXPOSE_NATIVE_WGL) /* WGL is declared by windows.h */ #endif #if defined(GLFW_EXPOSE_NATIVE_NSGL) /* NSGL is declared by Cocoa.h */ #endif #if defined(GLFW_EXPOSE_NATIVE_GLX) /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by * default it also acts as an OpenGL header * However, glx.h will include gl.h, which will define it unconditionally */ #if defined(GLFW_GLAPIENTRY_DEFINED) #undef GLAPIENTRY #undef GLFW_GLAPIENTRY_DEFINED #endif #include <GL/glx.h> #endif #if defined(GLFW_EXPOSE_NATIVE_EGL) #include <EGL/egl.h> #endif #if defined(GLFW_EXPOSE_NATIVE_OSMESA) /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by * default it also acts as an OpenGL header * However, osmesa.h will include gl.h, which will define it unconditionally */ #if defined(GLFW_GLAPIENTRY_DEFINED) #undef GLAPIENTRY #undef GLFW_GLAPIENTRY_DEFINED #endif #include <GL/osmesa.h> #endif#endif /*GLFW_NATIVE_INCLUDE_NONE*//************************************************************************* * Functions *************************************************************************/#if defined(GLFW_EXPOSE_NATIVE_WIN32)/*! @brief Returns the adapter device name of the specified monitor. * * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) * of the specified monitor, or `NULL` if an [error](@ref error_handling) * occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.1. * * @ingroup native */GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor);/*! @brief Returns the display device name of the specified monitor. * * @return The UTF-8 encoded display device name (for example * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.1. * * @ingroup native */GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor);/*! @brief Returns the `HWND` of the specified window. * * @return The `HWND` of the specified window, or `NULL` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @remark The `HDC` associated with the window can be queried with the * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) * function. * @code * HDC dc = GetDC(glfwGetWin32Window(window)); * @endcode * This DC is private and does not need to be released. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.0. * * @ingroup native */GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window);#endif#if defined(GLFW_EXPOSE_NATIVE_WGL)/*! @brief Returns the `HGLRC` of the specified window. * * @return The `HGLRC` of the specified window, or `NULL` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT. * * @remark The `HDC` associated with the window can be queried with the * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) * function. * @code * HDC dc = GetDC(glfwGetWin32Window(window)); * @endcode * This DC is private and does not need to be released. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.0. * * @ingroup native */GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window);#endif#if defined(GLFW_EXPOSE_NATIVE_COCOA)/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. * * @return The `CGDirectDisplayID` of the specified monitor, or * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.1. * * @ingroup native */GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor);/*! @brief Returns the `NSWindow` of the specified window. * * @return The `NSWindow` of the specified window, or `nil` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.0. * * @ingroup native */GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window);/*! @brief Returns the `NSView` of the specified window. * * @return The `NSView` of the specified window, or `nil` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.4. * * @ingroup native */GLFWAPI id glfwGetCocoaView(GLFWwindow* window);#endif#if defined(GLFW_EXPOSE_NATIVE_NSGL)/*! @brief Returns the `NSOpenGLContext` of the specified window. * * @return The `NSOpenGLContext` of the specified window, or `nil` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.0. * * @ingroup native */GLFWAPI id glfwGetNSGLContext(GLFWwindow* window);#endif#if defined(GLFW_EXPOSE_NATIVE_X11)/*! @brief Returns the `Display` used by GLFW. * * @return The `Display` used by GLFW, or `NULL` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.0. * * @ingroup native */GLFWAPI Display* glfwGetX11Display(void);/*! @brief Returns the `RRCrtc` of the specified monitor. * * @return The `RRCrtc` of the specified monitor, or `None` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.1. * * @ingroup native */GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor);/*! @brief Returns the `RROutput` of the specified monitor. * * @return The `RROutput` of the specified monitor, or `None` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.1. * * @ingroup native */GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor);/*! @brief Returns the `Window` of the specified window. * * @return The `Window` of the specified window, or `None` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref * GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.0. * * @ingroup native */GLFWAPI Window glfwGetX11Window(GLFWwindow* window);/*! @brief Sets the current primary selection to the specified string. * * @param[in] string A UTF-8 encoded string. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. * * @pointer_lifetime The specified string is copied before this function * returns. * * @thread_safety This function must only be called from the main thread. * * @sa @ref clipboard * @sa glfwGetX11SelectionString * @sa glfwSetClipboardString * * @since Added in version 3.3. * * @ingroup native */GLFWAPI void glfwSetX11SelectionString(const char* string);/*! @brief Returns the contents of the current primary selection as a string. * * If the selection is empty or if its contents cannot be converted, `NULL` * is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated. * * @return The contents of the selection as a UTF-8 encoded string, or `NULL` * if an [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. * * @pointer_lifetime The returned string is allocated and freed by GLFW. You * should not free it yourself. It is valid until the next call to @ref * glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the * library is terminated. * * @thread_safety This function must only be called from the main thread. * * @sa @ref clipboard * @sa glfwSetX11SelectionString * @sa glfwGetClipboardString * * @since Added in version 3.3. * * @ingroup native */GLFWAPI const char* glfwGetX11SelectionString(void);#endif#if defined(GLFW_EXPOSE_NATIVE_GLX)/*! @brief Returns the `GLXContext` of the specified window. * * @return The `GLXContext` of the specified window, or `NULL` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.0. * * @ingroup native */GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window);/*! @brief Returns the `GLXWindow` of the specified window. * * @return The `GLXWindow` of the specified window, or `None` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.2. * * @ingroup native */GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window);/*! @brief Retrieves the `GLXFBConfig` of the specified window's `GLXWindow`. * * @param[in] window The window whose `GLXWindow` to query. * @param[out] config The `GLXFBConfig` of the window `GLXWindow`, if available. * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an * [error](@ref error_handling) occurred. * * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE. * * @remark `GLXFBConfig` is an opaque type. Unlike other GLFW functions, the * @p config out parameter is not cleared on error, as core GLX does not define * any invalid value. * * @thread_safety This function may be called from any thread. Access is not * synchronized. * * @since Added in version 3.5Showing the first 500 of 710 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/cocoa_init.madded
//========================================================================// GLFW 3.5 Cocoa - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_COCOA)#include <sys/param.h> // For MAXPATHLEN// Needed for _NSGetProgname#include <crt_externs.h>// Change to our application bundle's resources directory, if present//static void changeToResourcesDirectory(void){ char resourcesPath[MAXPATHLEN]; CFBundleRef bundle = CFBundleGetMainBundle(); if (!bundle) return; CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(bundle); CFStringRef last = CFURLCopyLastPathComponent(resourcesURL); if (CFStringCompare(CFSTR("Resources"), last, 0) != kCFCompareEqualTo) { CFRelease(last); CFRelease(resourcesURL); return; } CFRelease(last); if (!CFURLGetFileSystemRepresentation(resourcesURL, true, (UInt8*) resourcesPath, MAXPATHLEN)) { CFRelease(resourcesURL); return; } CFRelease(resourcesURL); chdir(resourcesPath);}// Set up the menu bar (manually)// This is nasty, nasty stuff -- calls to undocumented semi-private APIs that// could go away at any moment, lots of stuff that really should be// localize(d|able), etc. Add a nib to save us this horror.//static void createMenuBar(void){ NSString* appName = nil; NSDictionary* bundleInfo = [[NSBundle mainBundle] infoDictionary]; NSString* nameKeys[] = { @"CFBundleDisplayName", @"CFBundleName", @"CFBundleExecutable", }; // Try to figure out what the calling application is called for (size_t i = 0; i < sizeof(nameKeys) / sizeof(nameKeys[0]); i++) { id name = bundleInfo[nameKeys[i]]; if (name && [name isKindOfClass:[NSString class]] && ![name isEqualToString:@""]) { appName = name; break; } } if (!appName) { char** progname = _NSGetProgname(); if (progname && *progname) appName = @(*progname); else appName = @"GLFW Application"; } NSMenu* bar = [[NSMenu alloc] init]; [NSApp setMainMenu:bar]; NSMenuItem* appMenuItem = [bar addItemWithTitle:@"" action:NULL keyEquivalent:@""]; NSMenu* appMenu = [[NSMenu alloc] init]; [appMenuItem setSubmenu:appMenu]; [appMenu addItemWithTitle:[NSString stringWithFormat:@"About %@", appName] action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""]; [appMenu addItem:[NSMenuItem separatorItem]]; NSMenu* servicesMenu = [[NSMenu alloc] init]; [NSApp setServicesMenu:servicesMenu]; [[appMenu addItemWithTitle:@"Services" action:NULL keyEquivalent:@""] setSubmenu:servicesMenu]; [servicesMenu release]; [appMenu addItem:[NSMenuItem separatorItem]]; [appMenu addItemWithTitle:[NSString stringWithFormat:@"Hide %@", appName] action:@selector(hide:) keyEquivalent:@"h"]; [[appMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"] setKeyEquivalentModifierMask:NSEventModifierFlagOption | NSEventModifierFlagCommand]; [appMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""]; [appMenu addItem:[NSMenuItem separatorItem]]; [appMenu addItemWithTitle:[NSString stringWithFormat:@"Quit %@", appName] action:@selector(terminate:) keyEquivalent:@"q"]; NSMenuItem* windowMenuItem = [bar addItemWithTitle:@"" action:NULL keyEquivalent:@""]; [bar release]; NSMenu* windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; [NSApp setWindowsMenu:windowMenu]; [windowMenuItem setSubmenu:windowMenu]; [windowMenu addItemWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; [windowMenu addItemWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""]; [windowMenu addItem:[NSMenuItem separatorItem]]; [windowMenu addItemWithTitle:@"Bring All to Front" action:@selector(arrangeInFront:) keyEquivalent:@""]; // TODO: Make this appear at the bottom of the menu (for consistency) [windowMenu addItem:[NSMenuItem separatorItem]]; [[windowMenu addItemWithTitle:@"Enter Full Screen" action:@selector(toggleFullScreen:) keyEquivalent:@"f"] setKeyEquivalentModifierMask:NSEventModifierFlagControl | NSEventModifierFlagCommand]; // Prior to Snow Leopard, we need to use this oddly-named semi-private API // to get the application menu working properly. SEL setAppleMenuSelector = NSSelectorFromString(@"setAppleMenu:"); [NSApp performSelector:setAppleMenuSelector withObject:appMenu];}// Create key code translation tables//static void createKeyTables(void){ memset(_glfw.ns.keycodes, -1, sizeof(_glfw.ns.keycodes)); memset(_glfw.ns.scancodes, -1, sizeof(_glfw.ns.scancodes)); _glfw.ns.keycodes[0x1D] = GLFW_KEY_0; _glfw.ns.keycodes[0x12] = GLFW_KEY_1; _glfw.ns.keycodes[0x13] = GLFW_KEY_2; _glfw.ns.keycodes[0x14] = GLFW_KEY_3; _glfw.ns.keycodes[0x15] = GLFW_KEY_4; _glfw.ns.keycodes[0x17] = GLFW_KEY_5; _glfw.ns.keycodes[0x16] = GLFW_KEY_6; _glfw.ns.keycodes[0x1A] = GLFW_KEY_7; _glfw.ns.keycodes[0x1C] = GLFW_KEY_8; _glfw.ns.keycodes[0x19] = GLFW_KEY_9; _glfw.ns.keycodes[0x00] = GLFW_KEY_A; _glfw.ns.keycodes[0x0B] = GLFW_KEY_B; _glfw.ns.keycodes[0x08] = GLFW_KEY_C; _glfw.ns.keycodes[0x02] = GLFW_KEY_D; _glfw.ns.keycodes[0x0E] = GLFW_KEY_E; _glfw.ns.keycodes[0x03] = GLFW_KEY_F; _glfw.ns.keycodes[0x05] = GLFW_KEY_G; _glfw.ns.keycodes[0x04] = GLFW_KEY_H; _glfw.ns.keycodes[0x22] = GLFW_KEY_I; _glfw.ns.keycodes[0x26] = GLFW_KEY_J; _glfw.ns.keycodes[0x28] = GLFW_KEY_K; _glfw.ns.keycodes[0x25] = GLFW_KEY_L; _glfw.ns.keycodes[0x2E] = GLFW_KEY_M; _glfw.ns.keycodes[0x2D] = GLFW_KEY_N; _glfw.ns.keycodes[0x1F] = GLFW_KEY_O; _glfw.ns.keycodes[0x23] = GLFW_KEY_P; _glfw.ns.keycodes[0x0C] = GLFW_KEY_Q; _glfw.ns.keycodes[0x0F] = GLFW_KEY_R; _glfw.ns.keycodes[0x01] = GLFW_KEY_S; _glfw.ns.keycodes[0x11] = GLFW_KEY_T; _glfw.ns.keycodes[0x20] = GLFW_KEY_U; _glfw.ns.keycodes[0x09] = GLFW_KEY_V; _glfw.ns.keycodes[0x0D] = GLFW_KEY_W; _glfw.ns.keycodes[0x07] = GLFW_KEY_X; _glfw.ns.keycodes[0x10] = GLFW_KEY_Y; _glfw.ns.keycodes[0x06] = GLFW_KEY_Z; _glfw.ns.keycodes[0x27] = GLFW_KEY_APOSTROPHE; _glfw.ns.keycodes[0x2A] = GLFW_KEY_BACKSLASH; _glfw.ns.keycodes[0x2B] = GLFW_KEY_COMMA; _glfw.ns.keycodes[0x18] = GLFW_KEY_EQUAL; _glfw.ns.keycodes[0x32] = GLFW_KEY_GRAVE_ACCENT; _glfw.ns.keycodes[0x21] = GLFW_KEY_LEFT_BRACKET; _glfw.ns.keycodes[0x1B] = GLFW_KEY_MINUS; _glfw.ns.keycodes[0x2F] = GLFW_KEY_PERIOD; _glfw.ns.keycodes[0x1E] = GLFW_KEY_RIGHT_BRACKET; _glfw.ns.keycodes[0x29] = GLFW_KEY_SEMICOLON; _glfw.ns.keycodes[0x2C] = GLFW_KEY_SLASH; _glfw.ns.keycodes[0x0A] = GLFW_KEY_WORLD_1; _glfw.ns.keycodes[0x33] = GLFW_KEY_BACKSPACE; _glfw.ns.keycodes[0x39] = GLFW_KEY_CAPS_LOCK; _glfw.ns.keycodes[0x75] = GLFW_KEY_DELETE; _glfw.ns.keycodes[0x7D] = GLFW_KEY_DOWN; _glfw.ns.keycodes[0x77] = GLFW_KEY_END; _glfw.ns.keycodes[0x24] = GLFW_KEY_ENTER; _glfw.ns.keycodes[0x35] = GLFW_KEY_ESCAPE; _glfw.ns.keycodes[0x7A] = GLFW_KEY_F1; _glfw.ns.keycodes[0x78] = GLFW_KEY_F2; _glfw.ns.keycodes[0x63] = GLFW_KEY_F3; _glfw.ns.keycodes[0x76] = GLFW_KEY_F4; _glfw.ns.keycodes[0x60] = GLFW_KEY_F5; _glfw.ns.keycodes[0x61] = GLFW_KEY_F6; _glfw.ns.keycodes[0x62] = GLFW_KEY_F7; _glfw.ns.keycodes[0x64] = GLFW_KEY_F8; _glfw.ns.keycodes[0x65] = GLFW_KEY_F9; _glfw.ns.keycodes[0x6D] = GLFW_KEY_F10; _glfw.ns.keycodes[0x67] = GLFW_KEY_F11; _glfw.ns.keycodes[0x6F] = GLFW_KEY_F12; _glfw.ns.keycodes[0x69] = GLFW_KEY_PRINT_SCREEN; _glfw.ns.keycodes[0x6B] = GLFW_KEY_F14; _glfw.ns.keycodes[0x71] = GLFW_KEY_F15; _glfw.ns.keycodes[0x6A] = GLFW_KEY_F16; _glfw.ns.keycodes[0x40] = GLFW_KEY_F17; _glfw.ns.keycodes[0x4F] = GLFW_KEY_F18; _glfw.ns.keycodes[0x50] = GLFW_KEY_F19; _glfw.ns.keycodes[0x5A] = GLFW_KEY_F20; _glfw.ns.keycodes[0x73] = GLFW_KEY_HOME; _glfw.ns.keycodes[0x72] = GLFW_KEY_INSERT; _glfw.ns.keycodes[0x7B] = GLFW_KEY_LEFT; _glfw.ns.keycodes[0x3A] = GLFW_KEY_LEFT_ALT; _glfw.ns.keycodes[0x3B] = GLFW_KEY_LEFT_CONTROL; _glfw.ns.keycodes[0x38] = GLFW_KEY_LEFT_SHIFT; _glfw.ns.keycodes[0x37] = GLFW_KEY_LEFT_SUPER; _glfw.ns.keycodes[0x6E] = GLFW_KEY_MENU; _glfw.ns.keycodes[0x47] = GLFW_KEY_NUM_LOCK; _glfw.ns.keycodes[0x79] = GLFW_KEY_PAGE_DOWN; _glfw.ns.keycodes[0x74] = GLFW_KEY_PAGE_UP; _glfw.ns.keycodes[0x7C] = GLFW_KEY_RIGHT; _glfw.ns.keycodes[0x3D] = GLFW_KEY_RIGHT_ALT; _glfw.ns.keycodes[0x3E] = GLFW_KEY_RIGHT_CONTROL; _glfw.ns.keycodes[0x3C] = GLFW_KEY_RIGHT_SHIFT; _glfw.ns.keycodes[0x36] = GLFW_KEY_RIGHT_SUPER; _glfw.ns.keycodes[0x31] = GLFW_KEY_SPACE; _glfw.ns.keycodes[0x30] = GLFW_KEY_TAB; _glfw.ns.keycodes[0x7E] = GLFW_KEY_UP; _glfw.ns.keycodes[0x52] = GLFW_KEY_KP_0; _glfw.ns.keycodes[0x53] = GLFW_KEY_KP_1; _glfw.ns.keycodes[0x54] = GLFW_KEY_KP_2; _glfw.ns.keycodes[0x55] = GLFW_KEY_KP_3; _glfw.ns.keycodes[0x56] = GLFW_KEY_KP_4; _glfw.ns.keycodes[0x57] = GLFW_KEY_KP_5; _glfw.ns.keycodes[0x58] = GLFW_KEY_KP_6; _glfw.ns.keycodes[0x59] = GLFW_KEY_KP_7; _glfw.ns.keycodes[0x5B] = GLFW_KEY_KP_8; _glfw.ns.keycodes[0x5C] = GLFW_KEY_KP_9; _glfw.ns.keycodes[0x45] = GLFW_KEY_KP_ADD; _glfw.ns.keycodes[0x41] = GLFW_KEY_KP_DECIMAL; _glfw.ns.keycodes[0x4B] = GLFW_KEY_KP_DIVIDE; _glfw.ns.keycodes[0x4C] = GLFW_KEY_KP_ENTER; _glfw.ns.keycodes[0x51] = GLFW_KEY_KP_EQUAL; _glfw.ns.keycodes[0x43] = GLFW_KEY_KP_MULTIPLY; _glfw.ns.keycodes[0x4E] = GLFW_KEY_KP_SUBTRACT; for (int scancode = 0; scancode < 256; scancode++) { // Store the reverse translation for faster key name lookup if (_glfw.ns.keycodes[scancode] >= 0) _glfw.ns.scancodes[_glfw.ns.keycodes[scancode]] = scancode; }}// Retrieve Unicode data for the current keyboard layout//static GLFWbool updateUnicodeData(void){ if (_glfw.ns.inputSource) { CFRelease(_glfw.ns.inputSource); _glfw.ns.inputSource = NULL; _glfw.ns.unicodeData = nil; } _glfw.ns.inputSource = TISCopyCurrentKeyboardLayoutInputSource(); if (!_glfw.ns.inputSource) { _glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Failed to retrieve keyboard layout input source"); return GLFW_FALSE; } _glfw.ns.unicodeData = TISGetInputSourceProperty(_glfw.ns.inputSource, kTISPropertyUnicodeKeyLayoutData); if (!_glfw.ns.unicodeData) { _glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Failed to retrieve keyboard layout Unicode data"); return GLFW_FALSE; } return GLFW_TRUE;}// Load HIToolbox.framework and the TIS symbols we need from it//static GLFWbool initializeTIS(void){ // This works only because Cocoa has already loaded it properly _glfw.ns.tis.bundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.HIToolbox")); if (!_glfw.ns.tis.bundle) { _glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Failed to load HIToolbox.framework"); return GLFW_FALSE; } CFStringRef* kPropertyUnicodeKeyLayoutData = CFBundleGetDataPointerForName(_glfw.ns.tis.bundle, CFSTR("kTISPropertyUnicodeKeyLayoutData")); _glfw.ns.tis.CopyCurrentKeyboardLayoutInputSource = CFBundleGetFunctionPointerForName(_glfw.ns.tis.bundle, CFSTR("TISCopyCurrentKeyboardLayoutInputSource")); _glfw.ns.tis.GetInputSourceProperty = CFBundleGetFunctionPointerForName(_glfw.ns.tis.bundle, CFSTR("TISGetInputSourceProperty")); _glfw.ns.tis.GetKbdType = CFBundleGetFunctionPointerForName(_glfw.ns.tis.bundle, CFSTR("LMGetKbdType")); if (!kPropertyUnicodeKeyLayoutData || !TISCopyCurrentKeyboardLayoutInputSource || !TISGetInputSourceProperty || !LMGetKbdType) { _glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Failed to load TIS API symbols"); return GLFW_FALSE; } _glfw.ns.tis.kPropertyUnicodeKeyLayoutData = *kPropertyUnicodeKeyLayoutData; return updateUnicodeData();}@interface GLFWHelper : NSObject@end@implementation GLFWHelper- (void)selectedKeyboardInputSourceChanged:(NSObject* )object{ updateUnicodeData();}- (void)doNothing:(id)object{}@end // GLFWHelper@interface GLFWApplicationDelegate : NSObject <NSApplicationDelegate>@end@implementation GLFWApplicationDelegate- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender{ for (_GLFWwindow* window = _glfw.windowListHead; window; window = window->next) _glfwInputWindowCloseRequest(window); return NSTerminateCancel;}- (void)applicationDidChangeScreenParameters:(NSNotification *) notification{ for (_GLFWwindow* window = _glfw.windowListHead; window; window = window->next) { if (window->context.client != GLFW_NO_API) [window->context.nsgl.object update]; } _glfwPollMonitorsCocoa();}- (void)applicationWillFinishLaunching:(NSNotification *)notification{ if (_glfw.hints.init.ns.menubar) { // Menu bar setup must go between sharedApplication and finishLaunching // in order to properly emulate the behavior of NSApplicationMain if ([[NSBundle mainBundle] pathForResource:@"MainMenu" ofType:@"nib"]) { [[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:NSApp topLevelObjects:&_glfw.ns.nibObjects]; } else createMenuBar(); }}- (void)applicationDidFinishLaunching:(NSNotification *)notification{ _glfwPostEmptyEventCocoa(); [NSApp stop:nil];}- (void)applicationDidHide:(NSNotification *)notification{ for (int i = 0; i < _glfw.monitorCount; i++) _glfwRestoreVideoModeCocoa(_glfw.monitors[i]);}@end // GLFWApplicationDelegate//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform){ const _GLFWplatform cocoa = { .platformID = GLFW_PLATFORM_COCOA, .init = _glfwInitCocoa, .terminate = _glfwTerminateCocoa, .getCursorPos = _glfwGetCursorPosCocoa, .setCursorPos = _glfwSetCursorPosCocoa, .setCursorMode = _glfwSetCursorModeCocoa, .setRawMouseMotion = _glfwSetRawMouseMotionCocoa, .rawMouseMotionSupported = _glfwRawMouseMotionSupportedCocoa, .createCursor = _glfwCreateCursorCocoa, .createStandardCursor = _glfwCreateStandardCursorCocoa, .destroyCursor = _glfwDestroyCursorCocoa, .setCursor = _glfwSetCursorCocoa, .getScancodeName = _glfwGetScancodeNameCocoa, .getKeyScancode = _glfwGetKeyScancodeCocoa, .setClipboardString = _glfwSetClipboardStringCocoa, .getClipboardString = _glfwGetClipboardStringCocoa, .initJoysticks = _glfwInitJoysticksCocoa, .terminateJoysticks = _glfwTerminateJoysticksCocoa, .pollJoystick = _glfwPollJoystickCocoa, .getMappingName = _glfwGetMappingNameCocoa, .updateGamepadGUID = _glfwUpdateGamepadGUIDCocoa, .freeMonitor = _glfwFreeMonitorCocoa, .getMonitorPos = _glfwGetMonitorPosCocoa, .getMonitorContentScale = _glfwGetMonitorContentScaleCocoa, .getMonitorWorkarea = _glfwGetMonitorWorkareaCocoa, .getVideoModes = _glfwGetVideoModesCocoa, .getVideoMode = _glfwGetVideoModeCocoa, .getGammaRamp = _glfwGetGammaRampCocoa, .setGammaRamp = _glfwSetGammaRampCocoa, .createWindow = _glfwCreateWindowCocoa, .destroyWindow = _glfwDestroyWindowCocoa, .setWindowTitle = _glfwSetWindowTitleCocoa, .setWindowIcon = _glfwSetWindowIconCocoa, .getWindowPos = _glfwGetWindowPosCocoa, .setWindowPos = _glfwSetWindowPosCocoa, .getWindowSize = _glfwGetWindowSizeCocoa, .setWindowSize = _glfwSetWindowSizeCocoa, .setWindowSizeLimits = _glfwSetWindowSizeLimitsCocoa, .setWindowAspectRatio = _glfwSetWindowAspectRatioCocoa,Showing the first 500 of 663 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/cocoa_joystick.hadded
//========================================================================// GLFW 3.5 Cocoa - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include <IOKit/IOKitLib.h>#include <IOKit/IOCFPlugIn.h>#include <IOKit/hid/IOHIDKeys.h>#define GLFW_COCOA_JOYSTICK_STATE _GLFWjoystickNS ns;#define GLFW_COCOA_LIBRARY_JOYSTICK_STATE// Cocoa-specific per-joystick data//typedef struct _GLFWjoystickNS{ IOHIDDeviceRef device; CFMutableArrayRef axes; CFMutableArrayRef buttons; CFMutableArrayRef hats;} _GLFWjoystickNS;GLFWbool _glfwInitJoysticksCocoa(void);void _glfwTerminateJoysticksCocoa(void);GLFWbool _glfwPollJoystickCocoa(_GLFWjoystick* js, int mode);const char* _glfwGetMappingNameCocoa(void);void _glfwUpdateGamepadGUIDCocoa(char* guid);vendor/glfw/src/cocoa_joystick.madded
//========================================================================// GLFW 3.5 Cocoa - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>// Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_COCOA)#include <unistd.h>#include <ctype.h>#include <string.h>#include <mach/mach.h>#include <mach/mach_error.h>#include <CoreFoundation/CoreFoundation.h>#include <Kernel/IOKit/hidsystem/IOHIDUsageTables.h>// Joystick element information//typedef struct _GLFWjoyelementNS{ IOHIDElementRef native; uint32_t usage; int index; long minimum; long maximum;} _GLFWjoyelementNS;// Returns the value of the specified element of the specified joystick//static long getElementValue(_GLFWjoystick* js, _GLFWjoyelementNS* element){ IOHIDValueRef valueRef; long value = 0; if (js->ns.device) { if (IOHIDDeviceGetValue(js->ns.device, element->native, &valueRef) == kIOReturnSuccess) { value = IOHIDValueGetIntegerValue(valueRef); } } return value;}// Comparison function for matching the SDL element order//static CFComparisonResult compareElements(const void* fp, const void* sp, void* user){ const _GLFWjoyelementNS* fe = fp; const _GLFWjoyelementNS* se = sp; if (fe->usage < se->usage) return kCFCompareLessThan; if (fe->usage > se->usage) return kCFCompareGreaterThan; if (fe->index < se->index) return kCFCompareLessThan; if (fe->index > se->index) return kCFCompareGreaterThan; return kCFCompareEqualTo;}// Removes the specified joystick//static void closeJoystick(_GLFWjoystick* js){ _glfwInputJoystick(js, GLFW_DISCONNECTED); for (int i = 0; i < CFArrayGetCount(js->ns.axes); i++) _glfw_free((void*) CFArrayGetValueAtIndex(js->ns.axes, i)); CFRelease(js->ns.axes); for (int i = 0; i < CFArrayGetCount(js->ns.buttons); i++) _glfw_free((void*) CFArrayGetValueAtIndex(js->ns.buttons, i)); CFRelease(js->ns.buttons); for (int i = 0; i < CFArrayGetCount(js->ns.hats); i++) _glfw_free((void*) CFArrayGetValueAtIndex(js->ns.hats, i)); CFRelease(js->ns.hats); _glfwFreeJoystick(js);}// Callback for user-initiated joystick addition//static void matchCallback(void* context, IOReturn result, void* sender, IOHIDDeviceRef device){ int jid; char name[256]; char guid[33]; CFTypeRef property; uint32_t vendor = 0, product = 0, version = 0; _GLFWjoystick* js; CFMutableArrayRef axes, buttons, hats; for (jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++) { if (_glfw.joysticks[jid].ns.device == device) return; } CFArrayRef elements = IOHIDDeviceCopyMatchingElements(device, NULL, kIOHIDOptionsTypeNone); // It is reportedly possible for this to fail on macOS 13 Ventura // if the application does not have input monitoring permissions if (!elements) return; axes = CFArrayCreateMutable(NULL, 0, NULL); buttons = CFArrayCreateMutable(NULL, 0, NULL); hats = CFArrayCreateMutable(NULL, 0, NULL); property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey)); if (property) { CFStringGetCString(property, name, sizeof(name), kCFStringEncodingUTF8); } else strncpy(name, "Unknown", sizeof(name)); property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVendorIDKey)); if (property) CFNumberGetValue(property, kCFNumberSInt32Type, &vendor); property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductIDKey)); if (property) CFNumberGetValue(property, kCFNumberSInt32Type, &product); property = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDVersionNumberKey)); if (property) CFNumberGetValue(property, kCFNumberSInt32Type, &version); // Generate a joystick GUID that matches the SDL 2.0.5+ one if (vendor && product) { sprintf(guid, "03000000%02x%02x0000%02x%02x0000%02x%02x0000", (uint8_t) vendor, (uint8_t) (vendor >> 8), (uint8_t) product, (uint8_t) (product >> 8), (uint8_t) version, (uint8_t) (version >> 8)); } else { sprintf(guid, "05000000%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x00", name[0], name[1], name[2], name[3], name[4], name[5], name[6], name[7], name[8], name[9], name[10]); } for (CFIndex i = 0; i < CFArrayGetCount(elements); i++) { IOHIDElementRef native = (IOHIDElementRef) CFArrayGetValueAtIndex(elements, i); if (CFGetTypeID(native) != IOHIDElementGetTypeID()) continue; const IOHIDElementType type = IOHIDElementGetType(native); if ((type != kIOHIDElementTypeInput_Axis) && (type != kIOHIDElementTypeInput_Button) && (type != kIOHIDElementTypeInput_Misc)) { continue; } CFMutableArrayRef target = NULL; const uint32_t usage = IOHIDElementGetUsage(native); const uint32_t page = IOHIDElementGetUsagePage(native); if (page == kHIDPage_GenericDesktop) { switch (usage) { case kHIDUsage_GD_X: case kHIDUsage_GD_Y: case kHIDUsage_GD_Z: case kHIDUsage_GD_Rx: case kHIDUsage_GD_Ry: case kHIDUsage_GD_Rz: case kHIDUsage_GD_Slider: case kHIDUsage_GD_Dial: case kHIDUsage_GD_Wheel: target = axes; break; case kHIDUsage_GD_Hatswitch: target = hats; break; case kHIDUsage_GD_DPadUp: case kHIDUsage_GD_DPadRight: case kHIDUsage_GD_DPadDown: case kHIDUsage_GD_DPadLeft: case kHIDUsage_GD_SystemMainMenu: case kHIDUsage_GD_Select: case kHIDUsage_GD_Start: target = buttons; break; } } else if (page == kHIDPage_Simulation) { switch (usage) { case kHIDUsage_Sim_Accelerator: case kHIDUsage_Sim_Brake: case kHIDUsage_Sim_Throttle: case kHIDUsage_Sim_Rudder: case kHIDUsage_Sim_Steering: target = axes; break; } } else if (page == kHIDPage_Button || page == kHIDPage_Consumer) target = buttons; if (target) { _GLFWjoyelementNS* element = _glfw_calloc(1, sizeof(_GLFWjoyelementNS)); element->native = native; element->usage = usage; element->index = (int) CFArrayGetCount(target); element->minimum = IOHIDElementGetLogicalMin(native); element->maximum = IOHIDElementGetLogicalMax(native); CFArrayAppendValue(target, element); } } CFRelease(elements); CFArraySortValues(axes, CFRangeMake(0, CFArrayGetCount(axes)), compareElements, NULL); CFArraySortValues(buttons, CFRangeMake(0, CFArrayGetCount(buttons)), compareElements, NULL); CFArraySortValues(hats, CFRangeMake(0, CFArrayGetCount(hats)), compareElements, NULL); js = _glfwAllocJoystick(name, guid, (int) CFArrayGetCount(axes), (int) CFArrayGetCount(buttons), (int) CFArrayGetCount(hats)); js->ns.device = device; js->ns.axes = axes; js->ns.buttons = buttons; js->ns.hats = hats; _glfwInputJoystick(js, GLFW_CONNECTED);}// Callback for user-initiated joystick removal//static void removeCallback(void* context, IOReturn result, void* sender, IOHIDDeviceRef device){ for (int jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++) { if (_glfw.joysticks[jid].connected && _glfw.joysticks[jid].ns.device == device) { closeJoystick(&_glfw.joysticks[jid]); break; } }}//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwInitJoysticksCocoa(void){ CFMutableArrayRef matching; const long usages[] = { kHIDUsage_GD_Joystick, kHIDUsage_GD_GamePad, kHIDUsage_GD_MultiAxisController }; _glfw.ns.hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); matching = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks); if (!matching) { _glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Failed to create array"); return GLFW_FALSE; } for (size_t i = 0; i < sizeof(usages) / sizeof(long); i++) { const long page = kHIDPage_GenericDesktop; CFMutableDictionaryRef dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); if (!dict) continue; CFNumberRef pageRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberLongType, &page); CFNumberRef usageRef = CFNumberCreate(kCFAllocatorDefault, kCFNumberLongType, &usages[i]); if (pageRef && usageRef) { CFDictionarySetValue(dict, CFSTR(kIOHIDDeviceUsagePageKey), pageRef); CFDictionarySetValue(dict, CFSTR(kIOHIDDeviceUsageKey), usageRef); CFArrayAppendValue(matching, dict); } if (pageRef) CFRelease(pageRef); if (usageRef) CFRelease(usageRef); CFRelease(dict); } IOHIDManagerSetDeviceMatchingMultiple(_glfw.ns.hidManager, matching); CFRelease(matching); IOHIDManagerRegisterDeviceMatchingCallback(_glfw.ns.hidManager, &matchCallback, NULL); IOHIDManagerRegisterDeviceRemovalCallback(_glfw.ns.hidManager, &removeCallback, NULL); IOHIDManagerScheduleWithRunLoop(_glfw.ns.hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode); IOHIDManagerOpen(_glfw.ns.hidManager, kIOHIDOptionsTypeNone); // Execute the run loop once in order to register any initially-attached // joysticks CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false); return GLFW_TRUE;}void _glfwTerminateJoysticksCocoa(void){ for (int jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++) { if (_glfw.joysticks[jid].connected) closeJoystick(&_glfw.joysticks[jid]); } if (_glfw.ns.hidManager) { CFRelease(_glfw.ns.hidManager); _glfw.ns.hidManager = NULL; }}GLFWbool _glfwPollJoystickCocoa(_GLFWjoystick* js, int mode){ if (mode & _GLFW_POLL_AXES) { for (CFIndex i = 0; i < CFArrayGetCount(js->ns.axes); i++) { _GLFWjoyelementNS* axis = (_GLFWjoyelementNS*) CFArrayGetValueAtIndex(js->ns.axes, i); const long raw = getElementValue(js, axis); // Perform auto calibration if (raw < axis->minimum) axis->minimum = raw; if (raw > axis->maximum) axis->maximum = raw; const long size = axis->maximum - axis->minimum; if (size == 0) _glfwInputJoystickAxis(js, (int) i, 0.f); else { const float value = (2.f * (raw - axis->minimum) / size) - 1.f; _glfwInputJoystickAxis(js, (int) i, value); } } } if (mode & _GLFW_POLL_BUTTONS) { for (CFIndex i = 0; i < CFArrayGetCount(js->ns.buttons); i++) { _GLFWjoyelementNS* button = (_GLFWjoyelementNS*) CFArrayGetValueAtIndex(js->ns.buttons, i); const char value = getElementValue(js, button) - button->minimum; const int state = (value > 0) ? GLFW_PRESS : GLFW_RELEASE; _glfwInputJoystickButton(js, (int) i, state); } for (CFIndex i = 0; i < CFArrayGetCount(js->ns.hats); i++) { const int states[9] = { GLFW_HAT_UP, GLFW_HAT_RIGHT_UP, GLFW_HAT_RIGHT, GLFW_HAT_RIGHT_DOWN, GLFW_HAT_DOWN, GLFW_HAT_LEFT_DOWN, GLFW_HAT_LEFT, GLFW_HAT_LEFT_UP, GLFW_HAT_CENTERED }; _GLFWjoyelementNS* hat = (_GLFWjoyelementNS*) CFArrayGetValueAtIndex(js->ns.hats, i); long state = getElementValue(js, hat) - hat->minimum; if (state < 0 || state > 8) state = 8; _glfwInputJoystickHat(js, (int) i, states[state]); } } return js->connected;}const char* _glfwGetMappingNameCocoa(void){ return "Mac OS X";}void _glfwUpdateGamepadGUIDCocoa(char* guid){ if ((strncmp(guid + 4, "000000000000", 12) == 0) && (strncmp(guid + 20, "000000000000", 12) == 0)) { char original[33]; strncpy(original, guid, sizeof(original) - 1); sprintf(guid, "03000000%.4s0000%.4s000000000000", original, original + 16); }}#endif // _GLFW_COCOAvendor/glfw/src/cocoa_monitor.madded
//========================================================================// GLFW 3.5 Cocoa - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_COCOA)#include <stdlib.h>#include <limits.h>#include <math.h>#include <assert.h>#include <IOKit/graphics/IOGraphicsLib.h>#include <ApplicationServices/ApplicationServices.h>// Get the name of the specified display, or NULL//static char* getMonitorName(CGDirectDisplayID displayID, NSScreen* screen){ // IOKit doesn't work on Apple Silicon anymore // Luckily, 10.15 introduced -[NSScreen localizedName]. // Use it if available, and fall back to IOKit otherwise. if (screen) { if ([screen respondsToSelector:@selector(localizedName)]) { NSString* name = [screen valueForKey:@"localizedName"]; if (name) return _glfw_strdup([name UTF8String]); } } io_iterator_t it; io_service_t service; CFDictionaryRef info; if (IOServiceGetMatchingServices(MACH_PORT_NULL, IOServiceMatching("IODisplayConnect"), &it) != 0) { // This may happen if a desktop Mac is running headless return _glfw_strdup("Display"); } while ((service = IOIteratorNext(it)) != 0) { info = IODisplayCreateInfoDictionary(service, kIODisplayOnlyPreferredName); CFNumberRef vendorIDRef = CFDictionaryGetValue(info, CFSTR(kDisplayVendorID)); CFNumberRef productIDRef = CFDictionaryGetValue(info, CFSTR(kDisplayProductID)); if (!vendorIDRef || !productIDRef) { CFRelease(info); continue; } unsigned int vendorID, productID; CFNumberGetValue(vendorIDRef, kCFNumberIntType, &vendorID); CFNumberGetValue(productIDRef, kCFNumberIntType, &productID); if (CGDisplayVendorNumber(displayID) == vendorID && CGDisplayModelNumber(displayID) == productID) { // Info dictionary is used and freed below break; } CFRelease(info); } IOObjectRelease(it); if (!service) return _glfw_strdup("Display"); CFDictionaryRef names = CFDictionaryGetValue(info, CFSTR(kDisplayProductName)); CFStringRef nameRef; if (!names || !CFDictionaryGetValueIfPresent(names, CFSTR("en_US"), (const void**) &nameRef)) { // This may happen if a desktop Mac is running headless CFRelease(info); return _glfw_strdup("Display"); } const CFIndex size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(nameRef), kCFStringEncodingUTF8); char* name = _glfw_calloc(size + 1, 1); CFStringGetCString(nameRef, name, size, kCFStringEncodingUTF8); CFRelease(info); return name;}// Check whether the display mode should be included in enumeration//static GLFWbool modeIsGood(CGDisplayModeRef mode){ uint32_t flags = CGDisplayModeGetIOFlags(mode); if (!(flags & kDisplayModeValidFlag) || !(flags & kDisplayModeSafeFlag)) return GLFW_FALSE; if (flags & kDisplayModeInterlacedFlag) return GLFW_FALSE; if (flags & kDisplayModeStretchedFlag) return GLFW_FALSE;#if MAC_OS_X_VERSION_MAX_ALLOWED == 101100 CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) && CFStringCompare(format, CFSTR(IO32BitDirectPixels), 0)) { CFRelease(format); return GLFW_FALSE; } CFRelease(format);#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */ return GLFW_TRUE;}// Convert Core Graphics display mode to GLFW video mode//static GLFWvidmode vidmodeFromCGDisplayMode(CGDisplayModeRef mode, double fallbackRefreshRate){ GLFWvidmode result; result.width = (int) CGDisplayModeGetWidth(mode); result.height = (int) CGDisplayModeGetHeight(mode); result.refreshRate = (int) round(CGDisplayModeGetRefreshRate(mode)); if (result.refreshRate == 0) result.refreshRate = (int) round(fallbackRefreshRate);#if MAC_OS_X_VERSION_MAX_ALLOWED == 101100 CFStringRef format = CGDisplayModeCopyPixelEncoding(mode); if (CFStringCompare(format, CFSTR(IO16BitDirectPixels), 0) == 0) { result.redBits = 5; result.greenBits = 5; result.blueBits = 5; } else#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */ { result.redBits = 8; result.greenBits = 8; result.blueBits = 8; }#if MAC_OS_X_VERSION_MAX_ALLOWED == 101100 CFRelease(format);#endif /* MAC_OS_X_VERSION_MAX_ALLOWED */ return result;}// Starts reservation for display fading//static CGDisplayFadeReservationToken beginFadeReservation(void){ CGDisplayFadeReservationToken token = kCGDisplayFadeReservationInvalidToken; if (CGAcquireDisplayFadeReservation(5, &token) == kCGErrorSuccess) { CGDisplayFade(token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, TRUE); } return token;}// Ends reservation for display fading//static void endFadeReservation(CGDisplayFadeReservationToken token){ if (token != kCGDisplayFadeReservationInvalidToken) { CGDisplayFade(token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0.0, 0.0, 0.0, FALSE); CGReleaseDisplayFadeReservation(token); }}// Returns the display refresh rate queried from the I/O registry//static double getFallbackRefreshRate(CGDirectDisplayID displayID){ double refreshRate = 60.0; io_iterator_t it; io_service_t service; if (IOServiceGetMatchingServices(MACH_PORT_NULL, IOServiceMatching("IOFramebuffer"), &it) != 0) { return refreshRate; } while ((service = IOIteratorNext(it)) != 0) { const CFNumberRef indexRef = IORegistryEntryCreateCFProperty(service, CFSTR("IOFramebufferOpenGLIndex"), kCFAllocatorDefault, kNilOptions); if (!indexRef) continue; uint32_t index = 0; CFNumberGetValue(indexRef, kCFNumberIntType, &index); CFRelease(indexRef); if (CGOpenGLDisplayMaskToDisplayID(1 << index) != displayID) continue; const CFNumberRef clockRef = IORegistryEntryCreateCFProperty(service, CFSTR("IOFBCurrentPixelClock"), kCFAllocatorDefault, kNilOptions); const CFNumberRef countRef = IORegistryEntryCreateCFProperty(service, CFSTR("IOFBCurrentPixelCount"), kCFAllocatorDefault, kNilOptions); uint32_t clock = 0, count = 0; if (clockRef) { CFNumberGetValue(clockRef, kCFNumberIntType, &clock); CFRelease(clockRef); } if (countRef) { CFNumberGetValue(countRef, kCFNumberIntType, &count); CFRelease(countRef); } if (clock > 0 && count > 0) refreshRate = clock / (double) count; break; } IOObjectRelease(it); return refreshRate;}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////// Poll for changes in the set of connected monitors//void _glfwPollMonitorsCocoa(void){ uint32_t displayCount; CGGetOnlineDisplayList(0, NULL, &displayCount); CGDirectDisplayID* displays = _glfw_calloc(displayCount, sizeof(CGDirectDisplayID)); CGGetOnlineDisplayList(displayCount, displays, &displayCount); for (int i = 0; i < _glfw.monitorCount; i++) _glfw.monitors[i]->ns.screen = nil; _GLFWmonitor** disconnected = NULL; uint32_t disconnectedCount = _glfw.monitorCount; if (disconnectedCount) { disconnected = _glfw_calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*)); memcpy(disconnected, _glfw.monitors, _glfw.monitorCount * sizeof(_GLFWmonitor*)); } for (uint32_t i = 0; i < displayCount; i++) { if (CGDisplayIsAsleep(displays[i])) continue; const uint32_t unitNumber = CGDisplayUnitNumber(displays[i]); NSScreen* screen = nil; for (screen in [NSScreen screens]) { NSNumber* screenNumber = [screen deviceDescription][@"NSScreenNumber"]; // HACK: Compare unit numbers instead of display IDs to work around // display replacement on machines with automatic graphics // switching if (CGDisplayUnitNumber([screenNumber unsignedIntValue]) == unitNumber) break; } // HACK: Compare unit numbers instead of display IDs to work around // display replacement on machines with automatic graphics // switching uint32_t j; for (j = 0; j < disconnectedCount; j++) { if (disconnected[j] && disconnected[j]->ns.unitNumber == unitNumber) { disconnected[j]->ns.screen = screen; disconnected[j] = NULL; break; } } if (j < disconnectedCount) continue; const CGSize size = CGDisplayScreenSize(displays[i]); char* name = getMonitorName(displays[i], screen); if (!name) continue; _GLFWmonitor* monitor = _glfwAllocMonitor(name, size.width, size.height); monitor->ns.displayID = displays[i]; monitor->ns.unitNumber = unitNumber; monitor->ns.screen = screen; _glfw_free(name); CGDisplayModeRef mode = CGDisplayCopyDisplayMode(displays[i]); if (CGDisplayModeGetRefreshRate(mode) == 0.0) monitor->ns.fallbackRefreshRate = getFallbackRefreshRate(displays[i]); CGDisplayModeRelease(mode); _glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST); } for (uint32_t i = 0; i < disconnectedCount; i++) { if (disconnected[i]) _glfwInputMonitor(disconnected[i], GLFW_DISCONNECTED, 0); } _glfw_free(disconnected); _glfw_free(displays);}// Change the current video mode//void _glfwSetVideoModeCocoa(_GLFWmonitor* monitor, const GLFWvidmode* desired){ GLFWvidmode current; _glfwGetVideoModeCocoa(monitor, ¤t); const GLFWvidmode* best = _glfwChooseVideoMode(monitor, desired); if (_glfwCompareVideoModes(¤t, best) == 0) return; CFArrayRef modes = CGDisplayCopyAllDisplayModes(monitor->ns.displayID, NULL); const CFIndex count = CFArrayGetCount(modes); CGDisplayModeRef native = NULL; for (CFIndex i = 0; i < count; i++) { CGDisplayModeRef dm = (CGDisplayModeRef) CFArrayGetValueAtIndex(modes, i); if (!modeIsGood(dm)) continue; const GLFWvidmode mode = vidmodeFromCGDisplayMode(dm, monitor->ns.fallbackRefreshRate); if (_glfwCompareVideoModes(best, &mode) == 0) { native = dm; break; } } if (native) { if (monitor->ns.previousMode == NULL) monitor->ns.previousMode = CGDisplayCopyDisplayMode(monitor->ns.displayID); CGDisplayFadeReservationToken token = beginFadeReservation(); CGDisplaySetDisplayMode(monitor->ns.displayID, native, NULL); endFadeReservation(token); } CFRelease(modes);}// Restore the previously saved (original) video mode//void _glfwRestoreVideoModeCocoa(_GLFWmonitor* monitor){ if (monitor->ns.previousMode) { CGDisplayFadeReservationToken token = beginFadeReservation(); CGDisplaySetDisplayMode(monitor->ns.displayID, monitor->ns.previousMode, NULL); endFadeReservation(token); CGDisplayModeRelease(monitor->ns.previousMode); monitor->ns.previousMode = NULL; }}//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void _glfwFreeMonitorCocoa(_GLFWmonitor* monitor){}void _glfwGetMonitorPosCocoa(_GLFWmonitor* monitor, int* xpos, int* ypos){ @autoreleasepool { const CGRect bounds = CGDisplayBounds(monitor->ns.displayID); if (xpos) *xpos = (int) bounds.origin.x; if (ypos) *ypos = (int) bounds.origin.y; } // autoreleasepool}void _glfwGetMonitorContentScaleCocoa(_GLFWmonitor* monitor, float* xscale, float* yscale){ @autoreleasepool { if (!monitor->ns.screen) { _glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Cannot query content scale without screen"); } const NSRect points = [monitor->ns.screen frame]; const NSRect pixels = [monitor->ns.screen convertRectToBacking:points]; if (xscale) *xscale = (float) (pixels.size.width / points.size.width); if (yscale) *yscale = (float) (pixels.size.height / points.size.height); } // autoreleasepool}void _glfwGetMonitorWorkareaCocoa(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height){ @autoreleasepool { if (!monitor->ns.screen) { _glfwInputError(GLFW_PLATFORM_ERROR, "Cocoa: Cannot query workarea without screen"); } const NSRect frameRect = [monitor->ns.screen visibleFrame];Showing the first 500 of 647 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/cocoa_platform.hadded
//========================================================================// GLFW 3.5 Cocoa - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include <stdint.h>#include <Carbon/Carbon.h>#include <IOKit/hid/IOHIDLib.h>// NOTE: All of NSGL was deprecated in the 10.14 SDK// This disables the pointless warnings for every symbol we use#ifndef GL_SILENCE_DEPRECATION#define GL_SILENCE_DEPRECATION#endif#if defined(__OBJC__)#import <Cocoa/Cocoa.h>#elsetypedef void* id;#endif// NOTE: Many Cocoa enum values have been renamed and we need to build across// SDK versions where one is unavailable or deprecated.// We use the newer names in code and replace them with the older names if// the base SDK does not provide the newer names.#if MAC_OS_X_VERSION_MAX_ALLOWED < 101400 #define NSOpenGLContextParameterSwapInterval NSOpenGLCPSwapInterval #define NSOpenGLContextParameterSurfaceOpacity NSOpenGLCPSurfaceOpacity#endif#if MAC_OS_X_VERSION_MAX_ALLOWED < 101200 #define NSBitmapFormatAlphaNonpremultiplied NSAlphaNonpremultipliedBitmapFormat #define NSEventMaskAny NSAnyEventMask #define NSEventMaskKeyUp NSKeyUpMask #define NSEventModifierFlagCapsLock NSAlphaShiftKeyMask #define NSEventModifierFlagCommand NSCommandKeyMask #define NSEventModifierFlagControl NSControlKeyMask #define NSEventModifierFlagDeviceIndependentFlagsMask NSDeviceIndependentModifierFlagsMask #define NSEventModifierFlagOption NSAlternateKeyMask #define NSEventModifierFlagShift NSShiftKeyMask #define NSEventTypeApplicationDefined NSApplicationDefined #define NSWindowStyleMaskBorderless NSBorderlessWindowMask #define NSWindowStyleMaskClosable NSClosableWindowMask #define NSWindowStyleMaskMiniaturizable NSMiniaturizableWindowMask #define NSWindowStyleMaskResizable NSResizableWindowMask #define NSWindowStyleMaskTitled NSTitledWindowMask#endif// NOTE: Many Cocoa dynamically linked constants have been renamed and we need// to build across SDK versions where one is unavailable or deprecated.// We use the newer names in code and replace them with the older names if// the deployment target is older than the newer names.#if MAC_OS_X_VERSION_MIN_REQUIRED < 101300 #define NSPasteboardTypeURL NSURLPboardType#endiftypedef VkFlags VkMacOSSurfaceCreateFlagsMVK;typedef VkFlags VkMetalSurfaceCreateFlagsEXT;typedef struct VkMacOSSurfaceCreateInfoMVK{ VkStructureType sType; const void* pNext; VkMacOSSurfaceCreateFlagsMVK flags; const void* pView;} VkMacOSSurfaceCreateInfoMVK;typedef struct VkMetalSurfaceCreateInfoEXT{ VkStructureType sType; const void* pNext; VkMetalSurfaceCreateFlagsEXT flags; const void* pLayer;} VkMetalSurfaceCreateInfoEXT;typedef VkResult (APIENTRY *PFN_vkCreateMacOSSurfaceMVK)(VkInstance,const VkMacOSSurfaceCreateInfoMVK*,const VkAllocationCallbacks*,VkSurfaceKHR*);typedef VkResult (APIENTRY *PFN_vkCreateMetalSurfaceEXT)(VkInstance,const VkMetalSurfaceCreateInfoEXT*,const VkAllocationCallbacks*,VkSurfaceKHR*);#define GLFW_COCOA_WINDOW_STATE _GLFWwindowNS ns;#define GLFW_COCOA_LIBRARY_WINDOW_STATE _GLFWlibraryNS ns;#define GLFW_COCOA_MONITOR_STATE _GLFWmonitorNS ns;#define GLFW_COCOA_CURSOR_STATE _GLFWcursorNS ns;#define GLFW_NSGL_CONTEXT_STATE _GLFWcontextNSGL nsgl;#define GLFW_NSGL_LIBRARY_CONTEXT_STATE _GLFWlibraryNSGL nsgl;// HIToolbox.framework pointer typedefs#define kTISPropertyUnicodeKeyLayoutData _glfw.ns.tis.kPropertyUnicodeKeyLayoutDatatypedef TISInputSourceRef (*PFN_TISCopyCurrentKeyboardLayoutInputSource)(void);#define TISCopyCurrentKeyboardLayoutInputSource _glfw.ns.tis.CopyCurrentKeyboardLayoutInputSourcetypedef void* (*PFN_TISGetInputSourceProperty)(TISInputSourceRef,CFStringRef);#define TISGetInputSourceProperty _glfw.ns.tis.GetInputSourcePropertytypedef UInt8 (*PFN_LMGetKbdType)(void);#define LMGetKbdType _glfw.ns.tis.GetKbdType// NSGL-specific per-context data//typedef struct _GLFWcontextNSGL{ id pixelFormat; id object;} _GLFWcontextNSGL;// NSGL-specific global data//typedef struct _GLFWlibraryNSGL{ // dlopen handle for OpenGL.framework (for glfwGetProcAddress) CFBundleRef framework;} _GLFWlibraryNSGL;// Cocoa-specific per-window data//typedef struct _GLFWwindowNS{ id object; id delegate; id view; id layer; GLFWbool maximized; GLFWbool occluded; GLFWbool scaleFramebuffer; // Cached window properties to filter out duplicate events int width, height; int fbWidth, fbHeight; float xscale, yscale; // The total sum of the distances the cursor has been warped // since the last cursor motion event was processed // This is kept to counteract Cocoa doing the same internally double cursorWarpDeltaX, cursorWarpDeltaY;} _GLFWwindowNS;// Cocoa-specific global data//typedef struct _GLFWlibraryNS{ CGEventSourceRef eventSource; id delegate; GLFWbool cursorHidden; TISInputSourceRef inputSource; IOHIDManagerRef hidManager; id unicodeData; id helper; id keyUpMonitor; id nibObjects; char keynames[GLFW_KEY_LAST + 1][17]; short int keycodes[256]; short int scancodes[GLFW_KEY_LAST + 1]; char* clipboardString; CGPoint cascadePoint; // Where to place the cursor when re-enabled double restoreCursorPosX, restoreCursorPosY; // The window whose disabled cursor mode is active _GLFWwindow* disabledCursorWindow; struct { CFBundleRef bundle; PFN_TISCopyCurrentKeyboardLayoutInputSource CopyCurrentKeyboardLayoutInputSource; PFN_TISGetInputSourceProperty GetInputSourceProperty; PFN_LMGetKbdType GetKbdType; CFStringRef kPropertyUnicodeKeyLayoutData; } tis;} _GLFWlibraryNS;// Cocoa-specific per-monitor data//typedef struct _GLFWmonitorNS{ CGDirectDisplayID displayID; CGDisplayModeRef previousMode; uint32_t unitNumber; id screen; double fallbackRefreshRate;} _GLFWmonitorNS;// Cocoa-specific per-cursor data//typedef struct _GLFWcursorNS{ id object;} _GLFWcursorNS;GLFWbool _glfwConnectCocoa(int platformID, _GLFWplatform* platform);int _glfwInitCocoa(void);void _glfwTerminateCocoa(void);GLFWbool _glfwCreateWindowCocoa(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig);void _glfwDestroyWindowCocoa(_GLFWwindow* window);void _glfwSetWindowTitleCocoa(_GLFWwindow* window, const char* title);void _glfwSetWindowIconCocoa(_GLFWwindow* window, int count, const GLFWimage* images);void _glfwGetWindowPosCocoa(_GLFWwindow* window, int* xpos, int* ypos);void _glfwSetWindowPosCocoa(_GLFWwindow* window, int xpos, int ypos);void _glfwGetWindowSizeCocoa(_GLFWwindow* window, int* width, int* height);void _glfwSetWindowSizeCocoa(_GLFWwindow* window, int width, int height);void _glfwSetWindowSizeLimitsCocoa(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);void _glfwSetWindowAspectRatioCocoa(_GLFWwindow* window, int numer, int denom);void _glfwGetFramebufferSizeCocoa(_GLFWwindow* window, int* width, int* height);void _glfwGetWindowFrameSizeCocoa(_GLFWwindow* window, int* left, int* top, int* right, int* bottom);void _glfwGetWindowContentScaleCocoa(_GLFWwindow* window, float* xscale, float* yscale);void _glfwIconifyWindowCocoa(_GLFWwindow* window);void _glfwRestoreWindowCocoa(_GLFWwindow* window);void _glfwMaximizeWindowCocoa(_GLFWwindow* window);void _glfwShowWindowCocoa(_GLFWwindow* window);void _glfwHideWindowCocoa(_GLFWwindow* window);void _glfwRequestWindowAttentionCocoa(_GLFWwindow* window);void _glfwFocusWindowCocoa(_GLFWwindow* window);void _glfwSetWindowMonitorCocoa(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);GLFWbool _glfwWindowFocusedCocoa(_GLFWwindow* window);GLFWbool _glfwWindowIconifiedCocoa(_GLFWwindow* window);GLFWbool _glfwWindowVisibleCocoa(_GLFWwindow* window);GLFWbool _glfwWindowMaximizedCocoa(_GLFWwindow* window);GLFWbool _glfwWindowHoveredCocoa(_GLFWwindow* window);GLFWbool _glfwFramebufferTransparentCocoa(_GLFWwindow* window);void _glfwSetWindowResizableCocoa(_GLFWwindow* window, GLFWbool enabled);void _glfwSetWindowDecoratedCocoa(_GLFWwindow* window, GLFWbool enabled);void _glfwSetWindowFloatingCocoa(_GLFWwindow* window, GLFWbool enabled);float _glfwGetWindowOpacityCocoa(_GLFWwindow* window);void _glfwSetWindowOpacityCocoa(_GLFWwindow* window, float opacity);void _glfwSetWindowMousePassthroughCocoa(_GLFWwindow* window, GLFWbool enabled);void _glfwSetRawMouseMotionCocoa(_GLFWwindow *window, GLFWbool enabled);GLFWbool _glfwRawMouseMotionSupportedCocoa(void);void _glfwPollEventsCocoa(void);void _glfwWaitEventsCocoa(void);void _glfwWaitEventsTimeoutCocoa(double timeout);void _glfwPostEmptyEventCocoa(void);void _glfwGetCursorPosCocoa(_GLFWwindow* window, double* xpos, double* ypos);void _glfwSetCursorPosCocoa(_GLFWwindow* window, double xpos, double ypos);void _glfwSetCursorModeCocoa(_GLFWwindow* window, int mode);const char* _glfwGetScancodeNameCocoa(int scancode);int _glfwGetKeyScancodeCocoa(int key);GLFWbool _glfwCreateCursorCocoa(_GLFWcursor* cursor, const GLFWimage* image, int xhot, int yhot);GLFWbool _glfwCreateStandardCursorCocoa(_GLFWcursor* cursor, int shape);void _glfwDestroyCursorCocoa(_GLFWcursor* cursor);void _glfwSetCursorCocoa(_GLFWwindow* window, _GLFWcursor* cursor);void _glfwSetClipboardStringCocoa(const char* string);const char* _glfwGetClipboardStringCocoa(void);EGLenum _glfwGetEGLPlatformCocoa(EGLint** attribs);EGLNativeDisplayType _glfwGetEGLNativeDisplayCocoa(void);EGLNativeWindowType _glfwGetEGLNativeWindowCocoa(_GLFWwindow* window);void _glfwGetRequiredInstanceExtensionsCocoa(char** extensions);GLFWbool _glfwGetPhysicalDevicePresentationSupportCocoa(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);VkResult _glfwCreateWindowSurfaceCocoa(VkInstance instance, _GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);void _glfwFreeMonitorCocoa(_GLFWmonitor* monitor);void _glfwGetMonitorPosCocoa(_GLFWmonitor* monitor, int* xpos, int* ypos);void _glfwGetMonitorContentScaleCocoa(_GLFWmonitor* monitor, float* xscale, float* yscale);void _glfwGetMonitorWorkareaCocoa(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height);GLFWvidmode* _glfwGetVideoModesCocoa(_GLFWmonitor* monitor, int* count);GLFWbool _glfwGetVideoModeCocoa(_GLFWmonitor* monitor, GLFWvidmode* mode);GLFWbool _glfwGetGammaRampCocoa(_GLFWmonitor* monitor, GLFWgammaramp* ramp);void _glfwSetGammaRampCocoa(_GLFWmonitor* monitor, const GLFWgammaramp* ramp);void _glfwPollMonitorsCocoa(void);void _glfwSetVideoModeCocoa(_GLFWmonitor* monitor, const GLFWvidmode* desired);void _glfwRestoreVideoModeCocoa(_GLFWmonitor* monitor);float _glfwTransformYCocoa(float y);GLFWbool _glfwInitNSGL(void);void _glfwTerminateNSGL(void);GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig);void _glfwDestroyContextNSGL(_GLFWwindow* window);vendor/glfw/src/cocoa_window.madded
//========================================================================// GLFW 3.5 Cocoa - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_COCOA)#import <QuartzCore/CAMetalLayer.h>#include <float.h>#include <string.h>#include <assert.h>// HACK: This enum value is missing from framework headers on OS X 10.11 despite// having been (according to documentation) added in Mac OS X 10.7#define NSWindowCollectionBehaviorFullScreenNone (1 << 9)// Returns whether the cursor is in the content area of the specified window//static GLFWbool cursorInContentArea(_GLFWwindow* window){ const NSPoint pos = [window->ns.object mouseLocationOutsideOfEventStream]; return [window->ns.view mouse:pos inRect:[window->ns.view frame]];}// Hides the cursor if not already hidden//static void hideCursor(_GLFWwindow* window){ if (!_glfw.ns.cursorHidden) { [NSCursor hide]; _glfw.ns.cursorHidden = GLFW_TRUE; }}// Shows the cursor if not already shown//static void showCursor(_GLFWwindow* window){ if (_glfw.ns.cursorHidden) { [NSCursor unhide]; _glfw.ns.cursorHidden = GLFW_FALSE; }}// Updates the cursor image according to its cursor mode//static void updateCursorImage(_GLFWwindow* window){ if (window->cursorMode == GLFW_CURSOR_NORMAL) { showCursor(window); if (window->cursor) [(NSCursor*) window->cursor->ns.object set]; else [[NSCursor arrowCursor] set]; } else hideCursor(window);}// Apply chosen cursor mode to a focused window//static void updateCursorMode(_GLFWwindow* window){ if (window->cursorMode == GLFW_CURSOR_DISABLED) { _glfw.ns.disabledCursorWindow = window; _glfwGetCursorPosCocoa(window, &_glfw.ns.restoreCursorPosX, &_glfw.ns.restoreCursorPosY); _glfwCenterCursorInContentArea(window); CGAssociateMouseAndMouseCursorPosition(false); } else if (_glfw.ns.disabledCursorWindow == window) { _glfw.ns.disabledCursorWindow = NULL; _glfwSetCursorPosCocoa(window, _glfw.ns.restoreCursorPosX, _glfw.ns.restoreCursorPosY); // NOTE: The matching CGAssociateMouseAndMouseCursorPosition call is // made in _glfwSetCursorPosCocoa as part of a workaround } if (cursorInContentArea(window)) updateCursorImage(window);}// Make the specified window and its video mode active on its monitor//static void acquireMonitor(_GLFWwindow* window){ _glfwSetVideoModeCocoa(window->monitor, &window->videoMode); const CGRect bounds = CGDisplayBounds(window->monitor->ns.displayID); const NSRect frame = NSMakeRect(bounds.origin.x, _glfwTransformYCocoa(bounds.origin.y + bounds.size.height - 1), bounds.size.width, bounds.size.height); [window->ns.object setFrame:frame display:YES]; _glfwInputMonitorWindow(window->monitor, window);}// Remove the window and restore the original video mode//static void releaseMonitor(_GLFWwindow* window){ if (window->monitor->window != window) return; _glfwInputMonitorWindow(window->monitor, NULL); _glfwRestoreVideoModeCocoa(window->monitor);}// Translates macOS key modifiers into GLFW ones//static int translateFlags(NSUInteger flags){ int mods = 0; if (flags & NSEventModifierFlagShift) mods |= GLFW_MOD_SHIFT; if (flags & NSEventModifierFlagControl) mods |= GLFW_MOD_CONTROL; if (flags & NSEventModifierFlagOption) mods |= GLFW_MOD_ALT; if (flags & NSEventModifierFlagCommand) mods |= GLFW_MOD_SUPER; if (flags & NSEventModifierFlagCapsLock) mods |= GLFW_MOD_CAPS_LOCK; return mods;}// Translates a macOS keycode to a GLFW keycode//static int translateKey(unsigned int key){ if (key >= sizeof(_glfw.ns.keycodes) / sizeof(_glfw.ns.keycodes[0])) return GLFW_KEY_UNKNOWN; return _glfw.ns.keycodes[key];}// Translate a GLFW keycode to a Cocoa modifier flag//static NSUInteger translateKeyToModifierFlag(int key){ switch (key) { case GLFW_KEY_LEFT_SHIFT: case GLFW_KEY_RIGHT_SHIFT: return NSEventModifierFlagShift; case GLFW_KEY_LEFT_CONTROL: case GLFW_KEY_RIGHT_CONTROL: return NSEventModifierFlagControl; case GLFW_KEY_LEFT_ALT: case GLFW_KEY_RIGHT_ALT: return NSEventModifierFlagOption; case GLFW_KEY_LEFT_SUPER: case GLFW_KEY_RIGHT_SUPER: return NSEventModifierFlagCommand; case GLFW_KEY_CAPS_LOCK: return NSEventModifierFlagCapsLock; } return 0;}// Defines a constant for empty ranges in NSTextInputClient//static const NSRange kEmptyRange = { NSNotFound, 0 };//------------------------------------------------------------------------// Delegate for window related notifications//------------------------------------------------------------------------@interface GLFWWindowDelegate : NSObject{ _GLFWwindow* window;}- (instancetype)initWithGlfwWindow:(_GLFWwindow *)initWindow;@end@implementation GLFWWindowDelegate- (instancetype)initWithGlfwWindow:(_GLFWwindow *)initWindow{ self = [super init]; if (self != nil) window = initWindow; return self;}- (BOOL)windowShouldClose:(id)sender{ _glfwInputWindowCloseRequest(window); return NO;}- (void)windowDidResize:(NSNotification *)notification{ if (window->context.source == GLFW_NATIVE_CONTEXT_API) [window->context.nsgl.object update]; if (_glfw.ns.disabledCursorWindow == window) _glfwCenterCursorInContentArea(window); const int maximized = [window->ns.object isZoomed]; if (window->ns.maximized != maximized) { window->ns.maximized = maximized; _glfwInputWindowMaximize(window, maximized); } const NSRect contentRect = [window->ns.view frame]; const NSRect fbRect = [window->ns.view convertRectToBacking:contentRect]; if (fbRect.size.width != window->ns.fbWidth || fbRect.size.height != window->ns.fbHeight) { window->ns.fbWidth = fbRect.size.width; window->ns.fbHeight = fbRect.size.height; _glfwInputFramebufferSize(window, fbRect.size.width, fbRect.size.height); } if (contentRect.size.width != window->ns.width || contentRect.size.height != window->ns.height) { window->ns.width = contentRect.size.width; window->ns.height = contentRect.size.height; _glfwInputWindowSize(window, contentRect.size.width, contentRect.size.height); }}- (void)windowDidMove:(NSNotification *)notification{ if (window->context.source == GLFW_NATIVE_CONTEXT_API) [window->context.nsgl.object update]; if (_glfw.ns.disabledCursorWindow == window) _glfwCenterCursorInContentArea(window); int x, y; _glfwGetWindowPosCocoa(window, &x, &y); _glfwInputWindowPos(window, x, y);}- (void)windowDidMiniaturize:(NSNotification *)notification{ if (window->monitor) releaseMonitor(window); _glfwInputWindowIconify(window, GLFW_TRUE);}- (void)windowDidDeminiaturize:(NSNotification *)notification{ if (window->monitor) acquireMonitor(window); _glfwInputWindowIconify(window, GLFW_FALSE);}- (void)windowDidBecomeKey:(NSNotification *)notification{ if (_glfw.ns.disabledCursorWindow == window) _glfwCenterCursorInContentArea(window); _glfwInputWindowFocus(window, GLFW_TRUE); updateCursorMode(window);}- (void)windowDidResignKey:(NSNotification *)notification{ if (window->monitor && window->autoIconify) _glfwIconifyWindowCocoa(window); _glfwInputWindowFocus(window, GLFW_FALSE);}- (void)windowDidChangeOcclusionState:(NSNotification* )notification{ if ([window->ns.object respondsToSelector:@selector(occlusionState)]) { if ([window->ns.object occlusionState] & NSWindowOcclusionStateVisible) window->ns.occluded = GLFW_FALSE; else window->ns.occluded = GLFW_TRUE; }}@end//------------------------------------------------------------------------// Content view class for the GLFW window//------------------------------------------------------------------------@interface GLFWContentView : NSView <NSTextInputClient>{ _GLFWwindow* window; NSTrackingArea* trackingArea; NSMutableAttributedString* markedText;}- (instancetype)initWithGlfwWindow:(_GLFWwindow *)initWindow;@end@implementation GLFWContentView- (instancetype)initWithGlfwWindow:(_GLFWwindow *)initWindow{ self = [super init]; if (self != nil) { window = initWindow; trackingArea = nil; markedText = [[NSMutableAttributedString alloc] init]; [self updateTrackingAreas]; [self registerForDraggedTypes:@[NSPasteboardTypeURL]]; } return self;}- (void)dealloc{ [trackingArea release]; [markedText release]; [super dealloc];}- (BOOL)isOpaque{ return [window->ns.object isOpaque];}- (BOOL)canBecomeKeyView{ return YES;}- (BOOL)acceptsFirstResponder{ return YES;}- (BOOL)wantsUpdateLayer{ return YES;}- (void)updateLayer{ if (window->context.source == GLFW_NATIVE_CONTEXT_API) [window->context.nsgl.object update]; _glfwInputWindowDamage(window);}- (void)cursorUpdate:(NSEvent *)event{ updateCursorImage(window);}- (BOOL)acceptsFirstMouse:(NSEvent *)event{ return YES;}- (void)mouseDown:(NSEvent *)event{ _glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS, translateFlags([event modifierFlags]));}- (void)mouseDragged:(NSEvent *)event{ [self mouseMoved:event];}- (void)mouseUp:(NSEvent *)event{ _glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE, translateFlags([event modifierFlags]));}- (void)mouseMoved:(NSEvent *)event{ if (window->cursorMode == GLFW_CURSOR_DISABLED) { const double dx = [event deltaX] - window->ns.cursorWarpDeltaX; const double dy = [event deltaY] - window->ns.cursorWarpDeltaY; _glfwInputCursorPos(window, window->virtualCursorPosX + dx, window->virtualCursorPosY + dy); } else { const NSRect contentRect = [window->ns.view frame]; // NOTE: The returned location uses base 0,1 not 0,0 const NSPoint pos = [event locationInWindow]; _glfwInputCursorPos(window, pos.x, contentRect.size.height - pos.y); } window->ns.cursorWarpDeltaX = 0; window->ns.cursorWarpDeltaY = 0;}- (void)rightMouseDown:(NSEvent *)event{ _glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS, translateFlags([event modifierFlags]));}- (void)rightMouseDragged:(NSEvent *)event{ [self mouseMoved:event];}- (void)rightMouseUp:(NSEvent *)event{ _glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE, translateFlags([event modifierFlags]));}- (void)otherMouseDown:(NSEvent *)event{ _glfwInputMouseClick(window, (int) [event buttonNumber], GLFW_PRESS, translateFlags([event modifierFlags]));}- (void)otherMouseDragged:(NSEvent *)event{ [self mouseMoved:event];}- (void)otherMouseUp:(NSEvent *)event{ _glfwInputMouseClick(window, (int) [event buttonNumber], GLFW_RELEASE, translateFlags([event modifierFlags]));}- (void)mouseExited:(NSEvent *)event{ if (window->cursorMode == GLFW_CURSOR_HIDDEN) showCursor(window); _glfwInputCursorEnter(window, GLFW_FALSE);}Showing the first 500 of 2092 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/context.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2016 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <assert.h>#include <stdio.h>#include <string.h>#include <limits.h>#include <stdio.h>//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////// Checks whether the desired context attributes are valid//// This function checks things like whether the specified client API version// exists and whether all relevant options have supported and non-conflicting// values//GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig){ if (ctxconfig->source != GLFW_NATIVE_CONTEXT_API && ctxconfig->source != GLFW_EGL_CONTEXT_API && ctxconfig->source != GLFW_OSMESA_CONTEXT_API) { _glfwInputError(GLFW_INVALID_ENUM, "Invalid context creation API 0x%08X", ctxconfig->source); return GLFW_FALSE; } if (ctxconfig->client != GLFW_NO_API && ctxconfig->client != GLFW_OPENGL_API && ctxconfig->client != GLFW_OPENGL_ES_API) { _glfwInputError(GLFW_INVALID_ENUM, "Invalid client API 0x%08X", ctxconfig->client); return GLFW_FALSE; } if (ctxconfig->share) { if (ctxconfig->client == GLFW_NO_API || ctxconfig->share->context.client == GLFW_NO_API) { _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL); return GLFW_FALSE; } if (ctxconfig->source != ctxconfig->share->context.source) { _glfwInputError(GLFW_INVALID_ENUM, "Context creation APIs do not match between contexts"); return GLFW_FALSE; } } if (ctxconfig->client == GLFW_OPENGL_API) { if ((ctxconfig->major < 1 || ctxconfig->minor < 0) || (ctxconfig->major == 1 && ctxconfig->minor > 5) || (ctxconfig->major == 2 && ctxconfig->minor > 1) || (ctxconfig->major == 3 && ctxconfig->minor > 3)) { // OpenGL 1.0 is the smallest valid version // OpenGL 1.x series ended with version 1.5 // OpenGL 2.x series ended with version 2.1 // OpenGL 3.x series ended with version 3.3 // For now, let everything else through _glfwInputError(GLFW_INVALID_VALUE, "Invalid OpenGL version %i.%i", ctxconfig->major, ctxconfig->minor); return GLFW_FALSE; } if (ctxconfig->profile) { if (ctxconfig->profile != GLFW_OPENGL_CORE_PROFILE && ctxconfig->profile != GLFW_OPENGL_COMPAT_PROFILE) { _glfwInputError(GLFW_INVALID_ENUM, "Invalid OpenGL profile 0x%08X", ctxconfig->profile); return GLFW_FALSE; } if (ctxconfig->major <= 2 || (ctxconfig->major == 3 && ctxconfig->minor < 2)) { // Desktop OpenGL context profiles are only defined for version 3.2 // and above _glfwInputError(GLFW_INVALID_VALUE, "Context profiles are only defined for OpenGL version 3.2 and above"); return GLFW_FALSE; } } if (ctxconfig->forward && ctxconfig->major <= 2) { // Forward-compatible contexts are only defined for OpenGL version 3.0 and above _glfwInputError(GLFW_INVALID_VALUE, "Forward-compatibility is only defined for OpenGL version 3.0 and above"); return GLFW_FALSE; } } else if (ctxconfig->client == GLFW_OPENGL_ES_API) { if (ctxconfig->major < 1 || ctxconfig->minor < 0 || (ctxconfig->major == 1 && ctxconfig->minor > 1) || (ctxconfig->major == 2 && ctxconfig->minor > 0)) { // OpenGL ES 1.0 is the smallest valid version // OpenGL ES 1.x series ended with version 1.1 // OpenGL ES 2.x series ended with version 2.0 // For now, let everything else through _glfwInputError(GLFW_INVALID_VALUE, "Invalid OpenGL ES version %i.%i", ctxconfig->major, ctxconfig->minor); return GLFW_FALSE; } } if (ctxconfig->robustness) { if (ctxconfig->robustness != GLFW_NO_RESET_NOTIFICATION && ctxconfig->robustness != GLFW_LOSE_CONTEXT_ON_RESET) { _glfwInputError(GLFW_INVALID_ENUM, "Invalid context robustness mode 0x%08X", ctxconfig->robustness); return GLFW_FALSE; } } if (ctxconfig->release) { if (ctxconfig->release != GLFW_RELEASE_BEHAVIOR_NONE && ctxconfig->release != GLFW_RELEASE_BEHAVIOR_FLUSH) { _glfwInputError(GLFW_INVALID_ENUM, "Invalid context release behavior 0x%08X", ctxconfig->release); return GLFW_FALSE; } } return GLFW_TRUE;}// Chooses the framebuffer config that best matches the desired one//const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired, const _GLFWfbconfig* alternatives, unsigned int count){ unsigned int i; unsigned int missing, leastMissing = UINT_MAX; unsigned int colorDiff, leastColorDiff = UINT_MAX; unsigned int extraDiff, leastExtraDiff = UINT_MAX; const _GLFWfbconfig* current; const _GLFWfbconfig* closest = NULL; for (i = 0; i < count; i++) { current = alternatives + i; if (desired->stereo && !current->stereo) { // Stereo is a hard constraint continue; } // Count number of missing buffers { missing = 0; if (desired->alphaBits > 0 && current->alphaBits == 0) missing++; if (desired->depthBits > 0 && current->depthBits == 0) missing++; if (desired->stencilBits > 0 && current->stencilBits == 0) missing++; if (desired->auxBuffers > 0 && current->auxBuffers < desired->auxBuffers) { missing += desired->auxBuffers - current->auxBuffers; } if (desired->samples > 0 && current->samples == 0) { // Technically, several multisampling buffers could be // involved, but that's a lower level implementation detail and // not important to us here, so we count them as one missing++; } if (desired->transparent != current->transparent) missing++; } // These polynomials make many small channel size differences matter // less than one large channel size difference // Calculate color channel size difference value { colorDiff = 0; if (desired->redBits != GLFW_DONT_CARE) { colorDiff += (desired->redBits - current->redBits) * (desired->redBits - current->redBits); } if (desired->greenBits != GLFW_DONT_CARE) { colorDiff += (desired->greenBits - current->greenBits) * (desired->greenBits - current->greenBits); } if (desired->blueBits != GLFW_DONT_CARE) { colorDiff += (desired->blueBits - current->blueBits) * (desired->blueBits - current->blueBits); } } // Calculate non-color channel size difference value { extraDiff = 0; if (desired->alphaBits != GLFW_DONT_CARE) { extraDiff += (desired->alphaBits - current->alphaBits) * (desired->alphaBits - current->alphaBits); } if (desired->depthBits != GLFW_DONT_CARE) { extraDiff += (desired->depthBits - current->depthBits) * (desired->depthBits - current->depthBits); } if (desired->stencilBits != GLFW_DONT_CARE) { extraDiff += (desired->stencilBits - current->stencilBits) * (desired->stencilBits - current->stencilBits); } if (desired->accumRedBits != GLFW_DONT_CARE) { extraDiff += (desired->accumRedBits - current->accumRedBits) * (desired->accumRedBits - current->accumRedBits); } if (desired->accumGreenBits != GLFW_DONT_CARE) { extraDiff += (desired->accumGreenBits - current->accumGreenBits) * (desired->accumGreenBits - current->accumGreenBits); } if (desired->accumBlueBits != GLFW_DONT_CARE) { extraDiff += (desired->accumBlueBits - current->accumBlueBits) * (desired->accumBlueBits - current->accumBlueBits); } if (desired->accumAlphaBits != GLFW_DONT_CARE) { extraDiff += (desired->accumAlphaBits - current->accumAlphaBits) * (desired->accumAlphaBits - current->accumAlphaBits); } if (desired->samples != GLFW_DONT_CARE) { extraDiff += (desired->samples - current->samples) * (desired->samples - current->samples); } if (desired->sRGB && !current->sRGB) extraDiff++; } // Figure out if the current one is better than the best one found so far // Least number of missing buffers is the most important heuristic, // then color buffer size match and lastly size match for other buffers if (missing < leastMissing) closest = current; else if (missing == leastMissing) { if ((colorDiff < leastColorDiff) || (colorDiff == leastColorDiff && extraDiff < leastExtraDiff)) { closest = current; } } if (current == closest) { leastMissing = missing; leastColorDiff = colorDiff; leastExtraDiff = extraDiff; } } return closest;}// Retrieves the attributes of the current context//GLFWbool _glfwRefreshContextAttribs(_GLFWwindow* window, const _GLFWctxconfig* ctxconfig){ int i; _GLFWwindow* previous; const char* version; const char* prefixes[] = { "OpenGL ES-CM ", "OpenGL ES-CL ", "OpenGL ES ", NULL }; window->context.source = ctxconfig->source; window->context.client = GLFW_OPENGL_API; previous = _glfwPlatformGetTls(&_glfw.contextSlot); glfwMakeContextCurrent((GLFWwindow*) window); if (_glfwPlatformGetTls(&_glfw.contextSlot) != window) return GLFW_FALSE; window->context.GetIntegerv = (PFNGLGETINTEGERVPROC) window->context.getProcAddress("glGetIntegerv"); window->context.GetString = (PFNGLGETSTRINGPROC) window->context.getProcAddress("glGetString"); window->context.Flush = (PFNGLFLUSHPROC) window->context.getProcAddress("glFlush"); if (!window->context.GetIntegerv || !window->context.GetString || !window->context.Flush) { _glfwInputError(GLFW_PLATFORM_ERROR, "Entry point retrieval is broken"); glfwMakeContextCurrent((GLFWwindow*) previous); return GLFW_FALSE; } version = (const char*) window->context.GetString(GL_VERSION); if (!version) { if (ctxconfig->client == GLFW_OPENGL_API) { _glfwInputError(GLFW_PLATFORM_ERROR, "OpenGL version string retrieval is broken"); } else { _glfwInputError(GLFW_PLATFORM_ERROR, "OpenGL ES version string retrieval is broken"); } glfwMakeContextCurrent((GLFWwindow*) previous); return GLFW_FALSE; } for (i = 0; prefixes[i]; i++) { const size_t length = strlen(prefixes[i]); if (strncmp(version, prefixes[i], length) == 0) { version += length; window->context.client = GLFW_OPENGL_ES_API; break; } } if (!sscanf(version, "%d.%d.%d", &window->context.major, &window->context.minor, &window->context.revision)) { if (window->context.client == GLFW_OPENGL_API) { _glfwInputError(GLFW_PLATFORM_ERROR, "No version found in OpenGL version string"); } else { _glfwInputError(GLFW_PLATFORM_ERROR, "No version found in OpenGL ES version string"); } glfwMakeContextCurrent((GLFWwindow*) previous); return GLFW_FALSE; } if (window->context.major < ctxconfig->major || (window->context.major == ctxconfig->major && window->context.minor < ctxconfig->minor)) { // The desired OpenGL version is greater than the actual version // This only happens if the machine lacks {GLX|WGL}_ARB_create_context // /and/ the user has requested an OpenGL version greater than 1.0 // For API consistency, we emulate the behavior of the // {GLX|WGL}_ARB_create_context extension and fail here if (window->context.client == GLFW_OPENGL_API) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "Requested OpenGL version %i.%i, got version %i.%i", ctxconfig->major, ctxconfig->minor, window->context.major, window->context.minor); } else { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "Requested OpenGL ES version %i.%i, got version %i.%i", ctxconfig->major, ctxconfig->minor, window->context.major, window->context.minor); } glfwMakeContextCurrent((GLFWwindow*) previous); return GLFW_FALSE; } if (window->context.major >= 3) { // OpenGL 3.0+ uses a different function for extension string retrieval // We cache it here instead of in glfwExtensionSupported mostly to alert // users as early as possible that their build may be broken window->context.GetStringi = (PFNGLGETSTRINGIPROC) window->context.getProcAddress("glGetStringi"); if (!window->context.GetStringi) { _glfwInputError(GLFW_PLATFORM_ERROR, "Entry point retrieval is broken"); glfwMakeContextCurrent((GLFWwindow*) previous); return GLFW_FALSE; } } if (window->context.client == GLFW_OPENGL_API) { // Read back context flags (OpenGL 3.0 and above) if (window->context.major >= 3) { GLint flags; window->context.GetIntegerv(GL_CONTEXT_FLAGS, &flags); if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) window->context.forward = GLFW_TRUE; if (flags & GL_CONTEXT_FLAG_DEBUG_BIT) window->context.debug = GLFW_TRUE; else if (glfwExtensionSupported("GL_ARB_debug_output") && ctxconfig->debug) { // HACK: This is a workaround for older drivers (pre KHR_debug) // not setting the debug bit in the context flags for // debug contexts window->context.debug = GLFW_TRUE;Showing the first 500 of 771 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/egl_context.cadded
//========================================================================// GLFW 3.5 EGL - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <stdio.h>#include <string.h>#include <stdlib.h>#include <assert.h>// Return a description of the specified EGL error//static const char* getEGLErrorString(EGLint error){ switch (error) { case EGL_SUCCESS: return "Success"; case EGL_NOT_INITIALIZED: return "EGL is not or could not be initialized"; case EGL_BAD_ACCESS: return "EGL cannot access a requested resource"; case EGL_BAD_ALLOC: return "EGL failed to allocate resources for the requested operation"; case EGL_BAD_ATTRIBUTE: return "An unrecognized attribute or attribute value was passed in the attribute list"; case EGL_BAD_CONTEXT: return "An EGLContext argument does not name a valid EGL rendering context"; case EGL_BAD_CONFIG: return "An EGLConfig argument does not name a valid EGL frame buffer configuration"; case EGL_BAD_CURRENT_SURFACE: return "The current surface of the calling thread is a window, pixel buffer or pixmap that is no longer valid"; case EGL_BAD_DISPLAY: return "An EGLDisplay argument does not name a valid EGL display connection"; case EGL_BAD_SURFACE: return "An EGLSurface argument does not name a valid surface configured for GL rendering"; case EGL_BAD_MATCH: return "Arguments are inconsistent"; case EGL_BAD_PARAMETER: return "One or more argument values are invalid"; case EGL_BAD_NATIVE_PIXMAP: return "A NativePixmapType argument does not refer to a valid native pixmap"; case EGL_BAD_NATIVE_WINDOW: return "A NativeWindowType argument does not refer to a valid native window"; case EGL_CONTEXT_LOST: return "The application must destroy all contexts and reinitialise"; default: return "ERROR: UNKNOWN EGL ERROR"; }}// Returns the specified attribute of the specified EGLConfig//static int getEGLConfigAttrib(EGLConfig config, int attrib){ int value; eglGetConfigAttrib(_glfw.egl.display, config, attrib, &value); return value;}// Return the EGLConfig most closely matching the specified hints//static GLFWbool chooseEGLConfig(const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig, EGLConfig* result){ EGLConfig* nativeConfigs; _GLFWfbconfig* usableConfigs; const _GLFWfbconfig* closest; int i, nativeCount, usableCount, apiBit, surfaceTypeBit; GLFWbool wrongApiAvailable = GLFW_FALSE; if (ctxconfig->client == GLFW_OPENGL_ES_API) { if (ctxconfig->major == 1) apiBit = EGL_OPENGL_ES_BIT; else apiBit = EGL_OPENGL_ES2_BIT; } else apiBit = EGL_OPENGL_BIT; if (_glfw.egl.platform == EGL_PLATFORM_SURFACELESS_MESA) surfaceTypeBit = EGL_PBUFFER_BIT; else surfaceTypeBit = EGL_WINDOW_BIT; if (fbconfig->stereo) { _glfwInputError(GLFW_FORMAT_UNAVAILABLE, "EGL: Stereo rendering not supported"); return GLFW_FALSE; } eglGetConfigs(_glfw.egl.display, NULL, 0, &nativeCount); if (!nativeCount) { _glfwInputError(GLFW_API_UNAVAILABLE, "EGL: No EGLConfigs returned"); return GLFW_FALSE; } nativeConfigs = _glfw_calloc(nativeCount, sizeof(EGLConfig)); eglGetConfigs(_glfw.egl.display, nativeConfigs, nativeCount, &nativeCount); usableConfigs = _glfw_calloc(nativeCount, sizeof(_GLFWfbconfig)); usableCount = 0; for (i = 0; i < nativeCount; i++) { const EGLConfig n = nativeConfigs[i]; _GLFWfbconfig* u = usableConfigs + usableCount; // Only consider RGB(A) EGLConfigs if (getEGLConfigAttrib(n, EGL_COLOR_BUFFER_TYPE) != EGL_RGB_BUFFER) continue; if (!(getEGLConfigAttrib(n, EGL_SURFACE_TYPE) & surfaceTypeBit)) continue;#if defined(_GLFW_X11) if (_glfw.platform.platformID == GLFW_PLATFORM_X11) { XVisualInfo vi = {0}; // Only consider EGLConfigs with associated Visuals vi.visualid = getEGLConfigAttrib(n, EGL_NATIVE_VISUAL_ID); if (!vi.visualid) continue; if (fbconfig->transparent) { int count; XVisualInfo* vis = XGetVisualInfo(_glfw.x11.display, VisualIDMask, &vi, &count); if (vis) { u->transparent = _glfwIsVisualTransparentX11(vis[0].visual); XFree(vis); } } }#endif // _GLFW_X11 if (!(getEGLConfigAttrib(n, EGL_RENDERABLE_TYPE) & apiBit)) { wrongApiAvailable = GLFW_TRUE; continue; } u->redBits = getEGLConfigAttrib(n, EGL_RED_SIZE); u->greenBits = getEGLConfigAttrib(n, EGL_GREEN_SIZE); u->blueBits = getEGLConfigAttrib(n, EGL_BLUE_SIZE); u->alphaBits = getEGLConfigAttrib(n, EGL_ALPHA_SIZE); u->depthBits = getEGLConfigAttrib(n, EGL_DEPTH_SIZE); u->stencilBits = getEGLConfigAttrib(n, EGL_STENCIL_SIZE);#if defined(_GLFW_WAYLAND) if (_glfw.platform.platformID == GLFW_PLATFORM_WAYLAND) { // NOTE: The wl_surface opaque region is no guarantee that its buffer // is presented as opaque, if it also has an alpha channel // HACK: If EGL_EXT_present_opaque is unavailable, ignore any config // with an alpha channel to ensure the buffer is opaque if (!_glfw.egl.EXT_present_opaque) { if (!fbconfig->transparent && u->alphaBits > 0) continue; } }#endif // _GLFW_WAYLAND u->samples = getEGLConfigAttrib(n, EGL_SAMPLES); u->doublebuffer = fbconfig->doublebuffer; u->handle = (uintptr_t) n; usableCount++; } closest = _glfwChooseFBConfig(fbconfig, usableConfigs, usableCount); if (closest) *result = (EGLConfig) closest->handle; else { if (wrongApiAvailable) { if (ctxconfig->client == GLFW_OPENGL_ES_API) { if (ctxconfig->major == 1) { _glfwInputError(GLFW_API_UNAVAILABLE, "EGL: Failed to find support for OpenGL ES 1.x"); } else { _glfwInputError(GLFW_API_UNAVAILABLE, "EGL: Failed to find support for OpenGL ES 2 or later"); } } else { _glfwInputError(GLFW_API_UNAVAILABLE, "EGL: Failed to find support for OpenGL"); } } else { _glfwInputError(GLFW_FORMAT_UNAVAILABLE, "EGL: Failed to find a suitable EGLConfig"); } } _glfw_free(nativeConfigs); _glfw_free(usableConfigs); return closest != NULL;}static void makeContextCurrentEGL(_GLFWwindow* window){ if (window) { if (!eglMakeCurrent(_glfw.egl.display, window->context.egl.surface, window->context.egl.surface, window->context.egl.handle)) { _glfwInputError(GLFW_PLATFORM_ERROR, "EGL: Failed to make context current: %s", getEGLErrorString(eglGetError())); return; }#if defined(_GLFW_WAYLAND) // NOTE: Disable EGL vsync so we can substitute our own that includes a timeout if (_glfw.platform.platformID == GLFW_PLATFORM_WAYLAND) eglSwapInterval(_glfw.egl.display, 0);#endif // _GLFW_WAYLAND } else { if (!eglMakeCurrent(_glfw.egl.display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) { _glfwInputError(GLFW_PLATFORM_ERROR, "EGL: Failed to clear current context: %s", getEGLErrorString(eglGetError())); return; } } _glfwPlatformSetTls(&_glfw.contextSlot, window);}static void swapBuffersEGL(_GLFWwindow* window){ if (window != _glfwPlatformGetTls(&_glfw.contextSlot)) { _glfwInputError(GLFW_PLATFORM_ERROR, "EGL: The context must be current on the calling thread when swapping buffers"); return; }#if defined(_GLFW_WAYLAND) if (_glfw.platform.platformID == GLFW_PLATFORM_WAYLAND) { // NOTE: Swapping buffers on a hidden window on Wayland makes it visible if (!window->wl.visible) return; // NOTE: We wait for a frame manually so we can add a timeout, // as the EGL implementation will wait indefinitely if (window->wl.egl.interval > 0) { window->context.Flush(); if (!_glfwWaitForEGLFrameWayland(window)) return; } }#endif eglSwapBuffers(_glfw.egl.display, window->context.egl.surface);}static void swapIntervalEGL(int interval){#if defined(_GLFW_WAYLAND) if (_glfw.platform.platformID == GLFW_PLATFORM_WAYLAND) { _GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot); assert(window != NULL); window->wl.egl.interval = interval; return; }#endif eglSwapInterval(_glfw.egl.display, interval);}static int extensionSupportedEGL(const char* extension){ const char* extensions = eglQueryString(_glfw.egl.display, EGL_EXTENSIONS); if (extensions) { if (_glfwStringInExtensionString(extension, extensions)) return GLFW_TRUE; } return GLFW_FALSE;}static GLFWglproc getProcAddressEGL(const char* procname){ const GLFWglproc proc = (GLFWglproc) eglGetProcAddress(procname); if (proc) return proc; if (!_glfw.egl.KHR_get_all_proc_addresses) { _GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot); assert(window != NULL); return _glfwPlatformGetModuleSymbol(window->context.egl.client, procname); } return NULL;}static void destroyContextEGL(_GLFWwindow* window){ // NOTE: Do not unload libGL.so.1 while the X11 display is still open, // as it will make XCloseDisplay segfault if (_glfw.platform.platformID != GLFW_PLATFORM_X11 || window->context.client != GLFW_OPENGL_API) { _glfwPlatformFreeModule(window->context.egl.client); window->context.egl.client = NULL; } if (window->context.egl.surface) { eglDestroySurface(_glfw.egl.display, window->context.egl.surface); window->context.egl.surface = EGL_NO_SURFACE; } if (window->context.egl.handle) { eglDestroyContext(_glfw.egl.display, window->context.egl.handle); window->context.egl.handle = EGL_NO_CONTEXT; }}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwInitEGL(void){ int i; EGLint* attribs = NULL; const char* extensions; const char* sonames[] = {#if defined(_GLFW_EGL_LIBRARY) _GLFW_EGL_LIBRARY,#elif defined(_WIN32) "libEGL.dll", "EGL.dll",#elif defined(__APPLE__) "libEGL.dylib",#elif defined(__CYGWIN__) "libEGL-1.so",#elif defined(__OpenBSD__) || defined(__NetBSD__) "libEGL.so",#else "libEGL.so.1",#endif NULL }; if (_glfw.egl.handle) return GLFW_TRUE; for (i = 0; sonames[i]; i++) { _glfw.egl.handle = _glfwPlatformLoadModule(sonames[i]); if (_glfw.egl.handle) break; } if (!_glfw.egl.handle) { _glfwInputError(GLFW_API_UNAVAILABLE, "EGL: Library not found"); return GLFW_FALSE; } _glfw.egl.prefix = (strncmp(sonames[i], "lib", 3) == 0); _glfw.egl.GetConfigAttrib = (PFN_eglGetConfigAttrib) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetConfigAttrib"); _glfw.egl.GetConfigs = (PFN_eglGetConfigs) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetConfigs"); _glfw.egl.GetDisplay = (PFN_eglGetDisplay) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetDisplay"); _glfw.egl.GetError = (PFN_eglGetError) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetError"); _glfw.egl.Initialize = (PFN_eglInitialize) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglInitialize"); _glfw.egl.Terminate = (PFN_eglTerminate) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglTerminate"); _glfw.egl.BindAPI = (PFN_eglBindAPI) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglBindAPI"); _glfw.egl.CreateContext = (PFN_eglCreateContext) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglCreateContext"); _glfw.egl.DestroySurface = (PFN_eglDestroySurface) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglDestroySurface"); _glfw.egl.DestroyContext = (PFN_eglDestroyContext) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglDestroyContext"); _glfw.egl.CreateWindowSurface = (PFN_eglCreateWindowSurface) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglCreateWindowSurface"); _glfw.egl.CreatePbufferSurface = (PFN_eglCreatePbufferSurface) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglCreatePbufferSurface"); _glfw.egl.MakeCurrent = (PFN_eglMakeCurrent) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglMakeCurrent"); _glfw.egl.SwapBuffers = (PFN_eglSwapBuffers) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglSwapBuffers"); _glfw.egl.SwapInterval = (PFN_eglSwapInterval) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglSwapInterval"); _glfw.egl.QueryString = (PFN_eglQueryString) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglQueryString"); _glfw.egl.GetProcAddress = (PFN_eglGetProcAddress) _glfwPlatformGetModuleSymbol(_glfw.egl.handle, "eglGetProcAddress"); if (!_glfw.egl.GetConfigAttrib || !_glfw.egl.GetConfigs || !_glfw.egl.GetDisplay || !_glfw.egl.GetError || !_glfw.egl.Initialize || !_glfw.egl.Terminate || !_glfw.egl.BindAPI || !_glfw.egl.CreateContext || !_glfw.egl.DestroySurface || !_glfw.egl.DestroyContext || !_glfw.egl.CreateWindowSurface || !_glfw.egl.CreatePbufferSurface || !_glfw.egl.MakeCurrent || !_glfw.egl.SwapBuffers || !_glfw.egl.SwapInterval || !_glfw.egl.QueryString || !_glfw.egl.GetProcAddress) { _glfwInputError(GLFW_PLATFORM_ERROR, "EGL: Failed to load required entry points"); _glfwTerminateEGL(); return GLFW_FALSE; } extensions = eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS); if (extensions && eglGetError() == EGL_SUCCESS) _glfw.egl.EXT_client_extensions = GLFW_TRUE; if (_glfw.egl.EXT_client_extensions) { _glfw.egl.EXT_platform_base = _glfwStringInExtensionString("EGL_EXT_platform_base", extensions); _glfw.egl.EXT_platform_x11 = _glfwStringInExtensionString("EGL_EXT_platform_x11", extensions); _glfw.egl.EXT_platform_wayland = _glfwStringInExtensionString("EGL_EXT_platform_wayland", extensions); _glfw.egl.ANGLE_platform_angle = _glfwStringInExtensionString("EGL_ANGLE_platform_angle", extensions);Showing the first 500 of 989 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/glx_context.cadded
//========================================================================// GLFW 3.5 GLX - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_X11)#include <string.h>#include <stdlib.h>#include <assert.h>#ifndef GLXBadProfileARB #define GLXBadProfileARB 13#endif// Returns the specified attribute of the specified GLXFBConfig//static int getGLXFBConfigAttrib(GLXFBConfig fbconfig, int attrib){ int value; glXGetFBConfigAttrib(_glfw.x11.display, fbconfig, attrib, &value); return value;}// Return the GLXFBConfig most closely matching the specified hints//static GLFWbool chooseGLXFBConfig(const _GLFWfbconfig* desired, GLXFBConfig* result){ GLXFBConfig* nativeConfigs; _GLFWfbconfig* usableConfigs; const _GLFWfbconfig* closest; int nativeCount, usableCount; const char* vendor; GLFWbool trustWindowBit = GLFW_TRUE; // HACK: This is a (hopefully temporary) workaround for Chromium // (VirtualBox GL) not setting the window bit on any GLXFBConfigs vendor = glXGetClientString(_glfw.x11.display, GLX_VENDOR); if (vendor && strcmp(vendor, "Chromium") == 0) trustWindowBit = GLFW_FALSE; nativeConfigs = glXGetFBConfigs(_glfw.x11.display, _glfw.x11.screen, &nativeCount); if (!nativeConfigs || !nativeCount) { _glfwInputError(GLFW_API_UNAVAILABLE, "GLX: No GLXFBConfigs returned"); return GLFW_FALSE; } usableConfigs = _glfw_calloc(nativeCount, sizeof(_GLFWfbconfig)); usableCount = 0; for (int i = 0; i < nativeCount; i++) { const GLXFBConfig n = nativeConfigs[i]; _GLFWfbconfig* u = usableConfigs + usableCount; // Only consider RGBA GLXFBConfigs if (!(getGLXFBConfigAttrib(n, GLX_RENDER_TYPE) & GLX_RGBA_BIT)) continue; // Only consider window GLXFBConfigs if (!(getGLXFBConfigAttrib(n, GLX_DRAWABLE_TYPE) & GLX_WINDOW_BIT)) { if (trustWindowBit) continue; } if (getGLXFBConfigAttrib(n, GLX_DOUBLEBUFFER) != desired->doublebuffer) continue; if (desired->transparent) { XVisualInfo* vi = glXGetVisualFromFBConfig(_glfw.x11.display, n); if (vi) { u->transparent = _glfwIsVisualTransparentX11(vi->visual); XFree(vi); } } u->redBits = getGLXFBConfigAttrib(n, GLX_RED_SIZE); u->greenBits = getGLXFBConfigAttrib(n, GLX_GREEN_SIZE); u->blueBits = getGLXFBConfigAttrib(n, GLX_BLUE_SIZE); u->alphaBits = getGLXFBConfigAttrib(n, GLX_ALPHA_SIZE); u->depthBits = getGLXFBConfigAttrib(n, GLX_DEPTH_SIZE); u->stencilBits = getGLXFBConfigAttrib(n, GLX_STENCIL_SIZE); u->accumRedBits = getGLXFBConfigAttrib(n, GLX_ACCUM_RED_SIZE); u->accumGreenBits = getGLXFBConfigAttrib(n, GLX_ACCUM_GREEN_SIZE); u->accumBlueBits = getGLXFBConfigAttrib(n, GLX_ACCUM_BLUE_SIZE); u->accumAlphaBits = getGLXFBConfigAttrib(n, GLX_ACCUM_ALPHA_SIZE); u->auxBuffers = getGLXFBConfigAttrib(n, GLX_AUX_BUFFERS); u->stereo = getGLXFBConfigAttrib(n, GLX_STEREO); if (_glfw.glx.ARB_multisample) u->samples = getGLXFBConfigAttrib(n, GLX_SAMPLES); if (_glfw.glx.ARB_framebuffer_sRGB || _glfw.glx.EXT_framebuffer_sRGB) u->sRGB = getGLXFBConfigAttrib(n, GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB); u->handle = (uintptr_t) n; usableCount++; } closest = _glfwChooseFBConfig(desired, usableConfigs, usableCount); if (closest) *result = (GLXFBConfig) closest->handle; XFree(nativeConfigs); _glfw_free(usableConfigs); return closest != NULL;}// Create the OpenGL context using legacy API//static GLXContext createLegacyContextGLX(_GLFWwindow* window, GLXFBConfig fbconfig, GLXContext share){ return glXCreateNewContext(_glfw.x11.display, fbconfig, GLX_RGBA_TYPE, share, True);}static void makeContextCurrentGLX(_GLFWwindow* window){ if (window) { if (!glXMakeCurrent(_glfw.x11.display, window->context.glx.window, window->context.glx.handle)) { _glfwInputError(GLFW_PLATFORM_ERROR, "GLX: Failed to make context current"); return; } } else { if (!glXMakeCurrent(_glfw.x11.display, None, NULL)) { _glfwInputError(GLFW_PLATFORM_ERROR, "GLX: Failed to clear current context"); return; } } _glfwPlatformSetTls(&_glfw.contextSlot, window);}static void swapBuffersGLX(_GLFWwindow* window){ glXSwapBuffers(_glfw.x11.display, window->context.glx.window);}static void swapIntervalGLX(int interval){ _GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot); assert(window != NULL); if (_glfw.glx.EXT_swap_control) { _glfw.glx.SwapIntervalEXT(_glfw.x11.display, window->context.glx.window, interval); } else if (_glfw.glx.MESA_swap_control) _glfw.glx.SwapIntervalMESA(interval); else if (_glfw.glx.SGI_swap_control) { if (interval > 0) _glfw.glx.SwapIntervalSGI(interval); }}static int extensionSupportedGLX(const char* extension){ const char* extensions = glXQueryExtensionsString(_glfw.x11.display, _glfw.x11.screen); if (extensions) { if (_glfwStringInExtensionString(extension, extensions)) return GLFW_TRUE; } return GLFW_FALSE;}static GLFWglproc getProcAddressGLX(const char* procname){ if (_glfw.glx.GetProcAddress) return _glfw.glx.GetProcAddress((const GLubyte*) procname); else if (_glfw.glx.GetProcAddressARB) return _glfw.glx.GetProcAddressARB((const GLubyte*) procname); else { // NOTE: glvnd provides GLX 1.4, so this can only happen with libGL return _glfwPlatformGetModuleSymbol(_glfw.glx.handle, procname); }}static void destroyContextGLX(_GLFWwindow* window){ if (window->context.glx.window) { glXDestroyWindow(_glfw.x11.display, window->context.glx.window); window->context.glx.window = None; } if (window->context.glx.handle) { glXDestroyContext(_glfw.x11.display, window->context.glx.handle); window->context.glx.handle = NULL; }}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwInitGLX(void){ const char* sonames[] = {#if defined(_GLFW_GLX_LIBRARY) _GLFW_GLX_LIBRARY,#elif defined(__CYGWIN__) "libGL-1.so",#elif defined(__OpenBSD__) || defined(__NetBSD__) "libGL.so",#else "libGLX.so.0", "libGL.so.1", "libGL.so",#endif NULL }; if (_glfw.glx.handle) return GLFW_TRUE; for (int i = 0; sonames[i]; i++) { _glfw.glx.handle = _glfwPlatformLoadModule(sonames[i]); if (_glfw.glx.handle) break; } if (!_glfw.glx.handle) { _glfwInputError(GLFW_API_UNAVAILABLE, "GLX: Failed to load GLX"); return GLFW_FALSE; } _glfw.glx.GetFBConfigs = (PFNGLXGETFBCONFIGSPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXGetFBConfigs"); _glfw.glx.GetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXGetFBConfigAttrib"); _glfw.glx.GetClientString = (PFNGLXGETCLIENTSTRINGPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXGetClientString"); _glfw.glx.QueryExtension = (PFNGLXQUERYEXTENSIONPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXQueryExtension"); _glfw.glx.QueryVersion = (PFNGLXQUERYVERSIONPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXQueryVersion"); _glfw.glx.DestroyContext = (PFNGLXDESTROYCONTEXTPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXDestroyContext"); _glfw.glx.MakeCurrent = (PFNGLXMAKECURRENTPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXMakeCurrent"); _glfw.glx.SwapBuffers = (PFNGLXSWAPBUFFERSPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXSwapBuffers"); _glfw.glx.QueryExtensionsString = (PFNGLXQUERYEXTENSIONSSTRINGPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXQueryExtensionsString"); _glfw.glx.CreateNewContext = (PFNGLXCREATENEWCONTEXTPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXCreateNewContext"); _glfw.glx.CreateWindow = (PFNGLXCREATEWINDOWPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXCreateWindow"); _glfw.glx.DestroyWindow = (PFNGLXDESTROYWINDOWPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXDestroyWindow"); _glfw.glx.GetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXGetVisualFromFBConfig"); if (!_glfw.glx.GetFBConfigs || !_glfw.glx.GetFBConfigAttrib || !_glfw.glx.GetClientString || !_glfw.glx.QueryExtension || !_glfw.glx.QueryVersion || !_glfw.glx.DestroyContext || !_glfw.glx.MakeCurrent || !_glfw.glx.SwapBuffers || !_glfw.glx.QueryExtensionsString || !_glfw.glx.CreateNewContext || !_glfw.glx.CreateWindow || !_glfw.glx.DestroyWindow || !_glfw.glx.GetVisualFromFBConfig) { _glfwInputError(GLFW_PLATFORM_ERROR, "GLX: Failed to load required entry points"); return GLFW_FALSE; } // NOTE: Unlike GLX 1.3 entry points these are not required to be present _glfw.glx.GetProcAddress = (PFNGLXGETPROCADDRESSPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXGetProcAddress"); _glfw.glx.GetProcAddressARB = (PFNGLXGETPROCADDRESSPROC) _glfwPlatformGetModuleSymbol(_glfw.glx.handle, "glXGetProcAddressARB"); if (!glXQueryExtension(_glfw.x11.display, &_glfw.glx.errorBase, &_glfw.glx.eventBase)) { _glfwInputError(GLFW_API_UNAVAILABLE, "GLX: GLX extension not found"); return GLFW_FALSE; } if (!glXQueryVersion(_glfw.x11.display, &_glfw.glx.major, &_glfw.glx.minor)) { _glfwInputError(GLFW_API_UNAVAILABLE, "GLX: Failed to query GLX version"); return GLFW_FALSE; } if (_glfw.glx.major == 1 && _glfw.glx.minor < 3) { _glfwInputError(GLFW_API_UNAVAILABLE, "GLX: GLX version 1.3 is required"); return GLFW_FALSE; } if (extensionSupportedGLX("GLX_EXT_swap_control")) { _glfw.glx.SwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC) getProcAddressGLX("glXSwapIntervalEXT"); if (_glfw.glx.SwapIntervalEXT) _glfw.glx.EXT_swap_control = true; } if (extensionSupportedGLX("GLX_SGI_swap_control")) { _glfw.glx.SwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) getProcAddressGLX("glXSwapIntervalSGI"); if (_glfw.glx.SwapIntervalSGI) _glfw.glx.SGI_swap_control = true; } if (extensionSupportedGLX("GLX_MESA_swap_control")) { _glfw.glx.SwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC) getProcAddressGLX("glXSwapIntervalMESA"); if (_glfw.glx.SwapIntervalMESA) _glfw.glx.MESA_swap_control = true; } if (extensionSupportedGLX("GLX_ARB_multisample")) _glfw.glx.ARB_multisample = true; if (extensionSupportedGLX("GLX_ARB_framebuffer_sRGB")) _glfw.glx.ARB_framebuffer_sRGB = true; if (extensionSupportedGLX("GLX_EXT_framebuffer_sRGB")) _glfw.glx.EXT_framebuffer_sRGB = true; if (extensionSupportedGLX("GLX_ARB_create_context")) { _glfw.glx.CreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) getProcAddressGLX("glXCreateContextAttribsARB"); if (_glfw.glx.CreateContextAttribsARB) _glfw.glx.ARB_create_context = true; } if (extensionSupportedGLX("GLX_ARB_create_context_robustness")) _glfw.glx.ARB_create_context_robustness = true; if (extensionSupportedGLX("GLX_ARB_create_context_profile")) _glfw.glx.ARB_create_context_profile = true; if (extensionSupportedGLX("GLX_EXT_create_context_es2_profile")) _glfw.glx.EXT_create_context_es2_profile = true; if (extensionSupportedGLX("GLX_ARB_create_context_no_error")) _glfw.glx.ARB_create_context_no_error = true; if (extensionSupportedGLX("GLX_ARB_context_flush_control")) _glfw.glx.ARB_context_flush_control = true; return GLFW_TRUE;}void _glfwTerminateGLX(void){ // NOTE: This function must not call any X11 functions, as it is called // after XCloseDisplay (see _glfwTerminateX11 for details) _glfwPlatformFreeModule(_glfw.glx.handle); _glfw.glx.handle = NULL;}#define SET_ATTRIB(a, v) \{ \ assert(((size_t) index + 1) < sizeof(attribs) / sizeof(attribs[0])); \ attribs[index++] = a; \ attribs[index++] = v; \}GLFWbool _glfwCreateContextGLX(_GLFWwindow* window, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig){ int attribs[40]; GLXFBConfig native = NULL; GLXContext share = NULL; if (ctxconfig->share) share = ctxconfig->share->context.glx.handle; if (!chooseGLXFBConfig(fbconfig, &native)) { _glfwInputError(GLFW_FORMAT_UNAVAILABLE, "GLX: Failed to find a suitable GLXFBConfig"); return GLFW_FALSE; } if (ctxconfig->client == GLFW_OPENGL_ES_API) { if (!_glfw.glx.ARB_create_context || !_glfw.glx.ARB_create_context_profile || !_glfw.glx.EXT_create_context_es2_profile) { _glfwInputError(GLFW_API_UNAVAILABLE, "GLX: OpenGL ES requested but GLX_EXT_create_context_es2_profile is unavailable"); return GLFW_FALSE; } } if (ctxconfig->forward) { if (!_glfw.glx.ARB_create_context) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "GLX: Forward compatibility requested but GLX_ARB_create_context_profile is unavailable"); return GLFW_FALSE; } } if (ctxconfig->profile) { if (!_glfw.glx.ARB_create_context || !_glfw.glx.ARB_create_context_profile) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "GLX: An OpenGL profile requested but GLX_ARB_create_context_profile is unavailable"); return GLFW_FALSE; } } _glfwGrabErrorHandlerX11(); if (_glfw.glx.ARB_create_context) { int index = 0, mask = 0, flags = 0; if (ctxconfig->client == GLFW_OPENGL_API) {Showing the first 500 of 739 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/init.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <string.h>#include <stdlib.h>#include <stdio.h>#include <stdarg.h>#include <assert.h>// NOTE: The global variables below comprise all mutable global data in GLFW// Any other mutable global variable is a bug// This contains all mutable state shared between compilation units of GLFW//_GLFWlibrary _glfw = { GLFW_FALSE };// These are outside of _glfw so they can be used before initialization and// after termination without special handling when _glfw is cleared to zero//static _GLFWerror _glfwMainThreadError;static GLFWerrorfun _glfwErrorCallback;static GLFWallocator _glfwInitAllocator;static _GLFWinitconfig _glfwInitHints ={ .hatButtons = true, .angleType = GLFW_ANGLE_PLATFORM_TYPE_NONE, .platformID = GLFW_ANY_PLATFORM, .vulkanLoader = NULL, .ns = { .menubar = true, .chdir = true }, .x11 = { .xcbVulkanSurface = true, }, .wl = { .libdecorMode = GLFW_WAYLAND_PREFER_LIBDECOR },};// The allocation function used when no custom allocator is set//static void* defaultAllocate(size_t size, void* user){ return malloc(size);}// The deallocation function used when no custom allocator is set//static void defaultDeallocate(void* block, void* user){ free(block);}// The reallocation function used when no custom allocator is set//static void* defaultReallocate(void* block, size_t size, void* user){ return realloc(block, size);}// Terminate the library//static void terminate(void){ int i; memset(&_glfw.callbacks, 0, sizeof(_glfw.callbacks)); while (_glfw.windowListHead) glfwDestroyWindow((GLFWwindow*) _glfw.windowListHead); while (_glfw.cursorListHead) glfwDestroyCursor((GLFWcursor*) _glfw.cursorListHead); for (i = 0; i < _glfw.monitorCount; i++) { _GLFWmonitor* monitor = _glfw.monitors[i]; if (monitor->originalRamp.size) _glfw.platform.setGammaRamp(monitor, &monitor->originalRamp); _glfwFreeMonitor(monitor); } _glfw_free(_glfw.monitors); _glfw.monitors = NULL; _glfw.monitorCount = 0; _glfw_free(_glfw.mappings); _glfw.mappings = NULL; _glfw.mappingCount = 0; _glfwTerminateVulkan(); _glfw.platform.terminateJoysticks(); _glfw.platform.terminate(); _glfw.initialized = GLFW_FALSE; while (_glfw.errorListHead) { _GLFWerror* error = _glfw.errorListHead; _glfw.errorListHead = error->next; _glfw_free(error); } _glfwPlatformDestroyTls(&_glfw.contextSlot); _glfwPlatformDestroyTls(&_glfw.errorSlot); _glfwPlatformDestroyMutex(&_glfw.errorLock); memset(&_glfw, 0, sizeof(_glfw));}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////// Encode a Unicode code point to a UTF-8 stream// Based on cutef8 by Jeff Bezanson (Public Domain)//size_t _glfwEncodeUTF8(char* s, uint32_t codepoint){ size_t count = 0; if (codepoint < 0x80) s[count++] = (char) codepoint; else if (codepoint < 0x800) { s[count++] = (codepoint >> 6) | 0xc0; s[count++] = (codepoint & 0x3f) | 0x80; } else if (codepoint < 0x10000) { s[count++] = (codepoint >> 12) | 0xe0; s[count++] = ((codepoint >> 6) & 0x3f) | 0x80; s[count++] = (codepoint & 0x3f) | 0x80; } else if (codepoint < 0x110000) { s[count++] = (codepoint >> 18) | 0xf0; s[count++] = ((codepoint >> 12) & 0x3f) | 0x80; s[count++] = ((codepoint >> 6) & 0x3f) | 0x80; s[count++] = (codepoint & 0x3f) | 0x80; } return count;}// Splits and translates a text/uri-list into separate file paths// NOTE: This function destroys the provided string//char** _glfwParseUriList(char* text, int* count){ const char* prefix = "file://"; char** paths = NULL; char* line; *count = 0; while ((line = strtok(text, "\r\n"))) { char* path; text = NULL; if (line[0] == '#') continue; if (strncmp(line, prefix, strlen(prefix)) == 0) { line += strlen(prefix); // TODO: Validate hostname while (*line != '/') line++; } (*count)++; path = _glfw_calloc(strlen(line) + 1, 1); paths = _glfw_realloc(paths, *count * sizeof(char*)); paths[*count - 1] = path; while (*line) { if (line[0] == '%' && line[1] && line[2]) { const char digits[3] = { line[1], line[2], '\0' }; *path = (char) strtol(digits, NULL, 16); line += 2; } else *path = *line; path++; line++; } } return paths;}char* _glfw_strdup(const char* source){ const size_t length = strlen(source); char* result = _glfw_calloc(length + 1, 1); strcpy(result, source); return result;}int _glfw_min(int a, int b){ return a < b ? a : b;}int _glfw_max(int a, int b){ return a > b ? a : b;}void* _glfw_calloc(size_t count, size_t size){ if (count && size) { void* block; if (count > SIZE_MAX / size) { _glfwInputError(GLFW_INVALID_VALUE, "Allocation size overflow"); return NULL; } block = _glfw.allocator.allocate(count * size, _glfw.allocator.user); if (block) return memset(block, 0, count * size); else { _glfwInputError(GLFW_OUT_OF_MEMORY, NULL); return NULL; } } else return NULL;}void* _glfw_realloc(void* block, size_t size){ if (block && size) { void* resized = _glfw.allocator.reallocate(block, size, _glfw.allocator.user); if (resized) return resized; else { _glfwInputError(GLFW_OUT_OF_MEMORY, NULL); return NULL; } } else if (block) { _glfw_free(block); return NULL; } else return _glfw_calloc(1, size);}void _glfw_free(void* block){ if (block) _glfw.allocator.deallocate(block, _glfw.allocator.user);}//////////////////////////////////////////////////////////////////////////////// GLFW event API ////////////////////////////////////////////////////////////////////////////////// Notifies shared code of an error//void _glfwInputError(int code, const char* format, ...){ _GLFWerror* error; char description[_GLFW_MESSAGE_SIZE]; if (format) { va_list vl; va_start(vl, format); vsnprintf(description, sizeof(description), format, vl); va_end(vl); description[sizeof(description) - 1] = '\0'; } else { if (code == GLFW_NOT_INITIALIZED) strcpy(description, "The GLFW library is not initialized"); else if (code == GLFW_NO_CURRENT_CONTEXT) strcpy(description, "There is no current context"); else if (code == GLFW_INVALID_ENUM) strcpy(description, "Invalid argument for enum parameter"); else if (code == GLFW_INVALID_VALUE) strcpy(description, "Invalid value for parameter"); else if (code == GLFW_OUT_OF_MEMORY) strcpy(description, "Out of memory"); else if (code == GLFW_API_UNAVAILABLE) strcpy(description, "The requested API is unavailable"); else if (code == GLFW_VERSION_UNAVAILABLE) strcpy(description, "The requested API version is unavailable"); else if (code == GLFW_PLATFORM_ERROR) strcpy(description, "A platform-specific error occurred"); else if (code == GLFW_FORMAT_UNAVAILABLE) strcpy(description, "The requested format is unavailable"); else if (code == GLFW_NO_WINDOW_CONTEXT) strcpy(description, "The specified window has no context"); else if (code == GLFW_CURSOR_UNAVAILABLE) strcpy(description, "The specified cursor shape is unavailable"); else if (code == GLFW_FEATURE_UNAVAILABLE) strcpy(description, "The requested feature cannot be implemented for this platform"); else if (code == GLFW_FEATURE_UNIMPLEMENTED) strcpy(description, "The requested feature has not yet been implemented for this platform"); else if (code == GLFW_PLATFORM_UNAVAILABLE) strcpy(description, "The requested platform is unavailable"); else strcpy(description, "ERROR: UNKNOWN GLFW ERROR"); } if (_glfw.initialized) { error = _glfwPlatformGetTls(&_glfw.errorSlot); if (!error) { error = _glfw_calloc(1, sizeof(_GLFWerror)); _glfwPlatformSetTls(&_glfw.errorSlot, error); _glfwPlatformLockMutex(&_glfw.errorLock); error->next = _glfw.errorListHead; _glfw.errorListHead = error; _glfwPlatformUnlockMutex(&_glfw.errorLock); } } else error = &_glfwMainThreadError; error->code = code; strcpy(error->description, description); if (_glfwErrorCallback) _glfwErrorCallback(code, description);}//////////////////////////////////////////////////////////////////////////////// GLFW public API ////////////////////////////////////////////////////////////////////////////////GLFWAPI int glfwInit(void){ if (_glfw.initialized) return GLFW_TRUE; memset(&_glfw, 0, sizeof(_glfw)); _glfw.hints.init = _glfwInitHints; _glfw.allocator = _glfwInitAllocator; if (!_glfw.allocator.allocate) { _glfw.allocator.allocate = defaultAllocate; _glfw.allocator.reallocate = defaultReallocate; _glfw.allocator.deallocate = defaultDeallocate; } if (!_glfwSelectPlatform(_glfw.hints.init.platformID, &_glfw.platform)) return GLFW_FALSE; if (!_glfw.platform.init()) { terminate(); return GLFW_FALSE; } if (!_glfwPlatformCreateMutex(&_glfw.errorLock) || !_glfwPlatformCreateTls(&_glfw.errorSlot) || !_glfwPlatformCreateTls(&_glfw.contextSlot)) { terminate(); return GLFW_FALSE; } _glfwPlatformSetTls(&_glfw.errorSlot, &_glfwMainThreadError); _glfwInitGamepadMappings(); _glfwPlatformInitTimer(); _glfw.timer.offset = _glfwPlatformGetTimerValue(); _glfw.initialized = GLFW_TRUE; glfwDefaultWindowHints(); return GLFW_TRUE;}GLFWAPI void glfwTerminate(void){ if (!_glfw.initialized) return; terminate();}GLFWAPI void glfwInitHint(int hint, int value){ switch (hint) { case GLFW_JOYSTICK_HAT_BUTTONS: _glfwInitHints.hatButtons = value; return; case GLFW_ANGLE_PLATFORM_TYPE: _glfwInitHints.angleType = value; return; case GLFW_PLATFORM: _glfwInitHints.platformID = value; return; case GLFW_COCOA_CHDIR_RESOURCES: _glfwInitHints.ns.chdir = value; return; case GLFW_COCOA_MENUBAR: _glfwInitHints.ns.menubar = value; return; case GLFW_X11_XCB_VULKAN_SURFACE: _glfwInitHints.x11.xcbVulkanSurface = value; return; case GLFW_WAYLAND_LIBDECOR: _glfwInitHints.wl.libdecorMode = value; return; } _glfwInputError(GLFW_INVALID_ENUM, "Invalid init hint 0x%08X", hint);}GLFWAPI void glfwInitAllocator(const GLFWallocator* allocator){ if (allocator) { if (allocator->allocate && allocator->reallocate && allocator->deallocate) _glfwInitAllocator = *allocator; else _glfwInputError(GLFW_INVALID_VALUE, "Missing function in allocator"); } else memset(&_glfwInitAllocator, 0, sizeof(GLFWallocator));}GLFWAPI void glfwInitVulkanLoader(PFN_vkGetInstanceProcAddr loader){ _glfwInitHints.vulkanLoader = loader;}GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev){ if (major != NULL) *major = GLFW_VERSION_MAJOR; if (minor != NULL) *minor = GLFW_VERSION_MINOR; if (rev != NULL) *rev = GLFW_VERSION_REVISION;}GLFWAPI int glfwGetError(const char** description)Showing the first 500 of 529 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/input.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include "mappings.h"#include <assert.h>#include <float.h>#include <math.h>#include <stdlib.h>#include <string.h>// Internal key state used for sticky keys#define _GLFW_STICK 3// Internal constants for gamepad mapping source types#define _GLFW_JOYSTICK_AXIS 1#define _GLFW_JOYSTICK_BUTTON 2#define _GLFW_JOYSTICK_HATBIT 3#define GLFW_MOD_MASK (GLFW_MOD_SHIFT | \ GLFW_MOD_CONTROL | \ GLFW_MOD_ALT | \ GLFW_MOD_SUPER | \ GLFW_MOD_CAPS_LOCK | \ GLFW_MOD_NUM_LOCK)// Initializes the platform joystick API if it has not been already//static GLFWbool initJoysticks(void){ if (!_glfw.joysticksInitialized) { if (!_glfw.platform.initJoysticks()) { _glfw.platform.terminateJoysticks(); return GLFW_FALSE; } } return _glfw.joysticksInitialized = GLFW_TRUE;}// Finds a mapping based on joystick GUID//static _GLFWmapping* findMapping(const char* guid){ int i; for (i = 0; i < _glfw.mappingCount; i++) { if (strcmp(_glfw.mappings[i].guid, guid) == 0) return _glfw.mappings + i; } return NULL;}// Checks whether a gamepad mapping element is present in the hardware//static GLFWbool isValidElementForJoystick(const _GLFWmapelement* e, const _GLFWjoystick* js){ if (e->type == _GLFW_JOYSTICK_HATBIT && (e->index >> 4) >= js->hatCount) return GLFW_FALSE; else if (e->type == _GLFW_JOYSTICK_BUTTON && e->index >= js->buttonCount) return GLFW_FALSE; else if (e->type == _GLFW_JOYSTICK_AXIS && e->index >= js->axisCount) return GLFW_FALSE; return GLFW_TRUE;}// Finds a mapping based on joystick GUID and verifies element indices//static _GLFWmapping* findValidMapping(const _GLFWjoystick* js){ _GLFWmapping* mapping = findMapping(js->guid); if (mapping) { int i; for (i = 0; i <= GLFW_GAMEPAD_BUTTON_LAST; i++) { if (!isValidElementForJoystick(mapping->buttons + i, js)) return NULL; } for (i = 0; i <= GLFW_GAMEPAD_AXIS_LAST; i++) { if (!isValidElementForJoystick(mapping->axes + i, js)) return NULL; } } return mapping;}// Parses an SDL_GameControllerDB line and adds it to the mapping list//static GLFWbool parseMapping(_GLFWmapping* mapping, const char* string){ const char* c = string; size_t i, length; struct { const char* name; _GLFWmapelement* element; } fields[] = { { "platform", NULL }, { "a", mapping->buttons + GLFW_GAMEPAD_BUTTON_A }, { "b", mapping->buttons + GLFW_GAMEPAD_BUTTON_B }, { "x", mapping->buttons + GLFW_GAMEPAD_BUTTON_X }, { "y", mapping->buttons + GLFW_GAMEPAD_BUTTON_Y }, { "back", mapping->buttons + GLFW_GAMEPAD_BUTTON_BACK }, { "start", mapping->buttons + GLFW_GAMEPAD_BUTTON_START }, { "guide", mapping->buttons + GLFW_GAMEPAD_BUTTON_GUIDE }, { "leftshoulder", mapping->buttons + GLFW_GAMEPAD_BUTTON_LEFT_BUMPER }, { "rightshoulder", mapping->buttons + GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER }, { "leftstick", mapping->buttons + GLFW_GAMEPAD_BUTTON_LEFT_THUMB }, { "rightstick", mapping->buttons + GLFW_GAMEPAD_BUTTON_RIGHT_THUMB }, { "dpup", mapping->buttons + GLFW_GAMEPAD_BUTTON_DPAD_UP }, { "dpright", mapping->buttons + GLFW_GAMEPAD_BUTTON_DPAD_RIGHT }, { "dpdown", mapping->buttons + GLFW_GAMEPAD_BUTTON_DPAD_DOWN }, { "dpleft", mapping->buttons + GLFW_GAMEPAD_BUTTON_DPAD_LEFT }, { "lefttrigger", mapping->axes + GLFW_GAMEPAD_AXIS_LEFT_TRIGGER }, { "righttrigger", mapping->axes + GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER }, { "leftx", mapping->axes + GLFW_GAMEPAD_AXIS_LEFT_X }, { "lefty", mapping->axes + GLFW_GAMEPAD_AXIS_LEFT_Y }, { "rightx", mapping->axes + GLFW_GAMEPAD_AXIS_RIGHT_X }, { "righty", mapping->axes + GLFW_GAMEPAD_AXIS_RIGHT_Y } }; length = strcspn(c, ","); if (length != 32 || c[length] != ',') { _glfwInputError(GLFW_INVALID_VALUE, NULL); return GLFW_FALSE; } memcpy(mapping->guid, c, length); c += length + 1; length = strcspn(c, ","); if (length >= sizeof(mapping->name) || c[length] != ',') { _glfwInputError(GLFW_INVALID_VALUE, NULL); return GLFW_FALSE; } memcpy(mapping->name, c, length); c += length + 1; while (*c) { // TODO: Implement output modifiers if (*c == '+' || *c == '-') return GLFW_FALSE; for (i = 0; i < sizeof(fields) / sizeof(fields[0]); i++) { length = strlen(fields[i].name); if (strncmp(c, fields[i].name, length) != 0 || c[length] != ':') continue; c += length + 1; if (fields[i].element) { _GLFWmapelement* e = fields[i].element; int8_t minimum = -1; int8_t maximum = 1; if (*c == '+') { minimum = 0; c += 1; } else if (*c == '-') { maximum = 0; c += 1; } if (*c == 'a') e->type = _GLFW_JOYSTICK_AXIS; else if (*c == 'b') e->type = _GLFW_JOYSTICK_BUTTON; else if (*c == 'h') e->type = _GLFW_JOYSTICK_HATBIT; else break; if (e->type == _GLFW_JOYSTICK_HATBIT) { const unsigned long hat = strtoul(c + 1, (char**) &c, 10); const unsigned long bit = strtoul(c + 1, (char**) &c, 10); e->index = (uint8_t) ((hat << 4) | bit); } else e->index = (uint8_t) strtoul(c + 1, (char**) &c, 10); if (e->type == _GLFW_JOYSTICK_AXIS) { e->axisScale = 2 / (maximum - minimum); e->axisOffset = -(maximum + minimum); if (*c == '~') { e->axisScale = -e->axisScale; e->axisOffset = -e->axisOffset; } } } else { const char* name = _glfw.platform.getMappingName(); length = strlen(name); if (strncmp(c, name, length) != 0) return GLFW_FALSE; } break; } c += strcspn(c, ","); c += strspn(c, ","); } for (i = 0; i < 32; i++) { if (mapping->guid[i] >= 'A' && mapping->guid[i] <= 'F') mapping->guid[i] += 'a' - 'A'; } _glfw.platform.updateGamepadGUID(mapping->guid); return GLFW_TRUE;}//////////////////////////////////////////////////////////////////////////////// GLFW event API ////////////////////////////////////////////////////////////////////////////////// Notifies shared code of a physical key event//void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int mods){ assert(window != NULL); assert(key >= 0 || key == GLFW_KEY_UNKNOWN); assert(key <= GLFW_KEY_LAST); assert(action == GLFW_PRESS || action == GLFW_RELEASE); assert(mods == (mods & GLFW_MOD_MASK)); if (key >= 0 && key <= GLFW_KEY_LAST) { GLFWbool repeated = GLFW_FALSE; if (action == GLFW_RELEASE && window->keys[key] == GLFW_RELEASE) return; if (action == GLFW_PRESS && window->keys[key] == GLFW_PRESS) repeated = GLFW_TRUE; if (action == GLFW_RELEASE && window->stickyKeys) window->keys[key] = _GLFW_STICK; else window->keys[key] = (char) action; if (repeated) action = GLFW_REPEAT; } if (!window->lockKeyMods) mods &= ~(GLFW_MOD_CAPS_LOCK | GLFW_MOD_NUM_LOCK); if (window->callbacks.key) window->callbacks.key((GLFWwindow*) window, key, scancode, action, mods);}// Notifies shared code of a Unicode codepoint input event// The 'plain' parameter determines whether to emit a regular character event//void _glfwInputChar(_GLFWwindow* window, uint32_t codepoint, int mods, GLFWbool plain){ assert(window != NULL); assert(mods == (mods & GLFW_MOD_MASK)); assert(plain == GLFW_TRUE || plain == GLFW_FALSE); if (codepoint < 32 || (codepoint > 126 && codepoint < 160)) return; if (!window->lockKeyMods) mods &= ~(GLFW_MOD_CAPS_LOCK | GLFW_MOD_NUM_LOCK); if (window->callbacks.charmods) window->callbacks.charmods((GLFWwindow*) window, codepoint, mods); if (plain) { if (window->callbacks.character) window->callbacks.character((GLFWwindow*) window, codepoint); }}// Notifies shared code of a scroll event//void _glfwInputScroll(_GLFWwindow* window, double xoffset, double yoffset){ assert(window != NULL); assert(isfinite(xoffset)); assert(isfinite(yoffset)); if (window->callbacks.scroll) window->callbacks.scroll((GLFWwindow*) window, xoffset, yoffset);}// Notifies shared code of a mouse button click event//void _glfwInputMouseClick(_GLFWwindow* window, int button, int action, int mods){ assert(window != NULL); assert(button >= 0); assert(action == GLFW_PRESS || action == GLFW_RELEASE); assert(mods == (mods & GLFW_MOD_MASK)); if (button < 0 || (!window->disableMouseButtonLimit && button > GLFW_MOUSE_BUTTON_LAST)) return; if (!window->lockKeyMods) mods &= ~(GLFW_MOD_CAPS_LOCK | GLFW_MOD_NUM_LOCK); if (button <= GLFW_MOUSE_BUTTON_LAST) { if (action == GLFW_RELEASE && window->stickyMouseButtons) window->mouseButtons[button] = _GLFW_STICK; else window->mouseButtons[button] = (char) action; } if (window->callbacks.mouseButton) window->callbacks.mouseButton((GLFWwindow*) window, button, action, mods);}// Notifies shared code of a cursor motion event// The position is specified in content area relative screen coordinates//void _glfwInputCursorPos(_GLFWwindow* window, double xpos, double ypos){ assert(window != NULL); assert(isfinite(xpos)); assert(isfinite(ypos)); if (window->virtualCursorPosX == xpos && window->virtualCursorPosY == ypos) return; window->virtualCursorPosX = xpos; window->virtualCursorPosY = ypos; if (window->callbacks.cursorPos) window->callbacks.cursorPos((GLFWwindow*) window, xpos, ypos);}// Notifies shared code of a cursor enter/leave event//void _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered){ assert(window != NULL); assert(entered == GLFW_TRUE || entered == GLFW_FALSE); if (window->callbacks.cursorEnter) window->callbacks.cursorEnter((GLFWwindow*) window, entered);}// Notifies shared code of files or directories dropped on a window//void _glfwInputDrop(_GLFWwindow* window, int count, const char** paths){ assert(window != NULL); assert(count > 0); assert(paths != NULL); if (window->callbacks.drop) window->callbacks.drop((GLFWwindow*) window, count, paths);}// Notifies shared code of a joystick connection or disconnection//void _glfwInputJoystick(_GLFWjoystick* js, int event){ assert(js != NULL); assert(event == GLFW_CONNECTED || event == GLFW_DISCONNECTED); if (event == GLFW_CONNECTED) js->connected = GLFW_TRUE; else if (event == GLFW_DISCONNECTED) js->connected = GLFW_FALSE; if (_glfw.callbacks.joystick) _glfw.callbacks.joystick((int) (js - _glfw.joysticks), event);}// Notifies shared code of the new value of a joystick axis//void _glfwInputJoystickAxis(_GLFWjoystick* js, int axis, float value){ assert(js != NULL); assert(axis >= 0); assert(axis < js->axisCount); assert(isfinite(value)); js->axes[axis] = value;}// Notifies shared code of the new value of a joystick button//void _glfwInputJoystickButton(_GLFWjoystick* js, int button, char value){ assert(js != NULL); assert(button >= 0); assert(button < js->buttonCount); assert(value == GLFW_PRESS || value == GLFW_RELEASE); js->buttons[button] = value;}// Notifies shared code of the new value of a joystick hat//void _glfwInputJoystickHat(_GLFWjoystick* js, int hat, char value){ int base; assert(js != NULL); assert(hat >= 0); assert(hat < js->hatCount); // Valid hat values only use the least significant nibble assert((value & 0xf0) == 0); // Valid hat values do not have both bits of an axis set assert((value & GLFW_HAT_LEFT) == 0 || (value & GLFW_HAT_RIGHT) == 0); assert((value & GLFW_HAT_UP) == 0 || (value & GLFW_HAT_DOWN) == 0); base = js->buttonCount + hat * 4; js->buttons[base + 0] = (value & 0x01) ? GLFW_PRESS : GLFW_RELEASE; js->buttons[base + 1] = (value & 0x02) ? GLFW_PRESS : GLFW_RELEASE; js->buttons[base + 2] = (value & 0x04) ? GLFW_PRESS : GLFW_RELEASE; js->buttons[base + 3] = (value & 0x08) ? GLFW_PRESS : GLFW_RELEASE; js->hats[hat] = value;}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////// Adds the built-in set of gamepad mappings//void _glfwInitGamepadMappings(void){ size_t i; const size_t count = sizeof(_glfwDefaultMappings) / sizeof(char*); _glfw.mappings = _glfw_calloc(count, sizeof(_GLFWmapping)); for (i = 0; i < count; i++) { if (parseMapping(&_glfw.mappings[_glfw.mappingCount], _glfwDefaultMappings[i])) _glfw.mappingCount++; }}// Returns an available joystick object with arrays and name allocated//Showing the first 500 of 1520 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/internal.hadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#pragma once#if defined(_GLFW_USE_CONFIG_H) #include "glfw_config.h"#endif#if defined(GLFW_INCLUDE_GLCOREARB) || \ defined(GLFW_INCLUDE_ES1) || \ defined(GLFW_INCLUDE_ES2) || \ defined(GLFW_INCLUDE_ES3) || \ defined(GLFW_INCLUDE_ES31) || \ defined(GLFW_INCLUDE_ES32) || \ defined(GLFW_INCLUDE_NONE) || \ defined(GLFW_INCLUDE_GLEXT) || \ defined(GLFW_INCLUDE_GLU) || \ defined(GLFW_INCLUDE_VULKAN) || \ defined(GLFW_DLL) #error "You must not define any header option macros when compiling GLFW"#endif#define GLFW_INCLUDE_NONE#include "../include/GLFW/glfw3.h"#include <stdbool.h>#define _GLFW_INSERT_FIRST 0#define _GLFW_INSERT_LAST 1#define _GLFW_POLL_PRESENCE 0#define _GLFW_POLL_AXES 1#define _GLFW_POLL_BUTTONS 2#define _GLFW_POLL_ALL (_GLFW_POLL_AXES | _GLFW_POLL_BUTTONS)#define _GLFW_MESSAGE_SIZE 1024typedef int GLFWbool;typedef void (*GLFWproc)(void);typedef struct _GLFWerror _GLFWerror;typedef struct _GLFWinitconfig _GLFWinitconfig;typedef struct _GLFWwndconfig _GLFWwndconfig;typedef struct _GLFWctxconfig _GLFWctxconfig;typedef struct _GLFWfbconfig _GLFWfbconfig;typedef struct _GLFWcontext _GLFWcontext;typedef struct _GLFWwindow _GLFWwindow;typedef struct _GLFWplatform _GLFWplatform;typedef struct _GLFWlibrary _GLFWlibrary;typedef struct _GLFWmonitor _GLFWmonitor;typedef struct _GLFWcursor _GLFWcursor;typedef struct _GLFWmapelement _GLFWmapelement;typedef struct _GLFWmapping _GLFWmapping;typedef struct _GLFWjoystick _GLFWjoystick;typedef struct _GLFWtls _GLFWtls;typedef struct _GLFWmutex _GLFWmutex;#define GL_VERSION 0x1f02#define GL_NONE 0#define GL_COLOR_BUFFER_BIT 0x00004000#define GL_UNSIGNED_BYTE 0x1401#define GL_EXTENSIONS 0x1f03#define GL_NUM_EXTENSIONS 0x821d#define GL_CONTEXT_FLAGS 0x821e#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002#define GL_CONTEXT_PROFILE_MASK 0x9126#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252#define GL_NO_RESET_NOTIFICATION_ARB 0x8261#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82fb#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82fc#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008typedef int GLint;typedef unsigned int GLuint;typedef unsigned int GLenum;typedef unsigned int GLbitfield;typedef unsigned char GLubyte;typedef void (APIENTRY * PFNGLCLEARPROC)(GLbitfield);typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum);typedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*);typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);typedef void (APIENTRY * PFNGLFLUSHPROC)(void);#define EGL_SUCCESS 0x3000#define EGL_NOT_INITIALIZED 0x3001#define EGL_BAD_ACCESS 0x3002#define EGL_BAD_ALLOC 0x3003#define EGL_BAD_ATTRIBUTE 0x3004#define EGL_BAD_CONFIG 0x3005#define EGL_BAD_CONTEXT 0x3006#define EGL_BAD_CURRENT_SURFACE 0x3007#define EGL_BAD_DISPLAY 0x3008#define EGL_BAD_MATCH 0x3009#define EGL_BAD_NATIVE_PIXMAP 0x300a#define EGL_BAD_NATIVE_WINDOW 0x300b#define EGL_BAD_PARAMETER 0x300c#define EGL_BAD_SURFACE 0x300d#define EGL_CONTEXT_LOST 0x300e#define EGL_COLOR_BUFFER_TYPE 0x303f#define EGL_RGB_BUFFER 0x308e#define EGL_SURFACE_TYPE 0x3033#define EGL_WINDOW_BIT 0x0004#define EGL_RENDERABLE_TYPE 0x3040#define EGL_OPENGL_ES_BIT 0x0001#define EGL_OPENGL_ES2_BIT 0x0004#define EGL_OPENGL_BIT 0x0008#define EGL_ALPHA_SIZE 0x3021#define EGL_BLUE_SIZE 0x3022#define EGL_GREEN_SIZE 0x3023#define EGL_RED_SIZE 0x3024#define EGL_DEPTH_SIZE 0x3025#define EGL_STENCIL_SIZE 0x3026#define EGL_SAMPLES 0x3031#define EGL_OPENGL_ES_API 0x30a0#define EGL_OPENGL_API 0x30a2#define EGL_NONE 0x3038#define EGL_RENDER_BUFFER 0x3086#define EGL_SINGLE_BUFFER 0x3085#define EGL_EXTENSIONS 0x3055#define EGL_CONTEXT_CLIENT_VERSION 0x3098#define EGL_NATIVE_VISUAL_ID 0x302e#define EGL_NO_SURFACE ((EGLSurface) 0)#define EGL_NO_DISPLAY ((EGLDisplay) 0)#define EGL_NO_CONTEXT ((EGLContext) 0)#define EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType) 0)#define EGL_PBUFFER_BIT 0x0001#define EGL_WIDTH 0x3057#define EGL_HEIGHT 0x3056#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31bd#define EGL_NO_RESET_NOTIFICATION_KHR 0x31be#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31bf#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30fb#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30fd#define EGL_CONTEXT_FLAGS_KHR 0x30fc#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31b3#define EGL_GL_COLORSPACE_KHR 0x309d#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098#define EGL_PLATFORM_X11_EXT 0x31d5#define EGL_PLATFORM_WAYLAND_EXT 0x31d8#define EGL_PRESENT_OPAQUE_EXT 0x31df#define EGL_PLATFORM_ANGLE_ANGLE 0x3202#define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3203#define EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE 0x320d#define EGL_PLATFORM_ANGLE_TYPE_OPENGLES_ANGLE 0x320e#define EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE 0x3207#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208#define EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE 0x3450#define EGL_PLATFORM_ANGLE_TYPE_METAL_ANGLE 0x3489#define EGL_PLATFORM_ANGLE_NATIVE_PLATFORM_TYPE_ANGLE 0x348f#define EGL_PLATFORM_SURFACELESS_MESA 0x31ddtypedef int EGLint;typedef unsigned int EGLBoolean;typedef unsigned int EGLenum;typedef void* EGLConfig;typedef void* EGLContext;typedef void* EGLDisplay;typedef void* EGLSurface;typedef void* EGLNativeDisplayType;typedef void* EGLNativeWindowType;// EGL function pointer typedefstypedef EGLBoolean (APIENTRY * PFN_eglGetConfigAttrib)(EGLDisplay,EGLConfig,EGLint,EGLint*);typedef EGLBoolean (APIENTRY * PFN_eglGetConfigs)(EGLDisplay,EGLConfig*,EGLint,EGLint*);typedef EGLDisplay (APIENTRY * PFN_eglGetDisplay)(EGLNativeDisplayType);typedef EGLint (APIENTRY * PFN_eglGetError)(void);typedef EGLBoolean (APIENTRY * PFN_eglInitialize)(EGLDisplay,EGLint*,EGLint*);typedef EGLBoolean (APIENTRY * PFN_eglTerminate)(EGLDisplay);typedef EGLBoolean (APIENTRY * PFN_eglBindAPI)(EGLenum);typedef EGLContext (APIENTRY * PFN_eglCreateContext)(EGLDisplay,EGLConfig,EGLContext,const EGLint*);typedef EGLBoolean (APIENTRY * PFN_eglDestroySurface)(EGLDisplay,EGLSurface);typedef EGLBoolean (APIENTRY * PFN_eglDestroyContext)(EGLDisplay,EGLContext);typedef EGLSurface (APIENTRY * PFN_eglCreateWindowSurface)(EGLDisplay,EGLConfig,EGLNativeWindowType,const EGLint*);typedef EGLSurface (APIENTRY * PFN_eglCreatePbufferSurface)(EGLDisplay,EGLContext,const EGLint*);typedef EGLBoolean (APIENTRY * PFN_eglMakeCurrent)(EGLDisplay,EGLSurface,EGLSurface,EGLContext);typedef EGLBoolean (APIENTRY * PFN_eglSwapBuffers)(EGLDisplay,EGLSurface);typedef EGLBoolean (APIENTRY * PFN_eglSwapInterval)(EGLDisplay,EGLint);typedef const char* (APIENTRY * PFN_eglQueryString)(EGLDisplay,EGLint);typedef GLFWglproc (APIENTRY * PFN_eglGetProcAddress)(const char*);#define eglGetConfigAttrib _glfw.egl.GetConfigAttrib#define eglGetConfigs _glfw.egl.GetConfigs#define eglGetDisplay _glfw.egl.GetDisplay#define eglGetError _glfw.egl.GetError#define eglInitialize _glfw.egl.Initialize#define eglTerminate _glfw.egl.Terminate#define eglBindAPI _glfw.egl.BindAPI#define eglCreateContext _glfw.egl.CreateContext#define eglDestroySurface _glfw.egl.DestroySurface#define eglDestroyContext _glfw.egl.DestroyContext#define eglCreateWindowSurface _glfw.egl.CreateWindowSurface#define eglCreatePbufferSurface _glfw.egl.CreatePbufferSurface#define eglMakeCurrent _glfw.egl.MakeCurrent#define eglSwapBuffers _glfw.egl.SwapBuffers#define eglSwapInterval _glfw.egl.SwapInterval#define eglQueryString _glfw.egl.QueryString#define eglGetProcAddress _glfw.egl.GetProcAddresstypedef EGLDisplay (APIENTRY * PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum,void*,const EGLint*);typedef EGLSurface (APIENTRY * PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)(EGLDisplay,EGLConfig,void*,const EGLint*);#define eglGetPlatformDisplayEXT _glfw.egl.GetPlatformDisplayEXT#define eglCreatePlatformWindowSurfaceEXT _glfw.egl.CreatePlatformWindowSurfaceEXT#define OSMESA_RGBA 0x1908#define OSMESA_FORMAT 0x22#define OSMESA_DEPTH_BITS 0x30#define OSMESA_STENCIL_BITS 0x31#define OSMESA_ACCUM_BITS 0x32#define OSMESA_PROFILE 0x33#define OSMESA_CORE_PROFILE 0x34#define OSMESA_COMPAT_PROFILE 0x35#define OSMESA_CONTEXT_MAJOR_VERSION 0x36#define OSMESA_CONTEXT_MINOR_VERSION 0x37typedef void* OSMesaContext;typedef void (*OSMESAproc)(void);typedef OSMesaContext (GLAPIENTRY * PFN_OSMesaCreateContextExt)(GLenum,GLint,GLint,GLint,OSMesaContext);typedef OSMesaContext (GLAPIENTRY * PFN_OSMesaCreateContextAttribs)(const int*,OSMesaContext);typedef void (GLAPIENTRY * PFN_OSMesaDestroyContext)(OSMesaContext);typedef int (GLAPIENTRY * PFN_OSMesaMakeCurrent)(OSMesaContext,void*,int,int,int);typedef int (GLAPIENTRY * PFN_OSMesaGetColorBuffer)(OSMesaContext,int*,int*,int*,void**);typedef int (GLAPIENTRY * PFN_OSMesaGetDepthBuffer)(OSMesaContext,int*,int*,int*,void**);typedef GLFWglproc (GLAPIENTRY * PFN_OSMesaGetProcAddress)(const char*);#define OSMesaCreateContextExt _glfw.osmesa.CreateContextExt#define OSMesaCreateContextAttribs _glfw.osmesa.CreateContextAttribs#define OSMesaDestroyContext _glfw.osmesa.DestroyContext#define OSMesaMakeCurrent _glfw.osmesa.MakeCurrent#define OSMesaGetColorBuffer _glfw.osmesa.GetColorBuffer#define OSMesaGetDepthBuffer _glfw.osmesa.GetDepthBuffer#define OSMesaGetProcAddress _glfw.osmesa.GetProcAddress#define VK_NULL_HANDLE 0typedef void* VkInstance;typedef void* VkPhysicalDevice;typedef uint64_t VkSurfaceKHR;typedef uint32_t VkFlags;typedef uint32_t VkBool32;typedef enum VkStructureType{ VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000, VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000, VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000, VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000, VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000, VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000, VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000, VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF} VkStructureType;typedef enum VkResult{ VK_SUCCESS = 0, VK_NOT_READY = 1, VK_TIMEOUT = 2, VK_EVENT_SET = 3, VK_EVENT_RESET = 4, VK_INCOMPLETE = 5, VK_ERROR_OUT_OF_HOST_MEMORY = -1, VK_ERROR_OUT_OF_DEVICE_MEMORY = -2, VK_ERROR_INITIALIZATION_FAILED = -3, VK_ERROR_DEVICE_LOST = -4, VK_ERROR_MEMORY_MAP_FAILED = -5, VK_ERROR_LAYER_NOT_PRESENT = -6, VK_ERROR_EXTENSION_NOT_PRESENT = -7, VK_ERROR_FEATURE_NOT_PRESENT = -8, VK_ERROR_INCOMPATIBLE_DRIVER = -9, VK_ERROR_TOO_MANY_OBJECTS = -10, VK_ERROR_FORMAT_NOT_SUPPORTED = -11, VK_ERROR_SURFACE_LOST_KHR = -1000000000, VK_SUBOPTIMAL_KHR = 1000001003, VK_ERROR_OUT_OF_DATE_KHR = -1000001004, VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001, VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001, VK_ERROR_VALIDATION_FAILED_EXT = -1000011001, VK_RESULT_MAX_ENUM = 0x7FFFFFFF} VkResult;typedef struct VkAllocationCallbacks VkAllocationCallbacks;typedef struct VkExtensionProperties{ char extensionName[256]; uint32_t specVersion;} VkExtensionProperties;typedef void (APIENTRY * PFN_vkVoidFunction)(void);typedef PFN_vkVoidFunction (APIENTRY * PFN_vkGetInstanceProcAddr)(VkInstance,const char*);typedef VkResult (APIENTRY * PFN_vkEnumerateInstanceExtensionProperties)(const char*,uint32_t*,VkExtensionProperties*);#define vkGetInstanceProcAddr _glfw.vk.GetInstanceProcAddr#include "platform.h"#define GLFW_NATIVE_INCLUDE_NONE#include "../include/GLFW/glfw3native.h"// Checks for whether the library has been initialized#define _GLFW_REQUIRE_INIT() \ if (!_glfw.initialized) \ { \ _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \ return; \ }#define _GLFW_REQUIRE_INIT_OR_RETURN(x) \ if (!_glfw.initialized) \ { \ _glfwInputError(GLFW_NOT_INITIALIZED, NULL); \ return x; \ }// Swaps the provided pointers#define _GLFW_SWAP(type, x, y) \ { \ type t; \ t = x; \ x = y; \ y = t; \ }// Per-thread error structure//struct _GLFWerror{ _GLFWerror* next; int code; char description[_GLFW_MESSAGE_SIZE];};// Initialization configuration//// Parameters relating to the initialization of the library//struct _GLFWinitconfig{ bool hatButtons; int angleType; int platformID; PFN_vkGetInstanceProcAddr vulkanLoader; struct { bool menubar; bool chdir; } ns; struct { bool xcbVulkanSurface; } x11; struct { int libdecorMode; } wl;};// Window configuration//// Parameters relating to the creation of the window but not directly related// to the framebuffer. This is used to pass window creation parameters from// shared code to the platform API.//struct _GLFWwndconfig{ int xpos; int ypos; int width; int height; bool resizable; bool visible; bool decorated; bool focused; bool autoIconify; bool floating; bool maximized; bool centerCursor; bool focusOnShow; bool mousePassthrough; bool scaleToMonitor; bool scaleFramebuffer; struct { char frameName[256]; } ns; struct { char className[256]; char instanceName[256]; } x11; struct { bool keymenu; bool showDefault; } win32; struct { char appId[256]; } wl;};// Context configuration//// Parameters relating to the creation of the context but not directly related// to the framebuffer. This is used to pass context creation parameters from// shared code to the platform API.//struct _GLFWctxconfig{ int client; int source; int major; int minor; bool forward; bool debug; bool noerror; int profile; int robustness; int release; _GLFWwindow* share; struct { bool offline; } nsgl;};// Framebuffer configuration//// This describes buffers and their sizes. It also contains// a platform-specific ID used to map back to the backend API object.//// It is used to pass framebuffer parameters from shared code to the platform// API and also to enumerate and select available framebuffer configs.//struct _GLFWfbconfig{ int redBits; int greenBits; int blueBits; int alphaBits; int depthBits; int stencilBits; int accumRedBits; int accumGreenBits; int accumBlueBits; int accumAlphaBits; int auxBuffers; bool stereo; int samples; bool sRGB; bool doublebuffer; bool transparent; uintptr_t handle;};// Context structure//struct _GLFWcontext{ int client; int source; int major, minor, revision; GLFWbool forward, debug, noerror; int profile; int robustness; int release; PFNGLGETSTRINGIPROC GetStringi;Showing the first 500 of 1024 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/linux_joystick.cadded
//========================================================================// GLFW 3.5 Linux - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(GLFW_BUILD_LINUX_JOYSTICK)#include <sys/types.h>#include <sys/stat.h>#include <sys/inotify.h>#include <sys/ioctl.h>#include <fcntl.h>#include <errno.h>#include <dirent.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#ifndef SYN_DROPPED // < v2.6.39 kernel headers// Workaround for CentOS-6, which is supported till 2020-11-30, but still on v2.6.32#define SYN_DROPPED 3#endif// Apply an EV_KEY event to the specified joystick//static void handleKeyEvent(_GLFWjoystick* js, int code, int value){ _glfwInputJoystickButton(js, js->linjs.keyMap[code - BTN_MISC], value ? GLFW_PRESS : GLFW_RELEASE);}// Apply an EV_ABS event to the specified joystick//static void handleAbsEvent(_GLFWjoystick* js, int code, int value){ const int index = js->linjs.absMap[code]; if (code >= ABS_HAT0X && code <= ABS_HAT3Y) { static const char stateMap[3][3] = { { GLFW_HAT_CENTERED, GLFW_HAT_UP, GLFW_HAT_DOWN }, { GLFW_HAT_LEFT, GLFW_HAT_LEFT_UP, GLFW_HAT_LEFT_DOWN }, { GLFW_HAT_RIGHT, GLFW_HAT_RIGHT_UP, GLFW_HAT_RIGHT_DOWN }, }; const int hat = (code - ABS_HAT0X) / 2; const int axis = (code - ABS_HAT0X) % 2; int* state = js->linjs.hats[hat]; // NOTE: Looking at several input drivers, it seems all hat events use // -1 for left / up, 0 for centered and 1 for right / down if (value == 0) state[axis] = 0; else if (value < 0) state[axis] = 1; else if (value > 0) state[axis] = 2; _glfwInputJoystickHat(js, index, stateMap[state[0]][state[1]]); } else { const struct input_absinfo* info = &js->linjs.absInfo[code]; float normalized = value; const int range = info->maximum - info->minimum; if (range) { // Normalize to 0.0 -> 1.0 normalized = (normalized - info->minimum) / range; // Normalize to -1.0 -> 1.0 normalized = normalized * 2.0f - 1.0f; } _glfwInputJoystickAxis(js, index, normalized); }}// Poll state of absolute axes//static void pollAbsState(_GLFWjoystick* js){ for (int code = 0; code < ABS_CNT; code++) { if (js->linjs.absMap[code] < 0) continue; struct input_absinfo* info = &js->linjs.absInfo[code]; if (ioctl(js->linjs.fd, EVIOCGABS(code), info) < 0) continue; handleAbsEvent(js, code, info->value); }}#define isBitSet(bit, arr) (arr[(bit) / 8] & (1 << ((bit) % 8)))// Attempt to open the specified joystick device//static GLFWbool openJoystickDevice(const char* path){ for (int jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++) { if (!_glfw.joysticks[jid].connected) continue; if (strcmp(_glfw.joysticks[jid].linjs.path, path) == 0) return GLFW_FALSE; } _GLFWjoystickLinux linjs = {0}; linjs.fd = open(path, O_RDONLY | O_NONBLOCK | O_CLOEXEC); if (linjs.fd == -1) return GLFW_FALSE; char evBits[(EV_CNT + 7) / 8] = {0}; char keyBits[(KEY_CNT + 7) / 8] = {0}; char absBits[(ABS_CNT + 7) / 8] = {0}; struct input_id id; if (ioctl(linjs.fd, EVIOCGBIT(0, sizeof(evBits)), evBits) < 0 || ioctl(linjs.fd, EVIOCGBIT(EV_KEY, sizeof(keyBits)), keyBits) < 0 || ioctl(linjs.fd, EVIOCGBIT(EV_ABS, sizeof(absBits)), absBits) < 0 || ioctl(linjs.fd, EVIOCGID, &id) < 0) { _glfwInputError(GLFW_PLATFORM_ERROR, "Linux: Failed to query input device: %s", strerror(errno)); close(linjs.fd); return GLFW_FALSE; } // Ensure this device supports the events expected of a joystick if (!isBitSet(EV_ABS, evBits)) { close(linjs.fd); return GLFW_FALSE; } char name[256] = ""; if (ioctl(linjs.fd, EVIOCGNAME(sizeof(name)), name) < 0) strncpy(name, "Unknown", sizeof(name)); char guid[33] = ""; // Generate a joystick GUID that matches the SDL 2.0.5+ one if (id.vendor && id.product && id.version) { sprintf(guid, "%02x%02x0000%02x%02x0000%02x%02x0000%02x%02x0000", id.bustype & 0xff, id.bustype >> 8, id.vendor & 0xff, id.vendor >> 8, id.product & 0xff, id.product >> 8, id.version & 0xff, id.version >> 8); } else { sprintf(guid, "%02x%02x0000%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x00", id.bustype & 0xff, id.bustype >> 8, name[0], name[1], name[2], name[3], name[4], name[5], name[6], name[7], name[8], name[9], name[10]); } int axisCount = 0, buttonCount = 0, hatCount = 0; for (int code = BTN_MISC; code < KEY_CNT; code++) { if (!isBitSet(code, keyBits)) continue; linjs.keyMap[code - BTN_MISC] = buttonCount; buttonCount++; } for (int code = 0; code < ABS_CNT; code++) { linjs.absMap[code] = -1; if (!isBitSet(code, absBits)) continue; if (code >= ABS_HAT0X && code <= ABS_HAT3Y) { linjs.absMap[code] = hatCount; hatCount++; // Skip the Y axis code++; } else { if (ioctl(linjs.fd, EVIOCGABS(code), &linjs.absInfo[code]) < 0) continue; linjs.absMap[code] = axisCount; axisCount++; } } _GLFWjoystick* js = _glfwAllocJoystick(name, guid, axisCount, buttonCount, hatCount); if (!js) { close(linjs.fd); return GLFW_FALSE; } strncpy(linjs.path, path, sizeof(linjs.path) - 1); memcpy(&js->linjs, &linjs, sizeof(linjs)); pollAbsState(js); _glfwInputJoystick(js, GLFW_CONNECTED); return GLFW_TRUE;}#undef isBitSet// Frees all resources associated with the specified joystick//static void closeJoystick(_GLFWjoystick* js){ _glfwInputJoystick(js, GLFW_DISCONNECTED); close(js->linjs.fd); _glfwFreeJoystick(js);}// Lexically compare joysticks by name; used by qsort//static int compareJoysticks(const void* fp, const void* sp){ const _GLFWjoystick* fj = fp; const _GLFWjoystick* sj = sp; return strcmp(fj->linjs.path, sj->linjs.path);}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////void _glfwDetectJoystickConnectionLinux(void){ if (_glfw.linjs.inotify <= 0) return; ssize_t offset = 0; char buffer[16384]; const ssize_t size = read(_glfw.linjs.inotify, buffer, sizeof(buffer)); while (size > offset) { regmatch_t match; const struct inotify_event* e = (struct inotify_event*) (buffer + offset); offset += sizeof(struct inotify_event) + e->len; if (regexec(&_glfw.linjs.regex, e->name, 1, &match, 0) != 0) continue; char path[PATH_MAX]; snprintf(path, sizeof(path), "/dev/input/%s", e->name); if (e->mask & (IN_CREATE | IN_ATTRIB)) openJoystickDevice(path); else if (e->mask & IN_DELETE) { for (int jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++) { if (strcmp(_glfw.joysticks[jid].linjs.path, path) == 0) { closeJoystick(_glfw.joysticks + jid); break; } } } }}//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwInitJoysticksLinux(void){ const char* dirname = "/dev/input"; _glfw.linjs.inotify = inotify_init1(IN_NONBLOCK | IN_CLOEXEC); if (_glfw.linjs.inotify > 0) { // HACK: Register for IN_ATTRIB to get notified when udev is done // This works well in practice but the true way is libudev _glfw.linjs.watch = inotify_add_watch(_glfw.linjs.inotify, dirname, IN_CREATE | IN_ATTRIB | IN_DELETE); } // Continue without device connection notifications if inotify fails _glfw.linjs.regexCompiled = (regcomp(&_glfw.linjs.regex, "^event[0-9]\\+$", 0) == 0); if (!_glfw.linjs.regexCompiled) { _glfwInputError(GLFW_PLATFORM_ERROR, "Linux: Failed to compile regex"); return GLFW_FALSE; } int count = 0; DIR* dir = opendir(dirname); if (dir) { struct dirent* entry; while ((entry = readdir(dir))) { regmatch_t match; if (regexec(&_glfw.linjs.regex, entry->d_name, 1, &match, 0) != 0) continue; char path[PATH_MAX]; snprintf(path, sizeof(path), "%s/%s", dirname, entry->d_name); if (openJoystickDevice(path)) count++; } closedir(dir); } // Continue with no joysticks if enumeration fails qsort(_glfw.joysticks, count, sizeof(_GLFWjoystick), compareJoysticks); return GLFW_TRUE;}void _glfwTerminateJoysticksLinux(void){ for (int jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++) { _GLFWjoystick* js = _glfw.joysticks + jid; if (js->connected) closeJoystick(js); } if (_glfw.linjs.inotify > 0) { if (_glfw.linjs.watch > 0) inotify_rm_watch(_glfw.linjs.inotify, _glfw.linjs.watch); close(_glfw.linjs.inotify); } if (_glfw.linjs.regexCompiled) regfree(&_glfw.linjs.regex);}GLFWbool _glfwPollJoystickLinux(_GLFWjoystick* js, int mode){ // Read all queued events (non-blocking) for (;;) { struct input_event e; errno = 0; if (read(js->linjs.fd, &e, sizeof(e)) < 0) { // Reset the joystick slot if the device was disconnected if (errno == ENODEV) closeJoystick(js); break; } if (e.type == EV_SYN) { if (e.code == SYN_DROPPED) _glfw.linjs.dropped = GLFW_TRUE; else if (e.code == SYN_REPORT) { _glfw.linjs.dropped = GLFW_FALSE; pollAbsState(js); } } if (_glfw.linjs.dropped) continue; if (e.type == EV_KEY) handleKeyEvent(js, e.code, e.value); else if (e.type == EV_ABS) handleAbsEvent(js, e.code, e.value); } return js->connected;}const char* _glfwGetMappingNameLinux(void){ return "Linux";}void _glfwUpdateGamepadGUIDLinux(char* guid){}#endif // GLFW_BUILD_LINUX_JOYSTICKvendor/glfw/src/linux_joystick.hadded
//========================================================================// GLFW 3.5 Linux - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include <linux/input.h>#include <linux/limits.h>#include <regex.h>#define GLFW_LINUX_JOYSTICK_STATE _GLFWjoystickLinux linjs;#define GLFW_LINUX_LIBRARY_JOYSTICK_STATE _GLFWlibraryLinux linjs;// Linux-specific joystick data//typedef struct _GLFWjoystickLinux{ int fd; char path[PATH_MAX]; int keyMap[KEY_CNT - BTN_MISC]; int absMap[ABS_CNT]; struct input_absinfo absInfo[ABS_CNT]; int hats[4][2];} _GLFWjoystickLinux;// Linux-specific joystick API data//typedef struct _GLFWlibraryLinux{ int inotify; int watch; regex_t regex; GLFWbool regexCompiled; GLFWbool dropped;} _GLFWlibraryLinux;void _glfwDetectJoystickConnectionLinux(void);GLFWbool _glfwInitJoysticksLinux(void);void _glfwTerminateJoysticksLinux(void);GLFWbool _glfwPollJoystickLinux(_GLFWjoystick* js, int mode);const char* _glfwGetMappingNameLinux(void);void _glfwUpdateGamepadGUIDLinux(char* guid);vendor/glfw/src/macos_time.cadded
//========================================================================// GLFW 3.5 macOS - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2009-2016 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(GLFW_BUILD_MACOS_TIMER)#include <mach/mach_time.h>//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void _glfwPlatformInitTimer(void){ mach_timebase_info_data_t info; mach_timebase_info(&info); _glfw.timer.macos.frequency = (info.denom * 1e9) / info.numer;}uint64_t _glfwPlatformGetTimerValue(void){ return mach_absolute_time();}uint64_t _glfwPlatformGetTimerFrequency(void){ return _glfw.timer.macos.frequency;}#endif // GLFW_BUILD_MACOS_TIMERvendor/glfw/src/macos_time.hadded
//========================================================================// GLFW 3.5 macOS - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2009-2021 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#define GLFW_MACOS_LIBRARY_TIMER_STATE _GLFWtimerMacOS macos;// macOS-specific global timer data//typedef struct _GLFWtimerMacOS{ uint64_t frequency;} _GLFWtimerMacOS;vendor/glfw/src/mappings.hadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================// As mappings.h.in, this file is used by CMake to produce the mappings.h// header file. If you are adding a GLFW specific gamepad mapping, this is// where to put it.//========================================================================// As mappings.h, this provides all pre-defined gamepad mappings, including// all available in SDL_GameControllerDB. Do not edit this file. Any gamepad// mappings not specific to GLFW should be submitted to SDL_GameControllerDB.// This file can be re-generated from mappings.h.in and the upstream// gamecontrollerdb.txt with the 'update_mappings' CMake target.//========================================================================// All gamepad mappings not labeled GLFW are copied from the// SDL_GameControllerDB project under the following license://// Simple DirectMedia Layer// Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>//// This software is provided 'as-is', without any express or implied warranty.// In no event will the authors be held liable for any damages arising from the// use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not be// misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source distribution.const char* _glfwDefaultMappings[] ={#if defined(_GLFW_WIN32)"03000000fa2d00000100000000000000,3DRUDDER,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows,","03000000c82d00002038000000000000,8bitdo,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000951000000000000,8BitDo Dogbone Modkit,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows,","03000000c82d000011ab000000000000,8BitDo F30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,","03000000c82d00005106000000000000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000151000000000000,8BitDo M30 ModKit,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,","03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,","03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,","03000000c82d00000451000000000000,8BitDo N30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,start:b11,platform:Windows,","03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,","03000000022000000090000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,","03000000203800000900000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00002867000000000000,8BitDo S30 Modkit,a:b0,b:b1,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows,","03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000060000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000061000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,","03000000102800000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00003028000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000351000000000000,8BitDo SN30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00000031000000000000,8BitDo Wireless Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows,","03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows,","03000000a00500003232000000000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows,","03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,","03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,","030000008f0e00001200000000000000,Acme GA-02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows,","03000000c01100000355000011010000,ACRUX USB GAME PAD,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000fa190000f0ff000000000000,Acteck AGJ-3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","030000006f0e00001413000000000000,Afterglow,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000d62000001d57000000000000,Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000491900001904000000000000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows,","03000000710100001904000000000000,Amazon Luna Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b8,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b4,rightstick:b7,rightx:a3,righty:a4,start:b6,x:b3,y:b2,platform:Windows,","03000000ef0500000300000000000000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,","03000000d6200000e557000000000000,Batarang,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows,","030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000bc2000000055000000000000,Betop BFM Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000bc2000006321000000000000,BETOP CONTROLLER,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000790000000700000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,","03000000808300000300000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,","030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,","03000000120c0000210e000000000000,Brook Mars,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","0300000066f700000500000000000000,BrutalLegendTest,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,","03000000d81d00000b00000000000000,BUFFALO BSGP1601 Series ,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows,","03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000005e0400008e02000000000000,Controller (XBOX 360 For Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,","030000005e040000a102000000000000,Controller (Xbox 360 Wireless Receiver for Windows),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,","030000005e040000ff02000000000000,Controller (Xbox One For Windows) - Wired,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,","030000005e040000ea02000000000000,Controller (Xbox One For Windows) - Wireless,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,","03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows,","03000000a306000022f6000000000000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,","03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","030000007d0400000840000000000000,Destroyer Tiltpad,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,x:b0,y:b3,platform:Windows,","03000000791d00000103000000000000,Dual Box WII,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000bd12000002e0000000000000,Dual USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows,","030000008f0e00000910000000000000,DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows,","030000006f0e00003001000000000000,EA SPORTS PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,","03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,","03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,","03000000341a00000108000000000000,EXEQ RF USB Gamepad 8206,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","030000006f0e00008401000000000000,Faceoff Deluxe+ Audio Wired Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00008001000000000000,Faceoff Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000852100000201000000000000,FF-GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00008500000000000000,Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00008400000000000000,Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00008700000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00008800000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows,","030000000d0f00002700000000000000,FIGHTING STICK V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","78696e70757403000000000000000000,Fightstick TES,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Windows,","03000000790000002201000000000000,Game Controller for PC,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows,","03000000260900002625000000000000,Gamecube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows,","03000000790000004618000000000000,GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows,","030000008f0e00000d31000000000000,GAMEPAD 3 TURBO,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000280400000140000000000000,GamePad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","03000000ac0500003d03000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000ac0500004d04000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000ffff00000000000000000000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000009b2800003200000000000000,GC/N64 to USB v3.4,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,","030000009b2800006000000000000000,GC/N64 to USB v3.6,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows,","030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows,","03000000300f00000b01000000000000,GGE909 Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,","03000000f0250000c283000000000000,Gioteck,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000f0250000c383000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000f0250000c483000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","030000007d0400000540000000000000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00004900000000000000,Hatsune Miku Sho Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000001008000001e1000000000000,Havit HV-G60,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows,","03000000d81400000862000000000000,HitBox Edition Cthulhu+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,","03000000632500002605000000000000,HJD-X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00005f00000000000000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00005e00000000000000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00004000000000000000,Hori Fighting Stick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00001600000000007803,HORI Real Arcade Pro EX-SE (Xbox 360),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Windows,","030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00006e00000000000000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00006600000000000000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f0000ee00000000000000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000250900000017000000000000,HRAP2 on PS/SS/N64 Joypad to USB BOX,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows,","030000008f0e00001330000000000000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Windows,","03000000d81d00000f00000000000000,iBUFFALO BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000d81d00001000000000000000,iBUFFALO BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000830500006020000000000000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Windows,","03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,","030000006f0e00002401000000000000,INJUSTICE FightStick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","03000000ac0500002c02000000000000,IPEGA,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000491900000204000000000000,Ipega PG-9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000491900000304000000000000,Ipega PG-9087 - Bluetooth Gamepad,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows,","030000006e0500000a20000000000000,JC-DUX60 ELECOM MMO Gamepad,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows,","030000006e0500000520000000000000,JC-P301U,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,","030000006e0500000320000000000000,JC-U3613M (DInput),a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows,","030000006e0500000720000000000000,JC-W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows,","030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows,","030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows,","030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,","030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,","03000000bd12000003c0000010010000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000bd12000003c0000000000000,JY-P70UR,a:b1,b:b0,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b4,x:b3,y:b2,platform:Windows,","03000000242f00002d00000000000000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000242f00008a00000000000000,JYS Wireless Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,","03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,","030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows,","030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006d04000018c2000000000000,Logitech F510 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006d04000019c2000000000000,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006d0400001ac2000000000000,Logitech Precision Gamepad,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","030000006d0400000ac2000000000000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows,","03000000380700006652000000000000,Mad Catz C.T.R.L.R,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,","03000000380700005032000000000000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000380700005082000000000000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000380700008433000000000000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000380700008483000000000000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000380700008134000000000000,Mad Catz FightStick TE2+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000380700008184000000000000,Mad Catz FightStick TE2+ PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000380700006252000000000000,Mad Catz Micro C.T.R.L.R,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,","03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000380700008532000000000000,Madcatz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000380700003888000000000000,Madcatz Arcade Fightstick TE S+ PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000380700001888000000000000,MadCatz SFIV FightStick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","03000000380700008081000000000000,MADCATZ SFV Arcade FightStick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,","030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,","03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows,","03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows,","03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,back:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b4,leftstick:b0,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows,","03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,","0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000008f0e00001030000000000000,Mayflash USB Adapter for original Sega Saturn controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows,","0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,","03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000790000002418000000000000,Mega Drive,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows,","03000000380700006382000000000000,MLG GamePad PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000c62400002a89000000000000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000c62400002b89000000000000,MOGA XP5-A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000c62400001a89000000000000,MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000c62400001b89000000000000,MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000efbe0000edfe000000000000,Monect Virtual Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows,","03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,","030000006b140000010c000000000000,NACON GC-400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","03000000921200004b46000000000000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows,","03000000790000004518000000000000,NEXILUX GAMECUBE Controller Adapter,platform:Windows,a:b1,b:b0,x:b2,y:b3,start:b9,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a5,righty:a2,lefttrigger:a3,righttrigger:a4,","030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Windows,","03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows,","03000000bd12000015d0000000000000,Nintendo Retrolink USB Super SNES Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows,","030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows,","03000000550900001472000000000000,NVIDIA Controller v01.04,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows,","030000004b120000014d000000000000,NYKO AIRFLO,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows,","03000000d620000013a7000000000000,NSW wired controller,platform:Windows,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,","03000000782300000a10000000000000,Onlive Wireless Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows,","03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,","03000000362800000100000000000000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows,","03000000120c0000f60e000000000000,P4 Wired Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00000901000000000000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","030000008f0e00000300000000000000,Piranha xtreme,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,","030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,","030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,","03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000632500002306000000000000,PS Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,","03000000e30500009605000000000000,PS to USB convert cable,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,","03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,","030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows,","03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,","03000000666600006706000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows,","030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows,","030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows,","03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows,","030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000003807000056a8000000000000,PS3 RF pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000100000008200000000000000,PS360+ v1.66,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:h0.4,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000ff000000cb01000000000000,PSP,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,","03000000300f00000011000000000000,QanBa Arcade JoyStick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows,","03000000300f00001611000000000000,QanBa Arcade JoyStick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows,","03000000222c00000020000000000000,QANBA DRONE ARCADE JOYSTICK,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows,","03000000300f00001210000000000000,QanBa Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,","03000000341a00000104000000000000,QanBa Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows,","03000000222c00000223000000000000,Qanba Obsidian Arcade Joystick PS3 Mode,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000222c00000023000000000000,Qanba Obsidian Arcade Joystick PS4 Mode,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,","03000000321500000204000000000000,Razer Panthera (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000321500000104000000000000,Razer Panthera (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000321500000011000000000000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,","030000000d0f00001100000000000000,REAL ARCADE PRO.3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00006a00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00006b00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00008a00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00008b00000000000000,Real Arcade Pro.4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00007000000000000000,REAL ARCADE PRO.4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00002200000000000000,REAL ARCADE Pro.V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00005b00000000000000,Real Arcade Pro.V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000000d0f00005c00000000000000,Real Arcade Pro.V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000790000001100000000000000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows,","03000000bd12000013d0000000000000,Retrolink USB SEGA Saturn Classic,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,lefttrigger:b6,rightshoulder:b2,righttrigger:b7,start:b8,x:b3,y:b4,platform:Windows,","0300000000f000000300000000000000,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows,","0300000000f00000f100000000000000,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows,","030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000006b140000020d000000000000,Revolution Pro Controller 2(1/2),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000006b140000130d000000000000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000004f04000003d0000000000000,run'n'drive,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,","03000000a306000023f6000000000000,Saitek Cyborg V.1 Game pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,","03000000300f00001201000000000000,Saitek Dual Analog Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,","03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Windows,","03000000a30600000cff000000000000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b0,y:b1,platform:Windows,","03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,","03000000300f00001001000000000000,Saitek P480 Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,","03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows,","03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Windows,","03000000a30600002106000000000000,Saitek PS1000,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,","03000000a306000020f6000000000000,Saitek PS2700,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows,","03000000300f00001101000000000000,Saitek Rumble Pad,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,","03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows,","0300000000050000289b000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,","030000009b2800000500000000000000,Saturn_Adapter_2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,","03000000a30c00002500000000000000,Sega Genesis Mini 3B controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows,","03000000a30c00002400000000000000,Sega Mega Drive Mini 6B controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,","03000000341a00000208000000000000,SL-6555-SBK,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows,","03000000341a00000908000000000000,SL-6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","030000008f0e00000800000000000000,SpeedLink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,","03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,","03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows,","03000000790000001c18000000000000,STK-7024X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000ff1100003133000000000000,SVEN X-PAD,a:b2,b:b3,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a4,start:b5,x:b0,y:b1,platform:Windows,","03000000d620000011a7000000000000,Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000457500002211000000000000,SZMY-POWER PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000004f04000007d0000000000000,T Mini Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000004f0400000ab1000000000000,T.16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows,","03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows,","030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,","030000004f04000023b3000000000000,Thrustmaster Dual Trigger 3-in-1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000004f0400000ed0000000000000,ThrustMaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows,","030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows,","03000000666600000488000000000000,TigerGame PS/PS2 Game Controller Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,","03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows,","03000000d90400000200000000000000,TwinShock PS2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,","030000006e0500001320000000000000,U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000300f00000701000000000000,USB 4-Axis 12-Button Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows,","03000000341a00002308000000000000,USB gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","030000005509000000b4000000000000,USB gamepad,a:b10,b:b11,back:b5,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,guide:b14,leftshoulder:b8,leftstick:b6,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b4,x:b12,y:b13,platform:Windows,","030000006b1400000203000000000000,USB gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","03000000790000000a00000000000000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows,","03000000f0250000c183000000000000,USB gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000ff1100004133000000000000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows,","03000000632500002305000000000000,USB Vibration Joystick (BM),a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000790000001a18000000000000,Venom,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,","03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00000302000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","030000006f0e00000702000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,","0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows,","030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,","030000005e040000130b000000000000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,","03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","03000000450c00002043000000000000,XEOX Gamepad SL-6556-BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,","03000000ac0500005b05000000000000,Xiaoji Gamesir-G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,","03000000172700004431000000000000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,","03000000786901006e70000000000000,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,","03000000790000004f18000000000000,ZD-T Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,","03000000120c0000101e000000000000,ZEROPLUS P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,","78696e70757401000000000000000000,XInput Gamepad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,","78696e70757402000000000000000000,XInput Wheel (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,","78696e70757403000000000000000000,XInput Arcade Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,","78696e70757404000000000000000000,XInput Flight Stick (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,","78696e70757405000000000000000000,XInput Dance Pad (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,","78696e70757406000000000000000000,XInput Guitar (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,","78696e70757408000000000000000000,XInput Drum Kit (GLFW),platform:Windows,a:b0,b:b1,x:b2,y:b3,leftshoulder:b4,rightshoulder:b5,back:b6,start:b7,leftstick:b8,rightstick:b9,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a4,righttrigger:a5,dpup:h0.1,dpright:h0.2,dpdown:h0.4,dpleft:h0.8,",#endif // _GLFW_WIN32#if defined(_GLFW_COCOA)"030000008f0e00000300000009010000,2In1 USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,","03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X,","03000000c82d00005106000000010000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","030000003512000012ab000001000000,8BitDo NES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000022000000090000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00000190000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000102800000900000000000000,8Bitdo SFC30 GamePad Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00001290000001000000,8BitDo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00004028000000010000,8Bitdo SN30 GamePad,a:b1,b:b0,x:b4,y:b3,back:b10,start:b11,leftshoulder:b6,rightshoulder:b7,dpup:-a1,dpdown:+a1,dpleft:-a0,dpright:+a0,platform:Mac OS X,","03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00000031000001000000,8BitDo Wireless Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,","03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X,","03000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,","03000000a00500003232000009010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X,","03000000a30c00002700000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,","03000000a30c00002800000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X,","03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,","03000000ef0500000300000000020000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X,","03000000491900001904000001010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Mac OS X,","03000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X,","03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,","03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,","03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,","03000000120c0000200e000000010000,Brook Mars,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,","03000000120c0000210e000000010000,Brook Mars,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X,","03000000a306000022f6000001030000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X,","03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X,","03000000ad1b000001f9000000000000,Gamestop BB-070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,","0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,","03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,","030000006f0e00000102000000000000,GameStop Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,","030000007d0400000540000001010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,","03000000280400000140000000020000,Gravis Gamepad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,","030000008f0e00000300000007010000,GreenAsia Inc. USB Joystick,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Mac OS X,","030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f00005f00000000010000,Hori Fighting Commander 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f00005e00000000010000,Hori Fighting Commander 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f00005f00000000000000,HORI Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f00005e00000000000000,HORI Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f00004d00000000000000,HORI Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f00006e00000000010000,HORIPAD 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f00006600000000010000,HORIPAD 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f00006600000000000000,HORIPAD FPS PLUS 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,","030000000d0f0000ee00000000010000,HORIPAD mini4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,","030000008f0e00001330000011010000,HuiJia SNES Controller,a:b4,b:b2,back:b16,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b12,rightshoulder:b14,start:b18,x:b6,y:b0,platform:Mac OS X,","03000000830500006020000000010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X,","03000000830500006020000000000000,iBuffalo USB 2-axis 8-button Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X,","030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X,","030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Mac OS X,","03000000242f00002d00000007010000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,","030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000006d04000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000006d04000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,","030000006d04000019c2000005030000,Logitech F710,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,",Showing the first 500 of 1002 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/monitor.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <assert.h>#include <math.h>#include <float.h>#include <string.h>#include <stdlib.h>#include <limits.h>// Lexically compare video modes, used by qsort//static int compareVideoModes(const void* fp, const void* sp){ const GLFWvidmode* fm = fp; const GLFWvidmode* sm = sp; const int fbpp = fm->redBits + fm->greenBits + fm->blueBits; const int sbpp = sm->redBits + sm->greenBits + sm->blueBits; const int farea = fm->width * fm->height; const int sarea = sm->width * sm->height; // First sort on color bits per pixel if (fbpp != sbpp) return fbpp - sbpp; // Then sort on screen area if (farea != sarea) return farea - sarea; // Then sort on width if (fm->width != sm->width) return fm->width - sm->width; // Lastly sort on refresh rate return fm->refreshRate - sm->refreshRate;}// Retrieves the available modes for the specified monitor//static GLFWbool refreshVideoModes(_GLFWmonitor* monitor){ int modeCount; GLFWvidmode* modes; if (monitor->modes) return GLFW_TRUE; modes = _glfw.platform.getVideoModes(monitor, &modeCount); if (!modes) return GLFW_FALSE; qsort(modes, modeCount, sizeof(GLFWvidmode), compareVideoModes); _glfw_free(monitor->modes); monitor->modes = modes; monitor->modeCount = modeCount; return GLFW_TRUE;}//////////////////////////////////////////////////////////////////////////////// GLFW event API ////////////////////////////////////////////////////////////////////////////////// Notifies shared code of a monitor connection or disconnection//void _glfwInputMonitor(_GLFWmonitor* monitor, int action, int placement){ assert(monitor != NULL); assert(action == GLFW_CONNECTED || action == GLFW_DISCONNECTED); assert(placement == _GLFW_INSERT_FIRST || placement == _GLFW_INSERT_LAST); if (action == GLFW_CONNECTED) { _glfw.monitorCount++; _glfw.monitors = _glfw_realloc(_glfw.monitors, sizeof(_GLFWmonitor*) * _glfw.monitorCount); if (placement == _GLFW_INSERT_FIRST) { memmove(_glfw.monitors + 1, _glfw.monitors, ((size_t) _glfw.monitorCount - 1) * sizeof(_GLFWmonitor*)); _glfw.monitors[0] = monitor; } else _glfw.monitors[_glfw.monitorCount - 1] = monitor; } else if (action == GLFW_DISCONNECTED) { int i; _GLFWwindow* window; for (window = _glfw.windowListHead; window; window = window->next) { if (window->monitor == monitor) { int width, height, xoff, yoff; _glfw.platform.getWindowSize(window, &width, &height); _glfw.platform.setWindowMonitor(window, NULL, 0, 0, width, height, 0); _glfw.platform.getWindowFrameSize(window, &xoff, &yoff, NULL, NULL); _glfw.platform.setWindowPos(window, xoff, yoff); } } for (i = 0; i < _glfw.monitorCount; i++) { if (_glfw.monitors[i] == monitor) { _glfw.monitorCount--; memmove(_glfw.monitors + i, _glfw.monitors + i + 1, ((size_t) _glfw.monitorCount - i) * sizeof(_GLFWmonitor*)); break; } } } if (_glfw.callbacks.monitor) _glfw.callbacks.monitor((GLFWmonitor*) monitor, action); if (action == GLFW_DISCONNECTED) _glfwFreeMonitor(monitor);}// Notifies shared code that a full screen window has acquired or released// a monitor//void _glfwInputMonitorWindow(_GLFWmonitor* monitor, _GLFWwindow* window){ assert(monitor != NULL); monitor->window = window;}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////// Allocates and returns a monitor object with the specified name and dimensions//_GLFWmonitor* _glfwAllocMonitor(const char* name, int widthMM, int heightMM){ _GLFWmonitor* monitor = _glfw_calloc(1, sizeof(_GLFWmonitor)); monitor->widthMM = widthMM; monitor->heightMM = heightMM; strncpy(monitor->name, name, sizeof(monitor->name) - 1); return monitor;}// Frees a monitor object and any data associated with it//void _glfwFreeMonitor(_GLFWmonitor* monitor){ if (monitor == NULL) return; _glfw.platform.freeMonitor(monitor); _glfwFreeGammaArrays(&monitor->originalRamp); _glfwFreeGammaArrays(&monitor->currentRamp); _glfw_free(monitor->modes); _glfw_free(monitor);}// Allocates red, green and blue value arrays of the specified size//void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size){ ramp->red = _glfw_calloc(size, sizeof(unsigned short)); ramp->green = _glfw_calloc(size, sizeof(unsigned short)); ramp->blue = _glfw_calloc(size, sizeof(unsigned short)); ramp->size = size;}// Frees the red, green and blue value arrays and clears the struct//void _glfwFreeGammaArrays(GLFWgammaramp* ramp){ _glfw_free(ramp->red); _glfw_free(ramp->green); _glfw_free(ramp->blue); memset(ramp, 0, sizeof(GLFWgammaramp));}// Chooses the video mode most closely matching the desired one//const GLFWvidmode* _glfwChooseVideoMode(_GLFWmonitor* monitor, const GLFWvidmode* desired){ int i; unsigned int sizeDiff, leastSizeDiff = UINT_MAX; unsigned int rateDiff, leastRateDiff = UINT_MAX; unsigned int colorDiff, leastColorDiff = UINT_MAX; const GLFWvidmode* current; const GLFWvidmode* closest = NULL; if (!refreshVideoModes(monitor)) return NULL; for (i = 0; i < monitor->modeCount; i++) { current = monitor->modes + i; colorDiff = 0; if (desired->redBits != GLFW_DONT_CARE) colorDiff += abs(current->redBits - desired->redBits); if (desired->greenBits != GLFW_DONT_CARE) colorDiff += abs(current->greenBits - desired->greenBits); if (desired->blueBits != GLFW_DONT_CARE) colorDiff += abs(current->blueBits - desired->blueBits); sizeDiff = abs((current->width - desired->width) * (current->width - desired->width) + (current->height - desired->height) * (current->height - desired->height)); if (desired->refreshRate != GLFW_DONT_CARE) rateDiff = abs(current->refreshRate - desired->refreshRate); else rateDiff = UINT_MAX - current->refreshRate; if ((colorDiff < leastColorDiff) || (colorDiff == leastColorDiff && sizeDiff < leastSizeDiff) || (colorDiff == leastColorDiff && sizeDiff == leastSizeDiff && rateDiff < leastRateDiff)) { closest = current; leastSizeDiff = sizeDiff; leastRateDiff = rateDiff; leastColorDiff = colorDiff; } } return closest;}// Performs lexical comparison between two @ref GLFWvidmode structures//int _glfwCompareVideoModes(const GLFWvidmode* fm, const GLFWvidmode* sm){ return compareVideoModes(fm, sm);}// Splits a color depth into red, green and blue bit depths//void _glfwSplitBPP(int bpp, int* red, int* green, int* blue){ int delta; // We assume that by 32 the user really meant 24 if (bpp == 32) bpp = 24; // Convert "bits per pixel" to red, green & blue sizes *red = *green = *blue = bpp / 3; delta = bpp - (*red * 3); if (delta >= 1) *green = *green + 1; if (delta == 2) *red = *red + 1;}//////////////////////////////////////////////////////////////////////////////// GLFW public API ////////////////////////////////////////////////////////////////////////////////GLFWAPI GLFWmonitor** glfwGetMonitors(int* count){ assert(count != NULL); *count = 0; _GLFW_REQUIRE_INIT_OR_RETURN(NULL); *count = _glfw.monitorCount; return (GLFWmonitor**) _glfw.monitors;}GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void){ _GLFW_REQUIRE_INIT_OR_RETURN(NULL); if (!_glfw.monitorCount) return NULL; return (GLFWmonitor*) _glfw.monitors[0];}GLFWAPI void glfwGetMonitorPos(GLFWmonitor* handle, int* xpos, int* ypos){ if (xpos) *xpos = 0; if (ypos) *ypos = 0; _GLFW_REQUIRE_INIT(); _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); _glfw.platform.getMonitorPos(monitor, xpos, ypos);}GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* handle, int* xpos, int* ypos, int* width, int* height){ if (xpos) *xpos = 0; if (ypos) *ypos = 0; if (width) *width = 0; if (height) *height = 0; _GLFW_REQUIRE_INIT(); _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); _glfw.platform.getMonitorWorkarea(monitor, xpos, ypos, width, height);}GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* handle, int* widthMM, int* heightMM){ if (widthMM) *widthMM = 0; if (heightMM) *heightMM = 0; _GLFW_REQUIRE_INIT(); _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); if (widthMM) *widthMM = monitor->widthMM; if (heightMM) *heightMM = monitor->heightMM;}GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* handle, float* xscale, float* yscale){ if (xscale) *xscale = 0.f; if (yscale) *yscale = 0.f; _GLFW_REQUIRE_INIT(); _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); _glfw.platform.getMonitorContentScale(monitor, xscale, yscale);}GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* handle){ _GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); return monitor->name;}GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* handle, void* pointer){ _GLFW_REQUIRE_INIT(); _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); monitor->userPointer = pointer;}GLFWAPI void* glfwGetMonitorUserPointer(GLFWmonitor* handle){ _GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); return monitor->userPointer;}GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun){ _GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFW_SWAP(GLFWmonitorfun, _glfw.callbacks.monitor, cbfun); return cbfun;}GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* handle, int* count){ assert(count != NULL); *count = 0; _GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); if (!refreshVideoModes(monitor)) return NULL; *count = monitor->modeCount; return monitor->modes;}GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* handle){ _GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); if (!_glfw.platform.getVideoMode(monitor, &monitor->currentMode)) return NULL; return &monitor->currentMode;}GLFWAPI void glfwSetGamma(GLFWmonitor* handle, float gamma){ unsigned int i; unsigned short* values; GLFWgammaramp ramp; const GLFWgammaramp* original; assert(gamma > 0.f); assert(isfinite(gamma)); _GLFW_REQUIRE_INIT(); assert(handle != NULL); if (!isfinite(gamma) || gamma <= 0.f) { _glfwInputError(GLFW_INVALID_VALUE, "Invalid gamma value %f", gamma); return; } original = glfwGetGammaRamp(handle); if (!original) return; values = _glfw_calloc(original->size, sizeof(unsigned short)); for (i = 0; i < original->size; i++) { float value; // Calculate intensity value = i / (float) (original->size - 1); // Apply gamma curve value = powf(value, 1.f / gamma) * 65535.f + 0.5f; // Clamp to value range value = fminf(value, 65535.f);Showing the first 500 of 557 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/nsgl_context.madded
//========================================================================// GLFW 3.5 macOS - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2009-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_COCOA)#include <unistd.h>#include <math.h>#include <assert.h>static void makeContextCurrentNSGL(_GLFWwindow* window){ @autoreleasepool { if (window) [window->context.nsgl.object makeCurrentContext]; else [NSOpenGLContext clearCurrentContext]; _glfwPlatformSetTls(&_glfw.contextSlot, window); } // autoreleasepool}static void swapBuffersNSGL(_GLFWwindow* window){ @autoreleasepool { // HACK: Simulate vsync with usleep as NSGL swap interval does not apply to // windows with a non-visible occlusion state if (window->ns.occluded) { int interval = 0; [window->context.nsgl.object getValues:&interval forParameter:NSOpenGLContextParameterSwapInterval]; if (interval > 0) { const double framerate = 60.0; const uint64_t frequency = _glfwPlatformGetTimerFrequency(); const uint64_t value = _glfwPlatformGetTimerValue(); const double elapsed = value / (double) frequency; const double period = 1.0 / framerate; const double delay = period - fmod(elapsed, period); usleep(floorl(delay * 1e6)); } } [window->context.nsgl.object flushBuffer]; } // autoreleasepool}static void swapIntervalNSGL(int interval){ @autoreleasepool { _GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot); assert(window != NULL); [window->context.nsgl.object setValues:&interval forParameter:NSOpenGLContextParameterSwapInterval]; } // autoreleasepool}static int extensionSupportedNSGL(const char* extension){ // There are no NSGL extensions return GLFW_FALSE;}static GLFWglproc getProcAddressNSGL(const char* procname){ CFStringRef symbolName = CFStringCreateWithCString(kCFAllocatorDefault, procname, kCFStringEncodingASCII); GLFWglproc symbol = CFBundleGetFunctionPointerForName(_glfw.nsgl.framework, symbolName); CFRelease(symbolName); return symbol;}static void destroyContextNSGL(_GLFWwindow* window){ @autoreleasepool { [window->context.nsgl.pixelFormat release]; window->context.nsgl.pixelFormat = nil; [window->context.nsgl.object release]; window->context.nsgl.object = nil; } // autoreleasepool}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwInitNSGL(void){ if (_glfw.nsgl.framework) return GLFW_TRUE; _glfw.nsgl.framework = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.opengl")); if (_glfw.nsgl.framework == NULL) { _glfwInputError(GLFW_API_UNAVAILABLE, "NSGL: Failed to locate OpenGL framework"); return GLFW_FALSE; } return GLFW_TRUE;}void _glfwTerminateNSGL(void){}GLFWbool _glfwCreateContextNSGL(_GLFWwindow* window, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig){ if (ctxconfig->client == GLFW_OPENGL_ES_API) { _glfwInputError(GLFW_API_UNAVAILABLE, "NSGL: OpenGL ES is not available via NSGL"); return GLFW_FALSE; } if (ctxconfig->major > 2) { if (ctxconfig->major == 3 && ctxconfig->minor < 2) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "NSGL: The targeted version of macOS does not support OpenGL 3.0 or 3.1 but may support 3.2 and above"); return GLFW_FALSE; } } if (ctxconfig->major >= 3 && ctxconfig->profile == GLFW_OPENGL_COMPAT_PROFILE) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "NSGL: The compatibility profile is not available on macOS"); return GLFW_FALSE; } // Context robustness modes (GL_KHR_robustness) are not supported by // macOS but are not a hard constraint, so ignore and continue // Context release behaviors (GL_KHR_context_flush_control) are not // supported by macOS but are not a hard constraint, so ignore and continue // Debug contexts (GL_KHR_debug) are not supported by macOS but are not // a hard constraint, so ignore and continue // No-error contexts (GL_KHR_no_error) are not supported by macOS but // are not a hard constraint, so ignore and continue#define ADD_ATTRIB(a) \{ \ assert((size_t) index < sizeof(attribs) / sizeof(attribs[0])); \ attribs[index++] = a; \}#define SET_ATTRIB(a, v) { ADD_ATTRIB(a); ADD_ATTRIB(v); } NSOpenGLPixelFormatAttribute attribs[40]; int index = 0; ADD_ATTRIB(NSOpenGLPFAAccelerated); ADD_ATTRIB(NSOpenGLPFAClosestPolicy); if (ctxconfig->nsgl.offline) { ADD_ATTRIB(NSOpenGLPFAAllowOfflineRenderers); // NOTE: This replaces the NSSupportsAutomaticGraphicsSwitching key in // Info.plist for unbundled applications // HACK: This assumes that NSOpenGLPixelFormat will remain // a straightforward wrapper of its CGL counterpart ADD_ATTRIB(kCGLPFASupportsAutomaticGraphicsSwitching); } if (ctxconfig->major >= 4) { SET_ATTRIB(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core); } else if (ctxconfig->major >= 3) { SET_ATTRIB(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core); } if (ctxconfig->major <= 2) { if (fbconfig->auxBuffers != GLFW_DONT_CARE) SET_ATTRIB(NSOpenGLPFAAuxBuffers, fbconfig->auxBuffers); if (fbconfig->accumRedBits != GLFW_DONT_CARE && fbconfig->accumGreenBits != GLFW_DONT_CARE && fbconfig->accumBlueBits != GLFW_DONT_CARE && fbconfig->accumAlphaBits != GLFW_DONT_CARE) { const int accumBits = fbconfig->accumRedBits + fbconfig->accumGreenBits + fbconfig->accumBlueBits + fbconfig->accumAlphaBits; SET_ATTRIB(NSOpenGLPFAAccumSize, accumBits); } } if (fbconfig->redBits != GLFW_DONT_CARE && fbconfig->greenBits != GLFW_DONT_CARE && fbconfig->blueBits != GLFW_DONT_CARE) { int colorBits = fbconfig->redBits + fbconfig->greenBits + fbconfig->blueBits; // macOS needs non-zero color size, so set reasonable values if (colorBits == 0) colorBits = 24; else if (colorBits < 15) colorBits = 15; SET_ATTRIB(NSOpenGLPFAColorSize, colorBits); } if (fbconfig->alphaBits != GLFW_DONT_CARE) SET_ATTRIB(NSOpenGLPFAAlphaSize, fbconfig->alphaBits); if (fbconfig->depthBits != GLFW_DONT_CARE) SET_ATTRIB(NSOpenGLPFADepthSize, fbconfig->depthBits); if (fbconfig->stencilBits != GLFW_DONT_CARE) SET_ATTRIB(NSOpenGLPFAStencilSize, fbconfig->stencilBits); if (fbconfig->stereo) {#if MAC_OS_X_VERSION_MAX_ALLOWED >= 101200 _glfwInputError(GLFW_FORMAT_UNAVAILABLE, "NSGL: Stereo rendering is deprecated"); return GLFW_FALSE;#else ADD_ATTRIB(NSOpenGLPFAStereo);#endif } if (fbconfig->doublebuffer) ADD_ATTRIB(NSOpenGLPFADoubleBuffer); if (fbconfig->samples != GLFW_DONT_CARE) { if (fbconfig->samples == 0) { SET_ATTRIB(NSOpenGLPFASampleBuffers, 0); } else { SET_ATTRIB(NSOpenGLPFASampleBuffers, 1); SET_ATTRIB(NSOpenGLPFASamples, fbconfig->samples); } } // NOTE: All NSOpenGLPixelFormats on the relevant cards support sRGB // framebuffer, so there's no need (and no way) to request it ADD_ATTRIB(0);#undef ADD_ATTRIB#undef SET_ATTRIB window->context.nsgl.pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs]; if (window->context.nsgl.pixelFormat == nil) { _glfwInputError(GLFW_FORMAT_UNAVAILABLE, "NSGL: Failed to find a suitable pixel format"); return GLFW_FALSE; } NSOpenGLContext* share = nil; if (ctxconfig->share) share = ctxconfig->share->context.nsgl.object; window->context.nsgl.object = [[NSOpenGLContext alloc] initWithFormat:window->context.nsgl.pixelFormat shareContext:share]; if (window->context.nsgl.object == nil) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "NSGL: Failed to create OpenGL context"); return GLFW_FALSE; } if (fbconfig->transparent) { GLint opaque = 0; [window->context.nsgl.object setValues:&opaque forParameter:NSOpenGLContextParameterSurfaceOpacity]; } [window->ns.view setWantsBestResolutionOpenGLSurface:window->ns.scaleFramebuffer]; [window->context.nsgl.object setView:window->ns.view]; window->context.makeCurrent = makeContextCurrentNSGL; window->context.swapBuffers = swapBuffersNSGL; window->context.swapInterval = swapIntervalNSGL; window->context.extensionSupported = extensionSupportedNSGL; window->context.getProcAddress = getProcAddressNSGL; window->context.destroy = destroyContextNSGL; return GLFW_TRUE;}//////////////////////////////////////////////////////////////////////////////// GLFW native API ////////////////////////////////////////////////////////////////////////////////GLFWAPI id glfwGetNSGLContext(GLFWwindow* handle){ _GLFW_REQUIRE_INIT_OR_RETURN(nil); if (_glfw.platform.platformID != GLFW_PLATFORM_COCOA) { _glfwInputError(GLFW_PLATFORM_UNAVAILABLE, "NSGL: Platform not initialized"); return nil; } _GLFWwindow* window = (_GLFWwindow*) handle; assert(window != NULL); if (window->context.source != GLFW_NATIVE_CONTEXT_API) { _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL); return nil; } return window->context.nsgl.object;}#endif // _GLFW_COCOAvendor/glfw/src/null_init.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2016 Google Inc.// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <stdlib.h>#include <string.h>//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwConnectNull(int platformID, _GLFWplatform* platform){ const _GLFWplatform null = { .platformID = GLFW_PLATFORM_NULL, .init = _glfwInitNull, .terminate = _glfwTerminateNull, .getCursorPos = _glfwGetCursorPosNull, .setCursorPos = _glfwSetCursorPosNull, .setCursorMode = _glfwSetCursorModeNull, .setRawMouseMotion = _glfwSetRawMouseMotionNull, .rawMouseMotionSupported = _glfwRawMouseMotionSupportedNull, .createCursor = _glfwCreateCursorNull, .createStandardCursor = _glfwCreateStandardCursorNull, .destroyCursor = _glfwDestroyCursorNull, .setCursor = _glfwSetCursorNull, .getScancodeName = _glfwGetScancodeNameNull, .getKeyScancode = _glfwGetKeyScancodeNull, .setClipboardString = _glfwSetClipboardStringNull, .getClipboardString = _glfwGetClipboardStringNull, .initJoysticks = _glfwInitJoysticksNull, .terminateJoysticks = _glfwTerminateJoysticksNull, .pollJoystick = _glfwPollJoystickNull, .getMappingName = _glfwGetMappingNameNull, .updateGamepadGUID = _glfwUpdateGamepadGUIDNull, .freeMonitor = _glfwFreeMonitorNull, .getMonitorPos = _glfwGetMonitorPosNull, .getMonitorContentScale = _glfwGetMonitorContentScaleNull, .getMonitorWorkarea = _glfwGetMonitorWorkareaNull, .getVideoModes = _glfwGetVideoModesNull, .getVideoMode = _glfwGetVideoModeNull, .getGammaRamp = _glfwGetGammaRampNull, .setGammaRamp = _glfwSetGammaRampNull, .createWindow = _glfwCreateWindowNull, .destroyWindow = _glfwDestroyWindowNull, .setWindowTitle = _glfwSetWindowTitleNull, .setWindowIcon = _glfwSetWindowIconNull, .getWindowPos = _glfwGetWindowPosNull, .setWindowPos = _glfwSetWindowPosNull, .getWindowSize = _glfwGetWindowSizeNull, .setWindowSize = _glfwSetWindowSizeNull, .setWindowSizeLimits = _glfwSetWindowSizeLimitsNull, .setWindowAspectRatio = _glfwSetWindowAspectRatioNull, .getFramebufferSize = _glfwGetFramebufferSizeNull, .getWindowFrameSize = _glfwGetWindowFrameSizeNull, .getWindowContentScale = _glfwGetWindowContentScaleNull, .iconifyWindow = _glfwIconifyWindowNull, .restoreWindow = _glfwRestoreWindowNull, .maximizeWindow = _glfwMaximizeWindowNull, .showWindow = _glfwShowWindowNull, .hideWindow = _glfwHideWindowNull, .requestWindowAttention = _glfwRequestWindowAttentionNull, .focusWindow = _glfwFocusWindowNull, .setWindowMonitor = _glfwSetWindowMonitorNull, .windowFocused = _glfwWindowFocusedNull, .windowIconified = _glfwWindowIconifiedNull, .windowVisible = _glfwWindowVisibleNull, .windowMaximized = _glfwWindowMaximizedNull, .windowHovered = _glfwWindowHoveredNull, .framebufferTransparent = _glfwFramebufferTransparentNull, .getWindowOpacity = _glfwGetWindowOpacityNull, .setWindowResizable = _glfwSetWindowResizableNull, .setWindowDecorated = _glfwSetWindowDecoratedNull, .setWindowFloating = _glfwSetWindowFloatingNull, .setWindowOpacity = _glfwSetWindowOpacityNull, .setWindowMousePassthrough = _glfwSetWindowMousePassthroughNull, .pollEvents = _glfwPollEventsNull, .waitEvents = _glfwWaitEventsNull, .waitEventsTimeout = _glfwWaitEventsTimeoutNull, .postEmptyEvent = _glfwPostEmptyEventNull, .getEGLPlatform = _glfwGetEGLPlatformNull, .getEGLNativeDisplay = _glfwGetEGLNativeDisplayNull, .getEGLNativeWindow = _glfwGetEGLNativeWindowNull, .getRequiredInstanceExtensions = _glfwGetRequiredInstanceExtensionsNull, .getPhysicalDevicePresentationSupport = _glfwGetPhysicalDevicePresentationSupportNull, .createWindowSurface = _glfwCreateWindowSurfaceNull }; *platform = null; return GLFW_TRUE;}int _glfwInitNull(void){ int scancode; memset(_glfw.null.keycodes, -1, sizeof(_glfw.null.keycodes)); memset(_glfw.null.scancodes, -1, sizeof(_glfw.null.scancodes)); _glfw.null.keycodes[GLFW_NULL_SC_SPACE] = GLFW_KEY_SPACE; _glfw.null.keycodes[GLFW_NULL_SC_APOSTROPHE] = GLFW_KEY_APOSTROPHE; _glfw.null.keycodes[GLFW_NULL_SC_COMMA] = GLFW_KEY_COMMA; _glfw.null.keycodes[GLFW_NULL_SC_MINUS] = GLFW_KEY_MINUS; _glfw.null.keycodes[GLFW_NULL_SC_PERIOD] = GLFW_KEY_PERIOD; _glfw.null.keycodes[GLFW_NULL_SC_SLASH] = GLFW_KEY_SLASH; _glfw.null.keycodes[GLFW_NULL_SC_0] = GLFW_KEY_0; _glfw.null.keycodes[GLFW_NULL_SC_1] = GLFW_KEY_1; _glfw.null.keycodes[GLFW_NULL_SC_2] = GLFW_KEY_2; _glfw.null.keycodes[GLFW_NULL_SC_3] = GLFW_KEY_3; _glfw.null.keycodes[GLFW_NULL_SC_4] = GLFW_KEY_4; _glfw.null.keycodes[GLFW_NULL_SC_5] = GLFW_KEY_5; _glfw.null.keycodes[GLFW_NULL_SC_6] = GLFW_KEY_6; _glfw.null.keycodes[GLFW_NULL_SC_7] = GLFW_KEY_7; _glfw.null.keycodes[GLFW_NULL_SC_8] = GLFW_KEY_8; _glfw.null.keycodes[GLFW_NULL_SC_9] = GLFW_KEY_9; _glfw.null.keycodes[GLFW_NULL_SC_SEMICOLON] = GLFW_KEY_SEMICOLON; _glfw.null.keycodes[GLFW_NULL_SC_EQUAL] = GLFW_KEY_EQUAL; _glfw.null.keycodes[GLFW_NULL_SC_A] = GLFW_KEY_A; _glfw.null.keycodes[GLFW_NULL_SC_B] = GLFW_KEY_B; _glfw.null.keycodes[GLFW_NULL_SC_C] = GLFW_KEY_C; _glfw.null.keycodes[GLFW_NULL_SC_D] = GLFW_KEY_D; _glfw.null.keycodes[GLFW_NULL_SC_E] = GLFW_KEY_E; _glfw.null.keycodes[GLFW_NULL_SC_F] = GLFW_KEY_F; _glfw.null.keycodes[GLFW_NULL_SC_G] = GLFW_KEY_G; _glfw.null.keycodes[GLFW_NULL_SC_H] = GLFW_KEY_H; _glfw.null.keycodes[GLFW_NULL_SC_I] = GLFW_KEY_I; _glfw.null.keycodes[GLFW_NULL_SC_J] = GLFW_KEY_J; _glfw.null.keycodes[GLFW_NULL_SC_K] = GLFW_KEY_K; _glfw.null.keycodes[GLFW_NULL_SC_L] = GLFW_KEY_L; _glfw.null.keycodes[GLFW_NULL_SC_M] = GLFW_KEY_M; _glfw.null.keycodes[GLFW_NULL_SC_N] = GLFW_KEY_N; _glfw.null.keycodes[GLFW_NULL_SC_O] = GLFW_KEY_O; _glfw.null.keycodes[GLFW_NULL_SC_P] = GLFW_KEY_P; _glfw.null.keycodes[GLFW_NULL_SC_Q] = GLFW_KEY_Q; _glfw.null.keycodes[GLFW_NULL_SC_R] = GLFW_KEY_R; _glfw.null.keycodes[GLFW_NULL_SC_S] = GLFW_KEY_S; _glfw.null.keycodes[GLFW_NULL_SC_T] = GLFW_KEY_T; _glfw.null.keycodes[GLFW_NULL_SC_U] = GLFW_KEY_U; _glfw.null.keycodes[GLFW_NULL_SC_V] = GLFW_KEY_V; _glfw.null.keycodes[GLFW_NULL_SC_W] = GLFW_KEY_W; _glfw.null.keycodes[GLFW_NULL_SC_X] = GLFW_KEY_X; _glfw.null.keycodes[GLFW_NULL_SC_Y] = GLFW_KEY_Y; _glfw.null.keycodes[GLFW_NULL_SC_Z] = GLFW_KEY_Z; _glfw.null.keycodes[GLFW_NULL_SC_LEFT_BRACKET] = GLFW_KEY_LEFT_BRACKET; _glfw.null.keycodes[GLFW_NULL_SC_BACKSLASH] = GLFW_KEY_BACKSLASH; _glfw.null.keycodes[GLFW_NULL_SC_RIGHT_BRACKET] = GLFW_KEY_RIGHT_BRACKET; _glfw.null.keycodes[GLFW_NULL_SC_GRAVE_ACCENT] = GLFW_KEY_GRAVE_ACCENT; _glfw.null.keycodes[GLFW_NULL_SC_WORLD_1] = GLFW_KEY_WORLD_1; _glfw.null.keycodes[GLFW_NULL_SC_WORLD_2] = GLFW_KEY_WORLD_2; _glfw.null.keycodes[GLFW_NULL_SC_ESCAPE] = GLFW_KEY_ESCAPE; _glfw.null.keycodes[GLFW_NULL_SC_ENTER] = GLFW_KEY_ENTER; _glfw.null.keycodes[GLFW_NULL_SC_TAB] = GLFW_KEY_TAB; _glfw.null.keycodes[GLFW_NULL_SC_BACKSPACE] = GLFW_KEY_BACKSPACE; _glfw.null.keycodes[GLFW_NULL_SC_INSERT] = GLFW_KEY_INSERT; _glfw.null.keycodes[GLFW_NULL_SC_DELETE] = GLFW_KEY_DELETE; _glfw.null.keycodes[GLFW_NULL_SC_RIGHT] = GLFW_KEY_RIGHT; _glfw.null.keycodes[GLFW_NULL_SC_LEFT] = GLFW_KEY_LEFT; _glfw.null.keycodes[GLFW_NULL_SC_DOWN] = GLFW_KEY_DOWN; _glfw.null.keycodes[GLFW_NULL_SC_UP] = GLFW_KEY_UP; _glfw.null.keycodes[GLFW_NULL_SC_PAGE_UP] = GLFW_KEY_PAGE_UP; _glfw.null.keycodes[GLFW_NULL_SC_PAGE_DOWN] = GLFW_KEY_PAGE_DOWN; _glfw.null.keycodes[GLFW_NULL_SC_HOME] = GLFW_KEY_HOME; _glfw.null.keycodes[GLFW_NULL_SC_END] = GLFW_KEY_END; _glfw.null.keycodes[GLFW_NULL_SC_CAPS_LOCK] = GLFW_KEY_CAPS_LOCK; _glfw.null.keycodes[GLFW_NULL_SC_SCROLL_LOCK] = GLFW_KEY_SCROLL_LOCK; _glfw.null.keycodes[GLFW_NULL_SC_NUM_LOCK] = GLFW_KEY_NUM_LOCK; _glfw.null.keycodes[GLFW_NULL_SC_PRINT_SCREEN] = GLFW_KEY_PRINT_SCREEN; _glfw.null.keycodes[GLFW_NULL_SC_PAUSE] = GLFW_KEY_PAUSE; _glfw.null.keycodes[GLFW_NULL_SC_F1] = GLFW_KEY_F1; _glfw.null.keycodes[GLFW_NULL_SC_F2] = GLFW_KEY_F2; _glfw.null.keycodes[GLFW_NULL_SC_F3] = GLFW_KEY_F3; _glfw.null.keycodes[GLFW_NULL_SC_F4] = GLFW_KEY_F4; _glfw.null.keycodes[GLFW_NULL_SC_F5] = GLFW_KEY_F5; _glfw.null.keycodes[GLFW_NULL_SC_F6] = GLFW_KEY_F6; _glfw.null.keycodes[GLFW_NULL_SC_F7] = GLFW_KEY_F7; _glfw.null.keycodes[GLFW_NULL_SC_F8] = GLFW_KEY_F8; _glfw.null.keycodes[GLFW_NULL_SC_F9] = GLFW_KEY_F9; _glfw.null.keycodes[GLFW_NULL_SC_F10] = GLFW_KEY_F10; _glfw.null.keycodes[GLFW_NULL_SC_F11] = GLFW_KEY_F11; _glfw.null.keycodes[GLFW_NULL_SC_F12] = GLFW_KEY_F12; _glfw.null.keycodes[GLFW_NULL_SC_F13] = GLFW_KEY_F13; _glfw.null.keycodes[GLFW_NULL_SC_F14] = GLFW_KEY_F14; _glfw.null.keycodes[GLFW_NULL_SC_F15] = GLFW_KEY_F15; _glfw.null.keycodes[GLFW_NULL_SC_F16] = GLFW_KEY_F16; _glfw.null.keycodes[GLFW_NULL_SC_F17] = GLFW_KEY_F17; _glfw.null.keycodes[GLFW_NULL_SC_F18] = GLFW_KEY_F18; _glfw.null.keycodes[GLFW_NULL_SC_F19] = GLFW_KEY_F19; _glfw.null.keycodes[GLFW_NULL_SC_F20] = GLFW_KEY_F20; _glfw.null.keycodes[GLFW_NULL_SC_F21] = GLFW_KEY_F21; _glfw.null.keycodes[GLFW_NULL_SC_F22] = GLFW_KEY_F22; _glfw.null.keycodes[GLFW_NULL_SC_F23] = GLFW_KEY_F23; _glfw.null.keycodes[GLFW_NULL_SC_F24] = GLFW_KEY_F24; _glfw.null.keycodes[GLFW_NULL_SC_F25] = GLFW_KEY_F25; _glfw.null.keycodes[GLFW_NULL_SC_KP_0] = GLFW_KEY_KP_0; _glfw.null.keycodes[GLFW_NULL_SC_KP_1] = GLFW_KEY_KP_1; _glfw.null.keycodes[GLFW_NULL_SC_KP_2] = GLFW_KEY_KP_2; _glfw.null.keycodes[GLFW_NULL_SC_KP_3] = GLFW_KEY_KP_3; _glfw.null.keycodes[GLFW_NULL_SC_KP_4] = GLFW_KEY_KP_4; _glfw.null.keycodes[GLFW_NULL_SC_KP_5] = GLFW_KEY_KP_5; _glfw.null.keycodes[GLFW_NULL_SC_KP_6] = GLFW_KEY_KP_6; _glfw.null.keycodes[GLFW_NULL_SC_KP_7] = GLFW_KEY_KP_7; _glfw.null.keycodes[GLFW_NULL_SC_KP_8] = GLFW_KEY_KP_8; _glfw.null.keycodes[GLFW_NULL_SC_KP_9] = GLFW_KEY_KP_9; _glfw.null.keycodes[GLFW_NULL_SC_KP_DECIMAL] = GLFW_KEY_KP_DECIMAL; _glfw.null.keycodes[GLFW_NULL_SC_KP_DIVIDE] = GLFW_KEY_KP_DIVIDE; _glfw.null.keycodes[GLFW_NULL_SC_KP_MULTIPLY] = GLFW_KEY_KP_MULTIPLY; _glfw.null.keycodes[GLFW_NULL_SC_KP_SUBTRACT] = GLFW_KEY_KP_SUBTRACT; _glfw.null.keycodes[GLFW_NULL_SC_KP_ADD] = GLFW_KEY_KP_ADD; _glfw.null.keycodes[GLFW_NULL_SC_KP_ENTER] = GLFW_KEY_KP_ENTER; _glfw.null.keycodes[GLFW_NULL_SC_KP_EQUAL] = GLFW_KEY_KP_EQUAL; _glfw.null.keycodes[GLFW_NULL_SC_LEFT_SHIFT] = GLFW_KEY_LEFT_SHIFT; _glfw.null.keycodes[GLFW_NULL_SC_LEFT_CONTROL] = GLFW_KEY_LEFT_CONTROL; _glfw.null.keycodes[GLFW_NULL_SC_LEFT_ALT] = GLFW_KEY_LEFT_ALT; _glfw.null.keycodes[GLFW_NULL_SC_LEFT_SUPER] = GLFW_KEY_LEFT_SUPER; _glfw.null.keycodes[GLFW_NULL_SC_RIGHT_SHIFT] = GLFW_KEY_RIGHT_SHIFT; _glfw.null.keycodes[GLFW_NULL_SC_RIGHT_CONTROL] = GLFW_KEY_RIGHT_CONTROL; _glfw.null.keycodes[GLFW_NULL_SC_RIGHT_ALT] = GLFW_KEY_RIGHT_ALT; _glfw.null.keycodes[GLFW_NULL_SC_RIGHT_SUPER] = GLFW_KEY_RIGHT_SUPER; _glfw.null.keycodes[GLFW_NULL_SC_MENU] = GLFW_KEY_MENU; for (scancode = GLFW_NULL_SC_FIRST; scancode < GLFW_NULL_SC_LAST; scancode++) { if (_glfw.null.keycodes[scancode] > 0) _glfw.null.scancodes[_glfw.null.keycodes[scancode]] = scancode; } _glfwPollMonitorsNull(); return GLFW_TRUE;}void _glfwTerminateNull(void){ free(_glfw.null.clipboardString); _glfwTerminateOSMesa(); _glfwTerminateEGL(); memset(&_glfw.null, 0, sizeof(_glfw.null));}vendor/glfw/src/null_joystick.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwInitJoysticksNull(void){ return GLFW_TRUE;}void _glfwTerminateJoysticksNull(void){}GLFWbool _glfwPollJoystickNull(_GLFWjoystick* js, int mode){ return GLFW_FALSE;}const char* _glfwGetMappingNameNull(void){ return "";}void _glfwUpdateGamepadGUIDNull(char* guid){}vendor/glfw/src/null_joystick.hadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================GLFWbool _glfwInitJoysticksNull(void);void _glfwTerminateJoysticksNull(void);GLFWbool _glfwPollJoystickNull(_GLFWjoystick* js, int mode);const char* _glfwGetMappingNameNull(void);void _glfwUpdateGamepadGUIDNull(char* guid);vendor/glfw/src/null_monitor.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2016 Google Inc.// Copyright (c) 2016-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <stdlib.h>#include <string.h>#include <math.h>// The the sole (fake) video mode of our (sole) fake monitor//static GLFWvidmode getVideoMode(void){ GLFWvidmode mode; mode.width = 1920; mode.height = 1080; mode.redBits = 8; mode.greenBits = 8; mode.blueBits = 8; mode.refreshRate = 60; return mode;}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////void _glfwPollMonitorsNull(void){ const float dpi = 141.f; const GLFWvidmode mode = getVideoMode(); _GLFWmonitor* monitor = _glfwAllocMonitor("Null SuperNoop 0", (int) (mode.width * 25.4f / dpi), (int) (mode.height * 25.4f / dpi)); _glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_FIRST);}//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void _glfwFreeMonitorNull(_GLFWmonitor* monitor){ _glfwFreeGammaArrays(&monitor->null.ramp);}void _glfwGetMonitorPosNull(_GLFWmonitor* monitor, int* xpos, int* ypos){ if (xpos) *xpos = 0; if (ypos) *ypos = 0;}void _glfwGetMonitorContentScaleNull(_GLFWmonitor* monitor, float* xscale, float* yscale){ if (xscale) *xscale = 1.f; if (yscale) *yscale = 1.f;}void _glfwGetMonitorWorkareaNull(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height){ const GLFWvidmode mode = getVideoMode(); if (xpos) *xpos = 0; if (ypos) *ypos = 10; if (width) *width = mode.width; if (height) *height = mode.height - 10;}GLFWvidmode* _glfwGetVideoModesNull(_GLFWmonitor* monitor, int* found){ GLFWvidmode* mode = _glfw_calloc(1, sizeof(GLFWvidmode)); *mode = getVideoMode(); *found = 1; return mode;}GLFWbool _glfwGetVideoModeNull(_GLFWmonitor* monitor, GLFWvidmode* mode){ *mode = getVideoMode(); return GLFW_TRUE;}GLFWbool _glfwGetGammaRampNull(_GLFWmonitor* monitor, GLFWgammaramp* ramp){ if (!monitor->null.ramp.size) { unsigned int i; _glfwAllocGammaArrays(&monitor->null.ramp, 256); for (i = 0; i < monitor->null.ramp.size; i++) { const float gamma = 2.2f; float value; value = i / (float) (monitor->null.ramp.size - 1); value = powf(value, 1.f / gamma) * 65535.f + 0.5f; value = fminf(value, 65535.f); monitor->null.ramp.red[i] = (unsigned short) value; monitor->null.ramp.green[i] = (unsigned short) value; monitor->null.ramp.blue[i] = (unsigned short) value; } } _glfwAllocGammaArrays(ramp, monitor->null.ramp.size); memcpy(ramp->red, monitor->null.ramp.red, sizeof(short) * ramp->size); memcpy(ramp->green, monitor->null.ramp.green, sizeof(short) * ramp->size); memcpy(ramp->blue, monitor->null.ramp.blue, sizeof(short) * ramp->size); return GLFW_TRUE;}void _glfwSetGammaRampNull(_GLFWmonitor* monitor, const GLFWgammaramp* ramp){ if (monitor->null.ramp.size != ramp->size) { _glfwInputError(GLFW_PLATFORM_ERROR, "Null: Gamma ramp size must match current ramp size"); return; } memcpy(monitor->null.ramp.red, ramp->red, sizeof(short) * ramp->size); memcpy(monitor->null.ramp.green, ramp->green, sizeof(short) * ramp->size); memcpy(monitor->null.ramp.blue, ramp->blue, sizeof(short) * ramp->size);}vendor/glfw/src/null_platform.hadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2016 Google Inc.// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#define GLFW_NULL_WINDOW_STATE _GLFWwindowNull null;#define GLFW_NULL_LIBRARY_WINDOW_STATE _GLFWlibraryNull null;#define GLFW_NULL_MONITOR_STATE _GLFWmonitorNull null;#define GLFW_NULL_CONTEXT_STATE#define GLFW_NULL_CURSOR_STATE#define GLFW_NULL_LIBRARY_CONTEXT_STATE#define GLFW_NULL_SC_FIRST GLFW_NULL_SC_SPACE#define GLFW_NULL_SC_SPACE 1#define GLFW_NULL_SC_APOSTROPHE 2#define GLFW_NULL_SC_COMMA 3#define GLFW_NULL_SC_MINUS 4#define GLFW_NULL_SC_PERIOD 5#define GLFW_NULL_SC_SLASH 6#define GLFW_NULL_SC_0 7#define GLFW_NULL_SC_1 8#define GLFW_NULL_SC_2 9#define GLFW_NULL_SC_3 10#define GLFW_NULL_SC_4 11#define GLFW_NULL_SC_5 12#define GLFW_NULL_SC_6 13#define GLFW_NULL_SC_7 14#define GLFW_NULL_SC_8 15#define GLFW_NULL_SC_9 16#define GLFW_NULL_SC_SEMICOLON 17#define GLFW_NULL_SC_EQUAL 18#define GLFW_NULL_SC_LEFT_BRACKET 19#define GLFW_NULL_SC_BACKSLASH 20#define GLFW_NULL_SC_RIGHT_BRACKET 21#define GLFW_NULL_SC_GRAVE_ACCENT 22#define GLFW_NULL_SC_WORLD_1 23#define GLFW_NULL_SC_WORLD_2 24#define GLFW_NULL_SC_ESCAPE 25#define GLFW_NULL_SC_ENTER 26#define GLFW_NULL_SC_TAB 27#define GLFW_NULL_SC_BACKSPACE 28#define GLFW_NULL_SC_INSERT 29#define GLFW_NULL_SC_DELETE 30#define GLFW_NULL_SC_RIGHT 31#define GLFW_NULL_SC_LEFT 32#define GLFW_NULL_SC_DOWN 33#define GLFW_NULL_SC_UP 34#define GLFW_NULL_SC_PAGE_UP 35#define GLFW_NULL_SC_PAGE_DOWN 36#define GLFW_NULL_SC_HOME 37#define GLFW_NULL_SC_END 38#define GLFW_NULL_SC_CAPS_LOCK 39#define GLFW_NULL_SC_SCROLL_LOCK 40#define GLFW_NULL_SC_NUM_LOCK 41#define GLFW_NULL_SC_PRINT_SCREEN 42#define GLFW_NULL_SC_PAUSE 43#define GLFW_NULL_SC_A 44#define GLFW_NULL_SC_B 45#define GLFW_NULL_SC_C 46#define GLFW_NULL_SC_D 47#define GLFW_NULL_SC_E 48#define GLFW_NULL_SC_F 49#define GLFW_NULL_SC_G 50#define GLFW_NULL_SC_H 51#define GLFW_NULL_SC_I 52#define GLFW_NULL_SC_J 53#define GLFW_NULL_SC_K 54#define GLFW_NULL_SC_L 55#define GLFW_NULL_SC_M 56#define GLFW_NULL_SC_N 57#define GLFW_NULL_SC_O 58#define GLFW_NULL_SC_P 59#define GLFW_NULL_SC_Q 60#define GLFW_NULL_SC_R 61#define GLFW_NULL_SC_S 62#define GLFW_NULL_SC_T 63#define GLFW_NULL_SC_U 64#define GLFW_NULL_SC_V 65#define GLFW_NULL_SC_W 66#define GLFW_NULL_SC_X 67#define GLFW_NULL_SC_Y 68#define GLFW_NULL_SC_Z 69#define GLFW_NULL_SC_F1 70#define GLFW_NULL_SC_F2 71#define GLFW_NULL_SC_F3 72#define GLFW_NULL_SC_F4 73#define GLFW_NULL_SC_F5 74#define GLFW_NULL_SC_F6 75#define GLFW_NULL_SC_F7 76#define GLFW_NULL_SC_F8 77#define GLFW_NULL_SC_F9 78#define GLFW_NULL_SC_F10 79#define GLFW_NULL_SC_F11 80#define GLFW_NULL_SC_F12 81#define GLFW_NULL_SC_F13 82#define GLFW_NULL_SC_F14 83#define GLFW_NULL_SC_F15 84#define GLFW_NULL_SC_F16 85#define GLFW_NULL_SC_F17 86#define GLFW_NULL_SC_F18 87#define GLFW_NULL_SC_F19 88#define GLFW_NULL_SC_F20 89#define GLFW_NULL_SC_F21 90#define GLFW_NULL_SC_F22 91#define GLFW_NULL_SC_F23 92#define GLFW_NULL_SC_F24 93#define GLFW_NULL_SC_F25 94#define GLFW_NULL_SC_KP_0 95#define GLFW_NULL_SC_KP_1 96#define GLFW_NULL_SC_KP_2 97#define GLFW_NULL_SC_KP_3 98#define GLFW_NULL_SC_KP_4 99#define GLFW_NULL_SC_KP_5 100#define GLFW_NULL_SC_KP_6 101#define GLFW_NULL_SC_KP_7 102#define GLFW_NULL_SC_KP_8 103#define GLFW_NULL_SC_KP_9 104#define GLFW_NULL_SC_KP_DECIMAL 105#define GLFW_NULL_SC_KP_DIVIDE 106#define GLFW_NULL_SC_KP_MULTIPLY 107#define GLFW_NULL_SC_KP_SUBTRACT 108#define GLFW_NULL_SC_KP_ADD 109#define GLFW_NULL_SC_KP_ENTER 110#define GLFW_NULL_SC_KP_EQUAL 111#define GLFW_NULL_SC_LEFT_SHIFT 112#define GLFW_NULL_SC_LEFT_CONTROL 113#define GLFW_NULL_SC_LEFT_ALT 114#define GLFW_NULL_SC_LEFT_SUPER 115#define GLFW_NULL_SC_RIGHT_SHIFT 116#define GLFW_NULL_SC_RIGHT_CONTROL 117#define GLFW_NULL_SC_RIGHT_ALT 118#define GLFW_NULL_SC_RIGHT_SUPER 119#define GLFW_NULL_SC_MENU 120#define GLFW_NULL_SC_LAST GLFW_NULL_SC_MENUtypedef VkFlags VkHeadlessSurfaceCreateFlagsEXT;typedef struct VkHeadlessSurfaceCreateInfoEXT{ VkStructureType sType; const void* pNext; VkHeadlessSurfaceCreateFlagsEXT flags;} VkHeadlessSurfaceCreateInfoEXT;typedef VkResult (APIENTRY *PFN_vkCreateHeadlessSurfaceEXT)(VkInstance,const VkHeadlessSurfaceCreateInfoEXT*,const VkAllocationCallbacks*,VkSurfaceKHR*);// Null-specific per-window data//typedef struct _GLFWwindowNull{ int xpos; int ypos; int width; int height; GLFWbool visible; GLFWbool iconified; GLFWbool maximized; GLFWbool resizable; GLFWbool decorated; GLFWbool floating; GLFWbool transparent; float opacity;} _GLFWwindowNull;// Null-specific per-monitor data//typedef struct _GLFWmonitorNull{ GLFWgammaramp ramp;} _GLFWmonitorNull;// Null-specific global data//typedef struct _GLFWlibraryNull{ int xcursor; int ycursor; char* clipboardString; _GLFWwindow* focusedWindow; uint16_t keycodes[GLFW_NULL_SC_LAST + 1]; uint8_t scancodes[GLFW_KEY_LAST + 1];} _GLFWlibraryNull;void _glfwPollMonitorsNull(void);GLFWbool _glfwConnectNull(int platformID, _GLFWplatform* platform);int _glfwInitNull(void);void _glfwTerminateNull(void);void _glfwFreeMonitorNull(_GLFWmonitor* monitor);void _glfwGetMonitorPosNull(_GLFWmonitor* monitor, int* xpos, int* ypos);void _glfwGetMonitorContentScaleNull(_GLFWmonitor* monitor, float* xscale, float* yscale);void _glfwGetMonitorWorkareaNull(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height);GLFWvidmode* _glfwGetVideoModesNull(_GLFWmonitor* monitor, int* found);GLFWbool _glfwGetVideoModeNull(_GLFWmonitor* monitor, GLFWvidmode* mode);GLFWbool _glfwGetGammaRampNull(_GLFWmonitor* monitor, GLFWgammaramp* ramp);void _glfwSetGammaRampNull(_GLFWmonitor* monitor, const GLFWgammaramp* ramp);GLFWbool _glfwCreateWindowNull(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig);void _glfwDestroyWindowNull(_GLFWwindow* window);void _glfwSetWindowTitleNull(_GLFWwindow* window, const char* title);void _glfwSetWindowIconNull(_GLFWwindow* window, int count, const GLFWimage* images);void _glfwSetWindowMonitorNull(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate);void _glfwGetWindowPosNull(_GLFWwindow* window, int* xpos, int* ypos);void _glfwSetWindowPosNull(_GLFWwindow* window, int xpos, int ypos);void _glfwGetWindowSizeNull(_GLFWwindow* window, int* width, int* height);void _glfwSetWindowSizeNull(_GLFWwindow* window, int width, int height);void _glfwSetWindowSizeLimitsNull(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);void _glfwSetWindowAspectRatioNull(_GLFWwindow* window, int n, int d);void _glfwGetFramebufferSizeNull(_GLFWwindow* window, int* width, int* height);void _glfwGetWindowFrameSizeNull(_GLFWwindow* window, int* left, int* top, int* right, int* bottom);void _glfwGetWindowContentScaleNull(_GLFWwindow* window, float* xscale, float* yscale);void _glfwIconifyWindowNull(_GLFWwindow* window);void _glfwRestoreWindowNull(_GLFWwindow* window);void _glfwMaximizeWindowNull(_GLFWwindow* window);GLFWbool _glfwWindowMaximizedNull(_GLFWwindow* window);GLFWbool _glfwWindowHoveredNull(_GLFWwindow* window);GLFWbool _glfwFramebufferTransparentNull(_GLFWwindow* window);void _glfwSetWindowResizableNull(_GLFWwindow* window, GLFWbool enabled);void _glfwSetWindowDecoratedNull(_GLFWwindow* window, GLFWbool enabled);void _glfwSetWindowFloatingNull(_GLFWwindow* window, GLFWbool enabled);void _glfwSetWindowMousePassthroughNull(_GLFWwindow* window, GLFWbool enabled);float _glfwGetWindowOpacityNull(_GLFWwindow* window);void _glfwSetWindowOpacityNull(_GLFWwindow* window, float opacity);void _glfwSetRawMouseMotionNull(_GLFWwindow *window, GLFWbool enabled);GLFWbool _glfwRawMouseMotionSupportedNull(void);void _glfwShowWindowNull(_GLFWwindow* window);void _glfwRequestWindowAttentionNull(_GLFWwindow* window);void _glfwHideWindowNull(_GLFWwindow* window);void _glfwFocusWindowNull(_GLFWwindow* window);GLFWbool _glfwWindowFocusedNull(_GLFWwindow* window);GLFWbool _glfwWindowIconifiedNull(_GLFWwindow* window);GLFWbool _glfwWindowVisibleNull(_GLFWwindow* window);void _glfwPollEventsNull(void);void _glfwWaitEventsNull(void);void _glfwWaitEventsTimeoutNull(double timeout);void _glfwPostEmptyEventNull(void);void _glfwGetCursorPosNull(_GLFWwindow* window, double* xpos, double* ypos);void _glfwSetCursorPosNull(_GLFWwindow* window, double x, double y);void _glfwSetCursorModeNull(_GLFWwindow* window, int mode);GLFWbool _glfwCreateCursorNull(_GLFWcursor* cursor, const GLFWimage* image, int xhot, int yhot);GLFWbool _glfwCreateStandardCursorNull(_GLFWcursor* cursor, int shape);void _glfwDestroyCursorNull(_GLFWcursor* cursor);void _glfwSetCursorNull(_GLFWwindow* window, _GLFWcursor* cursor);void _glfwSetClipboardStringNull(const char* string);const char* _glfwGetClipboardStringNull(void);const char* _glfwGetScancodeNameNull(int scancode);int _glfwGetKeyScancodeNull(int key);EGLenum _glfwGetEGLPlatformNull(EGLint** attribs);EGLNativeDisplayType _glfwGetEGLNativeDisplayNull(void);EGLNativeWindowType _glfwGetEGLNativeWindowNull(_GLFWwindow* window);void _glfwGetRequiredInstanceExtensionsNull(char** extensions);GLFWbool _glfwGetPhysicalDevicePresentationSupportNull(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily);VkResult _glfwCreateWindowSurfaceNull(VkInstance instance, _GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface);void _glfwPollMonitorsNull(void);vendor/glfw/src/null_window.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2016 Google Inc.// Copyright (c) 2016-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <stdlib.h>#include <string.h>static void applySizeLimits(_GLFWwindow* window, int* width, int* height){ if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE) { const float ratio = (float) window->numer / (float) window->denom; *height = (int) (*width / ratio); } if (window->minwidth != GLFW_DONT_CARE) *width = _glfw_max(*width, window->minwidth); else if (window->maxwidth != GLFW_DONT_CARE) *width = _glfw_min(*width, window->maxwidth); if (window->minheight != GLFW_DONT_CARE) *height = _glfw_min(*height, window->minheight); else if (window->maxheight != GLFW_DONT_CARE) *height = _glfw_max(*height, window->maxheight);}static void fitToMonitor(_GLFWwindow* window){ GLFWvidmode mode; _glfwGetVideoModeNull(window->monitor, &mode); _glfwGetMonitorPosNull(window->monitor, &window->null.xpos, &window->null.ypos); window->null.width = mode.width; window->null.height = mode.height;}static void acquireMonitor(_GLFWwindow* window){ _glfwInputMonitorWindow(window->monitor, window);}static void releaseMonitor(_GLFWwindow* window){ if (window->monitor->window != window) return; _glfwInputMonitorWindow(window->monitor, NULL);}static int createNativeWindow(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWfbconfig* fbconfig){ if (window->monitor) fitToMonitor(window); else { if (wndconfig->xpos == GLFW_ANY_POSITION && wndconfig->ypos == GLFW_ANY_POSITION) { window->null.xpos = 17; window->null.ypos = 17; } else { window->null.xpos = wndconfig->xpos; window->null.ypos = wndconfig->ypos; } window->null.width = wndconfig->width; window->null.height = wndconfig->height; } window->null.visible = wndconfig->visible; window->null.decorated = wndconfig->decorated; window->null.maximized = wndconfig->maximized; window->null.floating = wndconfig->floating; window->null.transparent = fbconfig->transparent; window->null.opacity = 1.f; return GLFW_TRUE;}//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwCreateWindowNull(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig){ if (!createNativeWindow(window, wndconfig, fbconfig)) return GLFW_FALSE; if (ctxconfig->client != GLFW_NO_API) { if (ctxconfig->source == GLFW_NATIVE_CONTEXT_API || ctxconfig->source == GLFW_OSMESA_CONTEXT_API) { if (!_glfwInitOSMesa()) return GLFW_FALSE; if (!_glfwCreateContextOSMesa(window, ctxconfig, fbconfig)) return GLFW_FALSE; } else if (ctxconfig->source == GLFW_EGL_CONTEXT_API) { if (!_glfwInitEGL()) return GLFW_FALSE; if (!_glfwCreateContextEGL(window, ctxconfig, fbconfig)) return GLFW_FALSE; } if (!_glfwRefreshContextAttribs(window, ctxconfig)) return GLFW_FALSE; } if (wndconfig->mousePassthrough) _glfwSetWindowMousePassthroughNull(window, GLFW_TRUE); if (window->monitor) { _glfwShowWindowNull(window); _glfwFocusWindowNull(window); acquireMonitor(window); if (wndconfig->centerCursor) _glfwCenterCursorInContentArea(window); } else { if (wndconfig->visible) { _glfwShowWindowNull(window); if (wndconfig->focused) _glfwFocusWindowNull(window); } } return GLFW_TRUE;}void _glfwDestroyWindowNull(_GLFWwindow* window){ if (window->monitor) releaseMonitor(window); if (_glfw.null.focusedWindow == window) _glfw.null.focusedWindow = NULL; if (window->context.destroy) window->context.destroy(window);}void _glfwSetWindowTitleNull(_GLFWwindow* window, const char* title){}void _glfwSetWindowIconNull(_GLFWwindow* window, int count, const GLFWimage* images){}void _glfwSetWindowMonitorNull(_GLFWwindow* window, _GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate){ if (window->monitor == monitor) { if (!monitor) { _glfwSetWindowPosNull(window, xpos, ypos); _glfwSetWindowSizeNull(window, width, height); } return; } if (window->monitor) releaseMonitor(window); _glfwInputWindowMonitor(window, monitor); if (window->monitor) { window->null.visible = GLFW_TRUE; acquireMonitor(window); fitToMonitor(window); } else { _glfwSetWindowPosNull(window, xpos, ypos); _glfwSetWindowSizeNull(window, width, height); }}void _glfwGetWindowPosNull(_GLFWwindow* window, int* xpos, int* ypos){ if (xpos) *xpos = window->null.xpos; if (ypos) *ypos = window->null.ypos;}void _glfwSetWindowPosNull(_GLFWwindow* window, int xpos, int ypos){ if (window->monitor) return; if (window->null.xpos != xpos || window->null.ypos != ypos) { window->null.xpos = xpos; window->null.ypos = ypos; _glfwInputWindowPos(window, xpos, ypos); }}void _glfwGetWindowSizeNull(_GLFWwindow* window, int* width, int* height){ if (width) *width = window->null.width; if (height) *height = window->null.height;}void _glfwSetWindowSizeNull(_GLFWwindow* window, int width, int height){ if (window->monitor) return; if (window->null.width != width || window->null.height != height) { window->null.width = width; window->null.height = height; _glfwInputFramebufferSize(window, width, height); _glfwInputWindowDamage(window); _glfwInputWindowSize(window, width, height); }}void _glfwSetWindowSizeLimitsNull(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight){ int width = window->null.width; int height = window->null.height; applySizeLimits(window, &width, &height); _glfwSetWindowSizeNull(window, width, height);}void _glfwSetWindowAspectRatioNull(_GLFWwindow* window, int n, int d){ int width = window->null.width; int height = window->null.height; applySizeLimits(window, &width, &height); _glfwSetWindowSizeNull(window, width, height);}void _glfwGetFramebufferSizeNull(_GLFWwindow* window, int* width, int* height){ if (width) *width = window->null.width; if (height) *height = window->null.height;}void _glfwGetWindowFrameSizeNull(_GLFWwindow* window, int* left, int* top, int* right, int* bottom){ if (window->null.decorated && !window->monitor) { if (left) *left = 1; if (top) *top = 10; if (right) *right = 1; if (bottom) *bottom = 1; } else { if (left) *left = 0; if (top) *top = 0; if (right) *right = 0; if (bottom) *bottom = 0; }}void _glfwGetWindowContentScaleNull(_GLFWwindow* window, float* xscale, float* yscale){ if (xscale) *xscale = 1.f; if (yscale) *yscale = 1.f;}void _glfwIconifyWindowNull(_GLFWwindow* window){ if (_glfw.null.focusedWindow == window) { _glfw.null.focusedWindow = NULL; _glfwInputWindowFocus(window, GLFW_FALSE); } if (!window->null.iconified) { window->null.iconified = GLFW_TRUE; _glfwInputWindowIconify(window, GLFW_TRUE); if (window->monitor) releaseMonitor(window); }}void _glfwRestoreWindowNull(_GLFWwindow* window){ if (window->null.iconified) { window->null.iconified = GLFW_FALSE; _glfwInputWindowIconify(window, GLFW_FALSE); if (window->monitor) acquireMonitor(window); } else if (window->null.maximized) { window->null.maximized = GLFW_FALSE; _glfwInputWindowMaximize(window, GLFW_FALSE); }}void _glfwMaximizeWindowNull(_GLFWwindow* window){ if (!window->null.maximized) { window->null.maximized = GLFW_TRUE; _glfwInputWindowMaximize(window, GLFW_TRUE); }}GLFWbool _glfwWindowMaximizedNull(_GLFWwindow* window){ return window->null.maximized;}GLFWbool _glfwWindowHoveredNull(_GLFWwindow* window){ return _glfw.null.xcursor >= window->null.xpos && _glfw.null.ycursor >= window->null.ypos && _glfw.null.xcursor <= window->null.xpos + window->null.width - 1 && _glfw.null.ycursor <= window->null.ypos + window->null.height - 1;}GLFWbool _glfwFramebufferTransparentNull(_GLFWwindow* window){ return window->null.transparent;}void _glfwSetWindowResizableNull(_GLFWwindow* window, GLFWbool enabled){ window->null.resizable = enabled;}void _glfwSetWindowDecoratedNull(_GLFWwindow* window, GLFWbool enabled){ window->null.decorated = enabled;}void _glfwSetWindowFloatingNull(_GLFWwindow* window, GLFWbool enabled){ window->null.floating = enabled;}void _glfwSetWindowMousePassthroughNull(_GLFWwindow* window, GLFWbool enabled){}float _glfwGetWindowOpacityNull(_GLFWwindow* window){ return window->null.opacity;}void _glfwSetWindowOpacityNull(_GLFWwindow* window, float opacity){ window->null.opacity = opacity;}void _glfwSetRawMouseMotionNull(_GLFWwindow *window, GLFWbool enabled){}GLFWbool _glfwRawMouseMotionSupportedNull(void){ return GLFW_TRUE;}void _glfwShowWindowNull(_GLFWwindow* window){ window->null.visible = GLFW_TRUE;}void _glfwRequestWindowAttentionNull(_GLFWwindow* window){}void _glfwHideWindowNull(_GLFWwindow* window){ if (_glfw.null.focusedWindow == window) { _glfw.null.focusedWindow = NULL; _glfwInputWindowFocus(window, GLFW_FALSE); } window->null.visible = GLFW_FALSE;}void _glfwFocusWindowNull(_GLFWwindow* window){ _GLFWwindow* previous; if (_glfw.null.focusedWindow == window) return; if (!window->null.visible) return; previous = _glfw.null.focusedWindow; _glfw.null.focusedWindow = window; if (previous) { _glfwInputWindowFocus(previous, GLFW_FALSE); if (previous->monitor && previous->autoIconify) _glfwIconifyWindowNull(previous); } _glfwInputWindowFocus(window, GLFW_TRUE);}GLFWbool _glfwWindowFocusedNull(_GLFWwindow* window){ return _glfw.null.focusedWindow == window;}GLFWbool _glfwWindowIconifiedNull(_GLFWwindow* window){ return window->null.iconified;}GLFWbool _glfwWindowVisibleNull(_GLFWwindow* window){ return window->null.visible;}void _glfwPollEventsNull(void){}void _glfwWaitEventsNull(void){}void _glfwWaitEventsTimeoutNull(double timeout){}Showing the first 500 of 750 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/osmesa_context.cadded
//========================================================================// GLFW 3.5 OSMesa - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2016 Google Inc.// Copyright (c) 2016-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <stdlib.h>#include <string.h>#include <assert.h>static void makeContextCurrentOSMesa(_GLFWwindow* window){ if (window) { int width, height; _glfw.platform.getFramebufferSize(window, &width, &height); // Check to see if we need to allocate a new buffer if ((window->context.osmesa.buffer == NULL) || (width != window->context.osmesa.width) || (height != window->context.osmesa.height)) { _glfw_free(window->context.osmesa.buffer); // Allocate the new buffer (width * height * 8-bit RGBA) window->context.osmesa.buffer = _glfw_calloc(4, (size_t) width * height); window->context.osmesa.width = width; window->context.osmesa.height = height; } if (!OSMesaMakeCurrent(window->context.osmesa.handle, window->context.osmesa.buffer, GL_UNSIGNED_BYTE, width, height)) { _glfwInputError(GLFW_PLATFORM_ERROR, "OSMesa: Failed to make context current"); return; } } _glfwPlatformSetTls(&_glfw.contextSlot, window);}static GLFWglproc getProcAddressOSMesa(const char* procname){ return (GLFWglproc) OSMesaGetProcAddress(procname);}static void destroyContextOSMesa(_GLFWwindow* window){ if (window->context.osmesa.handle) { OSMesaDestroyContext(window->context.osmesa.handle); window->context.osmesa.handle = NULL; } if (window->context.osmesa.buffer) { _glfw_free(window->context.osmesa.buffer); window->context.osmesa.width = 0; window->context.osmesa.height = 0; }}static void swapBuffersOSMesa(_GLFWwindow* window){ // No double buffering on OSMesa}static void swapIntervalOSMesa(int interval){ // No swap interval on OSMesa}static int extensionSupportedOSMesa(const char* extension){ // OSMesa does not have extensions return GLFW_FALSE;}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwInitOSMesa(void){ int i; const char* sonames[] = {#if defined(_GLFW_OSMESA_LIBRARY) _GLFW_OSMESA_LIBRARY,#elif defined(_WIN32) "libOSMesa.dll", "OSMesa.dll",#elif defined(__APPLE__) "libOSMesa.8.dylib",#elif defined(__CYGWIN__) "libOSMesa-8.so",#elif defined(__OpenBSD__) || defined(__NetBSD__) "libOSMesa.so",#else "libOSMesa.so.8", "libOSMesa.so.6",#endif NULL }; if (_glfw.osmesa.handle) return GLFW_TRUE; for (i = 0; sonames[i]; i++) { _glfw.osmesa.handle = _glfwPlatformLoadModule(sonames[i]); if (_glfw.osmesa.handle) break; } if (!_glfw.osmesa.handle) { _glfwInputError(GLFW_API_UNAVAILABLE, "OSMesa: Library not found"); return GLFW_FALSE; } _glfw.osmesa.CreateContextExt = (PFN_OSMesaCreateContextExt) _glfwPlatformGetModuleSymbol(_glfw.osmesa.handle, "OSMesaCreateContextExt"); _glfw.osmesa.CreateContextAttribs = (PFN_OSMesaCreateContextAttribs) _glfwPlatformGetModuleSymbol(_glfw.osmesa.handle, "OSMesaCreateContextAttribs"); _glfw.osmesa.DestroyContext = (PFN_OSMesaDestroyContext) _glfwPlatformGetModuleSymbol(_glfw.osmesa.handle, "OSMesaDestroyContext"); _glfw.osmesa.MakeCurrent = (PFN_OSMesaMakeCurrent) _glfwPlatformGetModuleSymbol(_glfw.osmesa.handle, "OSMesaMakeCurrent"); _glfw.osmesa.GetColorBuffer = (PFN_OSMesaGetColorBuffer) _glfwPlatformGetModuleSymbol(_glfw.osmesa.handle, "OSMesaGetColorBuffer"); _glfw.osmesa.GetDepthBuffer = (PFN_OSMesaGetDepthBuffer) _glfwPlatformGetModuleSymbol(_glfw.osmesa.handle, "OSMesaGetDepthBuffer"); _glfw.osmesa.GetProcAddress = (PFN_OSMesaGetProcAddress) _glfwPlatformGetModuleSymbol(_glfw.osmesa.handle, "OSMesaGetProcAddress"); if (!_glfw.osmesa.CreateContextExt || !_glfw.osmesa.DestroyContext || !_glfw.osmesa.MakeCurrent || !_glfw.osmesa.GetColorBuffer || !_glfw.osmesa.GetDepthBuffer || !_glfw.osmesa.GetProcAddress) { _glfwInputError(GLFW_PLATFORM_ERROR, "OSMesa: Failed to load required entry points"); _glfwTerminateOSMesa(); return GLFW_FALSE; } return GLFW_TRUE;}void _glfwTerminateOSMesa(void){ _glfwPlatformFreeModule(_glfw.osmesa.handle); _glfw.osmesa.handle = NULL;}#define SET_ATTRIB(a, v) \{ \ assert(((size_t) index + 1) < sizeof(attribs) / sizeof(attribs[0])); \ attribs[index++] = a; \ attribs[index++] = v; \}GLFWbool _glfwCreateContextOSMesa(_GLFWwindow* window, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig){ OSMesaContext share = NULL; const int accumBits = fbconfig->accumRedBits + fbconfig->accumGreenBits + fbconfig->accumBlueBits + fbconfig->accumAlphaBits; if (ctxconfig->client == GLFW_OPENGL_ES_API) { _glfwInputError(GLFW_API_UNAVAILABLE, "OSMesa: OpenGL ES is not available on OSMesa"); return GLFW_FALSE; } if (ctxconfig->share) share = ctxconfig->share->context.osmesa.handle; if (OSMesaCreateContextAttribs) { int index = 0, attribs[40]; SET_ATTRIB(OSMESA_FORMAT, OSMESA_RGBA); SET_ATTRIB(OSMESA_DEPTH_BITS, fbconfig->depthBits); SET_ATTRIB(OSMESA_STENCIL_BITS, fbconfig->stencilBits); SET_ATTRIB(OSMESA_ACCUM_BITS, accumBits); if (ctxconfig->profile == GLFW_OPENGL_CORE_PROFILE) { SET_ATTRIB(OSMESA_PROFILE, OSMESA_CORE_PROFILE); } else if (ctxconfig->profile == GLFW_OPENGL_COMPAT_PROFILE) { SET_ATTRIB(OSMESA_PROFILE, OSMESA_COMPAT_PROFILE); } if (ctxconfig->major != 1 || ctxconfig->minor != 0) { SET_ATTRIB(OSMESA_CONTEXT_MAJOR_VERSION, ctxconfig->major); SET_ATTRIB(OSMESA_CONTEXT_MINOR_VERSION, ctxconfig->minor); } if (ctxconfig->forward) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "OSMesa: Forward-compatible contexts not supported"); return GLFW_FALSE; } SET_ATTRIB(0, 0); window->context.osmesa.handle = OSMesaCreateContextAttribs(attribs, share); } else { if (ctxconfig->profile) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "OSMesa: OpenGL profiles unavailable"); return GLFW_FALSE; } window->context.osmesa.handle = OSMesaCreateContextExt(OSMESA_RGBA, fbconfig->depthBits, fbconfig->stencilBits, accumBits, share); } if (window->context.osmesa.handle == NULL) { _glfwInputError(GLFW_VERSION_UNAVAILABLE, "OSMesa: Failed to create context"); return GLFW_FALSE; } window->context.makeCurrent = makeContextCurrentOSMesa; window->context.swapBuffers = swapBuffersOSMesa; window->context.swapInterval = swapIntervalOSMesa; window->context.extensionSupported = extensionSupportedOSMesa; window->context.getProcAddress = getProcAddressOSMesa; window->context.destroy = destroyContextOSMesa; return GLFW_TRUE;}#undef SET_ATTRIB//////////////////////////////////////////////////////////////////////////////// GLFW native API ////////////////////////////////////////////////////////////////////////////////GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* handle, int* width, int* height, int* format, void** buffer){ void* mesaBuffer; GLint mesaWidth, mesaHeight, mesaFormat; _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE); _GLFWwindow* window = (_GLFWwindow*) handle; assert(window != NULL); if (window->context.source != GLFW_OSMESA_CONTEXT_API) { _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL); return GLFW_FALSE; } if (!OSMesaGetColorBuffer(window->context.osmesa.handle, &mesaWidth, &mesaHeight, &mesaFormat, &mesaBuffer)) { _glfwInputError(GLFW_PLATFORM_ERROR, "OSMesa: Failed to retrieve color buffer"); return GLFW_FALSE; } if (width) *width = mesaWidth; if (height) *height = mesaHeight; if (format) *format = mesaFormat; if (buffer) *buffer = mesaBuffer; return GLFW_TRUE;}GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* handle, int* width, int* height, int* bytesPerValue, void** buffer){ void* mesaBuffer; GLint mesaWidth, mesaHeight, mesaBytes; _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE); _GLFWwindow* window = (_GLFWwindow*) handle; assert(window != NULL); if (window->context.source != GLFW_OSMESA_CONTEXT_API) { _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL); return GLFW_FALSE; } if (!OSMesaGetDepthBuffer(window->context.osmesa.handle, &mesaWidth, &mesaHeight, &mesaBytes, &mesaBuffer)) { _glfwInputError(GLFW_PLATFORM_ERROR, "OSMesa: Failed to retrieve depth buffer"); return GLFW_FALSE; } if (width) *width = mesaWidth; if (height) *height = mesaHeight; if (bytesPerValue) *bytesPerValue = mesaBytes; if (buffer) *buffer = mesaBuffer; return GLFW_TRUE;}GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* handle){ _GLFW_REQUIRE_INIT_OR_RETURN(NULL); _GLFWwindow* window = (_GLFWwindow*) handle; assert(window != NULL); if (window->context.source != GLFW_OSMESA_CONTEXT_API) { _glfwInputError(GLFW_NO_WINDOW_CONTEXT, NULL); return NULL; } return window->context.osmesa.handle;}vendor/glfw/src/platform.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <string.h>#include <stdlib.h>// These construct a string literal from individual numeric constants#define _GLFW_CONCAT_VERSION(m, n, r) #m "." #n "." #r#define _GLFW_MAKE_VERSION(m, n, r) _GLFW_CONCAT_VERSION(m, n, r)//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////static const struct{ int ID; GLFWbool (*connect)(int,_GLFWplatform*);} supportedPlatforms[] ={#if defined(_GLFW_WIN32) { GLFW_PLATFORM_WIN32, _glfwConnectWin32 },#endif#if defined(_GLFW_COCOA) { GLFW_PLATFORM_COCOA, _glfwConnectCocoa },#endif#if defined(_GLFW_WAYLAND) { GLFW_PLATFORM_WAYLAND, _glfwConnectWayland },#endif#if defined(_GLFW_X11) { GLFW_PLATFORM_X11, _glfwConnectX11 },#endif};GLFWbool _glfwSelectPlatform(int desiredID, _GLFWplatform* platform){ const size_t count = sizeof(supportedPlatforms) / sizeof(supportedPlatforms[0]); size_t i; if (desiredID != GLFW_ANY_PLATFORM && desiredID != GLFW_PLATFORM_WIN32 && desiredID != GLFW_PLATFORM_COCOA && desiredID != GLFW_PLATFORM_WAYLAND && desiredID != GLFW_PLATFORM_X11 && desiredID != GLFW_PLATFORM_NULL) { _glfwInputError(GLFW_INVALID_ENUM, "Invalid platform ID 0x%08X", desiredID); return GLFW_FALSE; } // Only allow the Null platform if specifically requested if (desiredID == GLFW_PLATFORM_NULL) return _glfwConnectNull(desiredID, platform); else if (count == 0) { _glfwInputError(GLFW_PLATFORM_UNAVAILABLE, "This binary only supports the Null platform"); return GLFW_FALSE; }#if defined(_GLFW_WAYLAND) && defined(_GLFW_X11) if (desiredID == GLFW_ANY_PLATFORM) { const char* const session = getenv("XDG_SESSION_TYPE"); if (session) { // Only follow XDG_SESSION_TYPE if it is set correctly and the // environment looks plausble; otherwise fall back to detection if (strcmp(session, "wayland") == 0 && getenv("WAYLAND_DISPLAY")) desiredID = GLFW_PLATFORM_WAYLAND; else if (strcmp(session, "x11") == 0 && getenv("DISPLAY")) desiredID = GLFW_PLATFORM_X11; } }#endif if (desiredID == GLFW_ANY_PLATFORM) { // If there is exactly one platform available for auto-selection, let it emit the // error on failure as the platform-specific error description may be more helpful if (count == 1) return supportedPlatforms[0].connect(supportedPlatforms[0].ID, platform); for (i = 0; i < count; i++) { if (supportedPlatforms[i].connect(desiredID, platform)) return GLFW_TRUE; } _glfwInputError(GLFW_PLATFORM_UNAVAILABLE, "Failed to detect any supported platform"); } else { for (i = 0; i < count; i++) { if (supportedPlatforms[i].ID == desiredID) return supportedPlatforms[i].connect(desiredID, platform); } _glfwInputError(GLFW_PLATFORM_UNAVAILABLE, "The requested platform is not supported"); } return GLFW_FALSE;}//////////////////////////////////////////////////////////////////////////////// GLFW public API ////////////////////////////////////////////////////////////////////////////////GLFWAPI int glfwGetPlatform(void){ _GLFW_REQUIRE_INIT_OR_RETURN(0); return _glfw.platform.platformID;}GLFWAPI int glfwPlatformSupported(int platformID){ const size_t count = sizeof(supportedPlatforms) / sizeof(supportedPlatforms[0]); size_t i; if (platformID != GLFW_PLATFORM_WIN32 && platformID != GLFW_PLATFORM_COCOA && platformID != GLFW_PLATFORM_WAYLAND && platformID != GLFW_PLATFORM_X11 && platformID != GLFW_PLATFORM_NULL) { _glfwInputError(GLFW_INVALID_ENUM, "Invalid platform ID 0x%08X", platformID); return GLFW_FALSE; } if (platformID == GLFW_PLATFORM_NULL) return GLFW_TRUE; for (i = 0; i < count; i++) { if (platformID == supportedPlatforms[i].ID) return GLFW_TRUE; } return GLFW_FALSE;}GLFWAPI const char* glfwGetVersionString(void){ return _GLFW_MAKE_VERSION(GLFW_VERSION_MAJOR, GLFW_VERSION_MINOR, GLFW_VERSION_REVISION)#if defined(_GLFW_WIN32) " Win32 WGL"#endif#if defined(_GLFW_COCOA) " Cocoa NSGL"#endif#if defined(_GLFW_WAYLAND) " Wayland"#endif#if defined(_GLFW_X11) " X11 GLX"#endif " Null" " EGL" " OSMesa"#if defined(__MINGW64_VERSION_MAJOR) " MinGW-w64"#elif defined(_MSC_VER) " VisualC"#endif#if defined(_GLFW_USE_HYBRID_HPG) || defined(_GLFW_USE_OPTIMUS_HPG) " hybrid-GPU"#endif#if defined(_POSIX_MONOTONIC_CLOCK) " monotonic"#endif#if defined(_GLFW_BUILD_DLL)#if defined(_WIN32) " DLL"#elif defined(__APPLE__) " dynamic"#else " shared"#endif#endif ;}vendor/glfw/src/platform.hadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#if defined(GLFW_BUILD_WIN32_TIMER) || \ defined(GLFW_BUILD_WIN32_MODULE) || \ defined(GLFW_BUILD_WIN32_THREAD) || \ defined(GLFW_BUILD_MACOS_TIMER) || \ defined(GLFW_BUILD_POSIX_TIMER) || \ defined(GLFW_BUILD_POSIX_MODULE) || \ defined(GLFW_BUILD_POSIX_THREAD) || \ defined(GLFW_BUILD_POSIX_POLL) || \ defined(GLFW_BUILD_LINUX_JOYSTICK) #error "You must not define these; define zero or more _GLFW_<platform> macros instead"#endif#include "null_platform.h"#define GLFW_EXPOSE_NATIVE_EGL#define GLFW_EXPOSE_NATIVE_OSMESA#if defined(_GLFW_WIN32) #include "win32_platform.h" #define GLFW_EXPOSE_NATIVE_WIN32 #define GLFW_EXPOSE_NATIVE_WGL#else #define GLFW_WIN32_WINDOW_STATE #define GLFW_WIN32_MONITOR_STATE #define GLFW_WIN32_CURSOR_STATE #define GLFW_WIN32_LIBRARY_WINDOW_STATE #define GLFW_WGL_CONTEXT_STATE #define GLFW_WGL_LIBRARY_CONTEXT_STATE#endif#if defined(_GLFW_COCOA) #include "cocoa_platform.h" #define GLFW_EXPOSE_NATIVE_COCOA #define GLFW_EXPOSE_NATIVE_NSGL#else #define GLFW_COCOA_WINDOW_STATE #define GLFW_COCOA_MONITOR_STATE #define GLFW_COCOA_CURSOR_STATE #define GLFW_COCOA_LIBRARY_WINDOW_STATE #define GLFW_NSGL_CONTEXT_STATE #define GLFW_NSGL_LIBRARY_CONTEXT_STATE#endif#if defined(_GLFW_WAYLAND) #include "wl_platform.h" #define GLFW_EXPOSE_NATIVE_WAYLAND#else #define GLFW_WAYLAND_WINDOW_STATE #define GLFW_WAYLAND_MONITOR_STATE #define GLFW_WAYLAND_CURSOR_STATE #define GLFW_WAYLAND_LIBRARY_WINDOW_STATE#endif#if defined(_GLFW_X11) #include "x11_platform.h" #define GLFW_EXPOSE_NATIVE_X11 #define GLFW_EXPOSE_NATIVE_GLX#else #define GLFW_X11_WINDOW_STATE #define GLFW_X11_MONITOR_STATE #define GLFW_X11_CURSOR_STATE #define GLFW_X11_LIBRARY_WINDOW_STATE #define GLFW_GLX_CONTEXT_STATE #define GLFW_GLX_LIBRARY_CONTEXT_STATE#endif#include "null_joystick.h"#if defined(_GLFW_WIN32) #include "win32_joystick.h"#else #define GLFW_WIN32_JOYSTICK_STATE #define GLFW_WIN32_LIBRARY_JOYSTICK_STATE#endif#if defined(_GLFW_COCOA) #include "cocoa_joystick.h"#else #define GLFW_COCOA_JOYSTICK_STATE #define GLFW_COCOA_LIBRARY_JOYSTICK_STATE#endif#if (defined(_GLFW_X11) || defined(_GLFW_WAYLAND)) && defined(__linux__) #define GLFW_BUILD_LINUX_JOYSTICK#endif#if defined(GLFW_BUILD_LINUX_JOYSTICK) #include "linux_joystick.h"#else #define GLFW_LINUX_JOYSTICK_STATE #define GLFW_LINUX_LIBRARY_JOYSTICK_STATE#endif#define GLFW_PLATFORM_WINDOW_STATE \ GLFW_WIN32_WINDOW_STATE \ GLFW_COCOA_WINDOW_STATE \ GLFW_WAYLAND_WINDOW_STATE \ GLFW_X11_WINDOW_STATE \ GLFW_NULL_WINDOW_STATE \#define GLFW_PLATFORM_MONITOR_STATE \ GLFW_WIN32_MONITOR_STATE \ GLFW_COCOA_MONITOR_STATE \ GLFW_WAYLAND_MONITOR_STATE \ GLFW_X11_MONITOR_STATE \ GLFW_NULL_MONITOR_STATE \#define GLFW_PLATFORM_CURSOR_STATE \ GLFW_WIN32_CURSOR_STATE \ GLFW_COCOA_CURSOR_STATE \ GLFW_WAYLAND_CURSOR_STATE \ GLFW_X11_CURSOR_STATE \ GLFW_NULL_CURSOR_STATE \#define GLFW_PLATFORM_JOYSTICK_STATE \ GLFW_WIN32_JOYSTICK_STATE \ GLFW_COCOA_JOYSTICK_STATE \ GLFW_LINUX_JOYSTICK_STATE#define GLFW_PLATFORM_LIBRARY_WINDOW_STATE \ GLFW_WIN32_LIBRARY_WINDOW_STATE \ GLFW_COCOA_LIBRARY_WINDOW_STATE \ GLFW_WAYLAND_LIBRARY_WINDOW_STATE \ GLFW_X11_LIBRARY_WINDOW_STATE \ GLFW_NULL_LIBRARY_WINDOW_STATE \#define GLFW_PLATFORM_LIBRARY_JOYSTICK_STATE \ GLFW_WIN32_LIBRARY_JOYSTICK_STATE \ GLFW_COCOA_LIBRARY_JOYSTICK_STATE \ GLFW_LINUX_LIBRARY_JOYSTICK_STATE#define GLFW_PLATFORM_CONTEXT_STATE \ GLFW_WGL_CONTEXT_STATE \ GLFW_NSGL_CONTEXT_STATE \ GLFW_GLX_CONTEXT_STATE#define GLFW_PLATFORM_LIBRARY_CONTEXT_STATE \ GLFW_WGL_LIBRARY_CONTEXT_STATE \ GLFW_NSGL_LIBRARY_CONTEXT_STATE \ GLFW_GLX_LIBRARY_CONTEXT_STATE#if defined(_WIN32) #define GLFW_BUILD_WIN32_THREAD#else #define GLFW_BUILD_POSIX_THREAD#endif#if defined(GLFW_BUILD_WIN32_THREAD) #include "win32_thread.h" #define GLFW_PLATFORM_TLS_STATE GLFW_WIN32_TLS_STATE #define GLFW_PLATFORM_MUTEX_STATE GLFW_WIN32_MUTEX_STATE#elif defined(GLFW_BUILD_POSIX_THREAD) #include "posix_thread.h" #define GLFW_PLATFORM_TLS_STATE GLFW_POSIX_TLS_STATE #define GLFW_PLATFORM_MUTEX_STATE GLFW_POSIX_MUTEX_STATE#endif#if defined(_WIN32) #define GLFW_BUILD_WIN32_TIMER#elif defined(__APPLE__) #define GLFW_BUILD_MACOS_TIMER#else #define GLFW_BUILD_POSIX_TIMER#endif#if defined(GLFW_BUILD_WIN32_TIMER) #include "win32_time.h" #define GLFW_PLATFORM_LIBRARY_TIMER_STATE GLFW_WIN32_LIBRARY_TIMER_STATE#elif defined(GLFW_BUILD_MACOS_TIMER) #include "macos_time.h" #define GLFW_PLATFORM_LIBRARY_TIMER_STATE GLFW_MACOS_LIBRARY_TIMER_STATE#elif defined(GLFW_BUILD_POSIX_TIMER) #include "posix_time.h" #define GLFW_PLATFORM_LIBRARY_TIMER_STATE GLFW_POSIX_LIBRARY_TIMER_STATE#endif#if defined(_WIN32) #define GLFW_BUILD_WIN32_MODULE#else #define GLFW_BUILD_POSIX_MODULE#endif#if defined(_GLFW_WAYLAND) || defined(_GLFW_X11) #include "posix_poll.h" #define GLFW_BUILD_POSIX_POLL#endifvendor/glfw/src/posix_module.cadded
//========================================================================// GLFW 3.5 POSIX - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2021 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(GLFW_BUILD_POSIX_MODULE)#include <dlfcn.h>//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void* _glfwPlatformLoadModule(const char* path){ return dlopen(path, RTLD_LAZY | RTLD_LOCAL);}void _glfwPlatformFreeModule(void* module){ if (module) dlclose(module);}GLFWproc _glfwPlatformGetModuleSymbol(void* module, const char* name){ return dlsym(module, name);}#endif // GLFW_BUILD_POSIX_MODULEvendor/glfw/src/posix_poll.cadded
//========================================================================// GLFW 3.5 POSIX - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2022 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#define _GNU_SOURCE#include "internal.h"#if defined(GLFW_BUILD_POSIX_POLL)#include <signal.h>#include <time.h>#include <errno.h>GLFWbool _glfwPollPOSIX(struct pollfd* fds, nfds_t count, double* timeout){ for (;;) { if (timeout) { const uint64_t base = _glfwPlatformGetTimerValue();#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__CYGWIN__) const time_t seconds = (time_t) *timeout; const long nanoseconds = (long) ((*timeout - seconds) * 1e9); const struct timespec ts = { seconds, nanoseconds }; const int result = ppoll(fds, count, &ts, NULL);#elif defined(__NetBSD__) const time_t seconds = (time_t) *timeout; const long nanoseconds = (long) ((*timeout - seconds) * 1e9); const struct timespec ts = { seconds, nanoseconds }; const int result = pollts(fds, count, &ts, NULL);#else const int milliseconds = (int) (*timeout * 1e3); const int result = poll(fds, count, milliseconds);#endif const int error = errno; // clock_gettime may overwrite our error *timeout -= (_glfwPlatformGetTimerValue() - base) / (double) _glfwPlatformGetTimerFrequency(); if (result > 0) return GLFW_TRUE; else if (result == -1 && error != EINTR && error != EAGAIN) return GLFW_FALSE; else if (*timeout <= 0.0) return GLFW_FALSE; } else { const int result = poll(fds, count, -1); if (result > 0) return GLFW_TRUE; else if (result == -1 && errno != EINTR && errno != EAGAIN) return GLFW_FALSE; } }}#endif // GLFW_BUILD_POSIX_POLLvendor/glfw/src/posix_poll.hadded
//========================================================================// GLFW 3.5 POSIX - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2022 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include <poll.h>GLFWbool _glfwPollPOSIX(struct pollfd* fds, nfds_t count, double* timeout);vendor/glfw/src/posix_thread.cadded
//========================================================================// GLFW 3.5 POSIX - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(GLFW_BUILD_POSIX_THREAD)#include <assert.h>#include <string.h>//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwPlatformCreateTls(_GLFWtls* tls){ assert(tls->posix.allocated == GLFW_FALSE); if (pthread_key_create(&tls->posix.key, NULL) != 0) { _glfwInputError(GLFW_PLATFORM_ERROR, "POSIX: Failed to create context TLS"); return GLFW_FALSE; } tls->posix.allocated = GLFW_TRUE; return GLFW_TRUE;}void _glfwPlatformDestroyTls(_GLFWtls* tls){ if (tls->posix.allocated) pthread_key_delete(tls->posix.key); memset(tls, 0, sizeof(_GLFWtls));}void* _glfwPlatformGetTls(_GLFWtls* tls){ assert(tls->posix.allocated == GLFW_TRUE); return pthread_getspecific(tls->posix.key);}void _glfwPlatformSetTls(_GLFWtls* tls, void* value){ assert(tls->posix.allocated == GLFW_TRUE); pthread_setspecific(tls->posix.key, value);}GLFWbool _glfwPlatformCreateMutex(_GLFWmutex* mutex){ assert(mutex->posix.allocated == GLFW_FALSE); if (pthread_mutex_init(&mutex->posix.handle, NULL) != 0) { _glfwInputError(GLFW_PLATFORM_ERROR, "POSIX: Failed to create mutex"); return GLFW_FALSE; } return mutex->posix.allocated = GLFW_TRUE;}void _glfwPlatformDestroyMutex(_GLFWmutex* mutex){ if (mutex->posix.allocated) pthread_mutex_destroy(&mutex->posix.handle); memset(mutex, 0, sizeof(_GLFWmutex));}void _glfwPlatformLockMutex(_GLFWmutex* mutex){ assert(mutex->posix.allocated == GLFW_TRUE); pthread_mutex_lock(&mutex->posix.handle);}void _glfwPlatformUnlockMutex(_GLFWmutex* mutex){ assert(mutex->posix.allocated == GLFW_TRUE); pthread_mutex_unlock(&mutex->posix.handle);}#endif // GLFW_BUILD_POSIX_THREADvendor/glfw/src/posix_thread.hadded
//========================================================================// GLFW 3.5 POSIX - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include <pthread.h>#define GLFW_POSIX_TLS_STATE _GLFWtlsPOSIX posix;#define GLFW_POSIX_MUTEX_STATE _GLFWmutexPOSIX posix;// POSIX-specific thread local storage data//typedef struct _GLFWtlsPOSIX{ GLFWbool allocated; pthread_key_t key;} _GLFWtlsPOSIX;// POSIX-specific mutex data//typedef struct _GLFWmutexPOSIX{ GLFWbool allocated; pthread_mutex_t handle;} _GLFWmutexPOSIX;vendor/glfw/src/posix_time.cadded
//========================================================================// GLFW 3.5 POSIX - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(GLFW_BUILD_POSIX_TIMER)#include <unistd.h>#include <sys/time.h>//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void _glfwPlatformInitTimer(void){ _glfw.timer.posix.clock = CLOCK_REALTIME; _glfw.timer.posix.frequency = 1000000000;#if defined(_POSIX_MONOTONIC_CLOCK) struct timespec ts; if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) _glfw.timer.posix.clock = CLOCK_MONOTONIC;#endif}uint64_t _glfwPlatformGetTimerValue(void){ struct timespec ts; clock_gettime(_glfw.timer.posix.clock, &ts); return (uint64_t) ts.tv_sec * _glfw.timer.posix.frequency + (uint64_t) ts.tv_nsec;}uint64_t _glfwPlatformGetTimerFrequency(void){ return _glfw.timer.posix.frequency;}#endif // GLFW_BUILD_POSIX_TIMERvendor/glfw/src/posix_time.hadded
//========================================================================// GLFW 3.5 POSIX - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#define GLFW_POSIX_LIBRARY_TIMER_STATE _GLFWtimerPOSIX posix;#include <stdint.h>#include <time.h>// POSIX-specific global timer data//typedef struct _GLFWtimerPOSIX{ clockid_t clock; uint64_t frequency;} _GLFWtimerPOSIX;vendor/glfw/src/vulkan.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2018 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <assert.h>#include <string.h>#include <stdlib.h>#define _GLFW_FIND_LOADER 1#define _GLFW_REQUIRE_LOADER 2#if defined(__APPLE__)#include <CoreFoundation/CoreFoundation.h>static void* loadLocalVulkanLoaderMacOS(void){ CFBundleRef bundle = CFBundleGetMainBundle(); if (!bundle) return NULL; CFURLRef frameworksUrl = CFBundleCopyPrivateFrameworksURL(bundle); if (!frameworksUrl) return NULL; CFURLRef loaderUrl = CFURLCreateCopyAppendingPathComponent( kCFAllocatorDefault, frameworksUrl, CFSTR("libvulkan.1.dylib"), false); if (!loaderUrl) { CFRelease(frameworksUrl); return NULL; } char path[PATH_MAX]; void* handle = NULL; if (CFURLGetFileSystemRepresentation(loaderUrl, true, (UInt8*) path, sizeof(path) - 1)) handle = _glfwPlatformLoadModule(path); CFRelease(loaderUrl); CFRelease(frameworksUrl); return handle;}#endif // __APPLE__//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwInitVulkan(int mode){ VkResult err; VkExtensionProperties* ep; PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties; uint32_t i, count; if (_glfw.vk.available) return GLFW_TRUE; if (_glfw.hints.init.vulkanLoader) _glfw.vk.GetInstanceProcAddr = _glfw.hints.init.vulkanLoader; else {#if defined(_GLFW_VULKAN_LIBRARY) _glfw.vk.handle = _glfwPlatformLoadModule(_GLFW_VULKAN_LIBRARY);#elif defined(_WIN32) _glfw.vk.handle = _glfwPlatformLoadModule("vulkan-1.dll");#elif defined(__APPLE__) _glfw.vk.handle = _glfwPlatformLoadModule("libvulkan.1.dylib"); if (!_glfw.vk.handle) _glfw.vk.handle = loadLocalVulkanLoaderMacOS();#elif defined(__OpenBSD__) || defined(__NetBSD__) _glfw.vk.handle = _glfwPlatformLoadModule("libvulkan.so");#else _glfw.vk.handle = _glfwPlatformLoadModule("libvulkan.so.1");#endif if (!_glfw.vk.handle) { if (mode == _GLFW_REQUIRE_LOADER) _glfwInputError(GLFW_API_UNAVAILABLE, "Vulkan: Loader not found"); return GLFW_FALSE; } _glfw.vk.GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) _glfwPlatformGetModuleSymbol(_glfw.vk.handle, "vkGetInstanceProcAddr"); if (!_glfw.vk.GetInstanceProcAddr) { _glfwInputError(GLFW_API_UNAVAILABLE, "Vulkan: Loader does not export vkGetInstanceProcAddr"); _glfwTerminateVulkan(); return GLFW_FALSE; } } vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties) vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); if (!vkEnumerateInstanceExtensionProperties) { _glfwInputError(GLFW_API_UNAVAILABLE, "Vulkan: Failed to retrieve vkEnumerateInstanceExtensionProperties"); _glfwTerminateVulkan(); return GLFW_FALSE; } err = vkEnumerateInstanceExtensionProperties(NULL, &count, NULL); if (err) { // NOTE: This happens on systems with a loader but without any Vulkan ICD if (mode == _GLFW_REQUIRE_LOADER) { _glfwInputError(GLFW_API_UNAVAILABLE, "Vulkan: Failed to query instance extension count: %s", _glfwGetVulkanResultString(err)); } _glfwTerminateVulkan(); return GLFW_FALSE; } ep = _glfw_calloc(count, sizeof(VkExtensionProperties)); err = vkEnumerateInstanceExtensionProperties(NULL, &count, ep); if (err) { _glfwInputError(GLFW_API_UNAVAILABLE, "Vulkan: Failed to query instance extensions: %s", _glfwGetVulkanResultString(err)); _glfw_free(ep); _glfwTerminateVulkan(); return GLFW_FALSE; } for (i = 0; i < count; i++) { if (strcmp(ep[i].extensionName, "VK_KHR_surface") == 0) _glfw.vk.KHR_surface = true; else if (strcmp(ep[i].extensionName, "VK_KHR_win32_surface") == 0) _glfw.vk.KHR_win32_surface = true; else if (strcmp(ep[i].extensionName, "VK_MVK_macos_surface") == 0) _glfw.vk.MVK_macos_surface = true; else if (strcmp(ep[i].extensionName, "VK_EXT_metal_surface") == 0) _glfw.vk.EXT_metal_surface = true; else if (strcmp(ep[i].extensionName, "VK_KHR_xlib_surface") == 0) _glfw.vk.KHR_xlib_surface = true; else if (strcmp(ep[i].extensionName, "VK_KHR_xcb_surface") == 0) _glfw.vk.KHR_xcb_surface = true; else if (strcmp(ep[i].extensionName, "VK_KHR_wayland_surface") == 0) _glfw.vk.KHR_wayland_surface = true; else if (strcmp(ep[i].extensionName, "VK_EXT_headless_surface") == 0) _glfw.vk.EXT_headless_surface = true; } _glfw_free(ep); _glfw.vk.available = GLFW_TRUE; _glfw.platform.getRequiredInstanceExtensions(_glfw.vk.extensions); return GLFW_TRUE;}void _glfwTerminateVulkan(void){ _glfwPlatformFreeModule(_glfw.vk.handle); _glfw.vk.handle = NULL;}const char* _glfwGetVulkanResultString(VkResult result){ switch (result) { case VK_SUCCESS: return "Success"; case VK_NOT_READY: return "A fence or query has not yet completed"; case VK_TIMEOUT: return "A wait operation has not completed in the specified time"; case VK_EVENT_SET: return "An event is signaled"; case VK_EVENT_RESET: return "An event is unsignaled"; case VK_INCOMPLETE: return "A return array was too small for the result"; case VK_ERROR_OUT_OF_HOST_MEMORY: return "A host memory allocation has failed"; case VK_ERROR_OUT_OF_DEVICE_MEMORY: return "A device memory allocation has failed"; case VK_ERROR_INITIALIZATION_FAILED: return "Initialization of an object could not be completed for implementation-specific reasons"; case VK_ERROR_DEVICE_LOST: return "The logical or physical device has been lost"; case VK_ERROR_MEMORY_MAP_FAILED: return "Mapping of a memory object has failed"; case VK_ERROR_LAYER_NOT_PRESENT: return "A requested layer is not present or could not be loaded"; case VK_ERROR_EXTENSION_NOT_PRESENT: return "A requested extension is not supported"; case VK_ERROR_FEATURE_NOT_PRESENT: return "A requested feature is not supported"; case VK_ERROR_INCOMPATIBLE_DRIVER: return "The requested version of Vulkan is not supported by the driver or is otherwise incompatible"; case VK_ERROR_TOO_MANY_OBJECTS: return "Too many objects of the type have already been created"; case VK_ERROR_FORMAT_NOT_SUPPORTED: return "A requested format is not supported on this device"; case VK_ERROR_SURFACE_LOST_KHR: return "A surface is no longer available"; case VK_SUBOPTIMAL_KHR: return "A swapchain no longer matches the surface properties exactly, but can still be used"; case VK_ERROR_OUT_OF_DATE_KHR: return "A surface has changed in such a way that it is no longer compatible with the swapchain"; case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR: return "The display used by a swapchain does not use the same presentable image layout"; case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR: return "The requested window is already connected to a VkSurfaceKHR, or to some other non-Vulkan API"; case VK_ERROR_VALIDATION_FAILED_EXT: return "A validation layer found an error"; default: return "ERROR: UNKNOWN VULKAN ERROR"; }}//////////////////////////////////////////////////////////////////////////////// GLFW public API ////////////////////////////////////////////////////////////////////////////////GLFWAPI int glfwVulkanSupported(void){ _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE); return _glfwInitVulkan(_GLFW_FIND_LOADER);}GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count){ assert(count != NULL); *count = 0; _GLFW_REQUIRE_INIT_OR_RETURN(NULL); if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER)) return NULL; if (!_glfw.vk.extensions[0]) return NULL; *count = 2; return (const char**) _glfw.vk.extensions;}GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname){ GLFWvkproc proc; assert(procname != NULL); _GLFW_REQUIRE_INIT_OR_RETURN(NULL); if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER)) return NULL; // NOTE: Vulkan 1.0 and 1.1 vkGetInstanceProcAddr cannot return itself if (strcmp(procname, "vkGetInstanceProcAddr") == 0) return (GLFWvkproc) vkGetInstanceProcAddr; proc = (GLFWvkproc) vkGetInstanceProcAddr(instance, procname); if (!proc) { if (_glfw.vk.handle) proc = (GLFWvkproc) _glfwPlatformGetModuleSymbol(_glfw.vk.handle, procname); } return proc;}GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily){ _GLFW_REQUIRE_INIT_OR_RETURN(GLFW_FALSE); assert(instance != VK_NULL_HANDLE); assert(device != VK_NULL_HANDLE); if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER)) return GLFW_FALSE; if (!_glfw.vk.extensions[0]) { _glfwInputError(GLFW_API_UNAVAILABLE, "Vulkan: Window surface creation extensions not found"); return GLFW_FALSE; } return _glfw.platform.getPhysicalDevicePresentationSupport(instance, device, queuefamily);}GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* handle, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface){ assert(surface != NULL); *surface = VK_NULL_HANDLE; _GLFW_REQUIRE_INIT_OR_RETURN(VK_ERROR_INITIALIZATION_FAILED); _GLFWwindow* window = (_GLFWwindow*) handle; assert(window != NULL); assert(instance != VK_NULL_HANDLE); if (!_glfwInitVulkan(_GLFW_REQUIRE_LOADER)) return VK_ERROR_INITIALIZATION_FAILED; if (!_glfw.vk.extensions[0]) { _glfwInputError(GLFW_API_UNAVAILABLE, "Vulkan: Window surface creation extensions not found"); return VK_ERROR_EXTENSION_NOT_PRESENT; } if (window->context.client != GLFW_NO_API) { _glfwInputError(GLFW_INVALID_VALUE, "Vulkan: Window surface creation requires the window to have the client API set to GLFW_NO_API"); return VK_ERROR_NATIVE_WINDOW_IN_USE_KHR; } return _glfw.platform.createWindowSurface(instance, window, allocator, surface);}vendor/glfw/src/wayland-protocols/fractional-scale-v1-client-protocol-code.hadded
/* Generated by wayland-scanner 1.24.0 *//* * Copyright © 2022 Kenny Levinsen * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include "wayland-util.h"#ifndef __has_attribute# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */#endif#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)#define WL_PRIVATE __attribute__ ((visibility("hidden")))#else#define WL_PRIVATE#endifextern const struct wl_interface wl_surface_interface;extern const struct wl_interface wp_fractional_scale_v1_interface;static const struct wl_interface *fractional_scale_v1_types[] = { NULL, &wp_fractional_scale_v1_interface, &wl_surface_interface,};static const struct wl_message wp_fractional_scale_manager_v1_requests[] = { { "destroy", "", fractional_scale_v1_types + 0 }, { "get_fractional_scale", "no", fractional_scale_v1_types + 1 },};WL_PRIVATE const struct wl_interface wp_fractional_scale_manager_v1_interface = { "wp_fractional_scale_manager_v1", 1, 2, wp_fractional_scale_manager_v1_requests, 0, NULL,};static const struct wl_message wp_fractional_scale_v1_requests[] = { { "destroy", "", fractional_scale_v1_types + 0 },};static const struct wl_message wp_fractional_scale_v1_events[] = { { "preferred_scale", "u", fractional_scale_v1_types + 0 },};WL_PRIVATE const struct wl_interface wp_fractional_scale_v1_interface = { "wp_fractional_scale_v1", 1, 1, wp_fractional_scale_v1_requests, 1, wp_fractional_scale_v1_events,};vendor/glfw/src/wayland-protocols/fractional-scale-v1-client-protocol.hadded
/* Generated by wayland-scanner 1.24.0 */#ifndef FRACTIONAL_SCALE_V1_CLIENT_PROTOCOL_H#define FRACTIONAL_SCALE_V1_CLIENT_PROTOCOL_H#include <stdint.h>#include <stddef.h>#include "wayland-client.h"#ifdef __cplusplusextern "C" {#endif/** * @page page_fractional_scale_v1 The fractional_scale_v1 protocol * Protocol for requesting fractional surface scales * * @section page_desc_fractional_scale_v1 Description * * This protocol allows a compositor to suggest for surfaces to render at * fractional scales. * * A client can submit scaled content by utilizing wp_viewport. This is done by * creating a wp_viewport object for the surface and setting the destination * rectangle to the surface size before the scale factor is applied. * * The buffer size is calculated by multiplying the surface size by the * intended scale. * * The wl_surface buffer scale should remain set to 1. * * If a surface has a surface-local size of 100 px by 50 px and wishes to * submit buffers with a scale of 1.5, then a buffer of 150px by 75 px should * be used and the wp_viewport destination rectangle should be 100 px by 50 px. * * For toplevel surfaces, the size is rounded halfway away from zero. The * rounding algorithm for subsurface position and size is not defined. * * @section page_ifaces_fractional_scale_v1 Interfaces * - @subpage page_iface_wp_fractional_scale_manager_v1 - fractional surface scale information * - @subpage page_iface_wp_fractional_scale_v1 - fractional scale interface to a wl_surface * @section page_copyright_fractional_scale_v1 Copyright * <pre> * * Copyright © 2022 Kenny Levinsen * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * </pre> */struct wl_surface;struct wp_fractional_scale_manager_v1;struct wp_fractional_scale_v1;#ifndef WP_FRACTIONAL_SCALE_MANAGER_V1_INTERFACE#define WP_FRACTIONAL_SCALE_MANAGER_V1_INTERFACE/** * @page page_iface_wp_fractional_scale_manager_v1 wp_fractional_scale_manager_v1 * @section page_iface_wp_fractional_scale_manager_v1_desc Description * * A global interface for requesting surfaces to use fractional scales. * @section page_iface_wp_fractional_scale_manager_v1_api API * See @ref iface_wp_fractional_scale_manager_v1. *//** * @defgroup iface_wp_fractional_scale_manager_v1 The wp_fractional_scale_manager_v1 interface * * A global interface for requesting surfaces to use fractional scales. */extern const struct wl_interface wp_fractional_scale_manager_v1_interface;#endif#ifndef WP_FRACTIONAL_SCALE_V1_INTERFACE#define WP_FRACTIONAL_SCALE_V1_INTERFACE/** * @page page_iface_wp_fractional_scale_v1 wp_fractional_scale_v1 * @section page_iface_wp_fractional_scale_v1_desc Description * * An additional interface to a wl_surface object which allows the compositor * to inform the client of the preferred scale. * @section page_iface_wp_fractional_scale_v1_api API * See @ref iface_wp_fractional_scale_v1. *//** * @defgroup iface_wp_fractional_scale_v1 The wp_fractional_scale_v1 interface * * An additional interface to a wl_surface object which allows the compositor * to inform the client of the preferred scale. */extern const struct wl_interface wp_fractional_scale_v1_interface;#endif#ifndef WP_FRACTIONAL_SCALE_MANAGER_V1_ERROR_ENUM#define WP_FRACTIONAL_SCALE_MANAGER_V1_ERROR_ENUMenum wp_fractional_scale_manager_v1_error { /** * the surface already has a fractional_scale object associated */ WP_FRACTIONAL_SCALE_MANAGER_V1_ERROR_FRACTIONAL_SCALE_EXISTS = 0,};#endif /* WP_FRACTIONAL_SCALE_MANAGER_V1_ERROR_ENUM */#define WP_FRACTIONAL_SCALE_MANAGER_V1_DESTROY 0#define WP_FRACTIONAL_SCALE_MANAGER_V1_GET_FRACTIONAL_SCALE 1/** * @ingroup iface_wp_fractional_scale_manager_v1 */#define WP_FRACTIONAL_SCALE_MANAGER_V1_DESTROY_SINCE_VERSION 1/** * @ingroup iface_wp_fractional_scale_manager_v1 */#define WP_FRACTIONAL_SCALE_MANAGER_V1_GET_FRACTIONAL_SCALE_SINCE_VERSION 1/** @ingroup iface_wp_fractional_scale_manager_v1 */static inline voidwp_fractional_scale_manager_v1_set_user_data(struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) wp_fractional_scale_manager_v1, user_data);}/** @ingroup iface_wp_fractional_scale_manager_v1 */static inline void *wp_fractional_scale_manager_v1_get_user_data(struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager_v1){ return wl_proxy_get_user_data((struct wl_proxy *) wp_fractional_scale_manager_v1);}static inline uint32_twp_fractional_scale_manager_v1_get_version(struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager_v1){ return wl_proxy_get_version((struct wl_proxy *) wp_fractional_scale_manager_v1);}/** * @ingroup iface_wp_fractional_scale_manager_v1 * * Informs the server that the client will not be using this protocol * object anymore. This does not affect any other objects, * wp_fractional_scale_v1 objects included. */static inline voidwp_fractional_scale_manager_v1_destroy(struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager_v1){ wl_proxy_marshal_flags((struct wl_proxy *) wp_fractional_scale_manager_v1, WP_FRACTIONAL_SCALE_MANAGER_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) wp_fractional_scale_manager_v1), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_wp_fractional_scale_manager_v1 * * Create an add-on object for the the wl_surface to let the compositor * request fractional scales. If the given wl_surface already has a * wp_fractional_scale_v1 object associated, the fractional_scale_exists * protocol error is raised. */static inline struct wp_fractional_scale_v1 *wp_fractional_scale_manager_v1_get_fractional_scale(struct wp_fractional_scale_manager_v1 *wp_fractional_scale_manager_v1, struct wl_surface *surface){ struct wl_proxy *id; id = wl_proxy_marshal_flags((struct wl_proxy *) wp_fractional_scale_manager_v1, WP_FRACTIONAL_SCALE_MANAGER_V1_GET_FRACTIONAL_SCALE, &wp_fractional_scale_v1_interface, wl_proxy_get_version((struct wl_proxy *) wp_fractional_scale_manager_v1), 0, NULL, surface); return (struct wp_fractional_scale_v1 *) id;}/** * @ingroup iface_wp_fractional_scale_v1 * @struct wp_fractional_scale_v1_listener */struct wp_fractional_scale_v1_listener { /** * notify of new preferred scale * * Notification of a new preferred scale for this surface that * the compositor suggests that the client should use. * * The sent scale is the numerator of a fraction with a denominator * of 120. * @param scale the new preferred scale */ void (*preferred_scale)(void *data, struct wp_fractional_scale_v1 *wp_fractional_scale_v1, uint32_t scale);};/** * @ingroup iface_wp_fractional_scale_v1 */static inline intwp_fractional_scale_v1_add_listener(struct wp_fractional_scale_v1 *wp_fractional_scale_v1, const struct wp_fractional_scale_v1_listener *listener, void *data){ return wl_proxy_add_listener((struct wl_proxy *) wp_fractional_scale_v1, (void (**)(void)) listener, data);}#define WP_FRACTIONAL_SCALE_V1_DESTROY 0/** * @ingroup iface_wp_fractional_scale_v1 */#define WP_FRACTIONAL_SCALE_V1_PREFERRED_SCALE_SINCE_VERSION 1/** * @ingroup iface_wp_fractional_scale_v1 */#define WP_FRACTIONAL_SCALE_V1_DESTROY_SINCE_VERSION 1/** @ingroup iface_wp_fractional_scale_v1 */static inline voidwp_fractional_scale_v1_set_user_data(struct wp_fractional_scale_v1 *wp_fractional_scale_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) wp_fractional_scale_v1, user_data);}/** @ingroup iface_wp_fractional_scale_v1 */static inline void *wp_fractional_scale_v1_get_user_data(struct wp_fractional_scale_v1 *wp_fractional_scale_v1){ return wl_proxy_get_user_data((struct wl_proxy *) wp_fractional_scale_v1);}static inline uint32_twp_fractional_scale_v1_get_version(struct wp_fractional_scale_v1 *wp_fractional_scale_v1){ return wl_proxy_get_version((struct wl_proxy *) wp_fractional_scale_v1);}/** * @ingroup iface_wp_fractional_scale_v1 * * Destroy the fractional scale object. When this object is destroyed, * preferred_scale events will no longer be sent. */static inline voidwp_fractional_scale_v1_destroy(struct wp_fractional_scale_v1 *wp_fractional_scale_v1){ wl_proxy_marshal_flags((struct wl_proxy *) wp_fractional_scale_v1, WP_FRACTIONAL_SCALE_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) wp_fractional_scale_v1), WL_MARSHAL_FLAG_DESTROY);}#ifdef __cplusplus}#endif#endifvendor/glfw/src/wayland-protocols/idle-inhibit-unstable-v1-client-protocol-code.hadded
/* Generated by wayland-scanner 1.24.0 *//* * Copyright © 2015 Samsung Electronics Co., Ltd * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include "wayland-util.h"#ifndef __has_attribute# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */#endif#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)#define WL_PRIVATE __attribute__ ((visibility("hidden")))#else#define WL_PRIVATE#endifextern const struct wl_interface wl_surface_interface;extern const struct wl_interface zwp_idle_inhibitor_v1_interface;static const struct wl_interface *idle_inhibit_unstable_v1_types[] = { &zwp_idle_inhibitor_v1_interface, &wl_surface_interface,};static const struct wl_message zwp_idle_inhibit_manager_v1_requests[] = { { "destroy", "", idle_inhibit_unstable_v1_types + 0 }, { "create_inhibitor", "no", idle_inhibit_unstable_v1_types + 0 },};WL_PRIVATE const struct wl_interface zwp_idle_inhibit_manager_v1_interface = { "zwp_idle_inhibit_manager_v1", 1, 2, zwp_idle_inhibit_manager_v1_requests, 0, NULL,};static const struct wl_message zwp_idle_inhibitor_v1_requests[] = { { "destroy", "", idle_inhibit_unstable_v1_types + 0 },};WL_PRIVATE const struct wl_interface zwp_idle_inhibitor_v1_interface = { "zwp_idle_inhibitor_v1", 1, 1, zwp_idle_inhibitor_v1_requests, 0, NULL,};vendor/glfw/src/wayland-protocols/idle-inhibit-unstable-v1-client-protocol.hadded
/* Generated by wayland-scanner 1.24.0 */#ifndef IDLE_INHIBIT_UNSTABLE_V1_CLIENT_PROTOCOL_H#define IDLE_INHIBIT_UNSTABLE_V1_CLIENT_PROTOCOL_H#include <stdint.h>#include <stddef.h>#include "wayland-client.h"#ifdef __cplusplusextern "C" {#endif/** * @page page_idle_inhibit_unstable_v1 The idle_inhibit_unstable_v1 protocol * @section page_ifaces_idle_inhibit_unstable_v1 Interfaces * - @subpage page_iface_zwp_idle_inhibit_manager_v1 - control behavior when display idles * - @subpage page_iface_zwp_idle_inhibitor_v1 - context object for inhibiting idle behavior * @section page_copyright_idle_inhibit_unstable_v1 Copyright * <pre> * * Copyright © 2015 Samsung Electronics Co., Ltd * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * </pre> */struct wl_surface;struct zwp_idle_inhibit_manager_v1;struct zwp_idle_inhibitor_v1;#ifndef ZWP_IDLE_INHIBIT_MANAGER_V1_INTERFACE#define ZWP_IDLE_INHIBIT_MANAGER_V1_INTERFACE/** * @page page_iface_zwp_idle_inhibit_manager_v1 zwp_idle_inhibit_manager_v1 * @section page_iface_zwp_idle_inhibit_manager_v1_desc Description * * This interface permits inhibiting the idle behavior such as screen * blanking, locking, and screensaving. The client binds the idle manager * globally, then creates idle-inhibitor objects for each surface. * * Warning! The protocol described in this file is experimental and * backward incompatible changes may be made. Backward compatible changes * may be added together with the corresponding interface version bump. * Backward incompatible changes are done by bumping the version number in * the protocol and interface names and resetting the interface version. * Once the protocol is to be declared stable, the 'z' prefix and the * version number in the protocol and interface names are removed and the * interface version number is reset. * @section page_iface_zwp_idle_inhibit_manager_v1_api API * See @ref iface_zwp_idle_inhibit_manager_v1. *//** * @defgroup iface_zwp_idle_inhibit_manager_v1 The zwp_idle_inhibit_manager_v1 interface * * This interface permits inhibiting the idle behavior such as screen * blanking, locking, and screensaving. The client binds the idle manager * globally, then creates idle-inhibitor objects for each surface. * * Warning! The protocol described in this file is experimental and * backward incompatible changes may be made. Backward compatible changes * may be added together with the corresponding interface version bump. * Backward incompatible changes are done by bumping the version number in * the protocol and interface names and resetting the interface version. * Once the protocol is to be declared stable, the 'z' prefix and the * version number in the protocol and interface names are removed and the * interface version number is reset. */extern const struct wl_interface zwp_idle_inhibit_manager_v1_interface;#endif#ifndef ZWP_IDLE_INHIBITOR_V1_INTERFACE#define ZWP_IDLE_INHIBITOR_V1_INTERFACE/** * @page page_iface_zwp_idle_inhibitor_v1 zwp_idle_inhibitor_v1 * @section page_iface_zwp_idle_inhibitor_v1_desc Description * * An idle inhibitor prevents the output that the associated surface is * visible on from being set to a state where it is not visually usable due * to lack of user interaction (e.g. blanked, dimmed, locked, set to power * save, etc.) Any screensaver processes are also blocked from displaying. * * If the surface is destroyed, unmapped, becomes occluded, loses * visibility, or otherwise becomes not visually relevant for the user, the * idle inhibitor will not be honored by the compositor; if the surface * subsequently regains visibility the inhibitor takes effect once again. * Likewise, the inhibitor isn't honored if the system was already idled at * the time the inhibitor was established, although if the system later * de-idles and re-idles the inhibitor will take effect. * @section page_iface_zwp_idle_inhibitor_v1_api API * See @ref iface_zwp_idle_inhibitor_v1. *//** * @defgroup iface_zwp_idle_inhibitor_v1 The zwp_idle_inhibitor_v1 interface * * An idle inhibitor prevents the output that the associated surface is * visible on from being set to a state where it is not visually usable due * to lack of user interaction (e.g. blanked, dimmed, locked, set to power * save, etc.) Any screensaver processes are also blocked from displaying. * * If the surface is destroyed, unmapped, becomes occluded, loses * visibility, or otherwise becomes not visually relevant for the user, the * idle inhibitor will not be honored by the compositor; if the surface * subsequently regains visibility the inhibitor takes effect once again. * Likewise, the inhibitor isn't honored if the system was already idled at * the time the inhibitor was established, although if the system later * de-idles and re-idles the inhibitor will take effect. */extern const struct wl_interface zwp_idle_inhibitor_v1_interface;#endif#define ZWP_IDLE_INHIBIT_MANAGER_V1_DESTROY 0#define ZWP_IDLE_INHIBIT_MANAGER_V1_CREATE_INHIBITOR 1/** * @ingroup iface_zwp_idle_inhibit_manager_v1 */#define ZWP_IDLE_INHIBIT_MANAGER_V1_DESTROY_SINCE_VERSION 1/** * @ingroup iface_zwp_idle_inhibit_manager_v1 */#define ZWP_IDLE_INHIBIT_MANAGER_V1_CREATE_INHIBITOR_SINCE_VERSION 1/** @ingroup iface_zwp_idle_inhibit_manager_v1 */static inline voidzwp_idle_inhibit_manager_v1_set_user_data(struct zwp_idle_inhibit_manager_v1 *zwp_idle_inhibit_manager_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) zwp_idle_inhibit_manager_v1, user_data);}/** @ingroup iface_zwp_idle_inhibit_manager_v1 */static inline void *zwp_idle_inhibit_manager_v1_get_user_data(struct zwp_idle_inhibit_manager_v1 *zwp_idle_inhibit_manager_v1){ return wl_proxy_get_user_data((struct wl_proxy *) zwp_idle_inhibit_manager_v1);}static inline uint32_tzwp_idle_inhibit_manager_v1_get_version(struct zwp_idle_inhibit_manager_v1 *zwp_idle_inhibit_manager_v1){ return wl_proxy_get_version((struct wl_proxy *) zwp_idle_inhibit_manager_v1);}/** * @ingroup iface_zwp_idle_inhibit_manager_v1 * * Destroy the inhibit manager. */static inline voidzwp_idle_inhibit_manager_v1_destroy(struct zwp_idle_inhibit_manager_v1 *zwp_idle_inhibit_manager_v1){ wl_proxy_marshal_flags((struct wl_proxy *) zwp_idle_inhibit_manager_v1, ZWP_IDLE_INHIBIT_MANAGER_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_idle_inhibit_manager_v1), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_zwp_idle_inhibit_manager_v1 * * Create a new inhibitor object associated with the given surface. */static inline struct zwp_idle_inhibitor_v1 *zwp_idle_inhibit_manager_v1_create_inhibitor(struct zwp_idle_inhibit_manager_v1 *zwp_idle_inhibit_manager_v1, struct wl_surface *surface){ struct wl_proxy *id; id = wl_proxy_marshal_flags((struct wl_proxy *) zwp_idle_inhibit_manager_v1, ZWP_IDLE_INHIBIT_MANAGER_V1_CREATE_INHIBITOR, &zwp_idle_inhibitor_v1_interface, wl_proxy_get_version((struct wl_proxy *) zwp_idle_inhibit_manager_v1), 0, NULL, surface); return (struct zwp_idle_inhibitor_v1 *) id;}#define ZWP_IDLE_INHIBITOR_V1_DESTROY 0/** * @ingroup iface_zwp_idle_inhibitor_v1 */#define ZWP_IDLE_INHIBITOR_V1_DESTROY_SINCE_VERSION 1/** @ingroup iface_zwp_idle_inhibitor_v1 */static inline voidzwp_idle_inhibitor_v1_set_user_data(struct zwp_idle_inhibitor_v1 *zwp_idle_inhibitor_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) zwp_idle_inhibitor_v1, user_data);}/** @ingroup iface_zwp_idle_inhibitor_v1 */static inline void *zwp_idle_inhibitor_v1_get_user_data(struct zwp_idle_inhibitor_v1 *zwp_idle_inhibitor_v1){ return wl_proxy_get_user_data((struct wl_proxy *) zwp_idle_inhibitor_v1);}static inline uint32_tzwp_idle_inhibitor_v1_get_version(struct zwp_idle_inhibitor_v1 *zwp_idle_inhibitor_v1){ return wl_proxy_get_version((struct wl_proxy *) zwp_idle_inhibitor_v1);}/** * @ingroup iface_zwp_idle_inhibitor_v1 * * Remove the inhibitor effect from the associated wl_surface. */static inline voidzwp_idle_inhibitor_v1_destroy(struct zwp_idle_inhibitor_v1 *zwp_idle_inhibitor_v1){ wl_proxy_marshal_flags((struct wl_proxy *) zwp_idle_inhibitor_v1, ZWP_IDLE_INHIBITOR_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_idle_inhibitor_v1), WL_MARSHAL_FLAG_DESTROY);}#ifdef __cplusplus}#endif#endifvendor/glfw/src/wayland-protocols/pointer-constraints-unstable-v1-client-protocol-code.hadded
/* Generated by wayland-scanner 1.24.0 *//* * Copyright © 2014 Jonas Ådahl * Copyright © 2015 Red Hat Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include "wayland-util.h"#ifndef __has_attribute# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */#endif#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)#define WL_PRIVATE __attribute__ ((visibility("hidden")))#else#define WL_PRIVATE#endifextern const struct wl_interface wl_pointer_interface;extern const struct wl_interface wl_region_interface;extern const struct wl_interface wl_surface_interface;extern const struct wl_interface zwp_confined_pointer_v1_interface;extern const struct wl_interface zwp_locked_pointer_v1_interface;static const struct wl_interface *pointer_constraints_unstable_v1_types[] = { NULL, NULL, &zwp_locked_pointer_v1_interface, &wl_surface_interface, &wl_pointer_interface, &wl_region_interface, NULL, &zwp_confined_pointer_v1_interface, &wl_surface_interface, &wl_pointer_interface, &wl_region_interface, NULL, &wl_region_interface, &wl_region_interface,};static const struct wl_message zwp_pointer_constraints_v1_requests[] = { { "destroy", "", pointer_constraints_unstable_v1_types + 0 }, { "lock_pointer", "noo?ou", pointer_constraints_unstable_v1_types + 2 }, { "confine_pointer", "noo?ou", pointer_constraints_unstable_v1_types + 7 },};WL_PRIVATE const struct wl_interface zwp_pointer_constraints_v1_interface = { "zwp_pointer_constraints_v1", 1, 3, zwp_pointer_constraints_v1_requests, 0, NULL,};static const struct wl_message zwp_locked_pointer_v1_requests[] = { { "destroy", "", pointer_constraints_unstable_v1_types + 0 }, { "set_cursor_position_hint", "ff", pointer_constraints_unstable_v1_types + 0 }, { "set_region", "?o", pointer_constraints_unstable_v1_types + 12 },};static const struct wl_message zwp_locked_pointer_v1_events[] = { { "locked", "", pointer_constraints_unstable_v1_types + 0 }, { "unlocked", "", pointer_constraints_unstable_v1_types + 0 },};WL_PRIVATE const struct wl_interface zwp_locked_pointer_v1_interface = { "zwp_locked_pointer_v1", 1, 3, zwp_locked_pointer_v1_requests, 2, zwp_locked_pointer_v1_events,};static const struct wl_message zwp_confined_pointer_v1_requests[] = { { "destroy", "", pointer_constraints_unstable_v1_types + 0 }, { "set_region", "?o", pointer_constraints_unstable_v1_types + 13 },};static const struct wl_message zwp_confined_pointer_v1_events[] = { { "confined", "", pointer_constraints_unstable_v1_types + 0 }, { "unconfined", "", pointer_constraints_unstable_v1_types + 0 },};WL_PRIVATE const struct wl_interface zwp_confined_pointer_v1_interface = { "zwp_confined_pointer_v1", 1, 2, zwp_confined_pointer_v1_requests, 2, zwp_confined_pointer_v1_events,};vendor/glfw/src/wayland-protocols/pointer-constraints-unstable-v1-client-protocol.hadded
/* Generated by wayland-scanner 1.24.0 */#ifndef POINTER_CONSTRAINTS_UNSTABLE_V1_CLIENT_PROTOCOL_H#define POINTER_CONSTRAINTS_UNSTABLE_V1_CLIENT_PROTOCOL_H#include <stdint.h>#include <stddef.h>#include "wayland-client.h"#ifdef __cplusplusextern "C" {#endif/** * @page page_pointer_constraints_unstable_v1 The pointer_constraints_unstable_v1 protocol * protocol for constraining pointer motions * * @section page_desc_pointer_constraints_unstable_v1 Description * * This protocol specifies a set of interfaces used for adding constraints to * the motion of a pointer. Possible constraints include confining pointer * motions to a given region, or locking it to its current position. * * In order to constrain the pointer, a client must first bind the global * interface "wp_pointer_constraints" which, if a compositor supports pointer * constraints, is exposed by the registry. Using the bound global object, the * client uses the request that corresponds to the type of constraint it wants * to make. See wp_pointer_constraints for more details. * * Warning! The protocol described in this file is experimental and backward * incompatible changes may be made. Backward compatible changes may be added * together with the corresponding interface version bump. Backward * incompatible changes are done by bumping the version number in the protocol * and interface names and resetting the interface version. Once the protocol * is to be declared stable, the 'z' prefix and the version number in the * protocol and interface names are removed and the interface version number is * reset. * * @section page_ifaces_pointer_constraints_unstable_v1 Interfaces * - @subpage page_iface_zwp_pointer_constraints_v1 - constrain the movement of a pointer * - @subpage page_iface_zwp_locked_pointer_v1 - receive relative pointer motion events * - @subpage page_iface_zwp_confined_pointer_v1 - confined pointer object * @section page_copyright_pointer_constraints_unstable_v1 Copyright * <pre> * * Copyright © 2014 Jonas Ådahl * Copyright © 2015 Red Hat Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * </pre> */struct wl_pointer;struct wl_region;struct wl_surface;struct zwp_confined_pointer_v1;struct zwp_locked_pointer_v1;struct zwp_pointer_constraints_v1;#ifndef ZWP_POINTER_CONSTRAINTS_V1_INTERFACE#define ZWP_POINTER_CONSTRAINTS_V1_INTERFACE/** * @page page_iface_zwp_pointer_constraints_v1 zwp_pointer_constraints_v1 * @section page_iface_zwp_pointer_constraints_v1_desc Description * * The global interface exposing pointer constraining functionality. It * exposes two requests: lock_pointer for locking the pointer to its * position, and confine_pointer for locking the pointer to a region. * * The lock_pointer and confine_pointer requests create the objects * wp_locked_pointer and wp_confined_pointer respectively, and the client can * use these objects to interact with the lock. * * For any surface, only one lock or confinement may be active across all * wl_pointer objects of the same seat. If a lock or confinement is requested * when another lock or confinement is active or requested on the same surface * and with any of the wl_pointer objects of the same seat, an * 'already_constrained' error will be raised. * @section page_iface_zwp_pointer_constraints_v1_api API * See @ref iface_zwp_pointer_constraints_v1. *//** * @defgroup iface_zwp_pointer_constraints_v1 The zwp_pointer_constraints_v1 interface * * The global interface exposing pointer constraining functionality. It * exposes two requests: lock_pointer for locking the pointer to its * position, and confine_pointer for locking the pointer to a region. * * The lock_pointer and confine_pointer requests create the objects * wp_locked_pointer and wp_confined_pointer respectively, and the client can * use these objects to interact with the lock. * * For any surface, only one lock or confinement may be active across all * wl_pointer objects of the same seat. If a lock or confinement is requested * when another lock or confinement is active or requested on the same surface * and with any of the wl_pointer objects of the same seat, an * 'already_constrained' error will be raised. */extern const struct wl_interface zwp_pointer_constraints_v1_interface;#endif#ifndef ZWP_LOCKED_POINTER_V1_INTERFACE#define ZWP_LOCKED_POINTER_V1_INTERFACE/** * @page page_iface_zwp_locked_pointer_v1 zwp_locked_pointer_v1 * @section page_iface_zwp_locked_pointer_v1_desc Description * * The wp_locked_pointer interface represents a locked pointer state. * * While the lock of this object is active, the wl_pointer objects of the * associated seat will not emit any wl_pointer.motion events. * * This object will send the event 'locked' when the lock is activated. * Whenever the lock is activated, it is guaranteed that the locked surface * will already have received pointer focus and that the pointer will be * within the region passed to the request creating this object. * * To unlock the pointer, send the destroy request. This will also destroy * the wp_locked_pointer object. * * If the compositor decides to unlock the pointer the unlocked event is * sent. See wp_locked_pointer.unlock for details. * * When unlocking, the compositor may warp the cursor position to the set * cursor position hint. If it does, it will not result in any relative * motion events emitted via wp_relative_pointer. * * If the surface the lock was requested on is destroyed and the lock is not * yet activated, the wp_locked_pointer object is now defunct and must be * destroyed. * @section page_iface_zwp_locked_pointer_v1_api API * See @ref iface_zwp_locked_pointer_v1. *//** * @defgroup iface_zwp_locked_pointer_v1 The zwp_locked_pointer_v1 interface * * The wp_locked_pointer interface represents a locked pointer state. * * While the lock of this object is active, the wl_pointer objects of the * associated seat will not emit any wl_pointer.motion events. * * This object will send the event 'locked' when the lock is activated. * Whenever the lock is activated, it is guaranteed that the locked surface * will already have received pointer focus and that the pointer will be * within the region passed to the request creating this object. * * To unlock the pointer, send the destroy request. This will also destroy * the wp_locked_pointer object. * * If the compositor decides to unlock the pointer the unlocked event is * sent. See wp_locked_pointer.unlock for details. * * When unlocking, the compositor may warp the cursor position to the set * cursor position hint. If it does, it will not result in any relative * motion events emitted via wp_relative_pointer. * * If the surface the lock was requested on is destroyed and the lock is not * yet activated, the wp_locked_pointer object is now defunct and must be * destroyed. */extern const struct wl_interface zwp_locked_pointer_v1_interface;#endif#ifndef ZWP_CONFINED_POINTER_V1_INTERFACE#define ZWP_CONFINED_POINTER_V1_INTERFACE/** * @page page_iface_zwp_confined_pointer_v1 zwp_confined_pointer_v1 * @section page_iface_zwp_confined_pointer_v1_desc Description * * The wp_confined_pointer interface represents a confined pointer state. * * This object will send the event 'confined' when the confinement is * activated. Whenever the confinement is activated, it is guaranteed that * the surface the pointer is confined to will already have received pointer * focus and that the pointer will be within the region passed to the request * creating this object. It is up to the compositor to decide whether this * requires some user interaction and if the pointer will warp to within the * passed region if outside. * * To unconfine the pointer, send the destroy request. This will also destroy * the wp_confined_pointer object. * * If the compositor decides to unconfine the pointer the unconfined event is * sent. The wp_confined_pointer object is at this point defunct and should * be destroyed. * @section page_iface_zwp_confined_pointer_v1_api API * See @ref iface_zwp_confined_pointer_v1. *//** * @defgroup iface_zwp_confined_pointer_v1 The zwp_confined_pointer_v1 interface * * The wp_confined_pointer interface represents a confined pointer state. * * This object will send the event 'confined' when the confinement is * activated. Whenever the confinement is activated, it is guaranteed that * the surface the pointer is confined to will already have received pointer * focus and that the pointer will be within the region passed to the request * creating this object. It is up to the compositor to decide whether this * requires some user interaction and if the pointer will warp to within the * passed region if outside. * * To unconfine the pointer, send the destroy request. This will also destroy * the wp_confined_pointer object. * * If the compositor decides to unconfine the pointer the unconfined event is * sent. The wp_confined_pointer object is at this point defunct and should * be destroyed. */extern const struct wl_interface zwp_confined_pointer_v1_interface;#endif#ifndef ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM#define ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM/** * @ingroup iface_zwp_pointer_constraints_v1 * wp_pointer_constraints error values * * These errors can be emitted in response to wp_pointer_constraints * requests. */enum zwp_pointer_constraints_v1_error { /** * pointer constraint already requested on that surface */ ZWP_POINTER_CONSTRAINTS_V1_ERROR_ALREADY_CONSTRAINED = 1,};#endif /* ZWP_POINTER_CONSTRAINTS_V1_ERROR_ENUM */#ifndef ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM#define ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM/** * @ingroup iface_zwp_pointer_constraints_v1 * constraint lifetime * * These values represent different lifetime semantics. They are passed * as arguments to the factory requests to specify how the constraint * lifetimes should be managed. */enum zwp_pointer_constraints_v1_lifetime { /** * the pointer constraint is defunct once deactivated * * A oneshot pointer constraint will never reactivate once it has * been deactivated. See the corresponding deactivation event * (wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) * for details. */ ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ONESHOT = 1, /** * the pointer constraint may reactivate * * A persistent pointer constraint may again reactivate once it * has been deactivated. See the corresponding deactivation event * (wp_locked_pointer.unlocked and wp_confined_pointer.unconfined) * for details. */ ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT = 2,};#endif /* ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ENUM */#define ZWP_POINTER_CONSTRAINTS_V1_DESTROY 0#define ZWP_POINTER_CONSTRAINTS_V1_LOCK_POINTER 1#define ZWP_POINTER_CONSTRAINTS_V1_CONFINE_POINTER 2/** * @ingroup iface_zwp_pointer_constraints_v1 */#define ZWP_POINTER_CONSTRAINTS_V1_DESTROY_SINCE_VERSION 1/** * @ingroup iface_zwp_pointer_constraints_v1 */#define ZWP_POINTER_CONSTRAINTS_V1_LOCK_POINTER_SINCE_VERSION 1/** * @ingroup iface_zwp_pointer_constraints_v1 */#define ZWP_POINTER_CONSTRAINTS_V1_CONFINE_POINTER_SINCE_VERSION 1/** @ingroup iface_zwp_pointer_constraints_v1 */static inline voidzwp_pointer_constraints_v1_set_user_data(struct zwp_pointer_constraints_v1 *zwp_pointer_constraints_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) zwp_pointer_constraints_v1, user_data);}/** @ingroup iface_zwp_pointer_constraints_v1 */static inline void *zwp_pointer_constraints_v1_get_user_data(struct zwp_pointer_constraints_v1 *zwp_pointer_constraints_v1){ return wl_proxy_get_user_data((struct wl_proxy *) zwp_pointer_constraints_v1);}static inline uint32_tzwp_pointer_constraints_v1_get_version(struct zwp_pointer_constraints_v1 *zwp_pointer_constraints_v1){ return wl_proxy_get_version((struct wl_proxy *) zwp_pointer_constraints_v1);}/** * @ingroup iface_zwp_pointer_constraints_v1 * * Used by the client to notify the server that it will no longer use this * pointer constraints object. */static inline voidzwp_pointer_constraints_v1_destroy(struct zwp_pointer_constraints_v1 *zwp_pointer_constraints_v1){ wl_proxy_marshal_flags((struct wl_proxy *) zwp_pointer_constraints_v1, ZWP_POINTER_CONSTRAINTS_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_pointer_constraints_v1), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_zwp_pointer_constraints_v1 * * The lock_pointer request lets the client request to disable movements of * the virtual pointer (i.e. the cursor), effectively locking the pointer * to a position. This request may not take effect immediately; in the * future, when the compositor deems implementation-specific constraints * are satisfied, the pointer lock will be activated and the compositor * sends a locked event. * * The protocol provides no guarantee that the constraints are ever * satisfied, and does not require the compositor to send an error if the * constraints cannot ever be satisfied. It is thus possible to request a * lock that will never activate. * * There may not be another pointer constraint of any kind requested or * active on the surface for any of the wl_pointer objects of the seat of * the passed pointer when requesting a lock. If there is, an error will be * raised. See general pointer lock documentation for more details. * * The intersection of the region passed with this request and the input * region of the surface is used to determine where the pointer must be * in order for the lock to activate. It is up to the compositor whether to * warp the pointer or require some kind of user interaction for the lock * to activate. If the region is null the surface input region is used. * * A surface may receive pointer focus without the lock being activated. * * The request creates a new object wp_locked_pointer which is used to * interact with the lock as well as receive updates about its state. See * the the description of wp_locked_pointer for further information. * * Note that while a pointer is locked, the wl_pointer objects of the * corresponding seat will not emit any wl_pointer.motion events, but * relative motion events will still be emitted via wp_relative_pointer * objects of the same seat. wl_pointer.axis and wl_pointer.button events * are unaffected. */static inline struct zwp_locked_pointer_v1 *zwp_pointer_constraints_v1_lock_pointer(struct zwp_pointer_constraints_v1 *zwp_pointer_constraints_v1, struct wl_surface *surface, struct wl_pointer *pointer, struct wl_region *region, uint32_t lifetime){ struct wl_proxy *id; id = wl_proxy_marshal_flags((struct wl_proxy *) zwp_pointer_constraints_v1, ZWP_POINTER_CONSTRAINTS_V1_LOCK_POINTER, &zwp_locked_pointer_v1_interface, wl_proxy_get_version((struct wl_proxy *) zwp_pointer_constraints_v1), 0, NULL, surface, pointer, region, lifetime); return (struct zwp_locked_pointer_v1 *) id;}/** * @ingroup iface_zwp_pointer_constraints_v1 * * The confine_pointer request lets the client request to confine the * pointer cursor to a given region. This request may not take effect * immediately; in the future, when the compositor deems implementation- * specific constraints are satisfied, the pointer confinement will be * activated and the compositor sends a confined event. * * The intersection of the region passed with this request and the input * region of the surface is used to determine where the pointer must be * in order for the confinement to activate. It is up to the compositor * whether to warp the pointer or require some kind of user interaction for * the confinement to activate. If the region is null the surface input * region is used. * * The request will create a new object wp_confined_pointer which is used * to interact with the confinement as well as receive updates about its * state. See the the description of wp_confined_pointer for further * information. */static inline struct zwp_confined_pointer_v1 *zwp_pointer_constraints_v1_confine_pointer(struct zwp_pointer_constraints_v1 *zwp_pointer_constraints_v1, struct wl_surface *surface, struct wl_pointer *pointer, struct wl_region *region, uint32_t lifetime){ struct wl_proxy *id; id = wl_proxy_marshal_flags((struct wl_proxy *) zwp_pointer_constraints_v1, ZWP_POINTER_CONSTRAINTS_V1_CONFINE_POINTER, &zwp_confined_pointer_v1_interface, wl_proxy_get_version((struct wl_proxy *) zwp_pointer_constraints_v1), 0, NULL, surface, pointer, region, lifetime); return (struct zwp_confined_pointer_v1 *) id;}/** * @ingroup iface_zwp_locked_pointer_v1 * @struct zwp_locked_pointer_v1_listener */struct zwp_locked_pointer_v1_listener { /** * lock activation event * * Notification that the pointer lock of the seat's pointer is * activated. */ void (*locked)(void *data, struct zwp_locked_pointer_v1 *zwp_locked_pointer_v1); /** * lock deactivation event * * Notification that the pointer lock of the seat's pointer is no * longer active. If this is a oneshot pointer lock (see * wp_pointer_constraints.lifetime) this object is now defunct and * should be destroyed. If this is a persistent pointer lock (see * wp_pointer_constraints.lifetime) this pointer lock may again * reactivate in the future. */ void (*unlocked)(void *data, struct zwp_locked_pointer_v1 *zwp_locked_pointer_v1);};/** * @ingroup iface_zwp_locked_pointer_v1 */static inline intzwp_locked_pointer_v1_add_listener(struct zwp_locked_pointer_v1 *zwp_locked_pointer_v1, const struct zwp_locked_pointer_v1_listener *listener, void *data){ return wl_proxy_add_listener((struct wl_proxy *) zwp_locked_pointer_v1, (void (**)(void)) listener, data);}#define ZWP_LOCKED_POINTER_V1_DESTROY 0#define ZWP_LOCKED_POINTER_V1_SET_CURSOR_POSITION_HINT 1#define ZWP_LOCKED_POINTER_V1_SET_REGION 2/** * @ingroup iface_zwp_locked_pointer_v1 */#define ZWP_LOCKED_POINTER_V1_LOCKED_SINCE_VERSION 1/** * @ingroup iface_zwp_locked_pointer_v1 */#define ZWP_LOCKED_POINTER_V1_UNLOCKED_SINCE_VERSION 1/** * @ingroup iface_zwp_locked_pointer_v1 */#define ZWP_LOCKED_POINTER_V1_DESTROY_SINCE_VERSION 1/** * @ingroup iface_zwp_locked_pointer_v1 */#define ZWP_LOCKED_POINTER_V1_SET_CURSOR_POSITION_HINT_SINCE_VERSION 1/** * @ingroup iface_zwp_locked_pointer_v1 */#define ZWP_LOCKED_POINTER_V1_SET_REGION_SINCE_VERSION 1/** @ingroup iface_zwp_locked_pointer_v1 */static inline voidzwp_locked_pointer_v1_set_user_data(struct zwp_locked_pointer_v1 *zwp_locked_pointer_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) zwp_locked_pointer_v1, user_data);}/** @ingroup iface_zwp_locked_pointer_v1 */static inline void *zwp_locked_pointer_v1_get_user_data(struct zwp_locked_pointer_v1 *zwp_locked_pointer_v1){ return wl_proxy_get_user_data((struct wl_proxy *) zwp_locked_pointer_v1);}static inline uint32_tzwp_locked_pointer_v1_get_version(struct zwp_locked_pointer_v1 *zwp_locked_pointer_v1){ return wl_proxy_get_version((struct wl_proxy *) zwp_locked_pointer_v1);}/** * @ingroup iface_zwp_locked_pointer_v1 * * Destroy the locked pointer object. If applicable, the compositor will * unlock the pointer. */static inline voidzwp_locked_pointer_v1_destroy(struct zwp_locked_pointer_v1 *zwp_locked_pointer_v1){Showing the first 500 of 668 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/wayland-protocols/relative-pointer-unstable-v1-client-protocol-code.hadded
/* Generated by wayland-scanner 1.24.0 *//* * Copyright © 2014 Jonas Ådahl * Copyright © 2015 Red Hat Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include "wayland-util.h"#ifndef __has_attribute# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */#endif#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)#define WL_PRIVATE __attribute__ ((visibility("hidden")))#else#define WL_PRIVATE#endifextern const struct wl_interface wl_pointer_interface;extern const struct wl_interface zwp_relative_pointer_v1_interface;static const struct wl_interface *relative_pointer_unstable_v1_types[] = { NULL, NULL, NULL, NULL, NULL, NULL, &zwp_relative_pointer_v1_interface, &wl_pointer_interface,};static const struct wl_message zwp_relative_pointer_manager_v1_requests[] = { { "destroy", "", relative_pointer_unstable_v1_types + 0 }, { "get_relative_pointer", "no", relative_pointer_unstable_v1_types + 6 },};WL_PRIVATE const struct wl_interface zwp_relative_pointer_manager_v1_interface = { "zwp_relative_pointer_manager_v1", 1, 2, zwp_relative_pointer_manager_v1_requests, 0, NULL,};static const struct wl_message zwp_relative_pointer_v1_requests[] = { { "destroy", "", relative_pointer_unstable_v1_types + 0 },};static const struct wl_message zwp_relative_pointer_v1_events[] = { { "relative_motion", "uuffff", relative_pointer_unstable_v1_types + 0 },};WL_PRIVATE const struct wl_interface zwp_relative_pointer_v1_interface = { "zwp_relative_pointer_v1", 1, 1, zwp_relative_pointer_v1_requests, 1, zwp_relative_pointer_v1_events,};vendor/glfw/src/wayland-protocols/relative-pointer-unstable-v1-client-protocol.hadded
/* Generated by wayland-scanner 1.24.0 */#ifndef RELATIVE_POINTER_UNSTABLE_V1_CLIENT_PROTOCOL_H#define RELATIVE_POINTER_UNSTABLE_V1_CLIENT_PROTOCOL_H#include <stdint.h>#include <stddef.h>#include "wayland-client.h"#ifdef __cplusplusextern "C" {#endif/** * @page page_relative_pointer_unstable_v1 The relative_pointer_unstable_v1 protocol * protocol for relative pointer motion events * * @section page_desc_relative_pointer_unstable_v1 Description * * This protocol specifies a set of interfaces used for making clients able to * receive relative pointer events not obstructed by barriers (such as the * monitor edge or other pointer barriers). * * To start receiving relative pointer events, a client must first bind the * global interface "wp_relative_pointer_manager" which, if a compositor * supports relative pointer motion events, is exposed by the registry. After * having created the relative pointer manager proxy object, the client uses * it to create the actual relative pointer object using the * "get_relative_pointer" request given a wl_pointer. The relative pointer * motion events will then, when applicable, be transmitted via the proxy of * the newly created relative pointer object. See the documentation of the * relative pointer interface for more details. * * Warning! The protocol described in this file is experimental and backward * incompatible changes may be made. Backward compatible changes may be added * together with the corresponding interface version bump. Backward * incompatible changes are done by bumping the version number in the protocol * and interface names and resetting the interface version. Once the protocol * is to be declared stable, the 'z' prefix and the version number in the * protocol and interface names are removed and the interface version number is * reset. * * @section page_ifaces_relative_pointer_unstable_v1 Interfaces * - @subpage page_iface_zwp_relative_pointer_manager_v1 - get relative pointer objects * - @subpage page_iface_zwp_relative_pointer_v1 - relative pointer object * @section page_copyright_relative_pointer_unstable_v1 Copyright * <pre> * * Copyright © 2014 Jonas Ådahl * Copyright © 2015 Red Hat Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * </pre> */struct wl_pointer;struct zwp_relative_pointer_manager_v1;struct zwp_relative_pointer_v1;#ifndef ZWP_RELATIVE_POINTER_MANAGER_V1_INTERFACE#define ZWP_RELATIVE_POINTER_MANAGER_V1_INTERFACE/** * @page page_iface_zwp_relative_pointer_manager_v1 zwp_relative_pointer_manager_v1 * @section page_iface_zwp_relative_pointer_manager_v1_desc Description * * A global interface used for getting the relative pointer object for a * given pointer. * @section page_iface_zwp_relative_pointer_manager_v1_api API * See @ref iface_zwp_relative_pointer_manager_v1. *//** * @defgroup iface_zwp_relative_pointer_manager_v1 The zwp_relative_pointer_manager_v1 interface * * A global interface used for getting the relative pointer object for a * given pointer. */extern const struct wl_interface zwp_relative_pointer_manager_v1_interface;#endif#ifndef ZWP_RELATIVE_POINTER_V1_INTERFACE#define ZWP_RELATIVE_POINTER_V1_INTERFACE/** * @page page_iface_zwp_relative_pointer_v1 zwp_relative_pointer_v1 * @section page_iface_zwp_relative_pointer_v1_desc Description * * A wp_relative_pointer object is an extension to the wl_pointer interface * used for emitting relative pointer events. It shares the same focus as * wl_pointer objects of the same seat and will only emit events when it has * focus. * @section page_iface_zwp_relative_pointer_v1_api API * See @ref iface_zwp_relative_pointer_v1. *//** * @defgroup iface_zwp_relative_pointer_v1 The zwp_relative_pointer_v1 interface * * A wp_relative_pointer object is an extension to the wl_pointer interface * used for emitting relative pointer events. It shares the same focus as * wl_pointer objects of the same seat and will only emit events when it has * focus. */extern const struct wl_interface zwp_relative_pointer_v1_interface;#endif#define ZWP_RELATIVE_POINTER_MANAGER_V1_DESTROY 0#define ZWP_RELATIVE_POINTER_MANAGER_V1_GET_RELATIVE_POINTER 1/** * @ingroup iface_zwp_relative_pointer_manager_v1 */#define ZWP_RELATIVE_POINTER_MANAGER_V1_DESTROY_SINCE_VERSION 1/** * @ingroup iface_zwp_relative_pointer_manager_v1 */#define ZWP_RELATIVE_POINTER_MANAGER_V1_GET_RELATIVE_POINTER_SINCE_VERSION 1/** @ingroup iface_zwp_relative_pointer_manager_v1 */static inline voidzwp_relative_pointer_manager_v1_set_user_data(struct zwp_relative_pointer_manager_v1 *zwp_relative_pointer_manager_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) zwp_relative_pointer_manager_v1, user_data);}/** @ingroup iface_zwp_relative_pointer_manager_v1 */static inline void *zwp_relative_pointer_manager_v1_get_user_data(struct zwp_relative_pointer_manager_v1 *zwp_relative_pointer_manager_v1){ return wl_proxy_get_user_data((struct wl_proxy *) zwp_relative_pointer_manager_v1);}static inline uint32_tzwp_relative_pointer_manager_v1_get_version(struct zwp_relative_pointer_manager_v1 *zwp_relative_pointer_manager_v1){ return wl_proxy_get_version((struct wl_proxy *) zwp_relative_pointer_manager_v1);}/** * @ingroup iface_zwp_relative_pointer_manager_v1 * * Used by the client to notify the server that it will no longer use this * relative pointer manager object. */static inline voidzwp_relative_pointer_manager_v1_destroy(struct zwp_relative_pointer_manager_v1 *zwp_relative_pointer_manager_v1){ wl_proxy_marshal_flags((struct wl_proxy *) zwp_relative_pointer_manager_v1, ZWP_RELATIVE_POINTER_MANAGER_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_relative_pointer_manager_v1), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_zwp_relative_pointer_manager_v1 * * Create a relative pointer interface given a wl_pointer object. See the * wp_relative_pointer interface for more details. */static inline struct zwp_relative_pointer_v1 *zwp_relative_pointer_manager_v1_get_relative_pointer(struct zwp_relative_pointer_manager_v1 *zwp_relative_pointer_manager_v1, struct wl_pointer *pointer){ struct wl_proxy *id; id = wl_proxy_marshal_flags((struct wl_proxy *) zwp_relative_pointer_manager_v1, ZWP_RELATIVE_POINTER_MANAGER_V1_GET_RELATIVE_POINTER, &zwp_relative_pointer_v1_interface, wl_proxy_get_version((struct wl_proxy *) zwp_relative_pointer_manager_v1), 0, NULL, pointer); return (struct zwp_relative_pointer_v1 *) id;}/** * @ingroup iface_zwp_relative_pointer_v1 * @struct zwp_relative_pointer_v1_listener */struct zwp_relative_pointer_v1_listener { /** * relative pointer motion * * Relative x/y pointer motion from the pointer of the seat * associated with this object. * * A relative motion is in the same dimension as regular wl_pointer * motion events, except they do not represent an absolute * position. For example, moving a pointer from (x, y) to (x', y') * would have the equivalent relative motion (x' - x, y' - y). If a * pointer motion caused the absolute pointer position to be * clipped by for example the edge of the monitor, the relative * motion is unaffected by the clipping and will represent the * unclipped motion. * * This event also contains non-accelerated motion deltas. The * non-accelerated delta is, when applicable, the regular pointer * motion delta as it was before having applied motion acceleration * and other transformations such as normalization. * * Note that the non-accelerated delta does not represent 'raw' * events as they were read from some device. Pointer motion * acceleration is device- and configuration-specific and * non-accelerated deltas and accelerated deltas may have the same * value on some devices. * * Relative motions are not coupled to wl_pointer.motion events, * and can be sent in combination with such events, but also * independently. There may also be scenarios where * wl_pointer.motion is sent, but there is no relative motion. The * order of an absolute and relative motion event originating from * the same physical motion is not guaranteed. * * If the client needs button events or focus state, it can receive * them from a wl_pointer object of the same seat that the * wp_relative_pointer object is associated with. * @param utime_hi high 32 bits of a 64 bit timestamp with microsecond granularity * @param utime_lo low 32 bits of a 64 bit timestamp with microsecond granularity * @param dx the x component of the motion vector * @param dy the y component of the motion vector * @param dx_unaccel the x component of the unaccelerated motion vector * @param dy_unaccel the y component of the unaccelerated motion vector */ void (*relative_motion)(void *data, struct zwp_relative_pointer_v1 *zwp_relative_pointer_v1, uint32_t utime_hi, uint32_t utime_lo, wl_fixed_t dx, wl_fixed_t dy, wl_fixed_t dx_unaccel, wl_fixed_t dy_unaccel);};/** * @ingroup iface_zwp_relative_pointer_v1 */static inline intzwp_relative_pointer_v1_add_listener(struct zwp_relative_pointer_v1 *zwp_relative_pointer_v1, const struct zwp_relative_pointer_v1_listener *listener, void *data){ return wl_proxy_add_listener((struct wl_proxy *) zwp_relative_pointer_v1, (void (**)(void)) listener, data);}#define ZWP_RELATIVE_POINTER_V1_DESTROY 0/** * @ingroup iface_zwp_relative_pointer_v1 */#define ZWP_RELATIVE_POINTER_V1_RELATIVE_MOTION_SINCE_VERSION 1/** * @ingroup iface_zwp_relative_pointer_v1 */#define ZWP_RELATIVE_POINTER_V1_DESTROY_SINCE_VERSION 1/** @ingroup iface_zwp_relative_pointer_v1 */static inline voidzwp_relative_pointer_v1_set_user_data(struct zwp_relative_pointer_v1 *zwp_relative_pointer_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) zwp_relative_pointer_v1, user_data);}/** @ingroup iface_zwp_relative_pointer_v1 */static inline void *zwp_relative_pointer_v1_get_user_data(struct zwp_relative_pointer_v1 *zwp_relative_pointer_v1){ return wl_proxy_get_user_data((struct wl_proxy *) zwp_relative_pointer_v1);}static inline uint32_tzwp_relative_pointer_v1_get_version(struct zwp_relative_pointer_v1 *zwp_relative_pointer_v1){ return wl_proxy_get_version((struct wl_proxy *) zwp_relative_pointer_v1);}/** * @ingroup iface_zwp_relative_pointer_v1 */static inline voidzwp_relative_pointer_v1_destroy(struct zwp_relative_pointer_v1 *zwp_relative_pointer_v1){ wl_proxy_marshal_flags((struct wl_proxy *) zwp_relative_pointer_v1, ZWP_RELATIVE_POINTER_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_relative_pointer_v1), WL_MARSHAL_FLAG_DESTROY);}#ifdef __cplusplus}#endif#endifvendor/glfw/src/wayland-protocols/viewporter-client-protocol-code.hadded
/* Generated by wayland-scanner 1.24.0 *//* * Copyright © 2013-2016 Collabora, Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include "wayland-util.h"#ifndef __has_attribute# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */#endif#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)#define WL_PRIVATE __attribute__ ((visibility("hidden")))#else#define WL_PRIVATE#endifextern const struct wl_interface wl_surface_interface;extern const struct wl_interface wp_viewport_interface;static const struct wl_interface *viewporter_types[] = { NULL, NULL, NULL, NULL, &wp_viewport_interface, &wl_surface_interface,};static const struct wl_message wp_viewporter_requests[] = { { "destroy", "", viewporter_types + 0 }, { "get_viewport", "no", viewporter_types + 4 },};WL_PRIVATE const struct wl_interface wp_viewporter_interface = { "wp_viewporter", 1, 2, wp_viewporter_requests, 0, NULL,};static const struct wl_message wp_viewport_requests[] = { { "destroy", "", viewporter_types + 0 }, { "set_source", "ffff", viewporter_types + 0 }, { "set_destination", "ii", viewporter_types + 0 },};WL_PRIVATE const struct wl_interface wp_viewport_interface = { "wp_viewport", 1, 3, wp_viewport_requests, 0, NULL,};vendor/glfw/src/wayland-protocols/viewporter-client-protocol.hadded
/* Generated by wayland-scanner 1.24.0 */#ifndef VIEWPORTER_CLIENT_PROTOCOL_H#define VIEWPORTER_CLIENT_PROTOCOL_H#include <stdint.h>#include <stddef.h>#include "wayland-client.h"#ifdef __cplusplusextern "C" {#endif/** * @page page_viewporter The viewporter protocol * @section page_ifaces_viewporter Interfaces * - @subpage page_iface_wp_viewporter - surface cropping and scaling * - @subpage page_iface_wp_viewport - crop and scale interface to a wl_surface * @section page_copyright_viewporter Copyright * <pre> * * Copyright © 2013-2016 Collabora, Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * </pre> */struct wl_surface;struct wp_viewport;struct wp_viewporter;#ifndef WP_VIEWPORTER_INTERFACE#define WP_VIEWPORTER_INTERFACE/** * @page page_iface_wp_viewporter wp_viewporter * @section page_iface_wp_viewporter_desc Description * * The global interface exposing surface cropping and scaling * capabilities is used to instantiate an interface extension for a * wl_surface object. This extended interface will then allow * cropping and scaling the surface contents, effectively * disconnecting the direct relationship between the buffer and the * surface size. * @section page_iface_wp_viewporter_api API * See @ref iface_wp_viewporter. *//** * @defgroup iface_wp_viewporter The wp_viewporter interface * * The global interface exposing surface cropping and scaling * capabilities is used to instantiate an interface extension for a * wl_surface object. This extended interface will then allow * cropping and scaling the surface contents, effectively * disconnecting the direct relationship between the buffer and the * surface size. */extern const struct wl_interface wp_viewporter_interface;#endif#ifndef WP_VIEWPORT_INTERFACE#define WP_VIEWPORT_INTERFACE/** * @page page_iface_wp_viewport wp_viewport * @section page_iface_wp_viewport_desc Description * * An additional interface to a wl_surface object, which allows the * client to specify the cropping and scaling of the surface * contents. * * This interface works with two concepts: the source rectangle (src_x, * src_y, src_width, src_height), and the destination size (dst_width, * dst_height). The contents of the source rectangle are scaled to the * destination size, and content outside the source rectangle is ignored. * This state is double-buffered, and is applied on the next * wl_surface.commit. * * The two parts of crop and scale state are independent: the source * rectangle, and the destination size. Initially both are unset, that * is, no scaling is applied. The whole of the current wl_buffer is * used as the source, and the surface size is as defined in * wl_surface.attach. * * If the destination size is set, it causes the surface size to become * dst_width, dst_height. The source (rectangle) is scaled to exactly * this size. This overrides whatever the attached wl_buffer size is, * unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface * has no content and therefore no size. Otherwise, the size is always * at least 1x1 in surface local coordinates. * * If the source rectangle is set, it defines what area of the wl_buffer is * taken as the source. If the source rectangle is set and the destination * size is not set, then src_width and src_height must be integers, and the * surface size becomes the source rectangle size. This results in cropping * without scaling. If src_width or src_height are not integers and * destination size is not set, the bad_size protocol error is raised when * the surface state is applied. * * The coordinate transformations from buffer pixel coordinates up to * the surface-local coordinates happen in the following order: * 1. buffer_transform (wl_surface.set_buffer_transform) * 2. buffer_scale (wl_surface.set_buffer_scale) * 3. crop and scale (wp_viewport.set*) * This means, that the source rectangle coordinates of crop and scale * are given in the coordinates after the buffer transform and scale, * i.e. in the coordinates that would be the surface-local coordinates * if the crop and scale was not applied. * * If src_x or src_y are negative, the bad_value protocol error is raised. * Otherwise, if the source rectangle is partially or completely outside of * the non-NULL wl_buffer, then the out_of_buffer protocol error is raised * when the surface state is applied. A NULL wl_buffer does not raise the * out_of_buffer error. * * If the wl_surface associated with the wp_viewport is destroyed, * all wp_viewport requests except 'destroy' raise the protocol error * no_surface. * * If the wp_viewport object is destroyed, the crop and scale * state is removed from the wl_surface. The change will be applied * on the next wl_surface.commit. * @section page_iface_wp_viewport_api API * See @ref iface_wp_viewport. *//** * @defgroup iface_wp_viewport The wp_viewport interface * * An additional interface to a wl_surface object, which allows the * client to specify the cropping and scaling of the surface * contents. * * This interface works with two concepts: the source rectangle (src_x, * src_y, src_width, src_height), and the destination size (dst_width, * dst_height). The contents of the source rectangle are scaled to the * destination size, and content outside the source rectangle is ignored. * This state is double-buffered, and is applied on the next * wl_surface.commit. * * The two parts of crop and scale state are independent: the source * rectangle, and the destination size. Initially both are unset, that * is, no scaling is applied. The whole of the current wl_buffer is * used as the source, and the surface size is as defined in * wl_surface.attach. * * If the destination size is set, it causes the surface size to become * dst_width, dst_height. The source (rectangle) is scaled to exactly * this size. This overrides whatever the attached wl_buffer size is, * unless the wl_buffer is NULL. If the wl_buffer is NULL, the surface * has no content and therefore no size. Otherwise, the size is always * at least 1x1 in surface local coordinates. * * If the source rectangle is set, it defines what area of the wl_buffer is * taken as the source. If the source rectangle is set and the destination * size is not set, then src_width and src_height must be integers, and the * surface size becomes the source rectangle size. This results in cropping * without scaling. If src_width or src_height are not integers and * destination size is not set, the bad_size protocol error is raised when * the surface state is applied. * * The coordinate transformations from buffer pixel coordinates up to * the surface-local coordinates happen in the following order: * 1. buffer_transform (wl_surface.set_buffer_transform) * 2. buffer_scale (wl_surface.set_buffer_scale) * 3. crop and scale (wp_viewport.set*) * This means, that the source rectangle coordinates of crop and scale * are given in the coordinates after the buffer transform and scale, * i.e. in the coordinates that would be the surface-local coordinates * if the crop and scale was not applied. * * If src_x or src_y are negative, the bad_value protocol error is raised. * Otherwise, if the source rectangle is partially or completely outside of * the non-NULL wl_buffer, then the out_of_buffer protocol error is raised * when the surface state is applied. A NULL wl_buffer does not raise the * out_of_buffer error. * * If the wl_surface associated with the wp_viewport is destroyed, * all wp_viewport requests except 'destroy' raise the protocol error * no_surface. * * If the wp_viewport object is destroyed, the crop and scale * state is removed from the wl_surface. The change will be applied * on the next wl_surface.commit. */extern const struct wl_interface wp_viewport_interface;#endif#ifndef WP_VIEWPORTER_ERROR_ENUM#define WP_VIEWPORTER_ERROR_ENUMenum wp_viewporter_error { /** * the surface already has a viewport object associated */ WP_VIEWPORTER_ERROR_VIEWPORT_EXISTS = 0,};#endif /* WP_VIEWPORTER_ERROR_ENUM */#define WP_VIEWPORTER_DESTROY 0#define WP_VIEWPORTER_GET_VIEWPORT 1/** * @ingroup iface_wp_viewporter */#define WP_VIEWPORTER_DESTROY_SINCE_VERSION 1/** * @ingroup iface_wp_viewporter */#define WP_VIEWPORTER_GET_VIEWPORT_SINCE_VERSION 1/** @ingroup iface_wp_viewporter */static inline voidwp_viewporter_set_user_data(struct wp_viewporter *wp_viewporter, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) wp_viewporter, user_data);}/** @ingroup iface_wp_viewporter */static inline void *wp_viewporter_get_user_data(struct wp_viewporter *wp_viewporter){ return wl_proxy_get_user_data((struct wl_proxy *) wp_viewporter);}static inline uint32_twp_viewporter_get_version(struct wp_viewporter *wp_viewporter){ return wl_proxy_get_version((struct wl_proxy *) wp_viewporter);}/** * @ingroup iface_wp_viewporter * * Informs the server that the client will not be using this * protocol object anymore. This does not affect any other objects, * wp_viewport objects included. */static inline voidwp_viewporter_destroy(struct wp_viewporter *wp_viewporter){ wl_proxy_marshal_flags((struct wl_proxy *) wp_viewporter, WP_VIEWPORTER_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) wp_viewporter), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_wp_viewporter * * Instantiate an interface extension for the given wl_surface to * crop and scale its content. If the given wl_surface already has * a wp_viewport object associated, the viewport_exists * protocol error is raised. */static inline struct wp_viewport *wp_viewporter_get_viewport(struct wp_viewporter *wp_viewporter, struct wl_surface *surface){ struct wl_proxy *id; id = wl_proxy_marshal_flags((struct wl_proxy *) wp_viewporter, WP_VIEWPORTER_GET_VIEWPORT, &wp_viewport_interface, wl_proxy_get_version((struct wl_proxy *) wp_viewporter), 0, NULL, surface); return (struct wp_viewport *) id;}#ifndef WP_VIEWPORT_ERROR_ENUM#define WP_VIEWPORT_ERROR_ENUMenum wp_viewport_error { /** * negative or zero values in width or height */ WP_VIEWPORT_ERROR_BAD_VALUE = 0, /** * destination size is not integer */ WP_VIEWPORT_ERROR_BAD_SIZE = 1, /** * source rectangle extends outside of the content area */ WP_VIEWPORT_ERROR_OUT_OF_BUFFER = 2, /** * the wl_surface was destroyed */ WP_VIEWPORT_ERROR_NO_SURFACE = 3,};#endif /* WP_VIEWPORT_ERROR_ENUM */#define WP_VIEWPORT_DESTROY 0#define WP_VIEWPORT_SET_SOURCE 1#define WP_VIEWPORT_SET_DESTINATION 2/** * @ingroup iface_wp_viewport */#define WP_VIEWPORT_DESTROY_SINCE_VERSION 1/** * @ingroup iface_wp_viewport */#define WP_VIEWPORT_SET_SOURCE_SINCE_VERSION 1/** * @ingroup iface_wp_viewport */#define WP_VIEWPORT_SET_DESTINATION_SINCE_VERSION 1/** @ingroup iface_wp_viewport */static inline voidwp_viewport_set_user_data(struct wp_viewport *wp_viewport, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) wp_viewport, user_data);}/** @ingroup iface_wp_viewport */static inline void *wp_viewport_get_user_data(struct wp_viewport *wp_viewport){ return wl_proxy_get_user_data((struct wl_proxy *) wp_viewport);}static inline uint32_twp_viewport_get_version(struct wp_viewport *wp_viewport){ return wl_proxy_get_version((struct wl_proxy *) wp_viewport);}/** * @ingroup iface_wp_viewport * * The associated wl_surface's crop and scale state is removed. * The change is applied on the next wl_surface.commit. */static inline voidwp_viewport_destroy(struct wp_viewport *wp_viewport){ wl_proxy_marshal_flags((struct wl_proxy *) wp_viewport, WP_VIEWPORT_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) wp_viewport), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_wp_viewport * * Set the source rectangle of the associated wl_surface. See * wp_viewport for the description, and relation to the wl_buffer * size. * * If all of x, y, width and height are -1.0, the source rectangle is * unset instead. Any other set of values where width or height are zero * or negative, or x or y are negative, raise the bad_value protocol * error. * * The crop and scale state is double-buffered state, and will be * applied on the next wl_surface.commit. */static inline voidwp_viewport_set_source(struct wp_viewport *wp_viewport, wl_fixed_t x, wl_fixed_t y, wl_fixed_t width, wl_fixed_t height){ wl_proxy_marshal_flags((struct wl_proxy *) wp_viewport, WP_VIEWPORT_SET_SOURCE, NULL, wl_proxy_get_version((struct wl_proxy *) wp_viewport), 0, x, y, width, height);}/** * @ingroup iface_wp_viewport * * Set the destination size of the associated wl_surface. See * wp_viewport for the description, and relation to the wl_buffer * size. * * If width is -1 and height is -1, the destination size is unset * instead. Any other pair of values for width and height that * contains zero or negative values raises the bad_value protocol * error. * * The crop and scale state is double-buffered state, and will be * applied on the next wl_surface.commit. */static inline voidwp_viewport_set_destination(struct wp_viewport *wp_viewport, int32_t width, int32_t height){ wl_proxy_marshal_flags((struct wl_proxy *) wp_viewport, WP_VIEWPORT_SET_DESTINATION, NULL, wl_proxy_get_version((struct wl_proxy *) wp_viewport), 0, width, height);}#ifdef __cplusplus}#endif#endifvendor/glfw/src/wayland-protocols/wayland-client-protocol-code.hadded
/* Generated by wayland-scanner 1.24.0 *//* * Copyright © 2008-2011 Kristian Høgsberg * Copyright © 2010-2011 Intel Corporation * Copyright © 2012-2013 Collabora, Ltd. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include "wayland-util.h"#ifndef __has_attribute# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */#endif#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)#define WL_PRIVATE __attribute__ ((visibility("hidden")))#else#define WL_PRIVATE#endifextern const struct wl_interface wl_buffer_interface;extern const struct wl_interface wl_callback_interface;extern const struct wl_interface wl_data_device_interface;extern const struct wl_interface wl_data_offer_interface;extern const struct wl_interface wl_data_source_interface;extern const struct wl_interface wl_keyboard_interface;extern const struct wl_interface wl_output_interface;extern const struct wl_interface wl_pointer_interface;extern const struct wl_interface wl_region_interface;extern const struct wl_interface wl_registry_interface;extern const struct wl_interface wl_seat_interface;extern const struct wl_interface wl_shell_surface_interface;extern const struct wl_interface wl_shm_pool_interface;extern const struct wl_interface wl_subsurface_interface;extern const struct wl_interface wl_surface_interface;extern const struct wl_interface wl_touch_interface;static const struct wl_interface *wayland_types[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &wl_callback_interface, &wl_registry_interface, &wl_surface_interface, &wl_region_interface, &wl_buffer_interface, NULL, NULL, NULL, NULL, NULL, &wl_shm_pool_interface, NULL, NULL, &wl_data_source_interface, &wl_surface_interface, &wl_surface_interface, NULL, &wl_data_source_interface, NULL, &wl_data_offer_interface, NULL, &wl_surface_interface, NULL, NULL, &wl_data_offer_interface, &wl_data_offer_interface, &wl_data_source_interface, &wl_data_device_interface, &wl_seat_interface, &wl_shell_surface_interface, &wl_surface_interface, &wl_seat_interface, NULL, &wl_seat_interface, NULL, NULL, &wl_surface_interface, NULL, NULL, NULL, NULL, NULL, &wl_output_interface, &wl_seat_interface, NULL, &wl_surface_interface, NULL, NULL, NULL, &wl_output_interface, &wl_buffer_interface, NULL, NULL, &wl_callback_interface, &wl_region_interface, &wl_region_interface, &wl_output_interface, &wl_output_interface, &wl_pointer_interface, &wl_keyboard_interface, &wl_touch_interface, NULL, &wl_surface_interface, NULL, NULL, NULL, &wl_surface_interface, NULL, NULL, NULL, &wl_surface_interface, NULL, &wl_surface_interface, NULL, NULL, &wl_surface_interface, NULL, NULL, &wl_surface_interface, NULL, NULL, NULL, &wl_subsurface_interface, &wl_surface_interface, &wl_surface_interface, &wl_surface_interface, &wl_surface_interface,};static const struct wl_message wl_display_requests[] = { { "sync", "n", wayland_types + 8 }, { "get_registry", "n", wayland_types + 9 },};static const struct wl_message wl_display_events[] = { { "error", "ous", wayland_types + 0 }, { "delete_id", "u", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_display_interface = { "wl_display", 1, 2, wl_display_requests, 2, wl_display_events,};static const struct wl_message wl_registry_requests[] = { { "bind", "usun", wayland_types + 0 },};static const struct wl_message wl_registry_events[] = { { "global", "usu", wayland_types + 0 }, { "global_remove", "u", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_registry_interface = { "wl_registry", 1, 1, wl_registry_requests, 2, wl_registry_events,};static const struct wl_message wl_callback_events[] = { { "done", "u", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_callback_interface = { "wl_callback", 1, 0, NULL, 1, wl_callback_events,};static const struct wl_message wl_compositor_requests[] = { { "create_surface", "n", wayland_types + 10 }, { "create_region", "n", wayland_types + 11 },};WL_PRIVATE const struct wl_interface wl_compositor_interface = { "wl_compositor", 6, 2, wl_compositor_requests, 0, NULL,};static const struct wl_message wl_shm_pool_requests[] = { { "create_buffer", "niiiiu", wayland_types + 12 }, { "destroy", "", wayland_types + 0 }, { "resize", "i", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_shm_pool_interface = { "wl_shm_pool", 1, 3, wl_shm_pool_requests, 0, NULL,};static const struct wl_message wl_shm_requests[] = { { "create_pool", "nhi", wayland_types + 18 },};static const struct wl_message wl_shm_events[] = { { "format", "u", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_shm_interface = { "wl_shm", 1, 1, wl_shm_requests, 1, wl_shm_events,};static const struct wl_message wl_buffer_requests[] = { { "destroy", "", wayland_types + 0 },};static const struct wl_message wl_buffer_events[] = { { "release", "", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_buffer_interface = { "wl_buffer", 1, 1, wl_buffer_requests, 1, wl_buffer_events,};static const struct wl_message wl_data_offer_requests[] = { { "accept", "u?s", wayland_types + 0 }, { "receive", "sh", wayland_types + 0 }, { "destroy", "", wayland_types + 0 }, { "finish", "3", wayland_types + 0 }, { "set_actions", "3uu", wayland_types + 0 },};static const struct wl_message wl_data_offer_events[] = { { "offer", "s", wayland_types + 0 }, { "source_actions", "3u", wayland_types + 0 }, { "action", "3u", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_data_offer_interface = { "wl_data_offer", 3, 5, wl_data_offer_requests, 3, wl_data_offer_events,};static const struct wl_message wl_data_source_requests[] = { { "offer", "s", wayland_types + 0 }, { "destroy", "", wayland_types + 0 }, { "set_actions", "3u", wayland_types + 0 },};static const struct wl_message wl_data_source_events[] = { { "target", "?s", wayland_types + 0 }, { "send", "sh", wayland_types + 0 }, { "cancelled", "", wayland_types + 0 }, { "dnd_drop_performed", "3", wayland_types + 0 }, { "dnd_finished", "3", wayland_types + 0 }, { "action", "3u", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_data_source_interface = { "wl_data_source", 3, 3, wl_data_source_requests, 6, wl_data_source_events,};static const struct wl_message wl_data_device_requests[] = { { "start_drag", "?oo?ou", wayland_types + 21 }, { "set_selection", "?ou", wayland_types + 25 }, { "release", "2", wayland_types + 0 },};static const struct wl_message wl_data_device_events[] = { { "data_offer", "n", wayland_types + 27 }, { "enter", "uoff?o", wayland_types + 28 }, { "leave", "", wayland_types + 0 }, { "motion", "uff", wayland_types + 0 }, { "drop", "", wayland_types + 0 }, { "selection", "?o", wayland_types + 33 },};WL_PRIVATE const struct wl_interface wl_data_device_interface = { "wl_data_device", 3, 3, wl_data_device_requests, 6, wl_data_device_events,};static const struct wl_message wl_data_device_manager_requests[] = { { "create_data_source", "n", wayland_types + 34 }, { "get_data_device", "no", wayland_types + 35 },};WL_PRIVATE const struct wl_interface wl_data_device_manager_interface = { "wl_data_device_manager", 3, 2, wl_data_device_manager_requests, 0, NULL,};static const struct wl_message wl_shell_requests[] = { { "get_shell_surface", "no", wayland_types + 37 },};WL_PRIVATE const struct wl_interface wl_shell_interface = { "wl_shell", 1, 1, wl_shell_requests, 0, NULL,};static const struct wl_message wl_shell_surface_requests[] = { { "pong", "u", wayland_types + 0 }, { "move", "ou", wayland_types + 39 }, { "resize", "ouu", wayland_types + 41 }, { "set_toplevel", "", wayland_types + 0 }, { "set_transient", "oiiu", wayland_types + 44 }, { "set_fullscreen", "uu?o", wayland_types + 48 }, { "set_popup", "ouoiiu", wayland_types + 51 }, { "set_maximized", "?o", wayland_types + 57 }, { "set_title", "s", wayland_types + 0 }, { "set_class", "s", wayland_types + 0 },};static const struct wl_message wl_shell_surface_events[] = { { "ping", "u", wayland_types + 0 }, { "configure", "uii", wayland_types + 0 }, { "popup_done", "", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_shell_surface_interface = { "wl_shell_surface", 1, 10, wl_shell_surface_requests, 3, wl_shell_surface_events,};static const struct wl_message wl_surface_requests[] = { { "destroy", "", wayland_types + 0 }, { "attach", "?oii", wayland_types + 58 }, { "damage", "iiii", wayland_types + 0 }, { "frame", "n", wayland_types + 61 }, { "set_opaque_region", "?o", wayland_types + 62 }, { "set_input_region", "?o", wayland_types + 63 }, { "commit", "", wayland_types + 0 }, { "set_buffer_transform", "2i", wayland_types + 0 }, { "set_buffer_scale", "3i", wayland_types + 0 }, { "damage_buffer", "4iiii", wayland_types + 0 }, { "offset", "5ii", wayland_types + 0 },};static const struct wl_message wl_surface_events[] = { { "enter", "o", wayland_types + 64 }, { "leave", "o", wayland_types + 65 }, { "preferred_buffer_scale", "6i", wayland_types + 0 }, { "preferred_buffer_transform", "6u", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_surface_interface = { "wl_surface", 6, 11, wl_surface_requests, 4, wl_surface_events,};static const struct wl_message wl_seat_requests[] = { { "get_pointer", "n", wayland_types + 66 }, { "get_keyboard", "n", wayland_types + 67 }, { "get_touch", "n", wayland_types + 68 }, { "release", "5", wayland_types + 0 },};static const struct wl_message wl_seat_events[] = { { "capabilities", "u", wayland_types + 0 }, { "name", "2s", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_seat_interface = { "wl_seat", 9, 4, wl_seat_requests, 2, wl_seat_events,};static const struct wl_message wl_pointer_requests[] = { { "set_cursor", "u?oii", wayland_types + 69 }, { "release", "3", wayland_types + 0 },};static const struct wl_message wl_pointer_events[] = { { "enter", "uoff", wayland_types + 73 }, { "leave", "uo", wayland_types + 77 }, { "motion", "uff", wayland_types + 0 }, { "button", "uuuu", wayland_types + 0 }, { "axis", "uuf", wayland_types + 0 }, { "frame", "5", wayland_types + 0 }, { "axis_source", "5u", wayland_types + 0 }, { "axis_stop", "5uu", wayland_types + 0 }, { "axis_discrete", "5ui", wayland_types + 0 }, { "axis_value120", "8ui", wayland_types + 0 }, { "axis_relative_direction", "9uu", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_pointer_interface = { "wl_pointer", 9, 2, wl_pointer_requests, 11, wl_pointer_events,};static const struct wl_message wl_keyboard_requests[] = { { "release", "3", wayland_types + 0 },};static const struct wl_message wl_keyboard_events[] = { { "keymap", "uhu", wayland_types + 0 }, { "enter", "uoa", wayland_types + 79 }, { "leave", "uo", wayland_types + 82 }, { "key", "uuuu", wayland_types + 0 }, { "modifiers", "uuuuu", wayland_types + 0 }, { "repeat_info", "4ii", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_keyboard_interface = { "wl_keyboard", 9, 1, wl_keyboard_requests, 6, wl_keyboard_events,};static const struct wl_message wl_touch_requests[] = { { "release", "3", wayland_types + 0 },};static const struct wl_message wl_touch_events[] = { { "down", "uuoiff", wayland_types + 84 }, { "up", "uui", wayland_types + 0 }, { "motion", "uiff", wayland_types + 0 }, { "frame", "", wayland_types + 0 }, { "cancel", "", wayland_types + 0 }, { "shape", "6iff", wayland_types + 0 }, { "orientation", "6if", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_touch_interface = { "wl_touch", 9, 1, wl_touch_requests, 7, wl_touch_events,};static const struct wl_message wl_output_requests[] = { { "release", "3", wayland_types + 0 },};static const struct wl_message wl_output_events[] = { { "geometry", "iiiiissi", wayland_types + 0 }, { "mode", "uiii", wayland_types + 0 }, { "done", "2", wayland_types + 0 }, { "scale", "2i", wayland_types + 0 }, { "name", "4s", wayland_types + 0 }, { "description", "4s", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_output_interface = { "wl_output", 4, 1, wl_output_requests, 6, wl_output_events,};static const struct wl_message wl_region_requests[] = { { "destroy", "", wayland_types + 0 }, { "add", "iiii", wayland_types + 0 }, { "subtract", "iiii", wayland_types + 0 },};WL_PRIVATE const struct wl_interface wl_region_interface = { "wl_region", 1, 3, wl_region_requests, 0, NULL,};Showing the first 500 of 526 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/wayland-protocols/wayland-client-protocol.hadded
/* Generated by wayland-scanner 1.24.0 */#ifndef WAYLAND_CLIENT_PROTOCOL_H#define WAYLAND_CLIENT_PROTOCOL_H#include <stdint.h>#include <stddef.h>#include "wayland-client.h"#ifdef __cplusplusextern "C" {#endif/** * @page page_wayland The wayland protocol * @section page_ifaces_wayland Interfaces * - @subpage page_iface_wl_display - core global object * - @subpage page_iface_wl_registry - global registry object * - @subpage page_iface_wl_callback - callback object * - @subpage page_iface_wl_compositor - the compositor singleton * - @subpage page_iface_wl_shm_pool - a shared memory pool * - @subpage page_iface_wl_shm - shared memory support * - @subpage page_iface_wl_buffer - content for a wl_surface * - @subpage page_iface_wl_data_offer - offer to transfer data * - @subpage page_iface_wl_data_source - offer to transfer data * - @subpage page_iface_wl_data_device - data transfer device * - @subpage page_iface_wl_data_device_manager - data transfer interface * - @subpage page_iface_wl_shell - create desktop-style surfaces * - @subpage page_iface_wl_shell_surface - desktop-style metadata interface * - @subpage page_iface_wl_surface - an onscreen surface * - @subpage page_iface_wl_seat - group of input devices * - @subpage page_iface_wl_pointer - pointer input device * - @subpage page_iface_wl_keyboard - keyboard input device * - @subpage page_iface_wl_touch - touchscreen input device * - @subpage page_iface_wl_output - compositor output region * - @subpage page_iface_wl_region - region interface * - @subpage page_iface_wl_subcompositor - sub-surface compositing * - @subpage page_iface_wl_subsurface - sub-surface interface to a wl_surface * @section page_copyright_wayland Copyright * <pre> * * Copyright © 2008-2011 Kristian Høgsberg * Copyright © 2010-2011 Intel Corporation * Copyright © 2012-2013 Collabora, Ltd. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * </pre> */struct wl_buffer;struct wl_callback;struct wl_compositor;struct wl_data_device;struct wl_data_device_manager;struct wl_data_offer;struct wl_data_source;struct wl_display;struct wl_keyboard;struct wl_output;struct wl_pointer;struct wl_region;struct wl_registry;struct wl_seat;struct wl_shell;struct wl_shell_surface;struct wl_shm;struct wl_shm_pool;struct wl_subcompositor;struct wl_subsurface;struct wl_surface;struct wl_touch;#ifndef WL_DISPLAY_INTERFACE#define WL_DISPLAY_INTERFACE/** * @page page_iface_wl_display wl_display * @section page_iface_wl_display_desc Description * * The core global object. This is a special singleton object. It * is used for internal Wayland protocol features. * @section page_iface_wl_display_api API * See @ref iface_wl_display. *//** * @defgroup iface_wl_display The wl_display interface * * The core global object. This is a special singleton object. It * is used for internal Wayland protocol features. */extern const struct wl_interface wl_display_interface;#endif#ifndef WL_REGISTRY_INTERFACE#define WL_REGISTRY_INTERFACE/** * @page page_iface_wl_registry wl_registry * @section page_iface_wl_registry_desc Description * * The singleton global registry object. The server has a number of * global objects that are available to all clients. These objects * typically represent an actual object in the server (for example, * an input device) or they are singleton objects that provide * extension functionality. * * When a client creates a registry object, the registry object * will emit a global event for each global currently in the * registry. Globals come and go as a result of device or * monitor hotplugs, reconfiguration or other events, and the * registry will send out global and global_remove events to * keep the client up to date with the changes. To mark the end * of the initial burst of events, the client can use the * wl_display.sync request immediately after calling * wl_display.get_registry. * * A client can bind to a global object by using the bind * request. This creates a client-side handle that lets the object * emit events to the client and lets the client invoke requests on * the object. * @section page_iface_wl_registry_api API * See @ref iface_wl_registry. *//** * @defgroup iface_wl_registry The wl_registry interface * * The singleton global registry object. The server has a number of * global objects that are available to all clients. These objects * typically represent an actual object in the server (for example, * an input device) or they are singleton objects that provide * extension functionality. * * When a client creates a registry object, the registry object * will emit a global event for each global currently in the * registry. Globals come and go as a result of device or * monitor hotplugs, reconfiguration or other events, and the * registry will send out global and global_remove events to * keep the client up to date with the changes. To mark the end * of the initial burst of events, the client can use the * wl_display.sync request immediately after calling * wl_display.get_registry. * * A client can bind to a global object by using the bind * request. This creates a client-side handle that lets the object * emit events to the client and lets the client invoke requests on * the object. */extern const struct wl_interface wl_registry_interface;#endif#ifndef WL_CALLBACK_INTERFACE#define WL_CALLBACK_INTERFACE/** * @page page_iface_wl_callback wl_callback * @section page_iface_wl_callback_desc Description * * Clients can handle the 'done' event to get notified when * the related request is done. * * Note, because wl_callback objects are created from multiple independent * factory interfaces, the wl_callback interface is frozen at version 1. * @section page_iface_wl_callback_api API * See @ref iface_wl_callback. *//** * @defgroup iface_wl_callback The wl_callback interface * * Clients can handle the 'done' event to get notified when * the related request is done. * * Note, because wl_callback objects are created from multiple independent * factory interfaces, the wl_callback interface is frozen at version 1. */extern const struct wl_interface wl_callback_interface;#endif#ifndef WL_COMPOSITOR_INTERFACE#define WL_COMPOSITOR_INTERFACE/** * @page page_iface_wl_compositor wl_compositor * @section page_iface_wl_compositor_desc Description * * A compositor. This object is a singleton global. The * compositor is in charge of combining the contents of multiple * surfaces into one displayable output. * @section page_iface_wl_compositor_api API * See @ref iface_wl_compositor. *//** * @defgroup iface_wl_compositor The wl_compositor interface * * A compositor. This object is a singleton global. The * compositor is in charge of combining the contents of multiple * surfaces into one displayable output. */extern const struct wl_interface wl_compositor_interface;#endif#ifndef WL_SHM_POOL_INTERFACE#define WL_SHM_POOL_INTERFACE/** * @page page_iface_wl_shm_pool wl_shm_pool * @section page_iface_wl_shm_pool_desc Description * * The wl_shm_pool object encapsulates a piece of memory shared * between the compositor and client. Through the wl_shm_pool * object, the client can allocate shared memory wl_buffer objects. * All objects created through the same pool share the same * underlying mapped memory. Reusing the mapped memory avoids the * setup/teardown overhead and is useful when interactively resizing * a surface or for many small buffers. * @section page_iface_wl_shm_pool_api API * See @ref iface_wl_shm_pool. *//** * @defgroup iface_wl_shm_pool The wl_shm_pool interface * * The wl_shm_pool object encapsulates a piece of memory shared * between the compositor and client. Through the wl_shm_pool * object, the client can allocate shared memory wl_buffer objects. * All objects created through the same pool share the same * underlying mapped memory. Reusing the mapped memory avoids the * setup/teardown overhead and is useful when interactively resizing * a surface or for many small buffers. */extern const struct wl_interface wl_shm_pool_interface;#endif#ifndef WL_SHM_INTERFACE#define WL_SHM_INTERFACE/** * @page page_iface_wl_shm wl_shm * @section page_iface_wl_shm_desc Description * * A singleton global object that provides support for shared * memory. * * Clients can create wl_shm_pool objects using the create_pool * request. * * On binding the wl_shm object one or more format events * are emitted to inform clients about the valid pixel formats * that can be used for buffers. * @section page_iface_wl_shm_api API * See @ref iface_wl_shm. *//** * @defgroup iface_wl_shm The wl_shm interface * * A singleton global object that provides support for shared * memory. * * Clients can create wl_shm_pool objects using the create_pool * request. * * On binding the wl_shm object one or more format events * are emitted to inform clients about the valid pixel formats * that can be used for buffers. */extern const struct wl_interface wl_shm_interface;#endif#ifndef WL_BUFFER_INTERFACE#define WL_BUFFER_INTERFACE/** * @page page_iface_wl_buffer wl_buffer * @section page_iface_wl_buffer_desc Description * * A buffer provides the content for a wl_surface. Buffers are * created through factory interfaces such as wl_shm, wp_linux_buffer_params * (from the linux-dmabuf protocol extension) or similar. It has a width and * a height and can be attached to a wl_surface, but the mechanism by which a * client provides and updates the contents is defined by the buffer factory * interface. * * If the buffer uses a format that has an alpha channel, the alpha channel * is assumed to be premultiplied in the color channels unless otherwise * specified. * * Note, because wl_buffer objects are created from multiple independent * factory interfaces, the wl_buffer interface is frozen at version 1. * @section page_iface_wl_buffer_api API * See @ref iface_wl_buffer. *//** * @defgroup iface_wl_buffer The wl_buffer interface * * A buffer provides the content for a wl_surface. Buffers are * created through factory interfaces such as wl_shm, wp_linux_buffer_params * (from the linux-dmabuf protocol extension) or similar. It has a width and * a height and can be attached to a wl_surface, but the mechanism by which a * client provides and updates the contents is defined by the buffer factory * interface. * * If the buffer uses a format that has an alpha channel, the alpha channel * is assumed to be premultiplied in the color channels unless otherwise * specified. * * Note, because wl_buffer objects are created from multiple independent * factory interfaces, the wl_buffer interface is frozen at version 1. */extern const struct wl_interface wl_buffer_interface;#endif#ifndef WL_DATA_OFFER_INTERFACE#define WL_DATA_OFFER_INTERFACE/** * @page page_iface_wl_data_offer wl_data_offer * @section page_iface_wl_data_offer_desc Description * * A wl_data_offer represents a piece of data offered for transfer * by another client (the source client). It is used by the * copy-and-paste and drag-and-drop mechanisms. The offer * describes the different mime types that the data can be * converted to and provides the mechanism for transferring the * data directly from the source client. * @section page_iface_wl_data_offer_api API * See @ref iface_wl_data_offer. *//** * @defgroup iface_wl_data_offer The wl_data_offer interface * * A wl_data_offer represents a piece of data offered for transfer * by another client (the source client). It is used by the * copy-and-paste and drag-and-drop mechanisms. The offer * describes the different mime types that the data can be * converted to and provides the mechanism for transferring the * data directly from the source client. */extern const struct wl_interface wl_data_offer_interface;#endif#ifndef WL_DATA_SOURCE_INTERFACE#define WL_DATA_SOURCE_INTERFACE/** * @page page_iface_wl_data_source wl_data_source * @section page_iface_wl_data_source_desc Description * * The wl_data_source object is the source side of a wl_data_offer. * It is created by the source client in a data transfer and * provides a way to describe the offered data and a way to respond * to requests to transfer the data. * @section page_iface_wl_data_source_api API * See @ref iface_wl_data_source. *//** * @defgroup iface_wl_data_source The wl_data_source interface * * The wl_data_source object is the source side of a wl_data_offer. * It is created by the source client in a data transfer and * provides a way to describe the offered data and a way to respond * to requests to transfer the data. */extern const struct wl_interface wl_data_source_interface;#endif#ifndef WL_DATA_DEVICE_INTERFACE#define WL_DATA_DEVICE_INTERFACE/** * @page page_iface_wl_data_device wl_data_device * @section page_iface_wl_data_device_desc Description * * There is one wl_data_device per seat which can be obtained * from the global wl_data_device_manager singleton. * * A wl_data_device provides access to inter-client data transfer * mechanisms such as copy-and-paste and drag-and-drop. * @section page_iface_wl_data_device_api API * See @ref iface_wl_data_device. *//** * @defgroup iface_wl_data_device The wl_data_device interface * * There is one wl_data_device per seat which can be obtained * from the global wl_data_device_manager singleton. * * A wl_data_device provides access to inter-client data transfer * mechanisms such as copy-and-paste and drag-and-drop. */extern const struct wl_interface wl_data_device_interface;#endif#ifndef WL_DATA_DEVICE_MANAGER_INTERFACE#define WL_DATA_DEVICE_MANAGER_INTERFACE/** * @page page_iface_wl_data_device_manager wl_data_device_manager * @section page_iface_wl_data_device_manager_desc Description * * The wl_data_device_manager is a singleton global object that * provides access to inter-client data transfer mechanisms such as * copy-and-paste and drag-and-drop. These mechanisms are tied to * a wl_seat and this interface lets a client get a wl_data_device * corresponding to a wl_seat. * * Depending on the version bound, the objects created from the bound * wl_data_device_manager object will have different requirements for * functioning properly. See wl_data_source.set_actions, * wl_data_offer.accept and wl_data_offer.finish for details. * @section page_iface_wl_data_device_manager_api API * See @ref iface_wl_data_device_manager. *//** * @defgroup iface_wl_data_device_manager The wl_data_device_manager interface * * The wl_data_device_manager is a singleton global object that * provides access to inter-client data transfer mechanisms such as * copy-and-paste and drag-and-drop. These mechanisms are tied to * a wl_seat and this interface lets a client get a wl_data_device * corresponding to a wl_seat. * * Depending on the version bound, the objects created from the bound * wl_data_device_manager object will have different requirements for * functioning properly. See wl_data_source.set_actions, * wl_data_offer.accept and wl_data_offer.finish for details. */extern const struct wl_interface wl_data_device_manager_interface;#endif#ifndef WL_SHELL_INTERFACE#define WL_SHELL_INTERFACE/** * @page page_iface_wl_shell wl_shell * @section page_iface_wl_shell_desc Description * * This interface is implemented by servers that provide * desktop-style user interfaces. * * It allows clients to associate a wl_shell_surface with * a basic surface. * * Note! This protocol is deprecated and not intended for production use. * For desktop-style user interfaces, use xdg_shell. Compositors and clients * should not implement this interface. * @section page_iface_wl_shell_api API * See @ref iface_wl_shell. *//** * @defgroup iface_wl_shell The wl_shell interface * * This interface is implemented by servers that provide * desktop-style user interfaces. * * It allows clients to associate a wl_shell_surface with * a basic surface. * * Note! This protocol is deprecated and not intended for production use. * For desktop-style user interfaces, use xdg_shell. Compositors and clients * should not implement this interface. */extern const struct wl_interface wl_shell_interface;#endif#ifndef WL_SHELL_SURFACE_INTERFACE#define WL_SHELL_SURFACE_INTERFACE/** * @page page_iface_wl_shell_surface wl_shell_surface * @section page_iface_wl_shell_surface_desc Description * * An interface that may be implemented by a wl_surface, for * implementations that provide a desktop-style user interface. * * It provides requests to treat surfaces like toplevel, fullscreen * or popup windows, move, resize or maximize them, associate * metadata like title and class, etc. * * On the server side the object is automatically destroyed when * the related wl_surface is destroyed. On the client side, * wl_shell_surface_destroy() must be called before destroying * the wl_surface object. * @section page_iface_wl_shell_surface_api API * See @ref iface_wl_shell_surface. *//** * @defgroup iface_wl_shell_surface The wl_shell_surface interface * * An interface that may be implemented by a wl_surface, for * implementations that provide a desktop-style user interface. * * It provides requests to treat surfaces like toplevel, fullscreen * or popup windows, move, resize or maximize them, associate * metadata like title and class, etc. * * On the server side the object is automatically destroyed when * the related wl_surface is destroyed. On the client side, * wl_shell_surface_destroy() must be called before destroying * the wl_surface object. */extern const struct wl_interface wl_shell_surface_interface;#endif#ifndef WL_SURFACE_INTERFACE#define WL_SURFACE_INTERFACE/** * @page page_iface_wl_surface wl_surface * @section page_iface_wl_surface_desc Description *Showing the first 500 of 6237 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/wayland-protocols/xdg-activation-v1-client-protocol-code.hadded
/* Generated by wayland-scanner 1.24.0 *//* * Copyright © 2020 Aleix Pol Gonzalez <aleixpol@kde.org> * Copyright © 2020 Carlos Garnacho <carlosg@gnome.org> * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include "wayland-util.h"#ifndef __has_attribute# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */#endif#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)#define WL_PRIVATE __attribute__ ((visibility("hidden")))#else#define WL_PRIVATE#endifextern const struct wl_interface wl_seat_interface;extern const struct wl_interface wl_surface_interface;extern const struct wl_interface xdg_activation_token_v1_interface;static const struct wl_interface *xdg_activation_v1_types[] = { NULL, &xdg_activation_token_v1_interface, NULL, &wl_surface_interface, NULL, &wl_seat_interface, &wl_surface_interface,};static const struct wl_message xdg_activation_v1_requests[] = { { "destroy", "", xdg_activation_v1_types + 0 }, { "get_activation_token", "n", xdg_activation_v1_types + 1 }, { "activate", "so", xdg_activation_v1_types + 2 },};WL_PRIVATE const struct wl_interface xdg_activation_v1_interface = { "xdg_activation_v1", 1, 3, xdg_activation_v1_requests, 0, NULL,};static const struct wl_message xdg_activation_token_v1_requests[] = { { "set_serial", "uo", xdg_activation_v1_types + 4 }, { "set_app_id", "s", xdg_activation_v1_types + 0 }, { "set_surface", "o", xdg_activation_v1_types + 6 }, { "commit", "", xdg_activation_v1_types + 0 }, { "destroy", "", xdg_activation_v1_types + 0 },};static const struct wl_message xdg_activation_token_v1_events[] = { { "done", "s", xdg_activation_v1_types + 0 },};WL_PRIVATE const struct wl_interface xdg_activation_token_v1_interface = { "xdg_activation_token_v1", 1, 5, xdg_activation_token_v1_requests, 1, xdg_activation_token_v1_events,};vendor/glfw/src/wayland-protocols/xdg-activation-v1-client-protocol.hadded
/* Generated by wayland-scanner 1.24.0 */#ifndef XDG_ACTIVATION_V1_CLIENT_PROTOCOL_H#define XDG_ACTIVATION_V1_CLIENT_PROTOCOL_H#include <stdint.h>#include <stddef.h>#include "wayland-client.h"#ifdef __cplusplusextern "C" {#endif/** * @page page_xdg_activation_v1 The xdg_activation_v1 protocol * Protocol for requesting activation of surfaces * * @section page_desc_xdg_activation_v1 Description * * The way for a client to pass focus to another toplevel is as follows. * * The client that intends to activate another toplevel uses the * xdg_activation_v1.get_activation_token request to get an activation token. * This token is then forwarded to the client, which is supposed to activate * one of its surfaces, through a separate band of communication. * * One established way of doing this is through the XDG_ACTIVATION_TOKEN * environment variable of a newly launched child process. The child process * should unset the environment variable again right after reading it out in * order to avoid propagating it to other child processes. * * Another established way exists for Applications implementing the D-Bus * interface org.freedesktop.Application, which should get their token under * activation-token on their platform_data. * * In general activation tokens may be transferred across clients through * means not described in this protocol. * * The client to be activated will then pass the token * it received to the xdg_activation_v1.activate request. The compositor can * then use this token to decide how to react to the activation request. * * The token the activating client gets may be ineffective either already at * the time it receives it, for example if it was not focused, for focus * stealing prevention. The activating client will have no way to discover * the validity of the token, and may still forward it to the to be activated * client. * * The created activation token may optionally get information attached to it * that can be used by the compositor to identify the application that we * intend to activate. This can for example be used to display a visual hint * about what application is being started. * * Warning! The protocol described in this file is currently in the testing * phase. Backward compatible changes may be added together with the * corresponding interface version bump. Backward incompatible changes can * only be done by creating a new major version of the extension. * * @section page_ifaces_xdg_activation_v1 Interfaces * - @subpage page_iface_xdg_activation_v1 - interface for activating surfaces * - @subpage page_iface_xdg_activation_token_v1 - an exported activation handle * @section page_copyright_xdg_activation_v1 Copyright * <pre> * * Copyright © 2020 Aleix Pol Gonzalez <aleixpol@kde.org> * Copyright © 2020 Carlos Garnacho <carlosg@gnome.org> * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * </pre> */struct wl_seat;struct wl_surface;struct xdg_activation_token_v1;struct xdg_activation_v1;#ifndef XDG_ACTIVATION_V1_INTERFACE#define XDG_ACTIVATION_V1_INTERFACE/** * @page page_iface_xdg_activation_v1 xdg_activation_v1 * @section page_iface_xdg_activation_v1_desc Description * * A global interface used for informing the compositor about applications * being activated or started, or for applications to request to be * activated. * @section page_iface_xdg_activation_v1_api API * See @ref iface_xdg_activation_v1. *//** * @defgroup iface_xdg_activation_v1 The xdg_activation_v1 interface * * A global interface used for informing the compositor about applications * being activated or started, or for applications to request to be * activated. */extern const struct wl_interface xdg_activation_v1_interface;#endif#ifndef XDG_ACTIVATION_TOKEN_V1_INTERFACE#define XDG_ACTIVATION_TOKEN_V1_INTERFACE/** * @page page_iface_xdg_activation_token_v1 xdg_activation_token_v1 * @section page_iface_xdg_activation_token_v1_desc Description * * An object for setting up a token and receiving a token handle that can * be passed as an activation token to another client. * * The object is created using the xdg_activation_v1.get_activation_token * request. This object should then be populated with the app_id, surface * and serial information and committed. The compositor shall then issue a * done event with the token. In case the request's parameters are invalid, * the compositor will provide an invalid token. * @section page_iface_xdg_activation_token_v1_api API * See @ref iface_xdg_activation_token_v1. *//** * @defgroup iface_xdg_activation_token_v1 The xdg_activation_token_v1 interface * * An object for setting up a token and receiving a token handle that can * be passed as an activation token to another client. * * The object is created using the xdg_activation_v1.get_activation_token * request. This object should then be populated with the app_id, surface * and serial information and committed. The compositor shall then issue a * done event with the token. In case the request's parameters are invalid, * the compositor will provide an invalid token. */extern const struct wl_interface xdg_activation_token_v1_interface;#endif#define XDG_ACTIVATION_V1_DESTROY 0#define XDG_ACTIVATION_V1_GET_ACTIVATION_TOKEN 1#define XDG_ACTIVATION_V1_ACTIVATE 2/** * @ingroup iface_xdg_activation_v1 */#define XDG_ACTIVATION_V1_DESTROY_SINCE_VERSION 1/** * @ingroup iface_xdg_activation_v1 */#define XDG_ACTIVATION_V1_GET_ACTIVATION_TOKEN_SINCE_VERSION 1/** * @ingroup iface_xdg_activation_v1 */#define XDG_ACTIVATION_V1_ACTIVATE_SINCE_VERSION 1/** @ingroup iface_xdg_activation_v1 */static inline voidxdg_activation_v1_set_user_data(struct xdg_activation_v1 *xdg_activation_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) xdg_activation_v1, user_data);}/** @ingroup iface_xdg_activation_v1 */static inline void *xdg_activation_v1_get_user_data(struct xdg_activation_v1 *xdg_activation_v1){ return wl_proxy_get_user_data((struct wl_proxy *) xdg_activation_v1);}static inline uint32_txdg_activation_v1_get_version(struct xdg_activation_v1 *xdg_activation_v1){ return wl_proxy_get_version((struct wl_proxy *) xdg_activation_v1);}/** * @ingroup iface_xdg_activation_v1 * * Notify the compositor that the xdg_activation object will no longer be * used. * * The child objects created via this interface are unaffected and should * be destroyed separately. */static inline voidxdg_activation_v1_destroy(struct xdg_activation_v1 *xdg_activation_v1){ wl_proxy_marshal_flags((struct wl_proxy *) xdg_activation_v1, XDG_ACTIVATION_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) xdg_activation_v1), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_xdg_activation_v1 * * Creates an xdg_activation_token_v1 object that will provide * the initiating client with a unique token for this activation. This * token should be offered to the clients to be activated. */static inline struct xdg_activation_token_v1 *xdg_activation_v1_get_activation_token(struct xdg_activation_v1 *xdg_activation_v1){ struct wl_proxy *id; id = wl_proxy_marshal_flags((struct wl_proxy *) xdg_activation_v1, XDG_ACTIVATION_V1_GET_ACTIVATION_TOKEN, &xdg_activation_token_v1_interface, wl_proxy_get_version((struct wl_proxy *) xdg_activation_v1), 0, NULL); return (struct xdg_activation_token_v1 *) id;}/** * @ingroup iface_xdg_activation_v1 * * Requests surface activation. It's up to the compositor to display * this information as desired, for example by placing the surface above * the rest. * * The compositor may know who requested this by checking the activation * token and might decide not to follow through with the activation if it's * considered unwanted. * * Compositors can ignore unknown activation tokens when an invalid * token is passed. */static inline voidxdg_activation_v1_activate(struct xdg_activation_v1 *xdg_activation_v1, const char *token, struct wl_surface *surface){ wl_proxy_marshal_flags((struct wl_proxy *) xdg_activation_v1, XDG_ACTIVATION_V1_ACTIVATE, NULL, wl_proxy_get_version((struct wl_proxy *) xdg_activation_v1), 0, token, surface);}#ifndef XDG_ACTIVATION_TOKEN_V1_ERROR_ENUM#define XDG_ACTIVATION_TOKEN_V1_ERROR_ENUMenum xdg_activation_token_v1_error { /** * The token has already been used previously */ XDG_ACTIVATION_TOKEN_V1_ERROR_ALREADY_USED = 0,};#endif /* XDG_ACTIVATION_TOKEN_V1_ERROR_ENUM *//** * @ingroup iface_xdg_activation_token_v1 * @struct xdg_activation_token_v1_listener */struct xdg_activation_token_v1_listener { /** * the exported activation token * * The 'done' event contains the unique token of this activation * request and notifies that the provider is done. * @param token the exported activation token */ void (*done)(void *data, struct xdg_activation_token_v1 *xdg_activation_token_v1, const char *token);};/** * @ingroup iface_xdg_activation_token_v1 */static inline intxdg_activation_token_v1_add_listener(struct xdg_activation_token_v1 *xdg_activation_token_v1, const struct xdg_activation_token_v1_listener *listener, void *data){ return wl_proxy_add_listener((struct wl_proxy *) xdg_activation_token_v1, (void (**)(void)) listener, data);}#define XDG_ACTIVATION_TOKEN_V1_SET_SERIAL 0#define XDG_ACTIVATION_TOKEN_V1_SET_APP_ID 1#define XDG_ACTIVATION_TOKEN_V1_SET_SURFACE 2#define XDG_ACTIVATION_TOKEN_V1_COMMIT 3#define XDG_ACTIVATION_TOKEN_V1_DESTROY 4/** * @ingroup iface_xdg_activation_token_v1 */#define XDG_ACTIVATION_TOKEN_V1_DONE_SINCE_VERSION 1/** * @ingroup iface_xdg_activation_token_v1 */#define XDG_ACTIVATION_TOKEN_V1_SET_SERIAL_SINCE_VERSION 1/** * @ingroup iface_xdg_activation_token_v1 */#define XDG_ACTIVATION_TOKEN_V1_SET_APP_ID_SINCE_VERSION 1/** * @ingroup iface_xdg_activation_token_v1 */#define XDG_ACTIVATION_TOKEN_V1_SET_SURFACE_SINCE_VERSION 1/** * @ingroup iface_xdg_activation_token_v1 */#define XDG_ACTIVATION_TOKEN_V1_COMMIT_SINCE_VERSION 1/** * @ingroup iface_xdg_activation_token_v1 */#define XDG_ACTIVATION_TOKEN_V1_DESTROY_SINCE_VERSION 1/** @ingroup iface_xdg_activation_token_v1 */static inline voidxdg_activation_token_v1_set_user_data(struct xdg_activation_token_v1 *xdg_activation_token_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) xdg_activation_token_v1, user_data);}/** @ingroup iface_xdg_activation_token_v1 */static inline void *xdg_activation_token_v1_get_user_data(struct xdg_activation_token_v1 *xdg_activation_token_v1){ return wl_proxy_get_user_data((struct wl_proxy *) xdg_activation_token_v1);}static inline uint32_txdg_activation_token_v1_get_version(struct xdg_activation_token_v1 *xdg_activation_token_v1){ return wl_proxy_get_version((struct wl_proxy *) xdg_activation_token_v1);}/** * @ingroup iface_xdg_activation_token_v1 * * Provides information about the seat and serial event that requested the * token. * * The serial can come from an input or focus event. For instance, if a * click triggers the launch of a third-party client, the launcher client * should send a set_serial request with the serial and seat from the * wl_pointer.button event. * * Some compositors might refuse to activate toplevels when the token * doesn't have a valid and recent enough event serial. * * Must be sent before commit. This information is optional. */static inline voidxdg_activation_token_v1_set_serial(struct xdg_activation_token_v1 *xdg_activation_token_v1, uint32_t serial, struct wl_seat *seat){ wl_proxy_marshal_flags((struct wl_proxy *) xdg_activation_token_v1, XDG_ACTIVATION_TOKEN_V1_SET_SERIAL, NULL, wl_proxy_get_version((struct wl_proxy *) xdg_activation_token_v1), 0, serial, seat);}/** * @ingroup iface_xdg_activation_token_v1 * * The requesting client can specify an app_id to associate the token * being created with it. * * Must be sent before commit. This information is optional. */static inline voidxdg_activation_token_v1_set_app_id(struct xdg_activation_token_v1 *xdg_activation_token_v1, const char *app_id){ wl_proxy_marshal_flags((struct wl_proxy *) xdg_activation_token_v1, XDG_ACTIVATION_TOKEN_V1_SET_APP_ID, NULL, wl_proxy_get_version((struct wl_proxy *) xdg_activation_token_v1), 0, app_id);}/** * @ingroup iface_xdg_activation_token_v1 * * This request sets the surface requesting the activation. Note, this is * different from the surface that will be activated. * * Some compositors might refuse to activate toplevels when the token * doesn't have a requesting surface. * * Must be sent before commit. This information is optional. */static inline voidxdg_activation_token_v1_set_surface(struct xdg_activation_token_v1 *xdg_activation_token_v1, struct wl_surface *surface){ wl_proxy_marshal_flags((struct wl_proxy *) xdg_activation_token_v1, XDG_ACTIVATION_TOKEN_V1_SET_SURFACE, NULL, wl_proxy_get_version((struct wl_proxy *) xdg_activation_token_v1), 0, surface);}/** * @ingroup iface_xdg_activation_token_v1 * * Requests an activation token based on the different parameters that * have been offered through set_serial, set_surface and set_app_id. */static inline voidxdg_activation_token_v1_commit(struct xdg_activation_token_v1 *xdg_activation_token_v1){ wl_proxy_marshal_flags((struct wl_proxy *) xdg_activation_token_v1, XDG_ACTIVATION_TOKEN_V1_COMMIT, NULL, wl_proxy_get_version((struct wl_proxy *) xdg_activation_token_v1), 0);}/** * @ingroup iface_xdg_activation_token_v1 * * Notify the compositor that the xdg_activation_token_v1 object will no * longer be used. The received token stays valid. */static inline voidxdg_activation_token_v1_destroy(struct xdg_activation_token_v1 *xdg_activation_token_v1){ wl_proxy_marshal_flags((struct wl_proxy *) xdg_activation_token_v1, XDG_ACTIVATION_TOKEN_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) xdg_activation_token_v1), WL_MARSHAL_FLAG_DESTROY);}#ifdef __cplusplus}#endif#endifvendor/glfw/src/wayland-protocols/xdg-decoration-unstable-v1-client-protocol-code.hadded
/* Generated by wayland-scanner 1.24.0 *//* * Copyright © 2018 Simon Ser * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include "wayland-util.h"#ifndef __has_attribute# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */#endif#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)#define WL_PRIVATE __attribute__ ((visibility("hidden")))#else#define WL_PRIVATE#endifextern const struct wl_interface xdg_toplevel_interface;extern const struct wl_interface zxdg_toplevel_decoration_v1_interface;static const struct wl_interface *xdg_decoration_unstable_v1_types[] = { NULL, &zxdg_toplevel_decoration_v1_interface, &xdg_toplevel_interface,};static const struct wl_message zxdg_decoration_manager_v1_requests[] = { { "destroy", "", xdg_decoration_unstable_v1_types + 0 }, { "get_toplevel_decoration", "no", xdg_decoration_unstable_v1_types + 1 },};WL_PRIVATE const struct wl_interface zxdg_decoration_manager_v1_interface = { "zxdg_decoration_manager_v1", 1, 2, zxdg_decoration_manager_v1_requests, 0, NULL,};static const struct wl_message zxdg_toplevel_decoration_v1_requests[] = { { "destroy", "", xdg_decoration_unstable_v1_types + 0 }, { "set_mode", "u", xdg_decoration_unstable_v1_types + 0 }, { "unset_mode", "", xdg_decoration_unstable_v1_types + 0 },};static const struct wl_message zxdg_toplevel_decoration_v1_events[] = { { "configure", "u", xdg_decoration_unstable_v1_types + 0 },};WL_PRIVATE const struct wl_interface zxdg_toplevel_decoration_v1_interface = { "zxdg_toplevel_decoration_v1", 1, 3, zxdg_toplevel_decoration_v1_requests, 1, zxdg_toplevel_decoration_v1_events,};vendor/glfw/src/wayland-protocols/xdg-decoration-unstable-v1-client-protocol.hadded
/* Generated by wayland-scanner 1.24.0 */#ifndef XDG_DECORATION_UNSTABLE_V1_CLIENT_PROTOCOL_H#define XDG_DECORATION_UNSTABLE_V1_CLIENT_PROTOCOL_H#include <stdint.h>#include <stddef.h>#include "wayland-client.h"#ifdef __cplusplusextern "C" {#endif/** * @page page_xdg_decoration_unstable_v1 The xdg_decoration_unstable_v1 protocol * @section page_ifaces_xdg_decoration_unstable_v1 Interfaces * - @subpage page_iface_zxdg_decoration_manager_v1 - window decoration manager * - @subpage page_iface_zxdg_toplevel_decoration_v1 - decoration object for a toplevel surface * @section page_copyright_xdg_decoration_unstable_v1 Copyright * <pre> * * Copyright © 2018 Simon Ser * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * </pre> */struct xdg_toplevel;struct zxdg_decoration_manager_v1;struct zxdg_toplevel_decoration_v1;#ifndef ZXDG_DECORATION_MANAGER_V1_INTERFACE#define ZXDG_DECORATION_MANAGER_V1_INTERFACE/** * @page page_iface_zxdg_decoration_manager_v1 zxdg_decoration_manager_v1 * @section page_iface_zxdg_decoration_manager_v1_desc Description * * This interface allows a compositor to announce support for server-side * decorations. * * A window decoration is a set of window controls as deemed appropriate by * the party managing them, such as user interface components used to move, * resize and change a window's state. * * A client can use this protocol to request being decorated by a supporting * compositor. * * If compositor and client do not negotiate the use of a server-side * decoration using this protocol, clients continue to self-decorate as they * see fit. * * Warning! The protocol described in this file is experimental and * backward incompatible changes may be made. Backward compatible changes * may be added together with the corresponding interface version bump. * Backward incompatible changes are done by bumping the version number in * the protocol and interface names and resetting the interface version. * Once the protocol is to be declared stable, the 'z' prefix and the * version number in the protocol and interface names are removed and the * interface version number is reset. * @section page_iface_zxdg_decoration_manager_v1_api API * See @ref iface_zxdg_decoration_manager_v1. *//** * @defgroup iface_zxdg_decoration_manager_v1 The zxdg_decoration_manager_v1 interface * * This interface allows a compositor to announce support for server-side * decorations. * * A window decoration is a set of window controls as deemed appropriate by * the party managing them, such as user interface components used to move, * resize and change a window's state. * * A client can use this protocol to request being decorated by a supporting * compositor. * * If compositor and client do not negotiate the use of a server-side * decoration using this protocol, clients continue to self-decorate as they * see fit. * * Warning! The protocol described in this file is experimental and * backward incompatible changes may be made. Backward compatible changes * may be added together with the corresponding interface version bump. * Backward incompatible changes are done by bumping the version number in * the protocol and interface names and resetting the interface version. * Once the protocol is to be declared stable, the 'z' prefix and the * version number in the protocol and interface names are removed and the * interface version number is reset. */extern const struct wl_interface zxdg_decoration_manager_v1_interface;#endif#ifndef ZXDG_TOPLEVEL_DECORATION_V1_INTERFACE#define ZXDG_TOPLEVEL_DECORATION_V1_INTERFACE/** * @page page_iface_zxdg_toplevel_decoration_v1 zxdg_toplevel_decoration_v1 * @section page_iface_zxdg_toplevel_decoration_v1_desc Description * * The decoration object allows the compositor to toggle server-side window * decorations for a toplevel surface. The client can request to switch to * another mode. * * The xdg_toplevel_decoration object must be destroyed before its * xdg_toplevel. * @section page_iface_zxdg_toplevel_decoration_v1_api API * See @ref iface_zxdg_toplevel_decoration_v1. *//** * @defgroup iface_zxdg_toplevel_decoration_v1 The zxdg_toplevel_decoration_v1 interface * * The decoration object allows the compositor to toggle server-side window * decorations for a toplevel surface. The client can request to switch to * another mode. * * The xdg_toplevel_decoration object must be destroyed before its * xdg_toplevel. */extern const struct wl_interface zxdg_toplevel_decoration_v1_interface;#endif#define ZXDG_DECORATION_MANAGER_V1_DESTROY 0#define ZXDG_DECORATION_MANAGER_V1_GET_TOPLEVEL_DECORATION 1/** * @ingroup iface_zxdg_decoration_manager_v1 */#define ZXDG_DECORATION_MANAGER_V1_DESTROY_SINCE_VERSION 1/** * @ingroup iface_zxdg_decoration_manager_v1 */#define ZXDG_DECORATION_MANAGER_V1_GET_TOPLEVEL_DECORATION_SINCE_VERSION 1/** @ingroup iface_zxdg_decoration_manager_v1 */static inline voidzxdg_decoration_manager_v1_set_user_data(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) zxdg_decoration_manager_v1, user_data);}/** @ingroup iface_zxdg_decoration_manager_v1 */static inline void *zxdg_decoration_manager_v1_get_user_data(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1){ return wl_proxy_get_user_data((struct wl_proxy *) zxdg_decoration_manager_v1);}static inline uint32_tzxdg_decoration_manager_v1_get_version(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1){ return wl_proxy_get_version((struct wl_proxy *) zxdg_decoration_manager_v1);}/** * @ingroup iface_zxdg_decoration_manager_v1 * * Destroy the decoration manager. This doesn't destroy objects created * with the manager. */static inline voidzxdg_decoration_manager_v1_destroy(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1){ wl_proxy_marshal_flags((struct wl_proxy *) zxdg_decoration_manager_v1, ZXDG_DECORATION_MANAGER_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zxdg_decoration_manager_v1), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_zxdg_decoration_manager_v1 * * Create a new decoration object associated with the given toplevel. * * Creating an xdg_toplevel_decoration from an xdg_toplevel which has a * buffer attached or committed is a client error, and any attempts by a * client to attach or manipulate a buffer prior to the first * xdg_toplevel_decoration.configure event must also be treated as * errors. */static inline struct zxdg_toplevel_decoration_v1 *zxdg_decoration_manager_v1_get_toplevel_decoration(struct zxdg_decoration_manager_v1 *zxdg_decoration_manager_v1, struct xdg_toplevel *toplevel){ struct wl_proxy *id; id = wl_proxy_marshal_flags((struct wl_proxy *) zxdg_decoration_manager_v1, ZXDG_DECORATION_MANAGER_V1_GET_TOPLEVEL_DECORATION, &zxdg_toplevel_decoration_v1_interface, wl_proxy_get_version((struct wl_proxy *) zxdg_decoration_manager_v1), 0, NULL, toplevel); return (struct zxdg_toplevel_decoration_v1 *) id;}#ifndef ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ENUM#define ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ENUMenum zxdg_toplevel_decoration_v1_error { /** * xdg_toplevel has a buffer attached before configure */ ZXDG_TOPLEVEL_DECORATION_V1_ERROR_UNCONFIGURED_BUFFER = 0, /** * xdg_toplevel already has a decoration object */ ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ALREADY_CONSTRUCTED = 1, /** * xdg_toplevel destroyed before the decoration object */ ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ORPHANED = 2,};#endif /* ZXDG_TOPLEVEL_DECORATION_V1_ERROR_ENUM */#ifndef ZXDG_TOPLEVEL_DECORATION_V1_MODE_ENUM#define ZXDG_TOPLEVEL_DECORATION_V1_MODE_ENUM/** * @ingroup iface_zxdg_toplevel_decoration_v1 * window decoration modes * * These values describe window decoration modes. */enum zxdg_toplevel_decoration_v1_mode { /** * no server-side window decoration */ ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE = 1, /** * server-side window decoration */ ZXDG_TOPLEVEL_DECORATION_V1_MODE_SERVER_SIDE = 2,};#endif /* ZXDG_TOPLEVEL_DECORATION_V1_MODE_ENUM *//** * @ingroup iface_zxdg_toplevel_decoration_v1 * @struct zxdg_toplevel_decoration_v1_listener */struct zxdg_toplevel_decoration_v1_listener { /** * suggest a surface change * * The configure event asks the client to change its decoration * mode. The configured state should not be applied immediately. * Clients must send an ack_configure in response to this event. * See xdg_surface.configure and xdg_surface.ack_configure for * details. * * A configure event can be sent at any time. The specified mode * must be obeyed by the client. * @param mode the decoration mode */ void (*configure)(void *data, struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1, uint32_t mode);};/** * @ingroup iface_zxdg_toplevel_decoration_v1 */static inline intzxdg_toplevel_decoration_v1_add_listener(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1, const struct zxdg_toplevel_decoration_v1_listener *listener, void *data){ return wl_proxy_add_listener((struct wl_proxy *) zxdg_toplevel_decoration_v1, (void (**)(void)) listener, data);}#define ZXDG_TOPLEVEL_DECORATION_V1_DESTROY 0#define ZXDG_TOPLEVEL_DECORATION_V1_SET_MODE 1#define ZXDG_TOPLEVEL_DECORATION_V1_UNSET_MODE 2/** * @ingroup iface_zxdg_toplevel_decoration_v1 */#define ZXDG_TOPLEVEL_DECORATION_V1_CONFIGURE_SINCE_VERSION 1/** * @ingroup iface_zxdg_toplevel_decoration_v1 */#define ZXDG_TOPLEVEL_DECORATION_V1_DESTROY_SINCE_VERSION 1/** * @ingroup iface_zxdg_toplevel_decoration_v1 */#define ZXDG_TOPLEVEL_DECORATION_V1_SET_MODE_SINCE_VERSION 1/** * @ingroup iface_zxdg_toplevel_decoration_v1 */#define ZXDG_TOPLEVEL_DECORATION_V1_UNSET_MODE_SINCE_VERSION 1/** @ingroup iface_zxdg_toplevel_decoration_v1 */static inline voidzxdg_toplevel_decoration_v1_set_user_data(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) zxdg_toplevel_decoration_v1, user_data);}/** @ingroup iface_zxdg_toplevel_decoration_v1 */static inline void *zxdg_toplevel_decoration_v1_get_user_data(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1){ return wl_proxy_get_user_data((struct wl_proxy *) zxdg_toplevel_decoration_v1);}static inline uint32_tzxdg_toplevel_decoration_v1_get_version(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1){ return wl_proxy_get_version((struct wl_proxy *) zxdg_toplevel_decoration_v1);}/** * @ingroup iface_zxdg_toplevel_decoration_v1 * * Switch back to a mode without any server-side decorations at the next * commit. */static inline voidzxdg_toplevel_decoration_v1_destroy(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1){ wl_proxy_marshal_flags((struct wl_proxy *) zxdg_toplevel_decoration_v1, ZXDG_TOPLEVEL_DECORATION_V1_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) zxdg_toplevel_decoration_v1), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_zxdg_toplevel_decoration_v1 * * Set the toplevel surface decoration mode. This informs the compositor * that the client prefers the provided decoration mode. * * After requesting a decoration mode, the compositor will respond by * emitting an xdg_surface.configure event. The client should then update * its content, drawing it without decorations if the received mode is * server-side decorations. The client must also acknowledge the configure * when committing the new content (see xdg_surface.ack_configure). * * The compositor can decide not to use the client's mode and enforce a * different mode instead. * * Clients whose decoration mode depend on the xdg_toplevel state may send * a set_mode request in response to an xdg_surface.configure event and wait * for the next xdg_surface.configure event to prevent unwanted state. * Such clients are responsible for preventing configure loops and must * make sure not to send multiple successive set_mode requests with the * same decoration mode. */static inline voidzxdg_toplevel_decoration_v1_set_mode(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1, uint32_t mode){ wl_proxy_marshal_flags((struct wl_proxy *) zxdg_toplevel_decoration_v1, ZXDG_TOPLEVEL_DECORATION_V1_SET_MODE, NULL, wl_proxy_get_version((struct wl_proxy *) zxdg_toplevel_decoration_v1), 0, mode);}/** * @ingroup iface_zxdg_toplevel_decoration_v1 * * Unset the toplevel surface decoration mode. This informs the compositor * that the client doesn't prefer a particular decoration mode. * * This request has the same semantics as set_mode. */static inline voidzxdg_toplevel_decoration_v1_unset_mode(struct zxdg_toplevel_decoration_v1 *zxdg_toplevel_decoration_v1){ wl_proxy_marshal_flags((struct wl_proxy *) zxdg_toplevel_decoration_v1, ZXDG_TOPLEVEL_DECORATION_V1_UNSET_MODE, NULL, wl_proxy_get_version((struct wl_proxy *) zxdg_toplevel_decoration_v1), 0);}#ifdef __cplusplus}#endif#endifvendor/glfw/src/wayland-protocols/xdg-shell-client-protocol-code.hadded
/* Generated by wayland-scanner 1.24.0 *//* * Copyright © 2008-2013 Kristian Høgsberg * Copyright © 2013 Rafael Antognolli * Copyright © 2013 Jasper St. Pierre * Copyright © 2010-2013 Intel Corporation * Copyright © 2015-2017 Samsung Electronics Co., Ltd * Copyright © 2015-2017 Red Hat Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */#include <stdbool.h>#include <stdlib.h>#include <stdint.h>#include "wayland-util.h"#ifndef __has_attribute# define __has_attribute(x) 0 /* Compatibility with non-clang compilers. */#endif#if (__has_attribute(visibility) || defined(__GNUC__) && __GNUC__ >= 4)#define WL_PRIVATE __attribute__ ((visibility("hidden")))#else#define WL_PRIVATE#endifextern const struct wl_interface wl_output_interface;extern const struct wl_interface wl_seat_interface;extern const struct wl_interface wl_surface_interface;extern const struct wl_interface xdg_popup_interface;extern const struct wl_interface xdg_positioner_interface;extern const struct wl_interface xdg_surface_interface;extern const struct wl_interface xdg_toplevel_interface;static const struct wl_interface *xdg_shell_types[] = { NULL, NULL, NULL, NULL, &xdg_positioner_interface, &xdg_surface_interface, &wl_surface_interface, &xdg_toplevel_interface, &xdg_popup_interface, &xdg_surface_interface, &xdg_positioner_interface, &xdg_toplevel_interface, &wl_seat_interface, NULL, NULL, NULL, &wl_seat_interface, NULL, &wl_seat_interface, NULL, NULL, &wl_output_interface, &wl_seat_interface, NULL, &xdg_positioner_interface, NULL,};static const struct wl_message xdg_wm_base_requests[] = { { "destroy", "", xdg_shell_types + 0 }, { "create_positioner", "n", xdg_shell_types + 4 }, { "get_xdg_surface", "no", xdg_shell_types + 5 }, { "pong", "u", xdg_shell_types + 0 },};static const struct wl_message xdg_wm_base_events[] = { { "ping", "u", xdg_shell_types + 0 },};WL_PRIVATE const struct wl_interface xdg_wm_base_interface = { "xdg_wm_base", 6, 4, xdg_wm_base_requests, 1, xdg_wm_base_events,};static const struct wl_message xdg_positioner_requests[] = { { "destroy", "", xdg_shell_types + 0 }, { "set_size", "ii", xdg_shell_types + 0 }, { "set_anchor_rect", "iiii", xdg_shell_types + 0 }, { "set_anchor", "u", xdg_shell_types + 0 }, { "set_gravity", "u", xdg_shell_types + 0 }, { "set_constraint_adjustment", "u", xdg_shell_types + 0 }, { "set_offset", "ii", xdg_shell_types + 0 }, { "set_reactive", "3", xdg_shell_types + 0 }, { "set_parent_size", "3ii", xdg_shell_types + 0 }, { "set_parent_configure", "3u", xdg_shell_types + 0 },};WL_PRIVATE const struct wl_interface xdg_positioner_interface = { "xdg_positioner", 6, 10, xdg_positioner_requests, 0, NULL,};static const struct wl_message xdg_surface_requests[] = { { "destroy", "", xdg_shell_types + 0 }, { "get_toplevel", "n", xdg_shell_types + 7 }, { "get_popup", "n?oo", xdg_shell_types + 8 }, { "set_window_geometry", "iiii", xdg_shell_types + 0 }, { "ack_configure", "u", xdg_shell_types + 0 },};static const struct wl_message xdg_surface_events[] = { { "configure", "u", xdg_shell_types + 0 },};WL_PRIVATE const struct wl_interface xdg_surface_interface = { "xdg_surface", 6, 5, xdg_surface_requests, 1, xdg_surface_events,};static const struct wl_message xdg_toplevel_requests[] = { { "destroy", "", xdg_shell_types + 0 }, { "set_parent", "?o", xdg_shell_types + 11 }, { "set_title", "s", xdg_shell_types + 0 }, { "set_app_id", "s", xdg_shell_types + 0 }, { "show_window_menu", "ouii", xdg_shell_types + 12 }, { "move", "ou", xdg_shell_types + 16 }, { "resize", "ouu", xdg_shell_types + 18 }, { "set_max_size", "ii", xdg_shell_types + 0 }, { "set_min_size", "ii", xdg_shell_types + 0 }, { "set_maximized", "", xdg_shell_types + 0 }, { "unset_maximized", "", xdg_shell_types + 0 }, { "set_fullscreen", "?o", xdg_shell_types + 21 }, { "unset_fullscreen", "", xdg_shell_types + 0 }, { "set_minimized", "", xdg_shell_types + 0 },};static const struct wl_message xdg_toplevel_events[] = { { "configure", "iia", xdg_shell_types + 0 }, { "close", "", xdg_shell_types + 0 }, { "configure_bounds", "4ii", xdg_shell_types + 0 }, { "wm_capabilities", "5a", xdg_shell_types + 0 },};WL_PRIVATE const struct wl_interface xdg_toplevel_interface = { "xdg_toplevel", 6, 14, xdg_toplevel_requests, 4, xdg_toplevel_events,};static const struct wl_message xdg_popup_requests[] = { { "destroy", "", xdg_shell_types + 0 }, { "grab", "ou", xdg_shell_types + 22 }, { "reposition", "3ou", xdg_shell_types + 24 },};static const struct wl_message xdg_popup_events[] = { { "configure", "iiii", xdg_shell_types + 0 }, { "popup_done", "", xdg_shell_types + 0 }, { "repositioned", "3u", xdg_shell_types + 0 },};WL_PRIVATE const struct wl_interface xdg_popup_interface = { "xdg_popup", 6, 3, xdg_popup_requests, 3, xdg_popup_events,};vendor/glfw/src/wayland-protocols/xdg-shell-client-protocol.hadded
/* Generated by wayland-scanner 1.24.0 */#ifndef XDG_SHELL_CLIENT_PROTOCOL_H#define XDG_SHELL_CLIENT_PROTOCOL_H#include <stdint.h>#include <stddef.h>#include "wayland-client.h"#ifdef __cplusplusextern "C" {#endif/** * @page page_xdg_shell The xdg_shell protocol * @section page_ifaces_xdg_shell Interfaces * - @subpage page_iface_xdg_wm_base - create desktop-style surfaces * - @subpage page_iface_xdg_positioner - child surface positioner * - @subpage page_iface_xdg_surface - desktop user interface surface base interface * - @subpage page_iface_xdg_toplevel - toplevel surface * - @subpage page_iface_xdg_popup - short-lived, popup surfaces for menus * @section page_copyright_xdg_shell Copyright * <pre> * * Copyright © 2008-2013 Kristian Høgsberg * Copyright © 2013 Rafael Antognolli * Copyright © 2013 Jasper St. Pierre * Copyright © 2010-2013 Intel Corporation * Copyright © 2015-2017 Samsung Electronics Co., Ltd * Copyright © 2015-2017 Red Hat Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. * </pre> */struct wl_output;struct wl_seat;struct wl_surface;struct xdg_popup;struct xdg_positioner;struct xdg_surface;struct xdg_toplevel;struct xdg_wm_base;#ifndef XDG_WM_BASE_INTERFACE#define XDG_WM_BASE_INTERFACE/** * @page page_iface_xdg_wm_base xdg_wm_base * @section page_iface_xdg_wm_base_desc Description * * The xdg_wm_base interface is exposed as a global object enabling clients * to turn their wl_surfaces into windows in a desktop environment. It * defines the basic functionality needed for clients and the compositor to * create windows that can be dragged, resized, maximized, etc, as well as * creating transient windows such as popup menus. * @section page_iface_xdg_wm_base_api API * See @ref iface_xdg_wm_base. *//** * @defgroup iface_xdg_wm_base The xdg_wm_base interface * * The xdg_wm_base interface is exposed as a global object enabling clients * to turn their wl_surfaces into windows in a desktop environment. It * defines the basic functionality needed for clients and the compositor to * create windows that can be dragged, resized, maximized, etc, as well as * creating transient windows such as popup menus. */extern const struct wl_interface xdg_wm_base_interface;#endif#ifndef XDG_POSITIONER_INTERFACE#define XDG_POSITIONER_INTERFACE/** * @page page_iface_xdg_positioner xdg_positioner * @section page_iface_xdg_positioner_desc Description * * The xdg_positioner provides a collection of rules for the placement of a * child surface relative to a parent surface. Rules can be defined to ensure * the child surface remains within the visible area's borders, and to * specify how the child surface changes its position, such as sliding along * an axis, or flipping around a rectangle. These positioner-created rules are * constrained by the requirement that a child surface must intersect with or * be at least partially adjacent to its parent surface. * * See the various requests for details about possible rules. * * At the time of the request, the compositor makes a copy of the rules * specified by the xdg_positioner. Thus, after the request is complete the * xdg_positioner object can be destroyed or reused; further changes to the * object will have no effect on previous usages. * * For an xdg_positioner object to be considered complete, it must have a * non-zero size set by set_size, and a non-zero anchor rectangle set by * set_anchor_rect. Passing an incomplete xdg_positioner object when * positioning a surface raises an invalid_positioner error. * @section page_iface_xdg_positioner_api API * See @ref iface_xdg_positioner. *//** * @defgroup iface_xdg_positioner The xdg_positioner interface * * The xdg_positioner provides a collection of rules for the placement of a * child surface relative to a parent surface. Rules can be defined to ensure * the child surface remains within the visible area's borders, and to * specify how the child surface changes its position, such as sliding along * an axis, or flipping around a rectangle. These positioner-created rules are * constrained by the requirement that a child surface must intersect with or * be at least partially adjacent to its parent surface. * * See the various requests for details about possible rules. * * At the time of the request, the compositor makes a copy of the rules * specified by the xdg_positioner. Thus, after the request is complete the * xdg_positioner object can be destroyed or reused; further changes to the * object will have no effect on previous usages. * * For an xdg_positioner object to be considered complete, it must have a * non-zero size set by set_size, and a non-zero anchor rectangle set by * set_anchor_rect. Passing an incomplete xdg_positioner object when * positioning a surface raises an invalid_positioner error. */extern const struct wl_interface xdg_positioner_interface;#endif#ifndef XDG_SURFACE_INTERFACE#define XDG_SURFACE_INTERFACE/** * @page page_iface_xdg_surface xdg_surface * @section page_iface_xdg_surface_desc Description * * An interface that may be implemented by a wl_surface, for * implementations that provide a desktop-style user interface. * * It provides a base set of functionality required to construct user * interface elements requiring management by the compositor, such as * toplevel windows, menus, etc. The types of functionality are split into * xdg_surface roles. * * Creating an xdg_surface does not set the role for a wl_surface. In order * to map an xdg_surface, the client must create a role-specific object * using, e.g., get_toplevel, get_popup. The wl_surface for any given * xdg_surface can have at most one role, and may not be assigned any role * not based on xdg_surface. * * A role must be assigned before any other requests are made to the * xdg_surface object. * * The client must call wl_surface.commit on the corresponding wl_surface * for the xdg_surface state to take effect. * * Creating an xdg_surface from a wl_surface which has a buffer attached or * committed is a client error, and any attempts by a client to attach or * manipulate a buffer prior to the first xdg_surface.configure call must * also be treated as errors. * * After creating a role-specific object and setting it up, the client must * perform an initial commit without any buffer attached. The compositor * will reply with initial wl_surface state such as * wl_surface.preferred_buffer_scale followed by an xdg_surface.configure * event. The client must acknowledge it and is then allowed to attach a * buffer to map the surface. * * Mapping an xdg_surface-based role surface is defined as making it * possible for the surface to be shown by the compositor. Note that * a mapped surface is not guaranteed to be visible once it is mapped. * * For an xdg_surface to be mapped by the compositor, the following * conditions must be met: * (1) the client has assigned an xdg_surface-based role to the surface * (2) the client has set and committed the xdg_surface state and the * role-dependent state to the surface * (3) the client has committed a buffer to the surface * * A newly-unmapped surface is considered to have met condition (1) out * of the 3 required conditions for mapping a surface if its role surface * has not been destroyed, i.e. the client must perform the initial commit * again before attaching a buffer. * @section page_iface_xdg_surface_api API * See @ref iface_xdg_surface. *//** * @defgroup iface_xdg_surface The xdg_surface interface * * An interface that may be implemented by a wl_surface, for * implementations that provide a desktop-style user interface. * * It provides a base set of functionality required to construct user * interface elements requiring management by the compositor, such as * toplevel windows, menus, etc. The types of functionality are split into * xdg_surface roles. * * Creating an xdg_surface does not set the role for a wl_surface. In order * to map an xdg_surface, the client must create a role-specific object * using, e.g., get_toplevel, get_popup. The wl_surface for any given * xdg_surface can have at most one role, and may not be assigned any role * not based on xdg_surface. * * A role must be assigned before any other requests are made to the * xdg_surface object. * * The client must call wl_surface.commit on the corresponding wl_surface * for the xdg_surface state to take effect. * * Creating an xdg_surface from a wl_surface which has a buffer attached or * committed is a client error, and any attempts by a client to attach or * manipulate a buffer prior to the first xdg_surface.configure call must * also be treated as errors. * * After creating a role-specific object and setting it up, the client must * perform an initial commit without any buffer attached. The compositor * will reply with initial wl_surface state such as * wl_surface.preferred_buffer_scale followed by an xdg_surface.configure * event. The client must acknowledge it and is then allowed to attach a * buffer to map the surface. * * Mapping an xdg_surface-based role surface is defined as making it * possible for the surface to be shown by the compositor. Note that * a mapped surface is not guaranteed to be visible once it is mapped. * * For an xdg_surface to be mapped by the compositor, the following * conditions must be met: * (1) the client has assigned an xdg_surface-based role to the surface * (2) the client has set and committed the xdg_surface state and the * role-dependent state to the surface * (3) the client has committed a buffer to the surface * * A newly-unmapped surface is considered to have met condition (1) out * of the 3 required conditions for mapping a surface if its role surface * has not been destroyed, i.e. the client must perform the initial commit * again before attaching a buffer. */extern const struct wl_interface xdg_surface_interface;#endif#ifndef XDG_TOPLEVEL_INTERFACE#define XDG_TOPLEVEL_INTERFACE/** * @page page_iface_xdg_toplevel xdg_toplevel * @section page_iface_xdg_toplevel_desc Description * * This interface defines an xdg_surface role which allows a surface to, * among other things, set window-like properties such as maximize, * fullscreen, and minimize, set application-specific metadata like title and * id, and well as trigger user interactive operations such as interactive * resize and move. * * Unmapping an xdg_toplevel means that the surface cannot be shown * by the compositor until it is explicitly mapped again. * All active operations (e.g., move, resize) are canceled and all * attributes (e.g. title, state, stacking, ...) are discarded for * an xdg_toplevel surface when it is unmapped. The xdg_toplevel returns to * the state it had right after xdg_surface.get_toplevel. The client * can re-map the toplevel by perfoming a commit without any buffer * attached, waiting for a configure event and handling it as usual (see * xdg_surface description). * * Attaching a null buffer to a toplevel unmaps the surface. * @section page_iface_xdg_toplevel_api API * See @ref iface_xdg_toplevel. *//** * @defgroup iface_xdg_toplevel The xdg_toplevel interface * * This interface defines an xdg_surface role which allows a surface to, * among other things, set window-like properties such as maximize, * fullscreen, and minimize, set application-specific metadata like title and * id, and well as trigger user interactive operations such as interactive * resize and move. * * Unmapping an xdg_toplevel means that the surface cannot be shown * by the compositor until it is explicitly mapped again. * All active operations (e.g., move, resize) are canceled and all * attributes (e.g. title, state, stacking, ...) are discarded for * an xdg_toplevel surface when it is unmapped. The xdg_toplevel returns to * the state it had right after xdg_surface.get_toplevel. The client * can re-map the toplevel by perfoming a commit without any buffer * attached, waiting for a configure event and handling it as usual (see * xdg_surface description). * * Attaching a null buffer to a toplevel unmaps the surface. */extern const struct wl_interface xdg_toplevel_interface;#endif#ifndef XDG_POPUP_INTERFACE#define XDG_POPUP_INTERFACE/** * @page page_iface_xdg_popup xdg_popup * @section page_iface_xdg_popup_desc Description * * A popup surface is a short-lived, temporary surface. It can be used to * implement for example menus, popovers, tooltips and other similar user * interface concepts. * * A popup can be made to take an explicit grab. See xdg_popup.grab for * details. * * When the popup is dismissed, a popup_done event will be sent out, and at * the same time the surface will be unmapped. See the xdg_popup.popup_done * event for details. * * Explicitly destroying the xdg_popup object will also dismiss the popup and * unmap the surface. Clients that want to dismiss the popup when another * surface of their own is clicked should dismiss the popup using the destroy * request. * * A newly created xdg_popup will be stacked on top of all previously created * xdg_popup surfaces associated with the same xdg_toplevel. * * The parent of an xdg_popup must be mapped (see the xdg_surface * description) before the xdg_popup itself. * * The client must call wl_surface.commit on the corresponding wl_surface * for the xdg_popup state to take effect. * @section page_iface_xdg_popup_api API * See @ref iface_xdg_popup. *//** * @defgroup iface_xdg_popup The xdg_popup interface * * A popup surface is a short-lived, temporary surface. It can be used to * implement for example menus, popovers, tooltips and other similar user * interface concepts. * * A popup can be made to take an explicit grab. See xdg_popup.grab for * details. * * When the popup is dismissed, a popup_done event will be sent out, and at * the same time the surface will be unmapped. See the xdg_popup.popup_done * event for details. * * Explicitly destroying the xdg_popup object will also dismiss the popup and * unmap the surface. Clients that want to dismiss the popup when another * surface of their own is clicked should dismiss the popup using the destroy * request. * * A newly created xdg_popup will be stacked on top of all previously created * xdg_popup surfaces associated with the same xdg_toplevel. * * The parent of an xdg_popup must be mapped (see the xdg_surface * description) before the xdg_popup itself. * * The client must call wl_surface.commit on the corresponding wl_surface * for the xdg_popup state to take effect. */extern const struct wl_interface xdg_popup_interface;#endif#ifndef XDG_WM_BASE_ERROR_ENUM#define XDG_WM_BASE_ERROR_ENUMenum xdg_wm_base_error { /** * given wl_surface has another role */ XDG_WM_BASE_ERROR_ROLE = 0, /** * xdg_wm_base was destroyed before children */ XDG_WM_BASE_ERROR_DEFUNCT_SURFACES = 1, /** * the client tried to map or destroy a non-topmost popup */ XDG_WM_BASE_ERROR_NOT_THE_TOPMOST_POPUP = 2, /** * the client specified an invalid popup parent surface */ XDG_WM_BASE_ERROR_INVALID_POPUP_PARENT = 3, /** * the client provided an invalid surface state */ XDG_WM_BASE_ERROR_INVALID_SURFACE_STATE = 4, /** * the client provided an invalid positioner */ XDG_WM_BASE_ERROR_INVALID_POSITIONER = 5, /** * the client didn’t respond to a ping event in time */ XDG_WM_BASE_ERROR_UNRESPONSIVE = 6,};#endif /* XDG_WM_BASE_ERROR_ENUM *//** * @ingroup iface_xdg_wm_base * @struct xdg_wm_base_listener */struct xdg_wm_base_listener { /** * check if the client is alive * * The ping event asks the client if it's still alive. Pass the * serial specified in the event back to the compositor by sending * a "pong" request back with the specified serial. See * xdg_wm_base.pong. * * Compositors can use this to determine if the client is still * alive. It's unspecified what will happen if the client doesn't * respond to the ping request, or in what timeframe. Clients * should try to respond in a reasonable amount of time. The * “unresponsive” error is provided for compositors that wish * to disconnect unresponsive clients. * * A compositor is free to ping in any way it wants, but a client * must always respond to any xdg_wm_base object it created. * @param serial pass this to the pong request */ void (*ping)(void *data, struct xdg_wm_base *xdg_wm_base, uint32_t serial);};/** * @ingroup iface_xdg_wm_base */static inline intxdg_wm_base_add_listener(struct xdg_wm_base *xdg_wm_base, const struct xdg_wm_base_listener *listener, void *data){ return wl_proxy_add_listener((struct wl_proxy *) xdg_wm_base, (void (**)(void)) listener, data);}#define XDG_WM_BASE_DESTROY 0#define XDG_WM_BASE_CREATE_POSITIONER 1#define XDG_WM_BASE_GET_XDG_SURFACE 2#define XDG_WM_BASE_PONG 3/** * @ingroup iface_xdg_wm_base */#define XDG_WM_BASE_PING_SINCE_VERSION 1/** * @ingroup iface_xdg_wm_base */#define XDG_WM_BASE_DESTROY_SINCE_VERSION 1/** * @ingroup iface_xdg_wm_base */#define XDG_WM_BASE_CREATE_POSITIONER_SINCE_VERSION 1/** * @ingroup iface_xdg_wm_base */#define XDG_WM_BASE_GET_XDG_SURFACE_SINCE_VERSION 1/** * @ingroup iface_xdg_wm_base */#define XDG_WM_BASE_PONG_SINCE_VERSION 1/** @ingroup iface_xdg_wm_base */static inline voidxdg_wm_base_set_user_data(struct xdg_wm_base *xdg_wm_base, void *user_data){ wl_proxy_set_user_data((struct wl_proxy *) xdg_wm_base, user_data);}/** @ingroup iface_xdg_wm_base */static inline void *xdg_wm_base_get_user_data(struct xdg_wm_base *xdg_wm_base){ return wl_proxy_get_user_data((struct wl_proxy *) xdg_wm_base);}static inline uint32_txdg_wm_base_get_version(struct xdg_wm_base *xdg_wm_base){ return wl_proxy_get_version((struct wl_proxy *) xdg_wm_base);}/** * @ingroup iface_xdg_wm_base * * Destroy this xdg_wm_base object. * * Destroying a bound xdg_wm_base object while there are surfaces * still alive created by this xdg_wm_base object instance is illegal * and will result in a defunct_surfaces error. */static inline voidxdg_wm_base_destroy(struct xdg_wm_base *xdg_wm_base){ wl_proxy_marshal_flags((struct wl_proxy *) xdg_wm_base, XDG_WM_BASE_DESTROY, NULL, wl_proxy_get_version((struct wl_proxy *) xdg_wm_base), WL_MARSHAL_FLAG_DESTROY);}/** * @ingroup iface_xdg_wm_baseShowing the first 500 of 2308 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/wgl_context.cadded
//========================================================================// GLFW 3.5 WGL - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_WIN32)#include <stdlib.h>#include <assert.h>// Return the value corresponding to the specified attribute//static int findPixelFormatAttribValueWGL(const int* attribs, int attribCount, const int* values, int attrib){ int i; for (i = 0; i < attribCount; i++) { if (attribs[i] == attrib) return values[i]; } _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Unknown pixel format attribute requested"); return 0;}#define ADD_ATTRIB(a) \{ \ assert((size_t) attribCount < sizeof(attribs) / sizeof(attribs[0])); \ attribs[attribCount++] = a; \}#define FIND_ATTRIB_VALUE(a) \ findPixelFormatAttribValueWGL(attribs, attribCount, values, a)// Return a list of available and usable framebuffer configs//static int choosePixelFormatWGL(_GLFWwindow* window, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig){ _GLFWfbconfig* usableConfigs; const _GLFWfbconfig* closest; int i, pixelFormat, nativeCount, usableCount = 0, attribCount = 0; int attribs[40]; int values[sizeof(attribs) / sizeof(attribs[0])]; nativeCount = DescribePixelFormat(window->context.wgl.dc, 1, sizeof(PIXELFORMATDESCRIPTOR), NULL); if (_glfw.wgl.ARB_pixel_format) { ADD_ATTRIB(WGL_SUPPORT_OPENGL_ARB); ADD_ATTRIB(WGL_DRAW_TO_WINDOW_ARB); ADD_ATTRIB(WGL_PIXEL_TYPE_ARB); ADD_ATTRIB(WGL_ACCELERATION_ARB); ADD_ATTRIB(WGL_RED_BITS_ARB); ADD_ATTRIB(WGL_RED_SHIFT_ARB); ADD_ATTRIB(WGL_GREEN_BITS_ARB); ADD_ATTRIB(WGL_GREEN_SHIFT_ARB); ADD_ATTRIB(WGL_BLUE_BITS_ARB); ADD_ATTRIB(WGL_BLUE_SHIFT_ARB); ADD_ATTRIB(WGL_ALPHA_BITS_ARB); ADD_ATTRIB(WGL_ALPHA_SHIFT_ARB); ADD_ATTRIB(WGL_DEPTH_BITS_ARB); ADD_ATTRIB(WGL_STENCIL_BITS_ARB); ADD_ATTRIB(WGL_ACCUM_BITS_ARB); ADD_ATTRIB(WGL_ACCUM_RED_BITS_ARB); ADD_ATTRIB(WGL_ACCUM_GREEN_BITS_ARB); ADD_ATTRIB(WGL_ACCUM_BLUE_BITS_ARB); ADD_ATTRIB(WGL_ACCUM_ALPHA_BITS_ARB); ADD_ATTRIB(WGL_AUX_BUFFERS_ARB); ADD_ATTRIB(WGL_STEREO_ARB); ADD_ATTRIB(WGL_DOUBLE_BUFFER_ARB); if (_glfw.wgl.ARB_multisample) ADD_ATTRIB(WGL_SAMPLES_ARB); if (ctxconfig->client == GLFW_OPENGL_API) { if (_glfw.wgl.ARB_framebuffer_sRGB || _glfw.wgl.EXT_framebuffer_sRGB) ADD_ATTRIB(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB); } else { if (_glfw.wgl.EXT_colorspace) ADD_ATTRIB(WGL_COLORSPACE_EXT); } // NOTE: In a Parallels VM WGL_ARB_pixel_format returns fewer pixel formats than // DescribePixelFormat, violating the guarantees of the extension spec // HACK: Iterate through the minimum of both counts const int attrib = WGL_NUMBER_PIXEL_FORMATS_ARB; int extensionCount; if (!wglGetPixelFormatAttribivARB(window->context.wgl.dc, 1, 0, 1, &attrib, &extensionCount)) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Failed to retrieve pixel format attribute"); return 0; } nativeCount = _glfw_min(nativeCount, extensionCount); } usableConfigs = _glfw_calloc(nativeCount, sizeof(_GLFWfbconfig)); for (i = 0; i < nativeCount; i++) { _GLFWfbconfig* u = usableConfigs + usableCount; pixelFormat = i + 1; if (_glfw.wgl.ARB_pixel_format) { // Get pixel format attributes through "modern" extension if (!wglGetPixelFormatAttribivARB(window->context.wgl.dc, pixelFormat, 0, attribCount, attribs, values)) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Failed to retrieve pixel format attributes"); _glfw_free(usableConfigs); return 0; } if (!FIND_ATTRIB_VALUE(WGL_SUPPORT_OPENGL_ARB) || !FIND_ATTRIB_VALUE(WGL_DRAW_TO_WINDOW_ARB)) { continue; } if (FIND_ATTRIB_VALUE(WGL_PIXEL_TYPE_ARB) != WGL_TYPE_RGBA_ARB) continue; if (FIND_ATTRIB_VALUE(WGL_ACCELERATION_ARB) == WGL_NO_ACCELERATION_ARB) continue; if (FIND_ATTRIB_VALUE(WGL_DOUBLE_BUFFER_ARB) != fbconfig->doublebuffer) continue; u->redBits = FIND_ATTRIB_VALUE(WGL_RED_BITS_ARB); u->greenBits = FIND_ATTRIB_VALUE(WGL_GREEN_BITS_ARB); u->blueBits = FIND_ATTRIB_VALUE(WGL_BLUE_BITS_ARB); u->alphaBits = FIND_ATTRIB_VALUE(WGL_ALPHA_BITS_ARB); u->depthBits = FIND_ATTRIB_VALUE(WGL_DEPTH_BITS_ARB); u->stencilBits = FIND_ATTRIB_VALUE(WGL_STENCIL_BITS_ARB); u->accumRedBits = FIND_ATTRIB_VALUE(WGL_ACCUM_RED_BITS_ARB); u->accumGreenBits = FIND_ATTRIB_VALUE(WGL_ACCUM_GREEN_BITS_ARB); u->accumBlueBits = FIND_ATTRIB_VALUE(WGL_ACCUM_BLUE_BITS_ARB); u->accumAlphaBits = FIND_ATTRIB_VALUE(WGL_ACCUM_ALPHA_BITS_ARB); u->auxBuffers = FIND_ATTRIB_VALUE(WGL_AUX_BUFFERS_ARB); u->stereo = FIND_ATTRIB_VALUE(WGL_STEREO_ARB); if (_glfw.wgl.ARB_multisample) u->samples = FIND_ATTRIB_VALUE(WGL_SAMPLES_ARB); if (ctxconfig->client == GLFW_OPENGL_API) { if (_glfw.wgl.ARB_framebuffer_sRGB || _glfw.wgl.EXT_framebuffer_sRGB) u->sRGB = FIND_ATTRIB_VALUE(WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB); } else { if (_glfw.wgl.EXT_colorspace) { if (FIND_ATTRIB_VALUE(WGL_COLORSPACE_EXT) == WGL_COLORSPACE_SRGB_EXT) u->sRGB = true; } } } else { // Get pixel format attributes through legacy PFDs PIXELFORMATDESCRIPTOR pfd; if (!DescribePixelFormat(window->context.wgl.dc, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd)) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Failed to describe pixel format"); _glfw_free(usableConfigs); return 0; } if (!(pfd.dwFlags & PFD_DRAW_TO_WINDOW) || !(pfd.dwFlags & PFD_SUPPORT_OPENGL)) { continue; } if (!(pfd.dwFlags & PFD_GENERIC_ACCELERATED) && (pfd.dwFlags & PFD_GENERIC_FORMAT)) { continue; } if (pfd.iPixelType != PFD_TYPE_RGBA) continue; if (!!(pfd.dwFlags & PFD_DOUBLEBUFFER) != fbconfig->doublebuffer) continue; u->redBits = pfd.cRedBits; u->greenBits = pfd.cGreenBits; u->blueBits = pfd.cBlueBits; u->alphaBits = pfd.cAlphaBits; u->depthBits = pfd.cDepthBits; u->stencilBits = pfd.cStencilBits; u->accumRedBits = pfd.cAccumRedBits; u->accumGreenBits = pfd.cAccumGreenBits; u->accumBlueBits = pfd.cAccumBlueBits; u->accumAlphaBits = pfd.cAccumAlphaBits; u->auxBuffers = pfd.cAuxBuffers; u->stereo = (pfd.dwFlags & PFD_STEREO); } u->handle = pixelFormat; usableCount++; } if (!usableCount) { _glfwInputError(GLFW_API_UNAVAILABLE, "WGL: The driver does not appear to support OpenGL"); _glfw_free(usableConfigs); return 0; } closest = _glfwChooseFBConfig(fbconfig, usableConfigs, usableCount); if (!closest) { _glfwInputError(GLFW_FORMAT_UNAVAILABLE, "WGL: Failed to find a suitable pixel format"); _glfw_free(usableConfigs); return 0; } pixelFormat = (int) closest->handle; _glfw_free(usableConfigs); return pixelFormat;}#undef ADD_ATTRIB#undef FIND_ATTRIB_VALUEstatic void makeContextCurrentWGL(_GLFWwindow* window){ if (window) { if (wglMakeCurrent(window->context.wgl.dc, window->context.wgl.handle)) _glfwPlatformSetTls(&_glfw.contextSlot, window); else { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Failed to make context current"); _glfwPlatformSetTls(&_glfw.contextSlot, NULL); } } else { if (!wglMakeCurrent(NULL, NULL)) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Failed to clear current context"); } _glfwPlatformSetTls(&_glfw.contextSlot, NULL); }}static void swapBuffersWGL(_GLFWwindow* window){ if (!window->monitor) { // HACK: Use DwmFlush when desktop composition is enabled on Windows 7 if (!IsWindows8OrGreater()) { BOOL enabled = FALSE; if (SUCCEEDED(DwmIsCompositionEnabled(&enabled)) && enabled) { int count = abs(window->context.wgl.interval); while (count--) DwmFlush(); } } } SwapBuffers(window->context.wgl.dc);}static void swapIntervalWGL(int interval){ _GLFWwindow* window = _glfwPlatformGetTls(&_glfw.contextSlot); assert(window != NULL); window->context.wgl.interval = interval; if (!window->monitor) { // HACK: Disable WGL swap interval when desktop composition is enabled on // Windows 7 to avoid interfering with DWM vsync if (!IsWindows8OrGreater()) { BOOL enabled = FALSE; if (SUCCEEDED(DwmIsCompositionEnabled(&enabled)) && enabled) interval = 0; } } if (_glfw.wgl.EXT_swap_control) wglSwapIntervalEXT(interval);}static int extensionSupportedWGL(const char* extension){ const char* extensions = NULL; if (_glfw.wgl.GetExtensionsStringARB) extensions = wglGetExtensionsStringARB(wglGetCurrentDC()); else if (_glfw.wgl.GetExtensionsStringEXT) extensions = wglGetExtensionsStringEXT(); if (!extensions) return GLFW_FALSE; return _glfwStringInExtensionString(extension, extensions);}static GLFWglproc getProcAddressWGL(const char* procname){ const GLFWglproc proc = (GLFWglproc) wglGetProcAddress(procname); if (proc) return proc; return (GLFWglproc) _glfwPlatformGetModuleSymbol(_glfw.wgl.instance, procname);}static void destroyContextWGL(_GLFWwindow* window){ if (window->context.wgl.handle) { wglDeleteContext(window->context.wgl.handle); window->context.wgl.handle = NULL; }}GLFWbool _glfwInitWGL(void){ PIXELFORMATDESCRIPTOR pfd; HGLRC prc, rc; HDC pdc, dc; if (_glfw.wgl.instance) return GLFW_TRUE; _glfw.wgl.instance = _glfwPlatformLoadModule("opengl32.dll"); if (!_glfw.wgl.instance) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Failed to load opengl32.dll"); return GLFW_FALSE; } _glfw.wgl.CreateContext = (PFN_wglCreateContext) _glfwPlatformGetModuleSymbol(_glfw.wgl.instance, "wglCreateContext"); _glfw.wgl.DeleteContext = (PFN_wglDeleteContext) _glfwPlatformGetModuleSymbol(_glfw.wgl.instance, "wglDeleteContext"); _glfw.wgl.GetProcAddress = (PFN_wglGetProcAddress) _glfwPlatformGetModuleSymbol(_glfw.wgl.instance, "wglGetProcAddress"); _glfw.wgl.GetCurrentDC = (PFN_wglGetCurrentDC) _glfwPlatformGetModuleSymbol(_glfw.wgl.instance, "wglGetCurrentDC"); _glfw.wgl.GetCurrentContext = (PFN_wglGetCurrentContext) _glfwPlatformGetModuleSymbol(_glfw.wgl.instance, "wglGetCurrentContext"); _glfw.wgl.MakeCurrent = (PFN_wglMakeCurrent) _glfwPlatformGetModuleSymbol(_glfw.wgl.instance, "wglMakeCurrent"); _glfw.wgl.ShareLists = (PFN_wglShareLists) _glfwPlatformGetModuleSymbol(_glfw.wgl.instance, "wglShareLists"); // NOTE: A dummy context has to be created for opengl32.dll to load the // OpenGL ICD, from which we can then query WGL extensions // NOTE: This code will accept the Microsoft GDI ICD; accelerated context // creation failure occurs during manual pixel format enumeration dc = GetDC(_glfw.win32.helperWindowHandle); ZeroMemory(&pfd, sizeof(pfd)); pfd.nSize = sizeof(pfd); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; if (!SetPixelFormat(dc, ChoosePixelFormat(dc, &pfd), &pfd)) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Failed to set pixel format for dummy context"); return GLFW_FALSE; } rc = wglCreateContext(dc); if (!rc) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Failed to create dummy context"); return GLFW_FALSE; } pdc = wglGetCurrentDC(); prc = wglGetCurrentContext(); if (!wglMakeCurrent(dc, rc)) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "WGL: Failed to make dummy context current"); wglMakeCurrent(pdc, prc); wglDeleteContext(rc); return GLFW_FALSE; } // NOTE: Functions must be loaded first as they're needed to retrieve the // extension string that tells us whether the functions are supported _glfw.wgl.GetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) wglGetProcAddress("wglGetExtensionsStringEXT"); _glfw.wgl.GetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB"); _glfw.wgl.CreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) wglGetProcAddress("wglCreateContextAttribsARB"); _glfw.wgl.SwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT"); _glfw.wgl.GetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC) wglGetProcAddress("wglGetPixelFormatAttribivARB"); // NOTE: WGL_ARB_extensions_string and WGL_EXT_extensions_string are not // checked below as we are already using them _glfw.wgl.ARB_multisample = extensionSupportedWGL("WGL_ARB_multisample"); _glfw.wgl.ARB_framebuffer_sRGB = extensionSupportedWGL("WGL_ARB_framebuffer_sRGB"); _glfw.wgl.EXT_framebuffer_sRGB = extensionSupportedWGL("WGL_EXT_framebuffer_sRGB"); _glfw.wgl.ARB_create_context = extensionSupportedWGL("WGL_ARB_create_context"); _glfw.wgl.ARB_create_context_profile = extensionSupportedWGL("WGL_ARB_create_context_profile"); _glfw.wgl.EXT_create_context_es2_profile = extensionSupportedWGL("WGL_EXT_create_context_es2_profile"); _glfw.wgl.ARB_create_context_robustness = extensionSupportedWGL("WGL_ARB_create_context_robustness"); _glfw.wgl.ARB_create_context_no_error = extensionSupportedWGL("WGL_ARB_create_context_no_error");Showing the first 500 of 787 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/win32_init.cadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_WIN32)#include <stdlib.h>static const GUID _glfw_GUID_DEVINTERFACE_HID = {0x4d1e55b2,0xf16f,0x11cf,{0x88,0xcb,0x00,0x11,0x11,0x00,0x00,0x30}};#define GUID_DEVINTERFACE_HID _glfw_GUID_DEVINTERFACE_HID#if defined(_GLFW_USE_HYBRID_HPG) || defined(_GLFW_USE_OPTIMUS_HPG)#if defined(_GLFW_BUILD_DLL) #pragma message("These symbols must be exported by the executable and have no effect in a DLL")#endif// Executables (but not DLLs) exporting this symbol with this value will be// automatically directed to the high-performance GPU on Nvidia Optimus systems// with up-to-date drivers//__declspec(dllexport) DWORD NvOptimusEnablement = 1;// Executables (but not DLLs) exporting this symbol with this value will be// automatically directed to the high-performance GPU on AMD PowerXpress systems// with up-to-date drivers//__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;#endif // _GLFW_USE_HYBRID_HPG#if defined(_GLFW_BUILD_DLL)// GLFW DLL entry point//BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved){ return TRUE;}#endif // _GLFW_BUILD_DLL// Load necessary libraries (DLLs)//static GLFWbool loadLibraries(void){ if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (const WCHAR*) &_glfw, (HMODULE*) &_glfw.win32.instance)) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to retrieve own module handle"); return GLFW_FALSE; } _glfw.win32.user32.instance = _glfwPlatformLoadModule("user32.dll"); if (!_glfw.win32.user32.instance) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to load user32.dll"); return GLFW_FALSE; } _glfw.win32.user32.EnableNonClientDpiScaling_ = (PFN_EnableNonClientDpiScaling) _glfwPlatformGetModuleSymbol(_glfw.win32.user32.instance, "EnableNonClientDpiScaling"); _glfw.win32.user32.SetProcessDpiAwarenessContext_ = (PFN_SetProcessDpiAwarenessContext) _glfwPlatformGetModuleSymbol(_glfw.win32.user32.instance, "SetProcessDpiAwarenessContext"); _glfw.win32.user32.GetDpiForWindow_ = (PFN_GetDpiForWindow) _glfwPlatformGetModuleSymbol(_glfw.win32.user32.instance, "GetDpiForWindow"); _glfw.win32.user32.AdjustWindowRectExForDpi_ = (PFN_AdjustWindowRectExForDpi) _glfwPlatformGetModuleSymbol(_glfw.win32.user32.instance, "AdjustWindowRectExForDpi"); _glfw.win32.user32.GetSystemMetricsForDpi_ = (PFN_GetSystemMetricsForDpi) _glfwPlatformGetModuleSymbol(_glfw.win32.user32.instance, "GetSystemMetricsForDpi"); _glfw.win32.dinput8.instance = _glfwPlatformLoadModule("dinput8.dll"); if (_glfw.win32.dinput8.instance) { _glfw.win32.dinput8.Create = (PFN_DirectInput8Create) _glfwPlatformGetModuleSymbol(_glfw.win32.dinput8.instance, "DirectInput8Create"); } { int i; const char* names[] = { "xinput1_4.dll", "xinput1_3.dll", "xinput9_1_0.dll", "xinput1_2.dll", "xinput1_1.dll", NULL }; for (i = 0; names[i]; i++) { _glfw.win32.xinput.instance = _glfwPlatformLoadModule(names[i]); if (_glfw.win32.xinput.instance) { _glfw.win32.xinput.GetCapabilities = (PFN_XInputGetCapabilities) _glfwPlatformGetModuleSymbol(_glfw.win32.xinput.instance, "XInputGetCapabilities"); _glfw.win32.xinput.GetState = (PFN_XInputGetState) _glfwPlatformGetModuleSymbol(_glfw.win32.xinput.instance, "XInputGetState"); break; } } } _glfw.win32.dwmapi.instance = _glfwPlatformLoadModule("dwmapi.dll"); if (_glfw.win32.dwmapi.instance) { _glfw.win32.dwmapi.IsCompositionEnabled = (PFN_DwmIsCompositionEnabled) _glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "DwmIsCompositionEnabled"); _glfw.win32.dwmapi.Flush = (PFN_DwmFlush) _glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "DwmFlush"); _glfw.win32.dwmapi.EnableBlurBehindWindow = (PFN_DwmEnableBlurBehindWindow) _glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "DwmEnableBlurBehindWindow"); _glfw.win32.dwmapi.GetColorizationColor = (PFN_DwmGetColorizationColor) _glfwPlatformGetModuleSymbol(_glfw.win32.dwmapi.instance, "DwmGetColorizationColor"); } _glfw.win32.shcore.instance = _glfwPlatformLoadModule("shcore.dll"); if (_glfw.win32.shcore.instance) { _glfw.win32.shcore.SetProcessDpiAwareness_ = (PFN_SetProcessDpiAwareness) _glfwPlatformGetModuleSymbol(_glfw.win32.shcore.instance, "SetProcessDpiAwareness"); _glfw.win32.shcore.GetDpiForMonitor_ = (PFN_GetDpiForMonitor) _glfwPlatformGetModuleSymbol(_glfw.win32.shcore.instance, "GetDpiForMonitor"); } _glfw.win32.ntdll.instance = _glfwPlatformLoadModule("ntdll.dll"); if (_glfw.win32.ntdll.instance) { _glfw.win32.ntdll.RtlVerifyVersionInfo_ = (PFN_RtlVerifyVersionInfo) _glfwPlatformGetModuleSymbol(_glfw.win32.ntdll.instance, "RtlVerifyVersionInfo"); } return GLFW_TRUE;}// Create key code translation tables//static void createKeyTables(void){ int scancode; memset(_glfw.win32.keycodes, -1, sizeof(_glfw.win32.keycodes)); memset(_glfw.win32.scancodes, -1, sizeof(_glfw.win32.scancodes)); _glfw.win32.keycodes[0x00B] = GLFW_KEY_0; _glfw.win32.keycodes[0x002] = GLFW_KEY_1; _glfw.win32.keycodes[0x003] = GLFW_KEY_2; _glfw.win32.keycodes[0x004] = GLFW_KEY_3; _glfw.win32.keycodes[0x005] = GLFW_KEY_4; _glfw.win32.keycodes[0x006] = GLFW_KEY_5; _glfw.win32.keycodes[0x007] = GLFW_KEY_6; _glfw.win32.keycodes[0x008] = GLFW_KEY_7; _glfw.win32.keycodes[0x009] = GLFW_KEY_8; _glfw.win32.keycodes[0x00A] = GLFW_KEY_9; _glfw.win32.keycodes[0x01E] = GLFW_KEY_A; _glfw.win32.keycodes[0x030] = GLFW_KEY_B; _glfw.win32.keycodes[0x02E] = GLFW_KEY_C; _glfw.win32.keycodes[0x020] = GLFW_KEY_D; _glfw.win32.keycodes[0x012] = GLFW_KEY_E; _glfw.win32.keycodes[0x021] = GLFW_KEY_F; _glfw.win32.keycodes[0x022] = GLFW_KEY_G; _glfw.win32.keycodes[0x023] = GLFW_KEY_H; _glfw.win32.keycodes[0x017] = GLFW_KEY_I; _glfw.win32.keycodes[0x024] = GLFW_KEY_J; _glfw.win32.keycodes[0x025] = GLFW_KEY_K; _glfw.win32.keycodes[0x026] = GLFW_KEY_L; _glfw.win32.keycodes[0x032] = GLFW_KEY_M; _glfw.win32.keycodes[0x031] = GLFW_KEY_N; _glfw.win32.keycodes[0x018] = GLFW_KEY_O; _glfw.win32.keycodes[0x019] = GLFW_KEY_P; _glfw.win32.keycodes[0x010] = GLFW_KEY_Q; _glfw.win32.keycodes[0x013] = GLFW_KEY_R; _glfw.win32.keycodes[0x01F] = GLFW_KEY_S; _glfw.win32.keycodes[0x014] = GLFW_KEY_T; _glfw.win32.keycodes[0x016] = GLFW_KEY_U; _glfw.win32.keycodes[0x02F] = GLFW_KEY_V; _glfw.win32.keycodes[0x011] = GLFW_KEY_W; _glfw.win32.keycodes[0x02D] = GLFW_KEY_X; _glfw.win32.keycodes[0x015] = GLFW_KEY_Y; _glfw.win32.keycodes[0x02C] = GLFW_KEY_Z; _glfw.win32.keycodes[0x028] = GLFW_KEY_APOSTROPHE; _glfw.win32.keycodes[0x02B] = GLFW_KEY_BACKSLASH; _glfw.win32.keycodes[0x033] = GLFW_KEY_COMMA; _glfw.win32.keycodes[0x00D] = GLFW_KEY_EQUAL; _glfw.win32.keycodes[0x029] = GLFW_KEY_GRAVE_ACCENT; _glfw.win32.keycodes[0x01A] = GLFW_KEY_LEFT_BRACKET; _glfw.win32.keycodes[0x00C] = GLFW_KEY_MINUS; _glfw.win32.keycodes[0x034] = GLFW_KEY_PERIOD; _glfw.win32.keycodes[0x01B] = GLFW_KEY_RIGHT_BRACKET; _glfw.win32.keycodes[0x027] = GLFW_KEY_SEMICOLON; _glfw.win32.keycodes[0x035] = GLFW_KEY_SLASH; _glfw.win32.keycodes[0x056] = GLFW_KEY_WORLD_2; _glfw.win32.keycodes[0x00E] = GLFW_KEY_BACKSPACE; _glfw.win32.keycodes[0x153] = GLFW_KEY_DELETE; _glfw.win32.keycodes[0x14F] = GLFW_KEY_END; _glfw.win32.keycodes[0x01C] = GLFW_KEY_ENTER; _glfw.win32.keycodes[0x001] = GLFW_KEY_ESCAPE; _glfw.win32.keycodes[0x147] = GLFW_KEY_HOME; _glfw.win32.keycodes[0x152] = GLFW_KEY_INSERT; _glfw.win32.keycodes[0x15D] = GLFW_KEY_MENU; _glfw.win32.keycodes[0x151] = GLFW_KEY_PAGE_DOWN; _glfw.win32.keycodes[0x149] = GLFW_KEY_PAGE_UP; _glfw.win32.keycodes[0x045] = GLFW_KEY_PAUSE; _glfw.win32.keycodes[0x039] = GLFW_KEY_SPACE; _glfw.win32.keycodes[0x00F] = GLFW_KEY_TAB; _glfw.win32.keycodes[0x03A] = GLFW_KEY_CAPS_LOCK; _glfw.win32.keycodes[0x145] = GLFW_KEY_NUM_LOCK; _glfw.win32.keycodes[0x046] = GLFW_KEY_SCROLL_LOCK; _glfw.win32.keycodes[0x03B] = GLFW_KEY_F1; _glfw.win32.keycodes[0x03C] = GLFW_KEY_F2; _glfw.win32.keycodes[0x03D] = GLFW_KEY_F3; _glfw.win32.keycodes[0x03E] = GLFW_KEY_F4; _glfw.win32.keycodes[0x03F] = GLFW_KEY_F5; _glfw.win32.keycodes[0x040] = GLFW_KEY_F6; _glfw.win32.keycodes[0x041] = GLFW_KEY_F7; _glfw.win32.keycodes[0x042] = GLFW_KEY_F8; _glfw.win32.keycodes[0x043] = GLFW_KEY_F9; _glfw.win32.keycodes[0x044] = GLFW_KEY_F10; _glfw.win32.keycodes[0x057] = GLFW_KEY_F11; _glfw.win32.keycodes[0x058] = GLFW_KEY_F12; _glfw.win32.keycodes[0x064] = GLFW_KEY_F13; _glfw.win32.keycodes[0x065] = GLFW_KEY_F14; _glfw.win32.keycodes[0x066] = GLFW_KEY_F15; _glfw.win32.keycodes[0x067] = GLFW_KEY_F16; _glfw.win32.keycodes[0x068] = GLFW_KEY_F17; _glfw.win32.keycodes[0x069] = GLFW_KEY_F18; _glfw.win32.keycodes[0x06A] = GLFW_KEY_F19; _glfw.win32.keycodes[0x06B] = GLFW_KEY_F20; _glfw.win32.keycodes[0x06C] = GLFW_KEY_F21; _glfw.win32.keycodes[0x06D] = GLFW_KEY_F22; _glfw.win32.keycodes[0x06E] = GLFW_KEY_F23; _glfw.win32.keycodes[0x076] = GLFW_KEY_F24; _glfw.win32.keycodes[0x038] = GLFW_KEY_LEFT_ALT; _glfw.win32.keycodes[0x01D] = GLFW_KEY_LEFT_CONTROL; _glfw.win32.keycodes[0x02A] = GLFW_KEY_LEFT_SHIFT; _glfw.win32.keycodes[0x15B] = GLFW_KEY_LEFT_SUPER; _glfw.win32.keycodes[0x137] = GLFW_KEY_PRINT_SCREEN; _glfw.win32.keycodes[0x138] = GLFW_KEY_RIGHT_ALT; _glfw.win32.keycodes[0x11D] = GLFW_KEY_RIGHT_CONTROL; _glfw.win32.keycodes[0x036] = GLFW_KEY_RIGHT_SHIFT; _glfw.win32.keycodes[0x15C] = GLFW_KEY_RIGHT_SUPER; _glfw.win32.keycodes[0x150] = GLFW_KEY_DOWN; _glfw.win32.keycodes[0x14B] = GLFW_KEY_LEFT; _glfw.win32.keycodes[0x14D] = GLFW_KEY_RIGHT; _glfw.win32.keycodes[0x148] = GLFW_KEY_UP; _glfw.win32.keycodes[0x052] = GLFW_KEY_KP_0; _glfw.win32.keycodes[0x04F] = GLFW_KEY_KP_1; _glfw.win32.keycodes[0x050] = GLFW_KEY_KP_2; _glfw.win32.keycodes[0x051] = GLFW_KEY_KP_3; _glfw.win32.keycodes[0x04B] = GLFW_KEY_KP_4; _glfw.win32.keycodes[0x04C] = GLFW_KEY_KP_5; _glfw.win32.keycodes[0x04D] = GLFW_KEY_KP_6; _glfw.win32.keycodes[0x047] = GLFW_KEY_KP_7; _glfw.win32.keycodes[0x048] = GLFW_KEY_KP_8; _glfw.win32.keycodes[0x049] = GLFW_KEY_KP_9; _glfw.win32.keycodes[0x04E] = GLFW_KEY_KP_ADD; _glfw.win32.keycodes[0x053] = GLFW_KEY_KP_DECIMAL; _glfw.win32.keycodes[0x135] = GLFW_KEY_KP_DIVIDE; _glfw.win32.keycodes[0x11C] = GLFW_KEY_KP_ENTER; _glfw.win32.keycodes[0x059] = GLFW_KEY_KP_EQUAL; _glfw.win32.keycodes[0x037] = GLFW_KEY_KP_MULTIPLY; _glfw.win32.keycodes[0x04A] = GLFW_KEY_KP_SUBTRACT; for (scancode = 0; scancode < 512; scancode++) { if (_glfw.win32.keycodes[scancode] > 0) _glfw.win32.scancodes[_glfw.win32.keycodes[scancode]] = scancode; }}// Window procedure for the hidden helper window//static LRESULT CALLBACK helperWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg) { case WM_DISPLAYCHANGE: _glfwPollMonitorsWin32(); break; case WM_DEVICECHANGE: { if (!_glfw.joysticksInitialized) break; if (wParam == DBT_DEVICEARRIVAL) { DEV_BROADCAST_HDR* dbh = (DEV_BROADCAST_HDR*) lParam; if (dbh && dbh->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) _glfwDetectJoystickConnectionWin32(); } else if (wParam == DBT_DEVICEREMOVECOMPLETE) { DEV_BROADCAST_HDR* dbh = (DEV_BROADCAST_HDR*) lParam; if (dbh && dbh->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) _glfwDetectJoystickDisconnectionWin32(); } break; } } return DefWindowProcW(hWnd, uMsg, wParam, lParam);}// Creates a dummy window for behind-the-scenes work//static GLFWbool createHelperWindow(void){ MSG msg; WNDCLASSEXW wc = { sizeof(wc) }; wc.style = CS_OWNDC; wc.lpfnWndProc = (WNDPROC) helperWindowProc; wc.hInstance = _glfw.win32.instance; wc.lpszClassName = L"GLFW3 Helper"; _glfw.win32.helperWindowClass = RegisterClassExW(&wc); if (!_glfw.win32.helperWindowClass) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to register helper window class"); return GLFW_FALSE; } _glfw.win32.helperWindowHandle = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, MAKEINTATOM(_glfw.win32.helperWindowClass), L"GLFW message window", WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 1, 1, NULL, NULL, _glfw.win32.instance, NULL); if (!_glfw.win32.helperWindowHandle) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to create helper window"); return GLFW_FALSE; } // HACK: The command to the first ShowWindow call is ignored if the parent // process passed along a STARTUPINFO, so clear that with a no-op call ShowWindow(_glfw.win32.helperWindowHandle, SW_HIDE); // Register for HID device notifications { DEV_BROADCAST_DEVICEINTERFACE_W dbi; ZeroMemory(&dbi, sizeof(dbi)); dbi.dbcc_size = sizeof(dbi); dbi.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; dbi.dbcc_classguid = GUID_DEVINTERFACE_HID; _glfw.win32.deviceNotificationHandle = RegisterDeviceNotificationW(_glfw.win32.helperWindowHandle, (DEV_BROADCAST_HDR*) &dbi, DEVICE_NOTIFY_WINDOW_HANDLE); } while (PeekMessageW(&msg, _glfw.win32.helperWindowHandle, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessageW(&msg); } return GLFW_TRUE;}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////// Returns a wide string version of the specified UTF-8 string//WCHAR* _glfwCreateWideStringFromUTF8Win32(const char* source){ WCHAR* target; int count; count = MultiByteToWideChar(CP_UTF8, 0, source, -1, NULL, 0); if (!count) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to convert string from UTF-8"); return NULL; } target = _glfw_calloc(count, sizeof(WCHAR)); if (!MultiByteToWideChar(CP_UTF8, 0, source, -1, target, count)) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to convert string from UTF-8"); _glfw_free(target); return NULL; } return target;}// Returns a UTF-8 string version of the specified wide string//char* _glfwCreateUTF8FromWideStringWin32(const WCHAR* source){ char* target; int size; size = WideCharToMultiByte(CP_UTF8, 0, source, -1, NULL, 0, NULL, NULL); if (!size) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to convert string to UTF-8"); return NULL; } target = _glfw_calloc(size, 1); if (!WideCharToMultiByte(CP_UTF8, 0, source, -1, target, size, NULL, NULL)) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to convert string to UTF-8"); _glfw_free(target); return NULL; } return target;}// Reports the specified error, appending information about the last Win32 error//void _glfwInputErrorWin32(int error, const char* description){ WCHAR buffer[_GLFW_MESSAGE_SIZE] = L""; char message[_GLFW_MESSAGE_SIZE] = ""; FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, GetLastError() & 0xffff, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buffer, sizeof(buffer) / sizeof(WCHAR), NULL); WideCharToMultiByte(CP_UTF8, 0, buffer, -1, message, sizeof(message), NULL, NULL); _glfwInputError(error, "%s: %s", description, message);}// Updates key names according to the current keyboard layout//void _glfwUpdateKeyNamesWin32(void){ int key; BYTE state[256] = {0}; memset(_glfw.win32.keynames, 0, sizeof(_glfw.win32.keynames)); for (key = GLFW_KEY_SPACE; key <= GLFW_KEY_LAST; key++) { UINT vk; int scancode, length;Showing the first 500 of 713 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/win32_joystick.cadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_WIN32)#include <stdio.h>#include <math.h>#define _GLFW_TYPE_AXIS 0#define _GLFW_TYPE_SLIDER 1#define _GLFW_TYPE_BUTTON 2#define _GLFW_TYPE_POV 3// Data produced with DirectInput device object enumeration//typedef struct _GLFWobjenumWin32{ IDirectInputDevice8W* device; _GLFWjoyobjectWin32* objects; int objectCount; int axisCount; int sliderCount; int buttonCount; int povCount;} _GLFWobjenumWin32;// Define local copies of the necessary GUIDs//static const GUID _glfw_IID_IDirectInput8W = {0xbf798031,0x483a,0x4da2,{0xaa,0x99,0x5d,0x64,0xed,0x36,0x97,0x00}};static const GUID _glfw_GUID_XAxis = {0xa36d02e0,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};static const GUID _glfw_GUID_YAxis = {0xa36d02e1,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};static const GUID _glfw_GUID_ZAxis = {0xa36d02e2,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};static const GUID _glfw_GUID_RxAxis = {0xa36d02f4,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};static const GUID _glfw_GUID_RyAxis = {0xa36d02f5,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};static const GUID _glfw_GUID_RzAxis = {0xa36d02e3,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};static const GUID _glfw_GUID_Slider = {0xa36d02e4,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};static const GUID _glfw_GUID_POV = {0xa36d02f2,0xc9f3,0x11cf,{0xbf,0xc7,0x44,0x45,0x53,0x54,0x00,0x00}};#define IID_IDirectInput8W _glfw_IID_IDirectInput8W#define GUID_XAxis _glfw_GUID_XAxis#define GUID_YAxis _glfw_GUID_YAxis#define GUID_ZAxis _glfw_GUID_ZAxis#define GUID_RxAxis _glfw_GUID_RxAxis#define GUID_RyAxis _glfw_GUID_RyAxis#define GUID_RzAxis _glfw_GUID_RzAxis#define GUID_Slider _glfw_GUID_Slider#define GUID_POV _glfw_GUID_POV// Object data array for our clone of c_dfDIJoystick// Generated with https://github.com/elmindreda/c_dfDIJoystick2//static DIOBJECTDATAFORMAT _glfwObjectDataFormats[] ={ { &GUID_XAxis,DIJOFS_X,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION }, { &GUID_YAxis,DIJOFS_Y,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION }, { &GUID_ZAxis,DIJOFS_Z,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION }, { &GUID_RxAxis,DIJOFS_RX,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION }, { &GUID_RyAxis,DIJOFS_RY,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION }, { &GUID_RzAxis,DIJOFS_RZ,DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION }, { &GUID_Slider,DIJOFS_SLIDER(0),DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION }, { &GUID_Slider,DIJOFS_SLIDER(1),DIDFT_AXIS|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,DIDOI_ASPECTPOSITION }, { &GUID_POV,DIJOFS_POV(0),DIDFT_POV|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { &GUID_POV,DIJOFS_POV(1),DIDFT_POV|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { &GUID_POV,DIJOFS_POV(2),DIDFT_POV|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { &GUID_POV,DIJOFS_POV(3),DIDFT_POV|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(0),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(1),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(2),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(3),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(4),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(5),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(6),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(7),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(8),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(9),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(10),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(11),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(12),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(13),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(14),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(15),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(16),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(17),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(18),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(19),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(20),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(21),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(22),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(23),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(24),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(25),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(26),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(27),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(28),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(29),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(30),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 }, { NULL,DIJOFS_BUTTON(31),DIDFT_BUTTON|DIDFT_OPTIONAL|DIDFT_ANYINSTANCE,0 },};// Our clone of c_dfDIJoystick//static const DIDATAFORMAT _glfwDataFormat ={ sizeof(DIDATAFORMAT), sizeof(DIOBJECTDATAFORMAT), DIDFT_ABSAXIS, sizeof(DIJOYSTATE), sizeof(_glfwObjectDataFormats) / sizeof(DIOBJECTDATAFORMAT), _glfwObjectDataFormats};// Returns a description fitting the specified XInput capabilities//static const char* getDeviceDescription(const XINPUT_CAPABILITIES* xic){ switch (xic->SubType) { case XINPUT_DEVSUBTYPE_WHEEL: return "XInput Wheel"; case XINPUT_DEVSUBTYPE_ARCADE_STICK: return "XInput Arcade Stick"; case XINPUT_DEVSUBTYPE_FLIGHT_STICK: return "XInput Flight Stick"; case XINPUT_DEVSUBTYPE_DANCE_PAD: return "XInput Dance Pad"; case XINPUT_DEVSUBTYPE_GUITAR: return "XInput Guitar"; case XINPUT_DEVSUBTYPE_DRUM_KIT: return "XInput Drum Kit"; case XINPUT_DEVSUBTYPE_GAMEPAD: { if (xic->Flags & XINPUT_CAPS_WIRELESS) return "Wireless Xbox Controller"; else return "Xbox Controller"; } } return "Unknown XInput Device";}// Lexically compare device objects//static int compareJoystickObjects(const void* first, const void* second){ const _GLFWjoyobjectWin32* fo = first; const _GLFWjoyobjectWin32* so = second; if (fo->type != so->type) return fo->type - so->type; return fo->offset - so->offset;}// Checks whether the specified device supports XInput// Technique from FDInputJoystickManager::IsXInputDeviceFast in ZDoom//static GLFWbool supportsXInput(const GUID* guid){ UINT i, count = 0; RAWINPUTDEVICELIST* ridl; GLFWbool result = GLFW_FALSE; if (GetRawInputDeviceList(NULL, &count, sizeof(RAWINPUTDEVICELIST)) != 0) return GLFW_FALSE; ridl = _glfw_calloc(count, sizeof(RAWINPUTDEVICELIST)); if (GetRawInputDeviceList(ridl, &count, sizeof(RAWINPUTDEVICELIST)) == (UINT) -1) { _glfw_free(ridl); return GLFW_FALSE; } for (i = 0; i < count; i++) { RID_DEVICE_INFO rdi; char name[256]; UINT size; if (ridl[i].dwType != RIM_TYPEHID) continue; ZeroMemory(&rdi, sizeof(rdi)); rdi.cbSize = sizeof(rdi); size = sizeof(rdi); if ((INT) GetRawInputDeviceInfoA(ridl[i].hDevice, RIDI_DEVICEINFO, &rdi, &size) == -1) { continue; } if (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) != (LONG) guid->Data1) continue; memset(name, 0, sizeof(name)); size = sizeof(name); if ((INT) GetRawInputDeviceInfoA(ridl[i].hDevice, RIDI_DEVICENAME, name, &size) == -1) { break; } name[sizeof(name) - 1] = '\0'; if (strstr(name, "IG_")) { result = GLFW_TRUE; break; } } _glfw_free(ridl); return result;}// Frees all resources associated with the specified joystick//static void closeJoystick(_GLFWjoystick* js){ _glfwInputJoystick(js, GLFW_DISCONNECTED); if (js->win32.device) { IDirectInputDevice8_Unacquire(js->win32.device); IDirectInputDevice8_Release(js->win32.device); } _glfw_free(js->win32.objects); _glfwFreeJoystick(js);}// DirectInput device object enumeration callback// Insights gleaned from SDL//static BOOL CALLBACK deviceObjectCallback(const DIDEVICEOBJECTINSTANCEW* doi, void* user){ _GLFWobjenumWin32* data = user; _GLFWjoyobjectWin32* object = data->objects + data->objectCount; if (DIDFT_GETTYPE(doi->dwType) & DIDFT_AXIS) { DIPROPRANGE dipr; if (memcmp(&doi->guidType, &GUID_Slider, sizeof(GUID)) == 0) object->offset = DIJOFS_SLIDER(data->sliderCount); else if (memcmp(&doi->guidType, &GUID_XAxis, sizeof(GUID)) == 0) object->offset = DIJOFS_X; else if (memcmp(&doi->guidType, &GUID_YAxis, sizeof(GUID)) == 0) object->offset = DIJOFS_Y; else if (memcmp(&doi->guidType, &GUID_ZAxis, sizeof(GUID)) == 0) object->offset = DIJOFS_Z; else if (memcmp(&doi->guidType, &GUID_RxAxis, sizeof(GUID)) == 0) object->offset = DIJOFS_RX; else if (memcmp(&doi->guidType, &GUID_RyAxis, sizeof(GUID)) == 0) object->offset = DIJOFS_RY; else if (memcmp(&doi->guidType, &GUID_RzAxis, sizeof(GUID)) == 0) object->offset = DIJOFS_RZ; else return DIENUM_CONTINUE; ZeroMemory(&dipr, sizeof(dipr)); dipr.diph.dwSize = sizeof(dipr); dipr.diph.dwHeaderSize = sizeof(dipr.diph); dipr.diph.dwObj = doi->dwType; dipr.diph.dwHow = DIPH_BYID; dipr.lMin = -32768; dipr.lMax = 32767; if (FAILED(IDirectInputDevice8_SetProperty(data->device, DIPROP_RANGE, &dipr.diph))) { return DIENUM_CONTINUE; } if (memcmp(&doi->guidType, &GUID_Slider, sizeof(GUID)) == 0) { object->type = _GLFW_TYPE_SLIDER; data->sliderCount++; } else { object->type = _GLFW_TYPE_AXIS; data->axisCount++; } } else if (DIDFT_GETTYPE(doi->dwType) & DIDFT_BUTTON) { object->offset = DIJOFS_BUTTON(data->buttonCount); object->type = _GLFW_TYPE_BUTTON; data->buttonCount++; } else if (DIDFT_GETTYPE(doi->dwType) & DIDFT_POV) { object->offset = DIJOFS_POV(data->povCount); object->type = _GLFW_TYPE_POV; data->povCount++; } data->objectCount++; return DIENUM_CONTINUE;}// DirectInput device enumeration callback//static BOOL CALLBACK deviceCallback(const DIDEVICEINSTANCE* di, void* user){ int jid = 0; DIDEVCAPS dc; DIPROPDWORD dipd; IDirectInputDevice8* device; _GLFWobjenumWin32 data; _GLFWjoystick* js; char guid[33]; char name[256]; for (jid = 0; jid <= GLFW_JOYSTICK_LAST; jid++) { js = _glfw.joysticks + jid; if (js->connected) { if (memcmp(&js->win32.guid, &di->guidInstance, sizeof(GUID)) == 0) return DIENUM_CONTINUE; } } if (supportsXInput(&di->guidProduct)) return DIENUM_CONTINUE; if (FAILED(IDirectInput8_CreateDevice(_glfw.win32.dinput8.api, &di->guidInstance, &device, NULL))) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to create device"); return DIENUM_CONTINUE; } if (FAILED(IDirectInputDevice8_SetDataFormat(device, &_glfwDataFormat))) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to set device data format"); IDirectInputDevice8_Release(device); return DIENUM_CONTINUE; } ZeroMemory(&dc, sizeof(dc)); dc.dwSize = sizeof(dc); if (FAILED(IDirectInputDevice8_GetCapabilities(device, &dc))) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to query device capabilities"); IDirectInputDevice8_Release(device); return DIENUM_CONTINUE; } ZeroMemory(&dipd, sizeof(dipd)); dipd.diph.dwSize = sizeof(dipd); dipd.diph.dwHeaderSize = sizeof(dipd.diph); dipd.diph.dwHow = DIPH_DEVICE; dipd.dwData = DIPROPAXISMODE_ABS; if (FAILED(IDirectInputDevice8_SetProperty(device, DIPROP_AXISMODE, &dipd.diph))) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to set device axis mode"); IDirectInputDevice8_Release(device); return DIENUM_CONTINUE; } memset(&data, 0, sizeof(data)); data.device = device; data.objects = _glfw_calloc(dc.dwAxes + (size_t) dc.dwButtons + dc.dwPOVs, sizeof(_GLFWjoyobjectWin32)); if (FAILED(IDirectInputDevice8_EnumObjects(device, deviceObjectCallback, &data, DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV))) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to enumerate device objects"); IDirectInputDevice8_Release(device); _glfw_free(data.objects); return DIENUM_CONTINUE; } qsort(data.objects, data.objectCount, sizeof(_GLFWjoyobjectWin32), compareJoystickObjects); if (!WideCharToMultiByte(CP_UTF8, 0, di->tszInstanceName, -1, name, sizeof(name), NULL, NULL)) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to convert joystick name to UTF-8"); IDirectInputDevice8_Release(device); _glfw_free(data.objects); return DIENUM_STOP; } // Generate a joystick GUID that matches the SDL 2.0.5+ one if (memcmp(&di->guidProduct.Data4[2], "PIDVID", 6) == 0) { sprintf(guid, "03000000%02x%02x0000%02x%02x000000000000", (uint8_t) di->guidProduct.Data1, (uint8_t) (di->guidProduct.Data1 >> 8), (uint8_t) (di->guidProduct.Data1 >> 16), (uint8_t) (di->guidProduct.Data1 >> 24)); } else { sprintf(guid, "05000000%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x00", name[0], name[1], name[2], name[3], name[4], name[5], name[6], name[7], name[8], name[9], name[10]); } js = _glfwAllocJoystick(name, guid, data.axisCount + data.sliderCount, data.buttonCount, data.povCount); if (!js) { IDirectInputDevice8_Release(device); _glfw_free(data.objects); return DIENUM_STOP; } js->win32.device = device; js->win32.guid = di->guidInstance; js->win32.objects = data.objects; js->win32.objectCount = data.objectCount; _glfwInputJoystick(js, GLFW_CONNECTED); return DIENUM_CONTINUE;}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////// Checks for new joysticks after DBT_DEVICEARRIVAL//void _glfwDetectJoystickConnectionWin32(void){ if (_glfw.win32.xinput.instance) {Showing the first 500 of 768 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/win32_joystick.hadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#define GLFW_WIN32_JOYSTICK_STATE _GLFWjoystickWin32 win32;#define GLFW_WIN32_LIBRARY_JOYSTICK_STATE// Joystick element (axis, button or slider)//typedef struct _GLFWjoyobjectWin32{ int offset; int type;} _GLFWjoyobjectWin32;// Win32-specific per-joystick data//typedef struct _GLFWjoystickWin32{ _GLFWjoyobjectWin32* objects; int objectCount; IDirectInputDevice8W* device; DWORD index; GUID guid;} _GLFWjoystickWin32;void _glfwDetectJoystickConnectionWin32(void);void _glfwDetectJoystickDisconnectionWin32(void);vendor/glfw/src/win32_module.cadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2021 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(GLFW_BUILD_WIN32_MODULE)//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void* _glfwPlatformLoadModule(const char* path){ return LoadLibraryA(path);}void _glfwPlatformFreeModule(void* module){ if (module) FreeLibrary((HMODULE) module);}GLFWproc _glfwPlatformGetModuleSymbol(void* module, const char* name){ return (GLFWproc) GetProcAddress((HMODULE) module, name);}#endif // GLFW_BUILD_WIN32_MODULEvendor/glfw/src/win32_monitor.cadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_WIN32)#include <stdlib.h>#include <string.h>#include <limits.h>#include <wchar.h>#include <assert.h>// Callback for EnumDisplayMonitors in createMonitor//static BOOL CALLBACK monitorCallback(HMONITOR handle, HDC dc, RECT* rect, LPARAM data){ MONITORINFOEXW mi; ZeroMemory(&mi, sizeof(mi)); mi.cbSize = sizeof(mi); if (GetMonitorInfoW(handle, (MONITORINFO*) &mi)) { _GLFWmonitor* monitor = (_GLFWmonitor*) data; if (wcscmp(mi.szDevice, monitor->win32.adapterName) == 0) monitor->win32.handle = handle; } return TRUE;}// Create monitor from an adapter and (optionally) a display//static _GLFWmonitor* createMonitor(DISPLAY_DEVICEW* adapter, DISPLAY_DEVICEW* display){ _GLFWmonitor* monitor; int widthMM, heightMM; char* name; HDC dc; DEVMODEW dm; RECT rect; if (display) name = _glfwCreateUTF8FromWideStringWin32(display->DeviceString); else name = _glfwCreateUTF8FromWideStringWin32(adapter->DeviceString); if (!name) return NULL; ZeroMemory(&dm, sizeof(dm)); dm.dmSize = sizeof(dm); EnumDisplaySettingsW(adapter->DeviceName, ENUM_CURRENT_SETTINGS, &dm); dc = CreateDCW(L"DISPLAY", adapter->DeviceName, NULL, NULL); if (IsWindows8Point1OrGreater()) { widthMM = GetDeviceCaps(dc, HORZSIZE); heightMM = GetDeviceCaps(dc, VERTSIZE); } else { widthMM = (int) (dm.dmPelsWidth * 25.4f / GetDeviceCaps(dc, LOGPIXELSX)); heightMM = (int) (dm.dmPelsHeight * 25.4f / GetDeviceCaps(dc, LOGPIXELSY)); } DeleteDC(dc); monitor = _glfwAllocMonitor(name, widthMM, heightMM); _glfw_free(name); if (adapter->StateFlags & DISPLAY_DEVICE_MODESPRUNED) monitor->win32.modesPruned = GLFW_TRUE; wcscpy(monitor->win32.adapterName, adapter->DeviceName); WideCharToMultiByte(CP_UTF8, 0, adapter->DeviceName, -1, monitor->win32.publicAdapterName, sizeof(monitor->win32.publicAdapterName), NULL, NULL); if (display) { wcscpy(monitor->win32.displayName, display->DeviceName); WideCharToMultiByte(CP_UTF8, 0, display->DeviceName, -1, monitor->win32.publicDisplayName, sizeof(monitor->win32.publicDisplayName), NULL, NULL); } rect.left = dm.dmPosition.x; rect.top = dm.dmPosition.y; rect.right = dm.dmPosition.x + dm.dmPelsWidth; rect.bottom = dm.dmPosition.y + dm.dmPelsHeight; EnumDisplayMonitors(NULL, &rect, monitorCallback, (LPARAM) monitor); return monitor;}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////// Poll for changes in the set of connected monitors//void _glfwPollMonitorsWin32(void){ int i, disconnectedCount; _GLFWmonitor** disconnected = NULL; DWORD adapterIndex, displayIndex; DISPLAY_DEVICEW adapter, display; _GLFWmonitor* monitor; disconnectedCount = _glfw.monitorCount; if (disconnectedCount) { disconnected = _glfw_calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*)); memcpy(disconnected, _glfw.monitors, _glfw.monitorCount * sizeof(_GLFWmonitor*)); } for (adapterIndex = 0; ; adapterIndex++) { int type = _GLFW_INSERT_LAST; ZeroMemory(&adapter, sizeof(adapter)); adapter.cb = sizeof(adapter); if (!EnumDisplayDevicesW(NULL, adapterIndex, &adapter, 0)) break; if (!(adapter.StateFlags & DISPLAY_DEVICE_ACTIVE)) continue; if (adapter.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) type = _GLFW_INSERT_FIRST; for (displayIndex = 0; ; displayIndex++) { ZeroMemory(&display, sizeof(display)); display.cb = sizeof(display); if (!EnumDisplayDevicesW(adapter.DeviceName, displayIndex, &display, 0)) break; if (!(display.StateFlags & DISPLAY_DEVICE_ACTIVE)) continue; for (i = 0; i < disconnectedCount; i++) { if (disconnected[i] && wcscmp(disconnected[i]->win32.displayName, display.DeviceName) == 0) { disconnected[i] = NULL; // handle may have changed, update EnumDisplayMonitors(NULL, NULL, monitorCallback, (LPARAM) _glfw.monitors[i]); break; } } if (i < disconnectedCount) continue; monitor = createMonitor(&adapter, &display); if (!monitor) { _glfw_free(disconnected); return; } _glfwInputMonitor(monitor, GLFW_CONNECTED, type); type = _GLFW_INSERT_LAST; } // HACK: If an active adapter does not have any display devices // (as sometimes happens), add it directly as a monitor if (displayIndex == 0) { for (i = 0; i < disconnectedCount; i++) { if (disconnected[i] && wcscmp(disconnected[i]->win32.adapterName, adapter.DeviceName) == 0) { disconnected[i] = NULL; break; } } if (i < disconnectedCount) continue; monitor = createMonitor(&adapter, NULL); if (!monitor) { _glfw_free(disconnected); return; } _glfwInputMonitor(monitor, GLFW_CONNECTED, type); } } for (i = 0; i < disconnectedCount; i++) { if (disconnected[i]) _glfwInputMonitor(disconnected[i], GLFW_DISCONNECTED, 0); } _glfw_free(disconnected);}// Change the current video mode//void _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired){ GLFWvidmode current; const GLFWvidmode* best; DEVMODEW dm; LONG result; best = _glfwChooseVideoMode(monitor, desired); _glfwGetVideoModeWin32(monitor, ¤t); if (_glfwCompareVideoModes(¤t, best) == 0) return; ZeroMemory(&dm, sizeof(dm)); dm.dmSize = sizeof(dm); dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; dm.dmPelsWidth = best->width; dm.dmPelsHeight = best->height; dm.dmBitsPerPel = best->redBits + best->greenBits + best->blueBits; dm.dmDisplayFrequency = best->refreshRate; if (dm.dmBitsPerPel < 15 || dm.dmBitsPerPel >= 24) dm.dmBitsPerPel = 32; result = ChangeDisplaySettingsExW(monitor->win32.adapterName, &dm, NULL, CDS_FULLSCREEN, NULL); if (result == DISP_CHANGE_SUCCESSFUL) monitor->win32.modeChanged = GLFW_TRUE; else { const char* description = "Unknown error"; if (result == DISP_CHANGE_BADDUALVIEW) description = "The system uses DualView"; else if (result == DISP_CHANGE_BADFLAGS) description = "Invalid flags"; else if (result == DISP_CHANGE_BADMODE) description = "Graphics mode not supported"; else if (result == DISP_CHANGE_BADPARAM) description = "Invalid parameter"; else if (result == DISP_CHANGE_FAILED) description = "Graphics mode failed"; else if (result == DISP_CHANGE_NOTUPDATED) description = "Failed to write to registry"; else if (result == DISP_CHANGE_RESTART) description = "Computer restart required"; _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to set video mode: %s", description); }}// Restore the previously saved (original) video mode//void _glfwRestoreVideoModeWin32(_GLFWmonitor* monitor){ if (monitor->win32.modeChanged) { ChangeDisplaySettingsExW(monitor->win32.adapterName, NULL, NULL, CDS_FULLSCREEN, NULL); monitor->win32.modeChanged = GLFW_FALSE; }}void _glfwGetHMONITORContentScaleWin32(HMONITOR handle, float* xscale, float* yscale){ UINT xdpi, ydpi; if (xscale) *xscale = 0.f; if (yscale) *yscale = 0.f; if (IsWindows8Point1OrGreater()) { if (GetDpiForMonitor(handle, MDT_EFFECTIVE_DPI, &xdpi, &ydpi) != S_OK) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to query monitor DPI"); return; } } else { const HDC dc = GetDC(NULL); xdpi = GetDeviceCaps(dc, LOGPIXELSX); ydpi = GetDeviceCaps(dc, LOGPIXELSY); ReleaseDC(NULL, dc); } if (xscale) *xscale = xdpi / (float) USER_DEFAULT_SCREEN_DPI; if (yscale) *yscale = ydpi / (float) USER_DEFAULT_SCREEN_DPI;}//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void _glfwFreeMonitorWin32(_GLFWmonitor* monitor){}void _glfwGetMonitorPosWin32(_GLFWmonitor* monitor, int* xpos, int* ypos){ DEVMODEW dm; ZeroMemory(&dm, sizeof(dm)); dm.dmSize = sizeof(dm); EnumDisplaySettingsExW(monitor->win32.adapterName, ENUM_CURRENT_SETTINGS, &dm, EDS_ROTATEDMODE); if (xpos) *xpos = dm.dmPosition.x; if (ypos) *ypos = dm.dmPosition.y;}void _glfwGetMonitorContentScaleWin32(_GLFWmonitor* monitor, float* xscale, float* yscale){ _glfwGetHMONITORContentScaleWin32(monitor->win32.handle, xscale, yscale);}void _glfwGetMonitorWorkareaWin32(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height){ MONITORINFO mi = { sizeof(mi) }; GetMonitorInfoW(monitor->win32.handle, &mi); if (xpos) *xpos = mi.rcWork.left; if (ypos) *ypos = mi.rcWork.top; if (width) *width = mi.rcWork.right - mi.rcWork.left; if (height) *height = mi.rcWork.bottom - mi.rcWork.top;}GLFWvidmode* _glfwGetVideoModesWin32(_GLFWmonitor* monitor, int* count){ int modeIndex = 0, size = 0; GLFWvidmode* result = NULL; *count = 0; for (;;) { int i; GLFWvidmode mode; DEVMODEW dm; ZeroMemory(&dm, sizeof(dm)); dm.dmSize = sizeof(dm); if (!EnumDisplaySettingsW(monitor->win32.adapterName, modeIndex, &dm)) break; modeIndex++; // Skip modes with less than 15 BPP if (dm.dmBitsPerPel < 15) continue; mode.width = dm.dmPelsWidth; mode.height = dm.dmPelsHeight; mode.refreshRate = dm.dmDisplayFrequency; _glfwSplitBPP(dm.dmBitsPerPel, &mode.redBits, &mode.greenBits, &mode.blueBits); for (i = 0; i < *count; i++) { if (_glfwCompareVideoModes(result + i, &mode) == 0) break; } // Skip duplicate modes if (i < *count) continue; if (monitor->win32.modesPruned) { // Skip modes not supported by the connected displays if (ChangeDisplaySettingsExW(monitor->win32.adapterName, &dm, NULL, CDS_TEST, NULL) != DISP_CHANGE_SUCCESSFUL) { continue; } } if (*count == size) { size += 128; result = (GLFWvidmode*) _glfw_realloc(result, size * sizeof(GLFWvidmode)); } (*count)++; result[*count - 1] = mode; } if (!*count) { // HACK: Report the current mode if no valid modes were found result = _glfw_calloc(1, sizeof(GLFWvidmode)); _glfwGetVideoModeWin32(monitor, result); *count = 1; } return result;}GLFWbool _glfwGetVideoModeWin32(_GLFWmonitor* monitor, GLFWvidmode* mode){ DEVMODEW dm; ZeroMemory(&dm, sizeof(dm)); dm.dmSize = sizeof(dm); if (!EnumDisplaySettingsW(monitor->win32.adapterName, ENUM_CURRENT_SETTINGS, &dm)) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to query display settings"); return GLFW_FALSE; } mode->width = dm.dmPelsWidth; mode->height = dm.dmPelsHeight; mode->refreshRate = dm.dmDisplayFrequency; _glfwSplitBPP(dm.dmBitsPerPel, &mode->redBits, &mode->greenBits, &mode->blueBits); return GLFW_TRUE;}GLFWbool _glfwGetGammaRampWin32(_GLFWmonitor* monitor, GLFWgammaramp* ramp){ HDC dc;Showing the first 500 of 575 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/win32_platform.hadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================// We don't need all the fancy stuff#ifndef NOMINMAX #define NOMINMAX#endif#ifndef VC_EXTRALEAN #define VC_EXTRALEAN#endif#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN#endif// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for// example to allow applications to correctly declare a GL_KHR_debug callback)// but windows.h assumes no one will define APIENTRY before it does#undef APIENTRY// GLFW on Windows is Unicode only and does not work in MBCS mode#ifndef UNICODE #define UNICODE#endif// GLFW requires Windows 7 or later#if WINVER < 0x0601 #undef WINVER #define WINVER 0x0601#endif#if _WIN32_WINNT < 0x0601 #undef _WIN32_WINNT #define _WIN32_WINNT 0x0601#endif// GLFW uses DirectInput8 interfaces#define DIRECTINPUT_VERSION 0x0800// GLFW uses OEM cursor resources#define OEMRESOURCE#include <wctype.h>#include <windows.h>#include <dwmapi.h>#include <dinput.h>#include <xinput.h>#include <dbt.h>// HACK: Define macros that some windows.h variants don't#ifndef WM_COPYGLOBALDATA #define WM_COPYGLOBALDATA 0x0049#endif#ifndef WM_DPICHANGED #define WM_DPICHANGED 0x02E0#endif#ifndef EDS_ROTATEDMODE #define EDS_ROTATEDMODE 0x00000004#endif#ifndef _WIN32_WINNT_WINBLUE #define _WIN32_WINNT_WINBLUE 0x0603#endif#ifndef _WIN32_WINNT_WIN8 #define _WIN32_WINNT_WIN8 0x0602#endif#ifndef WM_GETDPISCALEDSIZE #define WM_GETDPISCALEDSIZE 0x02e4#endif#ifndef USER_DEFAULT_SCREEN_DPI #define USER_DEFAULT_SCREEN_DPI 96#endif#ifndef DPI_ENUMS_DECLAREDtypedef enum{ PROCESS_DPI_UNAWARE = 0, PROCESS_SYSTEM_DPI_AWARE = 1, PROCESS_PER_MONITOR_DPI_AWARE = 2} PROCESS_DPI_AWARENESS;typedef enum{ MDT_EFFECTIVE_DPI = 0, MDT_ANGULAR_DPI = 1, MDT_RAW_DPI = 2, MDT_DEFAULT = MDT_EFFECTIVE_DPI} MONITOR_DPI_TYPE;#endif /*DPI_ENUMS_DECLARED*/#ifndef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((HANDLE) -4)#endif /*DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2*/// Replacement for versionhelpers.h macros, as we cannot rely on the// application having a correct embedded manifest//#define IsWindows8OrGreater() \ _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WIN8), \ LOBYTE(_WIN32_WINNT_WIN8), 0)#define IsWindows8Point1OrGreater() \ _glfwIsWindowsVersionOrGreaterWin32(HIBYTE(_WIN32_WINNT_WINBLUE), \ LOBYTE(_WIN32_WINNT_WINBLUE), 0)// Windows 10 Anniversary Update#define _glfwIsWindows10Version1607OrGreaterWin32() \ _glfwIsWindows10BuildOrGreaterWin32(14393)// Windows 10 Creators Update#define _glfwIsWindows10Version1703OrGreaterWin32() \ _glfwIsWindows10BuildOrGreaterWin32(15063)// HACK: Define macros that some xinput.h variants don't#ifndef XINPUT_CAPS_WIRELESS #define XINPUT_CAPS_WIRELESS 0x0002#endif#ifndef XINPUT_DEVSUBTYPE_WHEEL #define XINPUT_DEVSUBTYPE_WHEEL 0x02#endif#ifndef XINPUT_DEVSUBTYPE_ARCADE_STICK #define XINPUT_DEVSUBTYPE_ARCADE_STICK 0x03#endif#ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK #define XINPUT_DEVSUBTYPE_FLIGHT_STICK 0x04#endif#ifndef XINPUT_DEVSUBTYPE_DANCE_PAD #define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05#endif#ifndef XINPUT_DEVSUBTYPE_GUITAR #define XINPUT_DEVSUBTYPE_GUITAR 0x06#endif#ifndef XINPUT_DEVSUBTYPE_DRUM_KIT #define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08#endif#ifndef XINPUT_DEVSUBTYPE_ARCADE_PAD #define XINPUT_DEVSUBTYPE_ARCADE_PAD 0x13#endif#ifndef XUSER_MAX_COUNT #define XUSER_MAX_COUNT 4#endif// HACK: Define macros that some dinput.h variants don't#ifndef DIDFT_OPTIONAL #define DIDFT_OPTIONAL 0x80000000#endif#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000#define WGL_SUPPORT_OPENGL_ARB 0x2010#define WGL_DRAW_TO_WINDOW_ARB 0x2001#define WGL_PIXEL_TYPE_ARB 0x2013#define WGL_TYPE_RGBA_ARB 0x202b#define WGL_ACCELERATION_ARB 0x2003#define WGL_NO_ACCELERATION_ARB 0x2025#define WGL_RED_BITS_ARB 0x2015#define WGL_RED_SHIFT_ARB 0x2016#define WGL_GREEN_BITS_ARB 0x2017#define WGL_GREEN_SHIFT_ARB 0x2018#define WGL_BLUE_BITS_ARB 0x2019#define WGL_BLUE_SHIFT_ARB 0x201a#define WGL_ALPHA_BITS_ARB 0x201b#define WGL_ALPHA_SHIFT_ARB 0x201c#define WGL_ACCUM_BITS_ARB 0x201d#define WGL_ACCUM_RED_BITS_ARB 0x201e#define WGL_ACCUM_GREEN_BITS_ARB 0x201f#define WGL_ACCUM_BLUE_BITS_ARB 0x2020#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021#define WGL_DEPTH_BITS_ARB 0x2022#define WGL_STENCIL_BITS_ARB 0x2023#define WGL_AUX_BUFFERS_ARB 0x2024#define WGL_STEREO_ARB 0x2012#define WGL_DOUBLE_BUFFER_ARB 0x2011#define WGL_SAMPLES_ARB 0x2042#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20a9#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092#define WGL_CONTEXT_FLAGS_ARB 0x2094#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098#define WGL_CONTEXT_OPENGL_NO_ERROR_ARB 0x31b3#define WGL_COLORSPACE_EXT 0x309d#define WGL_COLORSPACE_SRGB_EXT 0x3089#define ERROR_INVALID_VERSION_ARB 0x2095#define ERROR_INVALID_PROFILE_ARB 0x2096#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054// xinput.dll function pointer typedefstypedef DWORD (WINAPI * PFN_XInputGetCapabilities)(DWORD,DWORD,XINPUT_CAPABILITIES*);typedef DWORD (WINAPI * PFN_XInputGetState)(DWORD,XINPUT_STATE*);#define XInputGetCapabilities _glfw.win32.xinput.GetCapabilities#define XInputGetState _glfw.win32.xinput.GetState// dinput8.dll function pointer typedefstypedef HRESULT (WINAPI * PFN_DirectInput8Create)(HINSTANCE,DWORD,REFIID,LPVOID*,LPUNKNOWN);#define DirectInput8Create _glfw.win32.dinput8.Create// user32.dll function pointer typedefstypedef BOOL (WINAPI * PFN_EnableNonClientDpiScaling)(HWND);typedef BOOL (WINAPI * PFN_SetProcessDpiAwarenessContext)(HANDLE);typedef UINT (WINAPI * PFN_GetDpiForWindow)(HWND);typedef BOOL (WINAPI * PFN_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT);typedef int (WINAPI * PFN_GetSystemMetricsForDpi)(int,UINT);#define EnableNonClientDpiScaling _glfw.win32.user32.EnableNonClientDpiScaling_#define SetProcessDpiAwarenessContext _glfw.win32.user32.SetProcessDpiAwarenessContext_#define GetDpiForWindow _glfw.win32.user32.GetDpiForWindow_#define AdjustWindowRectExForDpi _glfw.win32.user32.AdjustWindowRectExForDpi_#define GetSystemMetricsForDpi _glfw.win32.user32.GetSystemMetricsForDpi_// dwmapi.dll function pointer typedefstypedef HRESULT (WINAPI * PFN_DwmIsCompositionEnabled)(BOOL*);typedef HRESULT (WINAPI * PFN_DwmFlush)(VOID);typedef HRESULT(WINAPI * PFN_DwmEnableBlurBehindWindow)(HWND,const DWM_BLURBEHIND*);typedef HRESULT (WINAPI * PFN_DwmGetColorizationColor)(DWORD*,BOOL*);#define DwmIsCompositionEnabled _glfw.win32.dwmapi.IsCompositionEnabled#define DwmFlush _glfw.win32.dwmapi.Flush#define DwmEnableBlurBehindWindow _glfw.win32.dwmapi.EnableBlurBehindWindow#define DwmGetColorizationColor _glfw.win32.dwmapi.GetColorizationColor// shcore.dll function pointer typedefstypedef HRESULT (WINAPI * PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS);typedef HRESULT (WINAPI * PFN_GetDpiForMonitor)(HMONITOR,MONITOR_DPI_TYPE,UINT*,UINT*);#define SetProcessDpiAwareness _glfw.win32.shcore.SetProcessDpiAwareness_#define GetDpiForMonitor _glfw.win32.shcore.GetDpiForMonitor_// ntdll.dll function pointer typedefstypedef LONG (WINAPI * PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*,ULONG,ULONGLONG);#define RtlVerifyVersionInfo _glfw.win32.ntdll.RtlVerifyVersionInfo_// WGL extension pointer typedefstypedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC)(int);typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC,int,int,UINT,const int*,int*);typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void);typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC);typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC,HGLRC,const int*);#define wglSwapIntervalEXT _glfw.wgl.SwapIntervalEXT#define wglGetPixelFormatAttribivARB _glfw.wgl.GetPixelFormatAttribivARB#define wglGetExtensionsStringEXT _glfw.wgl.GetExtensionsStringEXT#define wglGetExtensionsStringARB _glfw.wgl.GetExtensionsStringARB#define wglCreateContextAttribsARB _glfw.wgl.CreateContextAttribsARB// opengl32.dll function pointer typedefstypedef HGLRC (WINAPI * PFN_wglCreateContext)(HDC);typedef BOOL (WINAPI * PFN_wglDeleteContext)(HGLRC);typedef PROC (WINAPI * PFN_wglGetProcAddress)(LPCSTR);typedef HDC (WINAPI * PFN_wglGetCurrentDC)(void);typedef HGLRC (WINAPI * PFN_wglGetCurrentContext)(void);typedef BOOL (WINAPI * PFN_wglMakeCurrent)(HDC,HGLRC);typedef BOOL (WINAPI * PFN_wglShareLists)(HGLRC,HGLRC);#define wglCreateContext _glfw.wgl.CreateContext#define wglDeleteContext _glfw.wgl.DeleteContext#define wglGetProcAddress _glfw.wgl.GetProcAddress#define wglGetCurrentDC _glfw.wgl.GetCurrentDC#define wglGetCurrentContext _glfw.wgl.GetCurrentContext#define wglMakeCurrent _glfw.wgl.MakeCurrent#define wglShareLists _glfw.wgl.ShareListstypedef VkFlags VkWin32SurfaceCreateFlagsKHR;typedef struct VkWin32SurfaceCreateInfoKHR{ VkStructureType sType; const void* pNext; VkWin32SurfaceCreateFlagsKHR flags; HINSTANCE hinstance; HWND hwnd;} VkWin32SurfaceCreateInfoKHR;typedef VkResult (APIENTRY *PFN_vkCreateWin32SurfaceKHR)(VkInstance,const VkWin32SurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice,uint32_t);#define GLFW_WIN32_WINDOW_STATE _GLFWwindowWin32 win32;#define GLFW_WIN32_LIBRARY_WINDOW_STATE _GLFWlibraryWin32 win32;#define GLFW_WIN32_MONITOR_STATE _GLFWmonitorWin32 win32;#define GLFW_WIN32_CURSOR_STATE _GLFWcursorWin32 win32;#define GLFW_WGL_CONTEXT_STATE _GLFWcontextWGL wgl;#define GLFW_WGL_LIBRARY_CONTEXT_STATE _GLFWlibraryWGL wgl;// WGL-specific per-context data//typedef struct _GLFWcontextWGL{ HDC dc; HGLRC handle; int interval;} _GLFWcontextWGL;// WGL-specific global data//typedef struct _GLFWlibraryWGL{ HINSTANCE instance; PFN_wglCreateContext CreateContext; PFN_wglDeleteContext DeleteContext; PFN_wglGetProcAddress GetProcAddress; PFN_wglGetCurrentDC GetCurrentDC; PFN_wglGetCurrentContext GetCurrentContext; PFN_wglMakeCurrent MakeCurrent; PFN_wglShareLists ShareLists; PFNWGLSWAPINTERVALEXTPROC SwapIntervalEXT; PFNWGLGETPIXELFORMATATTRIBIVARBPROC GetPixelFormatAttribivARB; PFNWGLGETEXTENSIONSSTRINGEXTPROC GetExtensionsStringEXT; PFNWGLGETEXTENSIONSSTRINGARBPROC GetExtensionsStringARB; PFNWGLCREATECONTEXTATTRIBSARBPROC CreateContextAttribsARB; bool EXT_swap_control; bool EXT_colorspace; bool ARB_multisample; bool ARB_framebuffer_sRGB; bool EXT_framebuffer_sRGB; bool ARB_pixel_format; bool ARB_create_context; bool ARB_create_context_profile; bool EXT_create_context_es2_profile; bool ARB_create_context_robustness; bool ARB_create_context_no_error; bool ARB_context_flush_control;} _GLFWlibraryWGL;// Win32-specific per-window data//typedef struct _GLFWwindowWin32{ HWND handle; HICON bigIcon; HICON smallIcon; GLFWbool cursorTracked; GLFWbool frameAction; GLFWbool iconified; GLFWbool maximized; // Whether to enable framebuffer transparency on DWM GLFWbool transparent; GLFWbool scaleToMonitor; GLFWbool keymenu; GLFWbool showDefault; // Cached size used to filter out duplicate events int width, height; // The last received cursor position, regardless of source int lastCursorPosX, lastCursorPosY; // The last received high surrogate when decoding pairs of UTF-16 messages WCHAR highSurrogate;} _GLFWwindowWin32;// Win32-specific global data//typedef struct _GLFWlibraryWin32{ HINSTANCE instance; HWND helperWindowHandle; ATOM helperWindowClass; ATOM mainWindowClass; HDEVNOTIFY deviceNotificationHandle; int acquiredMonitorCount; char* clipboardString; short int keycodes[512]; short int scancodes[GLFW_KEY_LAST + 1]; char keynames[GLFW_KEY_LAST + 1][5]; // Where to place the cursor when re-enabled double restoreCursorPosX, restoreCursorPosY; // The window whose disabled cursor mode is active _GLFWwindow* disabledCursorWindow; // The window the cursor is captured in _GLFWwindow* capturedCursorWindow; RAWINPUT* rawInput; int rawInputSize; UINT mouseTrailSize; // The cursor handle to use to hide the cursor (NULL or a transparent cursor) HCURSOR blankCursor; struct { HINSTANCE instance; PFN_DirectInput8Create Create; IDirectInput8W* api; } dinput8; struct { HINSTANCE instance; PFN_XInputGetCapabilities GetCapabilities; PFN_XInputGetState GetState; } xinput; struct { HINSTANCE instance; PFN_EnableNonClientDpiScaling EnableNonClientDpiScaling_; PFN_SetProcessDpiAwarenessContext SetProcessDpiAwarenessContext_; PFN_GetDpiForWindow GetDpiForWindow_; PFN_AdjustWindowRectExForDpi AdjustWindowRectExForDpi_; PFN_GetSystemMetricsForDpi GetSystemMetricsForDpi_; } user32; struct { HINSTANCE instance; PFN_DwmIsCompositionEnabled IsCompositionEnabled; PFN_DwmFlush Flush; PFN_DwmEnableBlurBehindWindow EnableBlurBehindWindow; PFN_DwmGetColorizationColor GetColorizationColor; } dwmapi; struct { HINSTANCE instance; PFN_SetProcessDpiAwareness SetProcessDpiAwareness_; PFN_GetDpiForMonitor GetDpiForMonitor_; } shcore; struct { HINSTANCE instance; PFN_RtlVerifyVersionInfo RtlVerifyVersionInfo_; } ntdll;} _GLFWlibraryWin32;// Win32-specific per-monitor data//typedef struct _GLFWmonitorWin32{ HMONITOR handle; // This size matches the static size of DISPLAY_DEVICE.DeviceName WCHAR adapterName[32]; WCHAR displayName[32]; char publicAdapterName[32]; char publicDisplayName[32]; GLFWbool modesPruned; GLFWbool modeChanged;} _GLFWmonitorWin32;// Win32-specific per-cursor data//typedef struct _GLFWcursorWin32{ HCURSOR handle;} _GLFWcursorWin32;GLFWbool _glfwConnectWin32(int platformID, _GLFWplatform* platform);int _glfwInitWin32(void);void _glfwTerminateWin32(void);WCHAR* _glfwCreateWideStringFromUTF8Win32(const char* source);char* _glfwCreateUTF8FromWideStringWin32(const WCHAR* source);BOOL _glfwIsWindowsVersionOrGreaterWin32(WORD major, WORD minor, WORD sp);BOOL _glfwIsWindows10BuildOrGreaterWin32(WORD build);void _glfwInputErrorWin32(int error, const char* description);void _glfwUpdateKeyNamesWin32(void);void _glfwPollMonitorsWin32(void);void _glfwSetVideoModeWin32(_GLFWmonitor* monitor, const GLFWvidmode* desired);void _glfwRestoreVideoModeWin32(_GLFWmonitor* monitor);void _glfwGetHMONITORContentScaleWin32(HMONITOR handle, float* xscale, float* yscale);GLFWbool _glfwCreateWindowWin32(_GLFWwindow* window, const _GLFWwndconfig* wndconfig, const _GLFWctxconfig* ctxconfig, const _GLFWfbconfig* fbconfig);void _glfwDestroyWindowWin32(_GLFWwindow* window);void _glfwSetWindowTitleWin32(_GLFWwindow* window, const char* title);void _glfwSetWindowIconWin32(_GLFWwindow* window, int count, const GLFWimage* images);void _glfwGetWindowPosWin32(_GLFWwindow* window, int* xpos, int* ypos);void _glfwSetWindowPosWin32(_GLFWwindow* window, int xpos, int ypos);void _glfwGetWindowSizeWin32(_GLFWwindow* window, int* width, int* height);void _glfwSetWindowSizeWin32(_GLFWwindow* window, int width, int height);void _glfwSetWindowSizeLimitsWin32(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);void _glfwSetWindowAspectRatioWin32(_GLFWwindow* window, int numer, int denom);void _glfwGetFramebufferSizeWin32(_GLFWwindow* window, int* width, int* height);void _glfwGetWindowFrameSizeWin32(_GLFWwindow* window, int* left, int* top, int* right, int* bottom);void _glfwGetWindowContentScaleWin32(_GLFWwindow* window, float* xscale, float* yscale);void _glfwIconifyWindowWin32(_GLFWwindow* window);void _glfwRestoreWindowWin32(_GLFWwindow* window);Showing the first 500 of 568 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/win32_thread.cadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(GLFW_BUILD_WIN32_THREAD)#include <assert.h>//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwPlatformCreateTls(_GLFWtls* tls){ assert(tls->win32.allocated == GLFW_FALSE); tls->win32.index = TlsAlloc(); if (tls->win32.index == TLS_OUT_OF_INDEXES) { _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to allocate TLS index"); return GLFW_FALSE; } tls->win32.allocated = GLFW_TRUE; return GLFW_TRUE;}void _glfwPlatformDestroyTls(_GLFWtls* tls){ if (tls->win32.allocated) TlsFree(tls->win32.index); memset(tls, 0, sizeof(_GLFWtls));}void* _glfwPlatformGetTls(_GLFWtls* tls){ assert(tls->win32.allocated == GLFW_TRUE); return TlsGetValue(tls->win32.index);}void _glfwPlatformSetTls(_GLFWtls* tls, void* value){ assert(tls->win32.allocated == GLFW_TRUE); TlsSetValue(tls->win32.index, value);}GLFWbool _glfwPlatformCreateMutex(_GLFWmutex* mutex){ assert(mutex->win32.allocated == GLFW_FALSE); InitializeCriticalSection(&mutex->win32.section); return mutex->win32.allocated = GLFW_TRUE;}void _glfwPlatformDestroyMutex(_GLFWmutex* mutex){ if (mutex->win32.allocated) DeleteCriticalSection(&mutex->win32.section); memset(mutex, 0, sizeof(_GLFWmutex));}void _glfwPlatformLockMutex(_GLFWmutex* mutex){ assert(mutex->win32.allocated == GLFW_TRUE); EnterCriticalSection(&mutex->win32.section);}void _glfwPlatformUnlockMutex(_GLFWmutex* mutex){ assert(mutex->win32.allocated == GLFW_TRUE); LeaveCriticalSection(&mutex->win32.section);}#endif // GLFW_BUILD_WIN32_THREADvendor/glfw/src/win32_thread.hadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for// example to allow applications to correctly declare a GL_KHR_debug callback)// but windows.h assumes no one will define APIENTRY before it does#undef APIENTRY#include <windows.h>#define GLFW_WIN32_TLS_STATE _GLFWtlsWin32 win32;#define GLFW_WIN32_MUTEX_STATE _GLFWmutexWin32 win32;// Win32-specific thread local storage data//typedef struct _GLFWtlsWin32{ GLFWbool allocated; DWORD index;} _GLFWtlsWin32;// Win32-specific mutex data//typedef struct _GLFWmutexWin32{ GLFWbool allocated; CRITICAL_SECTION section;} _GLFWmutexWin32;vendor/glfw/src/win32_time.cadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(GLFW_BUILD_WIN32_TIMER)//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void _glfwPlatformInitTimer(void){ QueryPerformanceFrequency((LARGE_INTEGER*) &_glfw.timer.win32.frequency);}uint64_t _glfwPlatformGetTimerValue(void){ uint64_t value; QueryPerformanceCounter((LARGE_INTEGER*) &value); return value;}uint64_t _glfwPlatformGetTimerFrequency(void){ return _glfw.timer.win32.frequency;}#endif // GLFW_BUILD_WIN32_TIMERvendor/glfw/src/win32_time.hadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================// This is a workaround for the fact that glfw3.h needs to export APIENTRY (for// example to allow applications to correctly declare a GL_KHR_debug callback)// but windows.h assumes no one will define APIENTRY before it does#undef APIENTRY#include <windows.h>#define GLFW_WIN32_LIBRARY_TIMER_STATE _GLFWtimerWin32 win32;// Win32-specific global timer data//typedef struct _GLFWtimerWin32{ uint64_t frequency;} _GLFWtimerWin32;vendor/glfw/src/win32_window.cadded
//========================================================================// GLFW 3.5 Win32 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_WIN32)#include <limits.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <windowsx.h>#include <shellapi.h>// Returns the window style for the specified window//static DWORD getWindowStyle(const _GLFWwindow* window){ DWORD style = WS_CLIPSIBLINGS | WS_CLIPCHILDREN; if (window->monitor) style |= WS_POPUP; else { style |= WS_SYSMENU | WS_MINIMIZEBOX; if (window->decorated) { style |= WS_CAPTION; if (window->resizable) style |= WS_MAXIMIZEBOX | WS_THICKFRAME; } else style |= WS_POPUP; } return style;}// Returns the extended window style for the specified window//static DWORD getWindowExStyle(const _GLFWwindow* window){ DWORD style = WS_EX_APPWINDOW; if (window->monitor || window->floating) style |= WS_EX_TOPMOST; return style;}// Returns the image whose area most closely matches the desired one//static const GLFWimage* chooseImage(int count, const GLFWimage* images, int width, int height){ int i, leastDiff = INT_MAX; const GLFWimage* closest = NULL; for (i = 0; i < count; i++) { const int currDiff = abs(images[i].width * images[i].height - width * height); if (currDiff < leastDiff) { closest = images + i; leastDiff = currDiff; } } return closest;}// Creates an RGBA icon or cursor//static HICON createIcon(const GLFWimage* image, int xhot, int yhot, GLFWbool icon){ int i; HDC dc; HICON handle; HBITMAP color, mask; BITMAPV5HEADER bi; ICONINFO ii; unsigned char* target = NULL; unsigned char* source = image->pixels; ZeroMemory(&bi, sizeof(bi)); bi.bV5Size = sizeof(bi); bi.bV5Width = image->width; bi.bV5Height = -image->height; bi.bV5Planes = 1; bi.bV5BitCount = 32; bi.bV5Compression = BI_BITFIELDS; bi.bV5RedMask = 0x00ff0000; bi.bV5GreenMask = 0x0000ff00; bi.bV5BlueMask = 0x000000ff; bi.bV5AlphaMask = 0xff000000; dc = GetDC(NULL); color = CreateDIBSection(dc, (BITMAPINFO*) &bi, DIB_RGB_COLORS, (void**) &target, NULL, (DWORD) 0); ReleaseDC(NULL, dc); if (!color) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to create RGBA bitmap"); return NULL; } mask = CreateBitmap(image->width, image->height, 1, 1, NULL); if (!mask) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to create mask bitmap"); DeleteObject(color); return NULL; } for (i = 0; i < image->width * image->height; i++) { target[0] = source[2]; target[1] = source[1]; target[2] = source[0]; target[3] = source[3]; target += 4; source += 4; } ZeroMemory(&ii, sizeof(ii)); ii.fIcon = icon; ii.xHotspot = xhot; ii.yHotspot = yhot; ii.hbmMask = mask; ii.hbmColor = color; handle = CreateIconIndirect(&ii); DeleteObject(color); DeleteObject(mask); if (!handle) { if (icon) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to create icon"); } else { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to create cursor"); } } return handle;}// Enforce the content area aspect ratio based on which edge is being dragged//static void applyAspectRatio(_GLFWwindow* window, int edge, RECT* area){ RECT frame = {0}; const float ratio = (float) window->numer / (float) window->denom; const DWORD style = getWindowStyle(window); const DWORD exStyle = getWindowExStyle(window); if (_glfwIsWindows10Version1607OrGreaterWin32()) { AdjustWindowRectExForDpi(&frame, style, FALSE, exStyle, GetDpiForWindow(window->win32.handle)); } else AdjustWindowRectEx(&frame, style, FALSE, exStyle); if (edge == WMSZ_LEFT || edge == WMSZ_BOTTOMLEFT || edge == WMSZ_RIGHT || edge == WMSZ_BOTTOMRIGHT) { area->bottom = area->top + (frame.bottom - frame.top) + (int) (((area->right - area->left) - (frame.right - frame.left)) / ratio); } else if (edge == WMSZ_TOPLEFT || edge == WMSZ_TOPRIGHT) { area->top = area->bottom - (frame.bottom - frame.top) - (int) (((area->right - area->left) - (frame.right - frame.left)) / ratio); } else if (edge == WMSZ_TOP || edge == WMSZ_BOTTOM) { area->right = area->left + (frame.right - frame.left) + (int) (((area->bottom - area->top) - (frame.bottom - frame.top)) * ratio); }}// Updates the cursor image according to its cursor mode//static void updateCursorImage(_GLFWwindow* window){ if (window->cursorMode == GLFW_CURSOR_NORMAL || window->cursorMode == GLFW_CURSOR_CAPTURED) { if (window->cursor) SetCursor(window->cursor->win32.handle); else SetCursor(LoadCursorW(NULL, IDC_ARROW)); } else { // NOTE: Via Remote Desktop, setting the cursor to NULL does not hide it. // HACK: When running locally, it is set to NULL, but when connected via Remote // Desktop, this is a transparent cursor. SetCursor(_glfw.win32.blankCursor); }}// Sets the cursor clip rect to the window content area//static void captureCursor(_GLFWwindow* window){ RECT clipRect; GetClientRect(window->win32.handle, &clipRect); ClientToScreen(window->win32.handle, (POINT*) &clipRect.left); ClientToScreen(window->win32.handle, (POINT*) &clipRect.right); ClipCursor(&clipRect); _glfw.win32.capturedCursorWindow = window;}// Disabled clip cursor//static void releaseCursor(void){ ClipCursor(NULL); _glfw.win32.capturedCursorWindow = NULL;}// Enables WM_INPUT messages for the mouse for the specified window//static void enableRawMouseMotion(_GLFWwindow* window){ const RAWINPUTDEVICE rid = { 0x01, 0x02, 0, window->win32.handle }; if (!RegisterRawInputDevices(&rid, 1, sizeof(rid))) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to register raw input device"); }}// Disables WM_INPUT messages for the mouse//static void disableRawMouseMotion(_GLFWwindow* window){ const RAWINPUTDEVICE rid = { 0x01, 0x02, RIDEV_REMOVE, NULL }; if (!RegisterRawInputDevices(&rid, 1, sizeof(rid))) { _glfwInputErrorWin32(GLFW_PLATFORM_ERROR, "Win32: Failed to remove raw input device"); }}// Apply disabled cursor mode to a focused window//static void disableCursor(_GLFWwindow* window){ _glfw.win32.disabledCursorWindow = window; _glfwGetCursorPosWin32(window, &_glfw.win32.restoreCursorPosX, &_glfw.win32.restoreCursorPosY); updateCursorImage(window); _glfwCenterCursorInContentArea(window); captureCursor(window); if (window->rawMouseMotion) enableRawMouseMotion(window);}// Exit disabled cursor mode for the specified window//static void enableCursor(_GLFWwindow* window){ if (window->rawMouseMotion) disableRawMouseMotion(window); _glfw.win32.disabledCursorWindow = NULL; releaseCursor(); _glfwSetCursorPosWin32(window, _glfw.win32.restoreCursorPosX, _glfw.win32.restoreCursorPosY); updateCursorImage(window);}// Returns whether the cursor is in the content area of the specified window//static GLFWbool cursorInContentArea(_GLFWwindow* window){ RECT area; POINT pos; if (!GetCursorPos(&pos)) return GLFW_FALSE; if (WindowFromPoint(pos) != window->win32.handle) return GLFW_FALSE; GetClientRect(window->win32.handle, &area); ClientToScreen(window->win32.handle, (POINT*) &area.left); ClientToScreen(window->win32.handle, (POINT*) &area.right); return PtInRect(&area, pos);}// Update native window styles to match attributes//static void updateWindowStyles(const _GLFWwindow* window){ RECT rect; DWORD style = GetWindowLongW(window->win32.handle, GWL_STYLE); style &= ~(WS_OVERLAPPEDWINDOW | WS_POPUP); style |= getWindowStyle(window); GetClientRect(window->win32.handle, &rect); if (_glfwIsWindows10Version1607OrGreaterWin32()) { AdjustWindowRectExForDpi(&rect, style, FALSE, getWindowExStyle(window), GetDpiForWindow(window->win32.handle)); } else AdjustWindowRectEx(&rect, style, FALSE, getWindowExStyle(window)); ClientToScreen(window->win32.handle, (POINT*) &rect.left); ClientToScreen(window->win32.handle, (POINT*) &rect.right); SetWindowLongW(window->win32.handle, GWL_STYLE, style); SetWindowPos(window->win32.handle, HWND_TOP, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOZORDER);}// Update window framebuffer transparency//static void updateFramebufferTransparency(const _GLFWwindow* window){ BOOL composition, opaque; DWORD color; if (FAILED(DwmIsCompositionEnabled(&composition)) || !composition) return; if (IsWindows8OrGreater() || (SUCCEEDED(DwmGetColorizationColor(&color, &opaque)) && !opaque)) { HRGN region = CreateRectRgn(0, 0, -1, -1); DWM_BLURBEHIND bb = {0}; bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION; bb.hRgnBlur = region; bb.fEnable = TRUE; DwmEnableBlurBehindWindow(window->win32.handle, &bb); DeleteObject(region); } else { // HACK: Disable framebuffer transparency on Windows 7 when the // colorization color is opaque, because otherwise the window // contents is blended additively with the previous frame instead // of replacing it DWM_BLURBEHIND bb = {0}; bb.dwFlags = DWM_BB_ENABLE; DwmEnableBlurBehindWindow(window->win32.handle, &bb); }}// Retrieves and translates modifier keys//static int getKeyMods(void){ int mods = 0; if (GetKeyState(VK_SHIFT) & 0x8000) mods |= GLFW_MOD_SHIFT; if (GetKeyState(VK_CONTROL) & 0x8000) mods |= GLFW_MOD_CONTROL; if (GetKeyState(VK_MENU) & 0x8000) mods |= GLFW_MOD_ALT; if ((GetKeyState(VK_LWIN) | GetKeyState(VK_RWIN)) & 0x8000) mods |= GLFW_MOD_SUPER; if (GetKeyState(VK_CAPITAL) & 1) mods |= GLFW_MOD_CAPS_LOCK; if (GetKeyState(VK_NUMLOCK) & 1) mods |= GLFW_MOD_NUM_LOCK; return mods;}static void fitToMonitor(_GLFWwindow* window){ MONITORINFO mi = { sizeof(mi) }; GetMonitorInfoW(window->monitor->win32.handle, &mi); SetWindowPos(window->win32.handle, HWND_TOPMOST, mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS);}// Make the specified window and its video mode active on its monitor//static void acquireMonitor(_GLFWwindow* window){ if (!_glfw.win32.acquiredMonitorCount) { SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); // HACK: When mouse trails are enabled the cursor becomes invisible when // the OpenGL ICD switches to page flipping SystemParametersInfoW(SPI_GETMOUSETRAILS, 0, &_glfw.win32.mouseTrailSize, 0); SystemParametersInfoW(SPI_SETMOUSETRAILS, 0, 0, 0); } if (!window->monitor->window) _glfw.win32.acquiredMonitorCount++; _glfwSetVideoModeWin32(window->monitor, &window->videoMode); _glfwInputMonitorWindow(window->monitor, window);}// Remove the window and restore the original video mode//static void releaseMonitor(_GLFWwindow* window){ if (window->monitor->window != window) return; _glfw.win32.acquiredMonitorCount--; if (!_glfw.win32.acquiredMonitorCount) { SetThreadExecutionState(ES_CONTINUOUS); // HACK: Restore mouse trail length saved in acquireMonitor SystemParametersInfoW(SPI_SETMOUSETRAILS, _glfw.win32.mouseTrailSize, 0, 0); } _glfwInputMonitorWindow(window->monitor, NULL); _glfwRestoreVideoModeWin32(window->monitor);}// Manually maximize the window, for when SW_MAXIMIZE cannot be used//static void maximizeWindowManually(_GLFWwindow* window){ RECT rect; DWORD style; MONITORINFO mi = { sizeof(mi) }; GetMonitorInfoW(MonitorFromWindow(window->win32.handle, MONITOR_DEFAULTTONEAREST), &mi); rect = mi.rcWork; if (window->maxwidth != GLFW_DONT_CARE && window->maxheight != GLFW_DONT_CARE) { rect.right = _glfw_min(rect.right, rect.left + window->maxwidth); rect.bottom = _glfw_min(rect.bottom, rect.top + window->maxheight); } style = GetWindowLongW(window->win32.handle, GWL_STYLE); style |= WS_MAXIMIZE;Showing the first 500 of 2585 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/window.cadded
//========================================================================// GLFW 3.5 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>// Copyright (c) 2012 Torsten Walluhn <tw@mad-cad.net>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#include <assert.h>#include <string.h>#include <stdlib.h>#include <float.h>#include <math.h>//////////////////////////////////////////////////////////////////////////////// GLFW event API ////////////////////////////////////////////////////////////////////////////////// Notifies shared code that a window has lost or received input focus//void _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused){ assert(window != NULL); assert(focused == GLFW_TRUE || focused == GLFW_FALSE); if (window->callbacks.focus) window->callbacks.focus((GLFWwindow*) window, focused); if (!focused) { int key, button; for (key = 0; key <= GLFW_KEY_LAST; key++) { if (window->keys[key] == GLFW_PRESS) { const int scancode = _glfw.platform.getKeyScancode(key); _glfwInputKey(window, key, scancode, GLFW_RELEASE, 0); } } for (button = 0; button <= GLFW_MOUSE_BUTTON_LAST; button++) { if (window->mouseButtons[button] == GLFW_PRESS) _glfwInputMouseClick(window, button, GLFW_RELEASE, 0); } }}// Notifies shared code that a window has moved// The position is specified in content area relative screen coordinates//void _glfwInputWindowPos(_GLFWwindow* window, int x, int y){ assert(window != NULL); if (window->callbacks.pos) window->callbacks.pos((GLFWwindow*) window, x, y);}// Notifies shared code that a window has been resized// The size is specified in screen coordinates//void _glfwInputWindowSize(_GLFWwindow* window, int width, int height){ assert(window != NULL); assert(width >= 0); assert(height >= 0); if (window->callbacks.size) window->callbacks.size((GLFWwindow*) window, width, height);}// Notifies shared code that a window has been iconified or restored//void _glfwInputWindowIconify(_GLFWwindow* window, GLFWbool iconified){ assert(window != NULL); assert(iconified == GLFW_TRUE || iconified == GLFW_FALSE); if (window->callbacks.iconify) window->callbacks.iconify((GLFWwindow*) window, iconified);}// Notifies shared code that a window has been maximized or restored//void _glfwInputWindowMaximize(_GLFWwindow* window, GLFWbool maximized){ assert(window != NULL); assert(maximized == GLFW_TRUE || maximized == GLFW_FALSE); if (window->callbacks.maximize) window->callbacks.maximize((GLFWwindow*) window, maximized);}// Notifies shared code that a window framebuffer has been resized// The size is specified in pixels//void _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height){ assert(window != NULL); assert(width >= 0); assert(height >= 0); if (window->callbacks.fbsize) window->callbacks.fbsize((GLFWwindow*) window, width, height);}// Notifies shared code that a window content scale has changed// The scale is specified as the ratio between the current and default DPI//void _glfwInputWindowContentScale(_GLFWwindow* window, float xscale, float yscale){ assert(window != NULL); assert(xscale > 0.f); assert(isfinite(xscale)); assert(yscale > 0.f); assert(isfinite(yscale)); if (window->callbacks.scale) window->callbacks.scale((GLFWwindow*) window, xscale, yscale);}// Notifies shared code that the window contents needs updating//void _glfwInputWindowDamage(_GLFWwindow* window){ assert(window != NULL); if (window->callbacks.refresh) window->callbacks.refresh((GLFWwindow*) window);}// Notifies shared code that the user wishes to close a window//void _glfwInputWindowCloseRequest(_GLFWwindow* window){ assert(window != NULL); window->shouldClose = GLFW_TRUE; if (window->callbacks.close) window->callbacks.close((GLFWwindow*) window);}// Notifies shared code that a window has changed its desired monitor//void _glfwInputWindowMonitor(_GLFWwindow* window, _GLFWmonitor* monitor){ assert(window != NULL); window->monitor = monitor;}//////////////////////////////////////////////////////////////////////////////// GLFW public API ////////////////////////////////////////////////////////////////////////////////GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share){ _GLFWfbconfig fbconfig; _GLFWctxconfig ctxconfig; _GLFWwndconfig wndconfig; _GLFWwindow* window; assert(title != NULL); assert(width >= 0); assert(height >= 0); _GLFW_REQUIRE_INIT_OR_RETURN(NULL); if (width <= 0 || height <= 0) { _glfwInputError(GLFW_INVALID_VALUE, "Invalid window size %ix%i", width, height); return NULL; } fbconfig = _glfw.hints.framebuffer; ctxconfig = _glfw.hints.context; wndconfig = _glfw.hints.window; wndconfig.width = width; wndconfig.height = height; ctxconfig.share = (_GLFWwindow*) share; if (!_glfwIsValidContextConfig(&ctxconfig)) return NULL; window = _glfw_calloc(1, sizeof(_GLFWwindow)); window->next = _glfw.windowListHead; _glfw.windowListHead = window; window->videoMode.width = width; window->videoMode.height = height; window->videoMode.redBits = fbconfig.redBits; window->videoMode.greenBits = fbconfig.greenBits; window->videoMode.blueBits = fbconfig.blueBits; window->videoMode.refreshRate = _glfw.hints.refreshRate; window->monitor = (_GLFWmonitor*) monitor; window->resizable = wndconfig.resizable; window->decorated = wndconfig.decorated; window->autoIconify = wndconfig.autoIconify; window->floating = wndconfig.floating; window->focusOnShow = wndconfig.focusOnShow; window->mousePassthrough = wndconfig.mousePassthrough; window->cursorMode = GLFW_CURSOR_NORMAL; window->doublebuffer = fbconfig.doublebuffer; window->minwidth = GLFW_DONT_CARE; window->minheight = GLFW_DONT_CARE; window->maxwidth = GLFW_DONT_CARE; window->maxheight = GLFW_DONT_CARE; window->numer = GLFW_DONT_CARE; window->denom = GLFW_DONT_CARE; window->title = _glfw_strdup(title); if (!_glfw.platform.createWindow(window, &wndconfig, &ctxconfig, &fbconfig)) { glfwDestroyWindow((GLFWwindow*) window); return NULL; } return (GLFWwindow*) window;}void glfwDefaultWindowHints(void){ _GLFW_REQUIRE_INIT(); // The default is OpenGL with minimum version 1.0 memset(&_glfw.hints.context, 0, sizeof(_glfw.hints.context)); _glfw.hints.context.client = GLFW_OPENGL_API; _glfw.hints.context.source = GLFW_NATIVE_CONTEXT_API; _glfw.hints.context.major = 1; _glfw.hints.context.minor = 0; // The default is a focused, visible, resizable window with decorations memset(&_glfw.hints.window, 0, sizeof(_glfw.hints.window)); _glfw.hints.window.resizable = true; _glfw.hints.window.visible = true; _glfw.hints.window.decorated = true; _glfw.hints.window.focused = true; _glfw.hints.window.autoIconify = true; _glfw.hints.window.centerCursor = true; _glfw.hints.window.focusOnShow = true; _glfw.hints.window.xpos = GLFW_ANY_POSITION; _glfw.hints.window.ypos = GLFW_ANY_POSITION; _glfw.hints.window.scaleFramebuffer = true; // The default is 24 bits of color, 24 bits of depth and 8 bits of stencil, // double buffered memset(&_glfw.hints.framebuffer, 0, sizeof(_glfw.hints.framebuffer)); _glfw.hints.framebuffer.redBits = 8; _glfw.hints.framebuffer.greenBits = 8; _glfw.hints.framebuffer.blueBits = 8; _glfw.hints.framebuffer.alphaBits = 8; _glfw.hints.framebuffer.depthBits = 24; _glfw.hints.framebuffer.stencilBits = 8; _glfw.hints.framebuffer.doublebuffer = true; // The default is to select the highest available refresh rate _glfw.hints.refreshRate = GLFW_DONT_CARE;}GLFWAPI void glfwWindowHint(int hint, int value){ _GLFW_REQUIRE_INIT(); switch (hint) { case GLFW_RED_BITS: _glfw.hints.framebuffer.redBits = value; return; case GLFW_GREEN_BITS: _glfw.hints.framebuffer.greenBits = value; return; case GLFW_BLUE_BITS: _glfw.hints.framebuffer.blueBits = value; return; case GLFW_ALPHA_BITS: _glfw.hints.framebuffer.alphaBits = value; return; case GLFW_DEPTH_BITS: _glfw.hints.framebuffer.depthBits = value; return; case GLFW_STENCIL_BITS: _glfw.hints.framebuffer.stencilBits = value; return; case GLFW_ACCUM_RED_BITS: _glfw.hints.framebuffer.accumRedBits = value; return; case GLFW_ACCUM_GREEN_BITS: _glfw.hints.framebuffer.accumGreenBits = value; return; case GLFW_ACCUM_BLUE_BITS: _glfw.hints.framebuffer.accumBlueBits = value; return; case GLFW_ACCUM_ALPHA_BITS: _glfw.hints.framebuffer.accumAlphaBits = value; return; case GLFW_AUX_BUFFERS: _glfw.hints.framebuffer.auxBuffers = value; return; case GLFW_STEREO: _glfw.hints.framebuffer.stereo = value; return; case GLFW_DOUBLEBUFFER: _glfw.hints.framebuffer.doublebuffer = value; return; case GLFW_TRANSPARENT_FRAMEBUFFER: _glfw.hints.framebuffer.transparent = value; return; case GLFW_SAMPLES: _glfw.hints.framebuffer.samples = value; return; case GLFW_SRGB_CAPABLE: _glfw.hints.framebuffer.sRGB = value; return; case GLFW_RESIZABLE: _glfw.hints.window.resizable = value; return; case GLFW_DECORATED: _glfw.hints.window.decorated = value; return; case GLFW_FOCUSED: _glfw.hints.window.focused = value; return; case GLFW_AUTO_ICONIFY: _glfw.hints.window.autoIconify = value; return; case GLFW_FLOATING: _glfw.hints.window.floating = value; return; case GLFW_MAXIMIZED: _glfw.hints.window.maximized = value; return; case GLFW_VISIBLE: _glfw.hints.window.visible = value; return; case GLFW_POSITION_X: _glfw.hints.window.xpos = value; return; case GLFW_POSITION_Y: _glfw.hints.window.ypos = value; return; case GLFW_WIN32_KEYBOARD_MENU: _glfw.hints.window.win32.keymenu = value; return; case GLFW_WIN32_SHOWDEFAULT: _glfw.hints.window.win32.showDefault = value; return; case GLFW_COCOA_GRAPHICS_SWITCHING: _glfw.hints.context.nsgl.offline = value; return; case GLFW_SCALE_TO_MONITOR: _glfw.hints.window.scaleToMonitor = value; return; case GLFW_SCALE_FRAMEBUFFER: case GLFW_COCOA_RETINA_FRAMEBUFFER: _glfw.hints.window.scaleFramebuffer = value; return; case GLFW_CENTER_CURSOR: _glfw.hints.window.centerCursor = value; return; case GLFW_FOCUS_ON_SHOW: _glfw.hints.window.focusOnShow = value; return; case GLFW_MOUSE_PASSTHROUGH: _glfw.hints.window.mousePassthrough = value; return; case GLFW_CLIENT_API: _glfw.hints.context.client = value; return; case GLFW_CONTEXT_CREATION_API: _glfw.hints.context.source = value; return; case GLFW_CONTEXT_VERSION_MAJOR: _glfw.hints.context.major = value; return; case GLFW_CONTEXT_VERSION_MINOR: _glfw.hints.context.minor = value; return; case GLFW_CONTEXT_ROBUSTNESS: _glfw.hints.context.robustness = value; return; case GLFW_OPENGL_FORWARD_COMPAT: _glfw.hints.context.forward = value; return; case GLFW_CONTEXT_DEBUG: _glfw.hints.context.debug = value; return; case GLFW_CONTEXT_NO_ERROR: _glfw.hints.context.noerror = value; return; case GLFW_OPENGL_PROFILE: _glfw.hints.context.profile = value; return; case GLFW_CONTEXT_RELEASE_BEHAVIOR: _glfw.hints.context.release = value; return; case GLFW_REFRESH_RATE: _glfw.hints.refreshRate = value; return; } _glfwInputError(GLFW_INVALID_ENUM, "Invalid window hint 0x%08X", hint);}GLFWAPI void glfwWindowHintString(int hint, const char* value){ assert(value != NULL); _GLFW_REQUIRE_INIT(); switch (hint) { case GLFW_COCOA_FRAME_NAME: strncpy(_glfw.hints.window.ns.frameName, value, sizeof(_glfw.hints.window.ns.frameName) - 1); return; case GLFW_X11_CLASS_NAME: strncpy(_glfw.hints.window.x11.className, value, sizeof(_glfw.hints.window.x11.className) - 1); return; case GLFW_X11_INSTANCE_NAME: strncpy(_glfw.hints.window.x11.instanceName, value, sizeof(_glfw.hints.window.x11.instanceName) - 1); return; case GLFW_WAYLAND_APP_ID: strncpy(_glfw.hints.window.wl.appId, value, sizeof(_glfw.hints.window.wl.appId) - 1); return; } _glfwInputError(GLFW_INVALID_ENUM, "Invalid window hint string 0x%08X", hint);}GLFWAPI void glfwDestroyWindow(GLFWwindow* handle){ _GLFW_REQUIRE_INIT(); _GLFWwindow* window = (_GLFWwindow*) handle; // Allow closing of NULL (to match the behavior of free) if (window == NULL) return; // Clear all callbacks to avoid exposing a half torn-down window object memset(&window->callbacks, 0, sizeof(window->callbacks)); // The window's context must not be current on another thread when the // window is destroyed if (window == _glfwPlatformGetTls(&_glfw.contextSlot)) glfwMakeContextCurrent(NULL); _glfw.platform.destroyWindow(window); // Unlink window from global linked list { _GLFWwindow** prev = &_glfw.windowListHead; while (*prev != window) prev = &((*prev)->next); *prev = window->next; } _glfw_free(window->title); _glfw_free(window);}Showing the first 500 of 1199 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/wl_init.cadded
//========================================================================// GLFW 3.5 Wayland - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_WAYLAND)#include <errno.h>#include <limits.h>#include <linux/input.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/mman.h>#include <sys/timerfd.h>#include <unistd.h>#include <time.h>#include <assert.h>#include "wayland-client-protocol.h"#include "xdg-shell-client-protocol.h"#include "xdg-decoration-unstable-v1-client-protocol.h"#include "viewporter-client-protocol.h"#include "relative-pointer-unstable-v1-client-protocol.h"#include "pointer-constraints-unstable-v1-client-protocol.h"#include "fractional-scale-v1-client-protocol.h"#include "xdg-activation-v1-client-protocol.h"#include "idle-inhibit-unstable-v1-client-protocol.h"// NOTE: Versions of wayland-scanner prior to 1.17.91 named every global array of// wl_interface pointers 'types', making it impossible to combine several unmodified// private-code files into a single compilation unit// HACK: We override this name with a macro for each file, allowing them to coexist#define types _glfw_wayland_types#include "wayland-client-protocol-code.h"#undef types#define types _glfw_xdg_shell_types#include "xdg-shell-client-protocol-code.h"#undef types#define types _glfw_xdg_decoration_types#include "xdg-decoration-unstable-v1-client-protocol-code.h"#undef types#define types _glfw_viewporter_types#include "viewporter-client-protocol-code.h"#undef types#define types _glfw_relative_pointer_types#include "relative-pointer-unstable-v1-client-protocol-code.h"#undef types#define types _glfw_pointer_constraints_types#include "pointer-constraints-unstable-v1-client-protocol-code.h"#undef types#define types _glfw_fractional_scale_types#include "fractional-scale-v1-client-protocol-code.h"#undef types#define types _glfw_xdg_activation_types#include "xdg-activation-v1-client-protocol-code.h"#undef types#define types _glfw_idle_inhibit_types#include "idle-inhibit-unstable-v1-client-protocol-code.h"#undef typesstatic void wmBaseHandlePing(void* userData, struct xdg_wm_base* wmBase, uint32_t serial){ xdg_wm_base_pong(wmBase, serial);}static const struct xdg_wm_base_listener wmBaseListener ={ wmBaseHandlePing};static void registryHandleGlobal(void* userData, struct wl_registry* registry, uint32_t name, const char* interface, uint32_t version){ if (strcmp(interface, "wl_compositor") == 0) { _glfw.wl.compositor = wl_registry_bind(registry, name, &wl_compositor_interface, _glfw_min(3, version)); } else if (strcmp(interface, "wl_subcompositor") == 0) { _glfw.wl.subcompositor = wl_registry_bind(registry, name, &wl_subcompositor_interface, 1); } else if (strcmp(interface, "wl_shm") == 0) { _glfw.wl.shm = wl_registry_bind(registry, name, &wl_shm_interface, 1); } else if (strcmp(interface, "wl_output") == 0) { _glfwAddOutputWayland(name, version); } else if (strcmp(interface, "wl_seat") == 0) { if (!_glfw.wl.seat) { _glfw.wl.seat = wl_registry_bind(registry, name, &wl_seat_interface, _glfw_min(8, version)); _glfwAddSeatListenerWayland(_glfw.wl.seat); } } else if (strcmp(interface, "wl_data_device_manager") == 0) { if (!_glfw.wl.dataDeviceManager) { _glfw.wl.dataDeviceManager = wl_registry_bind(registry, name, &wl_data_device_manager_interface, 1); } } else if (strcmp(interface, "xdg_wm_base") == 0) { _glfw.wl.wmBase = wl_registry_bind(registry, name, &xdg_wm_base_interface, 1); xdg_wm_base_add_listener(_glfw.wl.wmBase, &wmBaseListener, NULL); } else if (strcmp(interface, "zxdg_decoration_manager_v1") == 0) { _glfw.wl.decorationManager = wl_registry_bind(registry, name, &zxdg_decoration_manager_v1_interface, 1); } else if (strcmp(interface, "wp_viewporter") == 0) { _glfw.wl.viewporter = wl_registry_bind(registry, name, &wp_viewporter_interface, 1); } else if (strcmp(interface, "zwp_relative_pointer_manager_v1") == 0) { _glfw.wl.relativePointerManager = wl_registry_bind(registry, name, &zwp_relative_pointer_manager_v1_interface, 1); } else if (strcmp(interface, "zwp_pointer_constraints_v1") == 0) { _glfw.wl.pointerConstraints = wl_registry_bind(registry, name, &zwp_pointer_constraints_v1_interface, 1); } else if (strcmp(interface, "zwp_idle_inhibit_manager_v1") == 0) { _glfw.wl.idleInhibitManager = wl_registry_bind(registry, name, &zwp_idle_inhibit_manager_v1_interface, 1); } else if (strcmp(interface, "xdg_activation_v1") == 0) { _glfw.wl.activationManager = wl_registry_bind(registry, name, &xdg_activation_v1_interface, 1); } else if (strcmp(interface, "wp_fractional_scale_manager_v1") == 0) { _glfw.wl.fractionalScaleManager = wl_registry_bind(registry, name, &wp_fractional_scale_manager_v1_interface, 1); }}static void registryHandleGlobalRemove(void* userData, struct wl_registry* registry, uint32_t name){ for (int i = 0; i < _glfw.monitorCount; ++i) { _GLFWmonitor* monitor = _glfw.monitors[i]; if (monitor->wl.name == name) { _glfwInputMonitor(monitor, GLFW_DISCONNECTED, 0); return; } }}static const struct wl_registry_listener registryListener ={ registryHandleGlobal, registryHandleGlobalRemove};void libdecorHandleError(struct libdecor* context, enum libdecor_error error, const char* message){ _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: libdecor error %u: %s", error, message);}static const struct libdecor_interface libdecorInterface ={ libdecorHandleError};static void libdecorReadyCallback(void* userData, struct wl_callback* callback, uint32_t time){ _glfw.wl.libdecor.ready = GLFW_TRUE; wl_callback_destroy(callback);}static const struct wl_callback_listener libdecorReadyListener ={ libdecorReadyCallback};// Create key code translation tables//static void createKeyTables(void){ memset(_glfw.wl.keycodes, -1, sizeof(_glfw.wl.keycodes)); memset(_glfw.wl.scancodes, -1, sizeof(_glfw.wl.scancodes)); _glfw.wl.keycodes[KEY_GRAVE] = GLFW_KEY_GRAVE_ACCENT; _glfw.wl.keycodes[KEY_1] = GLFW_KEY_1; _glfw.wl.keycodes[KEY_2] = GLFW_KEY_2; _glfw.wl.keycodes[KEY_3] = GLFW_KEY_3; _glfw.wl.keycodes[KEY_4] = GLFW_KEY_4; _glfw.wl.keycodes[KEY_5] = GLFW_KEY_5; _glfw.wl.keycodes[KEY_6] = GLFW_KEY_6; _glfw.wl.keycodes[KEY_7] = GLFW_KEY_7; _glfw.wl.keycodes[KEY_8] = GLFW_KEY_8; _glfw.wl.keycodes[KEY_9] = GLFW_KEY_9; _glfw.wl.keycodes[KEY_0] = GLFW_KEY_0; _glfw.wl.keycodes[KEY_SPACE] = GLFW_KEY_SPACE; _glfw.wl.keycodes[KEY_MINUS] = GLFW_KEY_MINUS; _glfw.wl.keycodes[KEY_EQUAL] = GLFW_KEY_EQUAL; _glfw.wl.keycodes[KEY_Q] = GLFW_KEY_Q; _glfw.wl.keycodes[KEY_W] = GLFW_KEY_W; _glfw.wl.keycodes[KEY_E] = GLFW_KEY_E; _glfw.wl.keycodes[KEY_R] = GLFW_KEY_R; _glfw.wl.keycodes[KEY_T] = GLFW_KEY_T; _glfw.wl.keycodes[KEY_Y] = GLFW_KEY_Y; _glfw.wl.keycodes[KEY_U] = GLFW_KEY_U; _glfw.wl.keycodes[KEY_I] = GLFW_KEY_I; _glfw.wl.keycodes[KEY_O] = GLFW_KEY_O; _glfw.wl.keycodes[KEY_P] = GLFW_KEY_P; _glfw.wl.keycodes[KEY_LEFTBRACE] = GLFW_KEY_LEFT_BRACKET; _glfw.wl.keycodes[KEY_RIGHTBRACE] = GLFW_KEY_RIGHT_BRACKET; _glfw.wl.keycodes[KEY_A] = GLFW_KEY_A; _glfw.wl.keycodes[KEY_S] = GLFW_KEY_S; _glfw.wl.keycodes[KEY_D] = GLFW_KEY_D; _glfw.wl.keycodes[KEY_F] = GLFW_KEY_F; _glfw.wl.keycodes[KEY_G] = GLFW_KEY_G; _glfw.wl.keycodes[KEY_H] = GLFW_KEY_H; _glfw.wl.keycodes[KEY_J] = GLFW_KEY_J; _glfw.wl.keycodes[KEY_K] = GLFW_KEY_K; _glfw.wl.keycodes[KEY_L] = GLFW_KEY_L; _glfw.wl.keycodes[KEY_SEMICOLON] = GLFW_KEY_SEMICOLON; _glfw.wl.keycodes[KEY_APOSTROPHE] = GLFW_KEY_APOSTROPHE; _glfw.wl.keycodes[KEY_Z] = GLFW_KEY_Z; _glfw.wl.keycodes[KEY_X] = GLFW_KEY_X; _glfw.wl.keycodes[KEY_C] = GLFW_KEY_C; _glfw.wl.keycodes[KEY_V] = GLFW_KEY_V; _glfw.wl.keycodes[KEY_B] = GLFW_KEY_B; _glfw.wl.keycodes[KEY_N] = GLFW_KEY_N; _glfw.wl.keycodes[KEY_M] = GLFW_KEY_M; _glfw.wl.keycodes[KEY_COMMA] = GLFW_KEY_COMMA; _glfw.wl.keycodes[KEY_DOT] = GLFW_KEY_PERIOD; _glfw.wl.keycodes[KEY_SLASH] = GLFW_KEY_SLASH; _glfw.wl.keycodes[KEY_BACKSLASH] = GLFW_KEY_BACKSLASH; _glfw.wl.keycodes[KEY_ESC] = GLFW_KEY_ESCAPE; _glfw.wl.keycodes[KEY_TAB] = GLFW_KEY_TAB; _glfw.wl.keycodes[KEY_LEFTSHIFT] = GLFW_KEY_LEFT_SHIFT; _glfw.wl.keycodes[KEY_RIGHTSHIFT] = GLFW_KEY_RIGHT_SHIFT; _glfw.wl.keycodes[KEY_LEFTCTRL] = GLFW_KEY_LEFT_CONTROL; _glfw.wl.keycodes[KEY_RIGHTCTRL] = GLFW_KEY_RIGHT_CONTROL; _glfw.wl.keycodes[KEY_LEFTALT] = GLFW_KEY_LEFT_ALT; _glfw.wl.keycodes[KEY_RIGHTALT] = GLFW_KEY_RIGHT_ALT; _glfw.wl.keycodes[KEY_LEFTMETA] = GLFW_KEY_LEFT_SUPER; _glfw.wl.keycodes[KEY_RIGHTMETA] = GLFW_KEY_RIGHT_SUPER; _glfw.wl.keycodes[KEY_COMPOSE] = GLFW_KEY_MENU; _glfw.wl.keycodes[KEY_NUMLOCK] = GLFW_KEY_NUM_LOCK; _glfw.wl.keycodes[KEY_CAPSLOCK] = GLFW_KEY_CAPS_LOCK; _glfw.wl.keycodes[KEY_PRINT] = GLFW_KEY_PRINT_SCREEN; _glfw.wl.keycodes[KEY_SCROLLLOCK] = GLFW_KEY_SCROLL_LOCK; _glfw.wl.keycodes[KEY_PAUSE] = GLFW_KEY_PAUSE; _glfw.wl.keycodes[KEY_DELETE] = GLFW_KEY_DELETE; _glfw.wl.keycodes[KEY_BACKSPACE] = GLFW_KEY_BACKSPACE; _glfw.wl.keycodes[KEY_ENTER] = GLFW_KEY_ENTER; _glfw.wl.keycodes[KEY_HOME] = GLFW_KEY_HOME; _glfw.wl.keycodes[KEY_END] = GLFW_KEY_END; _glfw.wl.keycodes[KEY_PAGEUP] = GLFW_KEY_PAGE_UP; _glfw.wl.keycodes[KEY_PAGEDOWN] = GLFW_KEY_PAGE_DOWN; _glfw.wl.keycodes[KEY_INSERT] = GLFW_KEY_INSERT; _glfw.wl.keycodes[KEY_LEFT] = GLFW_KEY_LEFT; _glfw.wl.keycodes[KEY_RIGHT] = GLFW_KEY_RIGHT; _glfw.wl.keycodes[KEY_DOWN] = GLFW_KEY_DOWN; _glfw.wl.keycodes[KEY_UP] = GLFW_KEY_UP; _glfw.wl.keycodes[KEY_F1] = GLFW_KEY_F1; _glfw.wl.keycodes[KEY_F2] = GLFW_KEY_F2; _glfw.wl.keycodes[KEY_F3] = GLFW_KEY_F3; _glfw.wl.keycodes[KEY_F4] = GLFW_KEY_F4; _glfw.wl.keycodes[KEY_F5] = GLFW_KEY_F5; _glfw.wl.keycodes[KEY_F6] = GLFW_KEY_F6; _glfw.wl.keycodes[KEY_F7] = GLFW_KEY_F7; _glfw.wl.keycodes[KEY_F8] = GLFW_KEY_F8; _glfw.wl.keycodes[KEY_F9] = GLFW_KEY_F9; _glfw.wl.keycodes[KEY_F10] = GLFW_KEY_F10; _glfw.wl.keycodes[KEY_F11] = GLFW_KEY_F11; _glfw.wl.keycodes[KEY_F12] = GLFW_KEY_F12; _glfw.wl.keycodes[KEY_F13] = GLFW_KEY_F13; _glfw.wl.keycodes[KEY_F14] = GLFW_KEY_F14; _glfw.wl.keycodes[KEY_F15] = GLFW_KEY_F15; _glfw.wl.keycodes[KEY_F16] = GLFW_KEY_F16; _glfw.wl.keycodes[KEY_F17] = GLFW_KEY_F17; _glfw.wl.keycodes[KEY_F18] = GLFW_KEY_F18; _glfw.wl.keycodes[KEY_F19] = GLFW_KEY_F19; _glfw.wl.keycodes[KEY_F20] = GLFW_KEY_F20; _glfw.wl.keycodes[KEY_F21] = GLFW_KEY_F21; _glfw.wl.keycodes[KEY_F22] = GLFW_KEY_F22; _glfw.wl.keycodes[KEY_F23] = GLFW_KEY_F23; _glfw.wl.keycodes[KEY_F24] = GLFW_KEY_F24; _glfw.wl.keycodes[KEY_KPSLASH] = GLFW_KEY_KP_DIVIDE; _glfw.wl.keycodes[KEY_KPASTERISK] = GLFW_KEY_KP_MULTIPLY; _glfw.wl.keycodes[KEY_KPMINUS] = GLFW_KEY_KP_SUBTRACT; _glfw.wl.keycodes[KEY_KPPLUS] = GLFW_KEY_KP_ADD; _glfw.wl.keycodes[KEY_KP0] = GLFW_KEY_KP_0; _glfw.wl.keycodes[KEY_KP1] = GLFW_KEY_KP_1; _glfw.wl.keycodes[KEY_KP2] = GLFW_KEY_KP_2; _glfw.wl.keycodes[KEY_KP3] = GLFW_KEY_KP_3; _glfw.wl.keycodes[KEY_KP4] = GLFW_KEY_KP_4; _glfw.wl.keycodes[KEY_KP5] = GLFW_KEY_KP_5; _glfw.wl.keycodes[KEY_KP6] = GLFW_KEY_KP_6; _glfw.wl.keycodes[KEY_KP7] = GLFW_KEY_KP_7; _glfw.wl.keycodes[KEY_KP8] = GLFW_KEY_KP_8; _glfw.wl.keycodes[KEY_KP9] = GLFW_KEY_KP_9; _glfw.wl.keycodes[KEY_KPDOT] = GLFW_KEY_KP_DECIMAL; _glfw.wl.keycodes[KEY_KPEQUAL] = GLFW_KEY_KP_EQUAL; _glfw.wl.keycodes[KEY_KPENTER] = GLFW_KEY_KP_ENTER; _glfw.wl.keycodes[KEY_102ND] = GLFW_KEY_WORLD_2; for (int scancode = 0; scancode < 256; scancode++) { if (_glfw.wl.keycodes[scancode] > 0) _glfw.wl.scancodes[_glfw.wl.keycodes[scancode]] = scancode; }}static GLFWbool loadCursorTheme(void){ int cursorSize = 16; const char* sizeString = getenv("XCURSOR_SIZE"); if (sizeString) { errno = 0; const long cursorSizeLong = strtol(sizeString, NULL, 10); if (errno == 0 && cursorSizeLong > 0 && cursorSizeLong < INT_MAX) cursorSize = (int) cursorSizeLong; } const char* themeName = getenv("XCURSOR_THEME"); _glfw.wl.cursorTheme = wl_cursor_theme_load(themeName, cursorSize, _glfw.wl.shm); if (!_glfw.wl.cursorTheme) { _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: Failed to load default cursor theme"); return GLFW_FALSE; } // If this happens to be NULL, we just fallback to the scale=1 version. _glfw.wl.cursorThemeHiDPI = wl_cursor_theme_load(themeName, cursorSize * 2, _glfw.wl.shm); _glfw.wl.cursorSurface = wl_compositor_create_surface(_glfw.wl.compositor); _glfw.wl.cursorTimerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK); return GLFW_TRUE;}//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////GLFWbool _glfwConnectWayland(int platformID, _GLFWplatform* platform){ const _GLFWplatform wayland = { .platformID = GLFW_PLATFORM_WAYLAND, .init = _glfwInitWayland, .terminate = _glfwTerminateWayland, .getCursorPos = _glfwGetCursorPosWayland, .setCursorPos = _glfwSetCursorPosWayland, .setCursorMode = _glfwSetCursorModeWayland, .setRawMouseMotion = _glfwSetRawMouseMotionWayland, .rawMouseMotionSupported = _glfwRawMouseMotionSupportedWayland, .createCursor = _glfwCreateCursorWayland, .createStandardCursor = _glfwCreateStandardCursorWayland, .destroyCursor = _glfwDestroyCursorWayland, .setCursor = _glfwSetCursorWayland, .getScancodeName = _glfwGetScancodeNameWayland, .getKeyScancode = _glfwGetKeyScancodeWayland, .setClipboardString = _glfwSetClipboardStringWayland, .getClipboardString = _glfwGetClipboardStringWayland,#if defined(GLFW_BUILD_LINUX_JOYSTICK) .initJoysticks = _glfwInitJoysticksLinux, .terminateJoysticks = _glfwTerminateJoysticksLinux, .pollJoystick = _glfwPollJoystickLinux, .getMappingName = _glfwGetMappingNameLinux, .updateGamepadGUID = _glfwUpdateGamepadGUIDLinux,#else .initJoysticks = _glfwInitJoysticksNull, .terminateJoysticks = _glfwTerminateJoysticksNull, .pollJoystick = _glfwPollJoystickNull, .getMappingName = _glfwGetMappingNameNull, .updateGamepadGUID = _glfwUpdateGamepadGUIDNull,#endif .freeMonitor = _glfwFreeMonitorWayland, .getMonitorPos = _glfwGetMonitorPosWayland, .getMonitorContentScale = _glfwGetMonitorContentScaleWayland, .getMonitorWorkarea = _glfwGetMonitorWorkareaWayland, .getVideoModes = _glfwGetVideoModesWayland, .getVideoMode = _glfwGetVideoModeWayland, .getGammaRamp = _glfwGetGammaRampWayland, .setGammaRamp = _glfwSetGammaRampWayland, .createWindow = _glfwCreateWindowWayland, .destroyWindow = _glfwDestroyWindowWayland, .setWindowTitle = _glfwSetWindowTitleWayland, .setWindowIcon = _glfwSetWindowIconWayland, .getWindowPos = _glfwGetWindowPosWayland, .setWindowPos = _glfwSetWindowPosWayland, .getWindowSize = _glfwGetWindowSizeWayland, .setWindowSize = _glfwSetWindowSizeWayland, .setWindowSizeLimits = _glfwSetWindowSizeLimitsWayland, .setWindowAspectRatio = _glfwSetWindowAspectRatioWayland, .getFramebufferSize = _glfwGetFramebufferSizeWayland, .getWindowFrameSize = _glfwGetWindowFrameSizeWayland, .getWindowContentScale = _glfwGetWindowContentScaleWayland, .iconifyWindow = _glfwIconifyWindowWayland, .restoreWindow = _glfwRestoreWindowWayland, .maximizeWindow = _glfwMaximizeWindowWayland, .showWindow = _glfwShowWindowWayland, .hideWindow = _glfwHideWindowWayland, .requestWindowAttention = _glfwRequestWindowAttentionWayland, .focusWindow = _glfwFocusWindowWayland, .setWindowMonitor = _glfwSetWindowMonitorWayland, .windowFocused = _glfwWindowFocusedWayland, .windowIconified = _glfwWindowIconifiedWayland, .windowVisible = _glfwWindowVisibleWayland, .windowMaximized = _glfwWindowMaximizedWayland, .windowHovered = _glfwWindowHoveredWayland, .framebufferTransparent = _glfwFramebufferTransparentWayland, .getWindowOpacity = _glfwGetWindowOpacityWayland, .setWindowResizable = _glfwSetWindowResizableWayland, .setWindowDecorated = _glfwSetWindowDecoratedWayland, .setWindowFloating = _glfwSetWindowFloatingWayland, .setWindowOpacity = _glfwSetWindowOpacityWayland, .setWindowMousePassthrough = _glfwSetWindowMousePassthroughWayland, .pollEvents = _glfwPollEventsWayland,Showing the first 500 of 1020 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/wl_monitor.cadded
//========================================================================// GLFW 3.5 Wayland - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_WAYLAND)#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <math.h>#include <assert.h>#include "wayland-client-protocol.h"static void outputHandleGeometry(void* userData, struct wl_output* output, int32_t x, int32_t y, int32_t physicalWidth, int32_t physicalHeight, int32_t subpixel, const char* make, const char* model, int32_t transform){ struct _GLFWmonitor* monitor = userData; monitor->wl.x = x; monitor->wl.y = y; monitor->widthMM = physicalWidth; monitor->heightMM = physicalHeight; if (strlen(monitor->name) == 0) snprintf(monitor->name, sizeof(monitor->name), "%s %s", make, model);}static void outputHandleMode(void* userData, struct wl_output* output, uint32_t flags, int32_t width, int32_t height, int32_t refresh){ struct _GLFWmonitor* monitor = userData; GLFWvidmode mode; mode.width = width; mode.height = height; mode.redBits = 8; mode.greenBits = 8; mode.blueBits = 8; mode.refreshRate = (int) round(refresh / 1000.0); monitor->modeCount++; monitor->modes = _glfw_realloc(monitor->modes, monitor->modeCount * sizeof(GLFWvidmode)); monitor->modes[monitor->modeCount - 1] = mode; if (flags & WL_OUTPUT_MODE_CURRENT) monitor->wl.currentMode = monitor->modeCount - 1;}static void outputHandleDone(void* userData, struct wl_output* output){ struct _GLFWmonitor* monitor = userData; if (monitor->widthMM <= 0 || monitor->heightMM <= 0) { // If Wayland does not provide a physical size, assume the default 96 DPI const GLFWvidmode* mode = &monitor->modes[monitor->wl.currentMode]; monitor->widthMM = (int) (mode->width * 25.4f / 96.f); monitor->heightMM = (int) (mode->height * 25.4f / 96.f); } for (int i = 0; i < _glfw.monitorCount; i++) { if (_glfw.monitors[i] == monitor) return; } _glfwInputMonitor(monitor, GLFW_CONNECTED, _GLFW_INSERT_LAST);}static void outputHandleScale(void* userData, struct wl_output* output, int32_t factor){ struct _GLFWmonitor* monitor = userData; monitor->wl.scale = factor; for (_GLFWwindow* window = _glfw.windowListHead; window; window = window->next) { for (size_t i = 0; i < window->wl.outputScaleCount; i++) { if (window->wl.outputScales[i].output == monitor->wl.output) { window->wl.outputScales[i].factor = monitor->wl.scale; _glfwUpdateBufferScaleFromOutputsWayland(window); break; } } }}void outputHandleName(void* userData, struct wl_output* wl_output, const char* name){ struct _GLFWmonitor* monitor = userData; strncpy(monitor->name, name, sizeof(monitor->name) - 1);}void outputHandleDescription(void* userData, struct wl_output* wl_output, const char* description){}static const struct wl_output_listener outputListener ={ outputHandleGeometry, outputHandleMode, outputHandleDone, outputHandleScale, outputHandleName, outputHandleDescription,};//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////void _glfwAddOutputWayland(uint32_t name, uint32_t version){ if (version < 2) { _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: Unsupported output interface version"); return; } version = _glfw_min(version, WL_OUTPUT_NAME_SINCE_VERSION); struct wl_output* output = wl_registry_bind(_glfw.wl.registry, name, &wl_output_interface, version); if (!output) return; // The actual name of this output will be set in the geometry handler _GLFWmonitor* monitor = _glfwAllocMonitor("", 0, 0); monitor->wl.scale = 1; monitor->wl.output = output; monitor->wl.name = name; wl_proxy_set_tag((struct wl_proxy*) output, &_glfw.wl.tag); wl_output_add_listener(output, &outputListener, monitor);}//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void _glfwFreeMonitorWayland(_GLFWmonitor* monitor){ if (monitor->wl.output) wl_output_destroy(monitor->wl.output);}void _glfwGetMonitorPosWayland(_GLFWmonitor* monitor, int* xpos, int* ypos){ if (xpos) *xpos = monitor->wl.x; if (ypos) *ypos = monitor->wl.y;}void _glfwGetMonitorContentScaleWayland(_GLFWmonitor* monitor, float* xscale, float* yscale){ if (xscale) *xscale = (float) monitor->wl.scale; if (yscale) *yscale = (float) monitor->wl.scale;}void _glfwGetMonitorWorkareaWayland(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height){ if (xpos) *xpos = monitor->wl.x; if (ypos) *ypos = monitor->wl.y; if (width) *width = monitor->modes[monitor->wl.currentMode].width; if (height) *height = monitor->modes[monitor->wl.currentMode].height;}GLFWvidmode* _glfwGetVideoModesWayland(_GLFWmonitor* monitor, int* found){ *found = monitor->modeCount; return monitor->modes;}GLFWbool _glfwGetVideoModeWayland(_GLFWmonitor* monitor, GLFWvidmode* mode){ *mode = monitor->modes[monitor->wl.currentMode]; return GLFW_TRUE;}GLFWbool _glfwGetGammaRampWayland(_GLFWmonitor* monitor, GLFWgammaramp* ramp){ _glfwInputError(GLFW_FEATURE_UNAVAILABLE, "Wayland: Gamma ramp access is not available"); return GLFW_FALSE;}void _glfwSetGammaRampWayland(_GLFWmonitor* monitor, const GLFWgammaramp* ramp){ _glfwInputError(GLFW_FEATURE_UNAVAILABLE, "Wayland: Gamma ramp access is not available");}//////////////////////////////////////////////////////////////////////////////// GLFW native API ////////////////////////////////////////////////////////////////////////////////GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* handle){ _GLFW_REQUIRE_INIT_OR_RETURN(NULL); if (_glfw.platform.platformID != GLFW_PLATFORM_WAYLAND) { _glfwInputError(GLFW_PLATFORM_UNAVAILABLE, "Wayland: Platform not initialized"); return NULL; } _GLFWmonitor* monitor = (_GLFWmonitor*) handle; assert(monitor != NULL); return monitor->wl.output;}#endif // _GLFW_WAYLANDvendor/glfw/src/wl_platform.hadded
//========================================================================// GLFW 3.5 Wayland - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include <wayland-client-core.h>#include <xkbcommon/xkbcommon.h>#include <xkbcommon/xkbcommon-compose.h>typedef VkFlags VkWaylandSurfaceCreateFlagsKHR;typedef struct VkWaylandSurfaceCreateInfoKHR{ VkStructureType sType; const void* pNext; VkWaylandSurfaceCreateFlagsKHR flags; struct wl_display* display; struct wl_surface* surface;} VkWaylandSurfaceCreateInfoKHR;typedef VkResult (APIENTRY *PFN_vkCreateWaylandSurfaceKHR)(VkInstance,const VkWaylandSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice,uint32_t,struct wl_display*);typedef int (* PFN_wl_display_flush)(struct wl_display* display);typedef void (* PFN_wl_display_cancel_read)(struct wl_display* display);typedef int (* PFN_wl_display_dispatch_pending)(struct wl_display* display);typedef int (* PFN_wl_display_read_events)(struct wl_display* display);typedef struct wl_display* (* PFN_wl_display_connect)(const char*);typedef void (* PFN_wl_display_disconnect)(struct wl_display*);typedef int (* PFN_wl_display_roundtrip)(struct wl_display*);typedef int (* PFN_wl_display_get_fd)(struct wl_display*);typedef int (* PFN_wl_display_prepare_read)(struct wl_display*);typedef struct wl_event_queue* (* PFN_wl_display_create_queue)(struct wl_display*);typedef void (* PFN_wl_event_queue_destroy)(struct wl_event_queue*);typedef int (* PFN_wl_display_prepare_read_queue)(struct wl_display*,struct wl_event_queue*);typedef int (* PFN_wl_display_dispatch_queue_pending)(struct wl_display*,struct wl_event_queue*);typedef void (* PFN_wl_proxy_marshal)(struct wl_proxy*,uint32_t,...);typedef int (* PFN_wl_proxy_add_listener)(struct wl_proxy*,void(**)(void),void*);typedef void (* PFN_wl_proxy_destroy)(struct wl_proxy*);typedef struct wl_proxy* (* PFN_wl_proxy_marshal_constructor)(struct wl_proxy*,uint32_t,const struct wl_interface*,...);typedef struct wl_proxy* (* PFN_wl_proxy_marshal_constructor_versioned)(struct wl_proxy*,uint32_t,const struct wl_interface*,uint32_t,...);typedef void* (* PFN_wl_proxy_get_user_data)(struct wl_proxy*);typedef void (* PFN_wl_proxy_set_user_data)(struct wl_proxy*,void*);typedef void (* PFN_wl_proxy_set_tag)(struct wl_proxy*,const char*const*);typedef const char* const* (* PFN_wl_proxy_get_tag)(struct wl_proxy*);typedef uint32_t (* PFN_wl_proxy_get_version)(struct wl_proxy*);typedef struct wl_proxy* (* PFN_wl_proxy_marshal_flags)(struct wl_proxy*,uint32_t,const struct wl_interface*,uint32_t,uint32_t,...);typedef void* (* PFN_wl_proxy_create_wrapper)(void*);typedef void (* PFN_wl_proxy_wrapper_destroy)(void*);typedef void (* PFN_wl_proxy_set_queue)(struct wl_proxy*,struct wl_event_queue*);#define wl_display_flush _glfw.wl.client.display_flush#define wl_display_cancel_read _glfw.wl.client.display_cancel_read#define wl_display_dispatch_pending _glfw.wl.client.display_dispatch_pending#define wl_display_read_events _glfw.wl.client.display_read_events#define wl_display_disconnect _glfw.wl.client.display_disconnect#define wl_display_roundtrip _glfw.wl.client.display_roundtrip#define wl_display_get_fd _glfw.wl.client.display_get_fd#define wl_display_prepare_read _glfw.wl.client.display_prepare_read#define wl_display_create_queue _glfw.wl.client.display_create_queue#define wl_display_prepare_read_queue _glfw.wl.client.display_prepare_read_queue#define wl_display_dispatch_queue_pending _glfw.wl.client.display_dispatch_queue_pending#define wl_event_queue_destroy _glfw.wl.client.event_queue_destroy#define wl_proxy_marshal _glfw.wl.client.proxy_marshal#define wl_proxy_add_listener _glfw.wl.client.proxy_add_listener#define wl_proxy_destroy _glfw.wl.client.proxy_destroy#define wl_proxy_marshal_constructor _glfw.wl.client.proxy_marshal_constructor#define wl_proxy_marshal_constructor_versioned _glfw.wl.client.proxy_marshal_constructor_versioned#define wl_proxy_get_user_data _glfw.wl.client.proxy_get_user_data#define wl_proxy_set_user_data _glfw.wl.client.proxy_set_user_data#define wl_proxy_get_tag _glfw.wl.client.proxy_get_tag#define wl_proxy_set_tag _glfw.wl.client.proxy_set_tag#define wl_proxy_get_version _glfw.wl.client.proxy_get_version#define wl_proxy_marshal_flags _glfw.wl.client.proxy_marshal_flags#define wl_proxy_create_wrapper _glfw.wl.client.proxy_create_wrapper#define wl_proxy_wrapper_destroy _glfw.wl.client.proxy_wrapper_destroy#define wl_proxy_set_queue _glfw.wl.client.proxy_set_queuestruct wl_shm;struct wl_output;#define wl_display_interface _glfw_wl_display_interface#define wl_subcompositor_interface _glfw_wl_subcompositor_interface#define wl_compositor_interface _glfw_wl_compositor_interface#define wl_shm_interface _glfw_wl_shm_interface#define wl_data_device_manager_interface _glfw_wl_data_device_manager_interface#define wl_shell_interface _glfw_wl_shell_interface#define wl_buffer_interface _glfw_wl_buffer_interface#define wl_callback_interface _glfw_wl_callback_interface#define wl_data_device_interface _glfw_wl_data_device_interface#define wl_data_offer_interface _glfw_wl_data_offer_interface#define wl_data_source_interface _glfw_wl_data_source_interface#define wl_keyboard_interface _glfw_wl_keyboard_interface#define wl_output_interface _glfw_wl_output_interface#define wl_pointer_interface _glfw_wl_pointer_interface#define wl_region_interface _glfw_wl_region_interface#define wl_registry_interface _glfw_wl_registry_interface#define wl_seat_interface _glfw_wl_seat_interface#define wl_shell_surface_interface _glfw_wl_shell_surface_interface#define wl_shm_pool_interface _glfw_wl_shm_pool_interface#define wl_subsurface_interface _glfw_wl_subsurface_interface#define wl_surface_interface _glfw_wl_surface_interface#define wl_touch_interface _glfw_wl_touch_interface#define zwp_idle_inhibitor_v1_interface _glfw_zwp_idle_inhibitor_v1_interface#define zwp_idle_inhibit_manager_v1_interface _glfw_zwp_idle_inhibit_manager_v1_interface#define zwp_confined_pointer_v1_interface _glfw_zwp_confined_pointer_v1_interface#define zwp_locked_pointer_v1_interface _glfw_zwp_locked_pointer_v1_interface#define zwp_pointer_constraints_v1_interface _glfw_zwp_pointer_constraints_v1_interface#define zwp_relative_pointer_v1_interface _glfw_zwp_relative_pointer_v1_interface#define zwp_relative_pointer_manager_v1_interface _glfw_zwp_relative_pointer_manager_v1_interface#define wp_viewport_interface _glfw_wp_viewport_interface#define wp_viewporter_interface _glfw_wp_viewporter_interface#define xdg_toplevel_interface _glfw_xdg_toplevel_interface#define zxdg_toplevel_decoration_v1_interface _glfw_zxdg_toplevel_decoration_v1_interface#define zxdg_decoration_manager_v1_interface _glfw_zxdg_decoration_manager_v1_interface#define xdg_popup_interface _glfw_xdg_popup_interface#define xdg_positioner_interface _glfw_xdg_positioner_interface#define xdg_surface_interface _glfw_xdg_surface_interface#define xdg_toplevel_interface _glfw_xdg_toplevel_interface#define xdg_wm_base_interface _glfw_xdg_wm_base_interface#define xdg_activation_v1_interface _glfw_xdg_activation_v1_interface#define xdg_activation_token_v1_interface _glfw_xdg_activation_token_v1_interface#define wl_surface_interface _glfw_wl_surface_interface#define wp_fractional_scale_v1_interface _glfw_wp_fractional_scale_v1_interface#define GLFW_WAYLAND_WINDOW_STATE _GLFWwindowWayland wl;#define GLFW_WAYLAND_LIBRARY_WINDOW_STATE _GLFWlibraryWayland wl;#define GLFW_WAYLAND_MONITOR_STATE _GLFWmonitorWayland wl;#define GLFW_WAYLAND_CURSOR_STATE _GLFWcursorWayland wl;struct wl_cursor_image{ uint32_t width; uint32_t height; uint32_t hotspot_x; uint32_t hotspot_y; uint32_t delay;};struct wl_cursor{ unsigned int image_count; struct wl_cursor_image** images; char* name;};typedef struct wl_cursor_theme* (* PFN_wl_cursor_theme_load)(const char*, int, struct wl_shm*);typedef void (* PFN_wl_cursor_theme_destroy)(struct wl_cursor_theme*);typedef struct wl_cursor* (* PFN_wl_cursor_theme_get_cursor)(struct wl_cursor_theme*, const char*);typedef struct wl_buffer* (* PFN_wl_cursor_image_get_buffer)(struct wl_cursor_image*);#define wl_cursor_theme_load _glfw.wl.cursor.theme_load#define wl_cursor_theme_destroy _glfw.wl.cursor.theme_destroy#define wl_cursor_theme_get_cursor _glfw.wl.cursor.theme_get_cursor#define wl_cursor_image_get_buffer _glfw.wl.cursor.image_get_buffertypedef struct wl_egl_window* (* PFN_wl_egl_window_create)(struct wl_surface*, int, int);typedef void (* PFN_wl_egl_window_destroy)(struct wl_egl_window*);typedef void (* PFN_wl_egl_window_resize)(struct wl_egl_window*, int, int, int, int);#define wl_egl_window_create _glfw.wl.egl.window_create#define wl_egl_window_destroy _glfw.wl.egl.window_destroy#define wl_egl_window_resize _glfw.wl.egl.window_resizetypedef struct xkb_context* (* PFN_xkb_context_new)(enum xkb_context_flags);typedef void (* PFN_xkb_context_unref)(struct xkb_context*);typedef struct xkb_keymap* (* PFN_xkb_keymap_new_from_string)(struct xkb_context*, const char*, enum xkb_keymap_format, enum xkb_keymap_compile_flags);typedef void (* PFN_xkb_keymap_unref)(struct xkb_keymap*);typedef xkb_mod_index_t (* PFN_xkb_keymap_mod_get_index)(struct xkb_keymap*, const char*);typedef int (* PFN_xkb_keymap_key_repeats)(struct xkb_keymap*, xkb_keycode_t);typedef int (* PFN_xkb_keymap_key_get_syms_by_level)(struct xkb_keymap*,xkb_keycode_t,xkb_layout_index_t,xkb_level_index_t,const xkb_keysym_t**);typedef struct xkb_state* (* PFN_xkb_state_new)(struct xkb_keymap*);typedef void (* PFN_xkb_state_unref)(struct xkb_state*);typedef int (* PFN_xkb_state_key_get_syms)(struct xkb_state*, xkb_keycode_t, const xkb_keysym_t**);typedef enum xkb_state_component (* PFN_xkb_state_update_mask)(struct xkb_state*, xkb_mod_mask_t, xkb_mod_mask_t, xkb_mod_mask_t, xkb_layout_index_t, xkb_layout_index_t, xkb_layout_index_t);typedef xkb_layout_index_t (* PFN_xkb_state_key_get_layout)(struct xkb_state*,xkb_keycode_t);typedef int (* PFN_xkb_state_mod_index_is_active)(struct xkb_state*,xkb_mod_index_t,enum xkb_state_component);typedef uint32_t (* PFN_xkb_keysym_to_utf32)(xkb_keysym_t);typedef int (* PFN_xkb_keysym_to_utf8)(xkb_keysym_t, char*, size_t);#define xkb_context_new _glfw.wl.xkb.context_new#define xkb_context_unref _glfw.wl.xkb.context_unref#define xkb_keymap_new_from_string _glfw.wl.xkb.keymap_new_from_string#define xkb_keymap_unref _glfw.wl.xkb.keymap_unref#define xkb_keymap_mod_get_index _glfw.wl.xkb.keymap_mod_get_index#define xkb_keymap_key_repeats _glfw.wl.xkb.keymap_key_repeats#define xkb_keymap_key_get_syms_by_level _glfw.wl.xkb.keymap_key_get_syms_by_level#define xkb_state_new _glfw.wl.xkb.state_new#define xkb_state_unref _glfw.wl.xkb.state_unref#define xkb_state_key_get_syms _glfw.wl.xkb.state_key_get_syms#define xkb_state_update_mask _glfw.wl.xkb.state_update_mask#define xkb_state_key_get_layout _glfw.wl.xkb.state_key_get_layout#define xkb_state_mod_index_is_active _glfw.wl.xkb.state_mod_index_is_active#define xkb_keysym_to_utf32 _glfw.wl.xkb.keysym_to_utf32#define xkb_keysym_to_utf8 _glfw.wl.xkb.keysym_to_utf8typedef struct xkb_compose_table* (* PFN_xkb_compose_table_new_from_locale)(struct xkb_context*, const char*, enum xkb_compose_compile_flags);typedef void (* PFN_xkb_compose_table_unref)(struct xkb_compose_table*);typedef struct xkb_compose_state* (* PFN_xkb_compose_state_new)(struct xkb_compose_table*, enum xkb_compose_state_flags);typedef void (* PFN_xkb_compose_state_unref)(struct xkb_compose_state*);typedef enum xkb_compose_feed_result (* PFN_xkb_compose_state_feed)(struct xkb_compose_state*, xkb_keysym_t);typedef enum xkb_compose_status (* PFN_xkb_compose_state_get_status)(struct xkb_compose_state*);typedef xkb_keysym_t (* PFN_xkb_compose_state_get_one_sym)(struct xkb_compose_state*);#define xkb_compose_table_new_from_locale _glfw.wl.xkb.compose_table_new_from_locale#define xkb_compose_table_unref _glfw.wl.xkb.compose_table_unref#define xkb_compose_state_new _glfw.wl.xkb.compose_state_new#define xkb_compose_state_unref _glfw.wl.xkb.compose_state_unref#define xkb_compose_state_feed _glfw.wl.xkb.compose_state_feed#define xkb_compose_state_get_status _glfw.wl.xkb.compose_state_get_status#define xkb_compose_state_get_one_sym _glfw.wl.xkb.compose_state_get_one_symstruct libdecor;struct libdecor_frame;struct libdecor_state;struct libdecor_configuration;enum libdecor_error{ LIBDECOR_ERROR_COMPOSITOR_INCOMPATIBLE, LIBDECOR_ERROR_INVALID_FRAME_CONFIGURATION,};enum libdecor_window_state{ LIBDECOR_WINDOW_STATE_NONE = 0, LIBDECOR_WINDOW_STATE_ACTIVE = 1, LIBDECOR_WINDOW_STATE_MAXIMIZED = 2, LIBDECOR_WINDOW_STATE_FULLSCREEN = 4, LIBDECOR_WINDOW_STATE_TILED_LEFT = 8, LIBDECOR_WINDOW_STATE_TILED_RIGHT = 16, LIBDECOR_WINDOW_STATE_TILED_TOP = 32, LIBDECOR_WINDOW_STATE_TILED_BOTTOM = 64};enum libdecor_capabilities{ LIBDECOR_ACTION_MOVE = 1, LIBDECOR_ACTION_RESIZE = 2, LIBDECOR_ACTION_MINIMIZE = 4, LIBDECOR_ACTION_FULLSCREEN = 8, LIBDECOR_ACTION_CLOSE = 16};struct libdecor_interface{ void (* error)(struct libdecor*,enum libdecor_error,const char*); void (* reserved0)(void); void (* reserved1)(void); void (* reserved2)(void); void (* reserved3)(void); void (* reserved4)(void); void (* reserved5)(void); void (* reserved6)(void); void (* reserved7)(void); void (* reserved8)(void); void (* reserved9)(void);};struct libdecor_frame_interface{ void (* configure)(struct libdecor_frame*,struct libdecor_configuration*,void*); void (* close)(struct libdecor_frame*,void*); void (* commit)(struct libdecor_frame*,void*); void (* dismiss_popup)(struct libdecor_frame*,const char*,void*); void (* reserved0)(void); void (* reserved1)(void); void (* reserved2)(void); void (* reserved3)(void); void (* reserved4)(void); void (* reserved5)(void); void (* reserved6)(void); void (* reserved7)(void); void (* reserved8)(void); void (* reserved9)(void);};typedef struct libdecor* (* PFN_libdecor_new)(struct wl_display*,const struct libdecor_interface*);typedef void (* PFN_libdecor_unref)(struct libdecor*);typedef int (* PFN_libdecor_get_fd)(struct libdecor*);typedef int (* PFN_libdecor_dispatch)(struct libdecor*,int);typedef struct libdecor_frame* (* PFN_libdecor_decorate)(struct libdecor*,struct wl_surface*,const struct libdecor_frame_interface*,void*);typedef void (* PFN_libdecor_frame_unref)(struct libdecor_frame*);typedef void (* PFN_libdecor_frame_set_app_id)(struct libdecor_frame*,const char*);typedef void (* PFN_libdecor_frame_set_title)(struct libdecor_frame*,const char*);typedef void (* PFN_libdecor_frame_set_minimized)(struct libdecor_frame*);typedef void (* PFN_libdecor_frame_set_fullscreen)(struct libdecor_frame*,struct wl_output*);typedef void (* PFN_libdecor_frame_unset_fullscreen)(struct libdecor_frame*);typedef void (* PFN_libdecor_frame_map)(struct libdecor_frame*);typedef void (* PFN_libdecor_frame_commit)(struct libdecor_frame*,struct libdecor_state*,struct libdecor_configuration*);typedef void (* PFN_libdecor_frame_set_min_content_size)(struct libdecor_frame*,int,int);typedef void (* PFN_libdecor_frame_set_max_content_size)(struct libdecor_frame*,int,int);typedef void (* PFN_libdecor_frame_set_maximized)(struct libdecor_frame*);typedef void (* PFN_libdecor_frame_unset_maximized)(struct libdecor_frame*);typedef void (* PFN_libdecor_frame_set_capabilities)(struct libdecor_frame*,enum libdecor_capabilities);typedef void (* PFN_libdecor_frame_unset_capabilities)(struct libdecor_frame*,enum libdecor_capabilities);typedef void (* PFN_libdecor_frame_set_visibility)(struct libdecor_frame*,bool visible);typedef bool (* PFN_libdecor_frame_is_visible)(struct libdecor_frame*);typedef struct xdg_toplevel* (* PFN_libdecor_frame_get_xdg_toplevel)(struct libdecor_frame*);typedef bool (* PFN_libdecor_configuration_get_content_size)(struct libdecor_configuration*,struct libdecor_frame*,int*,int*);typedef bool (* PFN_libdecor_configuration_get_window_state)(struct libdecor_configuration*,enum libdecor_window_state*);typedef struct libdecor_state* (* PFN_libdecor_state_new)(int,int);typedef void (* PFN_libdecor_state_free)(struct libdecor_state*);#define libdecor_new _glfw.wl.libdecor.libdecor_new_#define libdecor_unref _glfw.wl.libdecor.libdecor_unref_#define libdecor_get_fd _glfw.wl.libdecor.libdecor_get_fd_#define libdecor_dispatch _glfw.wl.libdecor.libdecor_dispatch_#define libdecor_decorate _glfw.wl.libdecor.libdecor_decorate_#define libdecor_frame_unref _glfw.wl.libdecor.libdecor_frame_unref_#define libdecor_frame_set_app_id _glfw.wl.libdecor.libdecor_frame_set_app_id_#define libdecor_frame_set_title _glfw.wl.libdecor.libdecor_frame_set_title_#define libdecor_frame_set_minimized _glfw.wl.libdecor.libdecor_frame_set_minimized_#define libdecor_frame_set_fullscreen _glfw.wl.libdecor.libdecor_frame_set_fullscreen_#define libdecor_frame_unset_fullscreen _glfw.wl.libdecor.libdecor_frame_unset_fullscreen_#define libdecor_frame_map _glfw.wl.libdecor.libdecor_frame_map_#define libdecor_frame_commit _glfw.wl.libdecor.libdecor_frame_commit_#define libdecor_frame_set_min_content_size _glfw.wl.libdecor.libdecor_frame_set_min_content_size_#define libdecor_frame_set_max_content_size _glfw.wl.libdecor.libdecor_frame_set_max_content_size_#define libdecor_frame_set_maximized _glfw.wl.libdecor.libdecor_frame_set_maximized_#define libdecor_frame_unset_maximized _glfw.wl.libdecor.libdecor_frame_unset_maximized_#define libdecor_frame_set_capabilities _glfw.wl.libdecor.libdecor_frame_set_capabilities_#define libdecor_frame_unset_capabilities _glfw.wl.libdecor.libdecor_frame_unset_capabilities_#define libdecor_frame_set_visibility _glfw.wl.libdecor.libdecor_frame_set_visibility_#define libdecor_frame_is_visible _glfw.wl.libdecor.libdecor_frame_is_visible_#define libdecor_frame_get_xdg_toplevel _glfw.wl.libdecor.libdecor_frame_get_xdg_toplevel_#define libdecor_configuration_get_content_size _glfw.wl.libdecor.libdecor_configuration_get_content_size_#define libdecor_configuration_get_window_state _glfw.wl.libdecor.libdecor_configuration_get_window_state_#define libdecor_state_new _glfw.wl.libdecor.libdecor_state_new_#define libdecor_state_free _glfw.wl.libdecor.libdecor_state_free_typedef struct _GLFWfallbackEdgeWayland{ struct wl_surface* surface; struct wl_subsurface* subsurface; struct wp_viewport* viewport;} _GLFWfallbackEdgeWayland;typedef struct _GLFWofferWayland{ struct wl_data_offer* offer; GLFWbool text_plain_utf8; GLFWbool text_uri_list;} _GLFWofferWayland;typedef struct _GLFWscaleWayland{ struct wl_output* output; int32_t factor;} _GLFWscaleWayland;// Wayland-specific per-window data//typedef struct _GLFWwindowWayland{ int width, height; int fbWidth, fbHeight; GLFWbool visible; GLFWbool maximized; GLFWbool activated; GLFWbool fullscreen; GLFWbool transparent; GLFWbool scaleFramebuffer; struct wl_surface* surface; struct { struct wl_event_queue* queue; struct wl_egl_window* window; struct wl_callback* callback; struct wl_surface* wrapper; int interval; } egl; struct { int width, height; GLFWbool maximized; GLFWbool iconified; GLFWbool activated; GLFWbool fullscreen; } pending; struct { struct xdg_surface* surface; struct xdg_toplevel* toplevel; struct zxdg_toplevel_decoration_v1* decoration; uint32_t decorationMode; } xdg; struct { struct libdecor_frame* frame; } libdecor; double cursorPosX, cursorPosY; char* appId; // We need to track the monitors the window spans on to calculate the // optimal scaling factor. int32_t bufferScale; _GLFWscaleWayland* outputScales; size_t outputScaleCount; size_t outputScaleSize; struct wp_viewport* scalingViewport; uint32_t scalingNumerator; struct wp_fractional_scale_v1* fractionalScale; struct zwp_relative_pointer_v1* relativePointer; struct zwp_locked_pointer_v1* lockedPointer; struct zwp_confined_pointer_v1* confinedPointer; struct zwp_idle_inhibitor_v1* idleInhibitor; struct xdg_activation_token_v1* activationToken; struct { GLFWbool decorations; struct wl_buffer* buffer; _GLFWfallbackEdgeWayland top, left, right, bottom; double pointerX, pointerY; uint32_t buttonPressSerial; const char* cursorName; } fallback;} _GLFWwindowWayland;// Wayland-specific global data//typedef struct _GLFWlibraryWayland{ struct wl_display* display; struct wl_registry* registry; struct wl_compositor* compositor; struct wl_subcompositor* subcompositor; struct wl_shm* shm; struct wl_seat* seat; struct wl_pointer* pointer; struct wl_keyboard* keyboard; struct wl_data_device_manager* dataDeviceManager; struct wl_data_device* dataDevice; struct xdg_wm_base* wmBase; struct zxdg_decoration_manager_v1* decorationManager; struct wp_viewporter* viewporter; struct zwp_relative_pointer_manager_v1* relativePointerManager; struct zwp_pointer_constraints_v1* pointerConstraints; struct zwp_idle_inhibit_manager_v1* idleInhibitManager; struct xdg_activation_v1* activationManager; struct wp_fractional_scale_manager_v1* fractionalScaleManager; _GLFWofferWayland* offers; unsigned int offerCount; struct wl_data_offer* selectionOffer; struct wl_data_source* selectionSource; struct wl_data_offer* dragOffer; _GLFWwindow* dragFocus; uint32_t dragSerial; const char* tag; struct wl_surface* pointerSurface; struct wl_cursor_theme* cursorTheme; struct wl_cursor_theme* cursorThemeHiDPI; struct wl_surface* cursorSurface; int cursorTimerfd; uint32_t serial; uint32_t pointerEnterSerial; int keyRepeatTimerfd; int32_t keyRepeatRate; int32_t keyRepeatDelay; int keyRepeatScancode; char* clipboardString; short int keycodes[256]; short int scancodes[GLFW_KEY_LAST + 1]; char keynames[GLFW_KEY_LAST + 1][5]; struct { struct wl_surface* pointerSurface; unsigned int events; double pointerX; double pointerY; double scrollX; double scrollY;Showing the first 500 of 737 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/wl_window.cadded
//========================================================================// GLFW 3.5 Wayland - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2014 Jonas Ådahl <jadahl@gmail.com>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#if !defined(_GNU_SOURCE) #define _GNU_SOURCE#endif#include "internal.h"#if defined(_GLFW_WAYLAND)#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <assert.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <sys/mman.h>#include <sys/timerfd.h>#include <poll.h>#include <linux/input-event-codes.h>#include "wayland-client-protocol.h"#include "xdg-shell-client-protocol.h"#include "xdg-decoration-unstable-v1-client-protocol.h"#include "viewporter-client-protocol.h"#include "relative-pointer-unstable-v1-client-protocol.h"#include "pointer-constraints-unstable-v1-client-protocol.h"#include "xdg-activation-v1-client-protocol.h"#include "idle-inhibit-unstable-v1-client-protocol.h"#include "fractional-scale-v1-client-protocol.h"#define GLFW_BORDER_SIZE 4#define GLFW_CAPTION_HEIGHT 24#define GLFW_PENDING_SURFACE 1#define GLFW_PENDING_BUTTON 2#define GLFW_PENDING_MOTION 4#define GLFW_PENDING_SCROLL 8#define GLFW_PENDING_DISCRETE 16static int createTmpfileCloexec(char* tmpname){ int fd; fd = mkostemp(tmpname, O_CLOEXEC); if (fd >= 0) unlink(tmpname); return fd;}/* * Create a new, unique, anonymous file of the given size, and * return the file descriptor for it. The file descriptor is set * CLOEXEC. The file is immediately suitable for mmap()'ing * the given size at offset zero. * * The file should not have a permanent backing store like a disk, * but may have if XDG_RUNTIME_DIR is not properly implemented in OS. * * The file name is deleted from the file system. * * The file is suitable for buffer sharing between processes by * transmitting the file descriptor over Unix sockets using the * SCM_RIGHTS methods. * * posix_fallocate() is used to guarantee that disk space is available * for the file at the given size. If disk space is insufficient, errno * is set to ENOSPC. If posix_fallocate() is not supported, program may * receive SIGBUS on accessing mmap()'ed file contents instead. */static int createAnonymousFile(off_t size){ static const char template[] = "/glfw-shared-XXXXXX"; const char* path; char* name; int fd; int ret;#ifdef HAVE_MEMFD_CREATE fd = memfd_create("glfw-shared", MFD_CLOEXEC | MFD_ALLOW_SEALING); if (fd >= 0) { // We can add this seal before calling posix_fallocate(), as the file // is currently zero-sized anyway. // // There is also no need to check for the return value, we couldn’t do // anything with it anyway. fcntl(fd, F_ADD_SEALS, F_SEAL_SHRINK | F_SEAL_SEAL); } else#elif defined(SHM_ANON) fd = shm_open(SHM_ANON, O_RDWR | O_CLOEXEC, 0600); if (fd < 0)#endif { path = getenv("XDG_RUNTIME_DIR"); if (!path) { errno = ENOENT; return -1; } name = _glfw_calloc(strlen(path) + sizeof(template), 1); strcpy(name, path); strcat(name, template); fd = createTmpfileCloexec(name); _glfw_free(name); if (fd < 0) return -1; }#if defined(SHM_ANON) // posix_fallocate does not work on SHM descriptors ret = ftruncate(fd, size);#else ret = posix_fallocate(fd, 0, size);#endif if (ret != 0) { close(fd); errno = ret; return -1; } return fd;}static struct wl_buffer* createShmBuffer(const GLFWimage* image){ const int stride = image->width * 4; const int length = image->width * image->height * 4; const int fd = createAnonymousFile(length); if (fd < 0) { _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: Failed to create buffer file of size %d: %s", length, strerror(errno)); return NULL; } void* data = mmap(NULL, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (data == MAP_FAILED) { _glfwInputError(GLFW_PLATFORM_ERROR, "Wayland: Failed to map file: %s", strerror(errno)); close(fd); return NULL; } struct wl_shm_pool* pool = wl_shm_create_pool(_glfw.wl.shm, fd, length); close(fd); unsigned char* source = (unsigned char*) image->pixels; unsigned char* target = data; for (int i = 0; i < image->width * image->height; i++, source += 4) { unsigned int alpha = source[3]; *target++ = (unsigned char) ((source[2] * alpha) / 255); *target++ = (unsigned char) ((source[1] * alpha) / 255); *target++ = (unsigned char) ((source[0] * alpha) / 255); *target++ = (unsigned char) alpha; } struct wl_buffer* buffer = wl_shm_pool_create_buffer(pool, 0, image->width, image->height, stride, WL_SHM_FORMAT_ARGB8888); munmap(data, length); wl_shm_pool_destroy(pool); return buffer;}static void callbackHandleDone(void* userData, struct wl_callback* callback, uint32_t data){ wl_callback_destroy(callback);}static const struct wl_callback_listener noopCallbackListener ={ callbackHandleDone};static void createFallbackEdge(_GLFWwindow* window, _GLFWfallbackEdgeWayland* edge, struct wl_surface* parent, struct wl_buffer* buffer, int x, int y, int width, int height){ edge->surface = wl_compositor_create_surface(_glfw.wl.compositor); wl_surface_set_user_data(edge->surface, window); wl_proxy_set_tag((struct wl_proxy*) edge->surface, &_glfw.wl.tag); edge->subsurface = wl_subcompositor_get_subsurface(_glfw.wl.subcompositor, edge->surface, parent); wl_subsurface_set_position(edge->subsurface, x, y); edge->viewport = wp_viewporter_get_viewport(_glfw.wl.viewporter, edge->surface); wp_viewport_set_destination(edge->viewport, width, height); wl_surface_attach(edge->surface, buffer, 0, 0); struct wl_region* region = wl_compositor_create_region(_glfw.wl.compositor); wl_region_add(region, 0, 0, width, height); wl_surface_set_opaque_region(edge->surface, region); wl_surface_commit(edge->surface); wl_region_destroy(region);}static void createFallbackDecorations(_GLFWwindow* window){ unsigned char data[] = { 224, 224, 224, 255 }; const GLFWimage image = { 1, 1, data }; if (!_glfw.wl.viewporter) return; if (!window->wl.fallback.buffer) window->wl.fallback.buffer = createShmBuffer(&image); if (!window->wl.fallback.buffer) return; createFallbackEdge(window, &window->wl.fallback.top, window->wl.surface, window->wl.fallback.buffer, 0, -GLFW_CAPTION_HEIGHT, window->wl.width, GLFW_CAPTION_HEIGHT); createFallbackEdge(window, &window->wl.fallback.left, window->wl.surface, window->wl.fallback.buffer, -GLFW_BORDER_SIZE, -GLFW_CAPTION_HEIGHT, GLFW_BORDER_SIZE, window->wl.height + GLFW_CAPTION_HEIGHT); createFallbackEdge(window, &window->wl.fallback.right, window->wl.surface, window->wl.fallback.buffer, window->wl.width, -GLFW_CAPTION_HEIGHT, GLFW_BORDER_SIZE, window->wl.height + GLFW_CAPTION_HEIGHT); createFallbackEdge(window, &window->wl.fallback.bottom, window->wl.surface, window->wl.fallback.buffer, -GLFW_BORDER_SIZE, window->wl.height, window->wl.width + GLFW_BORDER_SIZE * 2, GLFW_BORDER_SIZE); window->wl.fallback.decorations = GLFW_TRUE;}static void destroyFallbackEdge(_GLFWfallbackEdgeWayland* edge){ if (edge->surface == _glfw.wl.pointerSurface) _glfw.wl.pointerSurface = NULL; if (edge->subsurface) wl_subsurface_destroy(edge->subsurface); if (edge->surface) wl_surface_destroy(edge->surface); if (edge->viewport) wp_viewport_destroy(edge->viewport); edge->surface = NULL; edge->subsurface = NULL; edge->viewport = NULL;}static void destroyFallbackDecorations(_GLFWwindow* window){ window->wl.fallback.decorations = GLFW_FALSE; destroyFallbackEdge(&window->wl.fallback.top); destroyFallbackEdge(&window->wl.fallback.left); destroyFallbackEdge(&window->wl.fallback.right); destroyFallbackEdge(&window->wl.fallback.bottom);}static void updateFallbackDecorationCursor(_GLFWwindow* window, double xpos, double ypos){ window->wl.fallback.pointerX = xpos; window->wl.fallback.pointerY = ypos; const char* cursorName = "left_ptr"; if (window->resizable) { if (_glfw.wl.pointerSurface == window->wl.fallback.top.surface) { if (ypos < GLFW_BORDER_SIZE) cursorName = "n-resize"; } else if (_glfw.wl.pointerSurface == window->wl.fallback.left.surface) { if (ypos < GLFW_BORDER_SIZE) cursorName = "nw-resize"; else cursorName = "w-resize"; } else if (_glfw.wl.pointerSurface == window->wl.fallback.right.surface) { if (ypos < GLFW_BORDER_SIZE) cursorName = "ne-resize"; else cursorName = "e-resize"; } else if (_glfw.wl.pointerSurface == window->wl.fallback.bottom.surface) { if (xpos < GLFW_BORDER_SIZE) cursorName = "sw-resize"; else if (xpos > window->wl.width + GLFW_BORDER_SIZE) cursorName = "se-resize"; else cursorName = "s-resize"; } } if (window->wl.fallback.cursorName != cursorName) { struct wl_surface* surface = _glfw.wl.cursorSurface; struct wl_cursor_theme* theme = _glfw.wl.cursorTheme; int scale = 1; if (window->wl.bufferScale > 1 && _glfw.wl.cursorThemeHiDPI) { // We only support up to scale=2 for now, since libwayland-cursor // requires us to load a different theme for each size. scale = 2; theme = _glfw.wl.cursorThemeHiDPI; } struct wl_cursor* cursor = wl_cursor_theme_get_cursor(theme, cursorName); if (!cursor) return; // TODO: handle animated cursors too. struct wl_cursor_image* image = cursor->images[0]; if (!image) return; struct wl_buffer* buffer = wl_cursor_image_get_buffer(image); if (!buffer) return; wl_pointer_set_cursor(_glfw.wl.pointer, _glfw.wl.pointerEnterSerial, surface, image->hotspot_x / scale, image->hotspot_y / scale); wl_surface_set_buffer_scale(surface, scale); wl_surface_attach(surface, buffer, 0, 0); wl_surface_damage(surface, 0, 0, image->width, image->height); wl_surface_commit(surface); window->wl.fallback.cursorName = cursorName; }}static void handleFallbackDecorationButton(_GLFWwindow* window, int button, int action){ if (action != GLFW_PRESS) return; const double xpos = window->wl.fallback.pointerX; const double ypos = window->wl.fallback.pointerY; const uint32_t serial = window->wl.fallback.buttonPressSerial; if (button == GLFW_MOUSE_BUTTON_LEFT) { uint32_t edges = XDG_TOPLEVEL_RESIZE_EDGE_NONE; if (_glfw.wl.pointerSurface == window->wl.fallback.top.surface) { if (ypos < GLFW_BORDER_SIZE) edges = XDG_TOPLEVEL_RESIZE_EDGE_TOP; else xdg_toplevel_move(window->wl.xdg.toplevel, _glfw.wl.seat, serial); } else if (_glfw.wl.pointerSurface == window->wl.fallback.left.surface) { if (ypos < GLFW_BORDER_SIZE) edges = XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT; else edges = XDG_TOPLEVEL_RESIZE_EDGE_LEFT; } else if (_glfw.wl.pointerSurface == window->wl.fallback.right.surface) { if (ypos < GLFW_BORDER_SIZE) edges = XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT; else edges = XDG_TOPLEVEL_RESIZE_EDGE_RIGHT; } else if (_glfw.wl.pointerSurface == window->wl.fallback.bottom.surface) { if (xpos < GLFW_BORDER_SIZE) edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT; else if (xpos > window->wl.width + GLFW_BORDER_SIZE) edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT; else edges = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM; } if (edges != XDG_TOPLEVEL_RESIZE_EDGE_NONE) xdg_toplevel_resize(window->wl.xdg.toplevel, _glfw.wl.seat, serial, edges); } else if (button == GLFW_MOUSE_BUTTON_RIGHT) { if (!window->wl.xdg.toplevel) return; if (_glfw.wl.pointerSurface != window->wl.fallback.top.surface) return; if (ypos < GLFW_BORDER_SIZE) return; xdg_toplevel_show_window_menu(window->wl.xdg.toplevel, _glfw.wl.seat, serial, xpos, ypos - GLFW_CAPTION_HEIGHT - GLFW_BORDER_SIZE); }}static void xdgDecorationHandleConfigure(void* userData, struct zxdg_toplevel_decoration_v1* decoration, uint32_t mode){ _GLFWwindow* window = userData; window->wl.xdg.decorationMode = mode; if (mode == ZXDG_TOPLEVEL_DECORATION_V1_MODE_CLIENT_SIDE) { if (window->decorated && !window->monitor) createFallbackDecorations(window); } else destroyFallbackDecorations(window);}static const struct zxdg_toplevel_decoration_v1_listener xdgDecorationListener ={ xdgDecorationHandleConfigure,};// Makes the surface considered as XRGB instead of ARGB.static void setContentAreaOpaque(_GLFWwindow* window){ struct wl_region* region; region = wl_compositor_create_region(_glfw.wl.compositor); if (!region) return; wl_region_add(region, 0, 0, window->wl.width, window->wl.height); wl_surface_set_opaque_region(window->wl.surface, region); wl_region_destroy(region);}static void resizeFramebuffer(_GLFWwindow* window){ if (window->wl.fractionalScale) { // Round halfway away from zero per fractional-scale-v1 protocol spec window->wl.fbWidth = (window->wl.width * window->wl.scalingNumerator + 60) / 120; window->wl.fbHeight = (window->wl.height * window->wl.scalingNumerator + 60) / 120; } else { window->wl.fbWidth = window->wl.width * window->wl.bufferScale; window->wl.fbHeight = window->wl.height * window->wl.bufferScale; } if (window->wl.egl.window) { wl_egl_window_resize(window->wl.egl.window, window->wl.fbWidth, window->wl.fbHeight, 0, 0); } if (!window->wl.transparent)Showing the first 500 of 3621 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/x11_init.cadded
//========================================================================// GLFW 3.5 X11 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_X11)#include <stdlib.h>#include <string.h>#include <limits.h>#include <stdio.h>#include <locale.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <assert.h>// Translate the X11 KeySyms for a key to a GLFW key code// NOTE: This is only used as a fallback, in case the XKB method fails// It is layout-dependent and will fail partially on most non-US layouts//static int translateKeySyms(const KeySym* keysyms, int width){ if (width > 1) { switch (keysyms[1]) { case XK_KP_0: return GLFW_KEY_KP_0; case XK_KP_1: return GLFW_KEY_KP_1; case XK_KP_2: return GLFW_KEY_KP_2; case XK_KP_3: return GLFW_KEY_KP_3; case XK_KP_4: return GLFW_KEY_KP_4; case XK_KP_5: return GLFW_KEY_KP_5; case XK_KP_6: return GLFW_KEY_KP_6; case XK_KP_7: return GLFW_KEY_KP_7; case XK_KP_8: return GLFW_KEY_KP_8; case XK_KP_9: return GLFW_KEY_KP_9; case XK_KP_Separator: case XK_KP_Decimal: return GLFW_KEY_KP_DECIMAL; case XK_KP_Equal: return GLFW_KEY_KP_EQUAL; case XK_KP_Enter: return GLFW_KEY_KP_ENTER; default: break; } } switch (keysyms[0]) { case XK_Escape: return GLFW_KEY_ESCAPE; case XK_Tab: return GLFW_KEY_TAB; case XK_Shift_L: return GLFW_KEY_LEFT_SHIFT; case XK_Shift_R: return GLFW_KEY_RIGHT_SHIFT; case XK_Control_L: return GLFW_KEY_LEFT_CONTROL; case XK_Control_R: return GLFW_KEY_RIGHT_CONTROL; case XK_Meta_L: case XK_Alt_L: return GLFW_KEY_LEFT_ALT; case XK_Mode_switch: // Mapped to Alt_R on many keyboards case XK_ISO_Level3_Shift: // AltGr on at least some machines case XK_Meta_R: case XK_Alt_R: return GLFW_KEY_RIGHT_ALT; case XK_Super_L: return GLFW_KEY_LEFT_SUPER; case XK_Super_R: return GLFW_KEY_RIGHT_SUPER; case XK_Menu: return GLFW_KEY_MENU; case XK_Num_Lock: return GLFW_KEY_NUM_LOCK; case XK_Caps_Lock: return GLFW_KEY_CAPS_LOCK; case XK_Print: return GLFW_KEY_PRINT_SCREEN; case XK_Scroll_Lock: return GLFW_KEY_SCROLL_LOCK; case XK_Pause: return GLFW_KEY_PAUSE; case XK_Delete: return GLFW_KEY_DELETE; case XK_BackSpace: return GLFW_KEY_BACKSPACE; case XK_Return: return GLFW_KEY_ENTER; case XK_Home: return GLFW_KEY_HOME; case XK_End: return GLFW_KEY_END; case XK_Page_Up: return GLFW_KEY_PAGE_UP; case XK_Page_Down: return GLFW_KEY_PAGE_DOWN; case XK_Insert: return GLFW_KEY_INSERT; case XK_Left: return GLFW_KEY_LEFT; case XK_Right: return GLFW_KEY_RIGHT; case XK_Down: return GLFW_KEY_DOWN; case XK_Up: return GLFW_KEY_UP; case XK_F1: return GLFW_KEY_F1; case XK_F2: return GLFW_KEY_F2; case XK_F3: return GLFW_KEY_F3; case XK_F4: return GLFW_KEY_F4; case XK_F5: return GLFW_KEY_F5; case XK_F6: return GLFW_KEY_F6; case XK_F7: return GLFW_KEY_F7; case XK_F8: return GLFW_KEY_F8; case XK_F9: return GLFW_KEY_F9; case XK_F10: return GLFW_KEY_F10; case XK_F11: return GLFW_KEY_F11; case XK_F12: return GLFW_KEY_F12; case XK_F13: return GLFW_KEY_F13; case XK_F14: return GLFW_KEY_F14; case XK_F15: return GLFW_KEY_F15; case XK_F16: return GLFW_KEY_F16; case XK_F17: return GLFW_KEY_F17; case XK_F18: return GLFW_KEY_F18; case XK_F19: return GLFW_KEY_F19; case XK_F20: return GLFW_KEY_F20; case XK_F21: return GLFW_KEY_F21; case XK_F22: return GLFW_KEY_F22; case XK_F23: return GLFW_KEY_F23; case XK_F24: return GLFW_KEY_F24; case XK_F25: return GLFW_KEY_F25; // Numeric keypad case XK_KP_Divide: return GLFW_KEY_KP_DIVIDE; case XK_KP_Multiply: return GLFW_KEY_KP_MULTIPLY; case XK_KP_Subtract: return GLFW_KEY_KP_SUBTRACT; case XK_KP_Add: return GLFW_KEY_KP_ADD; // These should have been detected in secondary keysym test above! case XK_KP_Insert: return GLFW_KEY_KP_0; case XK_KP_End: return GLFW_KEY_KP_1; case XK_KP_Down: return GLFW_KEY_KP_2; case XK_KP_Page_Down: return GLFW_KEY_KP_3; case XK_KP_Left: return GLFW_KEY_KP_4; case XK_KP_Right: return GLFW_KEY_KP_6; case XK_KP_Home: return GLFW_KEY_KP_7; case XK_KP_Up: return GLFW_KEY_KP_8; case XK_KP_Page_Up: return GLFW_KEY_KP_9; case XK_KP_Delete: return GLFW_KEY_KP_DECIMAL; case XK_KP_Equal: return GLFW_KEY_KP_EQUAL; case XK_KP_Enter: return GLFW_KEY_KP_ENTER; // Last resort: Check for printable keys (should not happen if the XKB // extension is available). This will give a layout dependent mapping // (which is wrong, and we may miss some keys, especially on non-US // keyboards), but it's better than nothing... case XK_a: return GLFW_KEY_A; case XK_b: return GLFW_KEY_B; case XK_c: return GLFW_KEY_C; case XK_d: return GLFW_KEY_D; case XK_e: return GLFW_KEY_E; case XK_f: return GLFW_KEY_F; case XK_g: return GLFW_KEY_G; case XK_h: return GLFW_KEY_H; case XK_i: return GLFW_KEY_I; case XK_j: return GLFW_KEY_J; case XK_k: return GLFW_KEY_K; case XK_l: return GLFW_KEY_L; case XK_m: return GLFW_KEY_M; case XK_n: return GLFW_KEY_N; case XK_o: return GLFW_KEY_O; case XK_p: return GLFW_KEY_P; case XK_q: return GLFW_KEY_Q; case XK_r: return GLFW_KEY_R; case XK_s: return GLFW_KEY_S; case XK_t: return GLFW_KEY_T; case XK_u: return GLFW_KEY_U; case XK_v: return GLFW_KEY_V; case XK_w: return GLFW_KEY_W; case XK_x: return GLFW_KEY_X; case XK_y: return GLFW_KEY_Y; case XK_z: return GLFW_KEY_Z; case XK_1: return GLFW_KEY_1; case XK_2: return GLFW_KEY_2; case XK_3: return GLFW_KEY_3; case XK_4: return GLFW_KEY_4; case XK_5: return GLFW_KEY_5; case XK_6: return GLFW_KEY_6; case XK_7: return GLFW_KEY_7; case XK_8: return GLFW_KEY_8; case XK_9: return GLFW_KEY_9; case XK_0: return GLFW_KEY_0; case XK_space: return GLFW_KEY_SPACE; case XK_minus: return GLFW_KEY_MINUS; case XK_equal: return GLFW_KEY_EQUAL; case XK_bracketleft: return GLFW_KEY_LEFT_BRACKET; case XK_bracketright: return GLFW_KEY_RIGHT_BRACKET; case XK_backslash: return GLFW_KEY_BACKSLASH; case XK_semicolon: return GLFW_KEY_SEMICOLON; case XK_apostrophe: return GLFW_KEY_APOSTROPHE; case XK_grave: return GLFW_KEY_GRAVE_ACCENT; case XK_comma: return GLFW_KEY_COMMA; case XK_period: return GLFW_KEY_PERIOD; case XK_slash: return GLFW_KEY_SLASH; case XK_less: return GLFW_KEY_WORLD_1; // At least in some layouts... default: break; } // No matching translation was found return GLFW_KEY_UNKNOWN;}// Create key code translation tables//static void createKeyTables(void){ int scancodeMin, scancodeMax; memset(_glfw.x11.keycodes, -1, sizeof(_glfw.x11.keycodes)); memset(_glfw.x11.scancodes, -1, sizeof(_glfw.x11.scancodes)); if (_glfw.x11.xkb.available) { // Use XKB to determine physical key locations independently of the // current keyboard layout XkbDescPtr desc = XkbGetMap(_glfw.x11.display, 0, XkbUseCoreKbd); XkbGetNames(_glfw.x11.display, XkbKeyNamesMask | XkbKeyAliasesMask, desc); scancodeMin = desc->min_key_code; scancodeMax = desc->max_key_code; const struct { int key; char* name; } keymap[] = { { GLFW_KEY_GRAVE_ACCENT, "TLDE" }, { GLFW_KEY_1, "AE01" }, { GLFW_KEY_2, "AE02" }, { GLFW_KEY_3, "AE03" }, { GLFW_KEY_4, "AE04" }, { GLFW_KEY_5, "AE05" }, { GLFW_KEY_6, "AE06" }, { GLFW_KEY_7, "AE07" }, { GLFW_KEY_8, "AE08" }, { GLFW_KEY_9, "AE09" }, { GLFW_KEY_0, "AE10" }, { GLFW_KEY_MINUS, "AE11" }, { GLFW_KEY_EQUAL, "AE12" }, { GLFW_KEY_Q, "AD01" }, { GLFW_KEY_W, "AD02" }, { GLFW_KEY_E, "AD03" }, { GLFW_KEY_R, "AD04" }, { GLFW_KEY_T, "AD05" }, { GLFW_KEY_Y, "AD06" }, { GLFW_KEY_U, "AD07" }, { GLFW_KEY_I, "AD08" }, { GLFW_KEY_O, "AD09" }, { GLFW_KEY_P, "AD10" }, { GLFW_KEY_LEFT_BRACKET, "AD11" }, { GLFW_KEY_RIGHT_BRACKET, "AD12" }, { GLFW_KEY_A, "AC01" }, { GLFW_KEY_S, "AC02" }, { GLFW_KEY_D, "AC03" }, { GLFW_KEY_F, "AC04" }, { GLFW_KEY_G, "AC05" }, { GLFW_KEY_H, "AC06" }, { GLFW_KEY_J, "AC07" }, { GLFW_KEY_K, "AC08" }, { GLFW_KEY_L, "AC09" }, { GLFW_KEY_SEMICOLON, "AC10" }, { GLFW_KEY_APOSTROPHE, "AC11" }, { GLFW_KEY_Z, "AB01" }, { GLFW_KEY_X, "AB02" }, { GLFW_KEY_C, "AB03" }, { GLFW_KEY_V, "AB04" }, { GLFW_KEY_B, "AB05" }, { GLFW_KEY_N, "AB06" }, { GLFW_KEY_M, "AB07" }, { GLFW_KEY_COMMA, "AB08" }, { GLFW_KEY_PERIOD, "AB09" }, { GLFW_KEY_SLASH, "AB10" }, { GLFW_KEY_BACKSLASH, "BKSL" }, { GLFW_KEY_WORLD_1, "LSGT" }, { GLFW_KEY_SPACE, "SPCE" }, { GLFW_KEY_ESCAPE, "ESC" }, { GLFW_KEY_ENTER, "RTRN" }, { GLFW_KEY_TAB, "TAB" }, { GLFW_KEY_BACKSPACE, "BKSP" }, { GLFW_KEY_INSERT, "INS" }, { GLFW_KEY_DELETE, "DELE" }, { GLFW_KEY_RIGHT, "RGHT" }, { GLFW_KEY_LEFT, "LEFT" }, { GLFW_KEY_DOWN, "DOWN" }, { GLFW_KEY_UP, "UP" }, { GLFW_KEY_PAGE_UP, "PGUP" }, { GLFW_KEY_PAGE_DOWN, "PGDN" }, { GLFW_KEY_HOME, "HOME" }, { GLFW_KEY_END, "END" }, { GLFW_KEY_CAPS_LOCK, "CAPS" }, { GLFW_KEY_SCROLL_LOCK, "SCLK" }, { GLFW_KEY_NUM_LOCK, "NMLK" }, { GLFW_KEY_PRINT_SCREEN, "PRSC" }, { GLFW_KEY_PAUSE, "PAUS" }, { GLFW_KEY_F1, "FK01" }, { GLFW_KEY_F2, "FK02" }, { GLFW_KEY_F3, "FK03" }, { GLFW_KEY_F4, "FK04" }, { GLFW_KEY_F5, "FK05" }, { GLFW_KEY_F6, "FK06" }, { GLFW_KEY_F7, "FK07" }, { GLFW_KEY_F8, "FK08" }, { GLFW_KEY_F9, "FK09" }, { GLFW_KEY_F10, "FK10" }, { GLFW_KEY_F11, "FK11" }, { GLFW_KEY_F12, "FK12" }, { GLFW_KEY_F13, "FK13" }, { GLFW_KEY_F14, "FK14" }, { GLFW_KEY_F15, "FK15" }, { GLFW_KEY_F16, "FK16" }, { GLFW_KEY_F17, "FK17" }, { GLFW_KEY_F18, "FK18" }, { GLFW_KEY_F19, "FK19" }, { GLFW_KEY_F20, "FK20" }, { GLFW_KEY_F21, "FK21" }, { GLFW_KEY_F22, "FK22" }, { GLFW_KEY_F23, "FK23" }, { GLFW_KEY_F24, "FK24" }, { GLFW_KEY_F25, "FK25" }, { GLFW_KEY_KP_0, "KP0" }, { GLFW_KEY_KP_1, "KP1" }, { GLFW_KEY_KP_2, "KP2" }, { GLFW_KEY_KP_3, "KP3" }, { GLFW_KEY_KP_4, "KP4" }, { GLFW_KEY_KP_5, "KP5" }, { GLFW_KEY_KP_6, "KP6" }, { GLFW_KEY_KP_7, "KP7" }, { GLFW_KEY_KP_8, "KP8" }, { GLFW_KEY_KP_9, "KP9" }, { GLFW_KEY_KP_DECIMAL, "KPDL" }, { GLFW_KEY_KP_DIVIDE, "KPDV" }, { GLFW_KEY_KP_MULTIPLY, "KPMU" }, { GLFW_KEY_KP_SUBTRACT, "KPSU" }, { GLFW_KEY_KP_ADD, "KPAD" }, { GLFW_KEY_KP_ENTER, "KPEN" }, { GLFW_KEY_KP_EQUAL, "KPEQ" }, { GLFW_KEY_LEFT_SHIFT, "LFSH" }, { GLFW_KEY_LEFT_CONTROL, "LCTL" }, { GLFW_KEY_LEFT_ALT, "LALT" }, { GLFW_KEY_LEFT_SUPER, "LWIN" }, { GLFW_KEY_RIGHT_SHIFT, "RTSH" }, { GLFW_KEY_RIGHT_CONTROL, "RCTL" }, { GLFW_KEY_RIGHT_ALT, "RALT" }, { GLFW_KEY_RIGHT_ALT, "LVL3" }, { GLFW_KEY_RIGHT_ALT, "MDSW" }, { GLFW_KEY_RIGHT_SUPER, "RWIN" }, { GLFW_KEY_MENU, "MENU" } }; // Find the X11 key code -> GLFW key code mapping for (int scancode = scancodeMin; scancode <= scancodeMax; scancode++) { int key = GLFW_KEY_UNKNOWN; // Map the key name to a GLFW key code. Note: We use the US // keyboard layout. Because function keys aren't mapped correctly // when using traditional KeySym translations, they are mapped // here instead. for (int i = 0; i < sizeof(keymap) / sizeof(keymap[0]); i++) { if (strncmp(desc->names->keys[scancode].name, keymap[i].name, XkbKeyNameLength) == 0) { key = keymap[i].key; break; } } // Fall back to key aliases in case the key name did not match for (int i = 0; i < desc->names->num_key_aliases; i++) { if (key != GLFW_KEY_UNKNOWN) break; if (strncmp(desc->names->key_aliases[i].real, desc->names->keys[scancode].name, XkbKeyNameLength) != 0) { continue; } for (int j = 0; j < sizeof(keymap) / sizeof(keymap[0]); j++) { if (strncmp(desc->names->key_aliases[i].alias, keymap[j].name, XkbKeyNameLength) == 0) { key = keymap[j].key; break; } } } _glfw.x11.keycodes[scancode] = key; } XkbFreeNames(desc, XkbKeyNamesMask, True); XkbFreeKeyboard(desc, 0, True); } else XDisplayKeycodes(_glfw.x11.display, &scancodeMin, &scancodeMax); int width; KeySym* keysyms = XGetKeyboardMapping(_glfw.x11.display, scancodeMin, scancodeMax - scancodeMin + 1, &width); for (int scancode = scancodeMin; scancode <= scancodeMax; scancode++) { // Translate the un-translated key codes using traditional X11 KeySym // lookups if (_glfw.x11.keycodes[scancode] < 0) { const size_t base = (scancode - scancodeMin) * width; _glfw.x11.keycodes[scancode] = translateKeySyms(&keysyms[base], width); } // Store the reverse translation for faster key name lookup if (_glfw.x11.keycodes[scancode] > 0) _glfw.x11.scancodes[_glfw.x11.keycodes[scancode]] = scancode; } XFree(keysyms);}// Check whether the IM has a usable style//static GLFWbool hasUsableInputMethodStyle(void){ GLFWbool found = GLFW_FALSE; XIMStyles* styles = NULL; if (XGetIMValues(_glfw.x11.im, XNQueryInputStyle, &styles, NULL) != NULL) return GLFW_FALSE; for (unsigned int i = 0; i < styles->count_styles; i++) { if (styles->supported_styles[i] == (XIMPreeditNothing | XIMStatusNothing)) { found = GLFW_TRUE; break; } } XFree(styles); return found;}static void inputMethodDestroyCallback(XIM im, XPointer clientData, XPointer callData){ _glfw.x11.im = NULL;}static void inputMethodInstantiateCallback(Display* display, XPointer clientData, XPointer callData){ if (_glfw.x11.im) return; _glfw.x11.im = XOpenIM(_glfw.x11.display, 0, NULL, NULL); if (_glfw.x11.im) { if (!hasUsableInputMethodStyle()) { XCloseIM(_glfw.x11.im); _glfw.x11.im = NULL; } } if (_glfw.x11.im) { XIMCallback callback; callback.callback = (XIMProc) inputMethodDestroyCallback; callback.client_data = NULL; XSetIMValues(_glfw.x11.im, XNDestroyCallback, &callback, NULL); for (_GLFWwindow* window = _glfw.windowListHead; window; window = window->next) _glfwCreateInputContextX11(window); }}// Return the atom ID only if it is listed in the specified array//static Atom getAtomIfSupported(Atom* supportedAtoms, unsigned long atomCount, const char* atomName)Showing the first 500 of 1622 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/x11_monitor.cadded
//========================================================================// GLFW 3.5 X11 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_X11)#include <limits.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <assert.h>// Check whether the display mode should be included in enumeration//static GLFWbool modeIsGood(const XRRModeInfo* mi){ return (mi->modeFlags & RR_Interlace) == 0;}// Calculates the refresh rate, in Hz, from the specified RandR mode info//static int calculateRefreshRate(const XRRModeInfo* mi){ if (mi->hTotal && mi->vTotal) return (int) round((double) mi->dotClock / ((double) mi->hTotal * (double) mi->vTotal)); else return 0;}// Returns the mode info for a RandR mode XID//static const XRRModeInfo* getModeInfo(const XRRScreenResources* sr, RRMode id){ for (int i = 0; i < sr->nmode; i++) { if (sr->modes[i].id == id) return sr->modes + i; } return NULL;}// Convert RandR mode info to GLFW video mode//static GLFWvidmode vidmodeFromModeInfo(const XRRModeInfo* mi, const XRRCrtcInfo* ci){ GLFWvidmode mode; if (ci->rotation == RR_Rotate_90 || ci->rotation == RR_Rotate_270) { mode.width = mi->height; mode.height = mi->width; } else { mode.width = mi->width; mode.height = mi->height; } mode.refreshRate = calculateRefreshRate(mi); _glfwSplitBPP(DefaultDepth(_glfw.x11.display, _glfw.x11.screen), &mode.redBits, &mode.greenBits, &mode.blueBits); return mode;}//////////////////////////////////////////////////////////////////////////////// GLFW internal API ////////////////////////////////////////////////////////////////////////////////// Poll for changes in the set of connected monitors//void _glfwPollMonitorsX11(void){ if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken) { int disconnectedCount, screenCount = 0; _GLFWmonitor** disconnected = NULL; XineramaScreenInfo* screens = NULL; XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root); RROutput primary = XRRGetOutputPrimary(_glfw.x11.display, _glfw.x11.root); if (_glfw.x11.xinerama.available) screens = XineramaQueryScreens(_glfw.x11.display, &screenCount); disconnectedCount = _glfw.monitorCount; if (disconnectedCount) { disconnected = _glfw_calloc(_glfw.monitorCount, sizeof(_GLFWmonitor*)); memcpy(disconnected, _glfw.monitors, _glfw.monitorCount * sizeof(_GLFWmonitor*)); } for (int i = 0; i < sr->noutput; i++) { int j, type, widthMM, heightMM; XRROutputInfo* oi = XRRGetOutputInfo(_glfw.x11.display, sr, sr->outputs[i]); if (oi->connection != RR_Connected || oi->crtc == None) { XRRFreeOutputInfo(oi); continue; } for (j = 0; j < disconnectedCount; j++) { if (disconnected[j] && disconnected[j]->x11.output == sr->outputs[i]) { disconnected[j] = NULL; break; } } if (j < disconnectedCount) { XRRFreeOutputInfo(oi); continue; } XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, oi->crtc); if (!ci) { XRRFreeOutputInfo(oi); continue; } if (ci->rotation == RR_Rotate_90 || ci->rotation == RR_Rotate_270) { widthMM = oi->mm_height; heightMM = oi->mm_width; } else { widthMM = oi->mm_width; heightMM = oi->mm_height; } if (widthMM <= 0 || heightMM <= 0) { // HACK: If RandR does not provide a physical size, assume the // X11 default 96 DPI and calculate from the CRTC viewport // NOTE: These members are affected by rotation, unlike the mode // info and output info members widthMM = (int) (ci->width * 25.4f / 96.f); heightMM = (int) (ci->height * 25.4f / 96.f); } _GLFWmonitor* monitor = _glfwAllocMonitor(oi->name, widthMM, heightMM); monitor->x11.output = sr->outputs[i]; monitor->x11.crtc = oi->crtc; for (j = 0; j < screenCount; j++) { if (screens[j].x_org == ci->x && screens[j].y_org == ci->y && screens[j].width == ci->width && screens[j].height == ci->height) { monitor->x11.index = j; break; } } if (monitor->x11.output == primary) type = _GLFW_INSERT_FIRST; else type = _GLFW_INSERT_LAST; _glfwInputMonitor(monitor, GLFW_CONNECTED, type); XRRFreeOutputInfo(oi); XRRFreeCrtcInfo(ci); } XRRFreeScreenResources(sr); if (screens) XFree(screens); for (int i = 0; i < disconnectedCount; i++) { if (disconnected[i]) _glfwInputMonitor(disconnected[i], GLFW_DISCONNECTED, 0); } _glfw_free(disconnected); } else { const int widthMM = DisplayWidthMM(_glfw.x11.display, _glfw.x11.screen); const int heightMM = DisplayHeightMM(_glfw.x11.display, _glfw.x11.screen); _glfwInputMonitor(_glfwAllocMonitor("Display", widthMM, heightMM), GLFW_CONNECTED, _GLFW_INSERT_FIRST); }}// Set the current video mode for the specified monitor//void _glfwSetVideoModeX11(_GLFWmonitor* monitor, const GLFWvidmode* desired){ if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken) { GLFWvidmode current; RRMode native = None; const GLFWvidmode* best = _glfwChooseVideoMode(monitor, desired); _glfwGetVideoModeX11(monitor, ¤t); if (_glfwCompareVideoModes(¤t, best) == 0) return; XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root); XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc); XRROutputInfo* oi = XRRGetOutputInfo(_glfw.x11.display, sr, monitor->x11.output); for (int i = 0; i < oi->nmode; i++) { const XRRModeInfo* mi = getModeInfo(sr, oi->modes[i]); if (!modeIsGood(mi)) continue; const GLFWvidmode mode = vidmodeFromModeInfo(mi, ci); if (_glfwCompareVideoModes(best, &mode) == 0) { native = mi->id; break; } } if (native) { if (monitor->x11.oldMode == None) monitor->x11.oldMode = ci->mode; XRRSetCrtcConfig(_glfw.x11.display, sr, monitor->x11.crtc, CurrentTime, ci->x, ci->y, native, ci->rotation, ci->outputs, ci->noutput); } XRRFreeOutputInfo(oi); XRRFreeCrtcInfo(ci); XRRFreeScreenResources(sr); }}// Restore the saved (original) video mode for the specified monitor//void _glfwRestoreVideoModeX11(_GLFWmonitor* monitor){ if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken) { if (monitor->x11.oldMode == None) return; XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root); XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc); XRRSetCrtcConfig(_glfw.x11.display, sr, monitor->x11.crtc, CurrentTime, ci->x, ci->y, monitor->x11.oldMode, ci->rotation, ci->outputs, ci->noutput); XRRFreeCrtcInfo(ci); XRRFreeScreenResources(sr); monitor->x11.oldMode = None; }}//////////////////////////////////////////////////////////////////////////////// GLFW platform API ////////////////////////////////////////////////////////////////////////////////void _glfwFreeMonitorX11(_GLFWmonitor* monitor){}void _glfwGetMonitorPosX11(_GLFWmonitor* monitor, int* xpos, int* ypos){ if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken) { XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root); XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc); if (ci) { if (xpos) *xpos = ci->x; if (ypos) *ypos = ci->y; XRRFreeCrtcInfo(ci); } XRRFreeScreenResources(sr); }}void _glfwGetMonitorContentScaleX11(_GLFWmonitor* monitor, float* xscale, float* yscale){ if (xscale) *xscale = _glfw.x11.contentScaleX; if (yscale) *yscale = _glfw.x11.contentScaleY;}void _glfwGetMonitorWorkareaX11(_GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height){ int areaX = 0, areaY = 0, areaWidth = 0, areaHeight = 0; if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken) { XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root); XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc); areaX = ci->x; areaY = ci->y; const XRRModeInfo* mi = getModeInfo(sr, ci->mode); if (ci->rotation == RR_Rotate_90 || ci->rotation == RR_Rotate_270) { areaWidth = mi->height; areaHeight = mi->width; } else { areaWidth = mi->width; areaHeight = mi->height; } XRRFreeCrtcInfo(ci); XRRFreeScreenResources(sr); } else { areaWidth = DisplayWidth(_glfw.x11.display, _glfw.x11.screen); areaHeight = DisplayHeight(_glfw.x11.display, _glfw.x11.screen); } if (_glfw.x11.NET_WORKAREA && _glfw.x11.NET_CURRENT_DESKTOP) { Atom* extents = NULL; Atom* desktop = NULL; const unsigned long extentCount = _glfwGetWindowPropertyX11(_glfw.x11.root, _glfw.x11.NET_WORKAREA, XA_CARDINAL, (unsigned char**) &extents); if (_glfwGetWindowPropertyX11(_glfw.x11.root, _glfw.x11.NET_CURRENT_DESKTOP, XA_CARDINAL, (unsigned char**) &desktop) > 0) { if (extentCount >= 4 && *desktop < extentCount / 4) { const int globalX = extents[*desktop * 4 + 0]; const int globalY = extents[*desktop * 4 + 1]; const int globalWidth = extents[*desktop * 4 + 2]; const int globalHeight = extents[*desktop * 4 + 3]; if (areaX < globalX) { areaWidth -= globalX - areaX; areaX = globalX; } if (areaY < globalY) { areaHeight -= globalY - areaY; areaY = globalY; } if (areaX + areaWidth > globalX + globalWidth) areaWidth = globalX - areaX + globalWidth; if (areaY + areaHeight > globalY + globalHeight) areaHeight = globalY - areaY + globalHeight; } } if (extents) XFree(extents); if (desktop) XFree(desktop); } if (xpos) *xpos = areaX; if (ypos) *ypos = areaY; if (width) *width = areaWidth; if (height) *height = areaHeight;}GLFWvidmode* _glfwGetVideoModesX11(_GLFWmonitor* monitor, int* count){ GLFWvidmode* result; *count = 0; if (_glfw.x11.randr.available && !_glfw.x11.randr.monitorBroken) { XRRScreenResources* sr = XRRGetScreenResourcesCurrent(_glfw.x11.display, _glfw.x11.root); XRRCrtcInfo* ci = XRRGetCrtcInfo(_glfw.x11.display, sr, monitor->x11.crtc); XRROutputInfo* oi = XRRGetOutputInfo(_glfw.x11.display, sr, monitor->x11.output); result = _glfw_calloc(oi->nmode, sizeof(GLFWvidmode)); for (int i = 0; i < oi->nmode; i++) { const XRRModeInfo* mi = getModeInfo(sr, oi->modes[i]); if (!modeIsGood(mi)) continue; const GLFWvidmode mode = vidmodeFromModeInfo(mi, ci); int j; for (j = 0; j < *count; j++) { if (_glfwCompareVideoModes(result + j, &mode) == 0) break; } // Skip duplicate modes if (j < *count) continue; (*count)++; result[*count - 1] = mode; } XRRFreeOutputInfo(oi); XRRFreeCrtcInfo(ci); XRRFreeScreenResources(sr); } else { *count = 1; result = _glfw_calloc(1, sizeof(GLFWvidmode)); _glfwGetVideoModeX11(monitor, result); } return result;}Showing the first 500 of 653 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/x11_platform.hadded
//========================================================================// GLFW 3.5 X11 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include <unistd.h>#include <signal.h>#include <stdint.h>#include <X11/Xlib.h>#include <X11/keysym.h>#include <X11/Xatom.h>#include <X11/Xresource.h>#include <X11/Xcursor/Xcursor.h>// The XRandR extension provides mode setting and gamma control#include <X11/extensions/Xrandr.h>// The Xkb extension provides improved keyboard support#include <X11/XKBlib.h>// The Xinerama extension provides legacy monitor indices#include <X11/extensions/Xinerama.h>// The XInput extension provides raw mouse motion input#include <X11/extensions/XInput2.h>// The Shape extension provides custom window shapes#include <X11/extensions/shape.h>#define GLX_VENDOR 1#define GLX_RGBA_BIT 0x00000001#define GLX_WINDOW_BIT 0x00000001#define GLX_DRAWABLE_TYPE 0x8010#define GLX_RENDER_TYPE 0x8011#define GLX_RGBA_TYPE 0x8014#define GLX_DOUBLEBUFFER 5#define GLX_STEREO 6#define GLX_AUX_BUFFERS 7#define GLX_RED_SIZE 8#define GLX_GREEN_SIZE 9#define GLX_BLUE_SIZE 10#define GLX_ALPHA_SIZE 11#define GLX_DEPTH_SIZE 12#define GLX_STENCIL_SIZE 13#define GLX_ACCUM_RED_SIZE 14#define GLX_ACCUM_GREEN_SIZE 15#define GLX_ACCUM_BLUE_SIZE 16#define GLX_ACCUM_ALPHA_SIZE 17#define GLX_SAMPLES 0x186a1#define GLX_VISUAL_ID 0x800b#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20b2#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092#define GLX_CONTEXT_FLAGS_ARB 0x2094#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261#define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097#define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0#define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098#define GLX_CONTEXT_OPENGL_NO_ERROR_ARB 0x31b3typedef XID GLXWindow;typedef XID GLXDrawable;typedef struct __GLXFBConfig* GLXFBConfig;typedef struct __GLXcontext* GLXContext;typedef void (*__GLXextproc)(void);typedef XClassHint* (* PFN_XAllocClassHint)(void);typedef XSizeHints* (* PFN_XAllocSizeHints)(void);typedef XWMHints* (* PFN_XAllocWMHints)(void);typedef int (* PFN_XChangeProperty)(Display*,Window,Atom,Atom,int,int,const unsigned char*,int);typedef int (* PFN_XChangeWindowAttributes)(Display*,Window,unsigned long,XSetWindowAttributes*);typedef Bool (* PFN_XCheckIfEvent)(Display*,XEvent*,Bool(*)(Display*,XEvent*,XPointer),XPointer);typedef Bool (* PFN_XCheckTypedWindowEvent)(Display*,Window,int,XEvent*);typedef int (* PFN_XCloseDisplay)(Display*);typedef Status (* PFN_XCloseIM)(XIM);typedef int (* PFN_XConvertSelection)(Display*,Atom,Atom,Atom,Window,Time);typedef Colormap (* PFN_XCreateColormap)(Display*,Window,Visual*,int);typedef Cursor (* PFN_XCreateFontCursor)(Display*,unsigned int);typedef XIC (* PFN_XCreateIC)(XIM,...);typedef Region (* PFN_XCreateRegion)(void);typedef Window (* PFN_XCreateWindow)(Display*,Window,int,int,unsigned int,unsigned int,unsigned int,int,unsigned int,Visual*,unsigned long,XSetWindowAttributes*);typedef int (* PFN_XDefineCursor)(Display*,Window,Cursor);typedef int (* PFN_XDeleteContext)(Display*,XID,XContext);typedef int (* PFN_XDeleteProperty)(Display*,Window,Atom);typedef void (* PFN_XDestroyIC)(XIC);typedef int (* PFN_XDestroyRegion)(Region);typedef int (* PFN_XDestroyWindow)(Display*,Window);typedef int (* PFN_XDisplayKeycodes)(Display*,int*,int*);typedef int (* PFN_XEventsQueued)(Display*,int);typedef Bool (* PFN_XFilterEvent)(XEvent*,Window);typedef int (* PFN_XFindContext)(Display*,XID,XContext,XPointer*);typedef int (* PFN_XFlush)(Display*);typedef int (* PFN_XFree)(void*);typedef int (* PFN_XFreeColormap)(Display*,Colormap);typedef int (* PFN_XFreeCursor)(Display*,Cursor);typedef void (* PFN_XFreeEventData)(Display*,XGenericEventCookie*);typedef int (* PFN_XGetErrorText)(Display*,int,char*,int);typedef Bool (* PFN_XGetEventData)(Display*,XGenericEventCookie*);typedef char* (* PFN_XGetICValues)(XIC,...);typedef char* (* PFN_XGetIMValues)(XIM,...);typedef int (* PFN_XGetInputFocus)(Display*,Window*,int*);typedef KeySym* (* PFN_XGetKeyboardMapping)(Display*,KeyCode,int,int*);typedef int (* PFN_XGetScreenSaver)(Display*,int*,int*,int*,int*);typedef Window (* PFN_XGetSelectionOwner)(Display*,Atom);typedef XVisualInfo* (* PFN_XGetVisualInfo)(Display*,long,XVisualInfo*,int*);typedef Status (* PFN_XGetWMNormalHints)(Display*,Window,XSizeHints*,long*);typedef Status (* PFN_XGetWindowAttributes)(Display*,Window,XWindowAttributes*);typedef int (* PFN_XGetWindowProperty)(Display*,Window,Atom,long,long,Bool,Atom,Atom*,int*,unsigned long*,unsigned long*,unsigned char**);typedef int (* PFN_XGrabPointer)(Display*,Window,Bool,unsigned int,int,int,Window,Cursor,Time);typedef Status (* PFN_XIconifyWindow)(Display*,Window,int);typedef Status (* PFN_XInitThreads)(void);typedef Atom (* PFN_XInternAtom)(Display*,const char*,Bool);typedef int (* PFN_XLookupString)(XKeyEvent*,char*,int,KeySym*,XComposeStatus*);typedef int (* PFN_XMapRaised)(Display*,Window);typedef int (* PFN_XMapWindow)(Display*,Window);typedef int (* PFN_XMoveResizeWindow)(Display*,Window,int,int,unsigned int,unsigned int);typedef int (* PFN_XMoveWindow)(Display*,Window,int,int);typedef int (* PFN_XNextEvent)(Display*,XEvent*);typedef Display* (* PFN_XOpenDisplay)(const char*);typedef XIM (* PFN_XOpenIM)(Display*,XrmDatabase*,char*,char*);typedef int (* PFN_XPeekEvent)(Display*,XEvent*);typedef int (* PFN_XPending)(Display*);typedef Bool (* PFN_XQueryExtension)(Display*,const char*,int*,int*,int*);typedef Bool (* PFN_XQueryPointer)(Display*,Window,Window*,Window*,int*,int*,int*,int*,unsigned int*);typedef int (* PFN_XRaiseWindow)(Display*,Window);typedef Bool (* PFN_XRegisterIMInstantiateCallback)(Display*,void*,char*,char*,XIDProc,XPointer);typedef int (* PFN_XResizeWindow)(Display*,Window,unsigned int,unsigned int);typedef char* (* PFN_XResourceManagerString)(Display*);typedef int (* PFN_XSaveContext)(Display*,XID,XContext,const char*);typedef int (* PFN_XSelectInput)(Display*,Window,long);typedef Status (* PFN_XSendEvent)(Display*,Window,Bool,long,XEvent*);typedef int (* PFN_XSetClassHint)(Display*,Window,XClassHint*);typedef XErrorHandler (* PFN_XSetErrorHandler)(XErrorHandler);typedef void (* PFN_XSetICFocus)(XIC);typedef char* (* PFN_XSetIMValues)(XIM,...);typedef int (* PFN_XSetInputFocus)(Display*,Window,int,Time);typedef char* (* PFN_XSetLocaleModifiers)(const char*);typedef int (* PFN_XSetScreenSaver)(Display*,int,int,int,int);typedef int (* PFN_XSetSelectionOwner)(Display*,Atom,Window,Time);typedef int (* PFN_XSetWMHints)(Display*,Window,XWMHints*);typedef void (* PFN_XSetWMNormalHints)(Display*,Window,XSizeHints*);typedef Status (* PFN_XSetWMProtocols)(Display*,Window,Atom*,int);typedef Bool (* PFN_XSupportsLocale)(void);typedef int (* PFN_XSync)(Display*,Bool);typedef Bool (* PFN_XTranslateCoordinates)(Display*,Window,Window,int,int,int*,int*,Window*);typedef int (* PFN_XUndefineCursor)(Display*,Window);typedef int (* PFN_XUngrabPointer)(Display*,Time);typedef int (* PFN_XUnmapWindow)(Display*,Window);typedef void (* PFN_XUnsetICFocus)(XIC);typedef VisualID (* PFN_XVisualIDFromVisual)(Visual*);typedef int (* PFN_XWarpPointer)(Display*,Window,Window,int,int,unsigned int,unsigned int,int,int);typedef void (* PFN_XkbFreeKeyboard)(XkbDescPtr,unsigned int,Bool);typedef void (* PFN_XkbFreeNames)(XkbDescPtr,unsigned int,Bool);typedef XkbDescPtr (* PFN_XkbGetMap)(Display*,unsigned int,unsigned int);typedef Status (* PFN_XkbGetNames)(Display*,unsigned int,XkbDescPtr);typedef Status (* PFN_XkbGetState)(Display*,unsigned int,XkbStatePtr);typedef KeySym (* PFN_XkbKeycodeToKeysym)(Display*,KeyCode,int,int);typedef Bool (* PFN_XkbQueryExtension)(Display*,int*,int*,int*,int*,int*);typedef Bool (* PFN_XkbSelectEventDetails)(Display*,unsigned int,unsigned int,unsigned long,unsigned long);typedef Bool (* PFN_XkbSetDetectableAutoRepeat)(Display*,Bool,Bool*);typedef void (* PFN_XrmDestroyDatabase)(XrmDatabase);typedef Bool (* PFN_XrmGetResource)(XrmDatabase,const char*,const char*,char**,XrmValue*);typedef XrmDatabase (* PFN_XrmGetStringDatabase)(const char*);typedef void (* PFN_XrmInitialize)(void);typedef XrmQuark (* PFN_XrmUniqueQuark)(void);typedef Bool (* PFN_XUnregisterIMInstantiateCallback)(Display*,void*,char*,char*,XIDProc,XPointer);typedef int (* PFN_Xutf8LookupString)(XIC,XKeyPressedEvent*,char*,int,KeySym*,Status*);typedef void (* PFN_Xutf8SetWMProperties)(Display*,Window,const char*,const char*,char**,int,XSizeHints*,XWMHints*,XClassHint*);#define XAllocClassHint _glfw.x11.xlib.AllocClassHint#define XAllocSizeHints _glfw.x11.xlib.AllocSizeHints#define XAllocWMHints _glfw.x11.xlib.AllocWMHints#define XChangeProperty _glfw.x11.xlib.ChangeProperty#define XChangeWindowAttributes _glfw.x11.xlib.ChangeWindowAttributes#define XCheckIfEvent _glfw.x11.xlib.CheckIfEvent#define XCheckTypedWindowEvent _glfw.x11.xlib.CheckTypedWindowEvent#define XCloseDisplay _glfw.x11.xlib.CloseDisplay#define XCloseIM _glfw.x11.xlib.CloseIM#define XConvertSelection _glfw.x11.xlib.ConvertSelection#define XCreateColormap _glfw.x11.xlib.CreateColormap#define XCreateFontCursor _glfw.x11.xlib.CreateFontCursor#define XCreateIC _glfw.x11.xlib.CreateIC#define XCreateRegion _glfw.x11.xlib.CreateRegion#define XCreateWindow _glfw.x11.xlib.CreateWindow#define XDefineCursor _glfw.x11.xlib.DefineCursor#define XDeleteContext _glfw.x11.xlib.DeleteContext#define XDeleteProperty _glfw.x11.xlib.DeleteProperty#define XDestroyIC _glfw.x11.xlib.DestroyIC#define XDestroyRegion _glfw.x11.xlib.DestroyRegion#define XDestroyWindow _glfw.x11.xlib.DestroyWindow#define XDisplayKeycodes _glfw.x11.xlib.DisplayKeycodes#define XEventsQueued _glfw.x11.xlib.EventsQueued#define XFilterEvent _glfw.x11.xlib.FilterEvent#define XFindContext _glfw.x11.xlib.FindContext#define XFlush _glfw.x11.xlib.Flush#define XFree _glfw.x11.xlib.Free#define XFreeColormap _glfw.x11.xlib.FreeColormap#define XFreeCursor _glfw.x11.xlib.FreeCursor#define XFreeEventData _glfw.x11.xlib.FreeEventData#define XGetErrorText _glfw.x11.xlib.GetErrorText#define XGetEventData _glfw.x11.xlib.GetEventData#define XGetICValues _glfw.x11.xlib.GetICValues#define XGetIMValues _glfw.x11.xlib.GetIMValues#define XGetInputFocus _glfw.x11.xlib.GetInputFocus#define XGetKeyboardMapping _glfw.x11.xlib.GetKeyboardMapping#define XGetScreenSaver _glfw.x11.xlib.GetScreenSaver#define XGetSelectionOwner _glfw.x11.xlib.GetSelectionOwner#define XGetVisualInfo _glfw.x11.xlib.GetVisualInfo#define XGetWMNormalHints _glfw.x11.xlib.GetWMNormalHints#define XGetWindowAttributes _glfw.x11.xlib.GetWindowAttributes#define XGetWindowProperty _glfw.x11.xlib.GetWindowProperty#define XGrabPointer _glfw.x11.xlib.GrabPointer#define XIconifyWindow _glfw.x11.xlib.IconifyWindow#define XInternAtom _glfw.x11.xlib.InternAtom#define XLookupString _glfw.x11.xlib.LookupString#define XMapRaised _glfw.x11.xlib.MapRaised#define XMapWindow _glfw.x11.xlib.MapWindow#define XMoveResizeWindow _glfw.x11.xlib.MoveResizeWindow#define XMoveWindow _glfw.x11.xlib.MoveWindow#define XNextEvent _glfw.x11.xlib.NextEvent#define XOpenIM _glfw.x11.xlib.OpenIM#define XPeekEvent _glfw.x11.xlib.PeekEvent#define XPending _glfw.x11.xlib.Pending#define XQueryExtension _glfw.x11.xlib.QueryExtension#define XQueryPointer _glfw.x11.xlib.QueryPointer#define XRaiseWindow _glfw.x11.xlib.RaiseWindow#define XRegisterIMInstantiateCallback _glfw.x11.xlib.RegisterIMInstantiateCallback#define XResizeWindow _glfw.x11.xlib.ResizeWindow#define XResourceManagerString _glfw.x11.xlib.ResourceManagerString#define XSaveContext _glfw.x11.xlib.SaveContext#define XSelectInput _glfw.x11.xlib.SelectInput#define XSendEvent _glfw.x11.xlib.SendEvent#define XSetClassHint _glfw.x11.xlib.SetClassHint#define XSetErrorHandler _glfw.x11.xlib.SetErrorHandler#define XSetICFocus _glfw.x11.xlib.SetICFocus#define XSetIMValues _glfw.x11.xlib.SetIMValues#define XSetInputFocus _glfw.x11.xlib.SetInputFocus#define XSetLocaleModifiers _glfw.x11.xlib.SetLocaleModifiers#define XSetScreenSaver _glfw.x11.xlib.SetScreenSaver#define XSetSelectionOwner _glfw.x11.xlib.SetSelectionOwner#define XSetWMHints _glfw.x11.xlib.SetWMHints#define XSetWMNormalHints _glfw.x11.xlib.SetWMNormalHints#define XSetWMProtocols _glfw.x11.xlib.SetWMProtocols#define XSupportsLocale _glfw.x11.xlib.SupportsLocale#define XSync _glfw.x11.xlib.Sync#define XTranslateCoordinates _glfw.x11.xlib.TranslateCoordinates#define XUndefineCursor _glfw.x11.xlib.UndefineCursor#define XUngrabPointer _glfw.x11.xlib.UngrabPointer#define XUnmapWindow _glfw.x11.xlib.UnmapWindow#define XUnsetICFocus _glfw.x11.xlib.UnsetICFocus#define XVisualIDFromVisual _glfw.x11.xlib.VisualIDFromVisual#define XWarpPointer _glfw.x11.xlib.WarpPointer#define XkbFreeKeyboard _glfw.x11.xkb.FreeKeyboard#define XkbFreeNames _glfw.x11.xkb.FreeNames#define XkbGetMap _glfw.x11.xkb.GetMap#define XkbGetNames _glfw.x11.xkb.GetNames#define XkbGetState _glfw.x11.xkb.GetState#define XkbKeycodeToKeysym _glfw.x11.xkb.KeycodeToKeysym#define XkbQueryExtension _glfw.x11.xkb.QueryExtension#define XkbSelectEventDetails _glfw.x11.xkb.SelectEventDetails#define XkbSetDetectableAutoRepeat _glfw.x11.xkb.SetDetectableAutoRepeat#define XrmDestroyDatabase _glfw.x11.xrm.DestroyDatabase#define XrmGetResource _glfw.x11.xrm.GetResource#define XrmGetStringDatabase _glfw.x11.xrm.GetStringDatabase#define XrmUniqueQuark _glfw.x11.xrm.UniqueQuark#define XUnregisterIMInstantiateCallback _glfw.x11.xlib.UnregisterIMInstantiateCallback#define Xutf8LookupString _glfw.x11.xlib.utf8LookupString#define Xutf8SetWMProperties _glfw.x11.xlib.utf8SetWMPropertiestypedef XRRCrtcGamma* (* PFN_XRRAllocGamma)(int);typedef void (* PFN_XRRFreeCrtcInfo)(XRRCrtcInfo*);typedef void (* PFN_XRRFreeGamma)(XRRCrtcGamma*);typedef void (* PFN_XRRFreeOutputInfo)(XRROutputInfo*);typedef void (* PFN_XRRFreeScreenResources)(XRRScreenResources*);typedef XRRCrtcGamma* (* PFN_XRRGetCrtcGamma)(Display*,RRCrtc);typedef int (* PFN_XRRGetCrtcGammaSize)(Display*,RRCrtc);typedef XRRCrtcInfo* (* PFN_XRRGetCrtcInfo) (Display*,XRRScreenResources*,RRCrtc);typedef XRROutputInfo* (* PFN_XRRGetOutputInfo)(Display*,XRRScreenResources*,RROutput);typedef RROutput (* PFN_XRRGetOutputPrimary)(Display*,Window);typedef XRRScreenResources* (* PFN_XRRGetScreenResourcesCurrent)(Display*,Window);typedef Bool (* PFN_XRRQueryExtension)(Display*,int*,int*);typedef Status (* PFN_XRRQueryVersion)(Display*,int*,int*);typedef void (* PFN_XRRSelectInput)(Display*,Window,int);typedef Status (* PFN_XRRSetCrtcConfig)(Display*,XRRScreenResources*,RRCrtc,Time,int,int,RRMode,Rotation,RROutput*,int);typedef void (* PFN_XRRSetCrtcGamma)(Display*,RRCrtc,XRRCrtcGamma*);typedef int (* PFN_XRRUpdateConfiguration)(XEvent*);#define XRRAllocGamma _glfw.x11.randr.AllocGamma#define XRRFreeCrtcInfo _glfw.x11.randr.FreeCrtcInfo#define XRRFreeGamma _glfw.x11.randr.FreeGamma#define XRRFreeOutputInfo _glfw.x11.randr.FreeOutputInfo#define XRRFreeScreenResources _glfw.x11.randr.FreeScreenResources#define XRRGetCrtcGamma _glfw.x11.randr.GetCrtcGamma#define XRRGetCrtcGammaSize _glfw.x11.randr.GetCrtcGammaSize#define XRRGetCrtcInfo _glfw.x11.randr.GetCrtcInfo#define XRRGetOutputInfo _glfw.x11.randr.GetOutputInfo#define XRRGetOutputPrimary _glfw.x11.randr.GetOutputPrimary#define XRRGetScreenResourcesCurrent _glfw.x11.randr.GetScreenResourcesCurrent#define XRRQueryExtension _glfw.x11.randr.QueryExtension#define XRRQueryVersion _glfw.x11.randr.QueryVersion#define XRRSelectInput _glfw.x11.randr.SelectInput#define XRRSetCrtcConfig _glfw.x11.randr.SetCrtcConfig#define XRRSetCrtcGamma _glfw.x11.randr.SetCrtcGamma#define XRRUpdateConfiguration _glfw.x11.randr.UpdateConfigurationtypedef XcursorImage* (* PFN_XcursorImageCreate)(int,int);typedef void (* PFN_XcursorImageDestroy)(XcursorImage*);typedef Cursor (* PFN_XcursorImageLoadCursor)(Display*,const XcursorImage*);typedef char* (* PFN_XcursorGetTheme)(Display*);typedef int (* PFN_XcursorGetDefaultSize)(Display*);typedef XcursorImage* (* PFN_XcursorLibraryLoadImage)(const char*,const char*,int);#define XcursorImageCreate _glfw.x11.xcursor.ImageCreate#define XcursorImageDestroy _glfw.x11.xcursor.ImageDestroy#define XcursorImageLoadCursor _glfw.x11.xcursor.ImageLoadCursor#define XcursorGetTheme _glfw.x11.xcursor.GetTheme#define XcursorGetDefaultSize _glfw.x11.xcursor.GetDefaultSize#define XcursorLibraryLoadImage _glfw.x11.xcursor.LibraryLoadImagetypedef Bool (* PFN_XineramaIsActive)(Display*);typedef Bool (* PFN_XineramaQueryExtension)(Display*,int*,int*);typedef XineramaScreenInfo* (* PFN_XineramaQueryScreens)(Display*,int*);#define XineramaIsActive _glfw.x11.xinerama.IsActive#define XineramaQueryExtension _glfw.x11.xinerama.QueryExtension#define XineramaQueryScreens _glfw.x11.xinerama.QueryScreenstypedef XID xcb_window_t;typedef XID xcb_visualid_t;typedef struct xcb_connection_t xcb_connection_t;typedef xcb_connection_t* (* PFN_XGetXCBConnection)(Display*);#define XGetXCBConnection _glfw.x11.x11xcb.GetXCBConnectiontypedef Bool (* PFN_XF86VidModeQueryExtension)(Display*,int*,int*);typedef Bool (* PFN_XF86VidModeGetGammaRamp)(Display*,int,int,unsigned short*,unsigned short*,unsigned short*);typedef Bool (* PFN_XF86VidModeSetGammaRamp)(Display*,int,int,unsigned short*,unsigned short*,unsigned short*);typedef Bool (* PFN_XF86VidModeGetGammaRampSize)(Display*,int,int*);#define XF86VidModeQueryExtension _glfw.x11.vidmode.QueryExtension#define XF86VidModeGetGammaRamp _glfw.x11.vidmode.GetGammaRamp#define XF86VidModeSetGammaRamp _glfw.x11.vidmode.SetGammaRamp#define XF86VidModeGetGammaRampSize _glfw.x11.vidmode.GetGammaRampSizetypedef Status (* PFN_XIQueryVersion)(Display*,int*,int*);typedef int (* PFN_XISelectEvents)(Display*,Window,XIEventMask*,int);#define XIQueryVersion _glfw.x11.xi.QueryVersion#define XISelectEvents _glfw.x11.xi.SelectEventstypedef Bool (* PFN_XRenderQueryExtension)(Display*,int*,int*);typedef Status (* PFN_XRenderQueryVersion)(Display*dpy,int*,int*);typedef XRenderPictFormat* (* PFN_XRenderFindVisualFormat)(Display*,Visual const*);#define XRenderQueryExtension _glfw.x11.xrender.QueryExtension#define XRenderQueryVersion _glfw.x11.xrender.QueryVersion#define XRenderFindVisualFormat _glfw.x11.xrender.FindVisualFormattypedef Bool (* PFN_XShapeQueryExtension)(Display*,int*,int*);typedef Status (* PFN_XShapeQueryVersion)(Display*dpy,int*,int*);typedef void (* PFN_XShapeCombineRegion)(Display*,Window,int,int,int,Region,int);typedef void (* PFN_XShapeCombineMask)(Display*,Window,int,int,int,Pixmap,int);#define XShapeQueryExtension _glfw.x11.xshape.QueryExtension#define XShapeQueryVersion _glfw.x11.xshape.QueryVersion#define XShapeCombineRegion _glfw.x11.xshape.ShapeCombineRegion#define XShapeCombineMask _glfw.x11.xshape.ShapeCombineMasktypedef int (*PFNGLXGETFBCONFIGATTRIBPROC)(Display*,GLXFBConfig,int,int*);typedef const char* (*PFNGLXGETCLIENTSTRINGPROC)(Display*,int);typedef Bool (*PFNGLXQUERYEXTENSIONPROC)(Display*,int*,int*);typedef Bool (*PFNGLXQUERYVERSIONPROC)(Display*,int*,int*);typedef void (*PFNGLXDESTROYCONTEXTPROC)(Display*,GLXContext);typedef Bool (*PFNGLXMAKECURRENTPROC)(Display*,GLXDrawable,GLXContext);typedef void (*PFNGLXSWAPBUFFERSPROC)(Display*,GLXDrawable);typedef const char* (*PFNGLXQUERYEXTENSIONSSTRINGPROC)(Display*,int);typedef GLXFBConfig* (*PFNGLXGETFBCONFIGSPROC)(Display*,int,int*);typedef GLXContext (*PFNGLXCREATENEWCONTEXTPROC)(Display*,GLXFBConfig,int,GLXContext,Bool);typedef __GLXextproc (* PFNGLXGETPROCADDRESSPROC)(const GLubyte *procName);typedef void (*PFNGLXSWAPINTERVALEXTPROC)(Display*,GLXDrawable,int);typedef XVisualInfo* (*PFNGLXGETVISUALFROMFBCONFIGPROC)(Display*,GLXFBConfig);typedef GLXWindow (*PFNGLXCREATEWINDOWPROC)(Display*,GLXFBConfig,Window,const int*);typedef void (*PFNGLXDESTROYWINDOWPROC)(Display*,GLXWindow);typedef int (*PFNGLXSWAPINTERVALMESAPROC)(int);typedef int (*PFNGLXSWAPINTERVALSGIPROC)(int);typedef GLXContext (*PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display*,GLXFBConfig,GLXContext,Bool,const int*);// libGL.so function pointer typedefs#define glXGetFBConfigs _glfw.glx.GetFBConfigs#define glXGetFBConfigAttrib _glfw.glx.GetFBConfigAttrib#define glXGetClientString _glfw.glx.GetClientString#define glXQueryExtension _glfw.glx.QueryExtension#define glXQueryVersion _glfw.glx.QueryVersion#define glXDestroyContext _glfw.glx.DestroyContext#define glXMakeCurrent _glfw.glx.MakeCurrent#define glXSwapBuffers _glfw.glx.SwapBuffers#define glXQueryExtensionsString _glfw.glx.QueryExtensionsString#define glXCreateNewContext _glfw.glx.CreateNewContext#define glXGetVisualFromFBConfig _glfw.glx.GetVisualFromFBConfig#define glXCreateWindow _glfw.glx.CreateWindow#define glXDestroyWindow _glfw.glx.DestroyWindowtypedef VkFlags VkXlibSurfaceCreateFlagsKHR;typedef VkFlags VkXcbSurfaceCreateFlagsKHR;typedef struct VkXlibSurfaceCreateInfoKHR{ VkStructureType sType; const void* pNext; VkXlibSurfaceCreateFlagsKHR flags; Display* dpy; Window window;} VkXlibSurfaceCreateInfoKHR;typedef struct VkXcbSurfaceCreateInfoKHR{ VkStructureType sType; const void* pNext; VkXcbSurfaceCreateFlagsKHR flags; xcb_connection_t* connection; xcb_window_t window;} VkXcbSurfaceCreateInfoKHR;typedef VkResult (APIENTRY *PFN_vkCreateXlibSurfaceKHR)(VkInstance,const VkXlibSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice,uint32_t,Display*,VisualID);typedef VkResult (APIENTRY *PFN_vkCreateXcbSurfaceKHR)(VkInstance,const VkXcbSurfaceCreateInfoKHR*,const VkAllocationCallbacks*,VkSurfaceKHR*);typedef VkBool32 (APIENTRY *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice,uint32_t,xcb_connection_t*,xcb_visualid_t);#define GLFW_X11_WINDOW_STATE _GLFWwindowX11 x11;#define GLFW_X11_LIBRARY_WINDOW_STATE _GLFWlibraryX11 x11;#define GLFW_X11_MONITOR_STATE _GLFWmonitorX11 x11;#define GLFW_X11_CURSOR_STATE _GLFWcursorX11 x11;#define GLFW_GLX_CONTEXT_STATE _GLFWcontextGLX glx;#define GLFW_GLX_LIBRARY_CONTEXT_STATE _GLFWlibraryGLX glx;#define GLFW_INVALID_CODEPOINT 0xffffffffu// GLX-specific per-context data//typedef struct _GLFWcontextGLX{ GLXContext handle; GLXWindow window; GLXFBConfig fbconfig;} _GLFWcontextGLX;// GLX-specific global data//typedef struct _GLFWlibraryGLX{ int major, minor; int eventBase; int errorBase; void* handle; // GLX 1.3 functions PFNGLXGETFBCONFIGSPROC GetFBConfigs; PFNGLXGETFBCONFIGATTRIBPROC GetFBConfigAttrib; PFNGLXGETCLIENTSTRINGPROC GetClientString; PFNGLXQUERYEXTENSIONPROC QueryExtension; PFNGLXQUERYVERSIONPROC QueryVersion; PFNGLXDESTROYCONTEXTPROC DestroyContext; PFNGLXMAKECURRENTPROC MakeCurrent; PFNGLXSWAPBUFFERSPROC SwapBuffers; PFNGLXQUERYEXTENSIONSSTRINGPROC QueryExtensionsString; PFNGLXCREATENEWCONTEXTPROC CreateNewContext; PFNGLXGETVISUALFROMFBCONFIGPROC GetVisualFromFBConfig; PFNGLXCREATEWINDOWPROC CreateWindow; PFNGLXDESTROYWINDOWPROC DestroyWindow; // GLX 1.4 and extension functionsShowing the first 500 of 1006 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/x11_window.cadded
//========================================================================// GLFW 3.5 X11 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2019 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_X11)#include <X11/cursorfont.h>#include <X11/Xmd.h>#include <poll.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <limits.h>#include <errno.h>#include <assert.h>// Action for EWMH client messages#define _NET_WM_STATE_REMOVE 0#define _NET_WM_STATE_ADD 1#define _NET_WM_STATE_TOGGLE 2// Additional mouse button names for XButtonEvent#define Button6 6#define Button7 7// Motif WM hints flags#define MWM_HINTS_DECORATIONS 2#define MWM_DECOR_ALL 1#define _GLFW_XDND_VERSION 5// Wait for event data to arrive on the X11 display socket// This avoids blocking other threads via the per-display Xlib lock that also// covers GLX functions//static GLFWbool waitForX11Event(double* timeout){ struct pollfd fd = { ConnectionNumber(_glfw.x11.display), POLLIN }; while (!XPending(_glfw.x11.display)) { if (!_glfwPollPOSIX(&fd, 1, timeout)) return GLFW_FALSE; } return GLFW_TRUE;}// Wait for event data to arrive on any event file descriptor// This avoids blocking other threads via the per-display Xlib lock that also// covers GLX functions//static GLFWbool waitForAnyEvent(double* timeout){ enum { XLIB_FD, PIPE_FD, INOTIFY_FD }; struct pollfd fds[] = { [XLIB_FD] = { ConnectionNumber(_glfw.x11.display), POLLIN }, [PIPE_FD] = { _glfw.x11.emptyEventPipe[0], POLLIN }, [INOTIFY_FD] = { -1, POLLIN } };#if defined(GLFW_BUILD_LINUX_JOYSTICK) if (_glfw.joysticksInitialized) fds[INOTIFY_FD].fd = _glfw.linjs.inotify;#endif while (!XPending(_glfw.x11.display)) { if (!_glfwPollPOSIX(fds, sizeof(fds) / sizeof(fds[0]), timeout)) return GLFW_FALSE; for (int i = 1; i < sizeof(fds) / sizeof(fds[0]); i++) { if (fds[i].revents & POLLIN) return GLFW_TRUE; } } return GLFW_TRUE;}// Writes a byte to the empty event pipe//static void writeEmptyEvent(void){ for (;;) { const char byte = 0; const ssize_t result = write(_glfw.x11.emptyEventPipe[1], &byte, 1); if (result == 1 || (result == -1 && errno != EINTR)) break; }}// Drains available data from the empty event pipe//static void drainEmptyEvents(void){ for (;;) { char dummy[64]; const ssize_t result = read(_glfw.x11.emptyEventPipe[0], dummy, sizeof(dummy)); if (result == -1 && errno != EINTR) break; }}// Waits until a VisibilityNotify event arrives for the specified window or the// timeout period elapses (ICCCM section 4.2.2)//static GLFWbool waitForVisibilityNotify(_GLFWwindow* window){ XEvent dummy; double timeout = 0.1; while (!XCheckTypedWindowEvent(_glfw.x11.display, window->x11.handle, VisibilityNotify, &dummy)) { if (!waitForX11Event(&timeout)) return GLFW_FALSE; } return GLFW_TRUE;}// Returns whether the window is iconified//static int getWindowState(_GLFWwindow* window){ int result = WithdrawnState; struct { CARD32 state; Window icon; } *state = NULL; if (_glfwGetWindowPropertyX11(window->x11.handle, _glfw.x11.WM_STATE, _glfw.x11.WM_STATE, (unsigned char**) &state) >= 2) { result = state->state; } if (state) XFree(state); return result;}// Returns whether the event is a selection event//static Bool isSelectionEvent(Display* display, XEvent* event, XPointer pointer){ if (event->xany.window != _glfw.x11.helperWindowHandle) return False; return event->type == SelectionRequest || event->type == SelectionNotify || event->type == SelectionClear;}// Returns whether it is a _NET_FRAME_EXTENTS event for the specified window//static Bool isFrameExtentsEvent(Display* display, XEvent* event, XPointer pointer){ _GLFWwindow* window = (_GLFWwindow*) pointer; return event->type == PropertyNotify && event->xproperty.state == PropertyNewValue && event->xproperty.window == window->x11.handle && event->xproperty.atom == _glfw.x11.NET_FRAME_EXTENTS;}// Returns whether it is a property event for the specified selection transfer//static Bool isSelPropNewValueNotify(Display* display, XEvent* event, XPointer pointer){ XEvent* notification = (XEvent*) pointer; return event->type == PropertyNotify && event->xproperty.state == PropertyNewValue && event->xproperty.window == notification->xselection.requestor && event->xproperty.atom == notification->xselection.property;}// Translates an X event modifier state mask//static int translateState(int state){ int mods = 0; if (state & ShiftMask) mods |= GLFW_MOD_SHIFT; if (state & ControlMask) mods |= GLFW_MOD_CONTROL; if (state & Mod1Mask) mods |= GLFW_MOD_ALT; if (state & Mod4Mask) mods |= GLFW_MOD_SUPER; if (state & LockMask) mods |= GLFW_MOD_CAPS_LOCK; if (state & Mod2Mask) mods |= GLFW_MOD_NUM_LOCK; return mods;}// Translates an X11 key code to a GLFW key token//static int translateKey(int scancode){ // Use the pre-filled LUT (see createKeyTables() in x11_init.c) if (scancode < 0 || scancode > 255) return GLFW_KEY_UNKNOWN; return _glfw.x11.keycodes[scancode];}// Sends an EWMH or ICCCM event to the window manager//static void sendEventToWM(_GLFWwindow* window, Atom type, long a, long b, long c, long d, long e){ XEvent event = { ClientMessage }; event.xclient.window = window->x11.handle; event.xclient.format = 32; // Data is 32-bit longs event.xclient.message_type = type; event.xclient.data.l[0] = a; event.xclient.data.l[1] = b; event.xclient.data.l[2] = c; event.xclient.data.l[3] = d; event.xclient.data.l[4] = e; XSendEvent(_glfw.x11.display, _glfw.x11.root, False, SubstructureNotifyMask | SubstructureRedirectMask, &event);}// Updates the normal hints according to the window settings//static void updateNormalHints(_GLFWwindow* window, int width, int height){ XSizeHints* hints = XAllocSizeHints(); long supplied; XGetWMNormalHints(_glfw.x11.display, window->x11.handle, hints, &supplied); hints->flags &= ~(PMinSize | PMaxSize | PAspect); if (!window->monitor) { if (window->resizable) { if (window->minwidth != GLFW_DONT_CARE && window->minheight != GLFW_DONT_CARE) { hints->flags |= PMinSize; hints->min_width = window->minwidth; hints->min_height = window->minheight; } if (window->maxwidth != GLFW_DONT_CARE && window->maxheight != GLFW_DONT_CARE) { hints->flags |= PMaxSize; hints->max_width = window->maxwidth; hints->max_height = window->maxheight; } if (window->numer != GLFW_DONT_CARE && window->denom != GLFW_DONT_CARE) { hints->flags |= PAspect; hints->min_aspect.x = hints->max_aspect.x = window->numer; hints->min_aspect.y = hints->max_aspect.y = window->denom; } } else { hints->flags |= (PMinSize | PMaxSize); hints->min_width = hints->max_width = width; hints->min_height = hints->max_height = height; } } XSetWMNormalHints(_glfw.x11.display, window->x11.handle, hints); XFree(hints);}// Updates the full screen status of the window//static void updateWindowMode(_GLFWwindow* window){ if (window->monitor) { if (_glfw.x11.xinerama.available && _glfw.x11.NET_WM_FULLSCREEN_MONITORS) { sendEventToWM(window, _glfw.x11.NET_WM_FULLSCREEN_MONITORS, window->monitor->x11.index, window->monitor->x11.index, window->monitor->x11.index, window->monitor->x11.index, 0); } if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN) { sendEventToWM(window, _glfw.x11.NET_WM_STATE, _NET_WM_STATE_ADD, _glfw.x11.NET_WM_STATE_FULLSCREEN, 0, 1, 0); } else { // This is the butcher's way of removing window decorations // Setting the override-redirect attribute on a window makes the // window manager ignore the window completely (ICCCM, section 4) // The good thing is that this makes undecorated full screen windows // easy to do; the bad thing is that we have to do everything // manually and some things (like iconify/restore) won't work at // all, as those are tasks usually performed by the window manager XSetWindowAttributes attributes; attributes.override_redirect = True; XChangeWindowAttributes(_glfw.x11.display, window->x11.handle, CWOverrideRedirect, &attributes); window->x11.overrideRedirect = GLFW_TRUE; } // Enable compositor bypass if (!window->x11.transparent) { const unsigned long value = 1; XChangeProperty(_glfw.x11.display, window->x11.handle, _glfw.x11.NET_WM_BYPASS_COMPOSITOR, XA_CARDINAL, 32, PropModeReplace, (unsigned char*) &value, 1); } } else { if (_glfw.x11.xinerama.available && _glfw.x11.NET_WM_FULLSCREEN_MONITORS) { XDeleteProperty(_glfw.x11.display, window->x11.handle, _glfw.x11.NET_WM_FULLSCREEN_MONITORS); } if (_glfw.x11.NET_WM_STATE && _glfw.x11.NET_WM_STATE_FULLSCREEN) { sendEventToWM(window, _glfw.x11.NET_WM_STATE, _NET_WM_STATE_REMOVE, _glfw.x11.NET_WM_STATE_FULLSCREEN, 0, 1, 0); } else { XSetWindowAttributes attributes; attributes.override_redirect = False; XChangeWindowAttributes(_glfw.x11.display, window->x11.handle, CWOverrideRedirect, &attributes); window->x11.overrideRedirect = GLFW_FALSE; } // Disable compositor bypass if (!window->x11.transparent) { XDeleteProperty(_glfw.x11.display, window->x11.handle, _glfw.x11.NET_WM_BYPASS_COMPOSITOR); } }}// Decode a Unicode code point from a UTF-8 stream// Based on cutef8 by Jeff Bezanson (Public Domain)//static uint32_t decodeUTF8(const char** s){ uint32_t codepoint = 0, count = 0; static const uint32_t offsets[] = { 0x00000000u, 0x00003080u, 0x000e2080u, 0x03c82080u, 0xfa082080u, 0x82082080u }; do { codepoint = (codepoint << 6) + (unsigned char) **s; (*s)++; count++; } while ((**s & 0xc0) == 0x80); assert(count <= 6); return codepoint - offsets[count - 1];}// Convert the specified Latin-1 string to UTF-8//static char* convertLatin1toUTF8(const char* source){ size_t size = 1; const char* sp; for (sp = source; *sp; sp++) size += (*sp & 0x80) ? 2 : 1; char* target = _glfw_calloc(size, 1); char* tp = target; for (sp = source; *sp; sp++) tp += _glfwEncodeUTF8(tp, *sp); return target;}// Updates the cursor image according to its cursor mode//static void updateCursorImage(_GLFWwindow* window){ if (window->cursorMode == GLFW_CURSOR_NORMAL || window->cursorMode == GLFW_CURSOR_CAPTURED) { if (window->cursor) { XDefineCursor(_glfw.x11.display, window->x11.handle, window->cursor->x11.handle); } else XUndefineCursor(_glfw.x11.display, window->x11.handle); } else { XDefineCursor(_glfw.x11.display, window->x11.handle, _glfw.x11.hiddenCursorHandle); }}// Grabs the cursor and confines it to the window//static void captureCursor(_GLFWwindow* window){ XGrabPointer(_glfw.x11.display, window->x11.handle, True, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync, GrabModeAsync, window->x11.handle, None, CurrentTime);}// Ungrabs the cursor//static void releaseCursor(void){ XUngrabPointer(_glfw.x11.display, CurrentTime);}// Enable XI2 raw mouse motion events//static void enableRawMouseMotion(_GLFWwindow* window){Showing the first 500 of 3388 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.
vendor/glfw/src/xkb_unicode.cadded
//========================================================================// GLFW 3.5 X11 - www.glfw.org//------------------------------------------------------------------------// Copyright (c) 2002-2006 Marcus Geelnard// Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>//// This software is provided 'as-is', without any express or implied// warranty. In no event will the authors be held liable for any damages// arising from the use of this software.//// Permission is granted to anyone to use this software for any purpose,// including commercial applications, and to alter it and redistribute it// freely, subject to the following restrictions://// 1. The origin of this software must not be misrepresented; you must not// claim that you wrote the original software. If you use this software// in a product, an acknowledgment in the product documentation would// be appreciated but is not required.//// 2. Altered source versions must be plainly marked as such, and must not// be misrepresented as being the original software.//// 3. This notice may not be removed or altered from any source// distribution.////========================================================================#include "internal.h"#if defined(_GLFW_X11)/* * Marcus: This code was originally written by Markus G. Kuhn. * I have made some slight changes (trimmed it down a bit from >60 KB to * 20 KB), but the functionality is the same. *//* * This module converts keysym values into the corresponding ISO 10646 * (UCS, Unicode) values. * * The array keysymtab[] contains pairs of X11 keysym values for graphical * characters and the corresponding Unicode value. The function * _glfwKeySym2Unicode() maps a keysym onto a Unicode value using a binary * search, therefore keysymtab[] must remain SORTED by keysym value. * * We allow to represent any UCS character in the range U-00000000 to * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff. * This admittedly does not cover the entire 31-bit space of UCS, but * it does cover all of the characters up to U-10FFFF, which can be * represented by UTF-16, and more, and it is very unlikely that higher * UCS codes will ever be assigned by ISO. So to get Unicode character * U+ABCD you can directly use keysym 0x0100abcd. * * Original author: Markus G. Kuhn <mkuhn@acm.org>, University of * Cambridge, April 2001 * * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing * an initial draft of the mapping table. * *///************************************************************************//**** KeySym to Unicode mapping table ****//************************************************************************static const struct codepair { unsigned short keysym; unsigned short ucs;} keysymtab[] = { { 0x01a1, 0x0104 }, { 0x01a2, 0x02d8 }, { 0x01a3, 0x0141 }, { 0x01a5, 0x013d }, { 0x01a6, 0x015a }, { 0x01a9, 0x0160 }, { 0x01aa, 0x015e }, { 0x01ab, 0x0164 }, { 0x01ac, 0x0179 }, { 0x01ae, 0x017d }, { 0x01af, 0x017b }, { 0x01b1, 0x0105 }, { 0x01b2, 0x02db }, { 0x01b3, 0x0142 }, { 0x01b5, 0x013e }, { 0x01b6, 0x015b }, { 0x01b7, 0x02c7 }, { 0x01b9, 0x0161 }, { 0x01ba, 0x015f }, { 0x01bb, 0x0165 }, { 0x01bc, 0x017a }, { 0x01bd, 0x02dd }, { 0x01be, 0x017e }, { 0x01bf, 0x017c }, { 0x01c0, 0x0154 }, { 0x01c3, 0x0102 }, { 0x01c5, 0x0139 }, { 0x01c6, 0x0106 }, { 0x01c8, 0x010c }, { 0x01ca, 0x0118 }, { 0x01cc, 0x011a }, { 0x01cf, 0x010e }, { 0x01d0, 0x0110 }, { 0x01d1, 0x0143 }, { 0x01d2, 0x0147 }, { 0x01d5, 0x0150 }, { 0x01d8, 0x0158 }, { 0x01d9, 0x016e }, { 0x01db, 0x0170 }, { 0x01de, 0x0162 }, { 0x01e0, 0x0155 }, { 0x01e3, 0x0103 }, { 0x01e5, 0x013a }, { 0x01e6, 0x0107 }, { 0x01e8, 0x010d }, { 0x01ea, 0x0119 }, { 0x01ec, 0x011b }, { 0x01ef, 0x010f }, { 0x01f0, 0x0111 }, { 0x01f1, 0x0144 }, { 0x01f2, 0x0148 }, { 0x01f5, 0x0151 }, { 0x01f8, 0x0159 }, { 0x01f9, 0x016f }, { 0x01fb, 0x0171 }, { 0x01fe, 0x0163 }, { 0x01ff, 0x02d9 }, { 0x02a1, 0x0126 }, { 0x02a6, 0x0124 }, { 0x02a9, 0x0130 }, { 0x02ab, 0x011e }, { 0x02ac, 0x0134 }, { 0x02b1, 0x0127 }, { 0x02b6, 0x0125 }, { 0x02b9, 0x0131 }, { 0x02bb, 0x011f }, { 0x02bc, 0x0135 }, { 0x02c5, 0x010a }, { 0x02c6, 0x0108 }, { 0x02d5, 0x0120 }, { 0x02d8, 0x011c }, { 0x02dd, 0x016c }, { 0x02de, 0x015c }, { 0x02e5, 0x010b }, { 0x02e6, 0x0109 }, { 0x02f5, 0x0121 }, { 0x02f8, 0x011d }, { 0x02fd, 0x016d }, { 0x02fe, 0x015d }, { 0x03a2, 0x0138 }, { 0x03a3, 0x0156 }, { 0x03a5, 0x0128 }, { 0x03a6, 0x013b }, { 0x03aa, 0x0112 }, { 0x03ab, 0x0122 }, { 0x03ac, 0x0166 }, { 0x03b3, 0x0157 }, { 0x03b5, 0x0129 }, { 0x03b6, 0x013c }, { 0x03ba, 0x0113 }, { 0x03bb, 0x0123 }, { 0x03bc, 0x0167 }, { 0x03bd, 0x014a }, { 0x03bf, 0x014b }, { 0x03c0, 0x0100 }, { 0x03c7, 0x012e }, { 0x03cc, 0x0116 }, { 0x03cf, 0x012a }, { 0x03d1, 0x0145 }, { 0x03d2, 0x014c }, { 0x03d3, 0x0136 }, { 0x03d9, 0x0172 }, { 0x03dd, 0x0168 }, { 0x03de, 0x016a }, { 0x03e0, 0x0101 }, { 0x03e7, 0x012f }, { 0x03ec, 0x0117 }, { 0x03ef, 0x012b }, { 0x03f1, 0x0146 }, { 0x03f2, 0x014d }, { 0x03f3, 0x0137 }, { 0x03f9, 0x0173 }, { 0x03fd, 0x0169 }, { 0x03fe, 0x016b }, { 0x047e, 0x203e }, { 0x04a1, 0x3002 }, { 0x04a2, 0x300c }, { 0x04a3, 0x300d }, { 0x04a4, 0x3001 }, { 0x04a5, 0x30fb }, { 0x04a6, 0x30f2 }, { 0x04a7, 0x30a1 }, { 0x04a8, 0x30a3 }, { 0x04a9, 0x30a5 }, { 0x04aa, 0x30a7 }, { 0x04ab, 0x30a9 }, { 0x04ac, 0x30e3 }, { 0x04ad, 0x30e5 }, { 0x04ae, 0x30e7 }, { 0x04af, 0x30c3 }, { 0x04b0, 0x30fc }, { 0x04b1, 0x30a2 }, { 0x04b2, 0x30a4 }, { 0x04b3, 0x30a6 }, { 0x04b4, 0x30a8 }, { 0x04b5, 0x30aa }, { 0x04b6, 0x30ab }, { 0x04b7, 0x30ad }, { 0x04b8, 0x30af }, { 0x04b9, 0x30b1 }, { 0x04ba, 0x30b3 }, { 0x04bb, 0x30b5 }, { 0x04bc, 0x30b7 }, { 0x04bd, 0x30b9 }, { 0x04be, 0x30bb }, { 0x04bf, 0x30bd }, { 0x04c0, 0x30bf }, { 0x04c1, 0x30c1 }, { 0x04c2, 0x30c4 }, { 0x04c3, 0x30c6 }, { 0x04c4, 0x30c8 }, { 0x04c5, 0x30ca }, { 0x04c6, 0x30cb }, { 0x04c7, 0x30cc }, { 0x04c8, 0x30cd }, { 0x04c9, 0x30ce }, { 0x04ca, 0x30cf }, { 0x04cb, 0x30d2 }, { 0x04cc, 0x30d5 }, { 0x04cd, 0x30d8 }, { 0x04ce, 0x30db }, { 0x04cf, 0x30de }, { 0x04d0, 0x30df }, { 0x04d1, 0x30e0 }, { 0x04d2, 0x30e1 }, { 0x04d3, 0x30e2 }, { 0x04d4, 0x30e4 }, { 0x04d5, 0x30e6 }, { 0x04d6, 0x30e8 }, { 0x04d7, 0x30e9 }, { 0x04d8, 0x30ea }, { 0x04d9, 0x30eb }, { 0x04da, 0x30ec }, { 0x04db, 0x30ed }, { 0x04dc, 0x30ef }, { 0x04dd, 0x30f3 }, { 0x04de, 0x309b }, { 0x04df, 0x309c }, { 0x05ac, 0x060c }, { 0x05bb, 0x061b }, { 0x05bf, 0x061f }, { 0x05c1, 0x0621 }, { 0x05c2, 0x0622 }, { 0x05c3, 0x0623 }, { 0x05c4, 0x0624 }, { 0x05c5, 0x0625 }, { 0x05c6, 0x0626 }, { 0x05c7, 0x0627 }, { 0x05c8, 0x0628 }, { 0x05c9, 0x0629 }, { 0x05ca, 0x062a }, { 0x05cb, 0x062b }, { 0x05cc, 0x062c }, { 0x05cd, 0x062d }, { 0x05ce, 0x062e }, { 0x05cf, 0x062f }, { 0x05d0, 0x0630 }, { 0x05d1, 0x0631 }, { 0x05d2, 0x0632 }, { 0x05d3, 0x0633 }, { 0x05d4, 0x0634 }, { 0x05d5, 0x0635 }, { 0x05d6, 0x0636 }, { 0x05d7, 0x0637 }, { 0x05d8, 0x0638 }, { 0x05d9, 0x0639 }, { 0x05da, 0x063a }, { 0x05e0, 0x0640 }, { 0x05e1, 0x0641 }, { 0x05e2, 0x0642 }, { 0x05e3, 0x0643 }, { 0x05e4, 0x0644 }, { 0x05e5, 0x0645 }, { 0x05e6, 0x0646 }, { 0x05e7, 0x0647 }, { 0x05e8, 0x0648 }, { 0x05e9, 0x0649 }, { 0x05ea, 0x064a }, { 0x05eb, 0x064b }, { 0x05ec, 0x064c }, { 0x05ed, 0x064d }, { 0x05ee, 0x064e }, { 0x05ef, 0x064f }, { 0x05f0, 0x0650 }, { 0x05f1, 0x0651 }, { 0x05f2, 0x0652 }, { 0x06a1, 0x0452 }, { 0x06a2, 0x0453 }, { 0x06a3, 0x0451 }, { 0x06a4, 0x0454 }, { 0x06a5, 0x0455 }, { 0x06a6, 0x0456 }, { 0x06a7, 0x0457 }, { 0x06a8, 0x0458 }, { 0x06a9, 0x0459 }, { 0x06aa, 0x045a }, { 0x06ab, 0x045b }, { 0x06ac, 0x045c }, { 0x06ae, 0x045e }, { 0x06af, 0x045f }, { 0x06b0, 0x2116 }, { 0x06b1, 0x0402 }, { 0x06b2, 0x0403 }, { 0x06b3, 0x0401 }, { 0x06b4, 0x0404 }, { 0x06b5, 0x0405 }, { 0x06b6, 0x0406 }, { 0x06b7, 0x0407 }, { 0x06b8, 0x0408 }, { 0x06b9, 0x0409 }, { 0x06ba, 0x040a }, { 0x06bb, 0x040b }, { 0x06bc, 0x040c }, { 0x06be, 0x040e }, { 0x06bf, 0x040f }, { 0x06c0, 0x044e }, { 0x06c1, 0x0430 }, { 0x06c2, 0x0431 }, { 0x06c3, 0x0446 }, { 0x06c4, 0x0434 }, { 0x06c5, 0x0435 }, { 0x06c6, 0x0444 }, { 0x06c7, 0x0433 }, { 0x06c8, 0x0445 }, { 0x06c9, 0x0438 }, { 0x06ca, 0x0439 }, { 0x06cb, 0x043a }, { 0x06cc, 0x043b }, { 0x06cd, 0x043c }, { 0x06ce, 0x043d }, { 0x06cf, 0x043e }, { 0x06d0, 0x043f }, { 0x06d1, 0x044f }, { 0x06d2, 0x0440 }, { 0x06d3, 0x0441 }, { 0x06d4, 0x0442 }, { 0x06d5, 0x0443 }, { 0x06d6, 0x0436 }, { 0x06d7, 0x0432 }, { 0x06d8, 0x044c }, { 0x06d9, 0x044b }, { 0x06da, 0x0437 }, { 0x06db, 0x0448 }, { 0x06dc, 0x044d }, { 0x06dd, 0x0449 }, { 0x06de, 0x0447 }, { 0x06df, 0x044a }, { 0x06e0, 0x042e }, { 0x06e1, 0x0410 }, { 0x06e2, 0x0411 }, { 0x06e3, 0x0426 }, { 0x06e4, 0x0414 }, { 0x06e5, 0x0415 }, { 0x06e6, 0x0424 }, { 0x06e7, 0x0413 }, { 0x06e8, 0x0425 }, { 0x06e9, 0x0418 }, { 0x06ea, 0x0419 }, { 0x06eb, 0x041a }, { 0x06ec, 0x041b }, { 0x06ed, 0x041c }, { 0x06ee, 0x041d }, { 0x06ef, 0x041e }, { 0x06f0, 0x041f }, { 0x06f1, 0x042f }, { 0x06f2, 0x0420 }, { 0x06f3, 0x0421 }, { 0x06f4, 0x0422 }, { 0x06f5, 0x0423 }, { 0x06f6, 0x0416 }, { 0x06f7, 0x0412 }, { 0x06f8, 0x042c }, { 0x06f9, 0x042b }, { 0x06fa, 0x0417 }, { 0x06fb, 0x0428 }, { 0x06fc, 0x042d }, { 0x06fd, 0x0429 }, { 0x06fe, 0x0427 }, { 0x06ff, 0x042a }, { 0x07a1, 0x0386 }, { 0x07a2, 0x0388 }, { 0x07a3, 0x0389 }, { 0x07a4, 0x038a }, { 0x07a5, 0x03aa }, { 0x07a7, 0x038c }, { 0x07a8, 0x038e }, { 0x07a9, 0x03ab }, { 0x07ab, 0x038f }, { 0x07ae, 0x0385 }, { 0x07af, 0x2015 }, { 0x07b1, 0x03ac }, { 0x07b2, 0x03ad }, { 0x07b3, 0x03ae }, { 0x07b4, 0x03af }, { 0x07b5, 0x03ca }, { 0x07b6, 0x0390 }, { 0x07b7, 0x03cc }, { 0x07b8, 0x03cd }, { 0x07b9, 0x03cb }, { 0x07ba, 0x03b0 }, { 0x07bb, 0x03ce }, { 0x07c1, 0x0391 }, { 0x07c2, 0x0392 }, { 0x07c3, 0x0393 }, { 0x07c4, 0x0394 }, { 0x07c5, 0x0395 }, { 0x07c6, 0x0396 }, { 0x07c7, 0x0397 }, { 0x07c8, 0x0398 }, { 0x07c9, 0x0399 }, { 0x07ca, 0x039a }, { 0x07cb, 0x039b }, { 0x07cc, 0x039c }, { 0x07cd, 0x039d }, { 0x07ce, 0x039e }, { 0x07cf, 0x039f }, { 0x07d0, 0x03a0 }, { 0x07d1, 0x03a1 }, { 0x07d2, 0x03a3 }, { 0x07d4, 0x03a4 }, { 0x07d5, 0x03a5 }, { 0x07d6, 0x03a6 }, { 0x07d7, 0x03a7 }, { 0x07d8, 0x03a8 }, { 0x07d9, 0x03a9 }, { 0x07e1, 0x03b1 }, { 0x07e2, 0x03b2 }, { 0x07e3, 0x03b3 }, { 0x07e4, 0x03b4 }, { 0x07e5, 0x03b5 }, { 0x07e6, 0x03b6 }, { 0x07e7, 0x03b7 }, { 0x07e8, 0x03b8 }, { 0x07e9, 0x03b9 }, { 0x07ea, 0x03ba }, { 0x07eb, 0x03bb }, { 0x07ec, 0x03bc }, { 0x07ed, 0x03bd }, { 0x07ee, 0x03be }, { 0x07ef, 0x03bf }, { 0x07f0, 0x03c0 }, { 0x07f1, 0x03c1 }, { 0x07f2, 0x03c3 }, { 0x07f3, 0x03c2 }, { 0x07f4, 0x03c4 }, { 0x07f5, 0x03c5 }, { 0x07f6, 0x03c6 }, { 0x07f7, 0x03c7 }, { 0x07f8, 0x03c8 }, { 0x07f9, 0x03c9 }, { 0x08a1, 0x23b7 }, { 0x08a2, 0x250c }, { 0x08a3, 0x2500 }, { 0x08a4, 0x2320 }, { 0x08a5, 0x2321 }, { 0x08a6, 0x2502 }, { 0x08a7, 0x23a1 }, { 0x08a8, 0x23a3 }, { 0x08a9, 0x23a4 }, { 0x08aa, 0x23a6 }, { 0x08ab, 0x239b }, { 0x08ac, 0x239d }, { 0x08ad, 0x239e }, { 0x08ae, 0x23a0 }, { 0x08af, 0x23a8 }, { 0x08b0, 0x23ac }, { 0x08bc, 0x2264 }, { 0x08bd, 0x2260 }, { 0x08be, 0x2265 }, { 0x08bf, 0x222b }, { 0x08c0, 0x2234 }, { 0x08c1, 0x221d }, { 0x08c2, 0x221e }, { 0x08c5, 0x2207 }, { 0x08c8, 0x223c }, { 0x08c9, 0x2243 }, { 0x08cd, 0x21d4 }, { 0x08ce, 0x21d2 }, { 0x08cf, 0x2261 }, { 0x08d6, 0x221a }, { 0x08da, 0x2282 }, { 0x08db, 0x2283 }, { 0x08dc, 0x2229 }, { 0x08dd, 0x222a }, { 0x08de, 0x2227 }, { 0x08df, 0x2228 }, { 0x08ef, 0x2202 }, { 0x08f6, 0x0192 },Showing the first 500 of 944 diff lines for this file. This diff is INCOMPLETE; read the file or clone the repository for the rest.