mirror of https://github.com/encounter/SDL.git
[qtwayland] Set orientation and window flags via SDL hints
This commit is contained in:
parent
009a3f5aa6
commit
acce865911
|
@ -401,6 +401,33 @@ extern "C" {
|
|||
#define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION"
|
||||
|
||||
|
||||
/**
|
||||
* \brief A variable describing the content orientation on QtWayland-based platforms.
|
||||
*
|
||||
* On QtWayland platforms, windows are rotated client-side to allow for custom
|
||||
* transitions. In order to correctly position overlays (e.g. volume bar) and
|
||||
* gestures (e.g. events view, close/minimize gestures), the system needs to
|
||||
* know in which orientation the application is currently drawing its contents.
|
||||
*
|
||||
* This does not cause the window to be rotated or resized, the application
|
||||
* needs to take care of drawing the content in the right orientation (the
|
||||
* framebuffer is always in portrait mode).
|
||||
*
|
||||
* This variable can be one of the following values:
|
||||
* "primary" (default), "portrait", "landscape", "inverted-portrait", "inverted-landscape"
|
||||
*/
|
||||
#define SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION "SDL_QTWAYLAND_CONTENT_ORIENTATION"
|
||||
|
||||
/**
|
||||
* \brief Flags to set on QtWayland windows to integrate with the native window manager.
|
||||
*
|
||||
* On QtWayland platforms, this hint controls the flags to set on the windows.
|
||||
* For example, on Sailfish OS "OverridesSystemGestures" disables swipe gestures.
|
||||
*
|
||||
* This variable is a space-separated list of the following values (empty = no flags):
|
||||
* "OverridesSystemGestures", "StaysOnTop", "BypassWindowManager"
|
||||
*/
|
||||
#define SDL_HINT_QTWAYLAND_WINDOW_FLAGS "SDL_QTWAYLAND_WINDOW_FLAGS"
|
||||
|
||||
/**
|
||||
* \brief A string specifying SDL's threads stack size in bytes or "0" for the backend's default size
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include "SDL_waylandvideo.h"
|
||||
#include "SDL_waylandtouch.h"
|
||||
#include "SDL_waylanddyn.h"
|
||||
#include "SDL_hints.h"
|
||||
|
||||
static void
|
||||
handle_ping(void *data, struct wl_shell_surface *shell_surface,
|
||||
|
@ -157,6 +158,71 @@ void Wayland_ShowWindow(_THIS, SDL_Window *window)
|
|||
WAYLAND_wl_display_flush( ((SDL_VideoData*)_this->driverdata)->display );
|
||||
}
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
|
||||
static void QtExtendedSurface_OnHintChanged(void *userdata, const char *name,
|
||||
const char *oldValue, const char *newValue)
|
||||
{
|
||||
struct qt_extended_surface *qt_extended_surface = userdata;
|
||||
|
||||
if (name == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (strcmp(name, SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION) == 0) {
|
||||
int32_t orientation = QT_EXTENDED_SURFACE_ORIENTATION_PRIMARYORIENTATION;
|
||||
|
||||
if (newValue != NULL) {
|
||||
if (strcmp(newValue, "portrait") == 0) {
|
||||
orientation = QT_EXTENDED_SURFACE_ORIENTATION_PORTRAITORIENTATION;
|
||||
} else if (strcmp(newValue, "landscape") == 0) {
|
||||
orientation = QT_EXTENDED_SURFACE_ORIENTATION_LANDSCAPEORIENTATION;
|
||||
} else if (strcmp(newValue, "inverted-portrait") == 0) {
|
||||
orientation = QT_EXTENDED_SURFACE_ORIENTATION_INVERTEDPORTRAITORIENTATION;
|
||||
} else if (strcmp(newValue, "inverted-landscape") == 0) {
|
||||
orientation = QT_EXTENDED_SURFACE_ORIENTATION_INVERTEDLANDSCAPEORIENTATION;
|
||||
}
|
||||
}
|
||||
|
||||
qt_extended_surface_set_content_orientation(qt_extended_surface, orientation);
|
||||
} else if (strcmp(name, SDL_HINT_QTWAYLAND_WINDOW_FLAGS) == 0) {
|
||||
uint32_t flags = 0;
|
||||
|
||||
if (newValue != NULL) {
|
||||
char *tmp = strdup(newValue);
|
||||
char *saveptr = NULL;
|
||||
|
||||
char *flag = strtok_r(tmp, " ", &saveptr);
|
||||
while (flag) {
|
||||
if (strcmp(flag, "OverridesSystemGestures") == 0) {
|
||||
flags |= QT_EXTENDED_SURFACE_WINDOWFLAG_OVERRIDESSYSTEMGESTURES;
|
||||
} else if (strcmp(flag, "StaysOnTop") == 0) {
|
||||
flags |= QT_EXTENDED_SURFACE_WINDOWFLAG_STAYSONTOP;
|
||||
} else if (strcmp(flag, "BypassWindowManager") == 0) {
|
||||
// See https://github.com/qtproject/qtwayland/commit/fb4267103d
|
||||
flags |= 4 /* QT_EXTENDED_SURFACE_WINDOWFLAG_BYPASSWINDOWMANAGER */;
|
||||
}
|
||||
|
||||
flag = strtok_r(NULL, " ", &saveptr);
|
||||
}
|
||||
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
qt_extended_surface_set_window_flags(qt_extended_surface, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static void QtExtendedSurface_Subscribe(struct qt_extended_surface *surface, const char *name)
|
||||
{
|
||||
SDL_AddHintCallback(name, QtExtendedSurface_OnHintChanged, surface);
|
||||
}
|
||||
|
||||
static void QtExtendedSurface_Unsubscribe(struct qt_extended_surface *surface, const char *name)
|
||||
{
|
||||
SDL_DelHintCallback(name, QtExtendedSurface_OnHintChanged, surface);
|
||||
}
|
||||
#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
|
||||
|
||||
void
|
||||
Wayland_SetWindowFullscreen(_THIS, SDL_Window * window,
|
||||
SDL_VideoDisplay * _display, SDL_bool fullscreen)
|
||||
|
@ -231,6 +297,9 @@ int Wayland_CreateWindow(_THIS, SDL_Window *window)
|
|||
if (c->surface_extension) {
|
||||
data->extended_surface = qt_surface_extension_get_extended_surface(
|
||||
c->surface_extension, data->surface);
|
||||
|
||||
QtExtendedSurface_Subscribe(data->extended_surface, SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION);
|
||||
QtExtendedSurface_Subscribe(data->extended_surface, SDL_HINT_QTWAYLAND_WINDOW_FLAGS);
|
||||
}
|
||||
#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
|
||||
|
||||
|
@ -310,8 +379,11 @@ void Wayland_DestroyWindow(_THIS, SDL_Window *window)
|
|||
wl_shell_surface_destroy(wind->shell_surface);
|
||||
|
||||
#ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
|
||||
if (wind->extended_surface)
|
||||
if (wind->extended_surface) {
|
||||
QtExtendedSurface_Unsubscribe(wind->extended_surface, SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION);
|
||||
QtExtendedSurface_Unsubscribe(wind->extended_surface, SDL_HINT_QTWAYLAND_WINDOW_FLAGS);
|
||||
qt_extended_surface_destroy(wind->extended_surface);
|
||||
}
|
||||
#endif /* SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH */
|
||||
wl_surface_destroy(wind->surface);
|
||||
|
||||
|
|
Loading…
Reference in New Issue