On Tue, 12 Nov 2024 15:08:11 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 cha...
>
> Martin Fox has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Tweak to satisfy system test.

Running the branch (with the latest master merged) on macOS 14.7.1, noticed 
that IME window does not show reliably:

![Screenshot 2024-12-03 at 12 46 
13](https://github.com/user-attachments/assets/3f30078c-c8f9-4df7-b246-c0be46b3f61f)

It gets eventually shown if I commit and keep typing.
Also, it almost feels like the internal state is not cleared when the popup 
gets dismissed - can you try that please?

Also, you may want to merge the latest master, this branch has been out for 
quite some time.

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1634#issuecomment-2515525320

Reply via email to