Backport select fixes from upstream

- Support legacy 'pulse' alias for PulseAudio driver
- Fix handling of Ctrl key on Wayland
- Add support for HiDPI cursors on Wayland
- Fix keymap support on Wayland (rhbz#2007969)
- Use EGL_EXT_present_opaque when available on Wayland
- Expose xdg_toplevel to SysWM on Wayland
This commit is contained in:
Neal Gompa 2021-09-26 14:32:12 -04:00
parent 6a336bdad4
commit bc2648e525
8 changed files with 751 additions and 5 deletions

View File

@ -0,0 +1,48 @@
From 3261f7f6ceaaa435a3aca0252b2f7126eeae1bb2 Mon Sep 17 00:00:00 2001
From: David Gow <david@ingeniumdigital.com>
Date: Thu, 26 Aug 2021 16:15:30 +0800
Subject: [PATCH] audio: Support "pulse" as an alias for "pulseaudio"
Originally, SDL 1.2 used "pulse" as the name for its PulseAudio driver.
While it now supports "pulseaudio" as well for compatibility with SDL
2.0 [1], there are still scripts and distro packages which set
SDL_AUDIODRIVER=pulse [2]. While it's possible to remove this in most
circumstances or replace it with "pulseaudio" or a comma-separated list,
this may still conflict if the environment variable is set globally and
old binary builds of SDL 1.2 (e.g. packaged with older games) are being
used.
To fix this on SDL 2.0, add a hardcoded check for "pulse" as an audio
driver name, and replace it with "pulseaudio". This mimics what SDL 1.2
does (but in reverse). Note that setting driver_attempt{,_len} is safe
here as they're reset correctly based on driver_attempt_end on the next
loop.
[1] https://github.com/libsdl-org/SDL-1.2/commit/d9514097846381cd30fe08df65dbdd48de92a058
[2] https://bugzilla.opensuse.org/show_bug.cgi?id=1189778
---
src/audio/SDL_audio.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c
index 69cddd535..972207d36 100644
--- a/src/audio/SDL_audio.c
+++ b/src/audio/SDL_audio.c
@@ -978,6 +978,14 @@ SDL_AudioInit(const char *driver_name)
const char *driver_attempt_end = SDL_strchr(driver_attempt, ',');
size_t driver_attempt_len = (driver_attempt_end != NULL) ? (driver_attempt_end - driver_attempt)
: SDL_strlen(driver_attempt);
+#if SDL_AUDIO_DRIVER_PULSEAUDIO
+ /* SDL 1.2 uses the name "pulse", so we'll support both. */
+ if (driver_attempt_len == SDL_strlen("pulse") &&
+ (SDL_strncasecmp(driver_attempt, "pulse", driver_attempt_len) == 0)) {
+ driver_attempt = "pulseaudio";
+ driver_attempt_len = SDL_strlen("pulseaudio");
+ }
+#endif
for (i = 0; bootstrap[i]; ++i) {
if ((driver_attempt_len == SDL_strlen(bootstrap[i]->name)) &&
--
2.32.0

View File

@ -0,0 +1,53 @@
From 5113fedfa0e8592048a66cf8f852a59441e8bc9c Mon Sep 17 00:00:00 2001
From: Eric Engestrom <eric@engestrom.ch>
Date: Mon, 2 Aug 2021 23:01:12 +0100
Subject: [PATCH] video/wayland: use EGL_EXT_present_opaque when available
---
src/video/SDL_egl.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c
index 87d693e8d..41966db45 100644
--- a/src/video/SDL_egl.c
+++ b/src/video/SDL_egl.c
@@ -43,6 +43,11 @@
#endif
#endif /* EGL_KHR_create_context */
+#ifndef EGL_EXT_present_opaque
+#define EGL_EXT_present_opaque 1
+#define EGL_PRESENT_OPAQUE_EXT 0x31DF
+#endif /* EGL_EXT_present_opaque */
+
#if SDL_VIDEO_DRIVER_RPI
/* Raspbian places the OpenGL ES/EGL binaries in a non standard path */
#define DEFAULT_EGL ( vc4 ? "libEGL.so.1" : "libbrcmEGL.so" )
@@ -1182,8 +1187,8 @@ SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
EGLint format_wanted;
EGLint format_got;
#endif
- /* max 2 values plus terminator. */
- EGLint attribs[3];
+ /* max 2 key+value pairs, plus terminator. */
+ EGLint attribs[5];
int attr = 0;
EGLSurface * surface;
@@ -1216,6 +1221,13 @@ SDL_EGL_CreateSurface(_THIS, NativeWindowType nw)
}
}
+#ifdef EGL_EXT_present_opaque
+ if (SDL_EGL_HasExtension(_this, SDL_EGL_DISPLAY_EXTENSION, "EGL_EXT_present_opaque")) {
+ attribs[attr++] = EGL_PRESENT_OPAQUE_EXT;
+ attribs[attr++] = EGL_TRUE;
+ }
+#endif
+
attribs[attr++] = EGL_NONE;
surface = _this->egl_data->eglCreateWindowSurface(
--
2.32.0

View File

@ -0,0 +1,393 @@
From 8e54698aa6e3c0cf02d0b628403f047f28ea7fd0 Mon Sep 17 00:00:00 2001
From: Ethan Lee <flibitijibibo@gmail.com>
Date: Wed, 22 Sep 2021 13:26:44 -0400
Subject: [PATCH 1/2] wayland: Add support for high-DPI cursors
---
src/video/wayland/SDL_waylandmouse.c | 230 ++++++++++++++++-----------
src/video/wayland/SDL_waylandmouse.h | 2 +-
src/video/wayland/SDL_waylandvideo.c | 6 +-
src/video/wayland/SDL_waylandvideo.h | 8 +-
4 files changed, 147 insertions(+), 99 deletions(-)
diff --git a/src/video/wayland/SDL_waylandmouse.c b/src/video/wayland/SDL_waylandmouse.c
index a0df26bdf..23663ebe1 100644
--- a/src/video/wayland/SDL_waylandmouse.c
+++ b/src/video/wayland/SDL_waylandmouse.c
@@ -47,11 +47,110 @@ typedef struct {
int hot_x, hot_y;
int w, h;
- /* Either a preloaded cursor, or one we created ourselves */
- struct wl_cursor *cursor;
+ /* shm_data is non-NULL for custom cursors.
+ * When shm_data is NULL, system_cursor must be valid
+ */
+ SDL_SystemCursor system_cursor;
void *shm_data;
} Wayland_CursorData;
+static SDL_bool
+wayland_get_system_cursor(SDL_VideoData *vdata, Wayland_CursorData *cdata, float *scale)
+{
+ struct wl_cursor_theme *theme = NULL;
+ struct wl_cursor *cursor;
+
+ SDL_Window *focus;
+ SDL_WindowData *focusdata;
+ int i;
+
+ /* FIXME: We need to be able to query the cursor size from the desktop at
+ * some point! For a while this was 32, but when testing on real desktops it
+ * seems like most of them default to 24. We'll need a protocol to get this
+ * for real, but for now this is a pretty safe bet.
+ * -flibit
+ */
+ int size = 24;
+
+ /* First, find the appropriate theme based on the current scale... */
+ focus = SDL_GetMouse()->focus;
+ if (focus == NULL) {
+ /* Nothing to see here, bail. */
+ return SDL_FALSE;
+ }
+ focusdata = focus->driverdata;
+ *scale = focusdata->scale_factor;
+ size *= focusdata->scale_factor;
+ for (i = 0; i < vdata->num_cursor_themes; i += 1) {
+ if (vdata->cursor_themes[i].size == size) {
+ theme = vdata->cursor_themes[i].theme;
+ break;
+ }
+ }
+ if (theme == NULL) {
+ vdata->cursor_themes = SDL_realloc(vdata->cursor_themes,
+ sizeof(SDL_WaylandCursorTheme) * (vdata->num_cursor_themes + 1));
+ if (vdata->cursor_themes == NULL) {
+ SDL_OutOfMemory();
+ return SDL_FALSE;
+ }
+ theme = WAYLAND_wl_cursor_theme_load(NULL, size, vdata->shm);
+ vdata->cursor_themes[vdata->num_cursor_themes++].theme = theme;
+ }
+
+ /* Next, find the cursor from the theme... */
+ switch(cdata->system_cursor)
+ {
+ case SDL_SYSTEM_CURSOR_ARROW:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "left_ptr");
+ break;
+ case SDL_SYSTEM_CURSOR_IBEAM:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "xterm");
+ break;
+ case SDL_SYSTEM_CURSOR_WAIT:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "watch");
+ break;
+ case SDL_SYSTEM_CURSOR_CROSSHAIR:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "hand1");
+ break;
+ case SDL_SYSTEM_CURSOR_WAITARROW:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "watch");
+ break;
+ case SDL_SYSTEM_CURSOR_SIZENWSE:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "hand1");
+ break;
+ case SDL_SYSTEM_CURSOR_SIZENESW:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "hand1");
+ break;
+ case SDL_SYSTEM_CURSOR_SIZEWE:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "hand1");
+ break;
+ case SDL_SYSTEM_CURSOR_SIZENS:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "hand1");
+ break;
+ case SDL_SYSTEM_CURSOR_SIZEALL:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "hand1");
+ break;
+ case SDL_SYSTEM_CURSOR_NO:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "xterm");
+ break;
+ case SDL_SYSTEM_CURSOR_HAND:
+ cursor = WAYLAND_wl_cursor_theme_get_cursor(theme, "hand1");
+ break;
+ default:
+ SDL_assert(0);
+ return SDL_FALSE;
+ }
+
+ /* ... Set the cursor data, finally. */
+ cdata->buffer = WAYLAND_wl_cursor_image_get_buffer(cursor->images[0]);
+ cdata->hot_x = cursor->images[0]->hotspot_x;
+ cdata->hot_y = cursor->images[0]->hotspot_y;
+ cdata->w = cursor->images[0]->width;
+ cdata->h = cursor->images[0]->height;
+ return SDL_TRUE;
+}
+
static int
wayland_create_tmp_file(off_t size)
{
@@ -192,30 +291,30 @@ Wayland_CreateCursor(SDL_Surface *surface, int hot_x, int hot_y)
}
static SDL_Cursor *
-CreateCursorFromWlCursor(SDL_VideoData *d, struct wl_cursor *wlcursor)
+Wayland_CreateSystemCursor(SDL_SystemCursor id)
{
+ SDL_VideoData *data = SDL_GetVideoDevice()->driverdata;
SDL_Cursor *cursor;
cursor = SDL_calloc(1, sizeof (*cursor));
if (cursor) {
- Wayland_CursorData *data = SDL_calloc (1, sizeof (Wayland_CursorData));
- if (!data) {
+ Wayland_CursorData *cdata = SDL_calloc (1, sizeof (Wayland_CursorData));
+ if (!cdata) {
SDL_OutOfMemory();
SDL_free(cursor);
return NULL;
}
- cursor->driverdata = (void *) data;
+ cursor->driverdata = (void *) cdata;
- data->buffer = WAYLAND_wl_cursor_image_get_buffer(wlcursor->images[0]);
- data->surface = wl_compositor_create_surface(d->compositor);
- wl_surface_set_user_data(data->surface, NULL);
- data->hot_x = wlcursor->images[0]->hotspot_x;
- data->hot_y = wlcursor->images[0]->hotspot_y;
- data->w = wlcursor->images[0]->width;
- data->h = wlcursor->images[0]->height;
- data->cursor= wlcursor;
+ cdata->surface = wl_compositor_create_surface(data->compositor);
+ wl_surface_set_user_data(cdata->surface, NULL);
+
+ /* Note that we can't actually set any other cursor properties, as this
+ * is output-specific. See wayland_get_system_cursor for the rest!
+ */
+ cdata->system_cursor = id;
} else {
- SDL_OutOfMemory ();
+ SDL_OutOfMemory();
}
return cursor;
@@ -224,66 +323,7 @@ CreateCursorFromWlCursor(SDL_VideoData *d, struct wl_cursor *wlcursor)
static SDL_Cursor *
Wayland_CreateDefaultCursor()
{
- SDL_VideoDevice *device = SDL_GetVideoDevice();
- SDL_VideoData *data = device->driverdata;
-
- return CreateCursorFromWlCursor (data,
- WAYLAND_wl_cursor_theme_get_cursor(data->cursor_theme,
- "left_ptr"));
-}
-
-static SDL_Cursor *
-Wayland_CreateSystemCursor(SDL_SystemCursor id)
-{
- SDL_VideoDevice *vd = SDL_GetVideoDevice();
- SDL_VideoData *d = vd->driverdata;
-
- struct wl_cursor *cursor = NULL;
-
- switch(id)
- {
- default:
- SDL_assert(0);
- return NULL;
- case SDL_SYSTEM_CURSOR_ARROW:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "left_ptr");
- break;
- case SDL_SYSTEM_CURSOR_IBEAM:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "xterm");
- break;
- case SDL_SYSTEM_CURSOR_WAIT:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "watch");
- break;
- case SDL_SYSTEM_CURSOR_CROSSHAIR:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
- break;
- case SDL_SYSTEM_CURSOR_WAITARROW:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "watch");
- break;
- case SDL_SYSTEM_CURSOR_SIZENWSE:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
- break;
- case SDL_SYSTEM_CURSOR_SIZENESW:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
- break;
- case SDL_SYSTEM_CURSOR_SIZEWE:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
- break;
- case SDL_SYSTEM_CURSOR_SIZENS:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
- break;
- case SDL_SYSTEM_CURSOR_SIZEALL:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
- break;
- case SDL_SYSTEM_CURSOR_NO:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "xterm");
- break;
- case SDL_SYSTEM_CURSOR_HAND:
- cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "hand1");
- break;
- }
-
- return CreateCursorFromWlCursor(d, cursor);
+ return Wayland_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW);
}
static void
@@ -300,14 +340,14 @@ Wayland_FreeCursor(SDL_Cursor *cursor)
if (!d)
return;
- if (d->buffer && !d->cursor)
+ if (d->buffer && d->shm_data)
wl_buffer_destroy(d->buffer);
if (d->surface)
wl_surface_destroy(d->surface);
/* Not sure what's meant to happen to shm_data */
- SDL_free (cursor->driverdata);
+ SDL_free(cursor->driverdata);
SDL_free(cursor);
}
@@ -317,8 +357,8 @@ Wayland_ShowCursor(SDL_Cursor *cursor)
SDL_VideoDevice *vd = SDL_GetVideoDevice();
SDL_VideoData *d = vd->driverdata;
struct SDL_WaylandInput *input = d->input;
-
struct wl_pointer *pointer = d->pointer;
+ float scale = 1.0f;
if (!pointer)
return -1;
@@ -327,22 +367,26 @@ Wayland_ShowCursor(SDL_Cursor *cursor)
{
Wayland_CursorData *data = cursor->driverdata;
- wl_pointer_set_cursor (pointer,
- input->pointer_enter_serial,
- data->surface,
- data->hot_x,
- data->hot_y);
+ /* TODO: High-DPI custom cursors? -flibit */
+ if (data->shm_data == NULL) {
+ if (!wayland_get_system_cursor(d, data, &scale)) {
+ return -1;
+ }
+ }
+
+ wl_surface_set_buffer_scale(data->surface, scale);
+ wl_pointer_set_cursor(pointer,
+ input->pointer_enter_serial,
+ data->surface,
+ data->hot_x / scale,
+ data->hot_y / scale);
wl_surface_attach(data->surface, data->buffer, 0, 0);
wl_surface_damage(data->surface, 0, 0, data->w, data->h);
wl_surface_commit(data->surface);
}
else
{
- wl_pointer_set_cursor (pointer,
- input->pointer_enter_serial,
- NULL,
- 0,
- 0);
+ wl_pointer_set_cursor(pointer, input->pointer_enter_serial, NULL, 0, 0);
}
return 0;
@@ -389,10 +433,12 @@ Wayland_InitMouse(void)
}
void
-Wayland_FiniMouse(void)
+Wayland_FiniMouse(SDL_VideoData *data)
{
- /* This effectively assumes that nobody else
- * touches SDL_Mouse which is effectively
- * a singleton */
+ int i;
+ for (i = 0; i < data->num_cursor_themes; i += 1) {
+ WAYLAND_wl_cursor_theme_destroy(data->cursor_themes[i].theme);
+ }
+ SDL_free(data->cursor_themes);
}
#endif /* SDL_VIDEO_DRIVER_WAYLAND */
diff --git a/src/video/wayland/SDL_waylandmouse.h b/src/video/wayland/SDL_waylandmouse.h
index 51bfaf5d0..79efaf7e8 100644
--- a/src/video/wayland/SDL_waylandmouse.h
+++ b/src/video/wayland/SDL_waylandmouse.h
@@ -26,6 +26,6 @@
#if SDL_VIDEO_DRIVER_WAYLAND
extern void Wayland_InitMouse(void);
-extern void Wayland_FiniMouse(void);
+extern void Wayland_FiniMouse(SDL_VideoData *data);
#endif
diff --git a/src/video/wayland/SDL_waylandvideo.c b/src/video/wayland/SDL_waylandvideo.c
index 1cd67aaf4..03464d193 100644
--- a/src/video/wayland/SDL_waylandvideo.c
+++ b/src/video/wayland/SDL_waylandvideo.c
@@ -495,7 +495,6 @@ display_handle_global(void *data, struct wl_registry *registry, uint32_t id,
xdg_wm_base_add_listener(d->shell.xdg, &shell_listener_xdg, NULL);
} else if (SDL_strcmp(interface, "wl_shm") == 0) {
d->shm = wl_registry_bind(registry, id, &wl_shm_interface, 1);
- d->cursor_theme = WAYLAND_wl_cursor_theme_load(NULL, 32, d->shm);
} else if (SDL_strcmp(interface, "zwp_relative_pointer_manager_v1") == 0) {
Wayland_display_add_relative_pointer_manager(d, id);
} else if (SDL_strcmp(interface, "zwp_pointer_constraints_v1") == 0) {
@@ -618,7 +617,7 @@ Wayland_VideoQuit(_THIS)
SDL_VideoData *data = _this->driverdata;
int i, j;
- Wayland_FiniMouse ();
+ Wayland_FiniMouse(data);
for (i = 0; i < _this->num_displays; ++i) {
SDL_VideoDisplay *display = &_this->displays[i];
@@ -671,9 +670,6 @@ Wayland_VideoQuit(_THIS)
if (data->shm)
wl_shm_destroy(data->shm);
- if (data->cursor_theme)
- WAYLAND_wl_cursor_theme_destroy(data->cursor_theme);
-
if (data->shell.xdg)
xdg_wm_base_destroy(data->shell.xdg);
diff --git a/src/video/wayland/SDL_waylandvideo.h b/src/video/wayland/SDL_waylandvideo.h
index 60336b6cc..2d8b6323a 100644
--- a/src/video/wayland/SDL_waylandvideo.h
+++ b/src/video/wayland/SDL_waylandvideo.h
@@ -41,13 +41,19 @@ struct qt_surface_extension;
struct qt_windowmanager;
#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
+typedef struct {
+ struct wl_cursor_theme *theme;
+ int size;
+} SDL_WaylandCursorTheme;
+
typedef struct {
struct wl_display *display;
int display_disconnected;
struct wl_registry *registry;
struct wl_compositor *compositor;
struct wl_shm *shm;
- struct wl_cursor_theme *cursor_theme;
+ SDL_WaylandCursorTheme *cursor_themes;
+ int num_cursor_themes;
struct wl_pointer *pointer;
struct {
struct xdg_wm_base *xdg;
--
2.32.0

View File

@ -0,0 +1,75 @@
From b592e78f93b1e698b981ecf5af90e48e52e6387e Mon Sep 17 00:00:00 2001
From: Cacodemon345 <wahil1976@outlook.com>
Date: Sat, 25 Sep 2021 12:55:41 +0600
Subject: [PATCH] wayland: Expose xdg_toplevel to SysWM
---
include/SDL_syswm.h | 1 +
src/video/wayland/SDL_waylanddyn.h | 1 +
src/video/wayland/SDL_waylandsym.h | 1 +
src/video/wayland/SDL_waylandwindow.c | 7 +++++++
4 files changed, 10 insertions(+)
diff --git a/include/SDL_syswm.h b/include/SDL_syswm.h
index 046a096ee..0936727b1 100644
--- a/include/SDL_syswm.h
+++ b/include/SDL_syswm.h
@@ -292,6 +292,7 @@ struct SDL_SysWMinfo
void *shell_surface; /**< DEPRECATED Wayland shell_surface (window manager handle) */
struct wl_egl_window *egl_window; /**< Wayland EGL window (native window) */
struct xdg_surface *xdg_surface; /**< Wayland xdg surface (window manager handle) */
+ struct xdg_toplevel *xdg_toplevel; /**< Wayland xdg toplevel role */
} wl;
#endif
#if defined(SDL_VIDEO_DRIVER_MIR) /* no longer available, left for API/ABI compatibility. Remove in 2.1! */
diff --git a/src/video/wayland/SDL_waylanddyn.h b/src/video/wayland/SDL_waylanddyn.h
index 6cd527316..13b0884d0 100644
--- a/src/video/wayland/SDL_waylanddyn.h
+++ b/src/video/wayland/SDL_waylanddyn.h
@@ -140,6 +140,7 @@ void SDL_WAYLAND_UnloadSymbols(void);
#define libdecor_frame_is_floating (*WAYLAND_libdecor_frame_is_floating)
#define libdecor_frame_set_parent (*WAYLAND_libdecor_frame_set_parent)
#define libdecor_frame_get_xdg_surface (*WAYLAND_libdecor_frame_get_xdg_surface)
+#define libdecor_frame_get_xdg_toplevel (*WAYLAND_libdecor_frame_get_xdg_toplevel)
#define libdecor_frame_map (*WAYLAND_libdecor_frame_map)
#define libdecor_state_new (*WAYLAND_libdecor_state_new)
#define libdecor_state_free (*WAYLAND_libdecor_state_free)
diff --git a/src/video/wayland/SDL_waylandsym.h b/src/video/wayland/SDL_waylandsym.h
index 10602740b..40e6c99a1 100644
--- a/src/video/wayland/SDL_waylandsym.h
+++ b/src/video/wayland/SDL_waylandsym.h
@@ -182,6 +182,7 @@ SDL_WAYLAND_SYM(bool, libdecor_frame_is_floating, (struct libdecor_frame *))
SDL_WAYLAND_SYM(void, libdecor_frame_set_parent, (struct libdecor_frame *,\
struct libdecor_frame *))
SDL_WAYLAND_SYM(struct xdg_surface *, libdecor_frame_get_xdg_surface, (struct libdecor_frame *))
+SDL_WAYLAND_SYM(struct xdg_toplevel *, libdecor_frame_get_xdg_toplevel, (struct libdecor_frame *))
SDL_WAYLAND_SYM(void, libdecor_frame_map, (struct libdecor_frame *))
SDL_WAYLAND_SYM(struct libdecor_state *, libdecor_state_new, (int, int))
SDL_WAYLAND_SYM(void, libdecor_state_free, (struct libdecor_state *))
diff --git a/src/video/wayland/SDL_waylandwindow.c b/src/video/wayland/SDL_waylandwindow.c
index 451d33b76..2dd251aba 100644
--- a/src/video/wayland/SDL_waylandwindow.c
+++ b/src/video/wayland/SDL_waylandwindow.c
@@ -639,12 +639,19 @@ Wayland_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info)
#ifdef HAVE_LIBDECOR_H
if (viddata->shell.libdecor && data->shell_surface.libdecor.frame != NULL) {
info->info.wl.xdg_surface = libdecor_frame_get_xdg_surface(data->shell_surface.libdecor.frame);
+ if (version >= SDL_VERSIONNUM(2, 0, 17)) {
+ info->info.wl.xdg_toplevel = libdecor_frame_get_xdg_toplevel(data->shell_surface.libdecor.frame);
+ }
} else
#endif
if (viddata->shell.xdg && data->shell_surface.xdg.surface != NULL) {
info->info.wl.xdg_surface = data->shell_surface.xdg.surface;
+ if (version >= SDL_VERSIONNUM(2, 0, 17)) {
+ info->info.wl.xdg_toplevel = data->shell_surface.xdg.roleobj.toplevel;
+ }
} else {
info->info.wl.xdg_surface = NULL;
+ info->info.wl.xdg_toplevel = NULL;
}
}
--
2.32.0

View File

@ -0,0 +1,26 @@
From 1a4e2e5ef7425d44a0faa4ad5535e69f7c0b962c Mon Sep 17 00:00:00 2001
From: Ethan Lee <flibitijibibo@gmail.com>
Date: Thu, 23 Sep 2021 14:31:54 -0400
Subject: [PATCH] wayland: For text, ignore key events when Ctrl is held
Fixes #4695
---
src/video/wayland/SDL_waylandevents.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
index f021c3adc..82df0fb05 100644
--- a/src/video/wayland/SDL_waylandevents.c
+++ b/src/video/wayland/SDL_waylandevents.c
@@ -839,7 +839,7 @@ keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
}
if (state == WL_KEYBOARD_KEY_STATE_PRESSED) {
- if (has_text) {
+ if (has_text && !(SDL_GetModState() & KMOD_CTRL)) {
Wayland_data_device_set_serial(input->data_device, serial);
if (!handled_by_ime) {
SDL_SendKeyboardText(text);
--
2.32.0

View File

@ -0,0 +1,104 @@
From 7ed415d2edfa44e554605a0b5616c836680756ed Mon Sep 17 00:00:00 2001
From: Ethan Lee <flibitijibibo@gmail.com>
Date: Thu, 23 Sep 2021 14:07:38 -0400
Subject: [PATCH] wayland: Reuse KeySymToUcs4 to replicate X11 keymap behavior
---
src/{video/x11 => events}/imKStoUCS.c | 7 +++----
src/{video/x11 => events}/imKStoUCS.h | 2 +-
src/video/wayland/SDL_waylandevents.c | 3 ++-
src/video/x11/SDL_x11keyboard.c | 4 ++--
4 files changed, 8 insertions(+), 8 deletions(-)
rename src/{video/x11 => events}/imKStoUCS.c (99%)
rename src/{video/x11 => events}/imKStoUCS.h (96%)
diff --git a/src/video/x11/imKStoUCS.c b/src/events/imKStoUCS.c
similarity index 99%
rename from src/video/x11/imKStoUCS.c
rename to src/events/imKStoUCS.c
index 40e224243..4aa85d423 100644
--- a/src/video/x11/imKStoUCS.c
+++ b/src/events/imKStoUCS.c
@@ -24,10 +24,9 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
-#include "../../SDL_internal.h"
+#include "../SDL_internal.h"
-#if SDL_VIDEO_DRIVER_X11
-#include <X11/X.h>
+#if SDL_VIDEO_DRIVER_X11 || SDL_VIDEO_DRIVER_WAYLAND
#include "imKStoUCS.h"
static unsigned short const keysym_to_unicode_1a1_1ff[] = {
@@ -294,7 +293,7 @@ static unsigned short const keysym_to_unicode_20a0_20ac[] = {
};
unsigned int
-X11_KeySymToUcs4(KeySym keysym)
+SDL_KeySymToUcs4(Uint32 keysym)
{
/* 'Unicode keysym' */
if ((keysym & 0xff000000) == 0x01000000)
diff --git a/src/video/x11/imKStoUCS.h b/src/events/imKStoUCS.h
similarity index 96%
rename from src/video/x11/imKStoUCS.h
rename to src/events/imKStoUCS.h
index fe4381d98..485ace59f 100644
--- a/src/video/x11/imKStoUCS.h
+++ b/src/events/imKStoUCS.h
@@ -27,6 +27,6 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
-extern unsigned int X11_KeySymToUcs4(KeySym keysym);
+extern unsigned int SDL_KeySymToUcs4(Uint32 keysym);
#endif /* _imKStoUCS_h */
diff --git a/src/video/wayland/SDL_waylandevents.c b/src/video/wayland/SDL_waylandevents.c
index 82df0fb05..4cfd0f1cd 100644
--- a/src/video/wayland/SDL_waylandevents.c
+++ b/src/video/wayland/SDL_waylandevents.c
@@ -60,6 +60,7 @@
#include <unistd.h>
#include <xkbcommon/xkbcommon.h>
#include <xkbcommon/xkbcommon-compose.h>
+#include "../../events/imKStoUCS.h"
/* Weston uses a ratio of 10 units per scroll tick */
#define WAYLAND_WHEEL_AXIS_UNIT 10
@@ -870,7 +871,7 @@ Wayland_keymap_iter(struct xkb_keymap *keymap, xkb_keycode_t key, void *data)
}
if (WAYLAND_xkb_keymap_key_get_syms_by_level(keymap, key, sdlKeymap->layout, 0, &syms) > 0) {
- uint32_t keycode = WAYLAND_xkb_keysym_to_utf32(syms[0]);
+ uint32_t keycode = SDL_KeySymToUcs4(syms[0]);
if (keycode) {
sdlKeymap->keymap[scancode] = keycode;
} else {
diff --git a/src/video/x11/SDL_x11keyboard.c b/src/video/x11/SDL_x11keyboard.c
index bcc994f9f..2d8c24ccc 100644
--- a/src/video/x11/SDL_x11keyboard.c
+++ b/src/video/x11/SDL_x11keyboard.c
@@ -31,7 +31,7 @@
#include <X11/keysym.h>
#include <X11/XKBlib.h>
-#include "imKStoUCS.h"
+#include "../../events/imKStoUCS.h"
#ifdef X_HAVE_UTF8_STRING
#include <locale.h>
@@ -205,7 +205,7 @@ X11_KeyCodeToUcs4(_THIS, KeyCode keycode, unsigned char group)
return 0;
}
- return X11_KeySymToUcs4(keysym);
+ return SDL_KeySymToUcs4(keysym);
}
KeySym
--
2.32.0

View File

@ -0,0 +1,24 @@
From 9b74623be9a4dc97bac905c69bea042df6e0b1ac Mon Sep 17 00:00:00 2001
From: Ethan Lee <flibitijibibo@gmail.com>
Date: Wed, 22 Sep 2021 13:52:36 -0400
Subject: [PATCH 2/2] wayland: Woops, forgot to assign cursor theme size...
---
src/video/wayland/SDL_waylandmouse.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/video/wayland/SDL_waylandmouse.c b/src/video/wayland/SDL_waylandmouse.c
index 23663ebe1..ead346ee2 100644
--- a/src/video/wayland/SDL_waylandmouse.c
+++ b/src/video/wayland/SDL_waylandmouse.c
@@ -95,6 +95,7 @@ wayland_get_system_cursor(SDL_VideoData *vdata, Wayland_CursorData *cdata, float
return SDL_FALSE;
}
theme = WAYLAND_wl_cursor_theme_load(NULL, size, vdata->shm);
+ vdata->cursor_themes[vdata->num_cursor_themes].size = size;
vdata->cursor_themes[vdata->num_cursor_themes++].theme = theme;
}
--
2.32.0

View File

@ -10,7 +10,7 @@
Name: SDL2 Name: SDL2
Version: 2.0.16 Version: 2.0.16
Release: 2%{?dist} Release: 3%{?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/
@ -21,10 +21,24 @@ Patch0: multilib.patch
# ptrdiff_t is not the same as khronos defines on 32bit arches # ptrdiff_t is not the same as khronos defines on 32bit arches
Patch1: SDL2-2.0.9-khrplatform.patch Patch1: SDL2-2.0.9-khrplatform.patch
# Proposed upstream # Backports from upstream
## From: https://github.com/libsdl-org/SDL/pull/4622 ## Fix CMake GNUInstallDirs usage
Patch0101: SDL2-2.0.16-PR4622.patch Patch0010: SDL2-2.0.16-PR4622.patch
## Support legacy 'pulse' alias for PulseAudio driver
Patch0011: 0001-audio-Support-pulse-as-an-alias-for-pulseaudio.patch
## Add support for HiDPI cursors on Wayland
Patch0012: 0001-wayland-Add-support-for-high-DPI-cursors.patch
Patch0013: 0002-wayland-Woops-forgot-to-assign-cursor-theme-size.patch
## Fix handling of Ctrl key on Wayland
Patch0014: 0001-wayland-For-text-ignore-key-events-when-Ctrl-is-held.patch
## Fix keymap support on Wayland (rhbz#2007969)
Patch0015: 0001-wayland-Reuse-KeySymToUcs4-to-replicate-X11-keymap-b.patch
## Use EGL_EXT_present_opaque when available on Wayland
Patch0016: 0001-video-wayland-use-EGL_EXT_present_opaque-when-availa.patch
## Expose xdg_toplevel to SysWM on Wayland
Patch0017: 0001-wayland-Expose-xdg_toplevel-to-SysWM.patch
BuildRequires: git-core
BuildRequires: cmake BuildRequires: cmake
BuildRequires: make BuildRequires: make
BuildRequires: gcc BuildRequires: gcc
@ -97,7 +111,7 @@ Summary: Static libraries for SDL2
Static libraries for SDL2. Static libraries for SDL2.
%prep %prep
%autosetup -p1 %autosetup -S git
sed -i -e 's/\r//g' TODO.txt README.md WhatsNew.txt BUGS.txt LICENSE.txt CREDITS.txt README-SDL.txt sed -i -e 's/\r//g' TODO.txt README.md WhatsNew.txt BUGS.txt LICENSE.txt CREDITS.txt README-SDL.txt
%build %build
@ -154,6 +168,15 @@ install -p -m 644 %{SOURCE1} %{buildroot}%{_includedir}/SDL2/SDL_config.h
%{_libdir}/lib*.a %{_libdir}/lib*.a
%changelog %changelog
* Sun Sep 26 2021 Neal Gompa <ngompa@fedoraproject.org> - 2.0.16-3
- Backport select fixes from upstream
+ Support legacy 'pulse' alias for PulseAudio driver
+ Fix handling of Ctrl key on Wayland
+ Add support for HiDPI cursors on Wayland
+ Fix keymap support on Wayland (rhbz#2007969)
+ Use EGL_EXT_present_opaque when available on Wayland
+ Expose xdg_toplevel to SysWM on Wayland
* Sun Aug 22 2021 Neal Gompa <ngompa@fedoraproject.org> - 2.0.16-2 * Sun Aug 22 2021 Neal Gompa <ngompa@fedoraproject.org> - 2.0.16-2
- Ensure libdecor is pulled in when libwayland-client is (rhbz#1992804) - Ensure libdecor is pulled in when libwayland-client is (rhbz#1992804)