Update to 2.26.0
This commit is contained in:
parent
737aec8a5b
commit
68b81c3a28
1
.SDL2.metadata
Normal file
1
.SDL2.metadata
Normal file
@ -0,0 +1 @@
|
|||||||
|
788380a96075119a2ab1e5b53f2fee74fa957fa2 SDL2-2.26.0.tar.gz
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -14,3 +14,4 @@
|
|||||||
/SDL2-2.0.16.tar.gz
|
/SDL2-2.0.16.tar.gz
|
||||||
/SDL2-2.0.18.tar.gz
|
/SDL2-2.0.18.tar.gz
|
||||||
/SDL2-2.0.20.tar.gz
|
/SDL2-2.0.20.tar.gz
|
||||||
|
/SDL2-2.26.0.tar.gz
|
||||||
|
@ -1,182 +0,0 @@
|
|||||||
From 9a2bbd8acbebcde56dd2f89ebca3b196c2b38914 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ethan Lee <flibitijibibo@gmail.com>
|
|
||||||
Date: Wed, 12 Jan 2022 13:01:05 -0500
|
|
||||||
Subject: [PATCH 01/11] wayland: Convert URI to local path for DropFile
|
|
||||||
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandevents.c | 149 ++++++++++++++++++++++----
|
|
||||||
1 file changed, 129 insertions(+), 20 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
|
|
||||||
index dfa62ec69..bf2aeea5b 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandevents.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandevents.c
|
|
||||||
@@ -1312,36 +1312,145 @@ data_device_handle_motion(void *data, struct wl_data_device *wl_data_device,
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
+/* Decodes URI escape sequences in string buf of len bytes
|
|
||||||
+ (excluding the terminating NULL byte) in-place. Since
|
|
||||||
+ URI-encoded characters take three times the space of
|
|
||||||
+ normal characters, this should not be an issue.
|
|
||||||
+
|
|
||||||
+ Returns the number of decoded bytes that wound up in
|
|
||||||
+ the buffer, excluding the terminating NULL byte.
|
|
||||||
+
|
|
||||||
+ The buffer is guaranteed to be NULL-terminated but
|
|
||||||
+ may contain embedded NULL bytes.
|
|
||||||
+
|
|
||||||
+ On error, -1 is returned.
|
|
||||||
+
|
|
||||||
+ FIXME: This was shamelessly copied from SDL_x11events.c
|
|
||||||
+ */
|
|
||||||
+static int Wayland_URIDecode(char *buf, int len) {
|
|
||||||
+ int ri, wi, di;
|
|
||||||
+ char decode = '\0';
|
|
||||||
+ if (buf == NULL || len < 0) {
|
|
||||||
+ errno = EINVAL;
|
|
||||||
+ return -1;
|
|
||||||
+ }
|
|
||||||
+ if (len == 0) {
|
|
||||||
+ len = SDL_strlen(buf);
|
|
||||||
+ }
|
|
||||||
+ for (ri = 0, wi = 0, di = 0; ri < len && wi < len; ri += 1) {
|
|
||||||
+ if (di == 0) {
|
|
||||||
+ /* start decoding */
|
|
||||||
+ if (buf[ri] == '%') {
|
|
||||||
+ decode = '\0';
|
|
||||||
+ di += 1;
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ /* normal write */
|
|
||||||
+ buf[wi] = buf[ri];
|
|
||||||
+ wi += 1;
|
|
||||||
+ continue;
|
|
||||||
+ } else if (di == 1 || di == 2) {
|
|
||||||
+ char off = '\0';
|
|
||||||
+ char isa = buf[ri] >= 'a' && buf[ri] <= 'f';
|
|
||||||
+ char isA = buf[ri] >= 'A' && buf[ri] <= 'F';
|
|
||||||
+ char isn = buf[ri] >= '0' && buf[ri] <= '9';
|
|
||||||
+ if (!(isa || isA || isn)) {
|
|
||||||
+ /* not a hexadecimal */
|
|
||||||
+ int sri;
|
|
||||||
+ for (sri = ri - di; sri <= ri; sri += 1) {
|
|
||||||
+ buf[wi] = buf[sri];
|
|
||||||
+ wi += 1;
|
|
||||||
+ }
|
|
||||||
+ di = 0;
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ /* itsy bitsy magicsy */
|
|
||||||
+ if (isn) {
|
|
||||||
+ off = 0 - '0';
|
|
||||||
+ } else if (isa) {
|
|
||||||
+ off = 10 - 'a';
|
|
||||||
+ } else if (isA) {
|
|
||||||
+ off = 10 - 'A';
|
|
||||||
+ }
|
|
||||||
+ decode |= (buf[ri] + off) << (2 - di) * 4;
|
|
||||||
+ if (di == 2) {
|
|
||||||
+ buf[wi] = decode;
|
|
||||||
+ wi += 1;
|
|
||||||
+ di = 0;
|
|
||||||
+ } else {
|
|
||||||
+ di += 1;
|
|
||||||
+ }
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ buf[wi] = '\0';
|
|
||||||
+ return wi;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* Convert URI to local filename
|
|
||||||
+ return filename if possible, else NULL
|
|
||||||
+
|
|
||||||
+ FIXME: This was shamelessly copied from SDL_x11events.c
|
|
||||||
+*/
|
|
||||||
+static char* Wayland_URIToLocal(char* uri) {
|
|
||||||
+ char *file = NULL;
|
|
||||||
+ SDL_bool local;
|
|
||||||
+
|
|
||||||
+ if (SDL_memcmp(uri,"file:/",6) == 0) uri += 6; /* local file? */
|
|
||||||
+ else if (SDL_strstr(uri,":/") != NULL) return file; /* wrong scheme */
|
|
||||||
+
|
|
||||||
+ local = uri[0] != '/' || (uri[0] != '\0' && uri[1] == '/');
|
|
||||||
+
|
|
||||||
+ /* got a hostname? */
|
|
||||||
+ if (!local && uri[0] == '/' && uri[2] != '/') {
|
|
||||||
+ char* hostname_end = SDL_strchr(uri+1, '/');
|
|
||||||
+ if (hostname_end != NULL) {
|
|
||||||
+ char hostname[ 257 ];
|
|
||||||
+ if (gethostname(hostname, 255) == 0) {
|
|
||||||
+ hostname[ 256 ] = '\0';
|
|
||||||
+ if (SDL_memcmp(uri+1, hostname, hostname_end - (uri+1)) == 0) {
|
|
||||||
+ uri = hostname_end + 1;
|
|
||||||
+ local = SDL_TRUE;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (local) {
|
|
||||||
+ file = uri;
|
|
||||||
+ /* Convert URI escape sequences to real characters */
|
|
||||||
+ Wayland_URIDecode(file, 0);
|
|
||||||
+ if (uri[1] == '/') {
|
|
||||||
+ file++;
|
|
||||||
+ } else {
|
|
||||||
+ file--;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return file;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static void
|
|
||||||
data_device_handle_drop(void *data, struct wl_data_device *wl_data_device)
|
|
||||||
{
|
|
||||||
SDL_WaylandDataDevice *data_device = data;
|
|
||||||
- void *buffer = NULL;
|
|
||||||
- size_t length = 0;
|
|
||||||
-
|
|
||||||
- const char *current_uri = NULL;
|
|
||||||
- const char *last_char = NULL;
|
|
||||||
- char *current_char = NULL;
|
|
||||||
|
|
||||||
if (data_device->drag_offer != NULL) {
|
|
||||||
/* TODO: SDL Support more mime types */
|
|
||||||
- buffer = Wayland_data_offer_receive(data_device->drag_offer,
|
|
||||||
- &length, FILE_MIME, SDL_FALSE);
|
|
||||||
-
|
|
||||||
- /* uri-list */
|
|
||||||
- current_uri = (const char *)buffer;
|
|
||||||
- last_char = (const char *)buffer + length;
|
|
||||||
- for (current_char = buffer; current_char < last_char; ++current_char) {
|
|
||||||
- if (*current_char == '\n' || *current_char == 0) {
|
|
||||||
- if (*current_uri != 0 && *current_uri != '#') {
|
|
||||||
- *current_char = 0;
|
|
||||||
- SDL_SendDropFile(NULL, current_uri);
|
|
||||||
+ size_t length;
|
|
||||||
+ void *buffer = Wayland_data_offer_receive(data_device->drag_offer,
|
|
||||||
+ &length, FILE_MIME, SDL_FALSE);
|
|
||||||
+ if (buffer) {
|
|
||||||
+ char *saveptr = NULL;
|
|
||||||
+ char *token = SDL_strtokr((char *) buffer, "\r\n", &saveptr);
|
|
||||||
+ while (token != NULL) {
|
|
||||||
+ char *fn = Wayland_URIToLocal(token);
|
|
||||||
+ if (fn) {
|
|
||||||
+ SDL_SendDropFile(NULL, fn); /* FIXME: Window? */
|
|
||||||
}
|
|
||||||
- current_uri = (const char *)current_char + 1;
|
|
||||||
+ token = SDL_strtokr(NULL, "\r\n", &saveptr);
|
|
||||||
}
|
|
||||||
+ SDL_SendDropComplete(NULL); /* FIXME: Window? */
|
|
||||||
+ SDL_free(buffer);
|
|
||||||
}
|
|
||||||
-
|
|
||||||
- SDL_free(buffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,133 +0,0 @@
|
|||||||
From d3952a8a2c8a32d4f6f521402427052a4b756f9f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Cameron Gutman <aicommander@gmail.com>
|
|
||||||
Date: Sun, 16 Jan 2022 15:14:33 -0600
|
|
||||||
Subject: [PATCH 02/11] wayland: Avoid spurious resize events
|
|
||||||
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandwindow.c | 42 +++++++++++++++++----------
|
|
||||||
src/video/wayland/SDL_waylandwindow.h | 1 +
|
|
||||||
2 files changed, 28 insertions(+), 15 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
index 3eae22bf7..a4b5933eb 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
@@ -224,14 +224,16 @@ handle_configure_xdg_toplevel(void *data,
|
|
||||||
* us a completely stateless, sizeless configure, with which we have
|
|
||||||
* to enforce our own state anyway.
|
|
||||||
*/
|
|
||||||
- if (width != 0 && height != 0) {
|
|
||||||
+ if (width != 0 && height != 0 && (window->w != width || window->h != height)) {
|
|
||||||
window->w = width;
|
|
||||||
window->h = height;
|
|
||||||
+ wind->needs_resize_event = SDL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This part is good though. */
|
|
||||||
- if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) {
|
|
||||||
+ if ((window->flags & SDL_WINDOW_ALLOW_HIGHDPI) && wind->scale_factor != driverdata->scale_factor) {
|
|
||||||
wind->scale_factor = driverdata->scale_factor;
|
|
||||||
+ wind->needs_resize_event = SDL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
@@ -284,8 +286,11 @@ handle_configure_xdg_toplevel(void *data,
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Store this now so the xdg_surface configure knows what to resize to */
|
|
||||||
- window->w = width;
|
|
||||||
- window->h = height;
|
|
||||||
+ if (window->w != width || window->h != height) {
|
|
||||||
+ window->w = width;
|
|
||||||
+ window->h = height;
|
|
||||||
+ wind->needs_resize_event = SDL_TRUE;
|
|
||||||
+ }
|
|
||||||
} else {
|
|
||||||
/* For fullscreen, foolishly do what the compositor says. If it's wrong,
|
|
||||||
* don't blame us, we were explicitly instructed to do this.
|
|
||||||
@@ -293,14 +298,16 @@ handle_configure_xdg_toplevel(void *data,
|
|
||||||
* UPDATE: Nope, sure enough a compositor sends 0,0. This is a known bug:
|
|
||||||
* https://bugs.kde.org/show_bug.cgi?id=444962
|
|
||||||
*/
|
|
||||||
- if (width != 0 && height != 0) {
|
|
||||||
+ if (width != 0 && height != 0 && (window->w != width || window->h != height)) {
|
|
||||||
window->w = width;
|
|
||||||
window->h = height;
|
|
||||||
+ wind->needs_resize_event = SDL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This part is good though. */
|
|
||||||
- if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) {
|
|
||||||
+ if ((window->flags & SDL_WINDOW_ALLOW_HIGHDPI) && wind->scale_factor != driverdata->scale_factor) {
|
|
||||||
wind->scale_factor = driverdata->scale_factor;
|
|
||||||
+ wind->needs_resize_event = SDL_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -330,6 +337,7 @@ decoration_frame_configure(struct libdecor_frame *frame,
|
|
||||||
|
|
||||||
enum libdecor_window_state window_state;
|
|
||||||
int width, height;
|
|
||||||
+ float scale_factor = wind->scale_factor;
|
|
||||||
|
|
||||||
SDL_bool focused = SDL_FALSE;
|
|
||||||
SDL_bool fullscreen = SDL_FALSE;
|
|
||||||
@@ -399,7 +407,7 @@ decoration_frame_configure(struct libdecor_frame *frame,
|
|
||||||
|
|
||||||
/* This part is good though. */
|
|
||||||
if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) {
|
|
||||||
- wind->scale_factor = driverdata->scale_factor;
|
|
||||||
+ scale_factor = driverdata->scale_factor;
|
|
||||||
}
|
|
||||||
} else if (!(window->flags & SDL_WINDOW_RESIZABLE)) {
|
|
||||||
width = window->windowed.w;
|
|
||||||
@@ -427,7 +435,7 @@ decoration_frame_configure(struct libdecor_frame *frame,
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Do the resize on the SDL side (this will set window->w/h)... */
|
|
||||||
- Wayland_HandleResize(window, width, height, wind->scale_factor);
|
|
||||||
+ Wayland_HandleResize(window, width, height, scale_factor);
|
|
||||||
wind->shell_surface.libdecor.initial_configure_seen = SDL_TRUE;
|
|
||||||
|
|
||||||
/* ... then commit the changes on the libdecor side. */
|
|
||||||
@@ -1341,14 +1349,18 @@ Wayland_HandleResize(SDL_Window *window, int width, int height, float scale)
|
|
||||||
{
|
|
||||||
SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
|
|
||||||
SDL_VideoData *viddata = data->waylandData;
|
|
||||||
-
|
|
||||||
struct wl_region *region;
|
|
||||||
- window->w = 0;
|
|
||||||
- window->h = 0;
|
|
||||||
- SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, width, height);
|
|
||||||
- window->w = width;
|
|
||||||
- window->h = height;
|
|
||||||
- data->scale_factor = scale;
|
|
||||||
+
|
|
||||||
+ if (data->needs_resize_event || window->w != width || window->h != height || data->scale_factor != scale) {
|
|
||||||
+ /* We may have already updated window w/h (or only adjusted scale factor),
|
|
||||||
+ * so we must override the deduplication logic in the video core */
|
|
||||||
+ window->w = 0;
|
|
||||||
+ window->h = 0;
|
|
||||||
+ SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, width, height);
|
|
||||||
+ window->w = width;
|
|
||||||
+ window->h = height;
|
|
||||||
+ data->needs_resize_event = SDL_FALSE;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
wl_surface_set_buffer_scale(data->surface, data->scale_factor);
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.h b/src/video/wayland/SDL_waylandwindow.h
|
|
||||||
index 8ca090f0c..bce1d1855 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.h
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.h
|
|
||||||
@@ -84,6 +84,7 @@ typedef struct {
|
|
||||||
int num_outputs;
|
|
||||||
|
|
||||||
float scale_factor;
|
|
||||||
+ SDL_bool needs_resize_event;
|
|
||||||
} SDL_WindowData;
|
|
||||||
|
|
||||||
extern void Wayland_ShowWindow(_THIS, SDL_Window *window);
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,96 +0,0 @@
|
|||||||
From ed3442d7a5a79b3a7357c5bdf54b47ab985ca7f7 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ethan Lee <flibitijibibo@gmail.com>
|
|
||||||
Date: Wed, 19 Jan 2022 15:47:52 -0500
|
|
||||||
Subject: [PATCH 03/11] wayland: Fix building with SDL_OPENGL=OFF
|
|
||||||
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandvideo.c | 2 ++
|
|
||||||
src/video/wayland/SDL_waylandwindow.c | 8 ++++++--
|
|
||||||
src/video/wayland/SDL_waylandwindow.h | 2 ++
|
|
||||||
3 files changed, 10 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
|
|
||||||
index f009fb7c6..60d7403c7 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandvideo.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandvideo.c
|
|
||||||
@@ -230,6 +230,7 @@ Wayland_CreateDevice(int devindex)
|
|
||||||
device->WaitEventTimeout = Wayland_WaitEventTimeout;
|
|
||||||
device->SendWakeupEvent = Wayland_SendWakeupEvent;
|
|
||||||
|
|
||||||
+#if SDL_VIDEO_OPENGL_EGL
|
|
||||||
device->GL_SwapWindow = Wayland_GLES_SwapWindow;
|
|
||||||
device->GL_GetSwapInterval = Wayland_GLES_GetSwapInterval;
|
|
||||||
device->GL_SetSwapInterval = Wayland_GLES_SetSwapInterval;
|
|
||||||
@@ -240,6 +241,7 @@ Wayland_CreateDevice(int devindex)
|
|
||||||
device->GL_UnloadLibrary = Wayland_GLES_UnloadLibrary;
|
|
||||||
device->GL_GetProcAddress = Wayland_GLES_GetProcAddress;
|
|
||||||
device->GL_DeleteContext = Wayland_GLES_DeleteContext;
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
device->CreateSDLWindow = Wayland_CreateWindow;
|
|
||||||
device->ShowWindow = Wayland_ShowWindow;
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
index a4b5933eb..80bb66878 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
@@ -21,7 +21,7 @@
|
|
||||||
|
|
||||||
#include "../../SDL_internal.h"
|
|
||||||
|
|
||||||
-#if SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL
|
|
||||||
+#if SDL_VIDEO_DRIVER_WAYLAND
|
|
||||||
|
|
||||||
#include "../SDL_sysvideo.h"
|
|
||||||
#include "../../events/SDL_windowevents_c.h"
|
|
||||||
@@ -1309,12 +1309,14 @@ int Wayland_CreateWindow(_THIS, SDL_Window *window)
|
|
||||||
data->egl_window = WAYLAND_wl_egl_window_create(data->surface,
|
|
||||||
window->w * data->scale_factor, window->h * data->scale_factor);
|
|
||||||
|
|
||||||
+#if SDL_VIDEO_OPENGL_EGL
|
|
||||||
/* Create the GLES window surface */
|
|
||||||
data->egl_surface = SDL_EGL_CreateSurface(_this, (NativeWindowType) data->egl_window);
|
|
||||||
|
|
||||||
if (data->egl_surface == EGL_NO_SURFACE) {
|
|
||||||
return SDL_SetError("failed to create an EGL window surface");
|
|
||||||
}
|
|
||||||
+#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
|
|
||||||
@@ -1517,9 +1519,11 @@ void Wayland_DestroyWindow(_THIS, SDL_Window *window)
|
|
||||||
SDL_WindowData *wind = window->driverdata;
|
|
||||||
|
|
||||||
if (data) {
|
|
||||||
+#if SDL_VIDEO_OPENGL_EGL
|
|
||||||
if (wind->egl_surface) {
|
|
||||||
SDL_EGL_DestroySurface(_this, wind->egl_surface);
|
|
||||||
}
|
|
||||||
+#endif
|
|
||||||
if (wind->egl_window) {
|
|
||||||
WAYLAND_wl_egl_window_destroy(wind->egl_window);
|
|
||||||
}
|
|
||||||
@@ -1555,6 +1559,6 @@ void Wayland_DestroyWindow(_THIS, SDL_Window *window)
|
|
||||||
window->driverdata = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#endif /* SDL_VIDEO_DRIVER_WAYLAND && SDL_VIDEO_OPENGL_EGL */
|
|
||||||
+#endif /* SDL_VIDEO_DRIVER_WAYLAND */
|
|
||||||
|
|
||||||
/* vi: set ts=4 sw=4 expandtab: */
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.h b/src/video/wayland/SDL_waylandwindow.h
|
|
||||||
index bce1d1855..e8d7d6299 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.h
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.h
|
|
||||||
@@ -63,7 +63,9 @@ typedef struct {
|
|
||||||
} shell_surface;
|
|
||||||
struct wl_egl_window *egl_window;
|
|
||||||
struct SDL_WaylandInput *keyboard_device;
|
|
||||||
+#if SDL_VIDEO_OPENGL_EGL
|
|
||||||
EGLSurface egl_surface;
|
|
||||||
+#endif
|
|
||||||
struct zwp_locked_pointer_v1 *locked_pointer;
|
|
||||||
struct zwp_confined_pointer_v1 *confined_pointer;
|
|
||||||
struct zxdg_toplevel_decoration_v1 *server_decoration;
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
|||||||
From e1b4761c621e9883c3f02971ea74cef14b1d6b87 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ethan Lee <flibitijibibo@gmail.com>
|
|
||||||
Date: Thu, 20 Jan 2022 14:10:56 -0500
|
|
||||||
Subject: [PATCH 04/11] wayland: Avoid calling SetFullscreen in libdecor
|
|
||||||
ShowWindow.
|
|
||||||
|
|
||||||
This caused some weird stuff to happen in the libdecor path, probably because
|
|
||||||
the window hasn't actually been mapped yet. It ends up calling stuff that
|
|
||||||
should not yet apply, and so fullscreen in particular would have a really
|
|
||||||
messed up titlebar.
|
|
||||||
|
|
||||||
The good news is, libdecor is good about tracking fullscreen state, so we can
|
|
||||||
let the callback do this for us. Keep this for xdg_shell because we actually
|
|
||||||
map the window ourselves, so we know this call is valid for that path.
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandwindow.c | 8 ++++++--
|
|
||||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
index 80bb66878..3b21af7be 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
@@ -724,7 +724,6 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
|
|
||||||
{
|
|
||||||
SDL_VideoData *c = _this->driverdata;
|
|
||||||
SDL_WindowData *data = window->driverdata;
|
|
||||||
- SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
|
|
||||||
|
|
||||||
/* Detach any previous buffers before resetting everything, otherwise when
|
|
||||||
* calling this a second time you'll get an annoying protocol error
|
|
||||||
@@ -766,7 +765,6 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
|
|
||||||
if (window->flags & SDL_WINDOW_MINIMIZED) {
|
|
||||||
Wayland_MinimizeWindow(_this, window);
|
|
||||||
}
|
|
||||||
- Wayland_SetWindowFullscreen(_this, window, display, (window->flags & SDL_WINDOW_FULLSCREEN) != 0);
|
|
||||||
|
|
||||||
/* We have to wait until the surface gets a "configure" event, or use of
|
|
||||||
* this surface will fail. This is a new rule for xdg_shell.
|
|
||||||
@@ -782,6 +780,12 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if (c->shell.xdg) {
|
|
||||||
+ /* Unlike libdecor we need to call this explicitly to prevent a deadlock.
|
|
||||||
+ * libdecor will call this as part of their configure event!
|
|
||||||
+ * -flibit
|
|
||||||
+ */
|
|
||||||
+ Wayland_SetWindowFullscreen(_this, window, SDL_GetDisplayForWindow(window),
|
|
||||||
+ (window->flags & SDL_WINDOW_FULLSCREEN) != 0);
|
|
||||||
if (data->shell_surface.xdg.surface) {
|
|
||||||
while (!data->shell_surface.xdg.initial_configure_seen) {
|
|
||||||
WAYLAND_wl_display_flush(c->display);
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
|||||||
From e2d74bcbe524960c17c852466130a6e0a30674a3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ethan Lee <flibitijibibo@gmail.com>
|
|
||||||
Date: Tue, 25 Jan 2022 11:16:09 -0500
|
|
||||||
Subject: [PATCH 05/11] wayland: Detach hidden surfaces in HideWindow, not
|
|
||||||
ShowWindow
|
|
||||||
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandwindow.c | 10 ++++------
|
|
||||||
1 file changed, 4 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
index 3b21af7be..2bf500a91 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
@@ -725,12 +725,6 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
|
|
||||||
SDL_VideoData *c = _this->driverdata;
|
|
||||||
SDL_WindowData *data = window->driverdata;
|
|
||||||
|
|
||||||
- /* Detach any previous buffers before resetting everything, otherwise when
|
|
||||||
- * calling this a second time you'll get an annoying protocol error
|
|
||||||
- */
|
|
||||||
- wl_surface_attach(data->surface, NULL, 0, 0);
|
|
||||||
- wl_surface_commit(data->surface);
|
|
||||||
-
|
|
||||||
/* Create the shell surface and map the toplevel */
|
|
||||||
#ifdef HAVE_LIBDECOR_H
|
|
||||||
if (c->shell.libdecor) {
|
|
||||||
@@ -862,6 +856,10 @@ void Wayland_HideWindow(_THIS, SDL_Window *window)
|
|
||||||
wind->shell_surface.xdg.surface = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ /* Be sure to detach after this is done, otherwise ShowWindow crashes! */
|
|
||||||
+ wl_surface_attach(wind->surface, NULL, 0, 0);
|
|
||||||
+ wl_surface_commit(wind->surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
|||||||
From f0e768da43173cf62732fc20d1f80eb777d6d5c8 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ethan Lee <flibitijibibo@gmail.com>
|
|
||||||
Date: Tue, 25 Jan 2022 13:07:00 -0500
|
|
||||||
Subject: [PATCH 06/11] wayland: Call SetFullscreen directly in ShowWindow.
|
|
||||||
|
|
||||||
This cuts out an extra flush when getting the first configure event.
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandwindow.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
index 2bf500a91..d4b89de7a 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
@@ -778,8 +778,8 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
|
|
||||||
* libdecor will call this as part of their configure event!
|
|
||||||
* -flibit
|
|
||||||
*/
|
|
||||||
- Wayland_SetWindowFullscreen(_this, window, SDL_GetDisplayForWindow(window),
|
|
||||||
- (window->flags & SDL_WINDOW_FULLSCREEN) != 0);
|
|
||||||
+ SDL_WaylandOutputData *odata = SDL_GetDisplayForWindow(window)->driverdata;
|
|
||||||
+ SetFullscreen(window, (window->flags & SDL_WINDOW_FULLSCREEN) ? odata->output : NULL);
|
|
||||||
if (data->shell_surface.xdg.surface) {
|
|
||||||
while (!data->shell_surface.xdg.initial_configure_seen) {
|
|
||||||
WAYLAND_wl_display_flush(c->display);
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,142 +0,0 @@
|
|||||||
From 68a71f91c6cbb1458dc95e2d994d4522afd92c5e Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ethan Lee <flibitijibibo@gmail.com>
|
|
||||||
Date: Tue, 25 Jan 2022 11:18:04 -0500
|
|
||||||
Subject: [PATCH 07/11] wayland: Try to avoid committing before the window is
|
|
||||||
shown
|
|
||||||
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandwindow.c | 32 +++++++++++++++++----------
|
|
||||||
1 file changed, 20 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
index d4b89de7a..4c3c60aac 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
@@ -42,7 +42,7 @@
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
|
||||||
-CommitMinMaxDimensions(SDL_Window *window)
|
|
||||||
+SetMinMaxDimensions(SDL_Window *window, SDL_bool commit)
|
|
||||||
{
|
|
||||||
SDL_WindowData *wind = window->driverdata;
|
|
||||||
SDL_VideoData *viddata = wind->waylandData;
|
|
||||||
@@ -88,12 +88,14 @@ CommitMinMaxDimensions(SDL_Window *window)
|
|
||||||
xdg_toplevel_set_max_size(wind->shell_surface.xdg.roleobj.toplevel,
|
|
||||||
max_width,
|
|
||||||
max_height);
|
|
||||||
- wl_surface_commit(wind->surface);
|
|
||||||
+ if (commit) {
|
|
||||||
+ wl_surface_commit(wind->surface);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
-SetFullscreen(SDL_Window *window, struct wl_output *output)
|
|
||||||
+SetFullscreen(SDL_Window *window, struct wl_output *output, SDL_bool commit)
|
|
||||||
{
|
|
||||||
SDL_WindowData *wind = window->driverdata;
|
|
||||||
SDL_VideoData *viddata = wind->waylandData;
|
|
||||||
@@ -101,7 +103,7 @@ SetFullscreen(SDL_Window *window, struct wl_output *output)
|
|
||||||
/* The desktop may try to enforce min/max sizes here, so turn them off for
|
|
||||||
* fullscreen and on (if applicable) for windowed
|
|
||||||
*/
|
|
||||||
- CommitMinMaxDimensions(window);
|
|
||||||
+ SetMinMaxDimensions(window, SDL_FALSE);
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBDECOR_H
|
|
||||||
if (viddata->shell.libdecor) {
|
|
||||||
@@ -134,6 +136,9 @@ SetFullscreen(SDL_Window *window, struct wl_output *output)
|
|
||||||
} else {
|
|
||||||
xdg_toplevel_unset_fullscreen(wind->shell_surface.xdg.roleobj.toplevel);
|
|
||||||
}
|
|
||||||
+ if (commit) {
|
|
||||||
+ wl_surface_commit(wind->surface);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -215,7 +220,7 @@ handle_configure_xdg_toplevel(void *data,
|
|
||||||
if (!fullscreen) {
|
|
||||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
|
||||||
/* We might need to re-enter fullscreen after being restored from minimized */
|
|
||||||
- SetFullscreen(window, driverdata->output);
|
|
||||||
+ SetFullscreen(window, driverdata->output, SDL_FALSE);
|
|
||||||
|
|
||||||
/* Foolishly do what the compositor says here. If it's wrong, don't
|
|
||||||
* blame us, we were explicitly instructed to do this.
|
|
||||||
@@ -364,7 +369,7 @@ decoration_frame_configure(struct libdecor_frame *frame,
|
|
||||||
if (!fullscreen) {
|
|
||||||
if (window->flags & SDL_WINDOW_FULLSCREEN) {
|
|
||||||
/* We might need to re-enter fullscreen after being restored from minimized */
|
|
||||||
- SetFullscreen(window, driverdata->output);
|
|
||||||
+ SetFullscreen(window, driverdata->output, SDL_FALSE);
|
|
||||||
fullscreen = SDL_TRUE;
|
|
||||||
floating = SDL_FALSE;
|
|
||||||
}
|
|
||||||
@@ -779,7 +784,7 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
|
|
||||||
* -flibit
|
|
||||||
*/
|
|
||||||
SDL_WaylandOutputData *odata = SDL_GetDisplayForWindow(window)->driverdata;
|
|
||||||
- SetFullscreen(window, (window->flags & SDL_WINDOW_FULLSCREEN) ? odata->output : NULL);
|
|
||||||
+ SetFullscreen(window, (window->flags & SDL_WINDOW_FULLSCREEN) ? odata->output : NULL, SDL_TRUE);
|
|
||||||
if (data->shell_surface.xdg.surface) {
|
|
||||||
while (!data->shell_surface.xdg.initial_configure_seen) {
|
|
||||||
WAYLAND_wl_display_flush(c->display);
|
|
||||||
@@ -791,6 +796,9 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
|
|
||||||
if (data->shell_surface.xdg.roleobj.toplevel && c->decoration_manager) {
|
|
||||||
data->server_decoration = zxdg_decoration_manager_v1_get_toplevel_decoration(c->decoration_manager, data->shell_surface.xdg.roleobj.toplevel);
|
|
||||||
}
|
|
||||||
+ } else {
|
|
||||||
+ /* Nothing to see here, just commit. */
|
|
||||||
+ wl_surface_commit(data->surface);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unlike the rest of window state we have to set this _after_ flushing the
|
|
||||||
@@ -1053,7 +1061,7 @@ Wayland_SetWindowFullscreen(_THIS, SDL_Window * window,
|
|
||||||
{
|
|
||||||
struct wl_output *output = ((SDL_WaylandOutputData*) _display->driverdata)->output;
|
|
||||||
SDL_VideoData *viddata = (SDL_VideoData *) _this->driverdata;
|
|
||||||
- SetFullscreen(window, fullscreen ? output : NULL);
|
|
||||||
+ SetFullscreen(window, fullscreen ? output : NULL, SDL_TRUE);
|
|
||||||
|
|
||||||
WAYLAND_wl_display_flush(viddata->display);
|
|
||||||
}
|
|
||||||
@@ -1125,7 +1133,7 @@ Wayland_SetWindowResizable(_THIS, SDL_Window * window, SDL_bool resizable)
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
- CommitMinMaxDimensions(window);
|
|
||||||
+ SetMinMaxDimensions(window, SDL_TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1338,7 +1346,7 @@ int Wayland_CreateWindow(_THIS, SDL_Window *window)
|
|
||||||
Wayland_input_lock_pointer(c->input);
|
|
||||||
}
|
|
||||||
|
|
||||||
- wl_surface_commit(data->surface);
|
|
||||||
+ /* Moved this call to ShowWindow: wl_surface_commit(data->surface); */
|
|
||||||
WAYLAND_wl_display_flush(c->display);
|
|
||||||
|
|
||||||
/* We may need to create an idle inhibitor for this new window */
|
|
||||||
@@ -1393,13 +1401,13 @@ Wayland_HandleResize(SDL_Window *window, int width, int height, float scale)
|
|
||||||
void
|
|
||||||
Wayland_SetWindowMinimumSize(_THIS, SDL_Window * window)
|
|
||||||
{
|
|
||||||
- CommitMinMaxDimensions(window);
|
|
||||||
+ SetMinMaxDimensions(window, SDL_TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Wayland_SetWindowMaximumSize(_THIS, SDL_Window * window)
|
|
||||||
{
|
|
||||||
- CommitMinMaxDimensions(window);
|
|
||||||
+ SetMinMaxDimensions(window, SDL_TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Wayland_SetWindowSize(_THIS, SDL_Window * window)
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
|||||||
From 77a9ca6ba0ae1973d7bc255a4d785e7f1ba3d111 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Cameron Gutman <aicommander@gmail.com>
|
|
||||||
Date: Wed, 26 Jan 2022 18:26:07 -0600
|
|
||||||
Subject: [PATCH 08/11] wayland: Fix SDL_SetWindowSize() being dropped right
|
|
||||||
after exiting fullscreen
|
|
||||||
|
|
||||||
If we get a SDL_SetWindowSize() call right after SDL_SetWindowFullscreen() but
|
|
||||||
before we've gotten a new configure event from the compositor, the attempt to
|
|
||||||
set our window size will silently fail (when libdecor is enabled).
|
|
||||||
|
|
||||||
Fix this by remembering that we need to commit a new size, so we can do that
|
|
||||||
in decoration_frame_configure().
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandwindow.c | 5 ++++-
|
|
||||||
src/video/wayland/SDL_waylandwindow.h | 1 +
|
|
||||||
2 files changed, 5 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
index 4c3c60aac..635546af4 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.c
|
|
||||||
@@ -414,9 +414,10 @@ decoration_frame_configure(struct libdecor_frame *frame,
|
|
||||||
if (window->flags & SDL_WINDOW_ALLOW_HIGHDPI) {
|
|
||||||
scale_factor = driverdata->scale_factor;
|
|
||||||
}
|
|
||||||
- } else if (!(window->flags & SDL_WINDOW_RESIZABLE)) {
|
|
||||||
+ } else if (!(window->flags & SDL_WINDOW_RESIZABLE) || (floating && wind->floating_resize_pending)) {
|
|
||||||
width = window->windowed.w;
|
|
||||||
height = window->windowed.h;
|
|
||||||
+ wind->floating_resize_pending = SDL_FALSE;
|
|
||||||
} else {
|
|
||||||
/* This will never set 0 for width/height unless the function returns false */
|
|
||||||
if (!libdecor_configuration_get_content_size(configuration, frame, &width, &height)) {
|
|
||||||
@@ -1424,6 +1425,8 @@ void Wayland_SetWindowSize(_THIS, SDL_Window * window)
|
|
||||||
if (data->shell.libdecor &&
|
|
||||||
wind->shell_surface.libdecor.frame &&
|
|
||||||
!libdecor_frame_is_floating(wind->shell_surface.libdecor.frame)) {
|
|
||||||
+ /* Commit the resize when we re-enter floating state */
|
|
||||||
+ wind->floating_resize_pending = SDL_TRUE;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandwindow.h b/src/video/wayland/SDL_waylandwindow.h
|
|
||||||
index e8d7d6299..90e4d8cf6 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandwindow.h
|
|
||||||
+++ b/src/video/wayland/SDL_waylandwindow.h
|
|
||||||
@@ -87,6 +87,7 @@ typedef struct {
|
|
||||||
|
|
||||||
float scale_factor;
|
|
||||||
SDL_bool needs_resize_event;
|
|
||||||
+ SDL_bool floating_resize_pending;
|
|
||||||
} SDL_WindowData;
|
|
||||||
|
|
||||||
extern void Wayland_ShowWindow(_THIS, SDL_Window *window);
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
|||||||
From cc40f732f9482eb45a1938a23d4f34265e78a729 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Cameron Gutman <aicommander@gmail.com>
|
|
||||||
Date: Wed, 26 Jan 2022 21:09:39 -0600
|
|
||||||
Subject: [PATCH 09/11] wayland: Round the refresh rate rather than truncating
|
|
||||||
it
|
|
||||||
|
|
||||||
A 59999 mHz monitor should be reported as 60 Hz, not 59 Hz.
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandvideo.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
|
|
||||||
index 60d7403c7..61940cca4 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandvideo.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandvideo.c
|
|
||||||
@@ -393,7 +393,7 @@ display_handle_mode(void *data,
|
|
||||||
mode.w = width;
|
|
||||||
mode.h = height;
|
|
||||||
}
|
|
||||||
- mode.refresh_rate = refresh / 1000; /* mHz to Hz */
|
|
||||||
+ mode.refresh_rate = (int)SDL_round(refresh / 1000.0); /* mHz to Hz */
|
|
||||||
mode.driverdata = driverdata->output;
|
|
||||||
if (driverdata->index > -1) {
|
|
||||||
SDL_AddDisplayMode(SDL_GetDisplay(driverdata->index), &mode);
|
|
||||||
@@ -446,7 +446,7 @@ display_handle_done(void *data,
|
|
||||||
((float) driverdata->physical_width) / 25.4f,
|
|
||||||
((float) driverdata->physical_height) / 25.4f);
|
|
||||||
}
|
|
||||||
- mode.refresh_rate = driverdata->refresh / 1000; /* mHz to Hz */
|
|
||||||
+ mode.refresh_rate = (int)SDL_round(driverdata->refresh / 1000.0); /* mHz to Hz */
|
|
||||||
mode.driverdata = driverdata->output;
|
|
||||||
|
|
||||||
if (driverdata->index > -1) {
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
|||||||
From a90a2e7582a73f7b69b14437287aa15945bf5989 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Weng Xuetian <wengxt@gmail.com>
|
|
||||||
Date: Sun, 30 Jan 2022 16:44:44 -0800
|
|
||||||
Subject: [PATCH 10/11] Fix text_input_v3 preedit string
|
|
||||||
|
|
||||||
For every batch of text_input_v3 updates, if there is no preedit in this
|
|
||||||
batch, preedit should be cleared.
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandevents.c | 8 +++++++-
|
|
||||||
src/video/wayland/SDL_waylandkeyboard.h | 1 +
|
|
||||||
2 files changed, 8 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
|
|
||||||
index bf2aeea5b..85d4edfc8 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandevents.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandevents.c
|
|
||||||
@@ -1505,7 +1505,9 @@ text_input_preedit_string(void *data,
|
|
||||||
int32_t cursor_begin,
|
|
||||||
int32_t cursor_end)
|
|
||||||
{
|
|
||||||
+ SDL_WaylandTextInput *text_input = data;
|
|
||||||
char buf[SDL_TEXTEDITINGEVENT_TEXT_SIZE];
|
|
||||||
+ text_input->has_preedit = SDL_TRUE;
|
|
||||||
if (text) {
|
|
||||||
size_t text_bytes = SDL_strlen(text), i = 0;
|
|
||||||
size_t cursor = 0;
|
|
||||||
@@ -1557,7 +1559,11 @@ text_input_done(void *data,
|
|
||||||
struct zwp_text_input_v3 *zwp_text_input_v3,
|
|
||||||
uint32_t serial)
|
|
||||||
{
|
|
||||||
- /* No-op */
|
|
||||||
+ SDL_WaylandTextInput *text_input = data;
|
|
||||||
+ if (!text_input->has_preedit) {
|
|
||||||
+ SDL_SendEditingText("", 0, 0);
|
|
||||||
+ }
|
|
||||||
+ text_input->has_preedit = SDL_FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const struct zwp_text_input_v3_listener text_input_listener = {
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandkeyboard.h b/src/video/wayland/SDL_waylandkeyboard.h
|
|
||||||
index dd8c146e6..604e0f37f 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandkeyboard.h
|
|
||||||
+++ b/src/video/wayland/SDL_waylandkeyboard.h
|
|
||||||
@@ -27,6 +27,7 @@ typedef struct SDL_WaylandTextInput
|
|
||||||
{
|
|
||||||
struct zwp_text_input_v3 *text_input;
|
|
||||||
SDL_Rect cursor_rect;
|
|
||||||
+ SDL_bool has_preedit;
|
|
||||||
} SDL_WaylandTextInput;
|
|
||||||
|
|
||||||
extern int Wayland_InitKeyboard(_THIS);
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,42 +0,0 @@
|
|||||||
From b11dfd761181ab5005fe3f5527faa4faf6b56112 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Weng Xuetian <wengxt@gmail.com>
|
|
||||||
Date: Tue, 1 Feb 2022 14:43:26 -0800
|
|
||||||
Subject: [PATCH 11/11] Only generate key repetition for keys that should
|
|
||||||
repeat on wayland.
|
|
||||||
|
|
||||||
This fix repetition on modifier keys, e.g. Control.
|
|
||||||
---
|
|
||||||
src/video/wayland/SDL_waylandevents.c | 4 +++-
|
|
||||||
src/video/wayland/SDL_waylandsym.h | 1 +
|
|
||||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
|
|
||||||
index 85d4edfc8..55893201b 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandevents.c
|
|
||||||
+++ b/src/video/wayland/SDL_waylandevents.c
|
|
||||||
@@ -987,7 +987,9 @@ keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
|
|
||||||
SDL_SendKeyboardText(text);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- keyboard_repeat_set(&input->keyboard_repeat, time, scancode, has_text, text);
|
|
||||||
+ if (input->xkb.keymap && WAYLAND_xkb_keymap_key_repeats(input->xkb.keymap, key + 8)) {
|
|
||||||
+ keyboard_repeat_set(&input->keyboard_repeat, time, scancode, has_text, text);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/src/video/wayland/SDL_waylandsym.h b/src/video/wayland/SDL_waylandsym.h
|
|
||||||
index 366ce9e94..fa29bedb1 100644
|
|
||||||
--- a/src/video/wayland/SDL_waylandsym.h
|
|
||||||
+++ b/src/video/wayland/SDL_waylandsym.h
|
|
||||||
@@ -122,6 +122,7 @@ SDL_WAYLAND_SYM(int, xkb_state_key_get_syms, (struct xkb_state *, xkb_keycode_t,
|
|
||||||
SDL_WAYLAND_SYM(int, xkb_keysym_to_utf8, (xkb_keysym_t, char *, size_t) )
|
|
||||||
SDL_WAYLAND_SYM(struct xkb_keymap *, xkb_keymap_new_from_string, (struct xkb_context *, const char *, enum xkb_keymap_format, enum xkb_keymap_compile_flags))
|
|
||||||
SDL_WAYLAND_SYM(struct xkb_state *, xkb_state_new, (struct xkb_keymap *) )
|
|
||||||
+SDL_WAYLAND_SYM(int, xkb_keymap_key_repeats, (struct xkb_keymap *keymap, xkb_keycode_t key) );
|
|
||||||
SDL_WAYLAND_SYM(void, xkb_keymap_unref, (struct xkb_keymap *) )
|
|
||||||
SDL_WAYLAND_SYM(void, xkb_state_unref, (struct xkb_state *) )
|
|
||||||
SDL_WAYLAND_SYM(void, xkb_context_unref, (struct xkb_context *) )
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
@ -1,14 +1,23 @@
|
|||||||
From 8ceba27d6291f1195e13608033ec439aec621fc6 Mon Sep 17 00:00:00 2001
|
From 68d8a2c6b4f732920df40bd79dc3c18b71a4a349 Mon Sep 17 00:00:00 2001
|
||||||
From: Ethan Lee <flibitijibibo@gmail.com>
|
From: Neal Gompa <ngompa@fedoraproject.org>
|
||||||
Date: Sat, 17 Apr 2021 12:07:38 -0400
|
Date: Fri, 29 Apr 2022 23:39:39 -0400
|
||||||
Subject: [PATCH] video: Prefer Wayland over X11
|
Subject: [PATCH] Revert "Revert "video: Prefer Wayland over X11""
|
||||||
|
|
||||||
|
For Fedora/RHEL, we want to continue using Wayland by default.
|
||||||
|
|
||||||
|
The majority of issues around Wayland by default seem to center
|
||||||
|
around cases that are issues for the Steam Runtime's bundled
|
||||||
|
copy of SDL and proprietary games that depend on that runtime.
|
||||||
|
|
||||||
|
These issues do not apply to us.
|
||||||
|
|
||||||
|
This reverts commit 254fcc90eb22bb159ab365ad956222a9c5632841.
|
||||||
---
|
---
|
||||||
src/video/SDL_video.c | 24 ++++++++++++------------
|
src/video/SDL_video.c | 24 ++++++++++++------------
|
||||||
1 file changed, 12 insertions(+), 12 deletions(-)
|
1 file changed, 12 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
|
diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c
|
||||||
index dac8d1cc9..d3fe65502 100644
|
index 2b896c44b..6f31f4c9e 100644
|
||||||
--- a/src/video/SDL_video.c
|
--- a/src/video/SDL_video.c
|
||||||
+++ b/src/video/SDL_video.c
|
+++ b/src/video/SDL_video.c
|
||||||
@@ -61,12 +61,12 @@ static VideoBootStrap *bootstrap[] = {
|
@@ -61,12 +61,12 @@ static VideoBootStrap *bootstrap[] = {
|
||||||
@ -27,7 +36,7 @@ index dac8d1cc9..d3fe65502 100644
|
|||||||
#if SDL_VIDEO_DRIVER_VIVANTE
|
#if SDL_VIDEO_DRIVER_VIVANTE
|
||||||
&VIVANTE_bootstrap,
|
&VIVANTE_bootstrap,
|
||||||
#endif
|
#endif
|
||||||
@@ -4249,12 +4249,12 @@ SDL_IsScreenKeyboardShown(SDL_Window *window)
|
@@ -4275,12 +4275,12 @@ SDL_IsScreenKeyboardShown(SDL_Window *window)
|
||||||
#if SDL_VIDEO_DRIVER_UIKIT
|
#if SDL_VIDEO_DRIVER_UIKIT
|
||||||
#include "uikit/SDL_uikitmessagebox.h"
|
#include "uikit/SDL_uikitmessagebox.h"
|
||||||
#endif
|
#endif
|
||||||
@ -43,7 +52,7 @@ index dac8d1cc9..d3fe65502 100644
|
|||||||
#if SDL_VIDEO_DRIVER_HAIKU
|
#if SDL_VIDEO_DRIVER_HAIKU
|
||||||
#include "haiku/SDL_bmessagebox.h"
|
#include "haiku/SDL_bmessagebox.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -4362,17 +4362,17 @@ SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
@@ -4388,17 +4388,17 @@ SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||||
retval = 0;
|
retval = 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -68,5 +77,5 @@ index dac8d1cc9..d3fe65502 100644
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
--
|
--
|
||||||
2.34.1
|
2.35.1
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
diff -up SDL2-2.0.9/include/SDL_opengl_glext.h.khrplatform SDL2-2.0.9/include/SDL_opengl_glext.h
|
|
||||||
--- SDL2-2.0.9/include/SDL_opengl_glext.h.khrplatform 2019-02-15 20:22:39.173773779 -0500
|
|
||||||
+++ SDL2-2.0.9/include/SDL_opengl_glext.h 2019-02-15 20:22:58.176399330 -0500
|
|
||||||
@@ -469,8 +469,9 @@ GLAPI void APIENTRY glBlendEquation (GLe
|
|
||||||
typedef long GLsizeiptr;
|
|
||||||
typedef long GLintptr;
|
|
||||||
#else
|
|
||||||
-typedef ptrdiff_t GLsizeiptr;
|
|
||||||
-typedef ptrdiff_t GLintptr;
|
|
||||||
+#include <KHR/khrplatform.h>
|
|
||||||
+typedef khronos_intptr_t GLintptr;
|
|
||||||
+typedef khronos_ssize_t GLsizeiptr;
|
|
||||||
#endif
|
|
||||||
#define GL_BUFFER_SIZE 0x8764
|
|
||||||
#define GL_BUFFER_USAGE 0x8765
|
|
34
SDL2.spec
34
SDL2.spec
@ -9,8 +9,8 @@
|
|||||||
%global libdecor_majver 0
|
%global libdecor_majver 0
|
||||||
|
|
||||||
Name: SDL2
|
Name: SDL2
|
||||||
Version: 2.0.20
|
Version: 2.26.0
|
||||||
Release: 2%{?dist}
|
Release: 1%{?dist}
|
||||||
Summary: Cross-platform multimedia library
|
Summary: Cross-platform multimedia library
|
||||||
License: zlib and MIT
|
License: zlib and MIT
|
||||||
URL: http://www.libsdl.org/
|
URL: http://www.libsdl.org/
|
||||||
@ -19,25 +19,8 @@ Source1: SDL_config.h
|
|||||||
Source2: SDL_revision.h
|
Source2: SDL_revision.h
|
||||||
|
|
||||||
Patch0: multilib.patch
|
Patch0: multilib.patch
|
||||||
# ptrdiff_t is not the same as khronos defines on 32bit arches
|
# Prefer Wayland by default
|
||||||
Patch1: SDL2-2.0.9-khrplatform.patch
|
Patch1: SDL2-2.0.22-prefer-wayland.patch
|
||||||
|
|
||||||
# Wayland backports
|
|
||||||
# From git format-patch release-2.0.20..68dd84f1de159b2e6ae1d5a23f842ee87f8a175a src/video/wayland/
|
|
||||||
Patch0101: 0001-wayland-Convert-URI-to-local-path-for-DropFile.patch
|
|
||||||
Patch0102: 0002-wayland-Avoid-spurious-resize-events.patch
|
|
||||||
Patch0103: 0003-wayland-Fix-building-with-SDL_OPENGL-OFF.patch
|
|
||||||
Patch0104: 0004-wayland-Avoid-calling-SetFullscreen-in-libdecor-Show.patch
|
|
||||||
Patch0105: 0005-wayland-Detach-hidden-surfaces-in-HideWindow-not-Sho.patch
|
|
||||||
Patch0106: 0006-wayland-Call-SetFullscreen-directly-in-ShowWindow.patch
|
|
||||||
Patch0107: 0007-wayland-Try-to-avoid-committing-before-the-window-is.patch
|
|
||||||
Patch0108: 0008-wayland-Fix-SDL_SetWindowSize-being-dropped-right-af.patch
|
|
||||||
Patch0109: 0009-wayland-Round-the-refresh-rate-rather-than-truncatin.patch
|
|
||||||
Patch0110: 0010-Fix-text_input_v3-preedit-string.patch
|
|
||||||
Patch0111: 0011-Only-generate-key-repetition-for-keys-that-should-re.patch
|
|
||||||
|
|
||||||
# From: https://github.com/libsdl-org/SDL/commit/8ceba27d6291f1195e13608033ec439aec621fc6
|
|
||||||
Patch0199: 0001-video-Prefer-Wayland-over-X11.patch
|
|
||||||
|
|
||||||
BuildRequires: git-core
|
BuildRequires: git-core
|
||||||
BuildRequires: cmake
|
BuildRequires: cmake
|
||||||
@ -55,10 +38,10 @@ BuildRequires: libXi-devel
|
|||||||
BuildRequires: libXrandr-devel
|
BuildRequires: libXrandr-devel
|
||||||
BuildRequires: libXrender-devel
|
BuildRequires: libXrender-devel
|
||||||
BuildRequires: libXScrnSaver-devel
|
BuildRequires: libXScrnSaver-devel
|
||||||
BuildRequires: libusb-devel
|
|
||||||
BuildRequires: libXinerama-devel
|
BuildRequires: libXinerama-devel
|
||||||
BuildRequires: libXcursor-devel
|
BuildRequires: libXcursor-devel
|
||||||
BuildRequires: systemd-devel
|
BuildRequires: systemd-devel
|
||||||
|
BuildRequires: pkgconfig(libusb-1.0)
|
||||||
# PulseAudio
|
# PulseAudio
|
||||||
BuildRequires: pkgconfig(libpulse-simple)
|
BuildRequires: pkgconfig(libpulse-simple)
|
||||||
# Jack
|
# Jack
|
||||||
@ -177,6 +160,8 @@ install -p -m 644 %{SOURCE2} %{buildroot}%{_includedir}/SDL2/SDL_revision.h
|
|||||||
%{_libdir}/cmake/SDL2/SDL2mainTargets*.cmake
|
%{_libdir}/cmake/SDL2/SDL2mainTargets*.cmake
|
||||||
%{_includedir}/SDL2
|
%{_includedir}/SDL2
|
||||||
%{_datadir}/aclocal/*
|
%{_datadir}/aclocal/*
|
||||||
|
%{_libdir}/libSDL2_test.a
|
||||||
|
%{_libdir}/cmake/SDL2/SDL2testTargets*.cmake
|
||||||
|
|
||||||
%files static
|
%files static
|
||||||
%license LICENSE.txt
|
%license LICENSE.txt
|
||||||
@ -184,6 +169,11 @@ install -p -m 644 %{SOURCE2} %{buildroot}%{_includedir}/SDL2/SDL_revision.h
|
|||||||
%{_libdir}/cmake/SDL2/SDL2staticTargets*.cmake
|
%{_libdir}/cmake/SDL2/SDL2staticTargets*.cmake
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Aug 21 2022 Neal Gompa <ngompa@centosproject.org> - 2.26.0-1
|
||||||
|
- Update to 2.26.0
|
||||||
|
Resolves: rhbz#2051959
|
||||||
|
- Drop backported patches included in this release
|
||||||
|
|
||||||
* Tue Feb 08 2022 Neal Gompa <ngompa@centosproject.org> - 2.0.20-2
|
* Tue Feb 08 2022 Neal Gompa <ngompa@centosproject.org> - 2.0.20-2
|
||||||
- Backport Wayland fixes with Wayland-by-default from upstream
|
- Backport Wayland fixes with Wayland-by-default from upstream
|
||||||
Resolves: rhbz#2051963
|
Resolves: rhbz#2051963
|
||||||
|
@ -1,15 +1,16 @@
|
|||||||
diff -up SDL2-2.0.14/sdl2-config.in.orig SDL2-2.0.14/sdl2-config.in
|
diff --git a/sdl2-config.in b/sdl2-config.in
|
||||||
--- SDL2-2.0.14/sdl2-config.in.orig 2020-12-21 17:44:36.000000000 +0000
|
index f6eca7668..93460f7ae 100644
|
||||||
+++ SDL2-2.0.14/sdl2-config.in 2021-01-21 16:26:35.663960042 +0000
|
--- a/sdl2-config.in
|
||||||
@@ -3,7 +3,6 @@
|
+++ b/sdl2-config.in
|
||||||
prefix=@prefix@
|
@@ -7,7 +7,6 @@ bindir=$(cd -P -- "$(dirname -- "$0")" && printf '%s\n' "$(pwd -P)")
|
||||||
|
prefix=$(cd -P -- "$bindir/@bin_prefix_relpath@" && printf '%s\n' "$(pwd -P)")
|
||||||
exec_prefix=@exec_prefix@
|
exec_prefix=@exec_prefix@
|
||||||
exec_prefix_set=no
|
exec_prefix_set=no
|
||||||
-libdir=@libdir@
|
-libdir=@libdir@
|
||||||
|
|
||||||
@ENABLE_STATIC_FALSE@usage="\
|
@ENABLE_STATIC_FALSE@usage="\
|
||||||
@ENABLE_STATIC_FALSE@Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
|
@ENABLE_STATIC_FALSE@Usage: $0 [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--cflags] [--libs]"
|
||||||
@@ -45,11 +44,11 @@ while test $# -gt 0; do
|
@@ -49,12 +48,11 @@ while test $# -gt 0; do
|
||||||
echo -I@includedir@/SDL2 @SDL_CFLAGS@
|
echo -I@includedir@/SDL2 @SDL_CFLAGS@
|
||||||
;;
|
;;
|
||||||
@ENABLE_SHARED_TRUE@ --libs)
|
@ENABLE_SHARED_TRUE@ --libs)
|
||||||
@ -18,7 +19,8 @@ diff -up SDL2-2.0.14/sdl2-config.in.orig SDL2-2.0.14/sdl2-config.in
|
|||||||
@ENABLE_SHARED_TRUE@ ;;
|
@ENABLE_SHARED_TRUE@ ;;
|
||||||
@ENABLE_STATIC_TRUE@@ENABLE_SHARED_TRUE@ --static-libs)
|
@ENABLE_STATIC_TRUE@@ENABLE_SHARED_TRUE@ --static-libs)
|
||||||
@ENABLE_STATIC_TRUE@@ENABLE_SHARED_FALSE@ --libs|--static-libs)
|
@ENABLE_STATIC_TRUE@@ENABLE_SHARED_FALSE@ --libs|--static-libs)
|
||||||
-@ENABLE_STATIC_TRUE@ echo -L@libdir@ @SDL_LIBS@ @SDL_STATIC_LIBS@
|
-@ENABLE_STATIC_TRUE@ sdl_static_libs=$(echo "@SDL_LIBS@ @SDL_STATIC_LIBS@" | sed -E "s#-lSDL2[ $]#$libdir/libSDL2.a #g")
|
||||||
|
-@ENABLE_STATIC_TRUE@ echo -L@libdir@ $sdl_static_libs
|
||||||
+@ENABLE_STATIC_TRUE@ echo @SDL_LIBS@ @SDL_STATIC_LIBS@
|
+@ENABLE_STATIC_TRUE@ echo @SDL_LIBS@ @SDL_STATIC_LIBS@
|
||||||
@ENABLE_STATIC_TRUE@ ;;
|
@ENABLE_STATIC_TRUE@ ;;
|
||||||
*)
|
*)
|
||||||
|
2
sources
2
sources
@ -1 +1 @@
|
|||||||
SHA512 (SDL2-2.0.20.tar.gz) = 4889949eaa674948bdb0a01bb2a842a0943b15b08ff27ec0079b0fd4f79d071ffb32488a5a51c12ad7c74ed5fe73b608cdf6336a44c95dae8a0fb3f47d0f01de
|
SHA512 (SDL2-2.26.0.tar.gz) = b4379140399e2248b28c4fe36ba6bb142cd047014c3cfc6fd2c0fee7110ad28af6553f24ca4ccf4996165940de127aafe8d744b09bea9d5684ce8244697996bf
|
||||||
|
Loading…
Reference in New Issue
Block a user