Johan,

I’ve entered a bug, https://bugs.openjdk.org/browse/JDK-8340982.

In general if you type a dead key followed by a character that can’t combine 
with it you get two characters. For example, if you type a dead key circumflex 
followed by a ‘q’ you should see “^q”. The Space character is an exception, on 
all platforms a dead key followed by a Space should yield just one character. 
The Windows platform code is mishandling this case.

Thanks for bringing this up.

Martin

> On Sep 25, 2024, at 9:38 AM, Thiago Milczarek Sayão <thiago.sa...@gmail.com> 
> wrote:
> 
> Johan,
> 
> Trust Martin, as I know nothing about Windows :)
> Sorry for misleading you on the IME subject.
> 
> Em qua., 25 de set. de 2024 às 13:24, Martin Fox <mar...@martinfox.com 
> <mailto:mar...@martinfox.com>> escreveu:
>> Johan,
>> 
>> Thanks for providing all the details. It does sound like a bug. I will take 
>> a look.
>> 
>> Since this is Windows altering the IME setup probably won’t have any effect. 
>> On Mac and Linux dead keys are delivered through the IME pathway and are 
>> presented to JavaFX as InputMethod events. On Windows dead keys don’t go 
>> through this pathway and are presented as KeyEvents.
>> 
>> Martin
>> 
>>> On Sep 25, 2024, at 8:21 AM, Kevin Rushforth <kevin.rushfo...@oracle.com 
>>> <mailto:kevin.rushfo...@oracle.com>> wrote:
>>> 
>>> I would not recommend internal APIs, unless someone wants to build JavaFX 
>>> to help diagnose it.
>>> 
>>> In any case it sounds like Johan has discovered a bug -- at least on 
>>> Windows -- in the key handler for dead keys. We should test this on macOS 
>>> and Linux as well.
>>> 
>>>  -- Kevin
>>> 
>>> On 9/25/2024 8:14 AM, Thiago Milczarek Sayão wrote:
>>>> Johan,
>>>> 
>>>> It's an internal API, but we can use it for testing purposes (I'm not sure 
>>>> if there's a public API for that).
>>>> SceneHelper.enableInputMethodEvents(scene, false);
>>>> IME is used for entering complex characters in some languages such as 
>>>> Chinese, Korean, Japanese, etc.
>>>> 
>>>> On Linux, setting the keyboard to en_US will also add the extra space, 
>>>> except if I choose the en_US with dead keys variation.
>>>> 
>>>> If you try it on notepad, is it the same behaviour? If not, I think it 
>>>> might be a bug.
>>>> 
>>>> -- Thiago.
>>>> 
>>>> 
>>>> Em qua., 25 de set. de 2024 às 11:12, Johan Corveleyn <jcor...@gmail.com 
>>>> <mailto:jcor...@gmail.com>> escreveu:
>>>>> Hi Thiago,
>>>>> 
>>>>> Thank you for your answer. I am experiencing this issue on Windows
>>>>> (Windows 10 and 11).
>>>>> 
>>>>> Now, it dawns on me that:
>>>>> - I have a QWERTY keyboard (standard US layout).
>>>>> - I have my keyboard layout setting in Windows configured to "US
>>>>> International". That way the keys for ~, ^, ', " become "dead keys"
>>>>> (waiting for next keystroke).
>>>>> - If I change my keyboard layout setting to "US" then I can't
>>>>> reproduce anymore because those keystrokes no longer act like dead
>>>>> keys (~, ^, ... immediately give that character).
>>>>> 
>>>>> I don't know how this is handled on Linux or Mac. Do they also have
>>>>> something like a "US International" keyboard layout setting so ^
>>>>> becomes a dead key? Or does it work differently if I want to type â or
>>>>> ë, or a standalone ^?
>>>>> 
>>>>> I'm not sure what you mean by disabling IME or how to know that it's
>>>>> enabled. Can I enable/disable this programmatically in JavaFX? Or is
>>>>> this an OS keyboard layout setting (anyway: just having a standard "US
>>>>> input" makes this non reproducible because I can no longer type dead
>>>>> keys)?
>>>>> 
>>>>> If you have a keyboard input with dead keys it's super easy to test
>>>>> this with a simple program like:
>>>>> [[[
>>>>> public class DeadKeysFX extends Application {
>>>>>     @Override
>>>>>     public void start(Stage stage) {
>>>>>         TextField textField = new TextField();
>>>>>         Scene scene = new Scene(textField);
>>>>>         stage.setScene(scene);
>>>>>         stage.show();
>>>>>     }
>>>>> }
>>>>> ]]]
>>>>> 
>>>>> Just type ^+<space> and see whether you get one or two characters. In
>>>>> all non-JavaFX programs (including Java Swing) I get a single '^'. In
>>>>> JavaFX I get a '^ '.
>>>>> 
>>>>> --
>>>>> Johan
>>>>> 
>>>>> On Tue, Sep 24, 2024 at 5:16 PM Thiago Milczarek Sayão
>>>>> <thiago.sa...@gmail.com <mailto:thiago.sa...@gmail.com>> wrote:
>>>>> >
>>>>> > Hi Johan,
>>>>> >
>>>>> > It might vary be platform. Which one are you using? (Windows, Mac, 
>>>>> > Linux).
>>>>> >
>>>>> > Try disabling IME (Input Method Editor) and see it it works.
>>>>> >
>>>>> > - Thiago
>>>>> >
>>>>> > Em ter., 24 de set. de 2024 11:51, Johan Corveleyn <jcor...@gmail.com 
>>>>> > <mailto:jcor...@gmail.com>> escreveu:
>>>>> >>
>>>>> >> Hi,
>>>>> >>
>>>>> >> (This is my first post here, hope I'm following the right path)
>>>>> >>
>>>>> >> It seems JavaFX TextFields (and friends) do not automatically convert
>>>>> >> <dead key>+<space> into simply <dead key character>. They make it into
>>>>> >> <dead key character>+<space>, which is very atypical. I would consider
>>>>> >> this behavior a bug, since it is different from any editor I know (and
>>>>> >> makes it very hard to enter a dead key character on its own). We ran
>>>>> >> into this with Java 8, I also reproduced it with openjdk 21 + openjfx
>>>>> >> 23.
>>>>> >>
>>>>> >> For instance if in a JavaFX TextField I type a '^' keystroke, it waits
>>>>> >> for the next keystroke (which is normal since it's a dead key,
>>>>> >> possibly followed by a character on which to put the '^'). But if I
>>>>> >> then type <space> I expect a simple '^' to appear. Instead, in JavaFX,
>>>>> >> '^ ' appears. This does not happen in Swing, nor in any editor or
>>>>> >> shell or ...
>>>>> >>
>>>>> >> Background context: a user of our JavaFX application couldn't
>>>>> >> authenticate with their password (typed in a PasswordField). After an
>>>>> >> awful lot of troubleshooting we found that they used a '^' in their
>>>>> >> password. Of course the user didn't notice that after typing ^+space
>>>>> >> two dots appeared in the PasswordField. Now that user knows they have
>>>>> >> to backspace after typing ^+space ...
>>>>> >>
>>>>> >> I suppose inserting a Swing JPasswordField in our JavaFX app would
>>>>> >> work around this issue, but ... isn't there a better solution?
>>>>> >> Shouldn't this be regarded as a bug?
>>>>> >>
>>>>> >> --
>>>>> >> Johan
>>> 
>> 

Reply via email to