src/solaris/classes/sun/awt/X11/XEmbedServerTester.java

Print this page




  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.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.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() {


 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.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);


 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.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.FINER)) {
 547                     xembedLog.finer("Already received " + XEmbedHelper.msgidToString(event));
 548                 }
 549                 return;
 550             }
 551             eventReceived = -1;
 552             eventWaited = event;
 553             if (xembedLog.isLoggable(PlatformLogger.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.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         }


 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() == xembed.XEmbed.getAtom()) {
 651                 if (xembedLog.isLoggable(PlatformLogger.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.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.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 = (int)ev.get_type() | SYSTEM_EVENT_MASK;
 693                 events.add(eventID);
 694 
 695                 if (xembedLog.isLoggable(PlatformLogger.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.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() {




  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() {


 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);


 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         }


 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() == xembed.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 = (int)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() {