Browse Source

X11TK: Fix a bug where closing the messagebox would kill the application

eafton 4 days ago
parent
commit
206a3cd25f
3 changed files with 31 additions and 17 deletions
  1. 5 1
      src/video/x11/SDL_x11messagebox.c
  2. 24 15
      src/video/x11/SDL_x11toolkit.c
  3. 2 1
      src/video/x11/SDL_x11toolkit.h

+ 5 - 1
src/video/x11/SDL_x11messagebox.c

@@ -196,7 +196,11 @@ static bool X11_ShowMessageBoxImpl(const SDL_MessageBoxData *messageboxdata, int
     }
     }
 
 
     /* Create window */
     /* Create window */
-    controls.window = X11Toolkit_CreateWindowStruct(messageboxdata->window, NULL, SDL_TOOLKIT_WINDOW_MODE_X11_DIALOG, colorhints);
+#if SDL_FORK_MESSAGEBOX
+    controls.window = X11Toolkit_CreateWindowStruct(messageboxdata->window, NULL, SDL_TOOLKIT_WINDOW_MODE_X11_DIALOG, colorhints, true);
+#else 
+    controls.window = X11Toolkit_CreateWindowStruct(messageboxdata->window, NULL, SDL_TOOLKIT_WINDOW_MODE_X11_DIALOG, colorhints, false);
+#endif
     controls.window->cb_data = &controls;
     controls.window->cb_data = &controls;
     controls.window->cb_on_scale_change = X11_OnMessageBoxScaleChange;
     controls.window->cb_on_scale_change = X11_OnMessageBoxScaleChange;
     if (!controls.window) {
     if (!controls.window) {

+ 24 - 15
src/video/x11/SDL_x11toolkit.c

@@ -420,7 +420,7 @@ static void X11Toolkit_GetTextWidthHeight(SDL_ToolkitWindowX11 *data, const char
     }
     }
 }
 }
 
 
-SDL_ToolkitWindowX11 *X11Toolkit_CreateWindowStruct(SDL_Window *parent, SDL_ToolkitWindowX11 *tkparent, SDL_ToolkitWindowModeX11 mode, const SDL_MessageBoxColor *colorhints)
+SDL_ToolkitWindowX11 *X11Toolkit_CreateWindowStruct(SDL_Window *parent, SDL_ToolkitWindowX11 *tkparent, SDL_ToolkitWindowModeX11 mode, const SDL_MessageBoxColor *colorhints, bool create_new_display)
 {
 {
     SDL_ToolkitWindowX11 *window;
     SDL_ToolkitWindowX11 *window;
     int i;
     int i;
@@ -456,20 +456,29 @@ SDL_ToolkitWindowX11 *X11Toolkit_CreateWindowStruct(SDL_Window *parent, SDL_Tool
     }
     }
 #endif
 #endif
 
 
-    if (parent) {
-        SDL_VideoData *videodata = SDL_GetVideoDevice()->internal;
-        window->display = videodata->display;
-        window->display_close = false;
-    } else if (tkparent) {
-        window->display = tkparent->display;
-        window->display_close = false;        
-    } else {
-        window->display = X11_XOpenDisplay(NULL);
-        window->display_close = true;
-        if (!window->display) {
-            ErrorFreeRetNull("Couldn't open X11 display", window);
-        }
-    }
+    window->parent_device = NULL;
+	if (create_new_display) {
+		window->display = X11_XOpenDisplay(NULL);
+		window->display_close = true;
+		if (!window->display) {
+			ErrorFreeRetNull("Couldn't open X11 display", window);
+		}		
+	} else {
+		if (parent) {        
+			window->parent_device = SDL_GetVideoDevice();
+			window->display = window->parent_device->internal->display;
+			window->display_close = false;
+		} else if (tkparent) {
+			window->display = tkparent->display;
+			window->display_close = false;        
+		} else {
+			window->display = X11_XOpenDisplay(NULL);
+			window->display_close = true;
+			if (!window->display) {
+				ErrorFreeRetNull("Couldn't open X11 display", window);
+			}
+		}
+	}
 
 
 #ifdef SDL_VIDEO_DRIVER_X11_XRANDR
 #ifdef SDL_VIDEO_DRIVER_X11_XRANDR
     int xrandr_event_base, xrandr_error_base;
     int xrandr_event_base, xrandr_error_base;

+ 2 - 1
src/video/x11/SDL_x11toolkit.h

@@ -61,6 +61,7 @@ typedef struct SDL_ToolkitWindowX11
     bool display_close;
     bool display_close;
 
 
     /* Parent */
     /* Parent */
+    SDL_VideoDevice *parent_device;
     SDL_Window *parent;
     SDL_Window *parent;
     struct SDL_ToolkitWindowX11 *tk_parent;
     struct SDL_ToolkitWindowX11 *tk_parent;
 
 
@@ -198,7 +199,7 @@ typedef struct SDL_ToolkitMenuItemX11
 } SDL_ToolkitMenuItemX11;
 } SDL_ToolkitMenuItemX11;
 
 
 /* WINDOW FUNCTIONS */
 /* WINDOW FUNCTIONS */
-extern SDL_ToolkitWindowX11 *X11Toolkit_CreateWindowStruct(SDL_Window *parent, SDL_ToolkitWindowX11 *tkparent, SDL_ToolkitWindowModeX11 mode, const SDL_MessageBoxColor *colorhints);
+extern SDL_ToolkitWindowX11 *X11Toolkit_CreateWindowStruct(SDL_Window *parent, SDL_ToolkitWindowX11 *tkparent, SDL_ToolkitWindowModeX11 mode, const SDL_MessageBoxColor *colorhints, bool create_new_display);
 extern bool X11Toolkit_CreateWindowRes(SDL_ToolkitWindowX11 *data, int w, int h, int cx, int cy, char *title);
 extern bool X11Toolkit_CreateWindowRes(SDL_ToolkitWindowX11 *data, int w, int h, int cx, int cy, char *title);
 extern void X11Toolkit_DoWindowEventLoop(SDL_ToolkitWindowX11 *data);
 extern void X11Toolkit_DoWindowEventLoop(SDL_ToolkitWindowX11 *data);
 extern void X11Toolkit_ResizeWindow(SDL_ToolkitWindowX11 *data, int w, int h);
 extern void X11Toolkit_ResizeWindow(SDL_ToolkitWindowX11 *data, int w, int h);