## Link to GitHub Issue or related Pull Request, if one exists
fixes#875
## Description of change
Adds `-apistream`, an optional HTTP video stream of the mirrored screen.
It listens on the API port +2.
Two endpoints, sharing the same `screen`, `fps` and `q` parameters:
/stream.mjpg JPEG frames, for clients with no container support
/stream.h264 H.264 annex-b, for an app driving MediaCodec or
VideoToolbox itself
One encoder per connection, fed by a per-screen pump that always hands
over the newest frame, so a slow reader drops frames instead of building
a backlog. `capture.get_jpg` behaviour is unchanged.
Additional documentation for developers:
https://github.com/spice2x/spice2x.github.io/wiki/Video-Stream
## Testing
Replaces the vendored `external/libjpeg-turbo` tree (191 files) with the
`mingw-w64-libjpeg-turbo` AUR package, already built into the Docker
deps image.
The WinXP toolchains set `CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY`
against their own sysroot, so they cannot see AUR mingw packages. Those
targets now build without JPEG support: `jpeg_encoder::encode` compiles
to a stub returning `false`, which callers already treat as "no frame
available". The practical effect is that `capture.get_jpg` over the API
is unavailable on WinXP builds; every other target is unchanged.
CMake names `libjpeg.a` outright, since the package also ships an import
library and linking that would add a runtime DLL dependency.
## Link to GitHub Issue or related Pull Request, if one exists
None
## Description of change
Patch Manager showed valid signature patches as broken: **"Bad patch;
patch is neither on or off"** instead of Enabled/Disabled, so they could
not be toggled.
`SignaturePatch::to_memory` had two bugs. In the configurator it cached
a file offset as `data_offset_ptr`, so status checks `memcmp`'d a fake
address. It also passed JSON `offset` into `find_pattern` while still
indexing the signature/replacement from 0, which mis-aligned every patch
with `offset != 0`. This change locates the signature start, applies
`offset` afterward, compares only the replacement window, and leaves the
pointer null so `is_patch_active` re-resolves from `data_offset`.
Not proposed as built-in patches. The JSON below is the reproduction
case: each entry uses `offset > 0` and a replacement shorter than the
signature.
## Testing
Reproduced in Patch Manager against `bm2dx.dll` using the signature JSON
below. Before the fix, every patch reported "neither on or off". After
the fix, each patch locates, shows Disabled/Enabled, and toggling writes
only the replacement bytes at `signature_match + offset`.
## Demo
<details>
<summary>Signature JSON used to reproduce (offset + short
replacement)</summary>
```json
[
{
"info": "streaming / getcm patches (type=signature)",
"gameCode": "LDJ",
"notes": "Each site uses a unique signature (usage=0 only)."
},
{
"type": "group",
"id": "streaming-getcm",
"name": "Streaming getcm",
"description": "Enable all children so streaming.common merges without Banner FS and getcm can fire without visiting Test Mode.",
"gameCode": "LDJ"
},
{
"name": "Streaming: merge common without Banner",
"description": "NOP jz in streaming.common callback so CM work table is filled even when Banner FS is still null.",
"caution": "Required. Without this, early common responses are discarded and getcm stays empty.",
"gameCode": "LDJ",
"type": "signature",
"group": "streaming-getcm",
"dllName": "bm2dx.dll",
"signature": "E8????????4885C00F84????????488D0D????????488D15????????41B848080000",
"replacement": "909090909090",
"offset": 8,
"usage": 0
},
{
"name": "Streaming: scheduler without Banner (common)",
"description": "NOP jz after Banner getter on the common branch of the periodic scheduler.",
"caution": "Enable with the getcm scheduler sibling. Unique via imul of common-interval dword.",
"gameCode": "LDJ",
"type": "signature",
"group": "streaming-getcm",
"dllName": "bm2dx.dll",
"signature": "E8????????4885C0742469057E791C0AE8030000",
"replacement": "9090",
"offset": 8,
"usage": 0
},
{
"name": "Streaming: scheduler without Banner (getcm)",
"description": "NOP jz after Banner getter on the getcm branch of the periodic scheduler.",
"caution": "Enable with the common scheduler sibling. Unique via imul of getcm-interval dword. Without this, getcm never schedules while Banner FS is null.",
"gameCode": "LDJ",
"type": "signature",
"group": "streaming-getcm",
"dllName": "bm2dx.dll",
"signature": "E8????????4885C07424690574B91D0AE8030000",
"replacement": "9090",
"offset": 8,
"usage": 0
},
{
"name": "Streaming: fall into getcm after common",
"description": "NOP jmp-after-common so the same scheduler tick can evaluate getcm instead of returning early.",
"caution": "Pair with Banner scheduler skips (or a live Banner FS).",
"gameCode": "LDJ",
"type": "signature",
"group": "streaming-getcm",
"dllName": "bm2dx.dll",
"signature": "891D????????E9????????E8????????4885C074246905",
"replacement": "9090909090",
"offset": 6,
"usage": 0
},
{
"name": "Streaming: getcm interval 1s #1",
"description": "Default getcm poll interval 1800s to 1s (first init store).",
"caution": "Enable #1 and #2 together. Trailing BF3C000000 distinguishes this init site.",
"gameCode": "LDJ",
"type": "signature",
"group": "streaming-getcm",
"dllName": "bm2dx.dll",
"signature": "C705????????18150000C705????????08070000C705????????201C0000BF3C000000",
"replacement": "01000000",
"offset": 16,
"usage": 0
},
{
"name": "Streaming: getcm interval 1s #2",
"description": "Default getcm poll interval 1800s to 1s (second init store).",
"caution": "Enable #1 and #2 together. Trailing 448925 distinguishes this init site.",
"gameCode": "LDJ",
"type": "signature",
"group": "streaming-getcm",
"dllName": "bm2dx.dll",
"signature": "C705????????18150000C705????????08070000C705????????201C0000448925",
"replacement": "01000000",
"offset": 16,
"usage": 0
}
]
```
</details>
Co-authored-by: Cursor <cursoragent@cursor.com>
## Link to GitHub Issue or related Pull Request, if one exists
#0
## Description of change
Significantly speeds up API screen capture and D3D9 screenshots saving.
Two reasons for doing this:
1. We now have a 4K game (GITADORA) and existing capture code was taking
multiple seconds.
2. Renewed user interest on streaming as we have a couple more companion
apps in active development.
**API screen capture (streaming), 1280x720:** 14.3ms -> 6.3ms per frame.
Back buffer copies go to pooled `D3DPOOL_SYSTEMMEM` surfaces via
`GetRenderTargetData` instead of allocating a lockable render target
every frame, and TooJpeg is replaced with libjpeg-turbo (encode 9.8ms ->
3.0ms). MSAA remains unsupported
**Screenshots for GITADORA arena model, across 4 screens with one of
them 4K**: 4068ms -> 124ms. `D3DXSaveSurfaceToFileA` is replaced with
fpng (encode 4043ms -> 76ms) and the screens encode in parallel.
Dropping D3DX also removes the `d3dx9_43.dll` ... `d3dx9_24.dll` probing
loop, so screenshots no longer fail outright on machines with no D3DX9
runtime installed.
Screenshot surfaces are read on the present thread, so no D3D call
reaches another thread for screenshots. This fixes a hang in DDR X2
introduced earlier in the branch: its device has no internal locking,
and reading the surface on a pool thread while the present thread sat
inside `GetRenderTargetData` left the game's own render thread
deadlocked.
## Testing
- **GITADORA** (arena model, D3D9Ex, 4K main plus three subscreens,
windowed) with
`-screenshotsub`: three sets of four screenshots, images verified
correct. Completion
order differs between sets, so the screens really are encoding in
parallel.
- **LovePlus** (KLP, plain D3D9, 768x1360): covers the inline path used
by games whose
image processing must not leave the present thread.
- **API screen capture** through a companion app: live video correct
throughout.
- **Print Screen** bound as the screenshot key: the clipboard copy
succeeded on every shot.
- Quitting the game after capturing leaves no `IDirect3DDevice9`
reference count warning,
so the pooled readback surfaces are released along with the device.
## Link to GitHub Issue or related Pull Request, if one exists
#345
## Description of change
**IIDX TDJ rom probe no longer touches removable media** —
`C:\000rom.txt` and `D:\001rom.txt` are not emulated paths; they hit
whatever is actually mounted on the user's machine. `D:` is commonly an
optical drive or card reader, and the launcher clears
`SEM_FAILCRITICALERRORS` process-wide before attach, so an empty drive
raises the modal *"insert a disk"* dialog and blocks the attaching
thread. The probe now checks `GetDriveTypeW` and only reads fixed and
RAM disks.
**`iat_find` no longer calls `log_fatal` on an unparseable module** —
`iat_try(nullptr)` walks every loaded module, including foreign ones
(injected, manually mapped, header wiped by AV/EDR/overlays). A non-`MZ`
DOS header called `log_fatal`. There is nothing to hook in such a
module, so it is skipped.
**`logger::stop()` can no longer hang forever** — hook installation
suspends every other thread, including the logging thread. `stop()`
unconditionally joined that thread, so `log_fatal` and the 30-second
`show_popup` watchdog both wedged instead of terminating, and logging is
asynchronous so nothing reached log.txt either. It now waits with a
timeout, then detaches and flushes synchronously.
**`GetFileSizeEx` was never hooked** — the hook was registered under the
name `"GetFileSize"`, so it re-patched that slot instead.
**Warn when `-modules` is set** — it changes where the game is run from,
and is usually set accidentally.
## Testing
*how was the code tested?*
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
For popn HC, some transparency effects, like the one for touch feedback,
rendered incorrectly; this is due to how alpha channel is handled for
subscreen overlay drawing on top of ImGui.
## Testing
Tested popn and iidx.
## Link to GitHub Issue or related Pull Request, if one exists
Related: #859 and #862.
## Description of change
Three SDVX (Valkyrie model) fixes:
* **API touch went to the wrong window.** SDVX registers touch on both
its Main Screen and Sub Screen windows, and the native injector kept
whichever attached last. The touch surface is now published explicitly:
sub screen window when windowed, main window in fullscreen.
* **Landscape never rotated API coordinates.** Synthetic contacts bypass
`transform::hardware_to_game`, so they missed the rotation a real finger
gets. Applied before injection now, as portrait already did. Extracted
to `sdvx_landscape_rotate` so both paths share it; gated on the native
path since `wintouchemu` rotates via the subscreen overlay instead.
* **`-sdvxnosub` didn't hide the sub window in fullscreen.**
`ShowWindow_hook` had branches for GITADORA, pop'n and IIDX but not
SDVX. Added the missing one.
## Testing
Tested Nabla
## Link to GitHub Issue or related Pull Request, if one exists
#0
## Description of change
Fix mouse and touch API handling for gitadora.
* hook native touch in every arena window mode (previously only using
wintouchemu for 1 windowed mode)
* publish the touch window (SMALL panel, or the main window drawing the
overlay) and only attach injection there
* route touch on the SMALL window straight through instead of the
overlay transform, and accept the mouse only there
* fix spiceapi by forcing 800x1280 touch canvas size
* run API capture before the subscreen present to fix api not showing
sub image
## Testing
Test:
gitadora 1/2/4 windowed mode, fullscreen
iidx /sdvx / popn windowed/fullscreen for regressions
## Link to GitHub Issue or related Pull Request, if one exists
#0
## Description of change
Adds `-screenshotsub`. Off by default. When on, screenshots include the
subscreens. All subscreens are captured, even if they are hidden from
view. Works for all four screens of gitadora arena model as well.
This should also fix an issue with API / companion app not capturing
gitadora subscreen correctly.
Note: only done for DX9... DX11 will need another PR to make this work.
Unrelated to this PR, there seems to be a bug with gitadora not
accepting mouse or api touch input.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
#0
## Description of change
Adds the `-screenshotoverlay` option.
By default, file screenshots exclude the Spice overlay. Enabling this
option captures screenshots after the overlay is rendered.
Also updates DX11 backend to allow screenshots even when overlay is
disabled.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
Create a new thread that polls for the following hotkeys:
* super exit (both alt+f4 and bound key)
* coin insert
* screenshot
The goal is to make the capture of these more reliable, because before
this PR it wasn't.
## Testing
> [!NOTE]
> Before submitting code changes...
> * Please do note that this is a GPL v3.0 open source project.
> * Please read the
[CONTRIBUTING](https://github.com/spice2x/spice2x.github.io/blob/main/CONTRIBUTING.md)
guide.
> * Maintainers reserve the right to reject or modify your submission
without reason.
> * No new compiler warnings must be introduced. Check the CI build
results.
>
> Feel free to remove this section after you have read it.
## Link to GitHub Issue or related Pull Request, if one exists
## Description of change
Fix gibberish in dynamic Japanese text in GuitarFreaks/DrumMania XG2
(K32/K33) when Windows uses a non-Japanese system code page.
XG2 converts UTF-8 property strings through WideCharToMultiByte(CP_ACP)
before rendering. On systems where the active code page is not
Shift-JIS, these strings are converted using the system code page and
become corrupted or turn into question marks.
Spice2x already hooks WideCharToMultiByte and redirects these
conversions to CP932 for newer 64-bit Gitadora models. This change makes
the existing hook available to 32-bit builds and enables it specifically
for XG2 models K32 and K33.
The existing 64-bit Gitadora Arena and T44 conditions remain unchanged.
## Testing
Before
<img width="1280" height="745" alt="image"
src="https://github.com/user-attachments/assets/34aa2c93-89e8-4c4f-b267-6cbc236f19de"
/>
<img width="2054" height="1188" alt="image"
src="https://github.com/user-attachments/assets/d88b5770-5545-4402-b9e7-3126fe048fb9"
/>
After
<img width="1280" height="720" alt="image"
src="https://github.com/user-attachments/assets/d43b4e47-b6af-4b97-8898-53849c9a0ca4"
/>
<img width="1280" height="720" alt="image"
src="https://github.com/user-attachments/assets/884301e2-1edd-4ad2-92ac-ece656853fe7"
/>
- Tested GuitarFreaks XG2 on a non-Japanese (English US) Windows.
- Verified that Community Log preset comments render correctly in
Japanese.
- Verified that Cooperation Challenge descriptions, rewards, and
progress text render correctly.
- Confirmed that the previous mojibake and question marks no longer
appear.
- GitHub Actions build completed successfully for both architectures.
## Link to GitHub Issue or related Pull Request, if one exists
Fixes#858
## Description of change
Fix orientation being wrong in windowed mode when API touch is used
Fix mouse no longer working when API client is in use.
This PR only affects windowed mode SDVX.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
Fixes#858
## Description of change
Landscape mode needs another adjustment applied to touch coordinates.
This fixex both native touch and wintouchemu paths.
## Testing
Tested landscape, also with full screen resolution changes.
## Link to GitHub Issue or related Pull Request, if one exists
Fixes#852
## Description of change
Add SDVX valk cab tape LED output over API
## Testing
tested with custom python script over api
## Link to GitHub Issue or related Pull Request, if one exists
#0
## Description of change
Old behavior: Forced redraw presented the subscreen every main frame,
even when the game already presented it, causing duplicate presents and
tearing in popn (was fine in sdvx)
New behavior: Forced redraw acts as a fallback, presenting only when the
game skips or fails a subscreen update.
## Testing
Popn - no more glitching
Nabla - no regression
## Link to GitHub Issue or related Pull Request, if one exists
Fixes#855
## Description of change
Legacy camera hooks are specifically for IIDX 25/26 and they only
perform redirection of device discovery (emulates USB vendor/device ID
and USB port). It has very limited use since most cameras are
practically unusable in IIDX 25/26. Don't enable it, unless explicitly
requested by the user.
New truth table for `-iidxcabcams` :
| Mode | `-iidx` off (cab setup) | `-iidx` on |
|---|---|---|
| `auto` | Native cameras enabled (same as `on`) | Cameras disabled
(same as `off`) |
| `off` | Cameras disabled | Cameras disabled |
| `on` | Native cameras enabled | Native cameras enabled |
| `legacy` | Native cameras enabled | IIDX 25/26 discovery emulation
enabled |
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
Fixes broken Japanese text when Windows `Use Unicode UTF-8 for worldwide
language support` setting is enabled. This setting changes the system
ACP to UTF-8 (65001), causing legacy Shift-JIS lead-byte checks to fail.
Windows 11: requests the legacy process code page through the manifest.
Windows 10: detects ACP 65001 (UTF-8), warns the user via deferred log,
and applies compatibility hook (only for popn pika model for now)
Windows 7 and below - UTF-8 option doesn't exist.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
This allows API touches to be recognized even if the main window is in
focus.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
There is a patch for GITADORA series that fixes frame pacing on modern
Windows. Turn it into a signature patch and embed it into the game.
## Testing
should work for all 64-bit gitadora versions, pre-GWD
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
Un-deprecate SDVX landscape mode. The game calls `GetViewport` to figure
out the camera position, so if we return a sane value the game goes back
to rendering correctly.
## Testing
Tested nabla only
## Link to GitHub Issue or related Pull Request, if one exists
Fixed https://github.com/spice2x/spice2x.github.io/issues/740
## Description of change
- Enable native D3D9 adapter-group dual fullscreen for the GITADORA
Arena model when the two-screen MAIN + SMALL configuration is selected
without windowed mode.
- Present MAIN and SMALL on their respective monitor heads while keeping
the invisible LEFT and RIGHT targets offscreen.
- Scope the new fake-swap-chain query behavior to the hidden GITADORA
two-head targets, preserving existing behavior for other games and
configurations.
The existing borderless-windowed two-screen path could not consistently
keep input and game timing synchronized and also reduced rendering
performance. Native dual fullscreen avoids that windowed composition
path.
## Testing
- Manually tested GITADORA Arena with separate MAIN and SMALL monitors
in fullscreen mode. Windowed mode still works if the user chooses to use
that.
- Confirmed both displays render correctly, touch input works on the
SMALL screen, gameplay input stays synchronized, and gameplay holds a
steady 60 FPS.
- Built `spicetools_spice64` at commit `e4a98e9` with the repository
Docker toolchain.
- Confirmed no new compiler warnings.
- Confirmed the forbidden static DLL import check passes.
- Confirmed the Windows 7 DLL compatibility check reports `All DLLs
OK!`.
---------
Co-authored-by: vgod <428979+vgod@users.noreply.github.com>
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
- Replace unnecessary precision timers with standard sleeps to reduce
wakeups and background CPU usage.
- Reuse buffers in raw input, touchscreen, and HID output paths to
eliminate steady-state allocations.
- Pre-index HID button groups and correctly process batched HID reports.
No functional changes.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
Fixes#840
## Description of change
Currently, for subscreen games, mouse events are still delivered even
when the subscreen overlay window is not visible.
Change this so that the subscreen overlay must be active and under the
mouse cursor for the mouse-to-touch transformation to occur. Applies to
both native and wintouchemu.
## Testing
Needs to test everything again..
iidx:
- [ ] full screen with overlay
- [ ] single window with overlay
- [ ] two window
Test: mouse, poke, api, real touch screen
sdvx:
- [ ] full screen with overlay
- [ ] windowed
popn
- [x] full screen with overlay
- [x] window with overlay
- [x] dedicated window
gitadora
- [x] single window with overlay
- [x] dedicated sub window
nostalgia
- [x] fullscreen
- [x] windowed
test: poke
wintouchemu
- [ ] Do all of the above again with wintouchemu
## Link to GitHub Issue or related Pull Request, if one exists
#201
## Description of change
- Adds MJPEG camera support using Media Foundation decoding.
- Moves camera capture to asynchronous Source Reader callbacks.
- Supports native NV12 and YUY2 capture, preferring target-sized native
formats over MJPEG when possible.
- Improves capture and rendering performance through callback-paced
reads, bulk frame uploads, optimized row-based flips, and lazy
allocation of flip textures.
- Makes runtime media-type changes interrupt pending reads and safely
flush and reconfigure the Source Reader.
- Improves automatic mode selection based on aspect ratio, proximity to
1280x720, frame rate, and capture format.
- Hardens camera shutdown, flush handling, media-type changes, and
repeated capture failures.
## Testing
Tested with two cameras in tdj
## Link to GitHub Issue or related Pull Request, if one exists
Regressed by #657
## Description of change
Workaround for SDVX4 was applied too broadly and caused sdvx 1/2/3 to
not boot, depending on contents of avs-config.xml.
`property_search_safe` throws a fatal error if the node is not present.
What we wanted to do was to check for presence.
## Testing
sanity checked sdvx 1/2/3/4
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
ImGui filebrowser extension crashes due to MinGW quirk about UNC path
handling.
## Testing
## 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.
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
Touch piano mode. Allows piano keys to be played with the touch screen.
Since the touch screen is still needed for menu navigation (including
during songs) a toggle switch is added so that the user can flip between
navigation mode and piano mode.
The touch targets are pixel-perfect. Don't let the game's piano
animations fool you.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
n/a
## Description of change
Prevent the game from launching a blank window when launching fullscreen
with sub disabled.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
#814
## Description of change
Make gitadora arena model use native touch instead of wintouchemu. Only
single window mode with overlay is affected.
This removes the last consumer of `INJECT_MOUSE_AS_WM_TOUCH` so all of
that code can be deleted.
## Testing
Tested touch screen and mouse interaction with single window mode.
## Link to GitHub Issue or related Pull Request, if one exists
#814
## Description of change
Switch over Nostalgia from wintouchemu to native touch hook.
Nostalgia has some strict timing requirements (touches must be updated
on every acio poll) so this takes a slightly different path to maintain
mouse holds.
Only a handful of consumers of wintouchemu remain:
1. beatstream - but it's off by default, only enabled as errata for
buggy touchscreens, or if the user forces it on (for Show Cursor)
2. gitadora single-window overlay - this is just for mouse so not a big
deal.
3. MFC HG mode - not a priority to fix.
## Testing
Tested full screen and windowed mode with touch / mouse / poke.
## Link to GitHub Issue or related Pull Request, if one exists
Another bug reported by a sea creature
## Description of change
Fix keyboard navigation in Controllers sub tabs.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
Reported by a certain sea reptile
## Description of change
Fix the + / - buttons for number patches not working. Regressed by one
of the ImGui version updates.
## Testing
seems fine now
## Link to GitHub Issue or related Pull Request, if one exists
Fixes#814
## Description of change
Touches via the API wasn't being delivered to native touch hook;
implement this, which closes the last gap we have vs. wintouchemu.
While we're here, implement popn subscreen support for companion as
well.
## Testing
Tested for iidx/sdvx/popn
## Link to GitHub Issue or related Pull Request, if one exists
Fixes#822
## Description of change
Add hooks for `libxact.dll` which only Nostalgia uses for audio. Detect
cases where the game would fail to launch (wrong number of channels) and
log a warning / deferred log.
## Testing
tested 2024102200
## Link to GitHub Issue or related Pull Request, if one exists
Fixes#814
## Description of change
Remove iidx/sdvx/popon `native touch` options.
Remove dead code in wintouchemu that deals with these games.
Native touch is now at feature-parity with wintouchemu. Native touch
options work better with touch screens, while rawinput-based wintouchemu
has compat issues on some touchscreens. For these subscreen games
deprecate the usage of wintouchemu and make them use native touch stack
by default.
### For future consideration
Gitadora - not sure what to do with this one. We only use wintouchemu
for the single window case. For all other configurations, the game
accepts mouse and touch input without any hooks, so perhaps nothing
needs to be done here.
Nostalgia - consider moving away from wintouchemu and adopt native touch
hook here as well.
## Testing
WIP
## Link to GitHub Issue or related Pull Request, if one exists
User reported
## Description of change
Sometimes the game moved the main window after `CreateWindowExA`
returned but before D3D initialization called
`graphics_capture_initial_window`. During this gap,
`GRAPHICS_HOOKED_WINDOW` was not set, so the placement hooks could not
identify the main window and preserve its monitor override. GITADORA
main, LEFT, and RIGHT windows are now registered immediately after
creation so later placement calls cannot undo their overrides.
This also adds `-gdwsmallsize` and `-gdwsmallpos` for explicitly setting
the SMALL window size and position. Explicit values override the
corresponding monitor-derived geometry, allowing the SMALL window's
10:16 aspect ratio to be preserved instead of stretching it to fill a
monitor.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
Fixes#635
## Description of change
Adds optional **button modifiers**, allowing a binding to require one or
more "modifier" buttons to be held before it activates.
- New "Modifiers" controller page in the overlay config to bind the
Modifier 1–4 source buttons.
- Each binding gains a 4-bit modifier_mask (Modifier 1-4). It is
persisted as an optional modifiers XML attribute on button nodes and
controller-preset entries. The attribute is optional and defaults to 0,
so existing config files and presets load unchanged and the feature is
off unless the user opts in.
- The button Edit properties popup gains a "Modifiers" dropdown to pick
which modifiers a binding requires. Doesn't apply to MIDI though.
- Input evaluation skips a binding whose required modifiers are not
held, falling through to its alternatives; velocity reporting uses the
same gated path.
- Controller-preset templates gain a "Modifiers" group for importing and
exporting.
## Testing
## Link to GitHub Issue or related Pull Request, if one exists
Part 1 of many fixes for #814.
## Description of change
For the native touch hook - add code to inject synthetic touches using
Windows API (`InjectTouchInput`).
Note that this is Windows 8+ only, but we can make an assumption that we
are running on Win10+ for these games (TDJ/UFC/High Cheers) since the
cabs assume Win10.
Detect mouse events and allow IIDX poke to call into this to inject
synthetic touches.
Also, update the nativetouchhook to independently calculate window size
and rotation, instead of relying on rawinput layer.
## Testing
Tested to work with native touch option on IIDX, SDVX, POPN, all full
screen / windowed / sub on/off combinations.
Edge cases:
* sdvx main monitor rotated 270 deg
* touch invert option
* windowed mode resize / moved
All seem to work.