mirror of
https://github.com/narzoul/DDrawCompat
synced 2024-12-30 08:55:36 +01:00
Fixed a potential deadlock in resetMouseHook
Fixes a sporadic deadlock when alt-tabbing in Star Trek: Armada with the config overlay open.
This commit is contained in:
parent
ec686bfb69
commit
a442239ac1
@ -20,6 +20,7 @@
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
const UINT WM_USER_EXECUTE = WM_USER;
|
const UINT WM_USER_EXECUTE = WM_USER;
|
||||||
|
const UINT WM_USER_EXECUTE_ASYNC = WM_USER + 1;
|
||||||
|
|
||||||
struct EnumWindowsArgs
|
struct EnumWindowsArgs
|
||||||
{
|
{
|
||||||
@ -185,6 +186,12 @@ namespace
|
|||||||
func();
|
func();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (WM_USER_EXECUTE_ASYNC == uMsg)
|
||||||
|
{
|
||||||
|
auto func = reinterpret_cast<void(*)()>(lParam);
|
||||||
|
func();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return CALL_ORIG_FUNC(DefWindowProc)(hwnd, uMsg, wParam, lParam);
|
return CALL_ORIG_FUNC(DefWindowProc)(hwnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -277,6 +284,11 @@ namespace Gdi
|
|||||||
PostMessage(hwnd, WM_CLOSE, 0, 0);
|
PostMessage(hwnd, WM_CLOSE, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void executeAsyncFunc(void(*func)())
|
||||||
|
{
|
||||||
|
PostMessage(g_messageWindow, WM_USER_EXECUTE_ASYNC, 0, reinterpret_cast<LPARAM>(func));
|
||||||
|
}
|
||||||
|
|
||||||
void executeFunc(const std::function<void()>& func)
|
void executeFunc(const std::function<void()>& func)
|
||||||
{
|
{
|
||||||
DWORD_PTR result = 0;
|
DWORD_PTR result = 0;
|
||||||
|
@ -27,6 +27,7 @@ namespace Gdi
|
|||||||
|
|
||||||
template <typename Func>
|
template <typename Func>
|
||||||
void execute(const Func& func) { executeFunc(std::cref(func)); }
|
void execute(const Func& func) { executeFunc(std::cref(func)); }
|
||||||
|
void executeAsyncFunc(void(*func)());
|
||||||
void executeFunc(const std::function<void()>& func);
|
void executeFunc(const std::function<void()>& func);
|
||||||
|
|
||||||
bool isGuiThreadWindow(HWND hwnd);
|
bool isGuiThreadWindow(HWND hwnd);
|
||||||
|
@ -268,33 +268,35 @@ namespace
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void resetMouseHookFunc()
|
||||||
|
{
|
||||||
|
if (g_mouseHook)
|
||||||
|
{
|
||||||
|
UnhookWindowsHookEx(g_mouseHook);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_origCursorPos = { MAXLONG, MAXLONG };
|
||||||
|
g_mouseHook = CALL_ORIG_FUNC(SetWindowsHookExA)(
|
||||||
|
WH_MOUSE_LL, &lowLevelMouseProc, Dll::g_origDDrawModule, 0);
|
||||||
|
|
||||||
|
if (g_mouseHook)
|
||||||
|
{
|
||||||
|
INPUT inputs[2] = {};
|
||||||
|
inputs[0].mi.dy = 1;
|
||||||
|
inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE;
|
||||||
|
inputs[1].mi.dx = 1;
|
||||||
|
inputs[1].mi.dwFlags = MOUSEEVENTF_MOVE;
|
||||||
|
SendInput(2, inputs, sizeof(INPUT));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_ONCE("ERROR: Failed to install low level mouse hook, error code: " << GetLastError());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void resetMouseHook()
|
void resetMouseHook()
|
||||||
{
|
{
|
||||||
Gdi::GuiThread::execute([]()
|
Gdi::GuiThread::executeAsyncFunc(resetMouseHookFunc);
|
||||||
{
|
|
||||||
if (g_mouseHook)
|
|
||||||
{
|
|
||||||
UnhookWindowsHookEx(g_mouseHook);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_origCursorPos = { MAXLONG, MAXLONG };
|
|
||||||
g_mouseHook = CALL_ORIG_FUNC(SetWindowsHookExA)(
|
|
||||||
WH_MOUSE_LL, &lowLevelMouseProc, Dll::g_origDDrawModule, 0);
|
|
||||||
|
|
||||||
if (g_mouseHook)
|
|
||||||
{
|
|
||||||
INPUT inputs[2] = {};
|
|
||||||
inputs[0].mi.dy = 1;
|
|
||||||
inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE;
|
|
||||||
inputs[1].mi.dx = 1;
|
|
||||||
inputs[1].mi.dwFlags = MOUSEEVENTF_MOVE;
|
|
||||||
SendInput(2, inputs, sizeof(INPUT));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LOG_ONCE("ERROR: Failed to install low level mouse hook, error code: " << GetLastError());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI setCursorPos(int X, int Y)
|
BOOL WINAPI setCursorPos(int X, int Y)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user