jdk/src/solaris/classes/sun/awt/X11/XDnDDragSourceProtocol.java
changeset 439 3488710b02f8
parent 2 90ce3da70b43
child 2802 d05a9dcc8296
equal deleted inserted replaced
438:2ae294e4518c 439:3488710b02f8
     1 /*
     1 /*
     2  * Copyright 2003-2005 Sun Microsystems, Inc.  All Rights Reserved.
     2  * Copyright 2003-2008 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Sun designates this
     7  * published by the Free Software Foundation.  Sun designates this
   101                                                         XAtom.XA_ATOM,
   101                                                         XAtom.XA_ATOM,
   102                                                         data, action_count);
   102                                                         data, action_count);
   103             XToolkit.RESTORE_XERROR_HANDLER();
   103             XToolkit.RESTORE_XERROR_HANDLER();
   104 
   104 
   105             if (XToolkit.saved_error != null &&
   105             if (XToolkit.saved_error != null &&
   106                 XToolkit.saved_error.get_error_code() != XlibWrapper.Success) {
   106                 XToolkit.saved_error.get_error_code() != XConstants.Success) {
   107                 cleanup();
   107                 cleanup();
   108                 throw new XException("Cannot write XdndActionList property");
   108                 throw new XException("Cannot write XdndActionList property");
   109             }
   109             }
   110         } finally {
   110         } finally {
   111             unsafe.freeMemory(data);
   111             unsafe.freeMemory(data);
   122                                                       XAtom.XA_ATOM,
   122                                                       XAtom.XA_ATOM,
   123                                                       data, formats.length);
   123                                                       data, formats.length);
   124             XToolkit.RESTORE_XERROR_HANDLER();
   124             XToolkit.RESTORE_XERROR_HANDLER();
   125 
   125 
   126             if (XToolkit.saved_error != null &&
   126             if (XToolkit.saved_error != null &&
   127                 XToolkit.saved_error.get_error_code() != XlibWrapper.Success) {
   127                 XToolkit.saved_error.get_error_code() != XConstants.Success) {
   128                 cleanup();
   128                 cleanup();
   129                 throw new XException("Cannot write XdndActionList property");
   129                 throw new XException("Cannot write XdndActionList property");
   130             }
   130             }
   131         } finally {
   131         } finally {
   132             unsafe.freeMemory(data);
   132             unsafe.freeMemory(data);
   133             data = 0;
   133             data = 0;
   134         }
   134         }
   135 
   135 
   136         if (!XDnDConstants.XDnDSelection.setOwner(contents, formatMap, formats,
   136         if (!XDnDConstants.XDnDSelection.setOwner(contents, formatMap, formats,
   137                                                   XlibWrapper.CurrentTime)) {
   137                                                   XConstants.CurrentTime)) {
   138             cleanup();
   138             cleanup();
   139             throw new InvalidDnDOperationException("Cannot acquire selection ownership");
   139             throw new InvalidDnDOperationException("Cannot acquire selection ownership");
   140         }
   140         }
   141     }
   141     }
   142 
   142 
   191     public TargetWindowInfo getTargetWindowInfo(long window) {
   191     public TargetWindowInfo getTargetWindowInfo(long window) {
   192         assert XToolkit.isAWTLockHeldByCurrentThread();
   192         assert XToolkit.isAWTLockHeldByCurrentThread();
   193 
   193 
   194         WindowPropertyGetter wpg1 =
   194         WindowPropertyGetter wpg1 =
   195             new WindowPropertyGetter(window, XDnDConstants.XA_XdndAware, 0, 1,
   195             new WindowPropertyGetter(window, XDnDConstants.XA_XdndAware, 0, 1,
   196                                      false, XlibWrapper.AnyPropertyType);
   196                                      false, XConstants.AnyPropertyType);
   197 
   197 
   198         int status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
   198         int status = wpg1.execute(XToolkit.IgnoreBadWindowHandler);
   199 
   199 
   200         if (status == XlibWrapper.Success &&
   200         if (status == XConstants.Success &&
   201             wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
   201             wpg1.getData() != 0 && wpg1.getActualType() == XAtom.XA_ATOM) {
   202 
   202 
   203             int targetVersion = (int)Native.getLong(wpg1.getData());
   203             int targetVersion = (int)Native.getLong(wpg1.getData());
   204 
   204 
   205             wpg1.dispose();
   205             wpg1.dispose();
   215                                              0, 1, false, XAtom.XA_WINDOW);
   215                                              0, 1, false, XAtom.XA_WINDOW);
   216 
   216 
   217                 try {
   217                 try {
   218                     status = wpg2.execute(XToolkit.IgnoreBadWindowHandler);
   218                     status = wpg2.execute(XToolkit.IgnoreBadWindowHandler);
   219 
   219 
   220                     if (status == XlibWrapper.Success &&
   220                     if (status == XConstants.Success &&
   221                         wpg2.getData() != 0 &&
   221                         wpg2.getData() != 0 &&
   222                         wpg2.getActualType() == XAtom.XA_WINDOW) {
   222                         wpg2.getActualType() == XAtom.XA_WINDOW) {
   223 
   223 
   224                         proxy = Native.getLong(wpg2.getData());
   224                         proxy = Native.getLong(wpg2.getData());
   225                     }
   225                     }
   233                                                  0, 1, false, XAtom.XA_WINDOW);
   233                                                  0, 1, false, XAtom.XA_WINDOW);
   234 
   234 
   235                     try {
   235                     try {
   236                         status = wpg3.execute(XToolkit.IgnoreBadWindowHandler);
   236                         status = wpg3.execute(XToolkit.IgnoreBadWindowHandler);
   237 
   237 
   238                         if (status != XlibWrapper.Success ||
   238                         if (status != XConstants.Success ||
   239                             wpg3.getData() == 0 ||
   239                             wpg3.getData() == 0 ||
   240                             wpg3.getActualType() != XAtom.XA_WINDOW ||
   240                             wpg3.getActualType() != XAtom.XA_WINDOW ||
   241                             Native.getLong(wpg3.getData()) != proxy) {
   241                             Native.getLong(wpg3.getData()) != proxy) {
   242 
   242 
   243                             proxy = 0;
   243                             proxy = 0;
   244                         } else {
   244                         } else {
   245                             WindowPropertyGetter wpg4 =
   245                             WindowPropertyGetter wpg4 =
   246                                 new WindowPropertyGetter(proxy,
   246                                 new WindowPropertyGetter(proxy,
   247                                                          XDnDConstants.XA_XdndAware,
   247                                                          XDnDConstants.XA_XdndAware,
   248                                                          0, 1, false,
   248                                                          0, 1, false,
   249                                                          XlibWrapper.AnyPropertyType);
   249                                                          XConstants.AnyPropertyType);
   250 
   250 
   251                             try {
   251                             try {
   252                                 status = wpg4.execute(XToolkit.IgnoreBadWindowHandler);
   252                                 status = wpg4.execute(XToolkit.IgnoreBadWindowHandler);
   253 
   253 
   254                                 if (status != XlibWrapper.Success ||
   254                                 if (status != XConstants.Success ||
   255                                     wpg4.getData() == 0 ||
   255                                     wpg4.getData() == 0 ||
   256                                     wpg4.getActualType() != XAtom.XA_ATOM) {
   256                                     wpg4.getActualType() != XAtom.XA_ATOM) {
   257 
   257 
   258                                     proxy = 0;
   258                                     proxy = 0;
   259                                 }
   259                                 }
   281         assert getTargetWindow() != 0;
   281         assert getTargetWindow() != 0;
   282         assert formats != null;
   282         assert formats != null;
   283 
   283 
   284         XClientMessageEvent msg = new XClientMessageEvent();
   284         XClientMessageEvent msg = new XClientMessageEvent();
   285         try {
   285         try {
   286             msg.set_type((int)XlibWrapper.ClientMessage);
   286             msg.set_type((int)XConstants.ClientMessage);
   287             msg.set_window(getTargetWindow());
   287             msg.set_window(getTargetWindow());
   288             msg.set_format(32);
   288             msg.set_format(32);
   289             msg.set_message_type(XDnDConstants.XA_XdndEnter.getAtom());
   289             msg.set_message_type(XDnDConstants.XA_XdndEnter.getAtom());
   290             msg.set_data(0, XDragSourceProtocol.getDragSourceWindow());
   290             msg.set_data(0, XDragSourceProtocol.getDragSourceWindow());
   291             long data1 =
   291             long data1 =
   295             msg.set_data(2, formats.length > 0 ? formats[0] : 0);
   295             msg.set_data(2, formats.length > 0 ? formats[0] : 0);
   296             msg.set_data(3, formats.length > 1 ? formats[1] : 0);
   296             msg.set_data(3, formats.length > 1 ? formats[1] : 0);
   297             msg.set_data(4, formats.length > 2 ? formats[2] : 0);
   297             msg.set_data(4, formats.length > 2 ? formats[2] : 0);
   298             XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   298             XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   299                                    getTargetProxyWindow(),
   299                                    getTargetProxyWindow(),
   300                                    false, XlibWrapper.NoEventMask,
   300                                    false, XConstants.NoEventMask,
   301                                    msg.pData);
   301                                    msg.pData);
   302         } finally {
   302         } finally {
   303             msg.dispose();
   303             msg.dispose();
   304         }
   304         }
   305     }
   305     }
   309         assert XToolkit.isAWTLockHeldByCurrentThread();
   309         assert XToolkit.isAWTLockHeldByCurrentThread();
   310         assert getTargetWindow() != 0;
   310         assert getTargetWindow() != 0;
   311 
   311 
   312         XClientMessageEvent msg = new XClientMessageEvent();
   312         XClientMessageEvent msg = new XClientMessageEvent();
   313         try {
   313         try {
   314             msg.set_type((int)XlibWrapper.ClientMessage);
   314             msg.set_type((int)XConstants.ClientMessage);
   315             msg.set_window(getTargetWindow());
   315             msg.set_window(getTargetWindow());
   316             msg.set_format(32);
   316             msg.set_format(32);
   317             msg.set_message_type(XDnDConstants.XA_XdndPosition.getAtom());
   317             msg.set_message_type(XDnDConstants.XA_XdndPosition.getAtom());
   318             msg.set_data(0, XDragSourceProtocol.getDragSourceWindow());
   318             msg.set_data(0, XDragSourceProtocol.getDragSourceWindow());
   319             msg.set_data(1, 0); /* flags */
   319             msg.set_data(1, 0); /* flags */
   320             msg.set_data(2, xRoot << 16 | yRoot);
   320             msg.set_data(2, xRoot << 16 | yRoot);
   321             msg.set_data(3, time);
   321             msg.set_data(3, time);
   322             msg.set_data(4, XDnDConstants.getXDnDActionForJavaAction(sourceAction));
   322             msg.set_data(4, XDnDConstants.getXDnDActionForJavaAction(sourceAction));
   323             XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   323             XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   324                                    getTargetProxyWindow(),
   324                                    getTargetProxyWindow(),
   325                                    false, XlibWrapper.NoEventMask,
   325                                    false, XConstants.NoEventMask,
   326                                    msg.pData);
   326                                    msg.pData);
   327         } finally {
   327         } finally {
   328             msg.dispose();
   328             msg.dispose();
   329         }
   329         }
   330     }
   330     }
   333         assert XToolkit.isAWTLockHeldByCurrentThread();
   333         assert XToolkit.isAWTLockHeldByCurrentThread();
   334         assert getTargetWindow() != 0;
   334         assert getTargetWindow() != 0;
   335 
   335 
   336         XClientMessageEvent msg = new XClientMessageEvent();
   336         XClientMessageEvent msg = new XClientMessageEvent();
   337         try {
   337         try {
   338             msg.set_type((int)XlibWrapper.ClientMessage);
   338             msg.set_type((int)XConstants.ClientMessage);
   339             msg.set_window(getTargetWindow());
   339             msg.set_window(getTargetWindow());
   340             msg.set_format(32);
   340             msg.set_format(32);
   341             msg.set_message_type(XDnDConstants.XA_XdndLeave.getAtom());
   341             msg.set_message_type(XDnDConstants.XA_XdndLeave.getAtom());
   342             msg.set_data(0, XDragSourceProtocol.getDragSourceWindow());
   342             msg.set_data(0, XDragSourceProtocol.getDragSourceWindow());
   343             msg.set_data(1, 0);
   343             msg.set_data(1, 0);
   344             msg.set_data(2, 0);
   344             msg.set_data(2, 0);
   345             msg.set_data(3, 0);
   345             msg.set_data(3, 0);
   346             msg.set_data(4, 0);
   346             msg.set_data(4, 0);
   347             XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   347             XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   348                                    getTargetProxyWindow(),
   348                                    getTargetProxyWindow(),
   349                                    false, XlibWrapper.NoEventMask,
   349                                    false, XConstants.NoEventMask,
   350                                    msg.pData);
   350                                    msg.pData);
   351         } finally {
   351         } finally {
   352             msg.dispose();
   352             msg.dispose();
   353         }
   353         }
   354     }
   354     }
   359         assert XToolkit.isAWTLockHeldByCurrentThread();
   359         assert XToolkit.isAWTLockHeldByCurrentThread();
   360         assert getTargetWindow() != 0;
   360         assert getTargetWindow() != 0;
   361 
   361 
   362         XClientMessageEvent msg = new XClientMessageEvent();
   362         XClientMessageEvent msg = new XClientMessageEvent();
   363         try {
   363         try {
   364             msg.set_type((int)XlibWrapper.ClientMessage);
   364             msg.set_type((int)XConstants.ClientMessage);
   365             msg.set_window(getTargetWindow());
   365             msg.set_window(getTargetWindow());
   366             msg.set_format(32);
   366             msg.set_format(32);
   367             msg.set_message_type(XDnDConstants.XA_XdndDrop.getAtom());
   367             msg.set_message_type(XDnDConstants.XA_XdndDrop.getAtom());
   368             msg.set_data(0, XDragSourceProtocol.getDragSourceWindow());
   368             msg.set_data(0, XDragSourceProtocol.getDragSourceWindow());
   369             msg.set_data(1, 0); /* flags */
   369             msg.set_data(1, 0); /* flags */
   370             msg.set_data(2, time);
   370             msg.set_data(2, time);
   371             msg.set_data(3, 0);
   371             msg.set_data(3, 0);
   372             msg.set_data(4, 0);
   372             msg.set_data(4, 0);
   373             XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   373             XlibWrapper.XSendEvent(XToolkit.getDisplay(),
   374                                    getTargetProxyWindow(),
   374                                    getTargetProxyWindow(),
   375                                    false, XlibWrapper.NoEventMask,
   375                                    false, XConstants.NoEventMask,
   376                                    msg.pData);
   376                                    msg.pData);
   377         } finally {
   377         } finally {
   378             msg.dispose();
   378             msg.dispose();
   379         }
   379         }
   380     }
   380     }
   404             xclient.set_window(sourceWindow);
   404             xclient.set_window(sourceWindow);
   405 
   405 
   406             assert XToolkit.isAWTLockHeldByCurrentThread();
   406             assert XToolkit.isAWTLockHeldByCurrentThread();
   407 
   407 
   408             XlibWrapper.XSendEvent(XToolkit.getDisplay(), sourceWindow,
   408             XlibWrapper.XSendEvent(XToolkit.getDisplay(), sourceWindow,
   409                                    false, XlibWrapper.NoEventMask,
   409                                    false, XConstants.NoEventMask,
   410                                    xclient.pData);
   410                                    xclient.pData);
   411 
   411 
   412             return true;
   412             return true;
   413         }
   413         }
   414 
   414