725 XClientMessageEvent xclient) {
726 /* flags */
727 long data1 = sourceProtocolVersion << XDnDConstants.XDND_PROTOCOL_SHIFT;
728 if (sourceFormats != null && sourceFormats.length > 3) {
729 data1 |= XDnDConstants.XDND_DATA_TYPES_BIT;
730 }
731 long data2 = sourceFormats.length > 0 ? sourceFormats[0] : 0;
732 long data3 = sourceFormats.length > 1 ? sourceFormats[1] : 0;
733 long data4 = sourceFormats.length > 2 ? sourceFormats[2] : 0;
734 sendEnterMessageToToplevelImpl(toplevel, xclient.get_data(0),
735 data1, data2, data3, data4);
736
737 }
738
739 private void sendEnterMessageToToplevelImpl(long toplevel,
740 long sourceWindow,
741 long data1, long data2,
742 long data3, long data4) {
743 XClientMessageEvent enter = new XClientMessageEvent();
744 try {
745 enter.set_type((int)XConstants.ClientMessage);
746 enter.set_window(toplevel);
747 enter.set_format(32);
748 enter.set_message_type(XDnDConstants.XA_XdndEnter.getAtom());
749 /* XID of the source window */
750 enter.set_data(0, sourceWindow);
751 enter.set_data(1, data1);
752 enter.set_data(2, data2);
753 enter.set_data(3, data3);
754 enter.set_data(4, data4);
755
756 forwardClientMessageToToplevel(toplevel, enter);
757 } finally {
758 enter.dispose();
759 }
760 }
761
762 protected void sendLeaveMessageToToplevel(long toplevel,
763 XClientMessageEvent xclient) {
764 sendLeaveMessageToToplevelImpl(toplevel, xclient.get_data(0));
765 }
766
767 protected void sendLeaveMessageToToplevelImpl(long toplevel,
768 long sourceWindow) {
769 XClientMessageEvent leave = new XClientMessageEvent();
770 try {
771 leave.set_type((int)XConstants.ClientMessage);
772 leave.set_window(toplevel);
773 leave.set_format(32);
774 leave.set_message_type(XDnDConstants.XA_XdndLeave.getAtom());
775 /* XID of the source window */
776 leave.set_data(0, sourceWindow);
777 /* flags */
778 leave.set_data(1, 0);
779
780 forwardClientMessageToToplevel(toplevel, leave);
781 } finally {
782 leave.dispose();
783 }
784 }
785
786 public boolean sendResponse(long ctxt, int eventID, int action) {
787 XClientMessageEvent xclient = new XClientMessageEvent(ctxt);
788
789 if (xclient.get_message_type() !=
790 XDnDConstants.XA_XdndPosition.getAtom()) {
791
792 return false;
793 }
794
795 if (eventID == MouseEvent.MOUSE_EXITED) {
796 action = DnDConstants.ACTION_NONE;
797 }
798
799 XClientMessageEvent msg = new XClientMessageEvent();
800 try {
801 msg.set_type((int)XConstants.ClientMessage);
802 msg.set_window(xclient.get_data(0));
803 msg.set_format(32);
804 msg.set_message_type(XDnDConstants.XA_XdndStatus.getAtom());
805 /* target window */
806 msg.set_data(0, xclient.get_window());
807 /* flags */
808 long flags = 0;
809 if (action != DnDConstants.ACTION_NONE) {
810 flags |= XDnDConstants.XDND_ACCEPT_DROP_FLAG;
811 }
812 msg.set_data(1, flags);
813 /* specify an empty rectangle */
814 msg.set_data(2, 0); /* x, y */
815 msg.set_data(3, 0); /* w, h */
816 /* action accepted by the target */
817 msg.set_data(4, XDnDConstants.getXDnDActionForJavaAction(action));
818
819 XToolkit.awtLock();
820 try {
821 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
869
870 long time_stamp = xclient.get_data(2);
871 long xdndSelectionAtom =
872 XDnDConstants.XDnDSelection.getSelectionAtom().getAtom();
873
874 XToolkit.awtLock();
875 try {
876 XlibWrapper.XConvertSelection(XToolkit.getDisplay(),
877 xdndSelectionAtom,
878 XAtom.get("DELETE").getAtom(),
879 XAtom.get("XAWT_SELECTION").getAtom(),
880 XWindow.getXAWTRootWindow().getWindow(),
881 time_stamp);
882 } finally {
883 XToolkit.awtUnlock();
884 }
885 }
886
887 XClientMessageEvent msg = new XClientMessageEvent();
888 try {
889 msg.set_type((int)XConstants.ClientMessage);
890 msg.set_window(xclient.get_data(0));
891 msg.set_format(32);
892 msg.set_message_type(XDnDConstants.XA_XdndFinished.getAtom());
893 msg.set_data(0, xclient.get_window()); /* target window */
894 msg.set_data(1, 0); /* flags */
895 /* specify an empty rectangle */
896 msg.set_data(2, 0);
897 if (sourceProtocolVersion >= 5) {
898 if (success) {
899 msg.set_data(1, XDnDConstants.XDND_ACCEPT_DROP_FLAG);
900 }
901 /* action performed by the target */
902 msg.set_data(2, XDnDConstants.getXDnDActionForJavaAction(dropAction));
903 }
904 msg.set_data(3, 0);
905 msg.set_data(4, 0);
906
907 XToolkit.awtLock();
908 try {
909 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
|
725 XClientMessageEvent xclient) {
726 /* flags */
727 long data1 = sourceProtocolVersion << XDnDConstants.XDND_PROTOCOL_SHIFT;
728 if (sourceFormats != null && sourceFormats.length > 3) {
729 data1 |= XDnDConstants.XDND_DATA_TYPES_BIT;
730 }
731 long data2 = sourceFormats.length > 0 ? sourceFormats[0] : 0;
732 long data3 = sourceFormats.length > 1 ? sourceFormats[1] : 0;
733 long data4 = sourceFormats.length > 2 ? sourceFormats[2] : 0;
734 sendEnterMessageToToplevelImpl(toplevel, xclient.get_data(0),
735 data1, data2, data3, data4);
736
737 }
738
739 private void sendEnterMessageToToplevelImpl(long toplevel,
740 long sourceWindow,
741 long data1, long data2,
742 long data3, long data4) {
743 XClientMessageEvent enter = new XClientMessageEvent();
744 try {
745 enter.set_type(XConstants.ClientMessage);
746 enter.set_window(toplevel);
747 enter.set_format(32);
748 enter.set_message_type(XDnDConstants.XA_XdndEnter.getAtom());
749 /* XID of the source window */
750 enter.set_data(0, sourceWindow);
751 enter.set_data(1, data1);
752 enter.set_data(2, data2);
753 enter.set_data(3, data3);
754 enter.set_data(4, data4);
755
756 forwardClientMessageToToplevel(toplevel, enter);
757 } finally {
758 enter.dispose();
759 }
760 }
761
762 protected void sendLeaveMessageToToplevel(long toplevel,
763 XClientMessageEvent xclient) {
764 sendLeaveMessageToToplevelImpl(toplevel, xclient.get_data(0));
765 }
766
767 protected void sendLeaveMessageToToplevelImpl(long toplevel,
768 long sourceWindow) {
769 XClientMessageEvent leave = new XClientMessageEvent();
770 try {
771 leave.set_type(XConstants.ClientMessage);
772 leave.set_window(toplevel);
773 leave.set_format(32);
774 leave.set_message_type(XDnDConstants.XA_XdndLeave.getAtom());
775 /* XID of the source window */
776 leave.set_data(0, sourceWindow);
777 /* flags */
778 leave.set_data(1, 0);
779
780 forwardClientMessageToToplevel(toplevel, leave);
781 } finally {
782 leave.dispose();
783 }
784 }
785
786 public boolean sendResponse(long ctxt, int eventID, int action) {
787 XClientMessageEvent xclient = new XClientMessageEvent(ctxt);
788
789 if (xclient.get_message_type() !=
790 XDnDConstants.XA_XdndPosition.getAtom()) {
791
792 return false;
793 }
794
795 if (eventID == MouseEvent.MOUSE_EXITED) {
796 action = DnDConstants.ACTION_NONE;
797 }
798
799 XClientMessageEvent msg = new XClientMessageEvent();
800 try {
801 msg.set_type(XConstants.ClientMessage);
802 msg.set_window(xclient.get_data(0));
803 msg.set_format(32);
804 msg.set_message_type(XDnDConstants.XA_XdndStatus.getAtom());
805 /* target window */
806 msg.set_data(0, xclient.get_window());
807 /* flags */
808 long flags = 0;
809 if (action != DnDConstants.ACTION_NONE) {
810 flags |= XDnDConstants.XDND_ACCEPT_DROP_FLAG;
811 }
812 msg.set_data(1, flags);
813 /* specify an empty rectangle */
814 msg.set_data(2, 0); /* x, y */
815 msg.set_data(3, 0); /* w, h */
816 /* action accepted by the target */
817 msg.set_data(4, XDnDConstants.getXDnDActionForJavaAction(action));
818
819 XToolkit.awtLock();
820 try {
821 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
869
870 long time_stamp = xclient.get_data(2);
871 long xdndSelectionAtom =
872 XDnDConstants.XDnDSelection.getSelectionAtom().getAtom();
873
874 XToolkit.awtLock();
875 try {
876 XlibWrapper.XConvertSelection(XToolkit.getDisplay(),
877 xdndSelectionAtom,
878 XAtom.get("DELETE").getAtom(),
879 XAtom.get("XAWT_SELECTION").getAtom(),
880 XWindow.getXAWTRootWindow().getWindow(),
881 time_stamp);
882 } finally {
883 XToolkit.awtUnlock();
884 }
885 }
886
887 XClientMessageEvent msg = new XClientMessageEvent();
888 try {
889 msg.set_type(XConstants.ClientMessage);
890 msg.set_window(xclient.get_data(0));
891 msg.set_format(32);
892 msg.set_message_type(XDnDConstants.XA_XdndFinished.getAtom());
893 msg.set_data(0, xclient.get_window()); /* target window */
894 msg.set_data(1, 0); /* flags */
895 /* specify an empty rectangle */
896 msg.set_data(2, 0);
897 if (sourceProtocolVersion >= 5) {
898 if (success) {
899 msg.set_data(1, XDnDConstants.XDND_ACCEPT_DROP_FLAG);
900 }
901 /* action performed by the target */
902 msg.set_data(2, XDnDConstants.getXDnDActionForJavaAction(dropAction));
903 }
904 msg.set_data(3, 0);
905 msg.set_data(4, 0);
906
907 XToolkit.awtLock();
908 try {
909 XlibWrapper.XSendEvent(XToolkit.getDisplay(),
|