On Mon, 11 Nov 2024 17:57:30 GMT, Martin Fox <m...@openjdk.org> wrote:
> Input methods don’t work for text controls inside Popups. This PR fixes that. > > Some background: > > A PopupWindow always has an owner. The owner of the first Popup is a standard > Window; I’ll refer to that as the root window. But a popup can show another > popup (for example, a popup may contain a ComboBox which opens a menu which > is also a Popup) resulting in a stack of PopupWindows. > > Under the hood each PopupWindow has its own scene (this is not visible in the > API). So if there’s a stack of PopupWindows there’s also a stack of scenes > with the root window’s scene at the bottom. > > The OS focus always stays with the root window (in part because JavaFX can’t > move the OS focus when it’s embedded). This means a KeyEvent is initially > fired at the focusOwner in the root window’s scene. Each PopupWindow in the > stack uses an EventRedirector to refire that key event at its own focusOwner. > In effect KeyEvents start processing at the top-most scene in the stack and > work their way down to the root scene. > > There are several reasons why Input Methods aren’t currently working for > Popups. > > - InputMethodEvents are not being redirected. This PR extends the > EventRedirector to refire InputMethod events in the same way it refires > KeyEvents. > > - If a PopupWindow contains a TextInput control it will enable input method > events on its scene which has no effect since that scene doesn’t have OS > focus. If a PopupWindow wants to enable IM events it needs to do so on the > root window’s scene. Put another way IM events should be enabled on the root > scene if and only if one of the focusOwners in the scene stack requires IM > events. > > - The OS always retrieves the InputMethodRequests from the root window’s > scene. InputMethodRequests should be retrieved from whichever focusOwner in > the scene stack is processing InputMethodEvents. > > In this PR the root scene creates an InputMethodStateManager object and > shares it with all of the Popup scenes in the stack. Any time the focusOwner > changes in a scene it tells the InputMethodStateManager so it can determine > whether IM events should be enabled on the root scene. The root scene also > calls on the InputMethodStateManager to retrieve InputMethodRequests so it > can grab them from the appropriate Node in the scene stack. > > This PR also fixes JDK-8334586. Currently the scene only enabled or disables > IM events when the focusOwner changes. If a node’s skin is installed after it > becomes focusOwner the scene won’t notice the change. In this PR the > InputMethodStateManage... This pull request has now been integrated. Changeset: 90ea0f07 Author: Martin Fox <m...@openjdk.org> URL: https://git.openjdk.org/jfx/commit/90ea0f07b3a8df0d39e7e31222d08931201368a1 Stats: 280 lines in 4 files changed: 265 ins; 10 del; 5 mod 8288893: Popup and its subclasses cannot input text from InputMethod Reviewed-by: angorya, kcr ------------- PR: https://git.openjdk.org/jfx/pull/1634