Added SDL_SetWindowModalFor().
authorRyan C. Gordon <icculus@icculus.org>
Tue, 21 Apr 2015 09:45:58 -0400
changeset 10027 f7ab0613164a
parent 10026 5f73f513b9f5
child 10028 da668b612d10
Added SDL_SetWindowModalFor(). This is currently only implemented for X11. This patch is based on work in Unreal Engine 4's fork of SDL, compliments of Epic Games.
include/SDL_video.h
src/dynapi/SDL_dynapi_overrides.h
src/dynapi/SDL_dynapi_procs.h
src/video/SDL_sysvideo.h
src/video/SDL_video.c
src/video/x11/SDL_x11video.c
src/video/x11/SDL_x11window.c
src/video/x11/SDL_x11window.h
--- a/include/SDL_video.h	Tue Jan 05 02:28:56 2016 -0500
+++ b/include/SDL_video.h	Tue Apr 21 09:45:58 2015 -0400
@@ -874,6 +874,16 @@
 extern DECLSPEC int SDLCALL SDL_GetWindowOpacity(SDL_Window * window, float * out_opacity);
 
 /**
+ *  \brief Sets the window as a modal for another window (@TODO: reconsider this function and/or its name)
+ *
+ *  \param modal_window The window that should be modal
+ *  \param parent_window The parent window
+ * 
+ *  \return 0 on success, or -1 otherwise.
+ */
+extern DECLSPEC int SDLCALL SDL_SetWindowModalFor(SDL_Window * modal_window, SDL_Window * parent_window);
+
+/**
  *  \brief Explicitly sets input focus to the window.
  *
  *  You almost certainly want SDL_RaiseWindow() instead of this function. Use
--- a/src/dynapi/SDL_dynapi_overrides.h	Tue Jan 05 02:28:56 2016 -0500
+++ b/src/dynapi/SDL_dynapi_overrides.h	Tue Apr 21 09:45:58 2015 -0400
@@ -602,3 +602,4 @@
 #define SDL_SetWindowOpacity SDL_SetWindowOpacity_REAL
 #define SDL_GetWindowOpacity SDL_GetWindowOpacity_REAL
 #define SDL_SetWindowInputFocus SDL_SetWindowInputFocus_REAL
+#define SDL_SetWindowModalFor SDL_SetWindowModalFor_REAL
--- a/src/dynapi/SDL_dynapi_procs.h	Tue Jan 05 02:28:56 2016 -0500
+++ b/src/dynapi/SDL_dynapi_procs.h	Tue Apr 21 09:45:58 2015 -0400
@@ -636,3 +636,4 @@
 SDL_DYNAPI_PROC(int,SDL_SetWindowOpacity,(SDL_Window *a, float b),(a,b),return)
 SDL_DYNAPI_PROC(int,SDL_GetWindowOpacity,(SDL_Window *a, float *b),(a,b),return)
 SDL_DYNAPI_PROC(int,SDL_SetWindowInputFocus,(SDL_Window *a),(a),return)
+SDL_DYNAPI_PROC(int,SDL_SetWindowModalFor,(SDL_Window *a, SDL_Window *b),(a,b),return)
--- a/src/video/SDL_sysvideo.h	Tue Jan 05 02:28:56 2016 -0500
+++ b/src/video/SDL_sysvideo.h	Tue Apr 21 09:45:58 2015 -0400
@@ -210,6 +210,7 @@
     void (*SetWindowMaximumSize) (_THIS, SDL_Window * window);
     int (*GetWindowBordersSize) (_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right);
     int (*SetWindowOpacity) (_THIS, SDL_Window * window, float opacity);
+    int (*SetWindowModalFor) (_THIS, SDL_Window * modal_window, SDL_Window * parent_window);
     int (*SetWindowInputFocus) (_THIS, SDL_Window * window);
     void (*ShowWindow) (_THIS, SDL_Window * window);
     void (*HideWindow) (_THIS, SDL_Window * window);
--- a/src/video/SDL_video.c	Tue Jan 05 02:28:56 2016 -0500
+++ b/src/video/SDL_video.c	Tue Apr 21 09:45:58 2015 -0400
@@ -2228,6 +2228,19 @@
     return 0;
 }
 
+int
+SDL_SetWindowModalFor(SDL_Window * modal_window, SDL_Window * parent_window)
+{
+    CHECK_WINDOW_MAGIC(modal_window, -1);
+    CHECK_WINDOW_MAGIC(parent_window, -1);
+
+    if (!_this->SetWindowModalFor) {
+        return SDL_Unsupported();
+    }
+    
+    return _this->SetWindowModalFor(_this, modal_window, parent_window);
+}
+
 int 
 SDL_SetWindowInputFocus(SDL_Window * window)
 {
--- a/src/video/x11/SDL_x11video.c	Tue Jan 05 02:28:56 2016 -0500
+++ b/src/video/x11/SDL_x11video.c	Tue Apr 21 09:45:58 2015 -0400
@@ -234,6 +234,7 @@
     device->SetWindowMaximumSize = X11_SetWindowMaximumSize;
     device->GetWindowBordersSize = X11_GetWindowBordersSize;
     device->SetWindowOpacity = X11_SetWindowOpacity;
+    device->SetWindowModalFor = X11_SetWindowModalFor;
     device->SetWindowInputFocus = X11_SetWindowInputFocus;
     device->ShowWindow = X11_ShowWindow;
     device->HideWindow = X11_HideWindow;
--- a/src/video/x11/SDL_x11window.c	Tue Jan 05 02:28:56 2016 -0500
+++ b/src/video/x11/SDL_x11window.c	Tue Apr 21 09:45:58 2015 -0400
@@ -942,6 +942,16 @@
     return 0;
 }
 
+int 
+X11_SetWindowModalFor(_THIS, SDL_Window * modal_window, SDL_Window * parent_window) {
+    SDL_WindowData *data = (SDL_WindowData *) modal_window->driverdata;
+    SDL_WindowData *parent_data = (SDL_WindowData *) parent_window->driverdata;
+    Display *display = data->videodata->display;
+
+    X11_XSetTransientForHint(display, data->xwindow, parent_data->xwindow);
+    return 0;
+}
+
 int
 X11_SetWindowInputFocus(_THIS, SDL_Window * window) 
 {
--- a/src/video/x11/SDL_x11window.h	Tue Jan 05 02:28:56 2016 -0500
+++ b/src/video/x11/SDL_x11window.h	Tue Apr 21 09:45:58 2015 -0400
@@ -81,6 +81,7 @@
 extern void X11_SetWindowMaximumSize(_THIS, SDL_Window * window);
 extern int X11_GetWindowBordersSize(_THIS, SDL_Window * window, int *top, int *left, int *bottom, int *right);
 extern int X11_SetWindowOpacity(_THIS, SDL_Window * window, float opacity);
+extern int X11_SetWindowModalFor(_THIS, SDL_Window * modal_window, SDL_Window * parent_window);
 extern int X11_SetWindowInputFocus(_THIS, SDL_Window * window);
 extern void X11_SetWindowSize(_THIS, SDL_Window * window);
 extern void X11_ShowWindow(_THIS, SDL_Window * window);