From 03f8528315fa46c95991a34f3325d7b33ae5538c Mon Sep 17 00:00:00 2001
From: Edward Rudd <urkle@outoforder.cc>
Date: Sat, 02 May 2020 21:48:36 +0000
Subject: [PATCH] Update source to SDL2 2.0.12

---
 source/src/video/wayland/SDL_waylandvideo.c |   44 +++++++++++++++++++++++++++++++++-----------
 1 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/source/src/video/wayland/SDL_waylandvideo.c b/source/src/video/wayland/SDL_waylandvideo.c
index b6155e7..5c331f3 100644
--- a/source/src/video/wayland/SDL_waylandvideo.c
+++ b/source/src/video/wayland/SDL_waylandvideo.c
@@ -1,6 +1,6 @@
 /*
   Simple DirectMedia Layer
-  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
+  Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org>
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -47,6 +47,8 @@
 
 #include "xdg-shell-client-protocol.h"
 #include "xdg-shell-unstable-v6-client-protocol.h"
+#include "xdg-decoration-unstable-v1-client-protocol.h"
+#include "org-kde-kwin-server-decoration-manager-client-protocol.h"
 
 #define WAYLANDVID_DRIVER_NAME "wayland"
 
@@ -170,6 +172,7 @@
     device->GL_SwapWindow = Wayland_GLES_SwapWindow;
     device->GL_GetSwapInterval = Wayland_GLES_GetSwapInterval;
     device->GL_SetSwapInterval = Wayland_GLES_SetSwapInterval;
+    device->GL_GetDrawableSize = Wayland_GLES_GetDrawableSize;
     device->GL_MakeCurrent = Wayland_GLES_MakeCurrent;
     device->GL_CreateContext = Wayland_GLES_CreateContext;
     device->GL_LoadLibrary = Wayland_GLES_LoadLibrary;
@@ -182,6 +185,7 @@
     device->SetWindowFullscreen = Wayland_SetWindowFullscreen;
     device->MaximizeWindow = Wayland_MaximizeWindow;
     device->RestoreWindow = Wayland_RestoreWindow;
+    device->SetWindowBordered = Wayland_SetWindowBordered;
     device->SetWindowSize = Wayland_SetWindowSize;
     device->SetWindowTitle = Wayland_SetWindowTitle;
     device->DestroyWindow = Wayland_DestroyWindow;
@@ -196,6 +200,7 @@
     device->Vulkan_UnloadLibrary = Wayland_Vulkan_UnloadLibrary;
     device->Vulkan_GetInstanceExtensions = Wayland_Vulkan_GetInstanceExtensions;
     device->Vulkan_CreateSurface = Wayland_Vulkan_CreateSurface;
+    device->Vulkan_GetDrawableSize = Wayland_Vulkan_GetDrawableSize;
 #endif
 
     device->free = Wayland_DeleteDevice;
@@ -223,7 +228,6 @@
     SDL_VideoDisplay *display = data;
 
     display->name = SDL_strdup(model);
-    display->driverdata = output;
 }
 
 static void
@@ -234,15 +238,15 @@
                     int height,
                     int refresh)
 {
-    SDL_VideoDisplay *display = data;
     SDL_DisplayMode mode;
+    SDL_VideoDisplay *display = data;
 
     SDL_zero(mode);
     mode.format = SDL_PIXELFORMAT_RGB888;
     mode.w = width;
     mode.h = height;
     mode.refresh_rate = refresh / 1000; // mHz to Hz
-    mode.driverdata = display->driverdata;
+    mode.driverdata = ((SDL_WaylandOutputData*)display->driverdata)->output;
     SDL_AddDisplayMode(display, &mode);
 
     if (flags & WL_OUTPUT_MODE_CURRENT) {
@@ -255,8 +259,10 @@
 display_handle_done(void *data,
                     struct wl_output *output)
 {
+    /* !!! FIXME: this will fail on any further property changes! */
     SDL_VideoDisplay *display = data;
     SDL_AddVideoDisplay(display);
