Conversation
Allow the plugin to work with both Plover 4 (PyQt5) and Plover 5 (PySide6) by abstracting Qt imports behind a compatibility module.
Add keys_to_stroke() to convert key tuples back into stroke strings. Extract STENO_ORDER and NO_HYPHEN_KEYS to module-level constants. Fix test import to use absolute package path.
Add Mappings.serialize() for round-tripping configs to text. Support empty right-hand-side mappings for input combos that should be consumed without producing steno output.
Add profile management for saving/loading named mapping configurations. Include built-in profiles for generic, Xbox, Xbox Elite, and PlayStation.
Replace single-direction d-pad placeholders with all 15 direction combinations. Assign useful strokes: KPA (capitalize), HRO*ER (lowercase), SKWH (symbols starter), SKP (and), -LTZ (commands ender). Add hat alias for d-pad.
Move ControllerOption to option_ui.py with rumble feedback settings, show/hide back view, chroma color picker, and layout mode. Extract ControllerDisplay widget to display.py with set_show_back() support.
Add haptic feedback on stroke via SDL_GameControllerRumble using custom SDL events for thread safety. Use GameController API for standardized button names. Add SVG icon for the Controller Display tool.
Add plover4/plover5 extras_require for PyQt5/PySide6. Update entry point to use extracted option_ui module. Use recursive-include for assets.
Document all 15 d-pad direction combos with their assigned strokes. Link Emily's Symbols and Emily's Modifiers dictionaries. Add Advanced Driver Settings section. Add Windows 11 instructions for disabling Game Bar, Controller Bar, and Share button capture.
Override set_suppression() to track the engine's output state and gate rumble on it. Prevents haptic feedback when Plover is disabled.
Cover util functions, config parsing/serialization, controller state (buttons, hats, sticks, chording), machine rumble gating, option info validation, and profile management.
All built-in profiles were missing the d-pad combo mappings that prevent accidental multi-press strokes. Also adds triggers to the generic profile and stores the last-used profile name so it stays selected in the UI.
Chroma-keyable Controller DisplayThe controller display supports chroma key backgrounds, making it easy to capture, key out, and overlay in streaming or recording software. Display SettingsThe display settings allow you to enable the controller’s back view and change the chroma key color. Back View Support for PaddlesThe controller display can show a rear view for paddle inputs. You can also use a different chroma key color depending on your capture setup. Vertical LayoutA vertical layout is available for setups that need a taller, more compact controller display. Improved Configuration GUIThe updated configuration GUI makes it easier to change options without editing raw configuration values manually. Rumble SettingsRumble settings can be adjusted directly from the GUI. Controller ProfilesController profiles allow you to save and switch between different controller configurations. Advanced ConfigurationAdvanced mapping controls are still available in the Raw Editor for users who need direct access to the underlying configuration. |









Big update that adds Plover 5 (PySide6) compatibility, reworks the settings UI, and adds a bunch of new features.
Plover 5 / Qt compatibility
qt_compat.py) so the plugin works with both PyQt5 (Plover 4) and PySide6 (Plover 5)plover4andplover5extras insetup.cfgSettings UI
option_ui.py) with organized tabs for hardware, steno mapping, and display settingsdisplay.pyHaptic feedback
SDL_GameControllerRumble, with thread-safe custom SDL eventsD-pad combos
KPA(capitalize),HRO*ER(lowercase),SKWH(Emily's Symbols starter),SKP("and"),-LTZ(Emily's Modifiers ender)Tests
Other changes
keys_to_stroke()for round-tripping key tuples back to stroke stringsMappings.serialize()for saving configs back to texta,leftshoulder,guide, etc.)