<AWT Dev> RFR: 8257414: Drag n Drop target area is wrong on high DPI systems
Olga Mikhaltsova
omikhaltcova at openjdk.java.net
Wed Jan 13 00:20:57 UTC 2021
On Mon, 4 Jan 2021 08:39:10 GMT, Sergey Bylokhov <serb at openjdk.org> wrote:
>> Please, review this small fix for drag-n-drop on Linux with HiDPI turned on!
>>
>> This bug is due to the following reason: while scaling Java recalculates resolution (W x H) according to sun.java2d.uiScale (W/SCALE x H/SCALE) and works inside these new coordinates but at the same time the events, that come from the system, continue reporting positions in the old coordinates (W x H).
>>
>> The idea of the suggested fix is in division of coordinates on the scale when they come from the system to Java and multiplying them on the scale when they go back from Java to the system. It is similar to processing events from mouse and buttons.
>>
>> Testing is quite complicated because for reproducing this bug the following conditions should be met:
>> 1. HiDPI is turned on
>> 2. sun.java2d.uiScale.enabled = true and sun.java2d.uiScale != 100%
>> 3. the source of drag-n-drop is non-java application
>>
>> The step-by-step guide how to reproduce this bug is added to https://bugs.openjdk.java.net/browse/JDK-8257414.
>
> src/java.desktop/unix/classes/sun/awt/X11/XDnDDropTargetProtocol.java line 616:
>
>> 614: /* Translate mouse position from root coordinates
>> 615: to the target window coordinates. */
>> 616: Point p = xwindow.toLocal(xwindow.scaleDown(x), xwindow.scaleDown(y));
>
> I guess some clarification here is required. It is unclear what the coordinate system is used by the x/y above. Looks like before the fix the device space was always used, and after the fix the mix of device/user's space will be used.
> If the user's space should always be used(the scaled version of the device), then I suggest to scale these coordinates here:
> x = (int)(xclient.get_data(2) >> 16);
> y = (int)(xclient.get_data(2) & 0xFFFF);
> But you will need to check that all usage of the new coordinate system will be valid across the method.
Sergey, thank you! Could you give me a hint please concerning some use case of drag-and-drop to meet the (xwindow == 0) condition in XDnDDropTargetProtocol::processXdndPosition(..)? I'm unable to do it by means of the tests' apps I have.
-------------
PR: https://git.openjdk.java.net/jdk/pull/1907
More information about the awt-dev
mailing list