jdk/src/solaris/classes/sun/awt/X11/XDnDDropTargetProtocol.java
author alitvinov
Tue, 21 May 2013 05:02:21 +0400
changeset 17679 a81555868357
parent 5506 202f599c92aa
child 18178 ee71c923891d
permissions -rw-r--r--
8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux Reviewed-by: art, anthony, prr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
     2
 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3938
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3938
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3938
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3938
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 3938
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
package sun.awt.X11;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
import java.awt.Point;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    29
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
import java.awt.dnd.DnDConstants;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
90ce3da70b43 Initial load
duke
parents:
diff changeset
    32
import java.awt.event.MouseEvent;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
import java.io.IOException;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 2802
diff changeset
    36
import sun.util.logging.PlatformLogger;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
import sun.misc.Unsafe;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
/**
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
 * XDropTargetProtocol implementation for XDnD protocol.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
 * @since 1.5
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
class XDnDDropTargetProtocol extends XDropTargetProtocol {
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 2802
diff changeset
    46
    private static final PlatformLogger logger =
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 2802
diff changeset
    47
        PlatformLogger.getLogger("sun.awt.X11.xembed.xdnd.XDnDDropTargetProtocol");
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
    private static final Unsafe unsafe = XlibWrapper.unsafe;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
    private long sourceWindow = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
    private long sourceWindowMask = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
    private int sourceProtocolVersion = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
    private int sourceActions = DnDConstants.ACTION_NONE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
    private long[] sourceFormats = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    56
    private boolean trackSourceActions = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
    private int userAction = DnDConstants.ACTION_NONE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
    private int sourceX = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
    private int sourceY = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
    private XWindow targetXWindow = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
    // XEmbed stuff.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
    private long prevCtxt = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
    private boolean overXEmbedClient = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
    protected XDnDDropTargetProtocol(XDropTargetProtocolListener listener) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    67
        super(listener);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    68
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    69
90ce3da70b43 Initial load
duke
parents:
diff changeset
    70
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
    71
     * Creates an instance associated with the specified listener.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    72
     *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    73
     * @throws NullPointerException if listener is <code>null</code>.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    74
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    75
    static XDropTargetProtocol createInstance(XDropTargetProtocolListener listener) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
        return new XDnDDropTargetProtocol(listener);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
    public String getProtocolName() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
        return XDragAndDropProtocols.XDnD;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
    public void registerDropTarget(long window) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    84
        assert XToolkit.isAWTLockHeldByCurrentThread();
90ce3da70b43 Initial load
duke
parents:
diff changeset
    85
90ce3da70b43 Initial load
duke
parents:
diff changeset
    86
        long data = Native.allocateLongArray(1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
            Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
    91
            XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
            XDnDConstants.XA_XdndAware.setAtomData(window, XAtom.XA_ATOM, data, 1);
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
    93
            XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    94
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
    95
            if ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
    96
                (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
                throw new XException("Cannot write XdndAware property");
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
            unsafe.freeMemory(data);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
            data = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   102
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   103
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   104
90ce3da70b43 Initial load
duke
parents:
diff changeset
   105
    public void unregisterDropTarget(long window) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   106
        assert XToolkit.isAWTLockHeldByCurrentThread();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   107
90ce3da70b43 Initial load
duke
parents:
diff changeset
   108
        XDnDConstants.XA_XdndAware.DeleteProperty(window);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
90ce3da70b43 Initial load
duke
parents:
diff changeset
   111
    public void registerEmbedderDropSite(long embedder) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   112
        assert XToolkit.isAWTLockHeldByCurrentThread();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   113
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
        boolean overriden = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   115
        int version = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   116
        long proxy = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   117
        long newProxy = XDropTargetRegistry.getDnDProxyWindow();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   118
        int status = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
        WindowPropertyGetter wpg1 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
            new WindowPropertyGetter(embedder, XDnDConstants.XA_XdndAware, 0, 1,
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   122
                                     false, XConstants.AnyPropertyType);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
        try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   125
            status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   126
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   127
            if (status == XConstants.Success &&
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   128
                wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   129
90ce3da70b43 Initial load
duke
parents:
diff changeset
   130
                overriden = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
                version = (int)Native.getLong(wpg1.getData());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
            wpg1.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
        /* XdndProxy is not supported for prior to XDnD version 4 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
        if (overriden && version >= 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
            WindowPropertyGetter wpg2 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
                new WindowPropertyGetter(embedder, XDnDConstants.XA_XdndProxy,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
                                         0, 1, false, XAtom.XA_WINDOW);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
            try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   144
                status = wpg2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   146
                if (status == XConstants.Success &&
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   147
                    wpg2.getData() != 0 &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   148
                    wpg2.getActualType() == XAtom.XA_WINDOW) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   149
90ce3da70b43 Initial load
duke
parents:
diff changeset
   150
                    proxy = Native.getLong(wpg2.getData());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
                wpg2.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
            if (proxy != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
                WindowPropertyGetter wpg3 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
                    new WindowPropertyGetter(proxy, XDnDConstants.XA_XdndProxy,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
                                             0, 1, false, XAtom.XA_WINDOW);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
                try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   162
                    status = wpg3.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   164
                    if (status != XConstants.Success ||
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
                        wpg3.getData() == 0 ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
                        wpg3.getActualType() != XAtom.XA_WINDOW ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
                        Native.getLong(wpg3.getData()) != proxy) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
                        proxy = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   170
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
                        WindowPropertyGetter wpg4 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
                            new WindowPropertyGetter(proxy,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
                                                     XDnDConstants.XA_XdndAware,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
                                                     0, 1, false,
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   175
                                                     XConstants.AnyPropertyType);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
                        try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   178
                            status = wpg4.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   180
                            if (status != XConstants.Success ||
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
                                wpg4.getData() == 0 ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
                                wpg4.getActualType() != XAtom.XA_ATOM) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
                                proxy = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
                        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
                            wpg4.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
                } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
                    wpg3.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
90ce3da70b43 Initial load
duke
parents:
diff changeset
   196
        if (proxy == newProxy) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
            // Embedder already registered.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
        long data = Native.allocateLongArray(1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
            Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
            /* The proxy window must have the XdndAware set, as XDnD protocol
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
               prescribes to check the proxy window for XdndAware. */
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   208
            XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
            XDnDConstants.XA_XdndAware.setAtomData(newProxy, XAtom.XA_ATOM,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
                                                   data, 1);
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   211
            XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   213
            if ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   214
                (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
                throw new XException("Cannot write XdndAware property");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   216
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   217
90ce3da70b43 Initial load
duke
parents:
diff changeset
   218
            Native.putLong(data, 0, newProxy);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   219
90ce3da70b43 Initial load
duke
parents:
diff changeset
   220
            /* The proxy window must have the XdndProxy set to point to itself.*/
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   221
            XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   222
            XDnDConstants.XA_XdndProxy.setAtomData(newProxy, XAtom.XA_WINDOW,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   223
                                                   data, 1);
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   224
            XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   226
            if ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   227
                (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
                throw new XException("Cannot write XdndProxy property");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
            Native.putLong(data, 0, XDnDConstants.XDND_PROTOCOL_VERSION);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   233
            XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   234
            XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   235
                                                   data, 1);
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   236
            XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   238
            if ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   239
                (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   240
                throw new XException("Cannot write XdndAware property");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   242
90ce3da70b43 Initial load
duke
parents:
diff changeset
   243
            Native.putLong(data, 0, newProxy);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   244
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   245
            XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   246
            XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   247
                                                   data, 1);
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   248
            XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   249
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   250
            if ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   251
                (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   252
                throw new XException("Cannot write XdndProxy property");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
            unsafe.freeMemory(data);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
            data = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
90ce3da70b43 Initial load
duke
parents:
diff changeset
   259
        putEmbedderRegistryEntry(embedder, overriden, version, proxy);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   260
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   261
90ce3da70b43 Initial load
duke
parents:
diff changeset
   262
    public void unregisterEmbedderDropSite(long embedder) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   263
        assert XToolkit.isAWTLockHeldByCurrentThread();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   264
90ce3da70b43 Initial load
duke
parents:
diff changeset
   265
        EmbedderRegistryEntry entry = getEmbedderRegistryEntry(embedder);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
        if (entry == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
            return;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
        if (entry.isOverriden()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
            long data = Native.allocateLongArray(1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
                Native.putLong(data, 0, entry.getVersion());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   277
                XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
                XDnDConstants.XA_XdndAware.setAtomData(embedder, XAtom.XA_ATOM,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
                                                       data, 1);
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   280
                XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   281
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   282
                if ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   283
                    (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
                    throw new XException("Cannot write XdndAware property");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
                Native.putLong(data, 0, (int)entry.getProxy());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   288
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   289
                XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
                XDnDConstants.XA_XdndProxy.setAtomData(embedder, XAtom.XA_WINDOW,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
                                                       data, 1);
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   292
                XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   294
                if ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   295
                    (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   296
                    throw new XException("Cannot write XdndProxy property");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   297
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   298
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   299
                unsafe.freeMemory(data);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   300
                data = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   301
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   302
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   303
            XDnDConstants.XA_XdndAware.DeleteProperty(embedder);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
            XDnDConstants.XA_XdndProxy.DeleteProperty(embedder);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
     * Gets and stores in the registry the embedder's XDnD drop site info
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
     * from the embedded.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
    public void registerEmbeddedDropSite(long embedded) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   313
        assert XToolkit.isAWTLockHeldByCurrentThread();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   314
90ce3da70b43 Initial load
duke
parents:
diff changeset
   315
        boolean overriden = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   316
        int version = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   317
        long proxy = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   318
        long newProxy = XDropTargetRegistry.getDnDProxyWindow();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   319
        int status = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
        WindowPropertyGetter wpg1 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
            new WindowPropertyGetter(embedded, XDnDConstants.XA_XdndAware, 0, 1,
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   323
                                     false, XConstants.AnyPropertyType);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
        try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   326
            status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   327
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   328
            if (status == XConstants.Success &&
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   329
                wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   330
90ce3da70b43 Initial load
duke
parents:
diff changeset
   331
                overriden = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
                version = (int)Native.getLong(wpg1.getData());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
            wpg1.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   337
90ce3da70b43 Initial load
duke
parents:
diff changeset
   338
        /* XdndProxy is not supported for prior to XDnD version 4 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   339
        if (overriden && version >= 4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   340
            WindowPropertyGetter wpg2 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   341
                new WindowPropertyGetter(embedded, XDnDConstants.XA_XdndProxy,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   342
                                         0, 1, false, XAtom.XA_WINDOW);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   343
90ce3da70b43 Initial load
duke
parents:
diff changeset
   344
            try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   345
                status = wpg2.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   346
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   347
                if (status == XConstants.Success &&
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   348
                    wpg2.getData() != 0 &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   349
                    wpg2.getActualType() == XAtom.XA_WINDOW) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   350
90ce3da70b43 Initial load
duke
parents:
diff changeset
   351
                    proxy = Native.getLong(wpg2.getData());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   352
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   353
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   354
                wpg2.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   355
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   356
90ce3da70b43 Initial load
duke
parents:
diff changeset
   357
            if (proxy != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   358
                WindowPropertyGetter wpg3 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   359
                    new WindowPropertyGetter(proxy, XDnDConstants.XA_XdndProxy,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
                                             0, 1, false, XAtom.XA_WINDOW);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   361
90ce3da70b43 Initial load
duke
parents:
diff changeset
   362
                try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   363
                    status = wpg3.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   364
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   365
                    if (status != XConstants.Success ||
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   366
                        wpg3.getData() == 0 ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   367
                        wpg3.getActualType() != XAtom.XA_WINDOW ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   368
                        Native.getLong(wpg3.getData()) != proxy) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   369
90ce3da70b43 Initial load
duke
parents:
diff changeset
   370
                        proxy = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   371
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   372
                        WindowPropertyGetter wpg4 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   373
                            new WindowPropertyGetter(proxy,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   374
                                                     XDnDConstants.XA_XdndAware,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   375
                                                     0, 1, false,
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   376
                                                     XConstants.AnyPropertyType);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   377
90ce3da70b43 Initial load
duke
parents:
diff changeset
   378
                        try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   379
                            status = wpg4.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   380
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   381
                            if (status != XConstants.Success ||
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   382
                                wpg4.getData() == 0 ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
   383
                                wpg4.getActualType() != XAtom.XA_ATOM) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   384
90ce3da70b43 Initial load
duke
parents:
diff changeset
   385
                                proxy = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   386
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   387
                        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   388
                            wpg4.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   389
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   390
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   391
                } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   392
                    wpg3.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   393
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   394
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   395
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   396
90ce3da70b43 Initial load
duke
parents:
diff changeset
   397
        putEmbedderRegistryEntry(embedded, overriden, version, proxy);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   398
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   399
90ce3da70b43 Initial load
duke
parents:
diff changeset
   400
    public boolean isProtocolSupported(long window) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   401
        assert XToolkit.isAWTLockHeldByCurrentThread();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   402
90ce3da70b43 Initial load
duke
parents:
diff changeset
   403
        WindowPropertyGetter wpg1 =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   404
            new WindowPropertyGetter(window, XDnDConstants.XA_XdndAware, 0, 1,
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   405
                                     false, XConstants.AnyPropertyType);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   406
90ce3da70b43 Initial load
duke
parents:
diff changeset
   407
        try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   408
            int status = wpg1.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   409
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   410
            if (status == XConstants.Success &&
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   411
                wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   412
90ce3da70b43 Initial load
duke
parents:
diff changeset
   413
                return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   414
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   415
                return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   416
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   417
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   418
            wpg1.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   419
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   420
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   421
90ce3da70b43 Initial load
duke
parents:
diff changeset
   422
    private boolean processXdndEnter(XClientMessageEvent xclient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   423
        long source_win = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   424
        long source_win_mask = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   425
        int protocol_version = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   426
        int actions = DnDConstants.ACTION_NONE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   427
        boolean track = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   428
        long[] formats = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   429
90ce3da70b43 Initial load
duke
parents:
diff changeset
   430
        if (getSourceWindow() != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   431
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   432
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   433
90ce3da70b43 Initial load
duke
parents:
diff changeset
   434
        if (!(XToolkit.windowToXWindow(xclient.get_window()) instanceof XWindow)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   435
            && getEmbedderRegistryEntry(xclient.get_window()) == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   436
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   437
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   438
90ce3da70b43 Initial load
duke
parents:
diff changeset
   439
        if (xclient.get_message_type() != XDnDConstants.XA_XdndEnter.getAtom()){
90ce3da70b43 Initial load
duke
parents:
diff changeset
   440
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   441
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   442
90ce3da70b43 Initial load
duke
parents:
diff changeset
   443
        protocol_version =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   444
            (int)((xclient.get_data(1) & XDnDConstants.XDND_PROTOCOL_MASK) >>
90ce3da70b43 Initial load
duke
parents:
diff changeset
   445
                  XDnDConstants.XDND_PROTOCOL_SHIFT);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   446
90ce3da70b43 Initial load
duke
parents:
diff changeset
   447
        /* XDnD compliance only requires supporting version 3 and up. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   448
        if (protocol_version < XDnDConstants.XDND_MIN_PROTOCOL_VERSION) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   449
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   450
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   451
90ce3da70b43 Initial load
duke
parents:
diff changeset
   452
        /* Ignore the source if the protocol version is higher than we support. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   453
        if (protocol_version > XDnDConstants.XDND_PROTOCOL_VERSION) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   454
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   455
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   456
90ce3da70b43 Initial load
duke
parents:
diff changeset
   457
        source_win = xclient.get_data(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   458
90ce3da70b43 Initial load
duke
parents:
diff changeset
   459
        /* Extract the list of supported actions. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   460
        if (protocol_version < 2) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   461
            /* Prior to XDnD version 2 only COPY action was supported. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   462
            actions = DnDConstants.ACTION_COPY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   463
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   464
            WindowPropertyGetter wpg =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   465
                new WindowPropertyGetter(source_win,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   466
                                         XDnDConstants.XA_XdndActionList,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   467
                                         0, 0xFFFF, false,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   468
                                         XAtom.XA_ATOM);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   469
            try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   470
                wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   471
90ce3da70b43 Initial load
duke
parents:
diff changeset
   472
                if (wpg.getActualType() == XAtom.XA_ATOM &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   473
                    wpg.getActualFormat() == 32) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   474
                    long data = wpg.getData();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   475
90ce3da70b43 Initial load
duke
parents:
diff changeset
   476
                    for (int i = 0; i < wpg.getNumberOfItems(); i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   477
                        actions |=
90ce3da70b43 Initial load
duke
parents:
diff changeset
   478
                            XDnDConstants.getJavaActionForXDnDAction(Native.getLong(data, i));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   479
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   480
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   481
                    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   482
                     * According to XDnD protocol, XdndActionList is optional.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   483
                     * If XdndActionList is not set we try to guess which actions are
90ce3da70b43 Initial load
duke
parents:
diff changeset
   484
                     * supported.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   485
                     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   486
                    actions = DnDConstants.ACTION_COPY;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   487
                    track = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   488
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   489
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   490
                wpg.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   491
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   492
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   493
90ce3da70b43 Initial load
duke
parents:
diff changeset
   494
        /* Extract the available data types. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   495
        if ((xclient.get_data(1) & XDnDConstants.XDND_DATA_TYPES_BIT) != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   496
            WindowPropertyGetter wpg =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   497
                new WindowPropertyGetter(source_win,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   498
                                         XDnDConstants.XA_XdndTypeList,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   499
                                         0, 0xFFFF, false,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   500
                                         XAtom.XA_ATOM);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   501
            try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
   502
                wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   503
90ce3da70b43 Initial load
duke
parents:
diff changeset
   504
                if (wpg.getActualType() == XAtom.XA_ATOM &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
   505
                    wpg.getActualFormat() == 32) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   506
                    formats = Native.toLongs(wpg.getData(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   507
                                             wpg.getNumberOfItems());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   508
                } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   509
                    formats = new long[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   510
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   511
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   512
                wpg.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   513
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   514
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   515
            int countFormats = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   516
            long[] formats3 = new long[3];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   517
90ce3da70b43 Initial load
duke
parents:
diff changeset
   518
            for (int i = 0; i < 3; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   519
                long j;
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   520
                if ((j = xclient.get_data(2 + i)) != XConstants.None) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   521
                    formats3[countFormats++] = j;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   522
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   523
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   524
90ce3da70b43 Initial load
duke
parents:
diff changeset
   525
            formats = new long[countFormats];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   526
90ce3da70b43 Initial load
duke
parents:
diff changeset
   527
            System.arraycopy(formats3, 0, formats, 0, countFormats);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   528
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   529
90ce3da70b43 Initial load
duke
parents:
diff changeset
   530
        assert XToolkit.isAWTLockHeldByCurrentThread();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   531
90ce3da70b43 Initial load
duke
parents:
diff changeset
   532
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   533
         * Select for StructureNotifyMask to receive DestroyNotify in case of source
90ce3da70b43 Initial load
duke
parents:
diff changeset
   534
         * crash.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   535
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   536
        XWindowAttributes wattr = new XWindowAttributes();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   537
        try {
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   538
            XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   539
            int status = XlibWrapper.XGetWindowAttributes(XToolkit.getDisplay(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   540
                                                          source_win, wattr.pData);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   541
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   542
            XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   543
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   544
            if ((status == 0) ||
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   545
                ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   546
                (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success))) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   547
                throw new XException("XGetWindowAttributes failed");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   548
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   549
90ce3da70b43 Initial load
duke
parents:
diff changeset
   550
            source_win_mask = wattr.get_your_event_mask();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   551
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   552
            wattr.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   553
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   554
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   555
        XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   556
        XlibWrapper.XSelectInput(XToolkit.getDisplay(), source_win,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   557
                                 source_win_mask |
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   558
                                 XConstants.StructureNotifyMask);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   559
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   560
        XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   561
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   562
        if ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   563
            (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   564
            throw new XException("XSelectInput failed");
90ce3da70b43 Initial load
duke
parents:
diff changeset
   565
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   566
90ce3da70b43 Initial load
duke
parents:
diff changeset
   567
        sourceWindow = source_win;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   568
        sourceWindowMask = source_win_mask;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   569
        sourceProtocolVersion = protocol_version;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   570
        sourceActions = actions;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   571
        sourceFormats = formats;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   572
        trackSourceActions = track;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   573
90ce3da70b43 Initial load
duke
parents:
diff changeset
   574
        return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   575
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   576
90ce3da70b43 Initial load
duke
parents:
diff changeset
   577
    private boolean processXdndPosition(XClientMessageEvent xclient) {
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   578
        long time_stamp = (int)XConstants.CurrentTime;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   579
        long xdnd_action = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   580
        int java_action = DnDConstants.ACTION_NONE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   581
        int x = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   582
        int y = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   583
90ce3da70b43 Initial load
duke
parents:
diff changeset
   584
        /* Ignore XDnD messages from all other windows. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   585
        if (sourceWindow != xclient.get_data(0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   586
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   587
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   588
90ce3da70b43 Initial load
duke
parents:
diff changeset
   589
        XWindow xwindow = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   590
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   591
            XBaseWindow xbasewindow = XToolkit.windowToXWindow(xclient.get_window());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   592
            if (xbasewindow instanceof XWindow) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   593
                xwindow = (XWindow)xbasewindow;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   594
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   595
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   596
90ce3da70b43 Initial load
duke
parents:
diff changeset
   597
        x = (int)(xclient.get_data(2) >> 16);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   598
        y = (int)(xclient.get_data(2) & 0xFFFF);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   599
90ce3da70b43 Initial load
duke
parents:
diff changeset
   600
        if (xwindow == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   601
            long receiver =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   602
                XDropTargetRegistry.getRegistry().getEmbeddedDropSite(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   603
                    xclient.get_window(), x, y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   604
90ce3da70b43 Initial load
duke
parents:
diff changeset
   605
            if (receiver != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   606
                XBaseWindow xbasewindow = XToolkit.windowToXWindow(receiver);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   607
                if (xbasewindow instanceof XWindow) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   608
                    xwindow = (XWindow)xbasewindow;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   609
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   610
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   611
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   612
90ce3da70b43 Initial load
duke
parents:
diff changeset
   613
        if (xwindow != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   614
            /* Translate mouse position from root coordinates
90ce3da70b43 Initial load
duke
parents:
diff changeset
   615
               to the target window coordinates. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   616
            Point p = xwindow.toLocal(x, y);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   617
            x = p.x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   618
            y = p.y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   619
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   620
90ce3da70b43 Initial load
duke
parents:
diff changeset
   621
        /* Time stamp - new in XDnD version 1. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   622
        if (sourceProtocolVersion > 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   623
            time_stamp = xclient.get_data(3);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   624
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   625
90ce3da70b43 Initial load
duke
parents:
diff changeset
   626
        /* User action - new in XDnD version 2. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   627
        if (sourceProtocolVersion > 1) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   628
            xdnd_action = xclient.get_data(4);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   629
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   630
            /* The default action is XdndActionCopy */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   631
            xdnd_action = XDnDConstants.XA_XdndActionCopy.getAtom();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   632
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   633
90ce3da70b43 Initial load
duke
parents:
diff changeset
   634
        java_action = XDnDConstants.getJavaActionForXDnDAction(xdnd_action);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   635
90ce3da70b43 Initial load
duke
parents:
diff changeset
   636
        if (trackSourceActions) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   637
            sourceActions |= java_action;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   638
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   639
90ce3da70b43 Initial load
duke
parents:
diff changeset
   640
        if (xwindow == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   641
            if (targetXWindow != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   642
                notifyProtocolListener(targetXWindow, x, y,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   643
                                       DnDConstants.ACTION_NONE, xclient,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   644
                                       MouseEvent.MOUSE_EXITED);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   645
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   646
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   647
            int java_event_id = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   648
90ce3da70b43 Initial load
duke
parents:
diff changeset
   649
            if (targetXWindow == null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   650
                java_event_id = MouseEvent.MOUSE_ENTERED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   651
            } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   652
                java_event_id = MouseEvent.MOUSE_DRAGGED;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   653
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   654
90ce3da70b43 Initial load
duke
parents:
diff changeset
   655
            notifyProtocolListener(xwindow, x, y, java_action, xclient,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   656
                                   java_event_id);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   657
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   658
90ce3da70b43 Initial load
duke
parents:
diff changeset
   659
        userAction = java_action;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   660
        sourceX = x;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   661
        sourceY = y;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   662
        targetXWindow = xwindow;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   663
90ce3da70b43 Initial load
duke
parents:
diff changeset
   664
        return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   665
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   666
90ce3da70b43 Initial load
duke
parents:
diff changeset
   667
    private boolean processXdndLeave(XClientMessageEvent xclient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   668
        /* Ignore XDnD messages from all other windows. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   669
        if (sourceWindow != xclient.get_data(0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   670
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   671
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   672
90ce3da70b43 Initial load
duke
parents:
diff changeset
   673
        cleanup();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   674
90ce3da70b43 Initial load
duke
parents:
diff changeset
   675
        return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   676
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   677
90ce3da70b43 Initial load
duke
parents:
diff changeset
   678
    private boolean processXdndDrop(XClientMessageEvent xclient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   679
        /* Ignore XDnD messages from all other windows. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   680
        if (sourceWindow != xclient.get_data(0)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   681
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   682
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   683
90ce3da70b43 Initial load
duke
parents:
diff changeset
   684
        if (targetXWindow != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   685
            notifyProtocolListener(targetXWindow, sourceX, sourceY, userAction,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   686
                                   xclient, MouseEvent.MOUSE_RELEASED);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   687
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   688
90ce3da70b43 Initial load
duke
parents:
diff changeset
   689
        return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   690
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   691
90ce3da70b43 Initial load
duke
parents:
diff changeset
   692
    public int getMessageType(XClientMessageEvent xclient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   693
        long messageType = xclient.get_message_type();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   694
90ce3da70b43 Initial load
duke
parents:
diff changeset
   695
        if (messageType == XDnDConstants.XA_XdndEnter.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   696
            return ENTER_MESSAGE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   697
        } else if (messageType == XDnDConstants.XA_XdndPosition.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   698
            return MOTION_MESSAGE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   699
        } else if (messageType == XDnDConstants.XA_XdndLeave.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   700
            return LEAVE_MESSAGE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   701
        } else if (messageType == XDnDConstants.XA_XdndDrop.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   702
            return DROP_MESSAGE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   703
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   704
            return UNKNOWN_MESSAGE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   705
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   706
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   707
90ce3da70b43 Initial load
duke
parents:
diff changeset
   708
    protected boolean processClientMessageImpl(XClientMessageEvent xclient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   709
        long messageType = xclient.get_message_type();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   710
90ce3da70b43 Initial load
duke
parents:
diff changeset
   711
        if (messageType == XDnDConstants.XA_XdndEnter.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   712
            return processXdndEnter(xclient);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   713
        } else if (messageType == XDnDConstants.XA_XdndPosition.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   714
            return processXdndPosition(xclient);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   715
        } else if (messageType == XDnDConstants.XA_XdndLeave.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   716
            return processXdndLeave(xclient);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   717
        } else if (messageType == XDnDConstants.XA_XdndDrop.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   718
            return processXdndDrop(xclient);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   719
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   720
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   721
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   722
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   723
90ce3da70b43 Initial load
duke
parents:
diff changeset
   724
    protected void sendEnterMessageToToplevel(long toplevel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   725
                                              XClientMessageEvent xclient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   726
        /* flags */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   727
        long data1 = sourceProtocolVersion << XDnDConstants.XDND_PROTOCOL_SHIFT;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   728
        if (sourceFormats != null && sourceFormats.length > 3) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   729
            data1 |= XDnDConstants.XDND_DATA_TYPES_BIT;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   730
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   731
        long data2 = sourceFormats.length > 0 ? sourceFormats[0] : 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   732
        long data3 = sourceFormats.length > 1 ? sourceFormats[1] : 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   733
        long data4 = sourceFormats.length > 2 ? sourceFormats[2] : 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   734
        sendEnterMessageToToplevelImpl(toplevel, xclient.get_data(0),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   735
                                       data1, data2, data3, data4);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   736
90ce3da70b43 Initial load
duke
parents:
diff changeset
   737
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   738
90ce3da70b43 Initial load
duke
parents:
diff changeset
   739
    private void sendEnterMessageToToplevelImpl(long toplevel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   740
                                                long sourceWindow,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   741
                                                long data1, long data2,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   742
                                                long data3, long data4) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   743
        XClientMessageEvent enter = new XClientMessageEvent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   744
        try {
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   745
            enter.set_type((int)XConstants.ClientMessage);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   746
            enter.set_window(toplevel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   747
            enter.set_format(32);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   748
            enter.set_message_type(XDnDConstants.XA_XdndEnter.getAtom());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   749
            /* XID of the source window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   750
            enter.set_data(0, sourceWindow);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   751
            enter.set_data(1, data1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   752
            enter.set_data(2, data2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   753
            enter.set_data(3, data3);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   754
            enter.set_data(4, data4);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   755
90ce3da70b43 Initial load
duke
parents:
diff changeset
   756
            forwardClientMessageToToplevel(toplevel, enter);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   757
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   758
            enter.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   759
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   760
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   761
90ce3da70b43 Initial load
duke
parents:
diff changeset
   762
    protected void sendLeaveMessageToToplevel(long toplevel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   763
                                              XClientMessageEvent xclient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   764
        sendLeaveMessageToToplevelImpl(toplevel, xclient.get_data(0));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   765
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   766
90ce3da70b43 Initial load
duke
parents:
diff changeset
   767
    protected void sendLeaveMessageToToplevelImpl(long toplevel,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   768
                                                  long sourceWindow) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   769
        XClientMessageEvent leave = new XClientMessageEvent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   770
        try {
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   771
            leave.set_type((int)XConstants.ClientMessage);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   772
            leave.set_window(toplevel);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   773
            leave.set_format(32);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   774
            leave.set_message_type(XDnDConstants.XA_XdndLeave.getAtom());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   775
            /* XID of the source window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   776
            leave.set_data(0, sourceWindow);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   777
            /* flags */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   778
            leave.set_data(1, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   779
90ce3da70b43 Initial load
duke
parents:
diff changeset
   780
            forwardClientMessageToToplevel(toplevel, leave);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   781
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   782
            leave.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   783
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   784
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   785
90ce3da70b43 Initial load
duke
parents:
diff changeset
   786
    public boolean sendResponse(long ctxt, int eventID, int action) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   787
        XClientMessageEvent xclient = new XClientMessageEvent(ctxt);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   788
90ce3da70b43 Initial load
duke
parents:
diff changeset
   789
        if (xclient.get_message_type() !=
90ce3da70b43 Initial load
duke
parents:
diff changeset
   790
            XDnDConstants.XA_XdndPosition.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   791
90ce3da70b43 Initial load
duke
parents:
diff changeset
   792
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   793
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   794
90ce3da70b43 Initial load
duke
parents:
diff changeset
   795
        if (eventID == MouseEvent.MOUSE_EXITED) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   796
            action = DnDConstants.ACTION_NONE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   797
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   798
90ce3da70b43 Initial load
duke
parents:
diff changeset
   799
        XClientMessageEvent msg = new XClientMessageEvent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   800
        try {
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   801
            msg.set_type((int)XConstants.ClientMessage);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   802
            msg.set_window(xclient.get_data(0));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   803
            msg.set_format(32);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   804
            msg.set_message_type(XDnDConstants.XA_XdndStatus.getAtom());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   805
            /* target window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   806
            msg.set_data(0, xclient.get_window());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   807
            /* flags */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   808
            long flags = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   809
            if (action != DnDConstants.ACTION_NONE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   810
                flags |= XDnDConstants.XDND_ACCEPT_DROP_FLAG;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   811
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   812
            msg.set_data(1, flags);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   813
            /* specify an empty rectangle */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   814
            msg.set_data(2, 0); /* x, y */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   815
            msg.set_data(3, 0); /* w, h */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   816
            /* action accepted by the target */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   817
            msg.set_data(4, XDnDConstants.getXDnDActionForJavaAction(action));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   818
90ce3da70b43 Initial load
duke
parents:
diff changeset
   819
            XToolkit.awtLock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   820
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   821
                XlibWrapper.XSendEvent(XToolkit.getDisplay(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   822
                                       xclient.get_data(0),
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   823
                                       false, XConstants.NoEventMask,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   824
                                       msg.pData);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   825
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   826
                XToolkit.awtUnlock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   827
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   828
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   829
            msg.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   830
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   831
90ce3da70b43 Initial load
duke
parents:
diff changeset
   832
        return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   833
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   834
90ce3da70b43 Initial load
duke
parents:
diff changeset
   835
    public Object getData(long ctxt, long format)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   836
      throws IllegalArgumentException, IOException {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   837
        XClientMessageEvent xclient = new XClientMessageEvent(ctxt);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   838
        long message_type = xclient.get_message_type();
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   839
        long time_stamp = XConstants.CurrentTime;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   840
90ce3da70b43 Initial load
duke
parents:
diff changeset
   841
        // NOTE: we assume that the source supports at least version 1, so we
90ce3da70b43 Initial load
duke
parents:
diff changeset
   842
        // can use the time stamp
90ce3da70b43 Initial load
duke
parents:
diff changeset
   843
        if (message_type == XDnDConstants.XA_XdndPosition.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   844
            // X server time is an unsigned 32-bit number!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   845
            time_stamp = xclient.get_data(3) & 0xFFFFFFFFL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   846
        } else if (message_type == XDnDConstants.XA_XdndDrop.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   847
            // X server time is an unsigned 32-bit number!
90ce3da70b43 Initial load
duke
parents:
diff changeset
   848
            time_stamp = xclient.get_data(2) & 0xFFFFFFFFL;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   849
        } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   850
            throw new IllegalArgumentException();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   851
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   852
90ce3da70b43 Initial load
duke
parents:
diff changeset
   853
        return XDnDConstants.XDnDSelection.getData(format, time_stamp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   854
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   855
90ce3da70b43 Initial load
duke
parents:
diff changeset
   856
    public boolean sendDropDone(long ctxt, boolean success, int dropAction) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   857
        XClientMessageEvent xclient = new XClientMessageEvent(ctxt);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   858
90ce3da70b43 Initial load
duke
parents:
diff changeset
   859
        if (xclient.get_message_type() !=
90ce3da70b43 Initial load
duke
parents:
diff changeset
   860
            XDnDConstants.XA_XdndDrop.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   861
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   862
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   863
90ce3da70b43 Initial load
duke
parents:
diff changeset
   864
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   865
         * The XDnD protocol recommends that the target requests the special
90ce3da70b43 Initial load
duke
parents:
diff changeset
   866
         * target DELETE in case if the drop action is XdndActionMove.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   867
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   868
        if (dropAction == DnDConstants.ACTION_MOVE && success) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   869
90ce3da70b43 Initial load
duke
parents:
diff changeset
   870
            long time_stamp = xclient.get_data(2);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   871
            long xdndSelectionAtom =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   872
                XDnDConstants.XDnDSelection.getSelectionAtom().getAtom();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   873
90ce3da70b43 Initial load
duke
parents:
diff changeset
   874
            XToolkit.awtLock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   875
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   876
                XlibWrapper.XConvertSelection(XToolkit.getDisplay(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   877
                                              xdndSelectionAtom,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   878
                                              XAtom.get("DELETE").getAtom(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   879
                                              XAtom.get("XAWT_SELECTION").getAtom(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   880
                                              XWindow.getXAWTRootWindow().getWindow(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   881
                                              time_stamp);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   882
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   883
                XToolkit.awtUnlock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   884
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   885
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   886
90ce3da70b43 Initial load
duke
parents:
diff changeset
   887
        XClientMessageEvent msg = new XClientMessageEvent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   888
        try {
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   889
            msg.set_type((int)XConstants.ClientMessage);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   890
            msg.set_window(xclient.get_data(0));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   891
            msg.set_format(32);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   892
            msg.set_message_type(XDnDConstants.XA_XdndFinished.getAtom());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   893
            msg.set_data(0, xclient.get_window()); /* target window */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   894
            msg.set_data(1, 0); /* flags */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   895
            /* specify an empty rectangle */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   896
            msg.set_data(2, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   897
            if (sourceProtocolVersion >= 5) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   898
                if (success) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   899
                    msg.set_data(1, XDnDConstants.XDND_ACCEPT_DROP_FLAG);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   900
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   901
                /* action performed by the target */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   902
                msg.set_data(2, XDnDConstants.getXDnDActionForJavaAction(dropAction));
90ce3da70b43 Initial load
duke
parents:
diff changeset
   903
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   904
            msg.set_data(3, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   905
            msg.set_data(4, 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   906
90ce3da70b43 Initial load
duke
parents:
diff changeset
   907
            XToolkit.awtLock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   908
            try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   909
                XlibWrapper.XSendEvent(XToolkit.getDisplay(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
   910
                                       xclient.get_data(0),
439
3488710b02f8 6623459: Get rid of XConstant, XProtocolConstants and XUtilConstants antipattern
dav
parents: 2
diff changeset
   911
                                       false, XConstants.NoEventMask,
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   912
                                       msg.pData);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   913
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   914
                XToolkit.awtUnlock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   915
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   916
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   917
            msg.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   918
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   919
90ce3da70b43 Initial load
duke
parents:
diff changeset
   920
        /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
   921
         * Flush the buffer to guarantee that the drop completion event is sent
90ce3da70b43 Initial load
duke
parents:
diff changeset
   922
         * to the source before the method returns.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   923
         */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   924
        XToolkit.awtLock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   925
        try {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   926
            XlibWrapper.XFlush(XToolkit.getDisplay());
90ce3da70b43 Initial load
duke
parents:
diff changeset
   927
        } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   928
            XToolkit.awtUnlock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   929
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   930
90ce3da70b43 Initial load
duke
parents:
diff changeset
   931
        /* Trick to prevent cleanup() from posting dragExit */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   932
        targetXWindow = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   933
90ce3da70b43 Initial load
duke
parents:
diff changeset
   934
        /* Cannot do cleanup before the drop finishes as we may need
90ce3da70b43 Initial load
duke
parents:
diff changeset
   935
           source protocol version to send drop finished message. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   936
        cleanup();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   937
        return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   938
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   939
90ce3da70b43 Initial load
duke
parents:
diff changeset
   940
    public final long getSourceWindow() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   941
        return sourceWindow;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   942
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   943
90ce3da70b43 Initial load
duke
parents:
diff changeset
   944
    /**
90ce3da70b43 Initial load
duke
parents:
diff changeset
   945
     * Reset the state of the object.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   946
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   947
    public void cleanup() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   948
        // Clear the reference to this protocol.
90ce3da70b43 Initial load
duke
parents:
diff changeset
   949
        XDropTargetEventProcessor.reset();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   950
90ce3da70b43 Initial load
duke
parents:
diff changeset
   951
        if (targetXWindow != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   952
            notifyProtocolListener(targetXWindow, 0, 0,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   953
                                   DnDConstants.ACTION_NONE, null,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   954
                                   MouseEvent.MOUSE_EXITED);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   955
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   956
90ce3da70b43 Initial load
duke
parents:
diff changeset
   957
        if (sourceWindow != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   958
            XToolkit.awtLock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   959
            try {
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   960
                XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   961
                XlibWrapper.XSelectInput(XToolkit.getDisplay(), sourceWindow,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   962
                                         sourceWindowMask);
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
   963
                XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   964
            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   965
                XToolkit.awtUnlock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   966
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   967
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   968
90ce3da70b43 Initial load
duke
parents:
diff changeset
   969
        sourceWindow = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   970
        sourceWindowMask = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   971
        sourceProtocolVersion = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   972
        sourceActions = DnDConstants.ACTION_NONE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   973
        sourceFormats = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   974
        trackSourceActions = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   975
        userAction = DnDConstants.ACTION_NONE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   976
        sourceX = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   977
        sourceY = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   978
        targetXWindow = null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   979
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   980
90ce3da70b43 Initial load
duke
parents:
diff changeset
   981
    public boolean isDragOverComponent() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   982
        return targetXWindow != null;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   983
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   984
90ce3da70b43 Initial load
duke
parents:
diff changeset
   985
    public void adjustEventForForwarding(XClientMessageEvent xclient,
90ce3da70b43 Initial load
duke
parents:
diff changeset
   986
                                         EmbedderRegistryEntry entry) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   987
        /* Adjust the event to match the XDnD protocol version. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   988
        int version = entry.getVersion();
90ce3da70b43 Initial load
duke
parents:
diff changeset
   989
        if (xclient.get_message_type() == XDnDConstants.XA_XdndEnter.getAtom()) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   990
            int min_version = sourceProtocolVersion < version ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
   991
                sourceProtocolVersion : version;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   992
            long data1 = min_version << XDnDConstants.XDND_PROTOCOL_SHIFT;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   993
            if (sourceFormats != null && sourceFormats.length > 3) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   994
                data1 |= XDnDConstants.XDND_DATA_TYPES_BIT;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   995
            }
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 2802
diff changeset
   996
            if (logger.isLoggable(PlatformLogger.FINEST)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   997
                logger.finest("         "
90ce3da70b43 Initial load
duke
parents:
diff changeset
   998
                              + " entryVersion=" + version
90ce3da70b43 Initial load
duke
parents:
diff changeset
   999
                              + " sourceProtocolVersion=" +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1000
                              sourceProtocolVersion
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1001
                              + " sourceFormats.length=" +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1002
                              (sourceFormats != null ? sourceFormats.length : 0));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1003
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1004
            xclient.set_data(1, data1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1005
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1006
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1007
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1008
    private void notifyProtocolListener(XWindow xwindow, int x, int y,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1009
                                        int dropAction,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1010
                                        XClientMessageEvent xclient,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1011
                                        int eventID) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1012
        long nativeCtxt = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1013
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1014
        // Make a copy of the passed XClientMessageEvent structure, since
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1015
        // the original structure can be freed before this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1016
        // SunDropTargetEvent is dispatched.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1017
        if (xclient != null) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1018
            int size = new XClientMessageEvent(nativeCtxt).getSize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1019
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1020
            nativeCtxt = unsafe.allocateMemory(size + 4 * Native.getLongSize());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1021
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1022
            unsafe.copyMemory(xclient.pData, nativeCtxt, size);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1023
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1024
            long data1 = sourceProtocolVersion << XDnDConstants.XDND_PROTOCOL_SHIFT;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1025
            if (sourceFormats != null && sourceFormats.length > 3) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1026
                data1 |= XDnDConstants.XDND_DATA_TYPES_BIT;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1027
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1028
            // Append information from the latest XdndEnter event.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1029
            Native.putLong(nativeCtxt + size, data1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1030
            Native.putLong(nativeCtxt + size + Native.getLongSize(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1031
                           sourceFormats.length > 0 ? sourceFormats[0] : 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1032
            Native.putLong(nativeCtxt + size + 2 * Native.getLongSize(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1033
                           sourceFormats.length > 1 ? sourceFormats[1] : 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1034
            Native.putLong(nativeCtxt + size + 3 * Native.getLongSize(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1035
                           sourceFormats.length > 2 ? sourceFormats[2] : 0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1036
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1037
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1038
        getProtocolListener().handleDropTargetNotification(xwindow, x, y,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1039
                                                           dropAction,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1040
                                                           sourceActions,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1041
                                                           sourceFormats,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1042
                                                           nativeCtxt,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1043
                                                           eventID);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1044
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1045
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1046
    /*
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1047
     * The methods/fields defined below are executed/accessed only on
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1048
     * the toolkit thread.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1049
     * The methods/fields defined below are executed/accessed only on the event
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1050
     * dispatch thread.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1051
     */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1052
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1053
    public boolean forwardEventToEmbedded(long embedded, long ctxt,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1054
                                          int eventID) {
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 2802
diff changeset
  1055
        if (logger.isLoggable(PlatformLogger.FINEST)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1056
            logger.finest("        ctxt=" + ctxt +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1057
                          " type=" + (ctxt != 0 ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1058
                                      getMessageType(new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1059
                                          XClientMessageEvent(ctxt)) : 0) +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1060
                          " prevCtxt=" + prevCtxt +
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1061
                          " prevType=" + (prevCtxt != 0 ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1062
                                      getMessageType(new
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1063
                                          XClientMessageEvent(prevCtxt)) : 0));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1064
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1065
        if ((ctxt == 0 ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1066
             getMessageType(new XClientMessageEvent(ctxt)) == UNKNOWN_MESSAGE) &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1067
            (prevCtxt == 0 ||
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1068
             getMessageType(new XClientMessageEvent(prevCtxt)) == UNKNOWN_MESSAGE)) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1069
            return false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1070
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1071
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1072
        // The size of XClientMessageEvent structure.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1073
        int size = XClientMessageEvent.getSize();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1074
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1075
        if (ctxt != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1076
            XClientMessageEvent xclient = new XClientMessageEvent(ctxt);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1077
            if (!overXEmbedClient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1078
                long data1 = Native.getLong(ctxt + size);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1079
                long data2 = Native.getLong(ctxt + size + Native.getLongSize());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1080
                long data3 = Native.getLong(ctxt + size + 2 * Native.getLongSize());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1081
                long data4 = Native.getLong(ctxt + size + 3 * Native.getLongSize());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1082
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 2802
diff changeset
  1083
                if (logger.isLoggable(PlatformLogger.FINEST)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1084
                    logger.finest("         1 "
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1085
                                  + " embedded=" + embedded
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1086
                                  + " source=" + xclient.get_data(0)
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1087
                                  + " data1=" + data1
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1088
                                  + " data2=" + data2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1089
                                  + " data3=" + data3
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1090
                                  + " data4=" + data4);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1091
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1092
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1093
                // Copy XdndTypeList from source to proxy.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1094
                if ((data1 & XDnDConstants.XDND_DATA_TYPES_BIT) != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1095
                    WindowPropertyGetter wpg =
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1096
                        new WindowPropertyGetter(xclient.get_data(0),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1097
                                                 XDnDConstants.XA_XdndTypeList,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1098
                                                 0, 0xFFFF, false,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1099
                                                 XAtom.XA_ATOM);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1100
                    try {
2802
d05a9dcc8296 6678385: Random java.lang.StackOverflowError from various JDKs
art
parents: 439
diff changeset
  1101
                        wpg.execute(XErrorHandler.IgnoreBadWindowHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1102
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1103
                        if (wpg.getActualType() == XAtom.XA_ATOM &&
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1104
                            wpg.getActualFormat() == 32) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1105
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1106
                            XToolkit.awtLock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1107
                            try {
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
  1108
                                XErrorHandlerUtil.WITH_XERROR_HANDLER(XErrorHandler.VerifyChangePropertyHandler.getInstance());
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1109
                                XDnDConstants.XA_XdndTypeList.setAtomData(xclient.get_window(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1110
                                                                          XAtom.XA_ATOM,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1111
                                                                          wpg.getData(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1112
                                                                          wpg.getNumberOfItems());
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
  1113
                                XErrorHandlerUtil.RESTORE_XERROR_HANDLER();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1114
17679
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
  1115
                                if ((XErrorHandlerUtil.saved_error != null) &&
a81555868357 8005607: Recursion in J2DXErrHandler() Causes a Stack Overflow on Linux
alitvinov
parents: 5506
diff changeset
  1116
                                    (XErrorHandlerUtil.saved_error.get_error_code() != XConstants.Success)) {
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 2802
diff changeset
  1117
                                    if (logger.isLoggable(PlatformLogger.WARNING)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1118
                                        logger.warning("Cannot set XdndTypeList on the proxy window");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1119
                                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1120
                                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1121
                            } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1122
                                XToolkit.awtUnlock();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1123
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1124
                        } else {
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 2802
diff changeset
  1125
                            if (logger.isLoggable(PlatformLogger.WARNING)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1126
                                logger.warning("Cannot read XdndTypeList from the source window");
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1127
                            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1128
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1129
                    } finally {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1130
                        wpg.dispose();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1131
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1132
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1133
                XDragSourceContextPeer.setProxyModeSourceWindow(xclient.get_data(0));
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1134
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1135
                sendEnterMessageToToplevelImpl(embedded, xclient.get_window(),
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1136
                                               data1, data2, data3, data4);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1137
                overXEmbedClient = true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1138
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1139
3938
ef327bd847c0 6879044: Eliminate the dependency on logging from the AWT/2D/Swing classes
mchung
parents: 2802
diff changeset
  1140
            if (logger.isLoggable(PlatformLogger.FINEST)) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1141
                logger.finest("         2 "
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1142
                              + " embedded=" + embedded
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1143
                              + " xclient=" + xclient);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1144
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1145
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1146
            /* Make a copy of the original event, since we are going to modify the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1147
               event while it still can be referenced from other Java events. */
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1148
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1149
                XClientMessageEvent copy = new XClientMessageEvent();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1150
                unsafe.copyMemory(xclient.pData, copy.pData, copy.getSize());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1151
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1152
                copy.set_data(0, xclient.get_window());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1153
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1154
                forwardClientMessageToToplevel(embedded, copy);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1155
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1156
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1157
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1158
        if (eventID == MouseEvent.MOUSE_EXITED) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1159
            if (overXEmbedClient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1160
                if (ctxt != 0 || prevCtxt != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1161
                    // Last chance to send XdndLeave to the XEmbed client.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1162
                    XClientMessageEvent xclient = ctxt != 0 ?
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1163
                        new XClientMessageEvent(ctxt) :
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1164
                        new XClientMessageEvent(prevCtxt);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1165
                    sendLeaveMessageToToplevelImpl(embedded, xclient.get_window());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1166
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1167
                overXEmbedClient = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1168
                // We have to clear the proxy mode source window here,
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1169
                // when the drag exits the XEmbedCanvasPeer.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1170
                // NOTE: at this point the XEmbed client still might have some
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1171
                // drag notifications to process and it will send responses to
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1172
                // us. With the proxy mode source window cleared we won't be
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1173
                // able to forward these responses to the actual source. This is
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1174
                // not a problem if the drag operation was initiated in this
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1175
                // JVM. However, if it was initiated in another processes the
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1176
                // responses will be lost. We bear with it for now, as it seems
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1177
                // there is no other reliable point to clear.
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1178
                XDragSourceContextPeer.setProxyModeSourceWindow(0);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1179
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1180
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1181
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1182
        if (eventID == MouseEvent.MOUSE_RELEASED) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1183
            overXEmbedClient = false;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1184
            cleanup();
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1185
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1186
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1187
        if (prevCtxt != 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1188
            unsafe.freeMemory(prevCtxt);
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1189
            prevCtxt = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1190
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1191
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1192
        if (ctxt != 0 && overXEmbedClient) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1193
            prevCtxt = unsafe.allocateMemory(size + 4 * Native.getLongSize());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1194
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1195
            unsafe.copyMemory(ctxt, prevCtxt, size + 4 * Native.getLongSize());
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1196
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1197
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1198
        return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1199
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1200
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1201
    public boolean isXEmbedSupported() {
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1202
        return true;
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1203
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
  1204
}