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 |