From e3a42db0072e327f2da8358ecadba106890af4f3 Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Sat, 17 Oct 2015 03:02:55 -0700 Subject: [PATCH] On-screen controls revamp - controls are bigger - dead zone around buttons to avoid accidental mouse clicks and movement - finished implementing control setup for AutoGCGamepad - swiping to close stream requires swipe to 1/4 the screen width - no longer send mouse movement if delta is too small --- .../AButton.imageset/Contents.json | 11 +- .../AButton.imageset/a_button_40x40@1x.png | Bin 2255 -> 0 bytes .../BButton.imageset/Contents.json | 11 +- .../BButton.imageset/b_button_40x40@1x.png | Bin 2181 -> 0 bytes .../DownButton.imageset/Contents.json | 11 +- .../DownButton.imageset/down_31x38@1x.png | Bin 1245 -> 0 bytes .../LeftButton.imageset/Contents.json | 11 +- .../LeftButton.imageset/left_38x31@1x.png | Bin 1267 -> 0 bytes .../RightButton.imageset/Contents.json | 11 +- .../RightButton.imageset/right_38x31@1x.png | Bin 1238 -> 0 bytes .../UpButton.imageset/Contents.json | 11 +- .../UpButton.imageset/up_31x39@1x.png | Bin 1319 -> 0 bytes .../XButton.imageset/Contents.json | 11 +- .../XButton.imageset/x_button_40x40@1x.png | Bin 2365 -> 0 bytes .../YButton.imageset/Contents.json | 11 +- .../YButton.imageset/y_button_40x40@1x.png | Bin 2200 -> 0 bytes Limelight/Input/OnScreenControls.m | 222 +++++++++++++++--- Limelight/Input/StreamView.m | 27 ++- Moonlight.xcodeproj/project.pbxproj | 2 +- 19 files changed, 244 insertions(+), 95 deletions(-) delete mode 100644 Limelight/Images.xcassets/AButton.imageset/a_button_40x40@1x.png delete mode 100644 Limelight/Images.xcassets/BButton.imageset/b_button_40x40@1x.png delete mode 100644 Limelight/Images.xcassets/DownButton.imageset/down_31x38@1x.png delete mode 100644 Limelight/Images.xcassets/LeftButton.imageset/left_38x31@1x.png delete mode 100644 Limelight/Images.xcassets/RightButton.imageset/right_38x31@1x.png delete mode 100644 Limelight/Images.xcassets/UpButton.imageset/up_31x39@1x.png delete mode 100644 Limelight/Images.xcassets/XButton.imageset/x_button_40x40@1x.png delete mode 100644 Limelight/Images.xcassets/YButton.imageset/y_button_40x40@1x.png diff --git a/Limelight/Images.xcassets/AButton.imageset/Contents.json b/Limelight/Images.xcassets/AButton.imageset/Contents.json index a899ed20..b4d9c345 100644 --- a/Limelight/Images.xcassets/AButton.imageset/Contents.json +++ b/Limelight/Images.xcassets/AButton.imageset/Contents.json @@ -2,18 +2,17 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "a_button_40x40@1x.png" + "filename" : "a_button_80x80@2x.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "a_button_80x80@2x.png" + "filename" : "a_button_120x120@3x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "a_button_120x120@3x.png" + "scale" : "3x" } ], "info" : { diff --git a/Limelight/Images.xcassets/AButton.imageset/a_button_40x40@1x.png b/Limelight/Images.xcassets/AButton.imageset/a_button_40x40@1x.png deleted file mode 100644 index d76d68b32ec90d61ca532e01a83c4646f41fbb9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2255 zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2yH7>k44ofy`glX=O&z`$AH z5n0T@z%2~Ij105pNH8!kMrMXYltlRYSS9D@>LsS+C#C9DPTV5^T1{ zi>z;Me*R|fx2XGZ+4s*G#+;j!*m*Rhtfb_Li_*l}yzSNk-A7NY)H3B!o}9BSIDNwP z%6ZFc+~!3_L{yj<8g9&cd2`YERo+oInmnb~dYPw&{O6amk@!%xckQ3G?CT~31q3o2 zYEqv0>&^cul2=y#XL~AielgFRcMl#skSX;lyt`g*`~Q7>0lCZE89t|{rO7?sDW@En zBH0sg%ywJs*3(lj%xmnKF2mD)c)#(5eT|Kctn+f&g2NZd?KX_ud-LIih0gMoHuL-q zrm;^sq}IRkzF)0y>CN+ojFaz7iJY>!;h&9(Ny%-Y3Hx#<$nE~V?2=f?_U+s2`R3S& zyS`*w$~#SK&XwD>Pj3n|NWRF^(%09YHFvJ;bY5?_O&_OlWE_@k=a+xy=Ez-~dv(&a znwx7`7Ay9*UD$6gz!7rh%o!Vpoi;mCKg?##wGc0ezwnWP>zc@^4?Rq?+vqA4rmC*UpoTl5V^JK3koN8I4b|>zTZQ~O&hf2-1=d(WENiX5}v}d;B z-HGS21OhmAZ=E`I>gS4}+Y?TvwCmrxcI}z-1C@q_=9$&uZ#U_(ZA>^EV^XMpv7+ag zlGLFmJG$?S`Uvgaw32tfhfdk^Tmr7OS`(d zvOQnRylkz~H1@qomk-J=u$;p;=b3bM*pk(&S1(w%Ze48Jr_Z1Nrk|UWDJ3Zx`Tb{2 z=FW>r7rXd891ZK0g63rj9oSp_y(#_tyxfF)Kc78&rWPQVmz(=nAU5*!>C+cWoO2CD zxi<(b^~@Jq&phqn)vKXjKbx7F&eVQ)YO3~MZ*T9-tgNj6PEXelkKbQcYpbuX|1`7N z@2vAnJ&^<}u9(QkNVod>`WJ^@@ZP#TEpkBe#CFtw{PFEnwo>#9z0yCF>CVV$=>JEQ@QI3 za&vXn^o{%73zpwAzRJpp^S65cbo%(ER zYkPm?z4za*&$BK+cmMiz@kgpBFFv^H@9C3t`ALOV)TYG(+#enuZWm18varp%(Q(*3 z@6HA5)`L!*+qZ1lp&z@;c6-jKA>=Es!>Y_Z4Z{0j0)Y58+( zNkD3PdiK3k!FxBhW?ygGx^*j8zR%~$myc{sKQG5$eBRpLUVdNw|9zY@ygC{`7=6p< zjTH;{BYJr`!}P4fWjvOamXb$}_4rE7pBL67G+o*Act`ieG=}UYOzQ6sF0rh=*J4@p z#6x_l=Kl5o?9le#A(fD3s#HRzhCan^_JUF`ubYv?@wkvt#+A9wj`=DZ)Rkj z=GWxR9e%%{?P|OO+mg#6eGco-OZ9zc(!6n2<#v)l_lygF|9d*^sb88nwIJhk;g&_^ z!hU9{(L6~TOK<<4UtLvI)%)1a&NYIzF&aWu8+L8?o>3+ zNz2!E+0m9$-|hJBu3AoJ;**U<`IGAo&JtTM>3X|a$spV$|64tiTQiop}jo}5$lH?`Ln)xX(ZlJjv+==3YiWwWg$?)+Zn?d5f>;f#Bs zWa-VGnCSs;BcHiUn{!ulp~>MDR=+YrU&-1y$u0cPuhZfA%EwwrG2h!-^PY~zQK_B# zq^~ht^;&nhpj(6exx9jIJteUQy-ZyFb zk|e!VrateqB(^^Cp0Kgs_jXs_EAA(epW;vW37$(`UD$26+j-L`d;Uzopr0IvWBe*gdg diff --git a/Limelight/Images.xcassets/BButton.imageset/Contents.json b/Limelight/Images.xcassets/BButton.imageset/Contents.json index e448a939..64de99cc 100644 --- a/Limelight/Images.xcassets/BButton.imageset/Contents.json +++ b/Limelight/Images.xcassets/BButton.imageset/Contents.json @@ -2,18 +2,17 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "b_button_40x40@1x.png" + "filename" : "b_button_80x80@2x.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "b_button_80x80@2x.png" + "filename" : "b_button_120x120@3x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "b_button_120x120@3x.png" + "scale" : "3x" } ], "info" : { diff --git a/Limelight/Images.xcassets/BButton.imageset/b_button_40x40@1x.png b/Limelight/Images.xcassets/BButton.imageset/b_button_40x40@1x.png deleted file mode 100644 index 93760fd24d9685b5eac77f1a1b363f263246ff46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2181 zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2yH7>k44ofy`glX=O&z`$AH z5n0T@z%2~Ij105pNH8!kMrMXYltlRYSS9D@>LsS+C#C9Dk|KkWpP{f8hm70y!BQQE7uCaEe$PQtVcpDr(9;Le(~OZ-{w}FMw5Ter(<_Ln<*a)q;Z(`=Y->^pPjOxQgBOCDl@ zyl$Sta<{eKepa2Do*=B!rabWkgY4h6yLVT&rJqjNGO0A@VcE}Rhc+f3k78;(aNJ}X z`;<0cx!}EXU#Vr^e7>WBv+k14B~^#|m#<&%ek$dW&z*AM+Pw);&i^kicDHBto7b(l z%Ps5RodYD5e+hdaUTcM>NHFDPoCh~|f z|2%Nj&q0m(m&7&yk1?OwcEmoq8Q8XrCx!R0Y|0Mzjdz$d^pAeLv%6y5T&~1<<;5Q5 zONzN!w)pMN4-X5oJ3RST8_#6feG$RI!HR72nRfg$+PYUO{C1K6ckT?=$sdGT*NTV* z3Mi_@>C?q&>FL5hS7s$G|7&<)=3a)&+a+JWetlI^QnK|xW?@B>Fwbhe3zsel#l*(; zYCn7S?3aGb4gt2Bty{O6RwpJN)LwG#u!gLj$n4@rM>_o#t}#UxJ$LY$tE;Q~wY;oM z@9w_Z-BVAyMC*uMUb*131J8Nex36C9s{8fjrTwj2w>GiNoU|gFrTbj<+`rdL3))Zg zf0(f8`;zA0Q;!rE6>a*GURYR|my+`2-JLskHa~jwsH?B9PygI}`}oSYx3-q%*ktb3 ziMptG_F2-ujCYk>9TL^gx>j17nU!tdx9^|zgMF1hJ|ybT+84asPxerTslEMu;RP+R z%aRzyF5K8=&MCQ1hr@+YKXuZRxwh5Y<~&>o1Z^_j$>TgGx=ZJQ!j>8sq{n}IT@KZ zLK56+QNh8V`M94puMS_|#?8%rxvYu7R$t(@?b3GvKjiG|Z0=mRP_S{^wr{_s&GSlD z^%#Hs`|aDeJ?j4Rj@&pkWonT__}ngz5AtoEnY#`rNTqgP49J#CGm_`!o!7IWZO^;r zOPAAfZ+y9C>g{GJxl3h<%m(vqIp%46MoZdnrrp!g)U51w4O)2U;lqd4;p<`|4|VT6 zKi~d)NzWnGyOCeNX!gn~O`85I?!`MjKMR>_ySw_=F4?ePL4th!<2g#j-{0SVZ(IH@ z#y>eZS?u#=;W-f(I1hZj@{ld|{GT6_dbadg-zJHrtX2#PBuBMA?)3!6o)GgZg@QZh_1K$$i6h5c*=cVSU z_q3ELugEp*aP`UfS3YS&bjv=P|JzQ?RL}&JNzcm=7+kP+O+TQ@2}6- zzg1+jHbeWHmS*lLP0J(a=FOAaD?R)0VWw3V7>gDyTC|AavDKo#V$K)uvE4Ef5BYX2 zx+Ol-xBGg}B36;c$cuY!_A^K>3Of3_q2ysvqx7TQ56|n}=uYlx?`;q>VtZoyZIhDL z^&Jzo`Mk_yox9yDL!dFzbbbp&t8_sME^%AlhZ-gshZo*&JB%P6#9$7$aJXGx|{ye+3soL=_4O83gVRJBcSa+WT+!n63( zip8Nb7wgT`mBG^NeH_mf2`Lk-hZszjodc6Sx z(O2UcvN+a%HC$5vaSf#4HWzicx~Xj0^gDC9e-;HCf3mJEPFVdQ&MBb@0OKF|4FCWD diff --git a/Limelight/Images.xcassets/DownButton.imageset/Contents.json b/Limelight/Images.xcassets/DownButton.imageset/Contents.json index bd51f199..5297392d 100644 --- a/Limelight/Images.xcassets/DownButton.imageset/Contents.json +++ b/Limelight/Images.xcassets/DownButton.imageset/Contents.json @@ -2,18 +2,17 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "down_31x38@1x.png" + "filename" : "down_61x75@2x.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "down_61x75@2x.png" + "filename" : "down_93x114@3x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "down_93x114@3x.png" + "scale" : "3x" } ], "info" : { diff --git a/Limelight/Images.xcassets/DownButton.imageset/down_31x38@1x.png b/Limelight/Images.xcassets/DownButton.imageset/down_31x38@1x.png deleted file mode 100644 index bf7a7d8904946a919d78c3ad475ae1f946ac3817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1245 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 JF6*2UngH3H0wDkZ diff --git a/Limelight/Images.xcassets/RightButton.imageset/Contents.json b/Limelight/Images.xcassets/RightButton.imageset/Contents.json index 0b7b3744..31e1dcb0 100644 --- a/Limelight/Images.xcassets/RightButton.imageset/Contents.json +++ b/Limelight/Images.xcassets/RightButton.imageset/Contents.json @@ -2,18 +2,17 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "right_38x31@1x.png" + "filename" : "right_75x61@2x.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "right_75x61@2x.png" + "filename" : "right_114x93@3x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "right_114x93@3x.png" + "scale" : "3x" } ], "info" : { diff --git a/Limelight/Images.xcassets/RightButton.imageset/right_38x31@1x.png b/Limelight/Images.xcassets/RightButton.imageset/right_38x31@1x.png deleted file mode 100644 index 503babff2210295a4fa049307bfbd022ddc7328b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1238 zcmeAS@N?(olHy`uVBq!ia0y~yU{GUVV36lvV_;zD_Sk=#fq{XsILO_JVcj{ImkbOH zoCO|{#S9GG!XV7ZFl&wk0|R4ZW=KRygs+cPa(=E}VoH8es$NBI0RsrwR9IEy7UZUu zBq~(o=HwMyRoE(lRaoT}TY-f2l@!2AO0sR0B76fBob!uP6-@O^^bC~jxD*r=Y>HCS ztb$zJpxTR4(rlG7N=gc>^!3Zj%k|2Q_413-^$jg8E%gnI^o@*ki&D~bi!1X=5-W7` zij^UTz|3(;Elw`VEGWs$&r<-Io0ybeT4JlD1hPm01|aS%$xK7olvfP(R&su>K1fF2 zP|rXgZZ^nxkf@b^QD$mhNg~L6J3||=N)$1uJvRCv%aI%d@hMm|$i>Z$%SIm@CZO=K zGEjm>8DjZ zs!CIIS0688j99^LWqn#>j)Ustlhb96=Q?}Jds%pEU;n{4H(a1D&_Gt?{Ad4!;0@AQ zS+a|F_|?ufQx7}xiIHOg#e4&xKs2$U#BWIG`RxFoz zld>pVXV)!`Z}AR-4@)#;Tb-;7;?`e(!7+FGGJ6w);|q7)T^FS{y}kR8;0!)4^?at< zZBIoiyB3(4o9|_3XaCM|?(s*1EB4+m)|V-!bDVmYee7-7W_5M-A{#mWckkctKl}Xi z?WtZ%{r`SGP;sZW+Rs6fXLX}PgZJ{w)jMPKIL~+1?Y}S7$9%eZ`#cHiB1CT;WkfVv||hTjtm4A_}@ z!nLM8$=VtMczI)C?WZ2bD`!E4KwPpc70zx3eH z=`Xx-%lI#B`+7paHE`|q*O!hRW0UW7i`~2+A^Q8S0+GI+O!pQQ&t(r68_xO=#cax} zX0h~Y*4(zk4>|7Ch_6&!=>J(~)^%~N*A`ofr}{KsOgR4VnNTnLjJb+avajer?y)>3 z_P=f0`IUFAp8Z&DROKUW@JXg@Vw3ed5z9jPgl%o1#wnrEjTe7#-nn+|TJPbrOqUO~ zIxRG=czevooIi)DysmCt&%p5iAX3Z*c&~j>VN_VV?54$)I z+xY_PHIL^+ALgGaa*;v0Wr2;w>pER#w=(y6yLarE@NwF&H=lnl`fx|~i?+spF8B5P ge7{)k+?4;v@U1Ury^G=BxuC+v)78&qol`;+0OMHt=l}o! diff --git a/Limelight/Images.xcassets/UpButton.imageset/Contents.json b/Limelight/Images.xcassets/UpButton.imageset/Contents.json index aab957cd..280a9b96 100644 --- a/Limelight/Images.xcassets/UpButton.imageset/Contents.json +++ b/Limelight/Images.xcassets/UpButton.imageset/Contents.json @@ -2,18 +2,17 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "up_31x39@1x.png" + "filename" : "up_61x76@2x.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "up_61x76@2x.png" + "filename" : "up_93x116@3x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "up_93x116@3x.png" + "scale" : "3x" } ], "info" : { diff --git a/Limelight/Images.xcassets/UpButton.imageset/up_31x39@1x.png b/Limelight/Images.xcassets/UpButton.imageset/up_31x39@1x.png deleted file mode 100644 index 00815baf4935226727afefb9ebb21f62e159ce78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1319 zcmeAS@N?(olHy`uVBq!ia0y~yV322EU{L2^V_;zT-ah#!0|NtNage(c!@6@aFBupZ zI14-?iy0WWg+Z8+Vb&Z81_s8+%#etZ2wxwoFbx5m+O@q>*W`v>l<2HTIw4Z=^Gj87Nw-=7FXt#Bv$C= z6)QswftllyTAW;zSx}OhpQivaH!&%{w8U0P31pE13_#pjl9`6EDX$pnt>pY%eUOa4 zp`L+0+-#8XAW8fNrI!+AaMRDw^_t?|iMiHaG3})^}H~b^Bd<^XAOC-_`fZ z@6DXMcE+4JH3kL-A0jvk51X8IjPZ@1&-Lc;o*jp_253#a_uF~l1z{7O#S8EF8~ok) zw%ycMS}B~_r0HAI{5iSVVrPVQN?nmyk&!$9RlM?sLkb~Z`X6RR{+W2(Bjn-t-?5x| zb7K#4-n(~CFFqz_Mx%p+MBBq-nYXWt+Q{&AuU)(L(w{#yIVB|~6%`c`iL+NRq*^G> zo;^GK^y$<6n{K{2-P+o^yrb#=lP60~Wo#+k=)73y4%_r;)21CuPfw3eSo`bp%P)to zUcLI9V{ct$W#)<}4e1tpn~py{di3a%J9lEtqYmj+yX$#Nw$$~>xBq{b*AjU3#D3YbrCV1@MNNOc_HnQP|DRmOC#*Zo zp9gS$_IbK!Q+lkKI?uaxbyZbW0^LX3KD6y>=X-Z^-hHoCT^wvB0=u8MPvM=*cJACc zKB3Md0;_6;6%IB;ClqmRw@GDDNRaqGGtT`0OCC^LnnLM6%`a`HXSf-$txYF(eBf*x$AknKmm+IxYu*H=xgXdVEvDXUY6#gb zI3Yphx}Mrk+1|wwa{pItJ9P7$?sXTTXS+o&u*7XnoEEz~FLst~y0Ur0u7(t&O6g-Z z?hZ|c$KwUE)OV!HXR_xDG<>d*Tm68qN9|*=uM_7n%XixRGfi5Y+@lV>dBKt%Z_5MC6w(tc=Nr;gzc;k&)PLss#*{C%pwSW zibUkz{xx-P1@4$#G0`~v-e&swtI7vL8)P~drQCx)uAky~rch2!yD{^I_MG!xjBG^> zOl}PO_!+A`^qO9-d@XaiWAlo6w^bLk^&cy(k@(l)q9mWNp>4j<45d0I&MA{4V%N>N Q2r9iiUHx3vIVCg!0K#xCIRF3v diff --git a/Limelight/Images.xcassets/XButton.imageset/Contents.json b/Limelight/Images.xcassets/XButton.imageset/Contents.json index 6f7026e5..f3967aa1 100644 --- a/Limelight/Images.xcassets/XButton.imageset/Contents.json +++ b/Limelight/Images.xcassets/XButton.imageset/Contents.json @@ -2,18 +2,17 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "x_button_40x40@1x.png" + "filename" : "x_button_80x80@2x.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "x_button_80x80@2x.png" + "filename" : "x_button_120x120@3x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "x_button_120x120@3x.png" + "scale" : "3x" } ], "info" : { diff --git a/Limelight/Images.xcassets/XButton.imageset/x_button_40x40@1x.png b/Limelight/Images.xcassets/XButton.imageset/x_button_40x40@1x.png deleted file mode 100644 index e4623aca72f9c60d1727bf230e6152e4e211cd0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2365 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 G2~7YjSN0tM diff --git a/Limelight/Input/OnScreenControls.m b/Limelight/Input/OnScreenControls.m index af9c3b04..eb61e6b3 100644 --- a/Limelight/Input/OnScreenControls.m +++ b/Limelight/Input/OnScreenControls.m @@ -71,6 +71,7 @@ ControllerSupport *_controllerSupport; Controller *_controller; id _edgeDelegate; + NSMutableArray* _deadTouches; } static const float EDGE_WIDTH = .05; @@ -80,10 +81,12 @@ static const float BUTTON_DIST = 20; static float BUTTON_CENTER_X; static float BUTTON_CENTER_Y; -static const float D_PAD_DIST = 15; +static const float D_PAD_DIST = 10; static float D_PAD_CENTER_X; static float D_PAD_CENTER_Y; +static const float DEAD_ZONE_PADDING = 15; + static const double STICK_CLICK_RATE = 100; static const float STICK_DEAD_ZONE = .1; static float STICK_INNER_SIZE; @@ -119,6 +122,7 @@ static float L3_Y; _controller = [[Controller alloc] init]; _controller.playerIndex = 0; _edgeDelegate = swipeDelegate; + _deadTouches = [[NSMutableArray alloc] init]; _iPad = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); _controlArea = CGRectMake(0, 0, _view.frame.size.width, _view.frame.size.height); @@ -155,7 +159,7 @@ static float L3_Y; _leftStick = [CALayer layer]; _rightStick = [CALayer layer]; _edge = [CALayer layer]; - + [self setupEdgeDetection]; return self; @@ -183,10 +187,10 @@ static float L3_Y; [self hideButtons]; [self hideBumpers]; + [self hideL3R3]; [self drawTriggers]; [self drawStartSelect]; [self drawSticks]; - [self drawL3R3]; break; case OnScreenControlsLevelAutoGCExtendedGamepad: // GCExtendedGamepad is missing R3, L3, and select @@ -245,7 +249,42 @@ static float L3_Y; // Start with the default complex layout [self setupComplexControls]; - // TODO + START_X = _controlArea.size.width * .6 + _controlArea.origin.x; + START_Y = _controlArea.size.height * .9 + _controlArea.origin.y; + + SELECT_X = _controlArea.size.width * .4 + _controlArea.origin.x; + SELECT_Y = _controlArea.size.height * .9 + _controlArea.origin.y; + + L2_Y = _controlArea.size.height * .9 + _controlArea.origin.y; + L2_X = _controlArea.size.width * .1 + _controlArea.origin.x; + + R2_Y = _controlArea.size.height * .9 + _controlArea.origin.y; + R2_X = _controlArea.size.width * .9 + _controlArea.origin.x; + + if (_iPad) { + START_X = _controlArea.size.width * .75 + _controlArea.origin.x; + START_Y = _controlArea.size.height * .9 + _controlArea.origin.y; + + SELECT_X = _controlArea.size.width * .25 + _controlArea.origin.x; + SELECT_Y = _controlArea.size.height * .9 + _controlArea.origin.y; + + // The analog sticks are kept closer to the sides on iPad + LS_CENTER_X = _controlArea.size.width * .18 + _controlArea.origin.x; + LS_CENTER_Y = _controlArea.size.height * .75 + _controlArea.origin.y; + RS_CENTER_X = _controlArea.size.width * .82 + _controlArea.origin.x; + RS_CENTER_Y = _controlArea.size.height * .75 + _controlArea.origin.y; + } else { + START_X = _controlArea.size.width * .6 + _controlArea.origin.x; + START_Y = _controlArea.size.height * .9 + _controlArea.origin.y; + + SELECT_X = _controlArea.size.width * .4 + _controlArea.origin.x; + SELECT_Y = _controlArea.size.height * .9 + _controlArea.origin.y; + + LS_CENTER_X = _controlArea.size.width * .25 + _controlArea.origin.x; + LS_CENTER_Y = _controlArea.size.height * .75 + _controlArea.origin.y; + RS_CENTER_X = _controlArea.size.width * .75 + _controlArea.origin.x; + RS_CENTER_Y = _controlArea.size.height * .75 + _controlArea.origin.y; + } } // For simple controls we move the triggers and buttons to the bottom @@ -253,13 +292,15 @@ static float L3_Y; // Start with the default complex layout [self setupComplexControls]; + START_X = _controlArea.size.width * .6 + _controlArea.origin.x; START_Y = _controlArea.size.height * .9 + _controlArea.origin.y; + + SELECT_X = _controlArea.size.width * .4 + _controlArea.origin.x; SELECT_Y = _controlArea.size.height * .9 + _controlArea.origin.y; - - L1_Y = _controlArea.size.height * .7 + _controlArea.origin.y; + L2_Y = _controlArea.size.height * .9 + _controlArea.origin.y; L2_X = _controlArea.size.width * .1 + _controlArea.origin.x; - R1_Y = _controlArea.size.height * .7 + _controlArea.origin.y; + R2_Y = _controlArea.size.height * .9 + _controlArea.origin.y; R2_X = _controlArea.size.width * .9 + _controlArea.origin.x; } @@ -267,9 +308,9 @@ static float L3_Y; - (void) setupComplexControls { D_PAD_CENTER_X = _controlArea.size.width * .1 + _controlArea.origin.x; - D_PAD_CENTER_Y = _controlArea.size.height * .55 + _controlArea.origin.y; + D_PAD_CENTER_Y = _controlArea.size.height * .60 + _controlArea.origin.y; BUTTON_CENTER_X = _controlArea.size.width * .9 + _controlArea.origin.x; - BUTTON_CENTER_Y = _controlArea.size.height * .55 + _controlArea.origin.y; + BUTTON_CENTER_Y = _controlArea.size.height * .60 + _controlArea.origin.y; if (_iPad) { @@ -287,9 +328,9 @@ static float L3_Y; RS_CENTER_Y = _controlArea.size.height * .75 + _controlArea.origin.y; } - START_X = _controlArea.size.width * .1 + _controlArea.origin.x; + START_X = _controlArea.size.width * .9 + _controlArea.origin.x; START_Y = _controlArea.size.height * .9 + _controlArea.origin.y; - SELECT_X = _controlArea.size.width * .9 + _controlArea.origin.x; + SELECT_X = _controlArea.size.width * .1 + _controlArea.origin.x; SELECT_Y = _controlArea.size.height * .9 + _controlArea.origin.y; L1_X = _controlArea.size.width * .1 + _controlArea.origin.x; @@ -312,43 +353,43 @@ static float L3_Y; _aButton.contents = (id) aButtonImage.CGImage; _aButton.frame = CGRectMake(BUTTON_CENTER_X - aButtonImage.size.width / 2, BUTTON_CENTER_Y + BUTTON_DIST, aButtonImage.size.width, aButtonImage.size.height); [_view.layer addSublayer:_aButton]; - + // create B button UIImage* bButtonImage = [UIImage imageNamed:@"BButton"]; _bButton.frame = CGRectMake(BUTTON_CENTER_X + BUTTON_DIST, BUTTON_CENTER_Y - bButtonImage.size.height / 2, bButtonImage.size.width, bButtonImage.size.height); _bButton.contents = (id) bButtonImage.CGImage; [_view.layer addSublayer:_bButton]; - + // create X Button UIImage* xButtonImage = [UIImage imageNamed:@"XButton"]; _xButton.frame = CGRectMake(BUTTON_CENTER_X - BUTTON_DIST - xButtonImage.size.width, BUTTON_CENTER_Y - xButtonImage.size.height/ 2, xButtonImage.size.width, xButtonImage.size.height); _xButton.contents = (id) xButtonImage.CGImage; [_view.layer addSublayer:_xButton]; - + // create Y Button UIImage* yButtonImage = [UIImage imageNamed:@"YButton"]; _yButton.frame = CGRectMake(BUTTON_CENTER_X - yButtonImage.size.width / 2, BUTTON_CENTER_Y - BUTTON_DIST - yButtonImage.size.height, yButtonImage.size.width, yButtonImage.size.height); _yButton.contents = (id) yButtonImage.CGImage; [_view.layer addSublayer:_yButton]; - + // create Down button UIImage* downButtonImage = [UIImage imageNamed:@"DownButton"]; _downButton.frame = CGRectMake(D_PAD_CENTER_X - downButtonImage.size.width / 2, D_PAD_CENTER_Y + D_PAD_DIST, downButtonImage.size.width, downButtonImage.size.height); _downButton.contents = (id) downButtonImage.CGImage; [_view.layer addSublayer:_downButton]; - + // create Right button UIImage* rightButtonImage = [UIImage imageNamed:@"RightButton"]; _rightButton.frame = CGRectMake(D_PAD_CENTER_X + D_PAD_DIST, D_PAD_CENTER_Y - rightButtonImage.size.height / 2, rightButtonImage.size.width, rightButtonImage.size.height); _rightButton.contents = (id) rightButtonImage.CGImage; [_view.layer addSublayer:_rightButton]; - + // create Up button UIImage* upButtonImage = [UIImage imageNamed:@"UpButton"]; _upButton.frame = CGRectMake(D_PAD_CENTER_X - upButtonImage.size.width / 2, D_PAD_CENTER_Y - D_PAD_DIST - upButtonImage.size.height, upButtonImage.size.width, upButtonImage.size.height); _upButton.contents = (id) upButtonImage.CGImage; [_view.layer addSublayer:_upButton]; - + // create Left button UIImage* leftButtonImage = [UIImage imageNamed:@"LeftButton"]; _leftButton.frame = CGRectMake(D_PAD_CENTER_X - D_PAD_DIST - leftButtonImage.size.width, D_PAD_CENTER_Y - leftButtonImage.size.height / 2, leftButtonImage.size.width, leftButtonImage.size.height); @@ -362,7 +403,7 @@ static float L3_Y; _startButton.frame = CGRectMake(START_X - startButtonImage.size.width / 2, START_Y - startButtonImage.size.height / 2, startButtonImage.size.width, startButtonImage.size.height); _startButton.contents = (id) startButtonImage.CGImage; [_view.layer addSublayer:_startButton]; - + // create Select button UIImage* selectButtonImage = [UIImage imageNamed:@"SelectButton"]; _selectButton.frame = CGRectMake(SELECT_X - selectButtonImage.size.width / 2, SELECT_Y - selectButtonImage.size.height / 2, selectButtonImage.size.width, selectButtonImage.size.height); @@ -409,7 +450,7 @@ static float L3_Y; _leftStick.frame = CGRectMake(LS_CENTER_X - leftStickImage.size.width / 2, LS_CENTER_Y - leftStickImage.size.height / 2, leftStickImage.size.width, leftStickImage.size.height); _leftStick.contents = (id) leftStickImage.CGImage; [_view.layer addSublayer:_leftStick]; - + // create right analog stick UIImage* rightStickBgImage = [UIImage imageNamed:@"StickOuter"]; _rightStickBackground.frame = CGRectMake(RS_CENTER_X - rightStickBgImage.size.width / 2, RS_CENTER_Y - rightStickBgImage.size.height / 2, rightStickBgImage.size.width, rightStickBgImage.size.height); @@ -490,7 +531,7 @@ static float L3_Y; float lsMaxY = LS_CENTER_Y + STICK_OUTER_SIZE / 2; float lsMinX = LS_CENTER_X - STICK_OUTER_SIZE / 2; float lsMinY = LS_CENTER_Y - STICK_OUTER_SIZE / 2; - + for (UITouch* touch in touches) { CGPoint touchLocation = [touch locationInView:_view]; float xLoc = touchLocation.x; @@ -500,34 +541,34 @@ static float L3_Y; if (xLoc < lsMinX) xLoc = lsMinX; if (yLoc > lsMaxY) yLoc = lsMaxY; if (yLoc < lsMinY) yLoc = lsMinY; - + _leftStick.frame = CGRectMake(xLoc - STICK_INNER_SIZE / 2, yLoc - STICK_INNER_SIZE / 2, STICK_INNER_SIZE, STICK_INNER_SIZE); - + float xStickVal = (xLoc - LS_CENTER_X) / (lsMaxX - LS_CENTER_X); float yStickVal = (yLoc - LS_CENTER_Y) / (lsMaxY - LS_CENTER_Y); - + if (fabsf(xStickVal) < STICK_DEAD_ZONE) xStickVal = 0; if (fabsf(yStickVal) < STICK_DEAD_ZONE) yStickVal = 0; - + [_controllerSupport updateLeftStick:_controller x:0x7FFE * xStickVal y:0x7FFE * -yStickVal]; - + updated = true; } else if (touch == _rsTouch) { if (xLoc > rsMaxX) xLoc = rsMaxX; if (xLoc < rsMinX) xLoc = rsMinX; if (yLoc > rsMaxY) yLoc = rsMaxY; if (yLoc < rsMinY) yLoc = rsMinY; - + _rightStick.frame = CGRectMake(xLoc - STICK_INNER_SIZE / 2, yLoc - STICK_INNER_SIZE / 2, STICK_INNER_SIZE, STICK_INNER_SIZE); - + float xStickVal = (xLoc - RS_CENTER_X) / (rsMaxX - RS_CENTER_X); float yStickVal = (yLoc - RS_CENTER_Y) / (rsMaxY - RS_CENTER_Y); - + if (fabsf(xStickVal) < STICK_DEAD_ZONE) xStickVal = 0; if (fabsf(yStickVal) < STICK_DEAD_ZONE) yStickVal = 0; - + [_controllerSupport updateRightStick:_controller x:0x7FFE * xStickVal y:0x7FFE * -yStickVal]; - + updated = true; } else if (touch == _aTouch) { buttonTouch = true; @@ -562,11 +603,14 @@ static float L3_Y; } else if (touch == _r3Touch) { buttonTouch = true; } + if ([_deadTouches containsObject:touch]) { + updated = true; + } } if (updated) { [_controllerSupport updateFinished:_controller]; } - return updated || buttonTouch; + return updated || buttonTouch; } - (BOOL)handleTouchDownEvent:touches { @@ -680,6 +724,10 @@ static float L3_Y; } else if ([_edge.presentationLayer hitTest:touchLocation]) { _edgeTouch = touch; } + if (!updated && !stickTouch && [self isInDeadZone:touch]) { + [_deadTouches addObject:touch]; + updated = true; + } } if (updated) { [_controllerSupport updateFinished:_controller]; @@ -771,15 +819,123 @@ static float L3_Y; touched = true; } else if (touch == _edgeTouch) { _edgeTouch = nil; - if (![_edge.presentationLayer hitTest:[touch locationInView:_view]]) { + if ([touch locationInView:_view].x >= _view.frame.size.width / 4) { [_edgeDelegate edgeSwiped]; } } + if ([_deadTouches containsObject:touch]) { + [_deadTouches removeObject:touch]; + updated = true; + } } if (updated) { [_controllerSupport updateFinished:_controller]; } + return updated || touched; } +- (BOOL) isInDeadZone:(UITouch*) touch { + switch (_level) { + case OnScreenControlsLevelFull: + return [self isDpadDeadZone:touch] + || [self isAbxyDeadZone:touch] + || [self isTriggerDeadZone:touch] + || [self isBumperDeadZone:touch] + || [self isStartSelectDeadZone:touch]; + case OnScreenControlsLevelSimple: + return [self isTriggerDeadZone:touch] + || [self isStartSelectDeadZone:touch] + || [self isL3R3DeadZone:touch]; + case OnScreenControlsLevelAutoGCExtendedGamepad: + return [self isL3R3DeadZone:touch] + || [self isStartSelectDeadZone:touch]; + case OnScreenControlsLevelAutoGCGamepad: + return [self isTriggerDeadZone:touch] + || [self isStartSelectDeadZone:touch]; + default: + return false; + } +} + +- (BOOL) isDpadDeadZone:(UITouch*) touch { + return [self isDeadZone:touch + startX:_view.frame.origin.x + startY:_upButton.frame.origin.y + endX:_rightButton.frame.origin.x + _rightButton.frame.size.width + endY:_view.frame.origin.y + _view.frame.size.height]; +} + +- (BOOL) isAbxyDeadZone:(UITouch*) touch { + return [self isDeadZone:touch + startX:_xButton.frame.origin.x + startY:_yButton.frame.origin.y + endX:_view.frame.origin.x + _view.frame.size.width + endY:_view.frame.origin.y + _view.frame.size.height]; +} + +- (BOOL) isBumperDeadZone:(UITouch*) touch { + return [self isDeadZone:touch + startX:_view.frame.origin.x + startY:_l2Button.frame.origin.y + _l2Button.frame.size.height + endX:_l1Button.frame.origin.x + _l1Button.frame.size.width + endY:_upButton.frame.origin.y] + || [self isDeadZone:touch + startX:_r2Button.frame.origin.x + startY:_r2Button.frame.origin.y + _r2Button.frame.size.height + endX:_view.frame.origin.x + _view.frame.size.width + endY:_yButton.frame.origin.y]; +} + +- (BOOL) isTriggerDeadZone:(UITouch*) touch { + return [self isDeadZone:touch + startX:_view.frame.origin.x + startY:_l2Button.frame.origin.y + endX:_l2Button.frame.origin.x + _l2Button.frame.size.width + endY:_view.frame.origin.y + _view.frame.size.height] + || [self isDeadZone:touch + startX:_r2Button.frame.origin.x + startY:_r2Button.frame.origin.y + endX:_view.frame.origin.x + _view.frame.size.width + endY:_view.frame.origin.y + _view.frame.size.height]; +} + +- (BOOL) isL3R3DeadZone:(UITouch*) touch { + return [self isDeadZone:touch + startX:_view.frame.origin.x + startY:_l3Button.frame.origin.y + endX:_view.frame.origin.x + endY:_view.frame.origin.y + _view.frame.size.height] + || [self isDeadZone:touch + startX:_r3Button.frame.origin.x + startY:_r3Button.frame.origin.y + endX:_view.frame.origin.x + _view.frame.size.width + endY:_view.frame.origin.y + _view.frame.size.height]; +} + +- (BOOL) isStartSelectDeadZone:(UITouch*) touch { + return [self isDeadZone:touch + startX:_startButton.frame.origin.x + startY:_startButton.frame.origin.y + endX:_view.frame.origin.x + _view.frame.size.width + endY:_view.frame.origin.y + _view.frame.size.height] + || [self isDeadZone:touch + startX:_view.frame.origin.x + startY:_selectButton.frame.origin.y + endX:_selectButton.frame.origin.x + _selectButton.frame.size.width + endY:_view.frame.origin.y + _view.frame.size.height]; +} + +- (BOOL) isDeadZone:(UITouch*) touch startX:(float)deadZoneStartX startY:(float)deadZoneStartY endX:(float)deadZoneEndX endY:(float)deadZoneEndY { + deadZoneStartX -= DEAD_ZONE_PADDING; + deadZoneStartY -= DEAD_ZONE_PADDING; + deadZoneEndX += DEAD_ZONE_PADDING; + deadZoneEndY += DEAD_ZONE_PADDING; + + CGPoint touchLocation = [touch locationInView:_view]; + return (touchLocation.x > deadZoneStartX && touchLocation.x < deadZoneEndX + && touchLocation.y > deadZoneStartY && touchLocation.y < deadZoneEndY); + +} + @end diff --git a/Limelight/Input/StreamView.m b/Limelight/Input/StreamView.m index e3054d78..421438a3 100644 --- a/Limelight/Input/StreamView.m +++ b/Limelight/Input/StreamView.m @@ -67,15 +67,16 @@ deltaX *= xDeltaFactor * screenFactor; deltaY *= yDeltaFactor * screenFactor; - LiSendMouseMoveEvent(deltaX, deltaY); - - touchMoved = true; - touchLocation = currentLocation; + if (deltaX != 0 || deltaY != 0) { + LiSendMouseMoveEvent(deltaX, deltaY); + touchMoved = true; + touchLocation = currentLocation; + } } } else if ([[event allTouches] count] == 2) { CGPoint firstLocation = [[[[event allTouches] allObjects] objectAtIndex:0] locationInView:self]; CGPoint secondLocation = [[[[event allTouches] allObjects] objectAtIndex:1] locationInView:self]; - + CGPoint avgLocation = CGPointMake((firstLocation.x + secondLocation.x) / 2, (firstLocation.y + secondLocation.y) / 2); if (touchLocation.y != avgLocation.y) { LiSendScrollEvent(avgLocation.y - touchLocation.y); @@ -93,23 +94,23 @@ if (!touchMoved) { if ([[event allTouches] count] == 2) { Log(LOG_D, @"Sending right mouse button press"); - + LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_RIGHT); - + // Wait 100 ms to simulate a real button press usleep(100 * 1000); - + LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_RIGHT); - - + + } else { Log(LOG_D, @"Sending left mouse button press"); - + LiSendMouseButtonEvent(BUTTON_ACTION_PRESS, BUTTON_LEFT); - + // Wait 100 ms to simulate a real button press usleep(100 * 1000); - + LiSendMouseButtonEvent(BUTTON_ACTION_RELEASE, BUTTON_LEFT); } } diff --git a/Moonlight.xcodeproj/project.pbxproj b/Moonlight.xcodeproj/project.pbxproj index eb46b01c..27305dbf 100644 --- a/Moonlight.xcodeproj/project.pbxproj +++ b/Moonlight.xcodeproj/project.pbxproj @@ -1004,7 +1004,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; ENABLE_BITCODE = NO; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Limelight/Limelight-Prefix.pch";