1 /*
2 * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
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
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package sun.awt.X11;
27
28 //import static sun.awt.X11.XEmbed.*;
29 import java.awt.*;
30 import java.awt.event.*;
31 import sun.util.logging.PlatformLogger;
32 import static sun.awt.X11.XConstants.*;
33 import java.util.LinkedList;
34
35 /**
36 * Test XEmbed server implementation. See file:///home/dom/bugs/4931668/test_plan.html for
37 * specification and references.
38 */
39 public class XEmbedServerTester implements XEventDispatcher {
40 private static final PlatformLogger xembedLog = PlatformLogger.getLogger("sun.awt.X11.xembed.XEmbedServerTester");
41 private final Object EVENT_LOCK = new Object();
42 static final int SYSTEM_EVENT_MASK = 0x8000;
43 int my_version, server_version;
44 XEmbedHelper xembed = new XEmbedHelper();
45 boolean focused;
46 int focusedKind;
47 int focusedServerComponent;
48 boolean reparent;
49 long parent;
50 boolean windowActive;
51 boolean xembedActive;
52 XBaseWindow window;
53 volatile int eventWaited = -1, eventReceived = -1;
54 int mapped;
55 int accel_key, accel_keysym, accel_mods;
56 static Rectangle initialBounds = new Rectangle(0, 0, 100, 100);
57 Robot robot;
58 Rectangle serverBounds[]; // first rectangle is for the server frame, second is for dummy frame, others are for its children
59 private static final int SERVER_BOUNDS = 0, OTHER_FRAME = 1, SERVER_FOCUS = 2, SERVER_MODAL = 3, MODAL_CLOSE = 4;
60
61 LinkedList<Integer> events = new LinkedList<Integer>();
62
63 private XEmbedServerTester(Rectangle serverBounds[], long parent) {
64 this.parent = parent;
65 focusedKind = -1;
66 focusedServerComponent = -1;
67 reparent = false;
68 windowActive = false;
69 xembedActive = false;
70 my_version = XEmbedHelper.XEMBED_VERSION;
71 mapped = XEmbedHelper.XEMBED_MAPPED;
72 this.serverBounds = serverBounds;
73 if (serverBounds.length < 5) {
74 throw new IllegalArgumentException("There must be at least five areas: server-activation, server-deactivation, server-focus, " +
75 "server-modal show, modal-close");
76 }
77 try {
78 robot = new Robot();
79 robot.setAutoDelay(100);
80 } catch (Exception e) {
81 throw new RuntimeException("Can't create robot");
82 }
83 initAccel();
84 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
85 xembedLog.finer("XEmbed client(tester), embedder window: " + Long.toHexString(parent));
86 }
87 }
88
89 public static XEmbedServerTester getTester(Rectangle serverBounds[], long parent) {
90 return new XEmbedServerTester(serverBounds, parent);
91 }
92
93 private void dumpReceivedEvents() {
94 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
95 xembedLog.finer("Events received so far:");
96 int pos = 0;
97 for (Integer event : events) {
98 xembedLog.finer((pos++) + ":" + XEmbedHelper.msgidToString(event));
99 }
100 xembedLog.finer("End of event dump");
101 }
102 }
103
104 public void test1_1() {
105 int res = embedCompletely();
106 waitWindowActivated(res);
107 requestFocus();
108 deactivateServer();
109 res = activateServer(getEventPos());
110 waitFocusGained(res);
111 checkFocusGained(XEmbedHelper.XEMBED_FOCUS_CURRENT);
112 }
113
114 public void test1_2() {
115 int res = embedCompletely();
116 waitWindowActivated(res);
117 requestFocus();
118 checkFocusGained(XEmbedHelper.XEMBED_FOCUS_CURRENT);
119 }
120
121 public void test1_3() {
122 embedCompletely();
123 deactivateServer();
124 requestFocusNoWait();
125 checkNotFocused();
126 }
127
128 public void test1_4() {
129 embedCompletely();
130 deactivateServer();
131 requestFocusNoWait();
132 checkNotFocused();
133 int res = getEventPos();
134 activateServer(res);
135 waitFocusGained(res);
136 checkFocusGained(XEmbedHelper.XEMBED_FOCUS_CURRENT);
137 }
138
139 public void test1_5() {
140 int res = embedCompletely();
141 waitWindowActivated(res);
142 checkWindowActivated();
143 }
144
145 public void test1_6() {
146 int res = embedCompletely();
147 waitWindowActivated(res);
148 requestFocus();
149 res = deactivateServer();
150 checkFocused();
151 }
152
153 public void test1_7() {
154 int res = embedCompletely();
155 waitWindowActivated(res);
156 requestFocus();
157 focusServer();
158 checkFocusLost();
159 }
160
161 public void test2_5() {
162 int res = embedCompletely();
163 waitWindowActivated(res);
164 requestFocus();
165 focusServerNext();
166 checkFocusedServerNext();
167 checkFocusLost();
168 }
169
170 public void test2_6() {
171 int res = embedCompletely();
172 waitWindowActivated(res);
173 requestFocus();
174 focusServerPrev();
175 checkFocusedServerPrev();
176 checkFocusLost();
177 }
178
179 public void test3_1() {
180 reparent = false;
181 embedCompletely();
182 }
183
184 public void test3_3() {
185 reparent = true;
186 embedCompletely();
187 }
188
189 public void test3_4() {
190 my_version = 10;
191 embedCompletely();
192 if (server_version != XEmbedHelper.XEMBED_VERSION) {
193 throw new RuntimeException("Version " + server_version + " is not minimal");
194 }
195 }
196
197 public void test3_5() {
198 embedCompletely();
199
200 window.destroy();
201 // TODO: how can we detect that XEmbed ended? So far we are
202 // just checking that XEmbed server won't end up with an
203 // exception, which should end up testing, hopefully.
204
205 // Sleep before exiting the tester application
206 sleep(1000);
207 }
208
209 public void test3_6() {
210 embedCompletely();
211
212 sleep(1000);
213 XToolkit.awtLock();
214 try {
215 XlibWrapper.XUnmapWindow(XToolkit.getDisplay(), window.getWindow());
216 XlibWrapper.XReparentWindow(XToolkit.getDisplay(), window.getWindow(), XToolkit.getDefaultRootWindow(), 0, 0);
217 } finally {
218 XToolkit.awtUnlock();
219 }
220
221 int res = getEventPos();
222
223 activateServerNoWait(res);
224
225 sleep(1000);
226 if (checkEventList(res, XEmbedHelper.XEMBED_WINDOW_ACTIVATE) != -1) {
227 throw new RuntimeException("Focus was been given to the client after XEmbed has ended");
228 }
229 }
230
231 public void test4_1() {
232 mapped = XEmbedHelper.XEMBED_MAPPED;
233 int res = getEventPos();
234 embedCompletely();
235 sleep(1000);
236 checkMapped();
237 }
238
239 public void test4_2() {
240 mapped = 0;
241 embedCompletely();
242 sleep(1000);
243
244 int res = getEventPos();
245 mapped = XEmbedHelper.XEMBED_MAPPED;
246 updateEmbedInfo();
247 sleep(1000);
248 checkMapped();
249 }
250
251 public void test4_3() {
252 int res = getEventPos();
253 mapped = XEmbedHelper.XEMBED_MAPPED;
254 embedCompletely();
255
256 res = getEventPos();
257 mapped = 0;
258 updateEmbedInfo();
259 sleep(1000);
260 checkNotMapped();
261 }
262
263 public void test4_4() {
264 mapped = 0;
265 embedCompletely();
266 sleep(1000);
267 if (XlibUtil.getWindowMapState(window.getWindow()) != IsUnmapped) {
268 throw new RuntimeException("Client has been mapped");
269 }
270 }
271
272 public void test6_1_1() {
273 embedCompletely();
274 registerAccelerator();
275 focusServer();
276 int res = pressAccelKey();
277 waitForEvent(res, XEmbedHelper.XEMBED_ACTIVATE_ACCELERATOR);
278 }
279
280 public void test6_1_2() {
281 embedCompletely();
282 registerAccelerator();
283 focusServer();
284 deactivateServer();
285 int res = pressAccelKey();
286 sleep(1000);
287 if (checkEventList(res, XEmbedHelper.XEMBED_ACTIVATE_ACCELERATOR) != -1) {
288 throw new RuntimeException("Accelerator has been activated in inactive embedder");
289 }
290 }
291
292 public void test6_1_3() {
293 embedCompletely();
294 registerAccelerator();
295 focusServer();
296 deactivateServer();
297 unregisterAccelerator();
298 int res = pressAccelKey();
299 sleep(1000);
300 if (checkEventList(res, XEmbedHelper.XEMBED_ACTIVATE_ACCELERATOR) != -1) {
301 throw new RuntimeException("Accelerator has been activated after unregistering");
302 }
303 }
304
305 public void test6_1_4() {
306 embedCompletely();
307 registerAccelerator();
308 requestFocus();
309 int res = pressAccelKey();
310 sleep(1000);
311 if (checkEventList(res, XEmbedHelper.XEMBED_ACTIVATE_ACCELERATOR) != -1) {
312 throw new RuntimeException("Accelerator has been activated in focused client");
313 }
314 }
315 public void test6_2_1() {
316 embedCompletely();
317 grabKey();
318 focusServer();
319 int res = pressAccelKey();
320 waitSystemEvent(res, KeyPress);
321 }
322
323 public void test6_2_2() {
324 embedCompletely();
325 grabKey();
326 focusServer();
327 deactivateServer();
328 int res = pressAccelKey();
329 sleep(1000);
330 if (checkEventList(res, SYSTEM_EVENT_MASK | KeyPress) != -1) {
331 throw new RuntimeException("Accelerator has been activated in inactive embedder");
332 }
333 }
334
335 public void test6_2_3() {
336 embedCompletely();
337 grabKey();
338 focusServer();
339 deactivateServer();
340 ungrabKey();
341 int res = pressAccelKey();
342 sleep(1000);
343 if (checkEventList(res, SYSTEM_EVENT_MASK | KeyPress) != -1) {
344 throw new RuntimeException("Accelerator has been activated after unregistering");
345 }
346 }
347
348 public void test6_2_4() {
349 embedCompletely();
350 grabKey();
351 requestFocus();
352 int res = pressAccelKey();
353 sleep(1000);
354 int pos = checkEventList(res, SYSTEM_EVENT_MASK | KeyPress);
355 if (pos != -1) {
356 pos = checkEventList(pos+1, SYSTEM_EVENT_MASK | KeyPress);
357 if (pos != -1) { // Second event
358 throw new RuntimeException("Accelerator has been activated in focused client");
359 }
360 }
361 }
362
363 public void test7_1() {
364 embedCompletely();
365 int res = showModalDialog();
366 waitForEvent(res, XEmbedHelper.XEMBED_MODALITY_ON);
367 }
368
369 public void test7_2() {
370 embedCompletely();
371 int res = showModalDialog();
372 waitForEvent(res, XEmbedHelper.XEMBED_MODALITY_ON);
373 res = hideModalDialog();
374 waitForEvent(res, XEmbedHelper.XEMBED_MODALITY_OFF);
375 }
376
377 public void test9_1() {
378 embedCompletely();
379 requestFocus();
380 int res = pressAccelKey();
381 waitForEvent(res, SYSTEM_EVENT_MASK | KeyPress);
382 }
383
384 private int embed() {
385 int res = getEventPos();
386 XToolkit.awtLock();
387 try {
388 XCreateWindowParams params =
389 new XCreateWindowParams(new Object[] {
390 XBaseWindow.PARENT_WINDOW, Long.valueOf(reparent?XToolkit.getDefaultRootWindow():parent),
391 XBaseWindow.BOUNDS, initialBounds,
392 XBaseWindow.EMBEDDED, Boolean.TRUE,
393 XBaseWindow.VISIBLE, Boolean.valueOf(mapped == XEmbedHelper.XEMBED_MAPPED),
394 XBaseWindow.EVENT_MASK, Long.valueOf(VisibilityChangeMask | StructureNotifyMask |
395 SubstructureNotifyMask | KeyPressMask)});
396 window = new XBaseWindow(params);
397
398 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
399 xembedLog.finer("Created tester window: " + window);
400 }
401
402 XToolkit.addEventDispatcher(window.getWindow(), this);
403 updateEmbedInfo();
404 if (reparent) {
405 xembedLog.finer("Reparenting to embedder");
406 XlibWrapper.XReparentWindow(XToolkit.getDisplay(), window.getWindow(), parent, 0, 0);
407 }
408 } finally {
409 XToolkit.awtUnlock();
410 }
411 return res;
412 }
413
414 private void updateEmbedInfo() {
415 long[] info = new long[] { my_version, mapped };
416 long data = Native.card32ToData(info);
417 try {
418 XEmbedHelper.XEmbedInfo.setAtomData(window.getWindow(), data, info.length);
419 } finally {
420 XEmbedHelper.unsafe.freeMemory(data);
421 }
422 }
423
424 private int getEventPos() {
425 synchronized(EVENT_LOCK) {
426 return events.size();
427 }
428 }
429
430 private int embedCompletely() {
431 xembedLog.fine("Embedding completely");
432 int res = getEventPos();
433 embed();
434 waitEmbeddedNotify(res);
435 return res;
436 }
437 private int requestFocus() {
438 xembedLog.fine("Requesting focus");
439 int res = getEventPos();
440 sendMessage(XEmbedHelper.XEMBED_REQUEST_FOCUS);
441 waitFocusGained(res);
442 return res;
443 }
444 private int requestFocusNoWait() {
445 xembedLog.fine("Requesting focus without wait");
446 int res = getEventPos();
447 sendMessage(XEmbedHelper.XEMBED_REQUEST_FOCUS);
448 return res;
449 }
450 private int activateServer(int prev) {
451 int res = activateServerNoWait(prev);
452 waitWindowActivated(res);
453 return res;
454 }
455 private int activateServerNoWait(int prev) {
456 xembedLog.fine("Activating server");
457 int res = getEventPos();
458 if (checkEventList(prev, XEmbedHelper.XEMBED_WINDOW_ACTIVATE) != -1) {
459 xembedLog.fine("Activation already received");
460 return res;
461 }
462 Point loc = serverBounds[SERVER_BOUNDS].getLocation();
463 loc.x += serverBounds[SERVER_BOUNDS].getWidth()/2;
464 loc.y += 5;
465 robot.mouseMove(loc.x, loc.y);
466 robot.mousePress(InputEvent.BUTTON1_MASK);
467 robot.mouseRelease(InputEvent.BUTTON1_MASK);
468 return res;
469 }
470 private int deactivateServer() {
471 xembedLog.fine("Deactivating server");
472 int res = getEventPos();
473 Point loc = serverBounds[OTHER_FRAME].getLocation();
474 loc.x += serverBounds[OTHER_FRAME].getWidth()/2;
475 loc.y += serverBounds[OTHER_FRAME].getHeight()/2;
476 robot.mouseMove(loc.x, loc.y);
477 robot.mousePress(InputEvent.BUTTON1_MASK);
478 robot.delay(50);
479 robot.mouseRelease(InputEvent.BUTTON1_MASK);
480 waitWindowDeactivated(res);
481 return res;
482 }
483 private int focusServer() {
484 xembedLog.fine("Focusing server");
485 boolean weFocused = focused;
486 int res = getEventPos();
487 Point loc = serverBounds[SERVER_FOCUS].getLocation();
488 loc.x += 5;
489 loc.y += 5;
490 robot.mouseMove(loc.x, loc.y);
491 robot.mousePress(InputEvent.BUTTON1_MASK);
492 robot.delay(50);
493 robot.mouseRelease(InputEvent.BUTTON1_MASK);
494 if (weFocused) {
495 waitFocusLost(res);
496 }
497 return res;
498 }
499 private int focusServerNext() {
500 xembedLog.fine("Focusing next server component");
501 int res = getEventPos();
502 sendMessage(XEmbedHelper.XEMBED_FOCUS_NEXT);
503 waitFocusLost(res);
504 return res;
505 }
506 private int focusServerPrev() {
507 xembedLog.fine("Focusing previous server component");
508 int res = getEventPos();
509 sendMessage(XEmbedHelper.XEMBED_FOCUS_PREV);
510 waitFocusLost(res);
511 return res;
512 }
513
514 private void waitEmbeddedNotify(int pos) {
515 waitForEvent(pos, XEmbedHelper.XEMBED_EMBEDDED_NOTIFY);
516 }
517 private void waitFocusGained(int pos) {
518 waitForEvent(pos, XEmbedHelper.XEMBED_FOCUS_IN);
519 }
520 private void waitFocusLost(int pos) {
521 waitForEvent(pos, XEmbedHelper.XEMBED_FOCUS_OUT);
522 }
523 private void waitWindowActivated(int pos) {
524 waitForEvent(pos, XEmbedHelper.XEMBED_WINDOW_ACTIVATE);
525 }
526 private void waitWindowDeactivated(int pos) {
527 waitForEvent(pos, XEmbedHelper.XEMBED_WINDOW_DEACTIVATE);
528 }
529
530 private void waitSystemEvent(int position, int event) {
531 waitForEvent(position, event | SYSTEM_EVENT_MASK);
532 }
533
534 private void waitForEvent(int position, int event) {
535 synchronized(EVENT_LOCK) {
536 // Check for already received events after the request
537 if (checkEventList(position, event) != -1) {
538 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
539 xembedLog.finer("The event " + XEmbedHelper.msgidToString(event) + " has already been received");
540 }
541 return;
542 }
543
544 if (eventReceived == event) {
545 // Already received
546 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
547 xembedLog.finer("Already received " + XEmbedHelper.msgidToString(event));
548 }
549 return;
550 }
551 eventReceived = -1;
552 eventWaited = event;
553 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
554 xembedLog.finer("Waiting for " + XEmbedHelper.msgidToString(event) + " starting from " + position);
555 }
556 try {
557 EVENT_LOCK.wait(3000);
558 } catch (InterruptedException ie) {
559 xembedLog.warning("Event wait interrupted", ie);
560 }
561 eventWaited = -1;
562 if (checkEventList(position, event) == -1) {
563 dumpReceivedEvents();
564 throw new RuntimeException("Didn't receive event " + XEmbedHelper.msgidToString(event) + " but recevied " + XEmbedHelper.msgidToString(eventReceived));
565 } else {
566 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
567 xembedLog.finer("Successfully recevied " + XEmbedHelper.msgidToString(event));
568 }
569 }
570 }
571 }
572 /**
573 * Checks if the <code>event</code> is already in a list at position >= <code>position</code>
574 */
575 private int checkEventList(int position, int event) {
576 if (position == -1) {
577 return -1;
578 }
579 synchronized(EVENT_LOCK) {
580 for (int i = position; i < events.size(); i++) {
581 if (events.get(i) == event) {
582 return i;
583 }
584 }
585 return -1;
586 }
587 }
588
589 private void checkFocusedServerNext() {
590 if (focusedServerComponent != 0) {
591 throw new RuntimeException("Wrong focused server component, should be 0, but it is " + focusedServerComponent);
592 }
593 }
594 private void checkFocusedServerPrev() {
595 if (focusedServerComponent != 2) {
596 throw new RuntimeException("Wrong focused server component, should be 2, but it is " + focusedServerComponent);
597 }
598 }
599 private void checkFocusGained(int kind) {
600 if (!focused) {
601 throw new RuntimeException("Didn't receive FOCUS_GAINED");
602 }
603 if (focusedKind != kind) {
604 throw new RuntimeException("Kinds don't match, required: " + kind + ", current: " + focusedKind);
605 }
606 }
607 private void checkNotFocused() {
608 if (focused) {
609 throw new RuntimeException("Focused");
610 }
611 }
612 private void checkFocused() {
613 if (!focused) {
614 throw new RuntimeException("Not Focused");
615 }
616 }
617
618 private void checkFocusLost() {
619 checkNotFocused();
620 if (focusedKind != XEmbedHelper.XEMBED_FOCUS_OUT) {
621 throw new RuntimeException("Didn't receive FOCUS_LOST");
622 }
623 }
624 private void checkWindowActivated() {
625 if (!windowActive) {
626 throw new RuntimeException("Window is not active");
627 }
628 }
629 private void checkMapped() {
630 if (XlibUtil.getWindowMapState(window.getWindow()) == IsUnmapped) {
631 throw new RuntimeException("Client is not mapped");
632 }
633 }
634 private void checkNotMapped() {
635 if (XlibUtil.getWindowMapState(window.getWindow()) != IsUnmapped) {
636 throw new RuntimeException("Client is mapped");
637 }
638 }
639
640 private void sendMessage(int message) {
641 xembed.sendMessage(parent, message);
642 }
643 private void sendMessage(int message, int detail, long data1, long data2) {
644 xembed.sendMessage(parent, message, detail, data1, data2);
645 }
646
647 public void dispatchEvent(XEvent ev) {
648 if (ev.get_type() == ClientMessage) {
649 XClientMessageEvent msg = ev.get_xclient();
650 if (msg.get_message_type() == XEmbedHelper.XEmbed.getAtom()) {
651 if (xembedLog.isLoggable(PlatformLogger.Level.FINE)) {
652 xembedLog.fine("Embedded message: " + XEmbedHelper.msgidToString((int)msg.get_data(1)));
653 }
654 switch ((int)msg.get_data(1)) {
655 case XEmbedHelper.XEMBED_EMBEDDED_NOTIFY: // Notification about embedding protocol start
656 xembedActive = true;
657 server_version = (int)msg.get_data(3);
658 break;
659 case XEmbedHelper.XEMBED_WINDOW_ACTIVATE:
660 windowActive = true;
661 break;
662 case XEmbedHelper.XEMBED_WINDOW_DEACTIVATE:
663 windowActive = false;
664 break;
665 case XEmbedHelper.XEMBED_FOCUS_IN: // We got focus!
666 focused = true;
667 focusedKind = (int)msg.get_data(2);
668 break;
669 case XEmbedHelper.XEMBED_FOCUS_OUT:
670 focused = false;
671 focusedKind = XEmbedHelper.XEMBED_FOCUS_OUT;
672 focusedServerComponent = (int)msg.get_data(2);
673 break;
674 }
675 synchronized(EVENT_LOCK) {
676 events.add((int)msg.get_data(1));
677
678 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
679 xembedLog.finer("Tester is waiting for " + XEmbedHelper.msgidToString(eventWaited));
680 }
681 if ((int)msg.get_data(1) == eventWaited) {
682 eventReceived = (int)msg.get_data(1);
683 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
684 xembedLog.finer("Notifying waiting object for event " + System.identityHashCode(EVENT_LOCK));
685 }
686 EVENT_LOCK.notifyAll();
687 }
688 }
689 }
690 } else {
691 synchronized(EVENT_LOCK) {
692 int eventID = ev.get_type() | SYSTEM_EVENT_MASK;
693 events.add(eventID);
694
695 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
696 xembedLog.finer("Tester is waiting for " + XEmbedHelper.msgidToString(eventWaited) + ", but we received " + ev + "(" + XEmbedHelper.msgidToString(eventID) + ")");
697 }
698 if (eventID == eventWaited) {
699 eventReceived = eventID;
700 if (xembedLog.isLoggable(PlatformLogger.Level.FINER)) {
701 xembedLog.finer("Notifying waiting object" + System.identityHashCode(EVENT_LOCK));
702 }
703 EVENT_LOCK.notifyAll();
704 }
705 }
706 }
707 }
708
709 private void sleep(int amount) {
710 try {
711 Thread.sleep(amount);
712 } catch (Exception e) {
713 }
714 }
715
716 private void registerAccelerator() {
717 sendMessage(XEmbedHelper.XEMBED_REGISTER_ACCELERATOR, 1, accel_keysym, accel_mods);
718 }
719
720 private void unregisterAccelerator() {
721 sendMessage(XEmbedHelper.XEMBED_UNREGISTER_ACCELERATOR, 1, 0, 0);
722 }
723
724 private int pressAccelKey() {
725 int res = getEventPos();
726 robot.keyPress(accel_key);
727 robot.keyRelease(accel_key);
728 return res;
729 }
730
731 private void initAccel() {
732 accel_key = KeyEvent.VK_A;
733 accel_keysym = XWindow.getKeySymForAWTKeyCode(accel_key);
734 accel_mods = 0;
735 }
736
737 private void grabKey() {
738 sendMessage(XEmbedHelper.NON_STANDARD_XEMBED_GTK_GRAB_KEY, 0, accel_keysym, accel_mods);
739 }
740 private void ungrabKey() {
741 sendMessage(XEmbedHelper.NON_STANDARD_XEMBED_GTK_UNGRAB_KEY, 0, accel_keysym, accel_mods);
742 }
743 private int showModalDialog() {
744 xembedLog.fine("Showing modal dialog");
745 int res = getEventPos();
746 Point loc = serverBounds[SERVER_MODAL].getLocation();
747 loc.x += 5;
748 loc.y += 5;
749 robot.mouseMove(loc.x, loc.y);
750 robot.mousePress(InputEvent.BUTTON1_MASK);
751 robot.delay(50);
752 robot.mouseRelease(InputEvent.BUTTON1_MASK);
753 return res;
754 }
755 private int hideModalDialog() {
756 xembedLog.fine("Hide modal dialog");
757 int res = getEventPos();
758 // Point loc = serverBounds[MODAL_CLOSE].getLocation();
759 // loc.x += 5;
760 // loc.y += 5;
761 // robot.mouseMove(loc.x, loc.y);
762 // robot.mousePress(InputEvent.BUTTON1_MASK);
763 // robot.delay(50);
764 // robot.mouseRelease(InputEvent.BUTTON1_MASK);
765 robot.keyPress(KeyEvent.VK_SPACE);
766 robot.keyRelease(KeyEvent.VK_SPACE);
767 return res;
768 }
769
770 }
--- EOF ---