From a7c357a67f5eb45701a2cb5cbfca21de86b9ea64 Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Sun, 8 Dec 2013 14:43:17 -0500 Subject: [PATCH] added support for *almost* every key --- limelight-pc/libs/limelight-common.jar | Bin 169831 -> 169930 bytes limelight-pc/src/com/limelight/Limelight.java | 8 +++-- .../src/com/limelight/gui/StreamFrame.java | 2 ++ .../com/limelight/input/KeyboardHandler.java | 33 ++++++++++++++++-- .../limelight/input/KeyboardTranslator.java | 20 ++++++++--- .../src/com/limelight/input/MouseHandler.java | 3 -- 6 files changed, 55 insertions(+), 11 deletions(-) diff --git a/limelight-pc/libs/limelight-common.jar b/limelight-pc/libs/limelight-common.jar index 5490a5f11c6e23cda0319ef8f794a6e62c4c8061..88527702c3b660e1cc3e23f206e621e94e52ab57 100644 GIT binary patch delta 8992 zcmZ9RbwE^2+y8OtlI~7Hx*G{WQhJw0V(E~SUb=gMC6hRv5gVW93r4nC;~P46M%no zT?Jy|-$b1hO60%v8M@a0CScUz0Mt4tCJy31g&=~Q=Juwpu7%n^-V$iwK0N2(Oh(qv ztt3=WrauC*YIiH+H6Rn((B*~n%N+)D{`Ev^O-UKU9d*pJ6Gt@1=jPP*~0qX&alo5WAQBwzxE0nFLh*AyVlcl z;;qIAbSI+d*(XhG{hX`h-dh#f6eJc>$IQN7$!DP{@k|FJ^ny;d+WPx7EsGZs1`4B4 zo*6FPP`@^objp%DQLnlz8f~5#k``8AvKxek13mhrkzD7P((QnXZ9dGA`XDaB1w@t% z`&>P)Y&oRU8WJ#7E7KfX5F`@TLcOFty7{~}z>##x9m*H$ zmHXceOU#-mgPqV>Usn~?u^^5gI_g8hY}$~3J1dDs`6&y`1jW_|RU<~DlS`<37YwA& zN461q%v}V0m7>?DOcf{ISRv(GP%$494c)&c&@YOO5L_N;7MzmTjz(FGu*>20I=)qz z65G1f)U(Ir>nrVpzHnSC`jpeJEp*_6WfXX|mOo(Oe<)yPkBSZq8W`5K^zlcjd9EZBjI`kyM?#ndL5SOG?sneEcKT!25TgmNui*qjU;yjuQRKt`4e4<>b3#Z0dgL>r z@bq{K3ts3qUjiw+N+k!o_+KSe&D3CrexO01AbLb?V_Sdaa%IDErIF8kuX)>1_Ogdj z<>8}O7Z+5Kw|nh)2bO;2pZ)0CIVQ%{etV&apmQLJNQN;2n1DPCzb{$E2=~4{9RBid zDNgU~lW%uJ>bZ7w=*G1<-NDOM-+@+;2iSvpuzjDTfME&igy- zR*0-l~J7$kVE%v|XS_pwCzh$lvjeap`jx~+9u zqP#p9%qNo=7y^;-uJA20_l6;=$At@2lLhDH5>ZKr73w~8D|OV=+S#|kFJA=Z*<{U9 zu-OeXp4a2W2!!2tI3v$gaD({vs_CWKX7}TN=@X2u=|&8Go1yqoDU~dib#In*uy304 z{_RCoO)Op+Je!o2&@w##8KilI91FQZ5Ykn+)^O{|I0vDQ4I@&bV#W7hF;t{L#ji;t zs$mm@8jxS=2Zm4)X~IZuTQkLeWO%sEPB-!s5-2+3E1t3>ZMYc&59{tbEV62{hDSTu z3DM^%2yK;_ea`f59BoK~KgPX0rzhxVj(XoIW2tBZ;w0qcP7Jl*Ps!j;FwccUr;-JK z>`Z+#;e@=b8U7rK5j{o2G+jwJ_?ievpz5a@ueRRKT7TeZY_&!onpE$jFO#?otWE_k zs`}Y0>Y^((q4XOkujAvLYKHD4?d-&!bkpCT3Ag^Bl&j>^i0Ho{tZiJtzZdHt{1C?B z?0lNV31Me6|1fEO6-r9Ht2U_Vmf=duUilD^sRW^9<9n;5GzI2y>RkyCpnb84azI4P zIF%UR%pultD94b2Wmu}7urz5o@AI){`77RH)X^C#JHgjE1t1c)bL2IqlBQ7?UD95Y znSZPoivGA|t`6O+BNT$niEnrKHJ1z6rsX-_Su6>eI7r}dbQ;?wfkUWuh0 zIU$HQmZ1RWcd;_=8tlc=xaOny`P1Ws#SXBOcpJVMZKNEpPfuO83fM`1m8j)FPiQHBYDN;}`d(rv z8)7{qZZ!spC_{x(0c^Q`vh=2CP zYIl-f(=n%Fo_~d54n_5_+c@bQ2a6k-_o!HFp@0=6s=9$f=bSHNs<@mkv|_Q*Yc@wI zCVDW_Lg&n>sHVM6xY7@&Zt6+y#t1YUTc56$&?6d9c7$q^>OVxTj1K@biKw z<+gXqxKzeRZ~7tT*R(TBd>Q!`U>&UR*^PQ``G98J0?Rk~0k`PdL8dX zd9HgeTfx8$$H>*NJ~C`p@t|d}&wliD!}zW=@K%=w-cRJT;jeh5_mDM_#?eR3%|qg4 zEY8wLEy_@%DAWmu^z~t-8B->oL#iO^;#v4_p8K!#sf?a&@Q6FE;htpLkccpMmVnVh z@|`m_4XI8fGc)aEJC5=KvLZA()OZ)=%{x+jZhH|U-#5Fw*V)#&U-$4>ysv2{Qnr*s zG%+o)kkhbR|w13&z7LLoLJ?K=^-lpC215+$o;K;B=9?<&3T!;=WyTowH<0+{Gwuo zNXZnqj=k&M#^N=Fd@y_TS6dVaip8?lO>ilRl+gCtjC;q8bxkQMPs` z?dPOjmwFgshk()?wR*IIe(wTyNic-&Og@XqZi_Vq)7BW#cRs_hpEUX76asrP<3D*#yYU`Uo z(o5;P@W|B&=LF`WRcNP1 zGQC`6tsvcTDyP)iR?6W1So4l$181a&jJY!;0Q6P64qHGu&lm z`4iciz=$S`2n6Mq6M_70+O-d_8JEeO?$u5-cwVdoL#098{;(h#5=)mkU$@Ma;$|pF zoN=9%Yxpq=%Y9{UCeKL3%RTJ?QO5KVfgr!~4UM-?{)~2|55&L;>a7!s? zLJFC8;RFqafpj{TfKIx4CWS)m9H||hrQTKSh9nWF3kPum<@7aet}tCPWULdmRS$h@csIvlLt*|nv$04|9hkf4P(RpfD6PHJ&ol(YoUU-wR)c)N@}*Ed}p6M~(^KKI^(Tr0*jpfASBALuoampNph zfqZnzH|l(kkzN|0V$JZVlH0Z0Mvspx3}C#@O7*%)y|%UUlYHa6JjLjh2y!o_)}WNl zbIFLJ0Qb% zgU7XfEWoqPDKGUFtjZ`XSer_VDp$U1*Of|JzOpFGgz!i2G+tI_nTI$E&b+Z$S=6j+ zsI0Piqw3S9vT9qlcyU>^^BaXEG4GnzK$sZnpkYEk{++b8r#noSot*EpVb13F$Xd@7 ze^)iOgQ=`8rLue$ zSY*%%av#|(cDzZO(U~0 zAlxmC8dWzK#LHKw{!S52eCV{QzI%ACql&8_F$(3D5w z%%L05>Y4^KQiC(m@CkPW=37vX3{Xz_=A64_TQn5)Z5RAO;b%uYVT@Rhg9s5vIQI*8 z$Zk2MMQQK0p<|_RXc57jT;W9n80hodbUUg&VOP)M(gL{U1ElG7T;=h7Pa1jbtJbfm z_7l$&G^!^S*oM@XhWt-Xt-8lDY zdjU|@nhN&S_m6nL_M{NK=N7-UNZQMgLO3Em65Upl(MXFq_7nRiyM8cdJC-Fm-aQVl zj>Ty|x~8w%VYnpk4E)spp$3u5_0ILM??-h#vY2(D{T)CEnxuQ@z9i$_-m@pwR0EUl z%`@@cu&4Kh<=WCebdpA0oAh z&zJdlV>#QFX0@h;;!%ppyJE&z&E0!bHRhka)t^E>(urdGi*MQfL=yQEfA2MWCgQif z&)g3&Uwgmpt(*GBea$cCHpnpb%~Qc%*KpobaR^G;LNrwC?u}{i7xhd|hsVW;t|aI1Ycw^w{y z&&oCe39E<{tGX0>8+y0(UspkJid^oG&>p~OsFXCfSBh|Iy5cdORce)W?c}YCHh#F^ zfn;?6oO%i_|1;;}?V#499e((rb+hcn_@I_ByMl|S9Y1h7{#OT}-4p9^xo+0gMRw=6 zEGg$tLSTah&?=IDdywdgQY-t+6kKtKe-(Cv=Np`fBqVNQ?eZ?mLo~r%XyY#>dgYP1{iYA6WdHu`|DQdGod*5@;%FQi-F;gJj=?NuNF+YVuFqNBS>1Uop1TgY zfBBbBQFpWNSRHu1kK(t@E~h;}nIqFP2jmXR-~;_jUU#SPg_5IM6{A7p)Z?4^k=c%{ zL$cBm#Fu*?S4NOUnytlcmGh}JI&8*g@f;*31Se|^G=m&9@Q>)-JEA=j7mhv}74(oF zu|$c8oMGlp(E6KGC5Vq)Jrm=~;0 z`0?(CxpQOikvkgQ=x=-cEO15|Re@UcfL0ltG{biWxiKfVw1w==r&cdW53L5adB4)Ss(t%7qXI`K)CA7FAK8t0`uij zS^K0TAu98_eVUt1FE==@GOi%SKSfKb!7E~HoNd51Jv7~$Q#qunD5^6^CM6M!q@%SL zBg?}}%+~f6Xh~JErzxQr5>VA8BeK&2)jPfT;{4d*KZ#XG++Yf5rKi^yoWUjq$aJP~b0nc5T&1@s9zpBGgS25GZkd~Y z@9CD;Nl~o!bW}#>%935e^7mWl*Du*TjJb{v;#e=jCQhg`t+48bABB@hPd^;7PpooZ z1koPhsGbZ4r**?)^uhuO?hWJhi>P8jMhwOf5pjOXIF_AKtqxsAa!zR+Es9~H#G1FQ zEI1bIxZBFd^;)>@l0C9v@5EdD6Xx_)Ij2mGKo1lo1a6W$*GM_MhILf&R*Y^sTZ_8f z>@L1x2zezxb=n{&^WE1thB zpUz9LjiKS3QP_RE_Zu})R$4wA_`?JS3E1U+uVClOnJTC{DOH{i#1e3gAt19nA2yQT z6_(S0Cvj_p_NyC6hNjJG*qeAkHO@ubCn5uCh3%6glR-5K(QKi8VJO3~gM&>p#rMpj z%Vo+%$;OwnDk#exxwas9dyQpO14VPYhARLM>UOYl9zxL^hG0|csWdL_ZS^#56jU!f1$&{4({Y&{&@-)tqw}XBKGIy&?$S1Rhm0zG|aWw^DSt7Z^ zHea8>R0$d66hL1+K0c`5gI{&hgbx;L_K1n!z5Al)nJ^QBjk z6vah&{ze5lCNB3FEVkA z@C_K#EG;!qwc@@-;r<&_Iif+5Ls*Q4b*4-e5x0?8Rh3dSVLZtS$Cjqq!1`k>7E zrVrf83zWor97cWO8_nU^-mf(+<_8d4^DsSQ!aalDIQ06@?q%dJ?TO0W#IKL5Og6{z ziL#(`%DMGkkuUOET4>L4BWL@_`kmqYnSkmwW~Wq<5D>ahp?GYRbwQn&7>Hbs5zteu zKhq96EISoI2#HNnb()gG4O>-RYHpO3k!7XfNY+e%)6PV&MaV|I)G63bNV*-+Tj02K z+!mI;*GtJw5&nsItr7A4EfQ)3p&t3z;i&j|&F%U3D;fmj_4Med&&KvsEEAHETC$tnyEoXlPq#zq4k1#fw61|mltc6#ud{Wyzxl^_Kov65J0I&e(k8Ugt=FQ;e6 zo~>gDVYYV0n4UNAk~DJa##=yx(8Atbr4%VAvJFmJ>)4L3wsZM&9PB{bIcm>$;qDc= z%;SeP`Ef7y)xj@Z(yH~#t<2N0EQ&CF{P(u3yxD)cXsjcTtkHJsrsGka9FoL!;a|2L z1;*cc?m;#JKOf@~dzd6Weid4X15w-~5IG$-Z)e zMAYsSnpT^j>_F63QrpcO|Enk;SC8hLmnH~>udHnYPpFL?F0cOi#;>0l_cuR7K;TCF zzen}EPm4>$ungpf<{}XH0SSd5-w=(5b&X#rX(4Pab%~29vW1@?Mav$ZR<8=ad50wP zu~sERQhK%EJ~O@V8$X|4K&Sj_{?rNO{2Wt4AK&Esva3heveVTU$m8v<2||%NX1=m) zk6V*gV*`hMdF^^Je7Wod-CPVTA|~*vpHsaA&xSb<<&ZT41tVi9`Z~6}3JX{IB*m1=^cvdWc zHHZ@jXMy1Q3~)rFwc^e21kjbQ<^T(U2`M$cqa*vye;Bl` zr|Cp4`w-U8KggFe%D@-%1&O1#(H|W0Wr?e3?vz85WIzNvxU!bG)UbEr?~TbHn2mJ8|5H6wnWhp zFcixTH0Us2oiDP=-9#LlW%&Z7yoa^P#yFu5y6nlB_3aeK5^^fln}Ty$demu;M7a7! z-vuJbQK(1dnzkEob4)M-{TlxwyO6;%#Hn}fI!CkwgDO7J^npu!q*z()PEQ~I3{6?I zwl*%?y$!fLK5kNW)A?g`Q9cy0aND}3zcuHoLP^fEzCd6vd(?Z3FcHb^_l;$}tav1zbJ&^xa=~a~0w8j72&G<%9gp|_A9}KzP zKkDYrF}5|eHQLMfFOZG@x&A_7sQtU`Hr3j~ARnUe&=qZi*Fsyfd=fTXDXyz~A9QfY zy*fxZNh=erE@{GQ{vo_=o^0CkHXp6t$QXg zu(Ixw_+uaHhuw$zdv%tF^J|`{rXqxO+W8l@VY3Y$)aeAum0V z`NX}hkrI?%NgdLDE+&%>I&e$#$^p9{z2uq{9Jq#wnjL&iyGnjTauD($B@^)&K#yWEqM^VUTYc?eTTPQR&12yB5vegfCCbg7Iy-9GawdIFKS-wCj zNp06|Mg7HDegssr#*OP7d>2Kdn78XWSL@z;ARXW^TPpJ3m5RxE*B)+KZM!c*{w{eg z9A((Og627|>fkNbtyCZ!bLmQ*g+{JW@rFf^#a*MZ`i8n%HHqn04T7igb1B3{_vUbh zu?@mUOnEQVH`Amnj}lv?PHF*^y<=Z32iHn1?MljYA0U6`xIL4_=C-GGED}9pF81~{-lO~c7x>QR8_u)_!d z58y4^zrZsNKms$01dszhaQ;hkBcHPA^ZWw{V2_aiK|rj~KR_AaBl?fVhV@20c{x`6 z3!X;!+*dVK%dz^8WV;a_hh89{4anCduk64pxoyFqw{|#w&VXt zMdP0+mdk%p6j(<5Q)|M#|Dhc(O_BJd1HzxQ z0IWC?fD3~r{&}U*Pk;lql=xKR=TvB3Djy6p>dB~)^kfvzcrwz%;*$V;0K2Rw{Q~wQ z2_O#WDfp|^p@3Ha-Xd5c6z~pUSNg=rU|7jdFLb5+kA}{bMV*~+#>%Vfp82OvKdYBZ3 X1AFQauf}0wFaR@3Xy{XfAL0K2Q9|W_ delta 8880 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 Q@(lu@fu{(4&BsIiAF#@I2><{9 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(); } }