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