PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C++
Add IME keyboard layout and panel metrics support (#3973)
* Add IME keyboard layout and panel metrics support - Introduced new header and implementation files for IME keyboard layout handling. - Added structures for viewport metrics, keyboard grid layout, and drawing parameters. - Implemented functions to compute viewport and panel metrics for the IME dialog. - Enhanced the IME dialog UI to utilize the new keyboard layout and metrics. - Updated input handling to support new keyboard interactions and layout adjustments. - Added caret management and text normalization features in the IME dialog state. - Improved window positioning logic to accommodate different screen resolutions. * fix for Maxos Linux builds * Align IME behavior with real PS4 libSceIme/Dialog flow Features: - Add validation helpers for IME option/language/extended-option masks - Implement `sceImeGetPanelSize` sizing logic - Replace `sceImeSetTextGeometry` no-op path with real state/argument validation - Align panel sizing/validation paths closer to PS4 IME behavior - Improve panel text/caret handling reliability during UI updates - Add IME panel movement via controller right stick - Support mouse drag repositioning for the panel - Respect `FIXED_POSITION` by disabling movement when locked Updates: - Tighten `sceImeOpen` checks (user/type/input method, handler, work alignment, reserved, overlap) - Validate initial/runtime text rules (`\n`/`\r` and surrogate rejection) in open/set-text paths - Enforce caret bounds and null-caret behavior in `sceImeSetCaret` - Update `sceImeUpdate` to return `NOT_OPENED` in invalid states and respect handler matching - Harden `ImeHandler` against null state/callback execution paths - Optimize keyboard grid rendering by reusing per-frame buffers - Reduce input callback allocations with fixed-size buffers - Harden panel update paths for invalid handler/open-state cases - Clamp panel position to visible screen bounds - Apply stick deadzone/speed scaling for stable movement - Keep panel coordinates consistent with IME coordinate mode * 🤦♂️ * Enhance IME UI and Input Handling - Introduced BrightenColor function to adjust color brightness for UI elements. - Improved UTF-16 character handling with new functions to count UTF-16 units and reject input based on UTF-16 limits. - Added functionality to clamp input buffer to UTF-16 limits, ensuring text input does not exceed specified limits. - Refactored virtual pad input handling to encapsulate left stick directions and panel movement. - Enhanced IME UI drawing logic to incorporate new input handling and navigation features. - Updated keyboard layout handling to support dynamic configurations and improved navigation shortcuts. - Integrated additional font ranges for better language support in the IME, including Chinese, Arabic, and Thai. - Improved overall code structure and readability by utilizing modern C++ features such as std::vector and std::array. * Remove non existing Roboto Medium font from IME initialization * Enhance IME Dialog and UI with Improved Gamepad Navigation and Key Mapping - Added support for disabling gamepad input through OrbisImeDisableDevice in ImeDialogState. - Updated ImeKbLayout to modify key mappings for better character input, including changes to punctuation keys. - Implemented enhanced left stick navigation with repeat functionality in ImeUi, allowing for smoother input handling. - Introduced new constants for stick navigation delays and repeat intervals to improve responsiveness. - Refactored input handling logic to accommodate both virtual and gamepad inputs, ensuring consistent behavior across devices. - Added functionality to clear all text in the input field with a specific shortcut, aligning with expected user behavior. * clang * Enhance IME functionality with improved gamepad navigation and layout handling * ime: fix specials/accent layout mapping and dynamic panel resize handling - Expand specials/accent keyboard layouts to a 7-row model and move function keys to fixed bottom rows. - Add variable row-height support to the keyboard grid (`fixed_bottom_rows`, `bottom_row_h`) and compute row offsets/span heights from layout config. - Preserve function-row height in `ime_ui` and `ime_dialog_ui` while distributing remaining height across typing rows. - Make mode-switch focus layout-driven by resolving `SymbolsMode`/`SpecialsMode` action keys in the active layout instead of relying on implicit row assumptions. - Track panel layout anchor deltas in `ime_dialog_ui` and use press-offset dragging so cursor remains on the originally pressed point when panel dimensions/position change. * Add IME UI enhancements and shared utilities - Introduced new states for panel navigation and selector fade in `ime_ui.h`. - Added a new header file `ime_ui_shared.h` containing utility functions and structures for virtual pad input handling, including deadzone application and stick navigation direction resolution. - Updated `font_stack.cpp` to include additional Unicode ranges for general punctuation in the font atlas. * Refactor IME settings: remove deprecated accessibility options and update references to use new settings structure * Refactor IME UI Navigation and Activation Logic - Introduced a new mechanism for handling virtual button repeat actions, improving responsiveness for gamepad navigation. - Added support for stick navigation with adjustable repeat rates and initial delays, enhancing user experience during input. - Removed the ImeSelectorFadeState structure and related logic to streamline the IME keyboard layout drawing process. - Simplified the activation logic for menus, ensuring that menu activation is more intuitive and responsive to user input. - Adjusted the navigation threshold for stick inputs to improve sensitivity and control. - Cleaned up the code by removing unused variables and consolidating repeated logic into reusable functions. * Refactor IME UI shared header: streamline code and improve structure - Removed unused includes and redundant structures. - Consolidated virtual pad snapshot handling and input state management. - Introduced new structures for OSK pad input and navigation handling. - Updated function signatures for clarity and consistency. - Enhanced keyboard parameter application for OSK shortcuts. - Improved overall readability and maintainability of the code. * Refactor OskShortcutActionResult to simplify triangle button press handling * Enhance IME Keyboard Layout and UI Functionality - Added new key glyphs for Shift and Caps Lock in ime_kb_layout.h. - Improved keyboard navigation logic to skip non-action keys. - Introduced new constants for selector IDs in ime_ui.cpp for better readability. - Refactored keyboard row and column clamping logic for clarity. - Enhanced selector drawing logic with fade and pulse effects for better user feedback. - Implemented functions for cycling keyboard case states and toggling keyboard family modes. - Added functionality to focus on keyboard action keys based on their actions. - Improved edit menu handling with new templated functions for better code reuse. - Updated caret blinking logic to improve text input experience. - Expanded symbol ranges in font_stack.cpp to include keyboard symbols. --------- Co-authored-by: w1naenator <valdis.bogdans@hotmail.com>
V
Valdis Bogdāns committed
05df651cd8a104b229f8649eb3fbff3d1a114294
Parent: c79abb6
Committed by GitHub <noreply@github.com>
on 5/9/2026, 8:41:14 PM