From 600021788966b2b53ffc592810ebdf81247aa5b4 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Sun, 8 Aug 2010 01:53:41 +0000 Subject: [PATCH] - Hide the cursor by overriding WM_SETCURSOR, as seen in the IDirect3DDEvice9::ShowCursor() example. Do not modify the window class pointer. I still had an instance where I was left with an invisible pointer no matter where I moved it, so hopefully this takes care of that. (edit: it doesn't.) SVN r2496 (trunk) --- src/win32/i_input.cpp | 9 +++++++++ src/win32/i_main.cpp | 5 +---- src/win32/i_mouse.cpp | 14 ++++++++++---- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/win32/i_input.cpp b/src/win32/i_input.cpp index e9d2a26bb..d01547dae 100644 --- a/src/win32/i_input.cpp +++ b/src/win32/i_input.cpp @@ -147,6 +147,7 @@ EXTERN_CVAR (Bool, lookstrafe) EXTERN_CVAR (Bool, use_joystick) static int WheelDelta; +extern bool CursorState; extern BOOL paused; static bool noidle = false; @@ -418,6 +419,14 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) I_CheckNativeMouse (false); break; + case WM_SETCURSOR: + if (!CursorState) + { + SetCursor(NULL); // turn off window cursor + return TRUE; // Prevent Windows from setting cursor to window class cursor + } + break; + case WM_SIZE: InvalidateRect (Window, NULL, FALSE); break; diff --git a/src/win32/i_main.cpp b/src/win32/i_main.cpp index e590fbd3b..808ae4fbe 100644 --- a/src/win32/i_main.cpp +++ b/src/win32/i_main.cpp @@ -118,7 +118,6 @@ extern BYTE *ST_Util_BitsForBitmap (BITMAPINFO *bitmap_info); extern EXCEPTION_POINTERS CrashPointers; extern BITMAPINFO *StartupBitmap; extern UINT TimerPeriod; -extern HCURSOR TheArrowCursor; // PUBLIC DATA DEFINITIONS ------------------------------------------------- @@ -931,8 +930,6 @@ void DoMain (HINSTANCE hInstance) x = y = 0; } - TheArrowCursor = LoadCursor (NULL, IDC_ARROW); - WNDCLASS WndClass; WndClass.style = 0; WndClass.lpfnWndProc = LConProc; @@ -940,7 +937,7 @@ void DoMain (HINSTANCE hInstance) WndClass.cbWndExtra = 0; WndClass.hInstance = hInstance; WndClass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE(IDI_ICON1)); - WndClass.hCursor = TheArrowCursor; + WndClass.hCursor = LoadCursor (NULL, IDC_ARROW); WndClass.hbrBackground = NULL; WndClass.lpszMenuName = NULL; WndClass.lpszClassName = (LPCTSTR)WinClassName; diff --git a/src/win32/i_mouse.cpp b/src/win32/i_mouse.cpp index 87de7269a..fc55c0456 100644 --- a/src/win32/i_mouse.cpp +++ b/src/win32/i_mouse.cpp @@ -134,7 +134,7 @@ static FMouse *(*MouseFactory[])() = FMouse *Mouse; -HCURSOR TheArrowCursor; +bool CursorState; CVAR (Bool, use_mouse, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, m_noprescale, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) @@ -181,11 +181,17 @@ CUSTOM_CVAR(Int, mouse_capturemode, 1, CVAR_GLOBALCONFIG|CVAR_ARCHIVE) static void SetCursorState(bool visible) { - HCURSOR usingCursor = visible ? TheArrowCursor : NULL; - SetClassLongPtr(Window, GCLP_HCURSOR, (LONG_PTR)usingCursor); + CursorState = visible; if (GetForegroundWindow() == Window) { - SetCursor(usingCursor); + if (visible) + { + SetCursor((HCURSOR)(intptr_t)GetClassLongPtr(Window, GCLP_HCURSOR)); + } + else + { + SetCursor(NULL); + } } }