瀏覽代碼

Fixed crashes when a window has NULL driverdata

Sam Lantinga 1 年之前
父節點
當前提交
43a59ffe45
共有 2 個文件被更改,包括 12 次插入4 次删除
  1. 12 4
      src/video/x11/SDL_x11window.c
  2. 0 0
      test/gamepad_battery.h

+ 12 - 4
src/video/x11/SDL_x11window.c

@@ -1387,11 +1387,12 @@ void X11_HideWindow(SDL_VideoDevice *_this, SDL_Window *window)
 {
 {
     SDL_WindowData *data = window->driverdata;
     SDL_WindowData *data = window->driverdata;
     SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
     SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
+    int screen = (displaydata ? displaydata->screen : 0);
     Display *display = data->videodata->display;
     Display *display = data->videodata->display;
     XEvent event;
     XEvent event;
 
 
     if (X11_IsWindowMapped(_this, window)) {
     if (X11_IsWindowMapped(_this, window)) {
-        X11_XWithdrawWindow(display, data->xwindow, displaydata->screen);
+        X11_XWithdrawWindow(display, data->xwindow, screen);
         /* Blocking wait for "UnmapNotify" event */
         /* Blocking wait for "UnmapNotify" event */
         if (!(window->flags & SDL_WINDOW_EXTERNAL)) {
         if (!(window->flags & SDL_WINDOW_EXTERNAL)) {
             X11_XIfEvent(display, &event, &isUnmapNotify, (XPointer)&data->xwindow);
             X11_XIfEvent(display, &event, &isUnmapNotify, (XPointer)&data->xwindow);
@@ -1417,8 +1418,10 @@ void X11_HideWindow(SDL_VideoDevice *_this, SDL_Window *window)
     X11_PumpEvents(_this);
     X11_PumpEvents(_this);
 }
 }
 
 
-static void X11_SetWindowActive(SDL_VideoDevice *_this, SDL_Window *window)
+static int X11_SetWindowActive(SDL_VideoDevice *_this, SDL_Window *window)
 {
 {
+    CHECK_WINDOW_DATA(window);
+
     SDL_WindowData *data = window->driverdata;
     SDL_WindowData *data = window->driverdata;
     SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
     SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
     Display *display = data->videodata->display;
     Display *display = data->videodata->display;
@@ -1443,6 +1446,7 @@ static void X11_SetWindowActive(SDL_VideoDevice *_this, SDL_Window *window)
 
 
         X11_XFlush(display);
         X11_XFlush(display);
     }
     }
+    return 0;
 }
 }
 
 
 void X11_RaiseWindow(SDL_VideoDevice *_this, SDL_Window *window)
 void X11_RaiseWindow(SDL_VideoDevice *_this, SDL_Window *window)
@@ -1458,8 +1462,10 @@ void X11_RaiseWindow(SDL_VideoDevice *_this, SDL_Window *window)
     X11_XFlush(display);
     X11_XFlush(display);
 }
 }
 
 
-static void X11_SetWindowMaximized(SDL_VideoDevice *_this, SDL_Window *window, SDL_bool maximized)
+static int X11_SetWindowMaximized(SDL_VideoDevice *_this, SDL_Window *window, SDL_bool maximized)
 {
 {
+    CHECK_WINDOW_DATA(window);
+
     SDL_WindowData *data = window->driverdata;
     SDL_WindowData *data = window->driverdata;
     SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
     SDL_DisplayData *displaydata = SDL_GetDisplayDriverDataForWindow(window);
     Display *display = data->videodata->display;
     Display *display = data->videodata->display;
@@ -1472,7 +1478,7 @@ static void X11_SetWindowMaximized(SDL_VideoDevice *_this, SDL_Window *window, S
            and this is functional behavior, so don't remove that state
            and this is functional behavior, so don't remove that state
            now, we'll take care of it when we leave fullscreen mode.
            now, we'll take care of it when we leave fullscreen mode.
          */
          */
-        return;
+        return 0;
     }
     }
 
 
     if (X11_IsWindowMapped(_this, window)) {
     if (X11_IsWindowMapped(_this, window)) {
@@ -1513,6 +1519,8 @@ static void X11_SetWindowMaximized(SDL_VideoDevice *_this, SDL_Window *window, S
         X11_SetNetWMState(_this, data->xwindow, window->flags);
         X11_SetNetWMState(_this, data->xwindow, window->flags);
     }
     }
     X11_XFlush(display);
     X11_XFlush(display);
+
+    return 0;
 }
 }
 
 
 void X11_MaximizeWindow(SDL_VideoDevice *_this, SDL_Window *window)
 void X11_MaximizeWindow(SDL_VideoDevice *_this, SDL_Window *window)

+ 0 - 0
test/gamepad_battery.h