+    wl_output_set_user_data(output, display->driverdata);
     SDL_free(display->name);
     SDL_free(display);
 }
@@ -266,7 +272,8 @@
                      struct wl_output *output,
                      int32_t factor)
 {
-    // TODO: do HiDPI stuff.
+    SDL_VideoDisplay *display = data;
+    ((SDL_WaylandOutputData*)display->driverdata)->scale_factor = factor;
 }
 
 static const struct wl_output_listener output_listener = {
@@ -280,6 +287,7 @@
 Wayland_add_display(SDL_VideoData *d, uint32_t id)
 {
     struct wl_output *output;
+    SDL_WaylandOutputData *data;
     SDL_VideoDisplay *display = SDL_malloc(sizeof *display);
     if (!display) {
         SDL_OutOfMemory();
@@ -293,6 +301,10 @@
         SDL_free(display);
         return;
     }
+    data = SDL_malloc(sizeof *data);
+    data->output = output;
+    data->scale_factor = 1.0;
+    display->driverdata = data;
 
     wl_output_add_listener(output, &output_listener, display);
 }
@@ -345,8 +357,10 @@
 {
     SDL_VideoData *d = data;
 
+    /*printf("WAYLAND INTERFACE: %s\n", interface);*/
+
     if (strcmp(interface, "wl_compositor") == 0) {
-        d->compositor = wl_registry_bind(d->registry, id, &wl_compositor_interface, 1);
+        d->compositor = wl_registry_bind(d->registry, id, &wl_compositor_interface, SDL_min(3, version));
     } else if (strcmp(interface, "wl_output") == 0) {
         Wayland_add_display(d, id);
     } else if (strcmp(interface, "wl_seat") == 0) {
@@ -367,7 +381,11 @@
     } else if (strcmp(interface, "zwp_pointer_constraints_v1") == 0) {
         Wayland_display_add_pointer_constraints(d, id);
     } else if (strcmp(interface, "wl_data_device_manager") == 0) {
-        d->data_device_manager = wl_registry_bind(d->registry, id, &wl_data_device_manager_interface, 3);
+        d->data_device_manager = wl_registry_bind(d->registry, id, &wl_data_device_manager_interface, SDL_min(3, version));
+    } else if (strcmp(interface, "zxdg_decoration_manager_v1") == 0) {
+        d->decoration_manager = wl_registry_bind(d->registry, id, &zxdg_decoration_manager_v1_interface, 1);
+    } else if (strcmp(interface, "org_kde_kwin_server_decoration_manager") == 0) {
+        d->kwin_server_decoration_manager = wl_registry_bind(d->registry, id, &org_kde_kwin_server_decoration_manager_interface, 1);
 
 #ifdef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH
     } else if (strcmp(interface, "qt_touch_extension") == 0) {
@@ -383,18 +401,20 @@
     }
 }
 
+static void
+display_remove_global(void *data, struct wl_registry *registry, uint32_t id) {}
+
 static const struct wl_registry_listener registry_listener = {
     display_handle_global,
-    NULL, /* global_remove */
+    display_remove_global
 };
 
 int
 Wayland_VideoInit(_THIS)
 {
-    SDL_VideoData *data = SDL_malloc(sizeof *data);
+    SDL_VideoData *data = SDL_calloc(1, sizeof(*data));
     if (data == NULL)
         return SDL_OutOfMemory();
-    memset(data, 0, sizeof *data);
 
     _this->driverdata = data;
 
@@ -454,7 +474,9 @@
 
     for (i = 0; i < _this->num_displays; ++i) {
         SDL_VideoDisplay *display = &_this->displays[i];
-        wl_output_destroy(display->driverdata);
+
+        wl_output_destroy(((SDL_WaylandOutputData*)display->driverdata)->output);
+        SDL_free(display->driverdata);
         display->driverdata = NULL;
 
         for (j = display->num_display_modes; j--;) {

--
Gitblit v1.9.3