Skip to content

Commit

Permalink
Added SDL_SetWindowModalFor().
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
icculus committed Apr 21, 2015
1 parent e497e46 commit d4aedf9
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 0 deletions.
10 changes: 10 additions & 0 deletions include/SDL_video.h
Expand Up @@ -873,6 +873,16 @@ extern DECLSPEC int SDLCALL SDL_SetWindowOpacity(SDL_Window * window, float opac
*/
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.
*
Expand Down
1 change: 1 addition & 0 deletions src/dynapi/SDL_dynapi_overrides.h
Expand Up @@ -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
1 change: 1 addition & 0 deletions src/dynapi/SDL_dynapi_procs.h
Expand Up @@ -636,3 +636,4 @@ SDL_DYNAPI_PROC(int,SDL_GetWindowBordersSize,(SDL_Window *a, int *b, int *c, int
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)
1 change: 1 addition & 0 deletions src/video/SDL_sysvideo.h
Expand Up @@ -210,6 +210,7 @@ struct SDL_VideoDevice
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);
Expand Down
13 changes: 13 additions & 0 deletions src/video/SDL_video.c
Expand Up @@ -2228,6 +2228,19 @@ SDL_GetWindowOpacity(SDL_Window * window, float * out_opacity)
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)
{
Expand Down
1 change: 1 addition & 0 deletions src/video/x11/SDL_x11video.c
Expand Up @@ -234,6 +234,7 @@ X11_CreateDevice(int devindex)
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;
Expand Down
10 changes: 10 additions & 0 deletions src/video/x11/SDL_x11window.c
Expand Up @@ -942,6 +942,16 @@ X11_SetWindowOpacity(_THIS, SDL_Window * window, float opacity)
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)
{
Expand Down
1 change: 1 addition & 0 deletions src/video/x11/SDL_x11window.h
Expand Up @@ -81,6 +81,7 @@ extern void X11_SetWindowMinimumSize(_THIS, SDL_Window * window);
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);
Expand Down

0 comments on commit d4aedf9

Please sign in to comment.