mirror of
https://github.com/kovidgoyal/kitty.git
synced 2026-09-21 12:17:14 +00:00
resetScrollValuators() runs on every LeaveNotify, clearing the initialized flag of every scroll valuator. handle_xi_motion_event() then treats the next XI_Motion event as a baseline sample and discards it. On setups where the X server emits crossing events with mode NotifyGrab faster than the wheel is turned, every scroll event lands in that branch and is swallowed, so scrolling does not work at all. This is easy to hit inside a VMware guest, where the same physical mouse is exposed as several pointer devices: --debug-input shows a continuous leave/enter cycle and a single Scroll event for the whole session. Fix this in two places: - Do not reset the baseline for crossing events generated by a grab being activated/released or by the pointer moving to a child window, since the pointer did not actually leave. - Keep the baseline value across a reset so the next event can still compute a delta from it, and only discard the event when the jump is too large to be a genuine scroll. Fixes #9846
566 lines
20 KiB
C
Vendored
566 lines
20 KiB
C
Vendored
//========================================================================
|
|
// GLFW 3.4 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 <dlfcn.h>
|
|
#include <poll.h>
|
|
|
|
#include <X11/Xlib.h>
|
|
#include <X11/keysym.h>
|
|
#include <X11/Xatom.h>
|
|
#include <X11/Xcursor/Xcursor.h>
|
|
|
|
// The xcb library is needed to work with libxkb
|
|
#include <X11/Xlib-xcb.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>
|
|
|
|
// The libxkb library is used for improved keyboard support
|
|
#include "xkb_glfw.h"
|
|
#include "backend_utils.h"
|
|
|
|
typedef 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.UpdateConfiguration
|
|
|
|
typedef XcursorImage *(*PFN_XcursorImageCreate)(int, int);
|
|
typedef void (*PFN_XcursorImageDestroy)(XcursorImage *);
|
|
typedef Cursor (*PFN_XcursorImageLoadCursor)(Display *, const XcursorImage *);
|
|
#define XcursorImageCreate _glfw.x11.xcursor.ImageCreate
|
|
#define XcursorImageDestroy _glfw.x11.xcursor.ImageDestroy
|
|
#define XcursorImageLoadCursor _glfw.x11.xcursor.ImageLoadCursor
|
|
|
|
typedef 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.QueryScreens
|
|
|
|
typedef 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.GetGammaRampSize
|
|
|
|
typedef Status (*PFN_XIQueryVersion)(Display *, int *, int *);
|
|
typedef int (*PFN_XISelectEvents)(Display *, Window, XIEventMask *, int);
|
|
typedef XIDeviceInfo *(*PFN_XIQueryDevice)(Display *, int, int *);
|
|
typedef void (*PFN_XIFreeDeviceInfo)(XIDeviceInfo *);
|
|
typedef Status (*PFN_XIGetProperty)(
|
|
Display *dpy,
|
|
int deviceid,
|
|
Atom property,
|
|
long offset,
|
|
long length,
|
|
Bool delete_property,
|
|
Atom type,
|
|
Atom *type_return,
|
|
int *format_return,
|
|
unsigned long *num_items_return,
|
|
unsigned long *bytes_after_return,
|
|
unsigned char **data);
|
|
|
|
#define XIQueryVersion _glfw.x11.xi.QueryVersion
|
|
#define XISelectEvents _glfw.x11.xi.SelectEvents
|
|
#define XIQueryDevice _glfw.x11.xi.QueryDevice
|
|
#define XIFreeDeviceInfo _glfw.x11.xi.FreeDeviceInfo
|
|
#define XIGetProperty _glfw.x11.xi.GetProperty
|
|
|
|
typedef 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.FindVisualFormat
|
|
|
|
typedef 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.ShapeCombineMask
|
|
|
|
typedef 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);
|
|
|
|
#include "posix_thread.h"
|
|
#include "glx_context.h"
|
|
#if defined(__linux__)
|
|
#include "linux_joystick.h"
|
|
#else
|
|
#include "null_joystick.h"
|
|
#endif
|
|
|
|
#define _glfw_dlopen(name) dlopen(name, RTLD_LAZY | RTLD_LOCAL)
|
|
#define _glfw_dlclose(handle) dlclose(handle)
|
|
#define _glfw_dlsym(handle, name) dlsym(handle, name)
|
|
|
|
#define _GLFW_PLATFORM_WINDOW_STATE _GLFWwindowX11 x11
|
|
#define _GLFW_PLATFORM_LIBRARY_WINDOW_STATE _GLFWlibraryX11 x11
|
|
#define _GLFW_PLATFORM_MONITOR_STATE _GLFWmonitorX11 x11
|
|
#define _GLFW_PLATFORM_CURSOR_STATE _GLFWcursorX11 x11
|
|
|
|
|
|
// X11-specific per-window data
|
|
//
|
|
typedef struct _GLFWwindowX11 {
|
|
Colormap colormap;
|
|
Window handle;
|
|
Window parent;
|
|
|
|
bool iconified;
|
|
bool maximized;
|
|
|
|
// Whether the visual supports framebuffer transparency
|
|
bool transparent;
|
|
|
|
// Cached position and size used to filter out duplicate events
|
|
int width, height;
|
|
int xpos, ypos;
|
|
|
|
// The last received cursor position, regardless of source
|
|
int lastCursorPosX, lastCursorPosY;
|
|
// The last position the cursor was warped to by GLFW
|
|
int warpCursorPosX, warpCursorPosY;
|
|
|
|
// XI2 smooth scrolling - track valuator values per window
|
|
struct {
|
|
double verticalValue;
|
|
double horizontalValue;
|
|
} smoothScroll;
|
|
|
|
struct {
|
|
bool is_active;
|
|
GLFWLayerShellConfig config;
|
|
} layer_shell;
|
|
} _GLFWwindowX11;
|
|
|
|
typedef struct MimeAtom {
|
|
Atom atom;
|
|
const char *mime;
|
|
} MimeAtom;
|
|
|
|
typedef struct AtomArray {
|
|
MimeAtom *array;
|
|
size_t sz, capacity;
|
|
} AtomArray;
|
|
|
|
typedef struct XIScrollValuator {
|
|
double increment, value, min, max;
|
|
int number, resolution, mode;
|
|
bool is_vertical, initialized, has_value;
|
|
} XIScrollValuator;
|
|
|
|
typedef struct XIScrollDevice {
|
|
bool is_finger_based;
|
|
bool type_detected;
|
|
int deviceid, sourceid;
|
|
XIScrollValuator valuators[8];
|
|
unsigned num_valuators;
|
|
char name[32];
|
|
unsigned num_events;
|
|
GLFWOffsetType offset_type;
|
|
bool v120_offset_needs_scaling;
|
|
} XIScrollDevice;
|
|
|
|
typedef struct XdndSelectionRequest {
|
|
char *mime;
|
|
bool inflight, got_data;
|
|
unsigned char *data;
|
|
size_t offset, size;
|
|
} XdndSelectionRequest;
|
|
|
|
// X11-specific global data
|
|
//
|
|
typedef struct _GLFWlibraryX11 {
|
|
Display *display;
|
|
int screen;
|
|
Window root;
|
|
|
|
// System content scale
|
|
float contentScaleX, contentScaleY;
|
|
// Helper window for IPC
|
|
Window helperWindowHandle;
|
|
// Invisible cursor for hidden cursor mode
|
|
Cursor hiddenCursorHandle;
|
|
// Context for mapping window XIDs to _GLFWwindow pointers
|
|
XContext context;
|
|
// Most recent error code received by X error handler
|
|
int errorCode;
|
|
// Where to place the cursor when re-enabled
|
|
double restoreCursorPosX, restoreCursorPosY;
|
|
// The window whose disabled cursor mode is active
|
|
_GLFWwindow *disabledCursorWindow;
|
|
|
|
// Window manager atoms
|
|
Atom NET_SUPPORTED;
|
|
Atom NET_SUPPORTING_WM_CHECK;
|
|
Atom WM_PROTOCOLS;
|
|
Atom WM_STATE;
|
|
Atom WM_DELETE_WINDOW;
|
|
Atom NET_WM_NAME;
|
|
Atom NET_WM_ALLOWED_ACTIONS, NET_WM_ACTION_MOVE, NET_WM_ACTION_RESIZE, NET_WM_ACTION_MINIMIZE, NET_WM_ACTION_SHADE, NET_WM_ACTION_STICK,
|
|
NET_WM_ACTION_MAXIMIZE_HORZ, NET_WM_ACTION_MAXIMIZE_VERT, NET_WM_ACTION_FULLSCREEN, NET_WM_ACTION_CHANGE_DESKTOP, NET_WM_ACTION_CLOSE,
|
|
NET_WM_ACTION_ABOVE, NET_WM_ACTION_BELOW, NET_WM_ACTION_ABOVE_BELOW;
|
|
Atom NET_WM_ICON_NAME;
|
|
Atom NET_WM_ICON;
|
|
Atom NET_WM_PID;
|
|
Atom NET_WM_PING;
|
|
Atom NET_WM_WINDOW_TYPE, NET_WM_WINDOW_TYPE_NORMAL, NET_WM_WINDOW_TYPE_DOCK, NET_WM_WINDOW_TYPE_DESKTOP, NET_WM_WINDOW_TYPE_UTILITY,
|
|
NET_WM_WINDOW_TYPE_SPLASH, NET_WM_WINDOW_TYPE_DIALOG, NET_WM_WINDOW_TYPE_MENU, NET_WM_WINDOW_TYPE_NOTIFICATION;
|
|
Atom NET_WM_STATE;
|
|
Atom NET_WM_STATE_ABOVE;
|
|
Atom NET_WM_STATE_BELOW;
|
|
Atom NET_WM_STATE_FULLSCREEN;
|
|
Atom NET_WM_STATE_MAXIMIZED_VERT;
|
|
Atom NET_WM_STATE_MAXIMIZED_HORZ;
|
|
Atom NET_WM_STATE_DEMANDS_ATTENTION;
|
|
Atom NET_WM_STATE_SKIP_TASKBAR;
|
|
Atom NET_WM_STATE_SKIP_PAGER;
|
|
Atom NET_WM_STATE_STICKY;
|
|
Atom NET_WM_BYPASS_COMPOSITOR;
|
|
Atom NET_WM_FULLSCREEN_MONITORS;
|
|
Atom NET_WM_WINDOW_OPACITY;
|
|
Atom NET_WM_CM_Sx;
|
|
Atom NET_WORKAREA;
|
|
Atom NET_CURRENT_DESKTOP;
|
|
Atom NET_ACTIVE_WINDOW;
|
|
Atom NET_FRAME_EXTENTS;
|
|
Atom NET_REQUEST_FRAME_EXTENTS;
|
|
Atom NET_WM_STRUT_PARTIAL;
|
|
Atom MOTIF_WM_HINTS;
|
|
|
|
// Xdnd (drag and drop) atoms
|
|
Atom XdndAware;
|
|
Atom XdndEnter;
|
|
Atom XdndPosition;
|
|
Atom XdndStatus;
|
|
Atom XdndActionCopy;
|
|
Atom XdndActionMove;
|
|
Atom XdndActionLink;
|
|
Atom XdndDrop;
|
|
Atom XdndFinished;
|
|
Atom XdndSelection;
|
|
Atom XdndTypeList;
|
|
Atom XdndActionList;
|
|
Atom XdndActionAsk;
|
|
Atom XdndLeave;
|
|
Atom XdndProxy;
|
|
|
|
// Selection (clipboard) atoms
|
|
Atom TARGETS;
|
|
Atom MULTIPLE;
|
|
Atom INCR;
|
|
Atom CLIPBOARD;
|
|
Atom PRIMARY;
|
|
Atom CLIPBOARD_MANAGER;
|
|
Atom SAVE_TARGETS;
|
|
Atom NULL_;
|
|
Atom UTF8_STRING;
|
|
Atom COMPOUND_STRING;
|
|
Atom ATOM_PAIR;
|
|
Atom GLFW_SELECTION;
|
|
|
|
// XRM database atom
|
|
Atom RESOURCE_MANAGER;
|
|
// KDE window blur
|
|
Atom _KDE_NET_WM_BLUR_BEHIND_REGION;
|
|
// Atoms for MIME types
|
|
AtomArray mime_atoms, clipboard_atoms, primary_atoms;
|
|
|
|
struct {
|
|
bool available;
|
|
void *handle;
|
|
int eventBase;
|
|
int errorBase;
|
|
int major;
|
|
int minor;
|
|
bool gammaBroken;
|
|
bool monitorBroken;
|
|
PFN_XRRAllocGamma AllocGamma;
|
|
PFN_XRRFreeCrtcInfo FreeCrtcInfo;
|
|
PFN_XRRFreeGamma FreeGamma;
|
|
PFN_XRRFreeOutputInfo FreeOutputInfo;
|
|
PFN_XRRFreeScreenResources FreeScreenResources;
|
|
PFN_XRRGetCrtcGamma GetCrtcGamma;
|
|
PFN_XRRGetCrtcGammaSize GetCrtcGammaSize;
|
|
PFN_XRRGetCrtcInfo GetCrtcInfo;
|
|
PFN_XRRGetOutputInfo GetOutputInfo;
|
|
PFN_XRRGetOutputPrimary GetOutputPrimary;
|
|
PFN_XRRGetScreenResourcesCurrent GetScreenResourcesCurrent;
|
|
PFN_XRRQueryExtension QueryExtension;
|
|
PFN_XRRQueryVersion QueryVersion;
|
|
PFN_XRRSelectInput SelectInput;
|
|
PFN_XRRSetCrtcConfig SetCrtcConfig;
|
|
PFN_XRRSetCrtcGamma SetCrtcGamma;
|
|
PFN_XRRUpdateConfiguration UpdateConfiguration;
|
|
} randr;
|
|
|
|
_GLFWXKBData xkb;
|
|
_GLFWDBUSData dbus;
|
|
|
|
struct {
|
|
int count;
|
|
int timeout;
|
|
int interval;
|
|
int blanking;
|
|
int exposure;
|
|
} saver;
|
|
|
|
struct {
|
|
int version;
|
|
Window source;
|
|
char format[256];
|
|
int format_priority;
|
|
Window target_window; // For drag events: the window being dragged over
|
|
const char **mimes; // Cached MIME types from drag enter (original, never reordered)
|
|
size_t mimes_count; // Count of MIME types (full original list, never reduced)
|
|
const char **copy_mimes; // Working copy passed to callbacks; pointers into mimes[]
|
|
size_t copy_mimes_count; // Accepted count after last callback
|
|
bool drag_accepted; // Whether the callback accepted at least one MIME type
|
|
bool from_self, dropped;
|
|
Time drop_time;
|
|
XdndSelectionRequest *selection_requests;
|
|
size_t selection_requests_count, selection_requests_capacity;
|
|
} xdnd;
|
|
|
|
// Drag source state
|
|
struct {
|
|
Window source_window;
|
|
Atom *type_atoms; // Atoms for each MIME type
|
|
size_t type_count;
|
|
Atom action_atom; // XdndActionCopy, XdndActionMove, or XdndActionLink
|
|
bool active; // Whether a drag is currently active
|
|
Window current_target; // Current drop target window under cursor
|
|
Window proxy_target; // Proxy target if current_target has XdndProxy
|
|
int xdnd_version; // Xdnd version supported by current target
|
|
bool waiting_for_status; // Waiting for XdndStatus from target
|
|
bool accepted; // Whether target accepted the drag
|
|
Atom accepted_action; // Action accepted by target
|
|
struct {
|
|
const char *mime_type;
|
|
Window requestor;
|
|
Atom property;
|
|
Atom target;
|
|
bool inflight;
|
|
} *pending_requests;
|
|
size_t pending_count;
|
|
size_t pending_capacity;
|
|
// Thumbnail window for drag icon
|
|
Window thumbnail_window;
|
|
Pixmap thumbnail_pixmap;
|
|
GC thumbnail_gc;
|
|
} drag;
|
|
|
|
struct {
|
|
void *handle;
|
|
PFN_XcursorImageCreate ImageCreate;
|
|
PFN_XcursorImageDestroy ImageDestroy;
|
|
PFN_XcursorImageLoadCursor ImageLoadCursor;
|
|
} xcursor;
|
|
|
|
struct {
|
|
bool available;
|
|
void *handle;
|
|
int major;
|
|
int minor;
|
|
PFN_XineramaIsActive IsActive;
|
|
PFN_XineramaQueryExtension QueryExtension;
|
|
PFN_XineramaQueryScreens QueryScreens;
|
|
} xinerama;
|
|
|
|
struct {
|
|
bool available;
|
|
void *handle;
|
|
int eventBase;
|
|
int errorBase;
|
|
PFN_XF86VidModeQueryExtension QueryExtension;
|
|
PFN_XF86VidModeGetGammaRamp GetGammaRamp;
|
|
PFN_XF86VidModeSetGammaRamp SetGammaRamp;
|
|
PFN_XF86VidModeGetGammaRampSize GetGammaRampSize;
|
|
} vidmode;
|
|
|
|
struct {
|
|
bool available;
|
|
void *handle;
|
|
int majorOpcode;
|
|
int eventBase;
|
|
int errorBase;
|
|
int major;
|
|
int minor;
|
|
PFN_XIQueryVersion QueryVersion;
|
|
PFN_XISelectEvents SelectEvents;
|
|
PFN_XIQueryDevice QueryDevice;
|
|
PFN_XIFreeDeviceInfo FreeDeviceInfo;
|
|
PFN_XIGetProperty GetProperty;
|
|
XIScrollDevice scroll_devices[16];
|
|
unsigned num_scroll_devices;
|
|
int master_pointer_id;
|
|
Atom LIBINPUT_SCROLL_METHOD_ENABLED, LIBINPUT_TAPPING;
|
|
} xi;
|
|
|
|
struct {
|
|
bool available;
|
|
void *handle;
|
|
int major;
|
|
int minor;
|
|
int eventBase;
|
|
int errorBase;
|
|
PFN_XRenderQueryExtension QueryExtension;
|
|
PFN_XRenderQueryVersion QueryVersion;
|
|
PFN_XRenderFindVisualFormat FindVisualFormat;
|
|
} xrender;
|
|
|
|
struct {
|
|
bool available;
|
|
void *handle;
|
|
int major;
|
|
int minor;
|
|
int eventBase;
|
|
int errorBase;
|
|
PFN_XShapeQueryExtension QueryExtension;
|
|
PFN_XShapeCombineRegion ShapeCombineRegion;
|
|
PFN_XShapeQueryVersion QueryVersion;
|
|
PFN_XShapeCombineMask ShapeCombineMask;
|
|
} xshape;
|
|
|
|
EventLoopData eventLoopData;
|
|
|
|
} _GLFWlibraryX11;
|
|
|
|
// X11-specific per-monitor data
|
|
//
|
|
typedef struct _GLFWmonitorX11 {
|
|
RROutput output;
|
|
RRCrtc crtc;
|
|
RRMode oldMode;
|
|
|
|
// Index of corresponding Xinerama screen,
|
|
// for EWMH full screen window placement
|
|
int index;
|
|
|
|
} _GLFWmonitorX11;
|
|
|
|
// X11-specific per-cursor data
|
|
//
|
|
typedef struct _GLFWcursorX11 {
|
|
Cursor handle;
|
|
|
|
} _GLFWcursorX11;
|
|
|
|
|
|
void _glfwPollMonitorsX11(void);
|
|
void _glfwSetVideoModeX11(_GLFWmonitor *monitor, const GLFWvidmode *desired);
|
|
void _glfwRestoreVideoModeX11(_GLFWmonitor *monitor);
|
|
|
|
Cursor _glfwCreateCursorX11(const GLFWimage *image, int xhot, int yhot);
|
|
|
|
unsigned long _glfwGetWindowPropertyX11(Window window, Atom property, Atom type, unsigned char **value);
|
|
bool _glfwIsVisualTransparentX11(Visual *visual);
|
|
|
|
void _glfwGrabErrorHandlerX11(void);
|
|
void _glfwReleaseErrorHandlerX11(void);
|
|
void _glfwInputErrorX11(int error, const char *message);
|
|
|
|
void _glfwGetSystemContentScaleX11(float *xscale, float *yscale, bool bypass_cache);
|
|
void _glfwPushSelectionToManagerX11(void);
|
|
void read_xi_scroll_devices(void);
|
|
void free_dnd_data(void);
|