On Sat, 16 Jan 2021 00:48:02 GMT, Sergey Bylokhov <s...@openjdk.org> wrote:

>> 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.
>
>> 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.
> 
> I think it is somehow related to the embedded frame when the event comes from 
> some native window that is not registered as a java peer(but some external 
> native app/window)

I failed to test branches of XDnDDropTargetProtocol::processXdndPosition(..) 
under condition (xwindow == null) by means of EmbeddedFrame. In addition none 
of automatic regression tests (test/jdk/java/awt/dnd/, 
test/jdk/java/awt/xembed/, test/jdk/sun/awt) gets into these branches.

I also tried to scale coordinates (as you advised) right after:
        x = (int)(xclient.get_data(2) >> 16);
        y = (int)(xclient.get_data(2) & 0xFFFF);
as follow:        
GraphicsConfiguration gc = GraphicsEnvironment
                .getLocalGraphicsEnvironment()
                .getDefaultScreenDevice()
                .getDefaultConfiguration();
        gc = SunGraphicsEnvironment.getGraphicsConfigurationAtPoint(gc, x, y);
        GraphicsDevice device = gc.getDevice();
        if (device instanceof X11GraphicsDevice) {
            int scale = ((X11GraphicsDevice) device).getScaleFactor();
            x = XlibUtil.scaleDown(x, scale);
            y = XlibUtil.scaleDown(y, scale);
        }

but found out that getGraphicsConfigurationAtPoint() also requires the already 
scaled coordinates.

There are 3 different places in XDnDDropTargetProtocol::processXdndPosition(..) 
where it is necessary to decide whether to scale coordinates or not:
1) I'm not sure and I'm unable to test it:
if (xwindow == null)
        {
            long receiver =
                XDropTargetRegistry.getRegistry().getEmbeddedDropSite(
                    xclient.get_window(), x, y);
2) I'm quite sure and I'm able to test it:
if (xwindow != null) {
            /* Translate mouse position from root coordinates
               to the target window coordinates. */
            Point p = xwindow.toLocal(xwindow.scaleDown(x), 
xwindow.scaleDown(y));
3) I think that scaling is necessary but I'm unable to test it (additionally 
the question raises concerning this case, why the coordinates are not converted 
to local here similar to the 2 case):
if (xwindow == null) {
            if (targetXWindow != null) {
                notifyProtocolListener(targetXWindow, x, y,
                                       DnDConstants.ACTION_NONE, xclient,
                                       MouseEvent.MOUSE_EXITED);

Sergey, is it possible at the moment to fix the particular issue and leave the 
other use cases to work as it works before due to no possibility to test them?

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

PR: https://git.openjdk.java.net/jdk/pull/1907

Reply via email to