=== modified file 'src/com/goldencode/p2j/ui/client/WindowManager.java' --- src/com/goldencode/p2j/ui/client/WindowManager.java 2015-10-16 12:11:54 +0000 +++ src/com/goldencode/p2j/ui/client/WindowManager.java 2015-10-28 14:04:06 +0000 @@ -310,7 +310,7 @@ w.hide(); if (w instanceof Window) { - removeWindow(w.getId().asInt()); + remove(w); } else { === modified file 'src/com/goldencode/p2j/ui/client/driver/swing/SwingKeyboardReader.java' --- src/com/goldencode/p2j/ui/client/driver/swing/SwingKeyboardReader.java 2015-10-22 23:14:19 +0000 +++ src/com/goldencode/p2j/ui/client/driver/swing/SwingKeyboardReader.java 2015-10-29 10:26:29 +0000 @@ -227,7 +227,7 @@ * @param evt * The key event. */ - public synchronized void keyReleased(KeyEvent evt) + public void keyReleased(KeyEvent evt) { } === modified file 'src/com/goldencode/p2j/ui/client/driver/swing/WinKeyboardReader.java' --- src/com/goldencode/p2j/ui/client/driver/swing/WinKeyboardReader.java 2015-10-14 13:31:31 +0000 +++ src/com/goldencode/p2j/ui/client/driver/swing/WinKeyboardReader.java 2015-10-30 17:42:28 +0000 @@ -76,7 +76,7 @@ * @param evt * The high level key event to process. */ - public synchronized void keyPressed(KeyEvent evt) + public void keyPressed(KeyEvent evt) { KeyEvent last; @@ -167,7 +167,7 @@ * @param evt * The high level key event to process. */ - public synchronized void keyTyped(KeyEvent evt) + public void keyTyped(KeyEvent evt) { if (evt.isConsumed()) { @@ -282,7 +282,13 @@ } if (code != -1) { - queue.add(new Integer(code)); + try + { + queue.put(new Integer(code)); + } + catch (InterruptedException e) + { + } } } @@ -297,7 +303,7 @@ * @param evt * The key release event. */ - public synchronized void keyReleased(KeyEvent evt) + public void keyReleased(KeyEvent evt) { int code = -1; int key = evt.getKeyCode(); @@ -346,7 +352,13 @@ } if (code != -1) { - queue.add(new Integer(code)); + try + { + queue.put(new Integer(code)); + } + catch (InterruptedException e) + { + } } } @@ -366,7 +378,13 @@ if (Keyboard.keyLabel(code).length() == 0) { code = -1; - queue.add(code); + try + { + queue.put(code); + } + catch (InterruptedException e) + { + } } return code; === modified file 'src/com/goldencode/p2j/ui/client/gui/driver/swing/SwingEmulatedWindow.java' --- src/com/goldencode/p2j/ui/client/gui/driver/swing/SwingEmulatedWindow.java 2015-10-24 19:51:34 +0000 +++ src/com/goldencode/p2j/ui/client/gui/driver/swing/SwingEmulatedWindow.java 2015-10-30 17:49:32 +0000 @@ -85,6 +85,7 @@ import java.awt.Rectangle; import java.awt.Window; import java.awt.event.*; +import java.awt.event.FocusEvent; import java.awt.event.WindowEvent; import java.awt.font.*; import java.awt.geom.*; @@ -267,7 +268,10 @@ if (toOS) { // if focus is lost to a non-4GL window, the titlebar needs to be aware of this - ThinClient.getInstance().postOSEvent(new WindowActivated(window, false, toOS)); + ThinClient tc = ThinClient.getInstance(); + if (tc != null) { + tc.postOSEvent(new WindowActivated(window, false, toOS)); + } } } } @@ -285,7 +289,11 @@ TopLevelWindow window = (TopLevelWindow) WindowManager.findWindow(windowId); boolean fromOS = (e.getOppositeWindow() == null); - ThinClient.getInstance().postOSEvent(new WindowActivated(window, true, fromOS)); + ThinClient tc = ThinClient.getInstance(); + if (tc != null) + { + ThinClient.getInstance().postOSEvent(new WindowActivated(window, true, fromOS)); + } } } }); @@ -375,37 +383,56 @@ @Override public void quit() { - for (MouseListener l : pane.getMouseListeners()) - { - pane.removeMouseListener(l); - } - for (MouseMotionListener l : pane.getMouseMotionListeners()) - { - pane.removeMouseMotionListener(l); - } - for (MouseWheelListener l : pane.getMouseWheelListeners()) - { - pane.removeMouseWheelListener(l); - } - for (WindowListener l : window.getWindowListeners()) - { - window.removeWindowListener(l); - } - for (WindowFocusListener l : window.getWindowFocusListeners()) - { - window.removeWindowFocusListener(l); - } - for (WindowStateListener l : window.getWindowStateListeners()) - { - window.removeWindowStateListener(l); - } - for (KeyListener l : window.getKeyListeners()) - { - window.removeKeyListener(l); - } - - // cleanup window resources - pane.quit(); + try + { + SwingUtilities.invokeAndWait(new Runnable() + { + + @Override + public void run() + { + for (MouseListener l : pane.getMouseListeners()) + { + pane.removeMouseListener(l); + } + for (MouseMotionListener l : pane.getMouseMotionListeners()) + { + pane.removeMouseMotionListener(l); + } + for (MouseWheelListener l : pane.getMouseWheelListeners()) + { + pane.removeMouseWheelListener(l); + } + for (WindowListener l : window.getWindowListeners()) + { + window.removeWindowListener(l); + } + for (WindowFocusListener l : window.getWindowFocusListeners()) + { + window.removeWindowFocusListener(l); + } + for (WindowStateListener l : window.getWindowStateListeners()) + { + window.removeWindowStateListener(l); + } + for (KeyListener l : window.getKeyListeners()) + { + window.removeKeyListener(l); + } + + // cleanup window resources + pane.quit(); + } + }); + } + catch (InvocationTargetException e) + { + e.printStackTrace(); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } } /** @@ -433,7 +460,28 @@ { window.pack(); window.setVisible(visible); - } + + /** To work around if the current active window is null to get the keys input for it */ + if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow() == null + || KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow() == null + || KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == null) + { + SwingUtilities.invokeLater(new Runnable() + { + + @Override + public void run() + { + Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent( + new WindowEvent(window, WindowEvent.WINDOW_ACTIVATED)); + Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent( + new FocusEvent(window, FocusEvent.FOCUS_GAINED)); + window.requestFocus(); + } + + }); + } + } }); } @@ -593,6 +641,24 @@ @Override public void enableEvents(boolean capture) { + SwingUtilities.invokeLater(new Runnable(){ + + @Override + public void run() + { + enableListeners(capture); + } + }); + } + + /** + * Attaches or detaches the window listeners depending on the input capture flag. + * + * @param capture + * True indicates the mouses and keys listeners are attached to this window. + */ + private void enableListeners(boolean capture) + { if (capture) { if (savedListeners == null)