Fix mouse input when using DXVK

This commit is contained in:
Robert Krawczyk 2021-03-13 17:54:49 +01:00
parent 3a844cc3ca
commit 5a551b80b9
3 changed files with 17 additions and 21 deletions

View file

@ -136,12 +136,14 @@ HRESULT MainContext::CreateVertexBuffer(IDirect3DDevice9* pIDirect3DDevice9, UIN
return pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle); return pIDirect3DDevice9->CreateVertexBuffer(Length, Usage, FVF, Pool, ppVertexBuffer, pSharedHandle);
} }
bool MainContext::OneTimeFixInit(std::unique_ptr<wchar_t[]>& className) bool MainContext::OneTimeFixInit(std::unique_ptr<wchar_t[]>& className, HWND hWnd)
{ {
if (wcscmp(className.get(), L"SQEX.CDev.Engine.Framework.MainWindow") == 0) { if (wcscmp(className.get(), L"SQEX.CDev.Engine.Framework.MainWindow") == 0) {
otf_init = true; otf_init = true;
hWndFF13 = hWnd;
return true;
} }
return otf_init; return false;
} }
void MainContext::OneTimeFix() void MainContext::OneTimeFix()
@ -201,6 +203,10 @@ void MainContext::FF13_InitializeGameAddresses()
} }
void MainContext::FF13_OneTimeFixes() { void MainContext::FF13_OneTimeFixes() {
if (IsDXVK())
SetForegroundWindow(hWndFF13);
FF13_NOPIngameFrameRateLimitSetter(); FF13_NOPIngameFrameRateLimitSetter();
FF13_RemoveContinuousControllerScan(); FF13_RemoveContinuousControllerScan();
FF13_FixScissorRect(); FF13_FixScissorRect();
@ -305,6 +311,9 @@ void MainContext::FF13_SetFrameRateVariables()
void MainContext::FF13_2_OneTimeFixes() void MainContext::FF13_2_OneTimeFixes()
{ {
if (IsDXVK())
SetForegroundWindow(hWndFF13);
if (*ff13_2_frame_pacer_ptr_address) { if (*ff13_2_frame_pacer_ptr_address) {
**ff13_2_frame_pacer_ptr_address = MAX_FRAME_RATE_LIMIT; **ff13_2_frame_pacer_ptr_address = MAX_FRAME_RATE_LIMIT;
PrintLog("Frame pacer disabled"); PrintLog("Frame pacer disabled");

View file

@ -203,25 +203,14 @@ bool MainContext::CheckWindow(HWND hWnd)
bool class_found = config.GetWindowWindowClass().compare(className.get()) == 0; bool class_found = config.GetWindowWindowClass().compare(className.get()) == 0;
bool window_found = config.GetWindowWindowName().compare(windowName.get()) == 0; bool window_found = config.GetWindowWindowName().compare(windowName.get()) == 0;
bool force = config.GetBorderlessAllWindows(); bool force = config.GetBorderlessAllWindows();
bool ff13fix = OneTimeFixInit(className); bool ff13fix = OneTimeFixInit(className, hWnd);
return class_found || window_found || force || ff13fix; return class_found || window_found || force || ff13fix;
} }
void MainContext::ApplyWindow(HWND hWnd) void MainContext::ApplyWindow(HWND hWnd)
{ {
HWND insertAfter = HWND_TOP; if (config.GetOptionsAlwaysActive() || config.GetOptionsHideCursor())
if (config.GetWindowTopMost() && !context.IsDXVK())
insertAfter = HWND_TOPMOST;
SetWindowPos(hWnd, insertAfter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOCOPYBITS | SWP_NOSENDCHANGING);
SetFocus(hWnd);
// fixes DXVK window in background, no need to click anymore
if (context.IsDXVK())
SetForegroundWindow(hWnd);
if (config.GetOptionsAlwaysActive() || config.GetOptionsHideCursor() || IsDXVK())
{ {
context.oldWndProc = (WNDPROC)context.TrueSetWindowLongA(hWnd, GWLP_WNDPROC, (LONG_PTR)context.WindowProc); context.oldWndProc = (WNDPROC)context.TrueSetWindowLongA(hWnd, GWLP_WNDPROC, (LONG_PTR)context.WindowProc);
} }
@ -273,7 +262,7 @@ LRESULT CALLBACK MainContext::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LP
if (context.config.GetOptionsAlwaysActive()) if (context.config.GetOptionsAlwaysActive())
return TRUE; return TRUE;
if (!context.config.GetOptionsForceHideCursor() || context.IsDXVK()) if (!context.config.GetOptionsForceHideCursor())
while (::ShowCursor(TRUE) < 0); while (::ShowCursor(TRUE) < 0);
break; break;
} }
@ -281,10 +270,9 @@ LRESULT CALLBACK MainContext::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LP
case WM_ACTIVATEAPP: case WM_ACTIVATEAPP:
if (context.config.GetOptionsAlwaysActive()) if (context.config.GetOptionsAlwaysActive())
return TRUE; return TRUE;
} }
if (context.config.GetOptionsForceHideCursor() || context.IsDXVK()) if (context.config.GetOptionsForceHideCursor())
while (::ShowCursor(FALSE) >= 0); while (::ShowCursor(FALSE) >= 0);
return CallWindowProc(context.oldWndProc, hWnd, uMsg, wParam, lParam); return CallWindowProc(context.oldWndProc, hWnd, uMsg, wParam, lParam);

View file

@ -65,8 +65,6 @@ private:
enum class AutoFixes : u32 enum class AutoFixes : u32
{ {
NONE = 0, NONE = 0,
RESIDENT_EVIL_4,
KINGS_BOUNTY_LEGEND,
FINAL_FANTASY_XIII, FINAL_FANTASY_XIII,
FINAL_FANTASY_XIII2, FINAL_FANTASY_XIII2,
}; };
@ -74,6 +72,7 @@ private:
void EnableAutoFix(); void EnableAutoFix();
AutoFixes autofix = AutoFixes::NONE; AutoFixes autofix = AutoFixes::NONE;
HWND hWndFF13 = 0;
std::mutex fix_mutex; std::mutex fix_mutex;
@ -140,7 +139,7 @@ private:
void FF13_2_OneTimeFixes(); void FF13_2_OneTimeFixes();
void FF13_2_EnableControllerVibration(); void FF13_2_EnableControllerVibration();
bool OneTimeFixInit(std::unique_ptr<wchar_t[]>& className); bool OneTimeFixInit(std::unique_ptr<wchar_t[]>& className, HWND hWnd);
std::atomic_bool otf_init = false; std::atomic_bool otf_init = false;
static void Fix_Thread(); static void Fix_Thread();