SDL2/SDL2-wayland-fixes.patch
Kalev Lember 32e6c272b3 Backport Wayland fixes from upstream
This includes revisions 10096 10098 10099 10113 10114 10119 10120 10130
10154 10302 10303 10304.
2016-09-05 16:23:21 +02:00

1225 lines
46 KiB
Diff

# HG changeset patch
# User Jonas Ådahl <jadahl@gmail.com>
# Date 1455693260 -28800
# Wed Feb 17 15:14:20 2016 +0800
# Node ID 330f500d5815801a22125bcc9836f769d6a661c9
# Parent 0897c3accd52754bcda428286bcfd64d78b9718f
wayland: Add wl_proxy_marshal_constructor_versioned sym
wl_proxy_marshal_constructor_versioned was introduce in wayland-client 1.10.
diff -r 0897c3accd52 -r 330f500d5815 src/video/wayland/SDL_waylanddyn.h
--- a/src/video/wayland/SDL_waylanddyn.h Thu Feb 25 10:06:33 2016 -0800
+++ b/src/video/wayland/SDL_waylanddyn.h Wed Feb 17 15:14:20 2016 +0800
@@ -76,6 +76,7 @@
#define wl_proxy_get_user_data (*WAYLAND_wl_proxy_get_user_data)
#define wl_proxy_add_listener (*WAYLAND_wl_proxy_add_listener)
#define wl_proxy_marshal_constructor (*WAYLAND_wl_proxy_marshal_constructor)
+#define wl_proxy_marshal_constructor_versioned (*WAYLAND_wl_proxy_marshal_constructor_versioned)
#define wl_seat_interface (*WAYLAND_wl_seat_interface)
#define wl_surface_interface (*WAYLAND_wl_surface_interface)
diff -r 0897c3accd52 -r 330f500d5815 src/video/wayland/SDL_waylandsym.h
--- a/src/video/wayland/SDL_waylandsym.h Thu Feb 25 10:06:33 2016 -0800
+++ b/src/video/wayland/SDL_waylandsym.h Wed Feb 17 15:14:20 2016 +0800
@@ -67,6 +67,9 @@
SDL_WAYLAND_MODULE(WAYLAND_CLIENT_1_4)
SDL_WAYLAND_SYM(struct wl_proxy *, wl_proxy_marshal_constructor, (struct wl_proxy *, uint32_t opcode, const struct wl_interface *interface, ...))
+SDL_WAYLAND_MODULE(WAYLAND_CLIENT_1_10)
+SDL_WAYLAND_SYM(struct wl_proxy *, wl_proxy_marshal_constructor_versioned, (struct wl_proxy *proxy, uint32_t opcode, const struct wl_interface *interface, uint32_t version, ...))
+
SDL_WAYLAND_INTERFACE(wl_seat_interface)
SDL_WAYLAND_INTERFACE(wl_surface_interface)
SDL_WAYLAND_INTERFACE(wl_shm_pool_interface)
# HG changeset patch
# User Philipp Wiesemann <philipp.wiesemann@arcor.de>
# Date 1456946709 -3600
# Wed Mar 02 20:25:09 2016 +0100
# Node ID 91b34fbbb88e5b69c8b535bd01d530913bcd5112
# Parent 06085b9c73efe0b36ec04f50abd7cf019faab699
Wayland: Fixed crash if allocating memory for cursor failed.
Also added missing error message if first allocation failed.
diff -r 06085b9c73ef -r 91b34fbbb88e src/video/wayland/SDL_waylandmouse.c
--- a/src/video/wayland/SDL_waylandmouse.c Wed Mar 02 20:24:43 2016 +0100
+++ b/src/video/wayland/SDL_waylandmouse.c Wed Mar 02 20:25:09 2016 +0100
@@ -159,6 +159,11 @@
SDL_VideoDevice *vd = SDL_GetVideoDevice ();
SDL_VideoData *wd = (SDL_VideoData *) vd->driverdata;
Wayland_CursorData *data = calloc (1, sizeof (Wayland_CursorData));
+ if (!data) {
+ SDL_OutOfMemory();
+ free(cursor);
+ return NULL;
+ }
cursor->driverdata = (void *) data;
/* Assume ARGB8888 */
@@ -187,6 +192,8 @@
data->hot_y = hot_y;
data->w = surface->w;
data->h = surface->h;
+ } else {
+ SDL_OutOfMemory();
}
return cursor;
@@ -200,6 +207,11 @@
cursor = calloc(1, sizeof (*cursor));
if (cursor) {
Wayland_CursorData *data = calloc (1, sizeof (Wayland_CursorData));
+ if (!data) {
+ SDL_OutOfMemory();
+ free(cursor);
+ return NULL;
+ }
cursor->driverdata = (void *) data;
data->buffer = WAYLAND_wl_cursor_image_get_buffer(wlcursor->images[0]);
# HG changeset patch
# User Philipp Wiesemann <philipp.wiesemann@arcor.de>
# Date 1456946723 -3600
# Wed Mar 02 20:25:23 2016 +0100
# Node ID c7932bb6dcee76e6af0e7b4b52b4b63dc1ee5d13
# Parent 91b34fbbb88e5b69c8b535bd01d530913bcd5112
Wayland: Fixed fault in event handling which might have caused a crash someday.
Found by Cppcheck.
diff -r 91b34fbbb88e -r c7932bb6dcee src/video/wayland/SDL_waylandevents.c
--- a/src/video/wayland/SDL_waylandevents.c Wed Mar 02 20:25:09 2016 +0100
+++ b/src/video/wayland/SDL_waylandevents.c Wed Mar 02 20:25:23 2016 +0100
@@ -302,9 +302,9 @@
window = wl_surface_get_user_data(surface);
- input->keyboard_focus = window;
- window->keyboard_device = input;
if (window) {
+ input->keyboard_focus = window;
+ window->keyboard_device = input;
SDL_SetKeyboardFocus(window->sdlwindow);
}
}
# HG changeset patch
# User Philipp Wiesemann <philipp.wiesemann@arcor.de>
# Date 1457730590 -3600
# Fri Mar 11 22:09:50 2016 +0100
# Node ID 991977532d7fee8bfaeb4572c47f376e15bcc698
# Parent f3c18811079dde1dfb2795977e92cfdb80fae5e3
Wayland: Fixed showing created cursors incorrectly before the first redraw.
diff -r f3c18811079d -r 991977532d7f src/video/wayland/SDL_waylandmouse.c
--- a/src/video/wayland/SDL_waylandmouse.c Thu Mar 10 21:00:44 2016 +0100
+++ b/src/video/wayland/SDL_waylandmouse.c Fri Mar 11 22:09:50 2016 +0100
@@ -334,13 +334,13 @@
{
Wayland_CursorData *data = cursor->driverdata;
- 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);
wl_pointer_set_cursor (pointer, 0,
data->surface,
data->hot_x,
data->hot_y);
+ 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
{
# HG changeset patch
# User Philipp Wiesemann <philipp.wiesemann@arcor.de>
# Date 1457730615 -3600
# Fri Mar 11 22:10:15 2016 +0100
# Node ID 6740b15172f008635eb71189141d86663b630e7c
# Parent 991977532d7fee8bfaeb4572c47f376e15bcc698
Wayland: Fixed drawing created cursors without transparency.
diff -r 991977532d7f -r 6740b15172f0 src/video/wayland/SDL_waylandmouse.c
--- a/src/video/wayland/SDL_waylandmouse.c Fri Mar 11 22:09:50 2016 +0100
+++ b/src/video/wayland/SDL_waylandmouse.c Fri Mar 11 22:10:15 2016 +0100
@@ -174,7 +174,7 @@
if (create_buffer_from_shm (data,
surface->w,
surface->h,
- WL_SHM_FORMAT_XRGB8888) < 0)
+ WL_SHM_FORMAT_ARGB8888) < 0)
{
free (cursor->driverdata);
free (cursor);
# HG changeset patch
# User Philipp Wiesemann <philipp.wiesemann@arcor.de>
# Date 1458162563 -3600
# Wed Mar 16 22:09:23 2016 +0100
# Node ID ac9831ff70d1b8bdba3462c19b4fec4a8fe1c9cc
# Parent 7552aa4c1c6db44ce04dfb76c4f3603977382185
Wayland: Fixed storing a theme cursor which is never used in video data.
diff -r 7552aa4c1c6d -r ac9831ff70d1 src/video/wayland/SDL_waylandvideo.c
--- a/src/video/wayland/SDL_waylandvideo.c Fri Mar 11 08:33:47 2016 -0800
+++ b/src/video/wayland/SDL_waylandvideo.c Wed Mar 16 22:09:23 2016 +0100
@@ -253,7 +253,6 @@
} else if (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);
- d->default_cursor = WAYLAND_wl_cursor_theme_get_cursor(d->cursor_theme, "left_ptr");
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
} else if (strcmp(interface, "qt_touch_extension") == 0) {
diff -r 7552aa4c1c6d -r ac9831ff70d1 src/video/wayland/SDL_waylandvideo.h
--- a/src/video/wayland/SDL_waylandvideo.h Fri Mar 11 08:33:47 2016 -0800
+++ b/src/video/wayland/SDL_waylandvideo.h Wed Mar 16 22:09:23 2016 +0100
@@ -42,7 +42,6 @@
struct wl_compositor *compositor;
struct wl_shm *shm;
struct wl_cursor_theme *cursor_theme;
- struct wl_cursor *default_cursor;
struct wl_pointer *pointer;
struct wl_shell *shell;
# HG changeset patch
# User Philipp Wiesemann <philipp.wiesemann@arcor.de>
# Date 1458162579 -3600
# Wed Mar 16 22:09:39 2016 +0100
# Node ID f49e8a97c21463ce8c83a136deb945b9d4578906
# Parent ac9831ff70d1b8bdba3462c19b4fec4a8fe1c9cc
Wayland: Fixed crash if memory mapping failed while creating a custom cursor.
diff -r ac9831ff70d1 -r f49e8a97c214 src/video/wayland/SDL_waylandmouse.c
--- a/src/video/wayland/SDL_waylandmouse.c Wed Mar 16 22:09:23 2016 +0100
+++ b/src/video/wayland/SDL_waylandmouse.c Wed Mar 16 22:09:39 2016 +0100
@@ -130,6 +130,7 @@
d->shm_data = NULL;
fprintf (stderr, "mmap () failed\n");
close (shm_fd);
+ return -1;
}
shm_pool = wl_shm_create_pool(data->shm, shm_fd, size);
# HG changeset patch
# User Philipp Wiesemann <philipp.wiesemann@arcor.de>
# Date 1459191784 -7200
# Mon Mar 28 21:03:04 2016 +0200
# Node ID eba8155e32b10db71ab97202bd92417c417bc534
# Parent b1e3eae293a2f141c1936ac52b4d686cbf0a6649
Wayland: Fixed missing error message if creating a custom cursor failed.
SDL_GetError() returned no error message because it was written to stderr only.
diff -r b1e3eae293a2 -r eba8155e32b1 src/video/wayland/SDL_waylandmouse.c
--- a/src/video/wayland/SDL_waylandmouse.c Mon Mar 28 21:02:30 2016 +0200
+++ b/src/video/wayland/SDL_waylandmouse.c Mon Mar 28 21:03:04 2016 +0200
@@ -116,8 +116,7 @@
shm_fd = wayland_create_tmp_file(size);
if (shm_fd < 0)
{
- fprintf(stderr, "creating mouse cursor buffer failed!\n");
- return -1;
+ return SDL_SetError("Creating mouse cursor buffer failed.");
}
d->shm_data = mmap(NULL,
@@ -128,9 +127,8 @@
0);
if (d->shm_data == MAP_FAILED) {
d->shm_data = NULL;
- fprintf (stderr, "mmap () failed\n");
close (shm_fd);
- return -1;
+ return SDL_SetError("mmap() failed.");
}
shm_pool = wl_shm_create_pool(data->shm, shm_fd, size);
# HG changeset patch
# User Philipp Wiesemann <philipp.wiesemann@arcor.de>
# Date 1460661103 -7200
# Thu Apr 14 21:11:43 2016 +0200
# Node ID fae27a079fcb77cf051fbd617f79ba6313ce3554
# Parent 2abd425e41dcd153ba6ee3cb84b3c9c9d0365e6c
Wayland: Removed not needed including and setting of errno.
One internal function was setting errno on error but it was not read afterwards.
diff -r 2abd425e41dc -r fae27a079fcb src/video/wayland/SDL_waylandevents.c
--- a/src/video/wayland/SDL_waylandevents.c Thu Apr 14 21:10:57 2016 +0200
+++ b/src/video/wayland/SDL_waylandevents.c Thu Apr 14 21:11:43 2016 +0200
@@ -40,7 +40,6 @@
#include <sys/select.h>
#include <sys/mman.h>
#include <poll.h>
-#include <errno.h>
#include <unistd.h>
#include <xkbcommon/xkbcommon.h>
diff -r 2abd425e41dc -r fae27a079fcb src/video/wayland/SDL_waylandmouse.c
--- a/src/video/wayland/SDL_waylandmouse.c Thu Apr 14 21:10:57 2016 +0200
+++ b/src/video/wayland/SDL_waylandmouse.c Thu Apr 14 21:11:43 2016 +0200
@@ -27,7 +27,6 @@
#define _GNU_SOURCE
#endif
-#include <errno.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <fcntl.h>
@@ -70,7 +69,6 @@
xdg_path = SDL_getenv("XDG_RUNTIME_DIR");
if (!xdg_path) {
- errno = ENOENT;
return -1;
}
# HG changeset patch
# User Bastien Nocera <hadess@hadess.net>
# Date 1472718178 25200
# Thu Sep 01 01:22:58 2016 -0700
# Node ID 729eff9ee77adc29f100da2cd3310b240eb3e29e
# Parent a25d9c643cfbb62c0551917996d7a61b42b18f0b
Wayland: Set "class" for each window we create
This will be used by Wayland compositors to match the application ID and
.desktop file to the SDL window(s).
Applications can set the SDL_VIDEO_WAYLAND_WMCLASS environemnt variable
early in the process to override using the binary name as a fallback.
Note that we also support the SDL_VIDEO_X11_WMCLASS in the Wayland
backend so that if a program correctly associated the desktop file with
the window under X11, only a newer SDL would be needed for it to work
under Wayland.
https://bugzilla.libsdl.org/show_bug.cgi?id=3376
diff -r a25d9c643cfb -r 729eff9ee77a src/video/wayland/SDL_waylandvideo.c
--- a/src/video/wayland/SDL_waylandvideo.c Wed Aug 31 16:10:04 2016 -0400
+++ b/src/video/wayland/SDL_waylandvideo.c Thu Sep 01 01:22:58 2016 -0700
@@ -35,6 +35,8 @@
#include "SDL_waylandmouse.h"
#include "SDL_waylandtouch.h"
+#include <sys/types.h>
+#include <unistd.h>
#include <fcntl.h>
#include <xkbcommon/xkbcommon.h>
@@ -55,6 +57,56 @@
static void
Wayland_VideoQuit(_THIS);
+/* Find out what class name we should use
+ * Based on src/video/x11/SDL_x11video.c */
+static char *
+get_classname()
+{
+ char *spot;
+#if defined(__LINUX__) || defined(__FREEBSD__)
+ char procfile[1024];
+ char linkfile[1024];
+ int linksize;
+#endif
+
+ /* First allow environment variable override */
+ spot = SDL_getenv("SDL_VIDEO_WAYLAND_WMCLASS");
+ if (spot) {
+ return SDL_strdup(spot);
+ } else {
+ /* Fallback to the "old" envvar */
+ spot = SDL_getenv("SDL_VIDEO_X11_WMCLASS");
+ if (spot) {
+ return SDL_strdup(spot);
+ }
+ }
+
+ /* Next look at the application's executable name */
+#if defined(__LINUX__) || defined(__FREEBSD__)
+#if defined(__LINUX__)
+ SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/exe", getpid());
+#elif defined(__FREEBSD__)
+ SDL_snprintf(procfile, SDL_arraysize(procfile), "/proc/%d/file",
+ getpid());
+#else
+#error Where can we find the executable name?
+#endif
+ linksize = readlink(procfile, linkfile, sizeof(linkfile) - 1);
+ if (linksize > 0) {
+ linkfile[linksize] = '\0';
+ spot = SDL_strrchr(linkfile, '/');
+ if (spot) {
+ return SDL_strdup(spot + 1);
+ } else {
+ return SDL_strdup(linkfile);
+ }
+ }
+#endif /* __LINUX__ || __FREEBSD__ */
+
+ /* Finally use the default we've used forever */
+ return SDL_strdup("SDL_App");
+}
+
/* Wayland driver bootstrap functions */
static int
Wayland_Available(void)
@@ -307,6 +359,9 @@
Wayland_InitMouse();
+ /* Get the surface class name, usually the name of the application */
+ data->classname = get_classname();
+
WAYLAND_wl_display_flush(data->display);
return 0;
@@ -375,6 +430,7 @@
WAYLAND_wl_display_disconnect(data->display);
}
+ SDL_free(data->classname);
free(data);
_this->driverdata = NULL;
}
diff -r a25d9c643cfb -r 729eff9ee77a src/video/wayland/SDL_waylandvideo.h
--- a/src/video/wayland/SDL_waylandvideo.h Wed Aug 31 16:10:04 2016 -0400
+++ b/src/video/wayland/SDL_waylandvideo.h Thu Sep 01 01:22:58 2016 -0700
@@ -57,6 +57,8 @@
struct qt_surface_extension *surface_extension;
struct qt_windowmanager *windowmanager;
#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
+
+ char *classname;
} SDL_VideoData;
#endif /* _SDL_waylandvideo_h */
diff -r a25d9c643cfb -r 729eff9ee77a src/video/wayland/SDL_waylandwindow.c
--- a/src/video/wayland/SDL_waylandwindow.c Wed Aug 31 16:10:04 2016 -0400
+++ b/src/video/wayland/SDL_waylandwindow.c Thu Sep 01 01:22:58 2016 -0700
@@ -178,6 +178,7 @@
wl_surface_set_user_data(data->surface, data);
data->shell_surface = wl_shell_get_shell_surface(c->shell,
data->surface);
+ wl_shell_surface_set_class (data->shell_surface, c->classname);
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
if (c->surface_extension) {
data->extended_surface = qt_surface_extension_get_extended_surface(
# HG changeset patch
# User Jonas Ådahl <jadahl@gmail.com>
# Date 1466678345 -28800
# Thu Jun 23 18:39:05 2016 +0800
# Node ID b326f93e1bc5362cac076800cea06af5301fa3bd
# Parent 729eff9ee77adc29f100da2cd3310b240eb3e29e
wayland: Build own version of core protocol
Since we are loading shared objects dynamically, build our own version of the
core protocol symbols, so that we in the future can include protocol
extensions.
diff -r 729eff9ee77a -r b326f93e1bc5 Makefile.in
--- a/Makefile.in Thu Sep 01 01:22:58 2016 -0700
+++ b/Makefile.in Thu Jun 23 18:39:05 2016 +0800
@@ -3,6 +3,7 @@
top_builddir = .
srcdir = @srcdir@
objects = build
+gen = gen
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
@@ -31,6 +32,8 @@
TARGET = libSDL2.la
OBJECTS = @OBJECTS@
+GEN_HEADERS = @GEN_HEADERS@
+GEN_OBJECTS = @GEN_OBJECTS@
VERSION_OBJECTS = @VERSION_OBJECTS@
SDLMAIN_TARGET = libSDL2main.a
@@ -39,6 +42,8 @@
SDLTEST_TARGET = libSDL2_test.a
SDLTEST_OBJECTS = @SDLTEST_OBJECTS@
+WAYLAND_SCANNER = @WAYLAND_SCANNER@
+
SRC_DIST = *.txt acinclude Android.mk autogen.sh android-project build-scripts cmake cmake_uninstall.cmake.in configure configure.in debian docs include Makefile.* sdl2-config.cmake.in sdl2-config.in sdl2.m4 sdl2.pc.in SDL2.spec.in src test VisualC.html VisualC VisualC-WinRT Xcode Xcode-iOS
GEN_DIST = SDL2.spec
@@ -48,6 +53,7 @@
RUN_CMD_CXX = @echo " CXX " $@;
RUN_CMD_LTLINK = @echo " LTLINK" $@;
RUN_CMD_RANLIB = @echo " RANLIB" $@;
+RUN_CMD_GEN = @echo " GEN " $@;
LIBTOOL += --quiet
endif
@@ -137,8 +143,8 @@
.PHONY: all update-revision install install-bin install-hdrs install-lib install-data uninstall uninstall-bin uninstall-hdrs uninstall-lib uninstall-data clean distclean dist $(OBJECTS:.lo=.d)
-$(objects)/$(TARGET): $(OBJECTS) $(VERSION_OBJECTS)
- $(RUN_CMD_LTLINK)$(LIBTOOL) --tag=CC --mode=link $(CC) -o $@ $(OBJECTS) $(VERSION_OBJECTS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LT_LDFLAGS)
+$(objects)/$(TARGET): $(GEN_HEADERS) $(GEN_OBJECTS) $(OBJECTS) $(VERSION_OBJECTS)
+ $(RUN_CMD_LTLINK)$(LIBTOOL) --tag=CC --mode=link $(CC) -o $@ $(OBJECTS) $(GEN_OBJECTS) $(VERSION_OBJECTS) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LT_LDFLAGS)
$(objects)/$(SDLMAIN_TARGET): $(SDLMAIN_OBJECTS)
$(RUN_CMD_AR)$(AR) cru $@ $(SDLMAIN_OBJECTS)
@@ -200,6 +206,7 @@
clean:
rm -rf $(objects)
+ rm -rf $(gen)
if test -f test/Makefile; then (cd test; $(MAKE) $@); fi
distclean: clean
diff -r 729eff9ee77a -r b326f93e1bc5 configure
--- a/configure Thu Sep 01 01:22:58 2016 -0700
+++ b/configure Thu Jun 23 18:39:05 2016 +0800
@@ -630,6 +630,7 @@
#endif"
ac_subst_vars='LTLIBOBJS
+WAYLAND_SCANNER
EXTRA_LDFLAGS
BUILD_LDFLAGS
EXTRA_CFLAGS
@@ -637,6 +638,8 @@
SDLTEST_OBJECTS
SDLMAIN_OBJECTS
VERSION_OBJECTS
+GEN_OBJECTS
+GEN_HEADERS
OBJECTS
INCLUDE
ac_aux_dir
@@ -18804,9 +18807,11 @@
if test x$PKG_CONFIG != xno && \
test x$video_opengl_egl = xyes && \
test x$video_opengles_v2 = xyes; then
- if $PKG_CONFIG --exists wayland-client wayland-egl wayland-cursor egl xkbcommon ; then
+ if $PKG_CONFIG --exists wayland-client wayland-scanner wayland-egl wayland-cursor egl xkbcommon ; then
WAYLAND_CFLAGS=`$PKG_CONFIG --cflags wayland-client wayland-egl wayland-cursor xkbcommon`
WAYLAND_LIBS=`$PKG_CONFIG --libs wayland-client wayland-egl wayland-cursor xkbcommon`
+ WAYLAND_SCANNER=`$PKG_CONFIG --variable=wayland_scanner wayland-scanner`
+ WAYLAND_CORE_PROTOCOL_DIR=`$PKG_CONFIG --variable=pkgdatadir wayland-client`
video_wayland=yes
fi
fi
@@ -18823,7 +18828,7 @@
fi
SOURCES="$SOURCES $srcdir/src/video/wayland/*.c"
- EXTRA_CFLAGS="$EXTRA_CFLAGS $WAYLAND_CFLAGS"
+ EXTRA_CFLAGS="$EXTRA_CFLAGS $WAYLAND_CFLAGS -I\$(gen)"
# Check whether --enable-wayland-shared was given.
if test "${enable_wayland_shared+set}" = set; then :
enableval=$enable_wayland_shared;
@@ -23728,6 +23733,33 @@
fi
SDLTEST_SOURCES="$srcdir/src/test/*.c"
+if test x$video_wayland = xyes; then
+ WAYLAND_CORE_PROTOCOL_SOURCE='$(gen)/wayland-protocol.c'
+ WAYLAND_CORE_PROTOCOL_HEADER='$(gen)/wayland-client-protocol.h'
+ GEN_SOURCES="$GEN_SOURCES $WAYLAND_CORE_PROTOCOL_SOURCE"
+ GEN_HEADERS="$GEN_HEADERS $WAYLAND_CORE_PROTOCOL_HEADER"
+
+ WAYLAND_CORE_PROTOCOL_SOURCE_DEPENDS="
+$WAYLAND_CORE_PROTOCOL_SOURCE: $WAYLAND_CORE_PROTOCOL_DIR/wayland.xml
+ \$(SHELL) \$(auxdir)/mkinstalldirs \$(gen)
+ \$(RUN_CMD_GEN)\$(WAYLAND_SCANNER) code \$< \$@"
+
+ WAYLAND_CORE_PROTOCOL_HEADER_DEPENDS="
+$WAYLAND_CORE_PROTOCOL_HEADER: $WAYLAND_CORE_PROTOCOL_DIR/wayland.xml
+ \$(SHELL) \$(auxdir)/mkinstalldirs \$(gen)
+ \$(RUN_CMD_GEN)\$(WAYLAND_SCANNER) client-header \$< \$@"
+
+ WAYLAND_CORE_PROTOCOL_OBJECT="
+\$(objects)/`echo $WAYLAND_CORE_PROTOCOL_SOURCE | sed 's/\$(gen)\/\(.*\).c$/\1.lo/'`: $WAYLAND_CORE_PROTOCOL_SOURCE
+ \$(RUN_CMD_CC)\$(LIBTOOL) --tag=CC --mode=compile \$(CC) \$(CFLAGS) \$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \$< -o \$@"
+
+ WAYLAND_PROTOCOLS_DEPENDS="
+$WAYLAND_CORE_PROTOCOL_SOURCE_DEPENDS
+$WAYLAND_CORE_PROTOCOL_HEADER_DEPENDS
+$WAYLAND_CORE_PROTOCOL_OBJECT
+"
+fi
+
OBJECTS=`echo $SOURCES`
DEPENDS=`echo $SOURCES | tr ' ' '\n'`
for EXT in asm cc m c S; do
@@ -23737,6 +23769,8 @@
\\$(RUN_CMD_CC)\\$(LIBTOOL) --tag=CC --mode=compile \\$(CC) \\$(CFLAGS) \\$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \\$< -o \\$@,g"`
done
+GEN_OBJECTS=`echo "$GEN_SOURCES" | sed 's,[^ ]*/\([^ ]*\)\.c,$(objects)/\1.lo,g'`
+
VERSION_OBJECTS=`echo $VERSION_SOURCES`
VERSION_DEPENDS=`echo $VERSION_SOURCES`
VERSION_OBJECTS=`echo "$VERSION_OBJECTS" | sed 's,[^ ]*/\([^ ]*\)\.rc,$(objects)/\1.o,g'`
@@ -23838,6 +23872,9 @@
+
+
+
cat >Makefile.rules <<__EOF__
# Build rules for objects
@@ -23849,6 +23886,7 @@
$VERSION_DEPENDS
$SDLMAIN_DEPENDS
$SDLTEST_DEPENDS
+$WAYLAND_PROTOCOLS_DEPENDS
__EOF__
ac_config_files="$ac_config_files Makefile:Makefile.in:Makefile.rules sdl2-config sdl2-config.cmake SDL2.spec sdl2.pc"
diff -r 729eff9ee77a -r b326f93e1bc5 configure.in
--- a/configure.in Thu Sep 01 01:22:58 2016 -0700
+++ b/configure.in Thu Jun 23 18:39:05 2016 +0800
@@ -1201,9 +1201,11 @@
if test x$PKG_CONFIG != xno && \
test x$video_opengl_egl = xyes && \
test x$video_opengles_v2 = xyes; then
- if $PKG_CONFIG --exists wayland-client wayland-egl wayland-cursor egl xkbcommon ; then
+ if $PKG_CONFIG --exists wayland-client wayland-scanner wayland-egl wayland-cursor egl xkbcommon ; then
WAYLAND_CFLAGS=`$PKG_CONFIG --cflags wayland-client wayland-egl wayland-cursor xkbcommon`
WAYLAND_LIBS=`$PKG_CONFIG --libs wayland-client wayland-egl wayland-cursor xkbcommon`
+ WAYLAND_SCANNER=`$PKG_CONFIG --variable=wayland_scanner wayland-scanner`
+ WAYLAND_CORE_PROTOCOL_DIR=`$PKG_CONFIG --variable=pkgdatadir wayland-client`
video_wayland=yes
fi
fi
@@ -1215,7 +1217,7 @@
AC_DEFINE(SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH, 1, [ ])
fi
SOURCES="$SOURCES $srcdir/src/video/wayland/*.c"
- EXTRA_CFLAGS="$EXTRA_CFLAGS $WAYLAND_CFLAGS"
+ EXTRA_CFLAGS="$EXTRA_CFLAGS $WAYLAND_CFLAGS -I\$(gen)"
AC_ARG_ENABLE(wayland-shared,
AC_HELP_STRING([--enable-wayland-shared], [dynamically load Wayland support [[default=maybe]]]),
, enable_wayland_shared=maybe)
@@ -3481,6 +3483,33 @@
fi
SDLTEST_SOURCES="$srcdir/src/test/*.c"
+if test x$video_wayland = xyes; then
+ WAYLAND_CORE_PROTOCOL_SOURCE='$(gen)/wayland-protocol.c'
+ WAYLAND_CORE_PROTOCOL_HEADER='$(gen)/wayland-client-protocol.h'
+ GEN_SOURCES="$GEN_SOURCES $WAYLAND_CORE_PROTOCOL_SOURCE"
+ GEN_HEADERS="$GEN_HEADERS $WAYLAND_CORE_PROTOCOL_HEADER"
+
+ WAYLAND_CORE_PROTOCOL_SOURCE_DEPENDS="
+$WAYLAND_CORE_PROTOCOL_SOURCE: $WAYLAND_CORE_PROTOCOL_DIR/wayland.xml
+ \$(SHELL) \$(auxdir)/mkinstalldirs \$(gen)
+ \$(RUN_CMD_GEN)\$(WAYLAND_SCANNER) code \$< \$@"
+
+ WAYLAND_CORE_PROTOCOL_HEADER_DEPENDS="
+$WAYLAND_CORE_PROTOCOL_HEADER: $WAYLAND_CORE_PROTOCOL_DIR/wayland.xml
+ \$(SHELL) \$(auxdir)/mkinstalldirs \$(gen)
+ \$(RUN_CMD_GEN)\$(WAYLAND_SCANNER) client-header \$< \$@"
+
+ WAYLAND_CORE_PROTOCOL_OBJECT="
+\$(objects)/`echo $WAYLAND_CORE_PROTOCOL_SOURCE | sed 's/\$(gen)\/\(.*\).c$/\1.lo/'`: $WAYLAND_CORE_PROTOCOL_SOURCE
+ \$(RUN_CMD_CC)\$(LIBTOOL) --tag=CC --mode=compile \$(CC) \$(CFLAGS) \$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \$< -o \$@"
+
+ WAYLAND_PROTOCOLS_DEPENDS="
+$WAYLAND_CORE_PROTOCOL_SOURCE_DEPENDS
+$WAYLAND_CORE_PROTOCOL_HEADER_DEPENDS
+$WAYLAND_CORE_PROTOCOL_OBJECT
+"
+fi
+
OBJECTS=`echo $SOURCES`
DEPENDS=`echo $SOURCES | tr ' ' '\n'`
for EXT in asm cc m c S; do
@@ -3490,6 +3519,8 @@
\\$(RUN_CMD_CC)\\$(LIBTOOL) --tag=CC --mode=compile \\$(CC) \\$(CFLAGS) \\$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \\$< -o \\$@,g"`
done
+GEN_OBJECTS=`echo "$GEN_SOURCES" | sed 's,[[^ ]]*/\([[^ ]]*\)\.c,$(objects)/\1.lo,g'`
+
VERSION_OBJECTS=`echo $VERSION_SOURCES`
VERSION_DEPENDS=`echo $VERSION_SOURCES`
VERSION_OBJECTS=`echo "$VERSION_OBJECTS" | sed 's,[[^ ]]*/\([[^ ]]*\)\.rc,$(objects)/\1.o,g'`
@@ -3567,6 +3598,8 @@
AC_SUBST(ac_aux_dir)
AC_SUBST(INCLUDE)
AC_SUBST(OBJECTS)
+AC_SUBST(GEN_HEADERS)
+AC_SUBST(GEN_OBJECTS)
AC_SUBST(VERSION_OBJECTS)
AC_SUBST(SDLMAIN_OBJECTS)
AC_SUBST(SDLTEST_OBJECTS)
@@ -3575,6 +3608,7 @@
AC_SUBST(BUILD_LDFLAGS)
AC_SUBST(EXTRA_LDFLAGS)
AC_SUBST(WINDRES)
+AC_SUBST(WAYLAND_SCANNER)
cat >Makefile.rules <<__EOF__
@@ -3587,6 +3621,7 @@
$VERSION_DEPENDS
$SDLMAIN_DEPENDS
$SDLTEST_DEPENDS
+$WAYLAND_PROTOCOLS_DEPENDS
__EOF__
AC_CONFIG_FILES([
diff -r 729eff9ee77a -r b326f93e1bc5 src/video/wayland/SDL_waylanddyn.h
--- a/src/video/wayland/SDL_waylanddyn.h Thu Sep 01 01:22:58 2016 -0700
+++ b/src/video/wayland/SDL_waylanddyn.h Thu Jun 23 18:39:05 2016 +0800
@@ -94,7 +94,8 @@
#endif /* SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC */
-#include "wayland-client.h"
+#include "wayland-client-core.h"
+#include "wayland-client-protocol.h"
#include "wayland-egl.h"
#endif /* !defined _SDL_waylanddyn_h */
# HG changeset patch
# User Sam Lantinga <slouken@libsdl.org>
# Date 1472718416 25200
# Thu Sep 01 01:26:56 2016 -0700
# Node ID ee83e0b4a36f853ce1bcc23399549d438cb49896
# Parent b326f93e1bc5362cac076800cea06af5301fa3bd
wayland: Add support for relative mouse mode, by Jonas Ådahl <jadahl@gmail.com>
Generate the C protocol files from the protocol XML files installed by
wayland-protocols, and use them to implement support for relative pointer
motions and pointer locking.
Note that at the time, the protocol is unstable and may change in the future.
Any future breaking changes will, however, fail gracefully and result in no
regressions compared to before this patch.
diff -r b326f93e1bc5 -r ee83e0b4a36f configure
--- a/configure Thu Jun 23 18:39:05 2016 +0800
+++ b/configure Thu Sep 01 01:26:56 2016 -0700
@@ -18807,11 +18807,12 @@
if test x$PKG_CONFIG != xno && \
test x$video_opengl_egl = xyes && \
test x$video_opengles_v2 = xyes; then
- if $PKG_CONFIG --exists wayland-client wayland-scanner wayland-egl wayland-cursor egl xkbcommon ; then
+ if $PKG_CONFIG --exists wayland-client wayland-scanner wayland-protocols wayland-egl wayland-cursor egl xkbcommon ; then
WAYLAND_CFLAGS=`$PKG_CONFIG --cflags wayland-client wayland-egl wayland-cursor xkbcommon`
WAYLAND_LIBS=`$PKG_CONFIG --libs wayland-client wayland-egl wayland-cursor xkbcommon`
WAYLAND_SCANNER=`$PKG_CONFIG --variable=wayland_scanner wayland-scanner`
WAYLAND_CORE_PROTOCOL_DIR=`$PKG_CONFIG --variable=pkgdatadir wayland-client`
+ WAYLAND_PROTOCOLS_DIR=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`
video_wayland=yes
fi
fi
@@ -18827,6 +18828,9 @@
$as_echo "#define SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH 1" >>confdefs.h
fi
+
+ WAYLAND_PROTOCOLS_UNSTABLE="relative-pointer-unstable-v1 pointer-constraints-unstable-v1"
+
SOURCES="$SOURCES $srcdir/src/video/wayland/*.c"
EXTRA_CFLAGS="$EXTRA_CFLAGS $WAYLAND_CFLAGS -I\$(gen)"
# Check whether --enable-wayland-shared was given.
@@ -23736,8 +23740,12 @@
if test x$video_wayland = xyes; then
WAYLAND_CORE_PROTOCOL_SOURCE='$(gen)/wayland-protocol.c'
WAYLAND_CORE_PROTOCOL_HEADER='$(gen)/wayland-client-protocol.h'
- GEN_SOURCES="$GEN_SOURCES $WAYLAND_CORE_PROTOCOL_SOURCE"
- GEN_HEADERS="$GEN_HEADERS $WAYLAND_CORE_PROTOCOL_HEADER"
+ WAYLAND_PROTOCOLS_UNSTABLE_SOURCES=`echo $WAYLAND_PROTOCOLS_UNSTABLE |\
+ sed 's,[^ ]\+,\\$(gen)/&-protocol.c,g'`
+ WAYLAND_PROTOCOLS_UNSTABLE_HEADERS=`echo $WAYLAND_PROTOCOLS_UNSTABLE |\
+ sed 's,[^ ]\+,\\$(gen)/&-client-protocol.h,g'`
+ GEN_SOURCES="$GEN_SOURCES $WAYLAND_CORE_PROTOCOL_SOURCE $WAYLAND_PROTOCOLS_UNSTABLE_SOURCES"
+ GEN_HEADERS="$GEN_HEADERS $WAYLAND_CORE_PROTOCOL_HEADER $WAYLAND_PROTOCOLS_UNSTABLE_HEADERS"
WAYLAND_CORE_PROTOCOL_SOURCE_DEPENDS="
$WAYLAND_CORE_PROTOCOL_SOURCE: $WAYLAND_CORE_PROTOCOL_DIR/wayland.xml
@@ -23753,10 +23761,30 @@
\$(objects)/`echo $WAYLAND_CORE_PROTOCOL_SOURCE | sed 's/\$(gen)\/\(.*\).c$/\1.lo/'`: $WAYLAND_CORE_PROTOCOL_SOURCE
\$(RUN_CMD_CC)\$(LIBTOOL) --tag=CC --mode=compile \$(CC) \$(CFLAGS) \$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \$< -o \$@"
+ WAYLAND_PROTOCOLS_CLIENT_HEADER_UNSTABLE_DEPENDS=`for p in $WAYLAND_PROTOCOLS_UNSTABLE;\
+ do echo ; echo \$p | sed\
+ "s,^\\([a-z\\-]\\+\\)-unstable-\\(v[0-9]\+\\)\$,\\$(gen)/&-client-protocol.h: $WAYLAND_PROTOCOLS_DIR/unstable/\1/&.xml\\\\
+ \\$(SHELL) \\$(auxdir)/mkinstalldirs \\$(gen)\\\\
+ \\$(RUN_CMD_GEN)\\$(WAYLAND_SCANNER) client-header \\$< \\$@," ; done`
+
+ WAYLAND_PROTOCOLS_CODE_UNSTABLE_DEPENDS=`for p in $WAYLAND_PROTOCOLS_UNSTABLE;\
+ do echo ; echo \$p | sed\
+ "s,^\\([a-z\\-]\\+\\)-unstable-\\(v[0-9]\+\\)\$,\\$(gen)/&-protocol.c: $WAYLAND_PROTOCOLS_DIR/unstable/\1/&.xml\\\\
+ \\$(SHELL) \\$(auxdir)/mkinstalldirs \\$(gen)\\\\
+ \\$(RUN_CMD_GEN)\\$(WAYLAND_SCANNER) code \\$< \\$@," ; done`
+
+ WAYLAND_PROTOCOLS_OBJECTS_UNSTABLE=`for p in $WAYLAND_PROTOCOLS_UNSTABLE;\
+ do echo ; echo \$p | sed\
+ "s,^\\([a-z\\-]\\+\\)-unstable-\\(v[0-9]\+\\)\$,\\\$(objects)/&-protocol.lo: \\$(gen)/&-protocol.c \\$(gen)/&-client-protocol.h\\\\
+ \\$(RUN_CMD_CC)\\$(LIBTOOL) --tag=CC --mode=compile \\$(CC) \\$(CFLAGS) \\$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \\$< -o \\$@," ; done`
+
WAYLAND_PROTOCOLS_DEPENDS="
$WAYLAND_CORE_PROTOCOL_SOURCE_DEPENDS
$WAYLAND_CORE_PROTOCOL_HEADER_DEPENDS
$WAYLAND_CORE_PROTOCOL_OBJECT
+$WAYLAND_PROTOCOLS_CLIENT_HEADER_UNSTABLE_DEPENDS
+$WAYLAND_PROTOCOLS_CODE_UNSTABLE_DEPENDS
+$WAYLAND_PROTOCOLS_OBJECTS_UNSTABLE
"
fi
diff -r b326f93e1bc5 -r ee83e0b4a36f configure.in
--- a/configure.in Thu Jun 23 18:39:05 2016 +0800
+++ b/configure.in Thu Sep 01 01:26:56 2016 -0700
@@ -1201,11 +1201,12 @@
if test x$PKG_CONFIG != xno && \
test x$video_opengl_egl = xyes && \
test x$video_opengles_v2 = xyes; then
- if $PKG_CONFIG --exists wayland-client wayland-scanner wayland-egl wayland-cursor egl xkbcommon ; then
+ if $PKG_CONFIG --exists wayland-client wayland-scanner wayland-protocols wayland-egl wayland-cursor egl xkbcommon ; then
WAYLAND_CFLAGS=`$PKG_CONFIG --cflags wayland-client wayland-egl wayland-cursor xkbcommon`
WAYLAND_LIBS=`$PKG_CONFIG --libs wayland-client wayland-egl wayland-cursor xkbcommon`
WAYLAND_SCANNER=`$PKG_CONFIG --variable=wayland_scanner wayland-scanner`
WAYLAND_CORE_PROTOCOL_DIR=`$PKG_CONFIG --variable=pkgdatadir wayland-client`
+ WAYLAND_PROTOCOLS_DIR=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`
video_wayland=yes
fi
fi
@@ -1216,6 +1217,9 @@
if test x$enable_video_wayland_qt_touch = xyes; then
AC_DEFINE(SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH, 1, [ ])
fi
+
+ WAYLAND_PROTOCOLS_UNSTABLE="relative-pointer-unstable-v1 pointer-constraints-unstable-v1"
+
SOURCES="$SOURCES $srcdir/src/video/wayland/*.c"
EXTRA_CFLAGS="$EXTRA_CFLAGS $WAYLAND_CFLAGS -I\$(gen)"
AC_ARG_ENABLE(wayland-shared,
@@ -3486,8 +3490,12 @@
if test x$video_wayland = xyes; then
WAYLAND_CORE_PROTOCOL_SOURCE='$(gen)/wayland-protocol.c'
WAYLAND_CORE_PROTOCOL_HEADER='$(gen)/wayland-client-protocol.h'
- GEN_SOURCES="$GEN_SOURCES $WAYLAND_CORE_PROTOCOL_SOURCE"
- GEN_HEADERS="$GEN_HEADERS $WAYLAND_CORE_PROTOCOL_HEADER"
+ WAYLAND_PROTOCOLS_UNSTABLE_SOURCES=`echo $WAYLAND_PROTOCOLS_UNSTABLE |\
+ sed 's,[[^ ]]\+,\\$(gen)/&-protocol.c,g'`
+ WAYLAND_PROTOCOLS_UNSTABLE_HEADERS=`echo $WAYLAND_PROTOCOLS_UNSTABLE |\
+ sed 's,[[^ ]]\+,\\$(gen)/&-client-protocol.h,g'`
+ GEN_SOURCES="$GEN_SOURCES $WAYLAND_CORE_PROTOCOL_SOURCE $WAYLAND_PROTOCOLS_UNSTABLE_SOURCES"
+ GEN_HEADERS="$GEN_HEADERS $WAYLAND_CORE_PROTOCOL_HEADER $WAYLAND_PROTOCOLS_UNSTABLE_HEADERS"
WAYLAND_CORE_PROTOCOL_SOURCE_DEPENDS="
$WAYLAND_CORE_PROTOCOL_SOURCE: $WAYLAND_CORE_PROTOCOL_DIR/wayland.xml
@@ -3503,10 +3511,30 @@
\$(objects)/`echo $WAYLAND_CORE_PROTOCOL_SOURCE | sed 's/\$(gen)\/\(.*\).c$/\1.lo/'`: $WAYLAND_CORE_PROTOCOL_SOURCE
\$(RUN_CMD_CC)\$(LIBTOOL) --tag=CC --mode=compile \$(CC) \$(CFLAGS) \$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \$< -o \$@"
+ WAYLAND_PROTOCOLS_CLIENT_HEADER_UNSTABLE_DEPENDS=`for p in $WAYLAND_PROTOCOLS_UNSTABLE;\
+ do echo ; echo \$p | sed\
+ "s,^\\([[a-z\\-]]\\+\\)-unstable-\\(v[[0-9]]\+\\)\$,\\$(gen)/&-client-protocol.h: $WAYLAND_PROTOCOLS_DIR/unstable/\1/&.xml\\\\
+ \\$(SHELL) \\$(auxdir)/mkinstalldirs \\$(gen)\\\\
+ \\$(RUN_CMD_GEN)\\$(WAYLAND_SCANNER) client-header \\$< \\$@," ; done`
+
+ WAYLAND_PROTOCOLS_CODE_UNSTABLE_DEPENDS=`for p in $WAYLAND_PROTOCOLS_UNSTABLE;\
+ do echo ; echo \$p | sed\
+ "s,^\\([[a-z\\-]]\\+\\)-unstable-\\(v[[0-9]]\+\\)\$,\\$(gen)/&-protocol.c: $WAYLAND_PROTOCOLS_DIR/unstable/\1/&.xml\\\\
+ \\$(SHELL) \\$(auxdir)/mkinstalldirs \\$(gen)\\\\
+ \\$(RUN_CMD_GEN)\\$(WAYLAND_SCANNER) code \\$< \\$@," ; done`
+
+ WAYLAND_PROTOCOLS_OBJECTS_UNSTABLE=`for p in $WAYLAND_PROTOCOLS_UNSTABLE;\
+ do echo ; echo \$p | sed\
+ "s,^\\([[a-z\\-]]\\+\\)-unstable-\\(v[[0-9]]\+\\)\$,\\\$(objects)/&-protocol.lo: \\$(gen)/&-protocol.c \\$(gen)/&-client-protocol.h\\\\
+ \\$(RUN_CMD_CC)\\$(LIBTOOL) --tag=CC --mode=compile \\$(CC) \\$(CFLAGS) \\$(EXTRA_CFLAGS) $DEPENDENCY_TRACKING_OPTIONS -c \\$< -o \\$@," ; done`
+
WAYLAND_PROTOCOLS_DEPENDS="
$WAYLAND_CORE_PROTOCOL_SOURCE_DEPENDS
$WAYLAND_CORE_PROTOCOL_HEADER_DEPENDS
$WAYLAND_CORE_PROTOCOL_OBJECT
+$WAYLAND_PROTOCOLS_CLIENT_HEADER_UNSTABLE_DEPENDS
+$WAYLAND_PROTOCOLS_CODE_UNSTABLE_DEPENDS
+$WAYLAND_PROTOCOLS_OBJECTS_UNSTABLE
"
fi
diff -r b326f93e1bc5 -r ee83e0b4a36f src/video/wayland/SDL_waylandevents.c
--- a/src/video/wayland/SDL_waylandevents.c Thu Jun 23 18:39:05 2016 +0800
+++ b/src/video/wayland/SDL_waylandevents.c Thu Sep 01 01:26:56 2016 -0700
@@ -25,6 +25,7 @@
#include "SDL_stdinc.h"
#include "SDL_assert.h"
+#include "SDL_log.h"
#include "../../events/SDL_sysevents.h"
#include "../../events/SDL_events_c.h"
@@ -36,6 +37,9 @@
#include "SDL_waylanddyn.h"
+#include "pointer-constraints-unstable-v1-client-protocol.h"
+#include "relative-pointer-unstable-v1-client-protocol.h"
+
#include <linux/input.h>
#include <sys/select.h>
#include <sys/mman.h>
@@ -48,13 +52,17 @@
struct wl_seat *seat;
struct wl_pointer *pointer;
struct wl_keyboard *keyboard;
+ struct zwp_relative_pointer_v1 *relative_pointer;
SDL_WindowData *pointer_focus;
SDL_WindowData *keyboard_focus;
/* Last motion location */
wl_fixed_t sx_w;
wl_fixed_t sy_w;
-
+
+ double dx_frac;
+ double dy_frac;
+
struct {
struct xkb_keymap *keymap;
struct xkb_state *state;
@@ -170,10 +178,9 @@
}
static void
-pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial,
- uint32_t time, uint32_t button, uint32_t state_w)
+pointer_handle_button_common(struct SDL_WaylandInput *input, uint32_t serial,
+ uint32_t time, uint32_t button, uint32_t state_w)
{
- struct SDL_WaylandInput *input = data;
SDL_WindowData *window = input->pointer_focus;
enum wl_pointer_button_state state = state_w;
uint32_t sdl_button;
@@ -182,7 +189,7 @@
switch (button) {
case BTN_LEFT:
sdl_button = SDL_BUTTON_LEFT;
- if (ProcessHitTest(data, serial)) {
+ if (ProcessHitTest(input, serial)) {
return; /* don't pass this event on to app. */
}
break;
@@ -208,10 +215,18 @@
}
static void
-pointer_handle_axis(void *data, struct wl_pointer *pointer,
- uint32_t time, uint32_t axis, wl_fixed_t value)
+pointer_handle_button(void *data, struct wl_pointer *pointer, uint32_t serial,
+ uint32_t time, uint32_t button, uint32_t state_w)
{
struct SDL_WaylandInput *input = data;
+
+ pointer_handle_button_common(input, serial, time, button, state_w);
+}
+
+static void
+pointer_handle_axis_common(struct SDL_WaylandInput *input,
+ uint32_t time, uint32_t axis, wl_fixed_t value)
+{
SDL_WindowData *window = input->pointer_focus;
enum wl_pointer_axis a = axis;
int x, y;
@@ -234,6 +249,15 @@
}
}
+static void
+pointer_handle_axis(void *data, struct wl_pointer *pointer,
+ uint32_t time, uint32_t axis, wl_fixed_t value)
+{
+ struct SDL_WaylandInput *input = data;
+
+ pointer_handle_axis_common(input, time, axis, value);
+}
+
static const struct wl_pointer_listener pointer_listener = {
pointer_handle_enter,
pointer_handle_leave,
@@ -453,6 +477,164 @@
d->input = NULL;
}
+void Wayland_display_add_relative_pointer_manager(SDL_VideoData *d, uint32_t id)
+{
+ d->relative_pointer_manager =
+ wl_registry_bind(d->registry, id,
+ &zwp_relative_pointer_manager_v1_interface, 1);
+}
+
+void Wayland_display_destroy_relative_pointer_manager(SDL_VideoData *d)
+{
+ if (d->relative_pointer_manager)
+ zwp_relative_pointer_manager_v1_destroy(d->relative_pointer_manager);
+}
+
+void Wayland_display_add_pointer_constraints(SDL_VideoData *d, uint32_t id)
+{
+ d->pointer_constraints =
+ wl_registry_bind(d->registry, id,
+ &zwp_pointer_constraints_v1_interface, 1);
+}
+
+void Wayland_display_destroy_pointer_constraints(SDL_VideoData *d)
+{
+ if (d->pointer_constraints)
+ zwp_pointer_constraints_v1_destroy(d->pointer_constraints);
+}
+
+static void
+relative_pointer_handle_relative_motion(void *data,
+ struct zwp_relative_pointer_v1 *pointer,
+ uint32_t time_hi,
+ uint32_t time_lo,
+ wl_fixed_t dx_w,
+ wl_fixed_t dy_w,
+ wl_fixed_t dx_unaccel_w,
+ wl_fixed_t dy_unaccel_w)
+{
+ struct SDL_WaylandInput *input = data;
+ SDL_VideoData *d = input->display;
+ SDL_WindowData *window = input->pointer_focus;
+ double dx_unaccel;
+ double dy_unaccel;
+ double dx;
+ double dy;
+
+ dx_unaccel = wl_fixed_to_double(dx_unaccel_w);
+ dy_unaccel = wl_fixed_to_double(dy_unaccel_w);
+
+ /* Add left over fraction from last event. */
+ dx_unaccel += input->dx_frac;
+ dy_unaccel += input->dy_frac;
+
+ input->dx_frac = modf(dx_unaccel, &dx);
+ input->dy_frac = modf(dy_unaccel, &dy);
+
+ if (input->pointer_focus && d->relative_mouse_mode) {
+ SDL_SendMouseMotion(window->sdlwindow, 0, 1, (int)dx, (int)dy);
+ }
+}
+
+static const struct zwp_relative_pointer_v1_listener relative_pointer_listener = {
+ relative_pointer_handle_relative_motion,
+};
+
+static void
+locked_pointer_locked(void *data,
+ struct zwp_locked_pointer_v1 *locked_pointer)
+{
+}
+
+static void
+locked_pointer_unlocked(void *data,
+ struct zwp_locked_pointer_v1 *locked_pointer)
+{
+}
+
+static const struct zwp_locked_pointer_v1_listener locked_pointer_listener = {
+ locked_pointer_locked,
+ locked_pointer_unlocked,
+};
+
+static void
+lock_pointer_to_window(SDL_Window *window,
+ struct SDL_WaylandInput *input)
+{
+ SDL_WindowData *w = window->driverdata;
+ SDL_VideoData *d = input->display;
+ struct zwp_locked_pointer_v1 *locked_pointer;
+
+ if (w->locked_pointer)
+ return;
+
+ locked_pointer =
+ zwp_pointer_constraints_v1_lock_pointer(d->pointer_constraints,
+ w->surface,
+ input->pointer,
+ NULL,
+ ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT);
+ zwp_locked_pointer_v1_add_listener(locked_pointer,
+ &locked_pointer_listener,
+ window);
+
+ w->locked_pointer = locked_pointer;
+}
+
+int Wayland_input_lock_pointer(struct SDL_WaylandInput *input)
+{
+ SDL_VideoDevice *vd = SDL_GetVideoDevice();
+ SDL_VideoData *d = input->display;
+ SDL_Window *window;
+ struct zwp_relative_pointer_v1 *relative_pointer;
+
+ if (!d->relative_pointer_manager)
+ return -1;
+
+ if (!d->pointer_constraints)
+ return -1;
+
+ if (!input->relative_pointer) {
+ relative_pointer =
+ zwp_relative_pointer_manager_v1_get_relative_pointer(
+ d->relative_pointer_manager,
+ input->pointer);
+ zwp_relative_pointer_v1_add_listener(relative_pointer,
+ &relative_pointer_listener,
+ input);
+ input->relative_pointer = relative_pointer;
+ }
+
+ for (window = vd->windows; window; window = window->next)
+ lock_pointer_to_window(window, input);
+
+ d->relative_mouse_mode = 1;
+
+ return 0;
+}
+
+int Wayland_input_unlock_pointer(struct SDL_WaylandInput *input)
+{
+ SDL_VideoDevice *vd = SDL_GetVideoDevice();
+ SDL_VideoData *d = input->display;
+ SDL_Window *window;
+ SDL_WindowData *w;
+
+ for (window = vd->windows; window; window = window->next) {
+ w = window->driverdata;
+ if (w->locked_pointer)
+ zwp_locked_pointer_v1_destroy(w->locked_pointer);
+ w->locked_pointer = NULL;
+ }
+
+ zwp_relative_pointer_v1_destroy(input->relative_pointer);
+ input->relative_pointer = NULL;
+
+ d->relative_mouse_mode = 0;
+
+ return 0;
+}
+
#endif /* SDL_VIDEO_DRIVER_WAYLAND */
/* vi: set ts=4 sw=4 expandtab: */
diff -r b326f93e1bc5 -r ee83e0b4a36f src/video/wayland/SDL_waylandevents_c.h
--- a/src/video/wayland/SDL_waylandevents_c.h Thu Jun 23 18:39:05 2016 +0800
+++ b/src/video/wayland/SDL_waylandevents_c.h Thu Sep 01 01:26:56 2016 -0700
@@ -32,6 +32,15 @@
extern void Wayland_display_add_input(SDL_VideoData *d, uint32_t id);
extern void Wayland_display_destroy_input(SDL_VideoData *d);
+extern void Wayland_display_add_pointer_constraints(SDL_VideoData *d, uint32_t id);
+extern void Wayland_display_destroy_pointer_constraints(SDL_VideoData *d);
+
+extern int Wayland_input_lock_pointer(struct SDL_WaylandInput *input);
+extern int Wayland_input_unlock_pointer(struct SDL_WaylandInput *input);
+
+extern void Wayland_display_add_relative_pointer_manager(SDL_VideoData *d, uint32_t id);
+extern void Wayland_display_destroy_relative_pointer_manager(SDL_VideoData *d);
+
#endif /* _SDL_waylandevents_h */
/* vi: set ts=4 sw=4 expandtab: */
diff -r b326f93e1bc5 -r ee83e0b4a36f src/video/wayland/SDL_waylandmouse.c
--- a/src/video/wayland/SDL_waylandmouse.c Thu Jun 23 18:39:05 2016 +0800
+++ b/src/video/wayland/SDL_waylandmouse.c Thu Sep 01 01:26:56 2016 -0700
@@ -365,7 +365,13 @@
static int
Wayland_SetRelativeMouseMode(SDL_bool enabled)
{
- return SDL_Unsupported();
+ SDL_VideoDevice *vd = SDL_GetVideoDevice();
+ SDL_VideoData *data = (SDL_VideoData *) vd->driverdata;
+
+ if (enabled)
+ return Wayland_input_lock_pointer(data->input);
+ else
+ return Wayland_input_unlock_pointer(data->input);
}
void
diff -r b326f93e1bc5 -r ee83e0b4a36f src/video/wayland/SDL_waylandvideo.c
--- a/src/video/wayland/SDL_waylandvideo.c Thu Jun 23 18:39:05 2016 +0800
+++ b/src/video/wayland/SDL_waylandvideo.c Thu Sep 01 01:26:56 2016 -0700
@@ -305,7 +305,10 @@
} else if (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 (strcmp(interface, "zwp_relative_pointer_manager_v1") == 0) {
+ Wayland_display_add_relative_pointer_manager(d, id);
+ } else if (strcmp(interface, "zwp_pointer_constraints_v1") == 0) {
+ Wayland_display_add_pointer_constraints(d, id);
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
} else if (strcmp(interface, "qt_touch_extension") == 0) {
Wayland_touch_create(d, id);
@@ -395,6 +398,8 @@
}
Wayland_display_destroy_input(data);
+ Wayland_display_destroy_pointer_constraints(data);
+ Wayland_display_destroy_relative_pointer_manager(data);
if (data->xkb_context) {
WAYLAND_xkb_context_unref(data->xkb_context);
diff -r b326f93e1bc5 -r ee83e0b4a36f src/video/wayland/SDL_waylandvideo.h
--- a/src/video/wayland/SDL_waylandvideo.h Thu Jun 23 18:39:05 2016 +0800
+++ b/src/video/wayland/SDL_waylandvideo.h Thu Sep 01 01:26:56 2016 -0700
@@ -44,6 +44,8 @@
struct wl_cursor_theme *cursor_theme;
struct wl_pointer *pointer;
struct wl_shell *shell;
+ struct zwp_relative_pointer_manager_v1 *relative_pointer_manager;
+ struct zwp_pointer_constraints_v1 *pointer_constraints;
EGLDisplay edpy;
EGLContext context;
@@ -59,6 +61,8 @@
#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
char *classname;
+
+ int relative_mouse_mode;
} SDL_VideoData;
#endif /* _SDL_waylandvideo_h */
diff -r b326f93e1bc5 -r ee83e0b4a36f src/video/wayland/SDL_waylandwindow.c
--- a/src/video/wayland/SDL_waylandwindow.c Thu Jun 23 18:39:05 2016 +0800
+++ b/src/video/wayland/SDL_waylandwindow.c Thu Sep 01 01:26:56 2016 -0700
@@ -26,6 +26,7 @@
#include "../SDL_sysvideo.h"
#include "../../events/SDL_windowevents_c.h"
#include "../SDL_egl_c.h"
+#include "SDL_waylandevents_c.h"
#include "SDL_waylandwindow.h"
#include "SDL_waylandvideo.h"
#include "SDL_waylandtouch.h"
@@ -215,6 +216,10 @@
wl_surface_set_opaque_region(data->surface, region);
wl_region_destroy(region);
+ if (c->relative_mouse_mode) {
+ Wayland_input_lock_pointer(c->input);
+ }
+
WAYLAND_wl_display_flush(c->display);
return 0;
diff -r b326f93e1bc5 -r ee83e0b4a36f src/video/wayland/SDL_waylandwindow.h
--- a/src/video/wayland/SDL_waylandwindow.h Thu Jun 23 18:39:05 2016 +0800
+++ b/src/video/wayland/SDL_waylandwindow.h Thu Sep 01 01:26:56 2016 -0700
@@ -39,6 +39,7 @@
struct wl_egl_window *egl_window;
struct SDL_WaylandInput *keyboard_device;
EGLSurface egl_surface;
+ struct zwp_locked_pointer_v1 *locked_pointer;
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
struct qt_extended_surface *extended_surface;