Repository navigation
[Windows] Fix Space input after Alt+Space with previous Microsoft IME - #192105
auto-submit[bot] merged 1 commit into
Conversation
There was a problem hiding this comment.
Code Review
This pull request updates the Windows keyboard key embedder handler to release stale pressed key states when a fresh IME key-down event (VK_PROCESSKEY) is received, addressing scenarios where a native modal loop leaves a key recorded as pressed. A corresponding unit test, FreshImeKeyDownReleasesStalePressedKey, has been added to verify this behavior. There are no review comments, and I have no feedback to provide.
mattkae
left a comment
There was a problem hiding this comment.
A small suggestion to clean this up, but looks good overall!
|
@JIWON1923 Pinging you in case this got lost! |
Thanks for the ping, and sorry for the delayed response! If I remember correctly, I kept this check outside the It's been a while, so I'd like to test this again to make sure. I'll take another look and get back to you! |
|
Thanks for the suggestion! I tried it locally and tested it with Use previous version of Microsoft IME enabled. It turns out the suggested placement breaks the fix, and it also makes the new regression test Why the check can't move inside
|
mattkae
left a comment
There was a problem hiding this comment.
Thanks for the thorough response! This looks good to me.
|
Thanks for the contribution! |
35d595b to
eccd612
Compare
|
Golden file changes have been found for this pull request. Click here to view and triage (e.g. because this is an intentional change). If you are still iterating on this change and are not ready to resolve the images on the Flutter Gold dashboard, consider marking this PR as a draft pull request above. You will still be able to view image results on the dashboard, commenting will be silenced, and the check will not try to resolve itself until marked ready for review. For more guidance, visit Writing a golden file test for Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. |
|
autosubmit label was removed for flutter/flutter/192105, because - The status or check suite Google testing has failed. Please fix the issues identified (or deflake) before re-applying this label. |
812df80 to
6338fc1
Compare
|
autosubmit label was removed for flutter/flutter/192105, because - The status or check suite Mac_arm64_verify_binaries has failed. Please fix the issues identified (or deflake) before re-applying this label. |
|
@mattkae Could you re-apply |
6338fc1 to
43cbd59
Compare
…13653) Manual roll Flutter from 9c427b5d7b1c to 1b9585481095 (32 revisions) Manual roll requested by [email protected] flutter/flutter@9c427b5...1b95854 2026-11-13 [email protected] Roll pub packages (flutter/flutter#196541) 2026-11-13 [email protected] Do not route PRs for review without cla, convert to draft (flutter/flutter#196341) 2026-11-13 [email protected] Roll Skia from d87a6c04da74 to 11f46cfe8838 (13 revisions) (flutter/flutter#196533) 2026-11-13 [email protected] [flutter_tools, flutter_test] Deprecate --experimental-faster-testing (flutter/flutter#196123) 2026-11-13 [email protected] [flutter_tools] Handle RPCError in ScreenshotCommand.runSkia (flutter/flutter#196132) 2026-11-13 [email protected] Roll Dart SDK from a8b961fd48bb to c91e8b6674e2 (2 revisions) (flutter/flutter#196502) 2026-11-13 [email protected] Roll Skia from 0c5ce4960cef to d87a6c04da74 (12 revisions) (flutter/flutter#196497) 2026-11-13 [email protected] Don't call `skia_image()` for raster-owned images in `DlImage::Equals` (flutter/flutter#196473) 2026-11-13 [email protected] [flutter_tools] Require FlutterCommandRunner DI fields and extract findCommandName (flutter/flutter#196331) 2026-11-13 [email protected] [web] Unify ui.Canvas behind a shared EngineCanvas frontend (flutter/flutter#196348) 2026-11-13 [email protected] Link to MediaQuery.displayFeaturesOf from DisplayFeatures (flutter/flutter#193728) 2026-11-13 [email protected] Removes reference to unnecessary ensureSemantics call in doc (flutter/flutter#195831) 2026-11-13 [email protected] [flutter_tools] Register trackWidgetCreation in AppleBuildOptionsBundle (flutter/flutter#196078) 2026-11-12 [email protected] [Android] Skip the HardwareBuffer defect fallback for platform views (flutter/flutter#193441) 2026-11-12 [email protected] Fix supports_decal check in framebuffer_blend.frag (flutter/flutter#196227) 2026-11-12 [email protected] [ios] Update the screen in didUpdateEffectiveGeometry (flutter/flutter#195508) 2026-11-12 [email protected] [flutter_tools] Add `Cache-Control` headers for web test assets (flutter/flutter#196414) 2026-11-12 [email protected] Roll Skia from 3b71ec08218f to 0c5ce4960cef (16 revisions) (flutter/flutter#196472) 2026-11-12 [email protected] [web] Render bounded ImageFilter.blur on wimp (flutter/flutter#196081) 2026-11-12 [email protected] Roll Dart SDK from 69567bd3c427 to a8b961fd48bb (2 revisions) (flutter/flutter#196464) 2026-11-12 [email protected] [engine] Release the Skia OpenGL resource context on shutdown (flutter/flutter#193592) 2026-11-12 [email protected] [web] Fix decoding of still AVIF images on Chrome (flutter/flutter#195958) 2026-11-12 [email protected] Gate SurfaceControl context setting on API 34+ (flutter/flutter#196394) 2026-11-12 [email protected] [flutter_tools] Only pass on a valid root tool in DASH__TOOL (flutter/flutter#196228) 2026-11-12 [email protected] Support GL_TEXTURE_EXTERNAL_OES embedder textures in Impeller (flutter/flutter#195857) 2026-11-12 [email protected] Stop building linux/wasm_release in local_engine_builds (flutter/flutter#196345) 2026-11-12 [email protected] Split flame out of Linux customer_testing (flutter/flutter#196347) 2026-11-12 Jiwon Lee [Windows] Fix Space input after Alt+Space with previous Microsoft IME (flutter/flutter#192105) 2026-11-12 [email protected] [flutter_tools] Add ToolExtensionException, exit() guard, graceful shutdown, and base modifiers (flutter/flutter#195908) 2026-11-12 [email protected] Roll Packages from 653628e to 14f9933 (9 revisions) (flutter/flutter#196450) 2026-11-12 [email protected] Roll Dart SDK from e5add7a25b32 to 69567bd3c427 (2 revisions) (flutter/flutter#196437) 2026-11-12 [email protected] Roll Skia from 9aa2513a4ac9 to 3b71ec08218f (1 revision) (flutter/flutter#196436) If this roll has caused a breakage, revert this CL and set the roller to dry run mode using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 ...
Fixes #189495
Description
After
Alt+Spaceopens the Windows system menu, the Space key-up does not always reach Flutter while the native menu is active. Flutter can therefore retain a stale pressed record that maps the physical Space key to the logical Space key.With Use previous version of Microsoft IME enabled, the next physical Space press can first arrive as a fresh
WM_KEYDOWN(VK_PROCESSKEY)with the Space scan code, followed by the translatedWM_KEYDOWN(VK_SPACE)event.The existing stale-state recovery synthesizes the missing Space key-up, but then continues processing the
VK_PROCESSKEYevent and records it as the logical key for physical Space. The following translatedVK_SPACEevent consequently inheritsVK_PROCESSKEYas its sequence logical key and is filtered as an IME event. Space input then remains unavailable.When this state is detected, the handler now synthesizes the missing key-up and filters the fresh
VK_PROCESSKEYevent without recording it. The following translatedVK_SPACEevent is then processed normally.The observed failing event is
WM_KEYDOWN(VK_PROCESSKEY). The implementation reuses the handler's existing definition of a key-down event, which also includesWM_SYSKEYDOWN, so the same pressed-state invariant is preserved for system key-down messages. The early path additionally requires an existing record for the same physical key and a previous-key-state bit indicating a fresh press.Normal IME events without a stale pressed record, key-up events, and repeated key-down events continue through the existing paths.
Microsoft documents the previous IME setting here: Revert to a previous version of an Input Method Editor (IME)
Win32 behavior
Microsoft documents that:
WM_SYSKEYDOWNis posted when Alt is held while another key is pressed.WM_KEYDOWNindicates the previous key state, allowing a fresh down transition to be distinguished from an auto-repeat.VK_PROCESSKEY, as described byImmGetVirtualKey.SC_KEYMENUidentifies a window-menu request caused by a keystroke.Here,
229isVK_PROCESSKEY,32isVK_SPACE, and scan code57is the physical Space key.Diagnostic log excerpts
Current Microsoft IME
The next Space press arrives directly as
VK_SPACE. The existing stale-state recovery handles this case:Previous Microsoft IME before this change
A fresh
VK_PROCESSKEYarrives first. The existing recovery replaces the logical record with229, so the translatedVK_SPACEevent is also filtered:Previous Microsoft IME after this change
The stale Space record is released while filtering the fresh
VK_PROCESSKEY. The translatedVK_SPACEevent then arrives with no stale record and is processed as a normal key-down:Screenshot
alt.space.mov
Pre-launch Checklist
///).If you need help, consider asking for advice on the #hackers-new channel on Discord.
If this change needs to override an active code freeze, provide a comment explaining why. The code freeze workflow can be overridden by code reviewers. See pinned issues for any active code freezes with guidance.
Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the
gemini-code-assistbot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.