mirror of
https://github.com/spice2x/spice2x.github.io.git
synced 2026-08-05 16:10:41 -07:00
touch: restore wintouchemu, fall back to it when native touch hooks fail (#834)
## Link to GitHub Issue or related Pull Request, if one exists Fixes #833 ## Description of change Last couple PRs - such as #820 #827 #828 - made the native touch hook & touch injection using `InjectTouchInput` the default path, since it performs much more reliably with both real touch screens and mouse (or any other synthetic source). However, user has reported that WINE lacks `InjectTouchInput` which means this won't work. As a fix, revive the old wintouchemu code. Native touch is still the default, but under following circumstances: 1. if `-touchemuforce` is set, or 2. if any of the required Windows touch APIs are unavailable then we fail over from native touch to wintouchemu code. For Linux, condition #2 would be hit during init, and gracefully switch over. Caveat: the poke code for IIDX and Nost will continue to require native touch, I do not want to maintain two paths for this. This means that iidx poke will stop working on Linux, unfortunately. ## Testing Tested on Windows with `-touchemuforce` set. This is mostly reverting Linux code path back to where we were last release, so this should just work with wine.
This commit is contained in:
@@ -223,25 +223,58 @@ namespace nativetouch {
|
||||
}
|
||||
}
|
||||
|
||||
void hook(HMODULE module) {
|
||||
static bool hook_prerequisites_available(HMODULE module) {
|
||||
if (detour::iat_find("GetTouchInputInfo", module) == nullptr) {
|
||||
log_warning("touch::native", "GetTouchInputInfo unavailable");
|
||||
return false;
|
||||
}
|
||||
if (settings::EMULATE_DIGITIZER &&
|
||||
detour::iat_find("GetSystemMetrics", module) == nullptr) {
|
||||
log_warning("touch::native", "GetSystemMetrics unavailable");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool hook(HMODULE module) {
|
||||
native_touch_hooked = false;
|
||||
initialize_game_settings();
|
||||
|
||||
inject::hook(module);
|
||||
// check if the OS supports touch API (Win7+) and injection API (requires Win8+)
|
||||
if (!hook_prerequisites_available(module)) {
|
||||
return false;
|
||||
}
|
||||
if (!inject::hook_available(module)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
native_touch_hooked = true;
|
||||
// try hooking injection API first since they require the highest OS level
|
||||
// (WINE specifically did not implement this in 2026)
|
||||
if (!inject::hook(module)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// GetSystemMetrics
|
||||
if (settings::EMULATE_DIGITIZER) {
|
||||
GetSystemMetrics_orig = detour::iat_try(
|
||||
"GetSystemMetrics", GetSystemMetricsHook, module);
|
||||
if (GetSystemMetrics_orig != nullptr) {
|
||||
log_misc("touch::native", "GetSystemMetrics hooked");
|
||||
if (GetSystemMetrics_orig == nullptr) {
|
||||
log_warning("touch::native", "failed to hook GetSystemMetrics");
|
||||
return false;
|
||||
}
|
||||
log_misc("touch::native", "GetSystemMetrics hooked");
|
||||
}
|
||||
|
||||
// GetTouchInputInfo
|
||||
GetTouchInputInfo_orig = detour::iat_try("GetTouchInputInfo", GetTouchInputInfoHook, module);
|
||||
if (GetTouchInputInfo_orig != nullptr) {
|
||||
log_misc("touch::native", "GetTouchInputInfo hooked");
|
||||
if (GetTouchInputInfo_orig == nullptr) {
|
||||
log_warning("touch::native", "failed to hook GetTouchInputInfo");
|
||||
return false;
|
||||
}
|
||||
log_misc("touch::native", "GetTouchInputInfo hooked");
|
||||
|
||||
native_touch_hooked = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user