x11: store all atoms in a specific struct

This commit is contained in:
David Fort
2024-09-30 19:43:49 +02:00
committed by Sam Lantinga
parent 801870c8cf
commit 818d7d892a
6 changed files with 129 additions and 127 deletions

View File

@@ -198,7 +198,7 @@ static void *GetSelectionData(SDL_VideoDevice *_this, Atom selection_type,
} else { } else {
// Request that the selection owner copy the data to our window // Request that the selection owner copy the data to our window
owner = window; owner = window;
selection = videodata->SDL_SELECTION; selection = videodata->atoms.SDL_SELECTION;
X11_XConvertSelection(display, selection_type, XA_MIME, selection, owner, X11_XConvertSelection(display, selection_type, XA_MIME, selection, owner,
CurrentTime); CurrentTime);
@@ -212,7 +212,7 @@ static void *GetSelectionData(SDL_VideoDevice *_this, Atom selection_type,
if (seln_type == XA_MIME) { if (seln_type == XA_MIME) {
*length = (size_t)count; *length = (size_t)count;
data = CloneDataBuffer(src, count); data = CloneDataBuffer(src, count);
} else if (seln_type == videodata->INCR) { } else if (seln_type == videodata->atoms.INCR) {
while (1) { while (1) {
// Only delete the property after being done with the previous "chunk". // Only delete the property after being done with the previous "chunk".
X11_XDeleteProperty(display, owner, selection); X11_XDeleteProperty(display, owner, selection);
@@ -267,13 +267,13 @@ const char **X11_GetTextMimeTypes(SDL_VideoDevice *_this, size_t *num_mime_types
bool X11_SetClipboardData(SDL_VideoDevice *_this) bool X11_SetClipboardData(SDL_VideoDevice *_this)
{ {
SDL_VideoData *videodata = _this->internal; SDL_VideoData *videodata = _this->internal;
return SetSelectionData(_this, videodata->CLIPBOARD, _this->clipboard_callback, _this->clipboard_userdata, (const char **)_this->clipboard_mime_types, _this->num_clipboard_mime_types, _this->clipboard_sequence); return SetSelectionData(_this, videodata->atoms.CLIPBOARD, _this->clipboard_callback, _this->clipboard_userdata, (const char **)_this->clipboard_mime_types, _this->num_clipboard_mime_types, _this->clipboard_sequence);
} }
void *X11_GetClipboardData(SDL_VideoDevice *_this, const char *mime_type, size_t *length) void *X11_GetClipboardData(SDL_VideoDevice *_this, const char *mime_type, size_t *length)
{ {
SDL_VideoData *videodata = _this->internal; SDL_VideoData *videodata = _this->internal;
return GetSelectionData(_this, videodata->CLIPBOARD, mime_type, length); return GetSelectionData(_this, videodata->atoms.CLIPBOARD, mime_type, length);
} }
bool X11_HasClipboardData(SDL_VideoDevice *_this, const char *mime_type) bool X11_HasClipboardData(SDL_VideoDevice *_this, const char *mime_type)

View File

@@ -525,7 +525,7 @@ static void X11_UpdateUserTime(SDL_WindowData *data, const unsigned long latest)
if (latest && (latest != data->user_time)) { if (latest && (latest != data->user_time)) {
SDL_VideoData *videodata = data->videodata; SDL_VideoData *videodata = data->videodata;
Display *display = videodata->display; Display *display = videodata->display;
X11_XChangeProperty(display, data->xwindow, videodata->_NET_WM_USER_TIME, X11_XChangeProperty(display, data->xwindow, videodata->atoms._NET_WM_USER_TIME,
XA_CARDINAL, 32, PropModeReplace, XA_CARDINAL, 32, PropModeReplace,
(const unsigned char *)&latest, 1); (const unsigned char *)&latest, 1);
#ifdef DEBUG_XEVENTS #ifdef DEBUG_XEVENTS
@@ -918,7 +918,7 @@ void X11_GetBorderValues(SDL_WindowData *data)
// Some compositors will send extents even when the border hint is turned off. Ignore them in this case. // Some compositors will send extents even when the border hint is turned off. Ignore them in this case.
if (!(data->window->flags & SDL_WINDOW_BORDERLESS)) { if (!(data->window->flags & SDL_WINDOW_BORDERLESS)) {
if (X11_XGetWindowProperty(display, data->xwindow, videodata->_NET_FRAME_EXTENTS, 0, 16, 0, XA_CARDINAL, &type, &format, &nitems, &bytes_after, &property) == Success) { if (X11_XGetWindowProperty(display, data->xwindow, videodata->atoms._NET_FRAME_EXTENTS, 0, 16, 0, XA_CARDINAL, &type, &format, &nitems, &bytes_after, &property) == Success) {
if (type != None && nitems == 4) { if (type != None && nitems == 4) {
data->border_left = (int)((long *)property)[0]; data->border_left = (int)((long *)property)[0];
data->border_right = (int)((long *)property)[1]; data->border_right = (int)((long *)property)[1];
@@ -995,7 +995,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
#endif #endif
if (ev->selection == XA_PRIMARY || if (ev->selection == XA_PRIMARY ||
(videodata->CLIPBOARD != None && ev->selection == videodata->CLIPBOARD)) { (videodata->atoms.CLIPBOARD != None && ev->selection == videodata->atoms.CLIPBOARD)) {
SDL_SendClipboardUpdate(); SDL_SendClipboardUpdate();
return; return;
} }
@@ -1331,7 +1331,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
static int xdnd_version = 0; static int xdnd_version = 0;
if (xevent->xclient.message_type == videodata->XdndEnter) { if (xevent->xclient.message_type == videodata->atoms.XdndEnter) {
bool use_list = xevent->xclient.data.l[1] & 1; bool use_list = xevent->xclient.data.l[1] & 1;
data->xdnd_source = xevent->xclient.data.l[0]; data->xdnd_source = xevent->xclient.data.l[0];
@@ -1345,7 +1345,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
if (use_list) { if (use_list) {
// fetch conversion targets // fetch conversion targets
SDL_x11Prop p; SDL_x11Prop p;
X11_ReadProperty(&p, display, data->xdnd_source, videodata->XdndTypeList); X11_ReadProperty(&p, display, data->xdnd_source, videodata->atoms.XdndTypeList);
// pick one // pick one
data->xdnd_req = X11_PickTarget(display, (Atom *)p.data, p.count); data->xdnd_req = X11_PickTarget(display, (Atom *)p.data, p.count);
X11_XFree(p.data); X11_XFree(p.data);
@@ -1353,10 +1353,10 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
// pick from list of three // pick from list of three
data->xdnd_req = X11_PickTargetFromAtoms(display, xevent->xclient.data.l[2], xevent->xclient.data.l[3], xevent->xclient.data.l[4]); data->xdnd_req = X11_PickTargetFromAtoms(display, xevent->xclient.data.l[2], xevent->xclient.data.l[3], xevent->xclient.data.l[4]);
} }
} else if (xevent->xclient.message_type == videodata->XdndPosition) { } else if (xevent->xclient.message_type == videodata->atoms.XdndPosition) {
#ifdef DEBUG_XEVENTS #ifdef DEBUG_XEVENTS
Atom act = videodata->XdndActionCopy; Atom act = videodata->atoms.XdndActionCopy;
if (xdnd_version >= 2) { if (xdnd_version >= 2) {
act = xevent->xclient.data.l[4]; act = xevent->xclient.data.l[4];
} }
@@ -1380,24 +1380,24 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
m.type = ClientMessage; m.type = ClientMessage;
m.display = xevent->xclient.display; m.display = xevent->xclient.display;
m.window = xevent->xclient.data.l[0]; m.window = xevent->xclient.data.l[0];
m.message_type = videodata->XdndStatus; m.message_type = videodata->atoms.XdndStatus;
m.format = 32; m.format = 32;
m.data.l[0] = data->xwindow; m.data.l[0] = data->xwindow;
m.data.l[1] = (data->xdnd_req != None); m.data.l[1] = (data->xdnd_req != None);
m.data.l[2] = 0; // specify an empty rectangle m.data.l[2] = 0; // specify an empty rectangle
m.data.l[3] = 0; m.data.l[3] = 0;
m.data.l[4] = videodata->XdndActionCopy; // we only accept copying anyway m.data.l[4] = videodata->atoms.XdndActionCopy; // we only accept copying anyway
X11_XSendEvent(display, xevent->xclient.data.l[0], False, NoEventMask, (XEvent *)&m); X11_XSendEvent(display, xevent->xclient.data.l[0], False, NoEventMask, (XEvent *)&m);
X11_XFlush(display); X11_XFlush(display);
} else if (xevent->xclient.message_type == videodata->XdndDrop) { } else if (xevent->xclient.message_type == videodata->atoms.XdndDrop) {
if (data->xdnd_req == None) { if (data->xdnd_req == None) {
// say again - not interested! // say again - not interested!
SDL_memset(&m, 0, sizeof(XClientMessageEvent)); SDL_memset(&m, 0, sizeof(XClientMessageEvent));
m.type = ClientMessage; m.type = ClientMessage;
m.display = xevent->xclient.display; m.display = xevent->xclient.display;
m.window = xevent->xclient.data.l[0]; m.window = xevent->xclient.data.l[0];
m.message_type = videodata->XdndFinished; m.message_type = videodata->atoms.XdndFinished;
m.format = 32; m.format = 32;
m.data.l[0] = data->xwindow; m.data.l[0] = data->xwindow;
m.data.l[1] = 0; m.data.l[1] = 0;
@@ -1406,14 +1406,14 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
} else { } else {
// convert // convert
if (xdnd_version >= 1) { if (xdnd_version >= 1) {
X11_XConvertSelection(display, videodata->XdndSelection, data->xdnd_req, videodata->PRIMARY, data->xwindow, xevent->xclient.data.l[2]); X11_XConvertSelection(display, videodata->atoms.XdndSelection, data->xdnd_req, videodata->atoms.PRIMARY, data->xwindow, xevent->xclient.data.l[2]);
} else { } else {
X11_XConvertSelection(display, videodata->XdndSelection, data->xdnd_req, videodata->PRIMARY, data->xwindow, CurrentTime); X11_XConvertSelection(display, videodata->atoms.XdndSelection, data->xdnd_req, videodata->atoms.PRIMARY, data->xwindow, CurrentTime);
} }
} }
} else if ((xevent->xclient.message_type == videodata->WM_PROTOCOLS) && } else if ((xevent->xclient.message_type == videodata->atoms.WM_PROTOCOLS) &&
(xevent->xclient.format == 32) && (xevent->xclient.format == 32) &&
(xevent->xclient.data.l[0] == videodata->_NET_WM_PING)) { (xevent->xclient.data.l[0] == videodata->atoms._NET_WM_PING)) {
Window root = DefaultRootWindow(display); Window root = DefaultRootWindow(display);
#ifdef DEBUG_XEVENTS #ifdef DEBUG_XEVENTS
@@ -1424,9 +1424,9 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
break; break;
} }
else if ((xevent->xclient.message_type == videodata->WM_PROTOCOLS) && else if ((xevent->xclient.message_type == videodata->atoms.WM_PROTOCOLS) &&
(xevent->xclient.format == 32) && (xevent->xclient.format == 32) &&
(xevent->xclient.data.l[0] == videodata->WM_DELETE_WINDOW)) { (xevent->xclient.data.l[0] == videodata->atoms.WM_DELETE_WINDOW)) {
#ifdef DEBUG_XEVENTS #ifdef DEBUG_XEVENTS
SDL_Log("window 0x%lx: WM_DELETE_WINDOW\n", xevent->xany.window); SDL_Log("window 0x%lx: WM_DELETE_WINDOW\n", xevent->xany.window);
@@ -1553,7 +1553,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
SDL_Log(" }\n"); SDL_Log(" }\n");
} }
} else if (real_type == XA_STRING || } else if (real_type == XA_STRING ||
real_type == videodata->UTF8_STRING) { real_type == videodata->atoms.UTF8_STRING) {
SDL_Log("{ \"%s\" }\n", propdata); SDL_Log("{ \"%s\" }\n", propdata);
} else if (real_type == XA_ATOM) { } else if (real_type == XA_ATOM) {
Atom *atoms = (Atom *)propdata; Atom *atoms = (Atom *)propdata;
@@ -1591,7 +1591,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
data->user_time = xevent->xproperty.time; data->user_time = xevent->xproperty.time;
} }
if (xevent->xproperty.atom == data->videodata->_NET_WM_STATE) { if (xevent->xproperty.atom == data->videodata->atoms._NET_WM_STATE) {
/* Get the new state from the window manager. /* Get the new state from the window manager.
Compositing window managers can alter visibility of windows Compositing window managers can alter visibility of windows
without ever mapping / unmapping them, so we handle that here, without ever mapping / unmapping them, so we handle that here,
@@ -1710,7 +1710,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
if (changed & SDL_WINDOW_OCCLUDED) { if (changed & SDL_WINDOW_OCCLUDED) {
SDL_SendWindowEvent(data->window, (flags & SDL_WINDOW_OCCLUDED) ? SDL_EVENT_WINDOW_OCCLUDED : SDL_EVENT_WINDOW_EXPOSED, 0, 0); SDL_SendWindowEvent(data->window, (flags & SDL_WINDOW_OCCLUDED) ? SDL_EVENT_WINDOW_OCCLUDED : SDL_EVENT_WINDOW_EXPOSED, 0, 0);
} }
} else if (xevent->xproperty.atom == videodata->XKLAVIER_STATE) { } else if (xevent->xproperty.atom == videodata->atoms.XKLAVIER_STATE) {
/* Hack for Ubuntu 12.04 (etc) that doesn't send MappingNotify /* Hack for Ubuntu 12.04 (etc) that doesn't send MappingNotify
events when the keyboard layout changes (for example, events when the keyboard layout changes (for example,
changing from English to French on the menubar's keyboard changing from English to French on the menubar's keyboard
@@ -1718,7 +1718,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
notice and reinit our keymap here. This might not be the notice and reinit our keymap here. This might not be the
right approach, but it seems to work. */ right approach, but it seems to work. */
X11_UpdateKeymap(_this, true); X11_UpdateKeymap(_this, true);
} else if (xevent->xproperty.atom == videodata->_NET_FRAME_EXTENTS) { } else if (xevent->xproperty.atom == videodata->atoms._NET_FRAME_EXTENTS) {
if (data->disable_size_position_events) { if (data->disable_size_position_events) {
/* Re-enable size events if they were turned off waiting for the borders to come back /* Re-enable size events if they were turned off waiting for the borders to come back
* when leaving fullscreen. * when leaving fullscreen.
@@ -1758,7 +1758,7 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
if (target == data->xdnd_req) { if (target == data->xdnd_req) {
// read data // read data
SDL_x11Prop p; SDL_x11Prop p;
X11_ReadProperty(&p, display, data->xwindow, videodata->PRIMARY); X11_ReadProperty(&p, display, data->xwindow, videodata->atoms.PRIMARY);
if (p.format == 8) { if (p.format == 8) {
char *saveptr = NULL; char *saveptr = NULL;
@@ -1789,11 +1789,11 @@ static void X11_DispatchEvent(SDL_VideoDevice *_this, XEvent *xevent)
m.type = ClientMessage; m.type = ClientMessage;
m.display = display; m.display = display;
m.window = data->xdnd_source; m.window = data->xdnd_source;
m.message_type = videodata->XdndFinished; m.message_type = videodata->atoms.XdndFinished;
m.format = 32; m.format = 32;
m.data.l[0] = data->xwindow; m.data.l[0] = data->xwindow;
m.data.l[1] = 1; m.data.l[1] = 1;
m.data.l[2] = videodata->XdndActionCopy; m.data.l[2] = videodata->atoms.XdndActionCopy;
X11_XSendEvent(display, data->xdnd_source, False, NoEventMask, (XEvent *)&m); X11_XSendEvent(display, data->xdnd_source, False, NoEventMask, (XEvent *)&m);
X11_XSync(display, False); X11_XSync(display, False);
@@ -1857,7 +1857,7 @@ void X11_SendWakeupEvent(SDL_VideoDevice *_this, SDL_Window *window)
event.type = ClientMessage; event.type = ClientMessage;
event.display = req_display; event.display = req_display;
event.send_event = True; event.send_event = True;
event.message_type = data->_SDL_WAKEUP; event.message_type = data->atoms._SDL_WAKEUP;
event.format = 8; event.format = 8;
X11_XSendEvent(req_display, xwindow, False, NoEventMask, (XEvent *)&event); X11_XSendEvent(req_display, xwindow, False, NoEventMask, (XEvent *)&event);

View File

@@ -36,7 +36,7 @@ static bool X11_XInput2DeviceIsPen(SDL_VideoDevice *_this, const XIDeviceInfo *d
const XIAnyClassInfo *classinfo = dev->classes[i]; const XIAnyClassInfo *classinfo = dev->classes[i];
if (classinfo->type == XIValuatorClass) { if (classinfo->type == XIValuatorClass) {
const XIValuatorClassInfo *val_classinfo = (const XIValuatorClassInfo *)classinfo; const XIValuatorClassInfo *val_classinfo = (const XIValuatorClassInfo *)classinfo;
if (val_classinfo->label == data->pen_atom_abs_pressure) { if (val_classinfo->label == data->atoms.pen_atom_abs_pressure) {
return true; return true;
} }
} }
@@ -51,7 +51,7 @@ static bool X11_XInput2PenIsEraser(SDL_VideoDevice *_this, int deviceid, char *d
#define PEN_ERASER_NAME_TAG "eraser" // String constant to identify erasers #define PEN_ERASER_NAME_TAG "eraser" // String constant to identify erasers
SDL_VideoData *data = (SDL_VideoData *)_this->internal; SDL_VideoData *data = (SDL_VideoData *)_this->internal;
if (data->pen_atom_wacom_tool_type != None) { if (data->atoms.pen_atom_wacom_tool_type != None) {
Atom type_return; Atom type_return;
int format_return; int format_return;
unsigned long num_items_return; unsigned long num_items_return;
@@ -60,7 +60,7 @@ static bool X11_XInput2PenIsEraser(SDL_VideoDevice *_this, int deviceid, char *d
// Try Wacom-specific method // Try Wacom-specific method
if (Success == X11_XIGetProperty(data->display, deviceid, if (Success == X11_XIGetProperty(data->display, deviceid,
data->pen_atom_wacom_tool_type, data->atoms.pen_atom_wacom_tool_type,
0, 32, False, 0, 32, False,
AnyPropertyType, &type_return, &format_return, AnyPropertyType, &type_return, &format_return,
&num_items_return, &bytes_after_return, &num_items_return, &bytes_after_return,
@@ -154,7 +154,7 @@ static bool X11_XInput2PenWacomDeviceID(SDL_VideoDevice *_this, int deviceid, Ui
Sint32 serial_id_buf[3]; Sint32 serial_id_buf[3];
int result; int result;
if ((result = X11_XInput2PenGetIntProperty(_this, deviceid, data->pen_atom_wacom_serial_ids, serial_id_buf, 3)) == 3) { if ((result = X11_XInput2PenGetIntProperty(_this, deviceid, data->atoms.pen_atom_wacom_serial_ids, serial_id_buf, 3)) == 3) {
*wacom_devicetype_id = serial_id_buf[2]; *wacom_devicetype_id = serial_id_buf[2];
*wacom_serial = serial_id_buf[1]; *wacom_serial = serial_id_buf[1];
return true; return true;
@@ -225,11 +225,11 @@ static X11_PenHandle *X11_MaybeAddPen(SDL_VideoDevice *_this, const XIDeviceInfo
SDL_PenAxis axis = SDL_PEN_AXIS_COUNT; SDL_PenAxis axis = SDL_PEN_AXIS_COUNT;
// afaict, SDL_PEN_AXIS_DISTANCE is never reported by XInput2 (Wayland can offer it, though) // afaict, SDL_PEN_AXIS_DISTANCE is never reported by XInput2 (Wayland can offer it, though)
if (vname == data->pen_atom_abs_pressure) { if (vname == data->atoms.pen_atom_abs_pressure) {
axis = SDL_PEN_AXIS_PRESSURE; axis = SDL_PEN_AXIS_PRESSURE;
} else if (vname == data->pen_atom_abs_tilt_x) { } else if (vname == data->atoms.pen_atom_abs_tilt_x) {
axis = SDL_PEN_AXIS_XTILT; axis = SDL_PEN_AXIS_XTILT;
} else if (vname == data->pen_atom_abs_tilt_y) { } else if (vname == data->atoms.pen_atom_abs_tilt_y) {
axis = SDL_PEN_AXIS_YTILT; axis = SDL_PEN_AXIS_YTILT;
} else { } else {
use_this_axis = false; use_this_axis = false;
@@ -304,12 +304,12 @@ void X11_InitPen(SDL_VideoDevice *_this)
SDL_VideoData *data = (SDL_VideoData *)_this->internal; SDL_VideoData *data = (SDL_VideoData *)_this->internal;
#define LOOKUP_PEN_ATOM(X) X11_XInternAtom(data->display, X, False) #define LOOKUP_PEN_ATOM(X) X11_XInternAtom(data->display, X, False)
data->pen_atom_device_product_id = LOOKUP_PEN_ATOM("Device Product ID"); data->atoms.pen_atom_device_product_id = LOOKUP_PEN_ATOM("Device Product ID");
data->pen_atom_wacom_serial_ids = LOOKUP_PEN_ATOM("Wacom Serial IDs"); data->atoms.pen_atom_wacom_serial_ids = LOOKUP_PEN_ATOM("Wacom Serial IDs");
data->pen_atom_wacom_tool_type = LOOKUP_PEN_ATOM("Wacom Tool Type"); data->atoms.pen_atom_wacom_tool_type = LOOKUP_PEN_ATOM("Wacom Tool Type");
data->pen_atom_abs_pressure = LOOKUP_PEN_ATOM("Abs Pressure"); data->atoms.pen_atom_abs_pressure = LOOKUP_PEN_ATOM("Abs Pressure");
data->pen_atom_abs_tilt_x = LOOKUP_PEN_ATOM("Abs Tilt X"); data->atoms.pen_atom_abs_tilt_x = LOOKUP_PEN_ATOM("Abs Tilt X");
data->pen_atom_abs_tilt_y = LOOKUP_PEN_ATOM("Abs Tilt Y"); data->atoms.pen_atom_abs_tilt_y = LOOKUP_PEN_ATOM("Abs Tilt Y");
#undef LOOKUP_PEN_ATOM #undef LOOKUP_PEN_ATOM
// Do an initial check on devices. After this, we'll add/remove individual pens when XI_HierarchyChanged events alert us. // Do an initial check on devices. After this, we'll add/remove individual pens when XI_HierarchyChanged events alert us.

View File

@@ -388,7 +388,7 @@ static bool X11_VideoInit(SDL_VideoDevice *_this)
data->window_group = (XID)(((size_t)data->pid) ^ ((size_t)_this)); data->window_group = (XID)(((size_t)data->pid) ^ ((size_t)_this));
// Look up some useful Atoms // Look up some useful Atoms
#define GET_ATOM(X) data->X = X11_XInternAtom(data->display, #X, False) #define GET_ATOM(X) data->atoms.X = X11_XInternAtom(data->display, #X, False)
GET_ATOM(WM_PROTOCOLS); GET_ATOM(WM_PROTOCOLS);
GET_ATOM(WM_DELETE_WINDOW); GET_ATOM(WM_DELETE_WINDOW);
GET_ATOM(WM_TAKE_FOCUS); GET_ATOM(WM_TAKE_FOCUS);

View File

@@ -66,54 +66,56 @@ struct SDL_VideoData
bool net_wm; bool net_wm;
// Useful atoms // Useful atoms
Atom WM_PROTOCOLS; struct {
Atom WM_DELETE_WINDOW; Atom WM_PROTOCOLS;
Atom WM_TAKE_FOCUS; Atom WM_DELETE_WINDOW;
Atom WM_NAME; Atom WM_TAKE_FOCUS;
Atom WM_TRANSIENT_FOR; Atom WM_NAME;
Atom _NET_WM_STATE; Atom WM_TRANSIENT_FOR;
Atom _NET_WM_STATE_HIDDEN; Atom _NET_WM_STATE;
Atom _NET_WM_STATE_FOCUSED; Atom _NET_WM_STATE_HIDDEN;
Atom _NET_WM_STATE_MAXIMIZED_VERT; Atom _NET_WM_STATE_FOCUSED;
Atom _NET_WM_STATE_MAXIMIZED_HORZ; Atom _NET_WM_STATE_MAXIMIZED_VERT;
Atom _NET_WM_STATE_FULLSCREEN; Atom _NET_WM_STATE_MAXIMIZED_HORZ;
Atom _NET_WM_STATE_ABOVE; Atom _NET_WM_STATE_FULLSCREEN;
Atom _NET_WM_STATE_SKIP_TASKBAR; Atom _NET_WM_STATE_ABOVE;
Atom _NET_WM_STATE_SKIP_PAGER; Atom _NET_WM_STATE_SKIP_TASKBAR;
Atom _NET_WM_STATE_MODAL; Atom _NET_WM_STATE_SKIP_PAGER;
Atom _NET_WM_ALLOWED_ACTIONS; Atom _NET_WM_STATE_MODAL;
Atom _NET_WM_ACTION_FULLSCREEN; Atom _NET_WM_ALLOWED_ACTIONS;
Atom _NET_WM_NAME; Atom _NET_WM_ACTION_FULLSCREEN;
Atom _NET_WM_ICON_NAME; Atom _NET_WM_NAME;
Atom _NET_WM_ICON; Atom _NET_WM_ICON_NAME;
Atom _NET_WM_PING; Atom _NET_WM_ICON;
Atom _NET_WM_WINDOW_OPACITY; Atom _NET_WM_PING;
Atom _NET_WM_USER_TIME; Atom _NET_WM_WINDOW_OPACITY;
Atom _NET_ACTIVE_WINDOW; Atom _NET_WM_USER_TIME;
Atom _NET_FRAME_EXTENTS; Atom _NET_ACTIVE_WINDOW;
Atom _SDL_WAKEUP; Atom _NET_FRAME_EXTENTS;
Atom UTF8_STRING; Atom _SDL_WAKEUP;
Atom PRIMARY; Atom UTF8_STRING;
Atom CLIPBOARD; Atom PRIMARY;
Atom INCR; Atom CLIPBOARD;
Atom SDL_SELECTION; Atom INCR;
Atom XdndEnter; Atom SDL_SELECTION;
Atom XdndPosition; Atom XdndEnter;
Atom XdndStatus; Atom XdndPosition;
Atom XdndTypeList; Atom XdndStatus;
Atom XdndActionCopy; Atom XdndTypeList;
Atom XdndDrop; Atom XdndActionCopy;
Atom XdndFinished; Atom XdndDrop;
Atom XdndSelection; Atom XdndFinished;
Atom XKLAVIER_STATE; Atom XdndSelection;
Atom XKLAVIER_STATE;
// Pen atoms (these have names that don't map well to C symbols) // Pen atoms (these have names that don't map well to C symbols)
Atom pen_atom_device_product_id; Atom pen_atom_device_product_id;
Atom pen_atom_abs_pressure; Atom pen_atom_abs_pressure;
Atom pen_atom_abs_tilt_x; Atom pen_atom_abs_tilt_x;
Atom pen_atom_abs_tilt_y; Atom pen_atom_abs_tilt_y;
Atom pen_atom_wacom_serial_ids; Atom pen_atom_wacom_serial_ids;
Atom pen_atom_wacom_tool_type; Atom pen_atom_wacom_tool_type;
} atoms;
SDL_Scancode key_layout[256]; SDL_Scancode key_layout[256];
bool selection_waiting; bool selection_waiting;

View File

@@ -129,16 +129,16 @@ void X11_SetNetWMState(SDL_VideoDevice *_this, Window xwindow, SDL_WindowFlags f
SDL_VideoData *videodata = _this->internal; SDL_VideoData *videodata = _this->internal;
Display *display = videodata->display; Display *display = videodata->display;
// !!! FIXME: just dereference videodata below instead of copying to locals. // !!! FIXME: just dereference videodata below instead of copying to locals.
Atom _NET_WM_STATE = videodata->_NET_WM_STATE; Atom _NET_WM_STATE = videodata->atoms._NET_WM_STATE;
// Atom _NET_WM_STATE_HIDDEN = videodata->_NET_WM_STATE_HIDDEN; // Atom _NET_WM_STATE_HIDDEN = videodata->atoms._NET_WM_STATE_HIDDEN;
Atom _NET_WM_STATE_FOCUSED = videodata->_NET_WM_STATE_FOCUSED; Atom _NET_WM_STATE_FOCUSED = videodata->atoms._NET_WM_STATE_FOCUSED;
Atom _NET_WM_STATE_MAXIMIZED_VERT = videodata->_NET_WM_STATE_MAXIMIZED_VERT; Atom _NET_WM_STATE_MAXIMIZED_VERT = videodata->atoms._NET_WM_STATE_MAXIMIZED_VERT;
Atom _NET_WM_STATE_MAXIMIZED_HORZ = videodata->_NET_WM_STATE_MAXIMIZED_HORZ; Atom _NET_WM_STATE_MAXIMIZED_HORZ = videodata->atoms._NET_WM_STATE_MAXIMIZED_HORZ;
Atom _NET_WM_STATE_FULLSCREEN = videodata->_NET_WM_STATE_FULLSCREEN; Atom _NET_WM_STATE_FULLSCREEN = videodata->atoms._NET_WM_STATE_FULLSCREEN;
Atom _NET_WM_STATE_ABOVE = videodata->_NET_WM_STATE_ABOVE; Atom _NET_WM_STATE_ABOVE = videodata->atoms._NET_WM_STATE_ABOVE;
Atom _NET_WM_STATE_SKIP_TASKBAR = videodata->_NET_WM_STATE_SKIP_TASKBAR; Atom _NET_WM_STATE_SKIP_TASKBAR = videodata->atoms._NET_WM_STATE_SKIP_TASKBAR;
Atom _NET_WM_STATE_SKIP_PAGER = videodata->_NET_WM_STATE_SKIP_PAGER; Atom _NET_WM_STATE_SKIP_PAGER = videodata->atoms._NET_WM_STATE_SKIP_PAGER;
Atom _NET_WM_STATE_MODAL = videodata->_NET_WM_STATE_MODAL; Atom _NET_WM_STATE_MODAL = videodata->atoms._NET_WM_STATE_MODAL;
Atom atoms[16]; Atom atoms[16];
int count = 0; int count = 0;
@@ -238,12 +238,12 @@ Uint32 X11_GetNetWMState(SDL_VideoDevice *_this, SDL_Window *window, Window xwin
{ {
SDL_VideoData *videodata = _this->internal; SDL_VideoData *videodata = _this->internal;
Display *display = videodata->display; Display *display = videodata->display;
Atom _NET_WM_STATE = videodata->_NET_WM_STATE; Atom _NET_WM_STATE = videodata->atoms._NET_WM_STATE;
Atom _NET_WM_STATE_HIDDEN = videodata->_NET_WM_STATE_HIDDEN; Atom _NET_WM_STATE_HIDDEN = videodata->atoms._NET_WM_STATE_HIDDEN;
Atom _NET_WM_STATE_FOCUSED = videodata->_NET_WM_STATE_FOCUSED; Atom _NET_WM_STATE_FOCUSED = videodata->atoms._NET_WM_STATE_FOCUSED;
Atom _NET_WM_STATE_MAXIMIZED_VERT = videodata->_NET_WM_STATE_MAXIMIZED_VERT; Atom _NET_WM_STATE_MAXIMIZED_VERT = videodata->atoms._NET_WM_STATE_MAXIMIZED_VERT;
Atom _NET_WM_STATE_MAXIMIZED_HORZ = videodata->_NET_WM_STATE_MAXIMIZED_HORZ; Atom _NET_WM_STATE_MAXIMIZED_HORZ = videodata->atoms._NET_WM_STATE_MAXIMIZED_HORZ;
Atom _NET_WM_STATE_FULLSCREEN = videodata->_NET_WM_STATE_FULLSCREEN; Atom _NET_WM_STATE_FULLSCREEN = videodata->atoms._NET_WM_STATE_FULLSCREEN;
Atom actualType; Atom actualType;
int actualFormat; int actualFormat;
unsigned long i, numItems, bytesAfter; unsigned long i, numItems, bytesAfter;
@@ -773,12 +773,12 @@ bool X11_CreateWindow(SDL_VideoDevice *_this, SDL_Window *window, SDL_Properties
Atom protocols[3]; Atom protocols[3];
int proto_count = 0; int proto_count = 0;
protocols[proto_count++] = data->WM_DELETE_WINDOW; // Allow window to be deleted by the WM protocols[proto_count++] = data->atoms.WM_DELETE_WINDOW; // Allow window to be deleted by the WM
protocols[proto_count++] = data->WM_TAKE_FOCUS; // Since we will want to set input focus explicitly protocols[proto_count++] = data->atoms.WM_TAKE_FOCUS; // Since we will want to set input focus explicitly
// Default to using ping if there is no hint // Default to using ping if there is no hint
if (SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_NET_WM_PING, true)) { if (SDL_GetHintBoolean(SDL_HINT_VIDEO_X11_NET_WM_PING, true)) {
protocols[proto_count++] = data->_NET_WM_PING; // Respond so WM knows we're alive protocols[proto_count++] = data->atoms._NET_WM_PING; // Respond so WM knows we're alive
} }
SDL_assert(proto_count <= sizeof(protocols) / sizeof(protocols[0])); SDL_assert(proto_count <= sizeof(protocols) / sizeof(protocols[0]));
@@ -855,8 +855,8 @@ char *X11_GetWindowTitle(SDL_VideoDevice *_this, Window xwindow)
unsigned char *propdata; unsigned char *propdata;
char *title = NULL; char *title = NULL;
status = X11_XGetWindowProperty(display, xwindow, data->_NET_WM_NAME, status = X11_XGetWindowProperty(display, xwindow, data->atoms._NET_WM_NAME,
0L, 8192L, False, data->UTF8_STRING, &real_type, &real_format, 0L, 8192L, False, data->atoms.UTF8_STRING, &real_type, &real_format,
&items_read, &items_left, &propdata); &items_read, &items_left, &propdata);
if (status == Success && propdata) { if (status == Success && propdata) {
title = SDL_strdup(SDL_static_cast(char *, propdata)); title = SDL_strdup(SDL_static_cast(char *, propdata));
@@ -971,7 +971,7 @@ bool X11_SetWindowIcon(SDL_VideoDevice *_this, SDL_Window *window, SDL_Surface *
{ {
SDL_WindowData *data = window->internal; SDL_WindowData *data = window->internal;
Display *display = data->videodata->display; Display *display = data->videodata->display;
Atom _NET_WM_ICON = data->videodata->_NET_WM_ICON; Atom _NET_WM_ICON = data->videodata->atoms._NET_WM_ICON;
int (*prevHandler)(Display *, XErrorEvent *) = NULL; int (*prevHandler)(Display *, XErrorEvent *) = NULL;
bool result = true; bool result = true;
@@ -1226,7 +1226,7 @@ bool X11_SetWindowOpacity(SDL_VideoDevice *_this, SDL_Window *window, float opac
{ {
SDL_WindowData *data = window->internal; SDL_WindowData *data = window->internal;
Display *display = data->videodata->display; Display *display = data->videodata->display;
Atom _NET_WM_WINDOW_OPACITY = data->videodata->_NET_WM_WINDOW_OPACITY; Atom _NET_WM_WINDOW_OPACITY = data->videodata->atoms._NET_WM_WINDOW_OPACITY;
if (opacity == 1.0f) { if (opacity == 1.0f) {
X11_XDeleteProperty(display, data->xwindow, _NET_WM_WINDOW_OPACITY); X11_XDeleteProperty(display, data->xwindow, _NET_WM_WINDOW_OPACITY);
@@ -1250,7 +1250,7 @@ bool X11_SetWindowParent(SDL_VideoDevice *_this, SDL_Window *window, SDL_Window
if (parent_data) { if (parent_data) {
X11_XSetTransientForHint(display, data->xwindow, parent_data->xwindow); X11_XSetTransientForHint(display, data->xwindow, parent_data->xwindow);
} else { } else {
X11_XDeleteProperty(display, data->xwindow, video_data->WM_TRANSIENT_FOR); X11_XDeleteProperty(display, data->xwindow, video_data->atoms.WM_TRANSIENT_FOR);
} }
return true; return true;
@@ -1263,14 +1263,14 @@ bool X11_SetWindowModal(SDL_VideoDevice *_this, SDL_Window *window, bool modal)
SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window); SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
Display *display = video_data->display; Display *display = video_data->display;
Uint32 flags = window->flags; Uint32 flags = window->flags;
Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE; Atom _NET_WM_STATE = data->videodata->atoms._NET_WM_STATE;
Atom _NET_WM_STATE_MODAL = data->videodata->_NET_WM_STATE_MODAL; Atom _NET_WM_STATE_MODAL = data->videodata->atoms._NET_WM_STATE_MODAL;
if (modal) { if (modal) {
flags |= SDL_WINDOW_MODAL; flags |= SDL_WINDOW_MODAL;
} else { } else {
flags &= ~SDL_WINDOW_MODAL; flags &= ~SDL_WINDOW_MODAL;
X11_XDeleteProperty(display, data->xwindow, video_data->WM_TRANSIENT_FOR); X11_XDeleteProperty(display, data->xwindow, video_data->atoms.WM_TRANSIENT_FOR);
} }
if (X11_IsWindowMapped(_this, window)) { if (X11_IsWindowMapped(_this, window)) {
@@ -1363,8 +1363,8 @@ void X11_SetWindowAlwaysOnTop(SDL_VideoDevice *_this, SDL_Window *window, bool o
SDL_WindowData *data = window->internal; SDL_WindowData *data = window->internal;
SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window); SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
Display *display = data->videodata->display; Display *display = data->videodata->display;
Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE; Atom _NET_WM_STATE = data->videodata->atoms._NET_WM_STATE;
Atom _NET_WM_STATE_ABOVE = data->videodata->_NET_WM_STATE_ABOVE; Atom _NET_WM_STATE_ABOVE = data->videodata->atoms._NET_WM_STATE_ABOVE;
if (X11_IsWindowMapped(_this, window)) { if (X11_IsWindowMapped(_this, window)) {
XEvent e; XEvent e;
@@ -1504,7 +1504,7 @@ static bool X11_SetWindowActive(SDL_VideoDevice *_this, SDL_Window *window)
SDL_WindowData *data = window->internal; SDL_WindowData *data = window->internal;
SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window); SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
Display *display = data->videodata->display; Display *display = data->videodata->display;
Atom _NET_ACTIVE_WINDOW = data->videodata->_NET_ACTIVE_WINDOW; Atom _NET_ACTIVE_WINDOW = data->videodata->atoms._NET_ACTIVE_WINDOW;
if (X11_IsWindowMapped(_this, window)) { if (X11_IsWindowMapped(_this, window)) {
XEvent e; XEvent e;
@@ -1548,9 +1548,9 @@ static bool X11_SetWindowMaximized(SDL_VideoDevice *_this, SDL_Window *window, b
SDL_WindowData *data = window->internal; SDL_WindowData *data = window->internal;
SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window); SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
Display *display = data->videodata->display; Display *display = data->videodata->display;
Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE; Atom _NET_WM_STATE = data->videodata->atoms._NET_WM_STATE;
Atom _NET_WM_STATE_MAXIMIZED_VERT = data->videodata->_NET_WM_STATE_MAXIMIZED_VERT; Atom _NET_WM_STATE_MAXIMIZED_VERT = data->videodata->atoms._NET_WM_STATE_MAXIMIZED_VERT;
Atom _NET_WM_STATE_MAXIMIZED_HORZ = data->videodata->_NET_WM_STATE_MAXIMIZED_HORZ; Atom _NET_WM_STATE_MAXIMIZED_HORZ = data->videodata->atoms._NET_WM_STATE_MAXIMIZED_HORZ;
if (!maximized && window->flags & SDL_WINDOW_FULLSCREEN) { if (!maximized && window->flags & SDL_WINDOW_FULLSCREEN) {
/* Fullscreen windows are maximized on some window managers, /* Fullscreen windows are maximized on some window managers,
@@ -1654,8 +1654,8 @@ static SDL_FullscreenResult X11_SetWindowFullscreenViaWM(SDL_VideoDevice *_this,
SDL_WindowData *data = window->internal; SDL_WindowData *data = window->internal;
SDL_DisplayData *displaydata = _display->internal; SDL_DisplayData *displaydata = _display->internal;
Display *display = data->videodata->display; Display *display = data->videodata->display;
Atom _NET_WM_STATE = data->videodata->_NET_WM_STATE; Atom _NET_WM_STATE = data->videodata->atoms._NET_WM_STATE;
Atom _NET_WM_STATE_FULLSCREEN = data->videodata->_NET_WM_STATE_FULLSCREEN; Atom _NET_WM_STATE_FULLSCREEN = data->videodata->atoms._NET_WM_STATE_FULLSCREEN;
if (X11_IsWindowMapped(_this, window)) { if (X11_IsWindowMapped(_this, window)) {
XEvent e; XEvent e;
@@ -1737,8 +1737,8 @@ static SDL_FullscreenResult X11_SetWindowFullscreenViaWM(SDL_VideoDevice *_this,
} else { } else {
e.xclient.data.l[0] = _NET_WM_STATE_REMOVE; e.xclient.data.l[0] = _NET_WM_STATE_REMOVE;
} }
e.xclient.data.l[1] = data->videodata->_NET_WM_STATE_MAXIMIZED_VERT; e.xclient.data.l[1] = data->videodata->atoms._NET_WM_STATE_MAXIMIZED_VERT;
e.xclient.data.l[2] = data->videodata->_NET_WM_STATE_MAXIMIZED_HORZ; e.xclient.data.l[2] = data->videodata->atoms._NET_WM_STATE_MAXIMIZED_HORZ;
e.xclient.data.l[3] = 0l; e.xclient.data.l[3] = 0l;
X11_XSendEvent(display, RootWindow(display, displaydata->screen), 0, X11_XSendEvent(display, RootWindow(display, displaydata->screen), 0,
SubstructureNotifyMask | SubstructureRedirectMask, &e); SubstructureNotifyMask | SubstructureRedirectMask, &e);