Просмотр исходного кода

Fixed events for windows that have had their window proc hooked at creation time

Sam Lantinga 4 недель назад
Родитель
Сommit
24fe3c48a0

+ 1 - 6
src/video/windows/SDL_windowsevents.c

@@ -2496,11 +2496,6 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
     }
 }
 
-LRESULT CALLBACK WIN_DefWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
-    return CallWindowProc(DefWindowProc, hwnd, msg, wParam, lParam);
-}
-
 int WIN_WaitEventTimeout(SDL_VideoDevice *_this, Sint64 timeoutNS)
 {
     if (g_WindowsEnableMessageLoop) {
@@ -2804,7 +2799,7 @@ bool SDL_RegisterApp(const char *name, Uint32 style, void *hInst)
     wcex.cbSize = sizeof(WNDCLASSEX);
     wcex.lpszClassName = SDL_Appname;
     wcex.style = SDL_Appstyle;
-    wcex.lpfnWndProc = WIN_DefWindowProc;
+    wcex.lpfnWndProc = WIN_WindowProc;
     wcex.hInstance = SDL_Instance;
 
 #if !defined(SDL_PLATFORM_XBOXONE) && !defined(SDL_PLATFORM_XBOXSERIES)

+ 0 - 1
src/video/windows/SDL_windowsevents.h

@@ -29,7 +29,6 @@ extern HINSTANCE SDL_Instance;
 
 extern LRESULT CALLBACK WIN_KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam);
 extern LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
-extern LRESULT CALLBACK WIN_DefWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 extern void WIN_PollRawInput(SDL_VideoDevice *_this, Uint64 poll_start);
 extern void WIN_CheckKeyboardAndMouseHotplug(SDL_VideoDevice *_this, bool initial_check);
 extern void WIN_PumpEvents(SDL_VideoDevice *_this);

+ 13 - 10
src/video/windows/SDL_windowswindow.c

@@ -425,19 +425,22 @@ static bool SetupWindowData(SDL_VideoDevice *_this, SDL_Window *window, HWND hwn
     window->internal = data;
 
     // Set up the window proc function
+    if (window->flags & SDL_WINDOW_EXTERNAL) {
 #ifdef GWLP_WNDPROC
-    data->wndproc = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_WNDPROC);
-    if (data->wndproc == WIN_DefWindowProc) {
-        data->wndproc = NULL;
-        SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)WIN_WindowProc);
-    }
+        data->wndproc = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_WNDPROC);
+        if (data->wndproc != WIN_WindowProc) {
+            SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)WIN_WindowProc);
+        }
 #else
-    data->wndproc = (WNDPROC)GetWindowLong(hwnd, GWL_WNDPROC);
-    if (data->wndproc == WIN_DefWindowProc) {
-        data->wndproc = NULL;
-        SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR)WIN_WindowProc);
-    }
+        data->wndproc = (WNDPROC)GetWindowLong(hwnd, GWL_WNDPROC);
+        if (data->wndproc != WIN_WindowProc) {
+            SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR)WIN_WindowProc);
+        }
 #endif
+    } else {
+        // We set up our window proc function at window creation.
+        // If someone has set hooks to modify it, leave it alone.
+    }
 
     // Fill in the SDL window with the window state
     {