diff --git a/limelight-pc/src/com/limelight/Limelight.java b/limelight-pc/src/com/limelight/Limelight.java index da37547..187bc85 100644 --- a/limelight-pc/src/com/limelight/Limelight.java +++ b/limelight-pc/src/com/limelight/Limelight.java @@ -15,6 +15,7 @@ public class Limelight implements NvConnectionListener { private String host; private StreamFrame streamFrame; private NvConnection conn; + private boolean connectionFailed; public Limelight(String host) { this.host = host; @@ -80,8 +81,11 @@ public class Limelight implements NvConnectionListener { @Override public void connectionTerminated(Exception e) { e.printStackTrace(); - JOptionPane.showMessageDialog(streamFrame, "The connection failed unexpectedly", "Connection Terminated", JOptionPane.ERROR_MESSAGE); - conn.stop(); + if (!connectionFailed) { + connectionFailed = true; + JOptionPane.showMessageDialog(streamFrame, "The connection failed unexpectedly", "Connection Terminated", JOptionPane.ERROR_MESSAGE); + conn.stop(); + } } @Override diff --git a/limelight-pc/src/com/limelight/gui/StreamFrame.java b/limelight-pc/src/com/limelight/gui/StreamFrame.java index 991059f..277c71f 100644 --- a/limelight-pc/src/com/limelight/gui/StreamFrame.java +++ b/limelight-pc/src/com/limelight/gui/StreamFrame.java @@ -26,6 +26,8 @@ public class StreamFrame extends JFrame { this.addMouseListener(mouse); this.addMouseMotionListener(mouse); + this.setFocusTraversalKeysEnabled(false); + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); this.setSize(1280,720); //This might break if the screen res is too small...not sure though diff --git a/limelight-pc/src/com/limelight/input/KeyboardHandler.java b/limelight-pc/src/com/limelight/input/KeyboardHandler.java index 6a900b3..9c84dc6 100644 --- a/limelight-pc/src/com/limelight/input/KeyboardHandler.java +++ b/limelight-pc/src/com/limelight/input/KeyboardHandler.java @@ -4,6 +4,7 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import com.limelight.nvstream.NvConnection; +import com.limelight.nvstream.input.KeyboardPacket; public class KeyboardHandler implements KeyListener { @@ -16,13 +17,41 @@ public class KeyboardHandler implements KeyListener { @Override public void keyPressed(KeyEvent event) { short keyMap = translator.translate(event.getKeyCode()); - translator.sendKeyDown(keyMap); + + byte modifier = 0x0; + + int modifiers = event.getModifiersEx(); + if ((modifiers & KeyEvent.SHIFT_DOWN_MASK) != 0) { + modifier |= KeyboardPacket.MODIFIER_SHIFT; + } + if ((modifiers & KeyEvent.CTRL_DOWN_MASK) != 0) { + modifier |= KeyboardPacket.MODIFIER_CTRL; + } + if ((modifiers & KeyEvent.ALT_DOWN_MASK) != 0) { + modifier |= KeyboardPacket.MODIFIER_ALT; + } + + translator.sendKeyDown(keyMap, modifier); } @Override public void keyReleased(KeyEvent event) { short keyMap = translator.translate(event.getKeyCode()); - translator.sendKeyUp(keyMap); + + byte modifier = 0x0; + + int modifiers = event.getModifiersEx(); + if ((modifiers & KeyEvent.SHIFT_DOWN_MASK) != 0) { + modifier |= KeyboardPacket.MODIFIER_SHIFT; + } + if ((modifiers & KeyEvent.CTRL_DOWN_MASK) != 0) { + modifier |= KeyboardPacket.MODIFIER_CTRL; + } + if ((modifiers & KeyEvent.ALT_DOWN_MASK) != 0) { + modifier |= KeyboardPacket.MODIFIER_ALT; + } + + translator.sendKeyUp(keyMap, modifier); } @Override diff --git a/limelight-pc/src/com/limelight/input/KeyboardTranslator.java b/limelight-pc/src/com/limelight/input/KeyboardTranslator.java index 4677cd5..8b63a29 100644 --- a/limelight-pc/src/com/limelight/input/KeyboardTranslator.java +++ b/limelight-pc/src/com/limelight/input/KeyboardTranslator.java @@ -7,7 +7,7 @@ import com.limelight.nvstream.input.KeycodeTranslator; public class KeyboardTranslator extends KeycodeTranslator { - public static final short KEYCODE_A = (short) 0x8041; + public static final short KEY_PREFIX = (short) 0x80; public KeyboardTranslator(NvConnection conn) { super(conn); @@ -15,10 +15,22 @@ public class KeyboardTranslator extends KeycodeTranslator { @Override public short translate(int keycode) { - if (keycode >= KeyEvent.VK_A && keycode <= KeyEvent.VK_Z) { - return (short) (KEYCODE_A + (short)(keycode - KeyEvent.VK_A)); + // change newline to carriage return + if (keycode == KeyEvent.VK_ENTER) { + keycode = 0x0d; } - return 0; + + // period maps to delete by default so we remap it + if (keycode == KeyEvent.VK_PERIOD) { + keycode = 0xbe; + } + + // Nvidia maps period to delete + if (keycode == KeyEvent.VK_DELETE) { + keycode = KeyEvent.VK_PERIOD; + } + + return (short) ((KEY_PREFIX << 8) | keycode); } } diff --git a/limelight-pc/src/com/limelight/input/MouseHandler.java b/limelight-pc/src/com/limelight/input/MouseHandler.java index a652937..d7a3694 100644 --- a/limelight-pc/src/com/limelight/input/MouseHandler.java +++ b/limelight-pc/src/com/limelight/input/MouseHandler.java @@ -51,13 +51,11 @@ public class MouseHandler implements MouseListener, MouseMotionListener { @Override public void mousePressed(MouseEvent e) { conn.sendMouseButtonDown(); - e.consume(); } @Override public void mouseReleased(MouseEvent e) { conn.sendMouseButtonUp(); - e.consume(); } @Override @@ -72,7 +70,6 @@ public class MouseHandler implements MouseListener, MouseMotionListener { conn.sendMouseMove((short)(x - lastX), (short)(y - lastY)); lastX = x; lastY = y; - e.consume(); } }