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 a899ed2..b4d9c34 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 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 diff --git a/Limelight/Images.xcassets/DownButton.imageset/Contents.json b/Limelight/Images.xcassets/DownButton.imageset/Contents.json index bd51f19..5297392 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 zcmeAS@N?(olHy`uVBq!ia0vp^@<6P{!3HF4Zac&PDaPU;cPEB*=VV?2Ih+L^k;M!Q z+`=Ht$S`Y;1W-X_W=KRygs+cPa(=E}VoH8es$NBI0Z=v2j0!6tGdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)$-uxY>*?Yc62bX) z`uS`rN0H;@*F&{iuRK#&k)Wk$$+2|8HF@@_4j*oK-HPgZa_j%%f9y>U_Oj;RV_s^z zq-9RghW028OBOGu=%k}fQuTTJ^KS~q_MVeS)|ZSpK67s6{P)%QX=T@yI>l!$%gN7Q ztv5Y8J30CB_m?j-9UXJ0><2mJH|1Cak6GZ`nU{JZR)U@UY+qYXY;u zf)f7NqG~zD%@33lp8Vi+@cksQ;o&0g1Lvib9z5|qX!1isVvA>jS`$l&3rh^EIO}=U z1fiO^4I3DYYb5?mDzZ_&!jrMCJ-9$VdqED5!tZ7y9`k1TdQc z%C5WXTs};lD*E!tlPA??vuowMkLJwvbN|0%#xv8qkK+o?rUiE&f4t2{?K5-Ye~*AE zb}pV3PO&20NB@5PTAEkwR3POu?@_R)=km+*`}+IsEoAtX2Ca;FQna)DXU)Iq=br~x z?p3S4leqlgmKhVOEv0(z-MoGKH&4RW7`^{GB3$)Coh^&QR)5XR{U9beZ_iWNGsgrQ zw%tB>(2-fc{o2{HzS{f3Oa%>Y3VoV$P?KqGnD_0QH+OdLU3->!p7c2vhE@4lf&DjY z{;_P7 diff --git a/Limelight/Images.xcassets/LeftButton.imageset/Contents.json b/Limelight/Images.xcassets/LeftButton.imageset/Contents.json index 645b92b..e4ffafa 100644 --- a/Limelight/Images.xcassets/LeftButton.imageset/Contents.json +++ b/Limelight/Images.xcassets/LeftButton.imageset/Contents.json @@ -2,18 +2,17 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x", - "filename" : "left_38x31@1x.png" + "filename" : "left_76x61@2x.png", + "scale" : "1x" }, { "idiom" : "universal", - "scale" : "2x", - "filename" : "left_76x61@2x.png" + "filename" : "left_114x92@3x.png", + "scale" : "2x" }, { "idiom" : "universal", - "scale" : "3x", - "filename" : "left_114x92@3x.png" + "scale" : "3x" } ], "info" : { diff --git a/Limelight/Images.xcassets/LeftButton.imageset/left_38x31@1x.png b/Limelight/Images.xcassets/LeftButton.imageset/left_38x31@1x.png deleted file mode 100644 index ad7079b0306c785254954153912a5b0d4ad77b66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1267 zcmeAS@N?(olHy`uVBq!ia0vp^>Od^d!3HE#x~_Z$QjEnx?oJHr&dIz4aySb-B8wRq zxP?KOkzv*x37~?=%#etZ2wxwolpi<;HsXMd|v6mX?_p+J#iGa0=aXQ}19S#)e_LeixYMv)JV5wCtvd~r-dJhtqj>Fl;6_6uIxC(inH zXIEk1?wo~Du9Nj{?ohn3erm( zk7ovpJe{)cwOvf<@dwRzZV%oce)jBH^+Ugdp{KT6Sy}xG2)*hlQPs}kCf4+)@qYG1 z50$f=JWYl7z67ik3%l+U?V;21e%9reKIhMzIm2nJ=^&bwS+L0K$duTqrA-Wb^te4V zG*_yg?5hcOWLUQ7;tO6$2W?T~Z-q=9BJoohw=nlj$Zg1&G&@aX3->zS3r~ww4?p~{ zwyvS<&{oD>ci(AeOuD_7;cZ(sv&-ZdH{N?M*)pW~`~_KG3e>Uf+j8xJD#N|EEE!zq zUVqi9;Q6aJ)oYe(gZM?2@BdieaJz5#`t|FtLx&E%tgv~fKmD}SCBqFRhYof&-6&!5 zE!r=-Azg$qEHW<6&feaB{|pZmHDC&RUAKS#^0_LOjG}T^GA3EfdeX>v!?a`JjZ>#i zwU$`@wGiOA(0C=fRY!&KqlGEMTv_coN6&}o>FUm%Id^Vtm#pU2sI!cR7n^vnO^rM! z&~EU+@bluuMZIo^1-V-198LQ8{NTZZ@XK5BEhMiAEWatpXK%6U>Z*BOOWn-O%=ji= z+v=nCc}3954}1MvH#xJK9C+|OTW`9uglNdr2%T>{=CbT%4-=B#ynSoR-RhK_m37M2 z%xqafUBqDq=WSfk(a|iAkIhtEySj+yoX)k^rL{FRF}`Y(1%b%_+#?a*XeW5nzw=jla!{CG%{~hH8pSa~$ sW!#!@%$Du%hxlbNcJu%18~pmmUGTqmmqE$eOi)SW>FVdQ&MBb@0NI=ZApigX diff --git a/Limelight/Images.xcassets/RightButton.imageset/Contents.json b/Limelight/Images.xcassets/RightButton.imageset/Contents.json index 0b7b374..31e1dcb 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!ia0vp^YCtT{!3HF|J@%glQjEnx?oJHr&dIz4aySb-B8wRq zxP?KOkzv*x37~?=%#etZ2wxwolpi<;HsXMd|v6mX?GEjm>8DjZs!CIIS0688j99^LWqn#> zj)Ustlhb96=Q?}Jds%pEU;n{4H(a1D&_Gt?{Ad4!;0@AQS+a|F_|?ufQx7}xiIHOg#e4&xKs2$U#BWIG`RxFozld>pVXV)!`Z}AR-4@)#; zTb-;7;?`e(!7+FGGJ6w);|q7)T^FS{y}kR8;0!)4^?ateZ`#cHiB1CT;WkfVv||hTjtm4A_}@!nLM8$=VtMczI)C?WZ2bD`!E4KwPpc70zx3eH=`Xx-%lI#B`+7paHE`|q z*O!hRW0UW7i`~2+A^Q8S0+GI+O!pQQ&t(r68_xO=#cax}X0h~Y*4(zk4>|7Ch_6&! z=>J(~)^%~N*A`ofr}{KsOgR4VnNTnLjJb+avajer?y)>3_P=f0`IUFAp8Z&DROKUW z@JXg@Vw3ed5z9jPgl%o1#wnrEjTe7#-nn+|TJPbrOqUO~IxRG=czevooIi)DysmCt z&%p5iAX3Z*c&~j>VN_VV?54$)I+xY_PHIL^+ALgGaa*;v0 zWr2;w>pER#w=(y6yLarE@NwF&H=lnl`fx|~i?+spF8B5Pe7{)k+?4;v@U1Ury^G=B QxuC+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 aab957c..280a9b9 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!ia0vp^@<6Q4!3HG1w@>~Fq!^2X+?^QKos)S9vL>4nJ za0`PlBg3pY5sd^Q;1whpd3^o;3KxS@gNuokUZcbjY zRfVk*ScMgk4HDK@QUEI{$+lIB@C{IK&M!(;Fx4~BGf=YQQczH^DN0GR3UYCSY6tRc zl`=|73as??%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{^NN)rhQQ2mNi9w; z$}A|!%+FH*nVXoDUs__Tqy(}E4j}F<$xK7olvfP(7SMzGAQ^o_Jp+BX*+8u}AWsb3~j(FQN*D3*yw{SM{*3rr(jW_SM9iL^x?r~$K`WKJ(7WeIo;F6F(iWX z?ToYj!j2Nhtas;TX7XIo_p<-05O}DuKq;n^Grad$^!cLaM^0KlbUQSEfzlsVIgU>8 zfNrI!+AaMRDw^_t?|iMiHaG3})^}H~b^Bd<^XAOC-_`fZ@6DXMcE+4JH3kL-A0jvk z51X8IjPZ@1&-Lc;o*jp_253#a_uF~l1z{7O#S8EF8~ok)w%ycMS}B~_r0HAI{5iSV zVrPVQN?nmyk&!$9RlM?sLkb~Z`X6RR{+W2(Bjn-t-?5x|b7K#4-n(~CFFqz_Mx%p+ zMBBq-nYXWt+Q{&AuU)(L(w{#yIVB|~6%`c`iL+NRq*^G>o;^GK^y$<6n{K{2-P+o^ zyrb#=lP60~Wo#+k=)73y4%_r;)21CuPfw3eSo`bp%P)toUcLI9V{ct$W#)<}4e1tp zn~py{di3a%J9lEtqYmj+yX$#N zw$$~>xBq{b*AjU3#D3YbrCV1@MNNOc_HnQP|DRmOC#*Zop9gS$_IbK!Q+lkKI?uax zbyZbW0^LX3KD6y>=X-Z^-hHoCT^wvB0=u8MPvM=*cJACcKB3Md0;_6;6%IB;ClqmR zw@GDDNRaqGGtT`0OCC^LnnLM6%`a`HXSf z-$txYF(eBf*x$AknKmm+IxYu*H=xgXdVEvDXUY6#gbI3Yphx}Mrk+1|wwa{pIt zJ9P7$?sXTTXS+o&u*7XnoEEz~FLst~y0Ur0u7(t&O6g-Z?hZ|c$KwUE)OV!HXR_xD zG<>d*Tm68qN9|*=uM_7n%XixRGfi5Y+@lV>dBKt%Z_5MC6w(tc=Nr;gzc;k&)PLss#*{C%pwSWibUkz{xx-P1@4$#G0`~v z-e&swtI7vL8)P~drQCx)uAky~rch2!yD{^I_MG!xjBG^>Ol}PO_!+A`^qO9-d@Xai zWAlo6w^bLk^&cy(k@(l)q9mWNp>4j<45d0I&MA{4V%N>N2r9iiUHx3vIVCg!0K#xC AIRF3v diff --git a/Limelight/Images.xcassets/XButton.imageset/Contents.json b/Limelight/Images.xcassets/XButton.imageset/Contents.json index 6f7026e..f3967aa 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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 LOs`b;%FTZRELZj& diff --git a/Limelight/Input/OnScreenControls.m b/Limelight/Input/OnScreenControls.m index af9c3b0..eb61e6b 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 e3054d7..421438a 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 eb46b01..27305db 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";