From d6d30f021de3b538c4e970a2ee7341bf6aaa0211 Mon Sep 17 00:00:00 2001 From: Diego Waxemberg Date: Sun, 28 Dec 2014 21:42:18 -0500 Subject: [PATCH] started implementing on-screen controls - directional pad works - a,b,x,y work --- Limelight.xcodeproj/project.pbxproj | 6 + .../AButton.imageset/Contents.json | 23 +++ .../AButton.imageset/a_button-1.png | Bin 0 -> 1057 bytes .../AButton.imageset/a_button-2.png | Bin 0 -> 1057 bytes .../AButton.imageset/a_button.png | Bin 0 -> 1057 bytes .../BButton.imageset/Contents.json | 23 +++ .../BButton.imageset/b_button-1.png | Bin 0 -> 1053 bytes .../BButton.imageset/b_button-2.png | Bin 0 -> 1053 bytes .../BButton.imageset/b_button.png | Bin 0 -> 1053 bytes .../DownButton.imageset/Contents.json | 23 +++ .../DownButton.imageset/down-1.png | Bin 0 -> 455 bytes .../DownButton.imageset/down-2.png | Bin 0 -> 455 bytes .../DownButton.imageset/down.png | Bin 0 -> 455 bytes .../LeftButton.imageset/Contents.json | 23 +++ .../LeftButton.imageset/left-1.png | Bin 0 -> 525 bytes .../LeftButton.imageset/left-2.png | Bin 0 -> 525 bytes .../LeftButton.imageset/left.png | Bin 0 -> 525 bytes .../RightButton.imageset/Contents.json | 23 +++ .../RightButton.imageset/right-1.png | Bin 0 -> 549 bytes .../RightButton.imageset/right-2.png | Bin 0 -> 549 bytes .../RightButton.imageset/right.png | Bin 0 -> 549 bytes .../UpButton.imageset/Contents.json | 23 +++ .../UpButton.imageset/up-1.png | Bin 0 -> 452 bytes .../UpButton.imageset/up-2.png | Bin 0 -> 452 bytes .../Images.xcassets/UpButton.imageset/up.png | Bin 0 -> 452 bytes .../XButton.imageset/Contents.json | 23 +++ .../XButton.imageset/x_button-1.png | Bin 0 -> 1078 bytes .../XButton.imageset/x_button-2.png | Bin 0 -> 1078 bytes .../XButton.imageset/x_button.png | Bin 0 -> 1078 bytes .../YButton.imageset/Contents.json | 23 +++ .../YButton.imageset/y_button-1.png | Bin 0 -> 969 bytes .../YButton.imageset/y_button-2.png | Bin 0 -> 969 bytes .../YButton.imageset/y_button.png | Bin 0 -> 969 bytes Limelight/Input/OnScreenControls.h | 16 ++ Limelight/Input/OnScreenControls.m | 193 ++++++++++++++++++ Limelight/Input/StreamView.h | 2 + Limelight/Input/StreamView.m | 11 +- Limelight/Stream/StreamManager.m | 1 + .../StreamFrameViewController.m | 2 + 39 files changed, 412 insertions(+), 3 deletions(-) create mode 100644 Limelight/Images.xcassets/AButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/AButton.imageset/a_button-1.png create mode 100644 Limelight/Images.xcassets/AButton.imageset/a_button-2.png create mode 100644 Limelight/Images.xcassets/AButton.imageset/a_button.png create mode 100644 Limelight/Images.xcassets/BButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/BButton.imageset/b_button-1.png create mode 100644 Limelight/Images.xcassets/BButton.imageset/b_button-2.png create mode 100644 Limelight/Images.xcassets/BButton.imageset/b_button.png create mode 100644 Limelight/Images.xcassets/DownButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/DownButton.imageset/down-1.png create mode 100644 Limelight/Images.xcassets/DownButton.imageset/down-2.png create mode 100644 Limelight/Images.xcassets/DownButton.imageset/down.png create mode 100644 Limelight/Images.xcassets/LeftButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/LeftButton.imageset/left-1.png create mode 100644 Limelight/Images.xcassets/LeftButton.imageset/left-2.png create mode 100644 Limelight/Images.xcassets/LeftButton.imageset/left.png create mode 100644 Limelight/Images.xcassets/RightButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/RightButton.imageset/right-1.png create mode 100644 Limelight/Images.xcassets/RightButton.imageset/right-2.png create mode 100644 Limelight/Images.xcassets/RightButton.imageset/right.png create mode 100644 Limelight/Images.xcassets/UpButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/UpButton.imageset/up-1.png create mode 100644 Limelight/Images.xcassets/UpButton.imageset/up-2.png create mode 100644 Limelight/Images.xcassets/UpButton.imageset/up.png create mode 100644 Limelight/Images.xcassets/XButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/XButton.imageset/x_button-1.png create mode 100644 Limelight/Images.xcassets/XButton.imageset/x_button-2.png create mode 100644 Limelight/Images.xcassets/XButton.imageset/x_button.png create mode 100644 Limelight/Images.xcassets/YButton.imageset/Contents.json create mode 100644 Limelight/Images.xcassets/YButton.imageset/y_button-1.png create mode 100644 Limelight/Images.xcassets/YButton.imageset/y_button-2.png create mode 100644 Limelight/Images.xcassets/YButton.imageset/y_button.png create mode 100644 Limelight/Input/OnScreenControls.h create mode 100644 Limelight/Input/OnScreenControls.m diff --git a/Limelight.xcodeproj/project.pbxproj b/Limelight.xcodeproj/project.pbxproj index e0ebc145..e181c636 100644 --- a/Limelight.xcodeproj/project.pbxproj +++ b/Limelight.xcodeproj/project.pbxproj @@ -27,6 +27,7 @@ FB290DC419B2E98F004C83CF /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB290DC319B2E98F004C83CF /* libxml2.dylib */; }; FB290E7919B37D81004C83CF /* iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7819B37D81004C83CF /* iPad.storyboard */; }; FB290E7B19B38036004C83CF /* iPhone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB290E7A19B38036004C83CF /* iPhone.storyboard */; }; + FB4678ED1A50C40900377732 /* OnScreenControls.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4678EC1A50C40900377732 /* OnScreenControls.m */; }; FB7E794419C8B71B00A15F68 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB7E794319C8B71B00A15F68 /* libiconv.dylib */; }; FB89462819F646E200339C8A /* CryptoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB89460619F646E200339C8A /* CryptoManager.m */; }; FB89462919F646E200339C8A /* mkcert.c in Sources */ = {isa = PBXBuildFile; fileRef = FB89460719F646E200339C8A /* mkcert.c */; }; @@ -106,6 +107,8 @@ FB290DC319B2E98F004C83CF /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; FB290E7819B37D81004C83CF /* iPad.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = iPad.storyboard; sourceTree = SOURCE_ROOT; }; FB290E7A19B38036004C83CF /* iPhone.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = iPhone.storyboard; sourceTree = SOURCE_ROOT; }; + FB4678EB1A50C40900377732 /* OnScreenControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OnScreenControls.h; sourceTree = ""; }; + FB4678EC1A50C40900377732 /* OnScreenControls.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OnScreenControls.m; sourceTree = ""; }; FB7E794319C8B71B00A15F68 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; }; FB89460519F646E200339C8A /* CryptoManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CryptoManager.h; sourceTree = ""; }; FB89460619F646E200339C8A /* CryptoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CryptoManager.m; sourceTree = ""; }; @@ -392,6 +395,8 @@ FB89460B19F646E200339C8A /* ControllerSupport.m */, FB89460C19F646E200339C8A /* StreamView.h */, FB89460D19F646E200339C8A /* StreamView.m */, + FB4678EB1A50C40900377732 /* OnScreenControls.h */, + FB4678EC1A50C40900377732 /* OnScreenControls.m */, ); path = Input; sourceTree = ""; @@ -768,6 +773,7 @@ FB89463619F646E200339C8A /* StreamFrameViewController.m in Sources */, FB89462819F646E200339C8A /* CryptoManager.m in Sources */, FB89462E19F646E200339C8A /* PairManager.m in Sources */, + FB4678ED1A50C40900377732 /* OnScreenControls.m in Sources */, FB290D0019B2C406004C83CF /* main.m in Sources */, FBD3494319FC9C04002D2A60 /* AppManager.m in Sources */, FB89462A19F646E200339C8A /* ControllerSupport.m in Sources */, diff --git a/Limelight/Images.xcassets/AButton.imageset/Contents.json b/Limelight/Images.xcassets/AButton.imageset/Contents.json new file mode 100644 index 00000000..429e86f4 --- /dev/null +++ b/Limelight/Images.xcassets/AButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "a_button.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "a_button-1.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "a_button-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/AButton.imageset/a_button-1.png b/Limelight/Images.xcassets/AButton.imageset/a_button-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b6d68d6e8e84e723a7fed9d7df4750442ed571 GIT binary patch literal 1057 zcmV++1m63JP)2YXX%yp~nh-M2gA?hFi~yRN&x@6DU{X5O1G7DE(G(=PJ)d|arWN~La! zSHp?Ixw%{}58s7r#G)ebu<+oSOy-t&y%YfMs8G0;dCh!09={eUXz)M+oR&_fE2@Aw zPy>GR>{}a{S~i=#9U!>>)ckGztjyf(*9ufIS$$D>hQLi4ntvGJ$q)lGY4{<^j>3zB@f{)z1HuST zhUnW+CoFv)N}m`Nc)me|iF#Dv?G&Cl^5Z-OEwSX)X=qV}w^P?qov?dc-#s(Mhzg<_ zC&4qr(J9mC|q*wVPY7*FUzBd=Wws;=d#jrJE`g3iq})LJ{Df zBowv&?@EXrz|m+lCfN^CoBM7L2+6rIrMTa4ID9Ju`yfPq-)^^Gkc$&i0%&bIn8K`Xi^@#R*iVCxs}P*SjCi5Hunu(R3769X+m7B+|| z72M4D;n@#yAUT9u(UN-E&m+MB8kK&z1gOFyw4o_qg4r4=Ch8#=O0Lx%nM21ZfIK^J zd-5!LkdDUekM+>i)i-PEm;7)za82lglgZ?bSQG?WCIH?28;nz+n&%p3d3O!7#QSf5 zMi}*gqZ)9b1s0M%T00000NkvXXu0mjfg@Evm literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/AButton.imageset/a_button-2.png b/Limelight/Images.xcassets/AButton.imageset/a_button-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b6d68d6e8e84e723a7fed9d7df4750442ed571 GIT binary patch literal 1057 zcmV++1m63JP)2YXX%yp~nh-M2gA?hFi~yRN&x@6DU{X5O1G7DE(G(=PJ)d|arWN~La! zSHp?Ixw%{}58s7r#G)ebu<+oSOy-t&y%YfMs8G0;dCh!09={eUXz)M+oR&_fE2@Aw zPy>GR>{}a{S~i=#9U!>>)ckGztjyf(*9ufIS$$D>hQLi4ntvGJ$q)lGY4{<^j>3zB@f{)z1HuST zhUnW+CoFv)N}m`Nc)me|iF#Dv?G&Cl^5Z-OEwSX)X=qV}w^P?qov?dc-#s(Mhzg<_ zC&4qr(J9mC|q*wVPY7*FUzBd=Wws;=d#jrJE`g3iq})LJ{Df zBowv&?@EXrz|m+lCfN^CoBM7L2+6rIrMTa4ID9Ju`yfPq-)^^Gkc$&i0%&bIn8K`Xi^@#R*iVCxs}P*SjCi5Hunu(R3769X+m7B+|| z72M4D;n@#yAUT9u(UN-E&m+MB8kK&z1gOFyw4o_qg4r4=Ch8#=O0Lx%nM21ZfIK^J zd-5!LkdDUekM+>i)i-PEm;7)za82lglgZ?bSQG?WCIH?28;nz+n&%p3d3O!7#QSf5 zMi}*gqZ)9b1s0M%T00000NkvXXu0mjfg@Evm literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/AButton.imageset/a_button.png b/Limelight/Images.xcassets/AButton.imageset/a_button.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b6d68d6e8e84e723a7fed9d7df4750442ed571 GIT binary patch literal 1057 zcmV++1m63JP)2YXX%yp~nh-M2gA?hFi~yRN&x@6DU{X5O1G7DE(G(=PJ)d|arWN~La! zSHp?Ixw%{}58s7r#G)ebu<+oSOy-t&y%YfMs8G0;dCh!09={eUXz)M+oR&_fE2@Aw zPy>GR>{}a{S~i=#9U!>>)ckGztjyf(*9ufIS$$D>hQLi4ntvGJ$q)lGY4{<^j>3zB@f{)z1HuST zhUnW+CoFv)N}m`Nc)me|iF#Dv?G&Cl^5Z-OEwSX)X=qV}w^P?qov?dc-#s(Mhzg<_ zC&4qr(J9mC|q*wVPY7*FUzBd=Wws;=d#jrJE`g3iq})LJ{Df zBowv&?@EXrz|m+lCfN^CoBM7L2+6rIrMTa4ID9Ju`yfPq-)^^Gkc$&i0%&bIn8K`Xi^@#R*iVCxs}P*SjCi5Hunu(R3769X+m7B+|| z72M4D;n@#yAUT9u(UN-E&m+MB8kK&z1gOFyw4o_qg4r4=Ch8#=O0Lx%nM21ZfIK^J zd-5!LkdDUekM+>i)i-PEm;7)za82lglgZ?bSQG?WCIH?28;nz+n&%p3d3O!7#QSf5 zMi}*gqZ)9b1s0M%T00000NkvXXu0mjfg@Evm literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/BButton.imageset/Contents.json b/Limelight/Images.xcassets/BButton.imageset/Contents.json new file mode 100644 index 00000000..8c941fa1 --- /dev/null +++ b/Limelight/Images.xcassets/BButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "b_button.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "b_button-1.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "b_button-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/BButton.imageset/b_button-1.png b/Limelight/Images.xcassets/BButton.imageset/b_button-1.png new file mode 100644 index 0000000000000000000000000000000000000000..18649f4660860b3bcaa2fdf5440090d2296b1941 GIT binary patch literal 1053 zcmV+&1mgRNP)SegT!#p5KoH^S zA-d-31ZB=cnG?eT&ozj!P!9{doxnSX-p}JO5(`d^h7?wKJFy+r3A)8~-7Kd!EDc43z?hv#CL0L1=WP)|vDxV!Q95O*VDKgD{Zp?+`G&^*z z!xSvw5o{pi!PA(K>* z%a26>c%6j8p8xCsgeJ^9h`shT0@!Z1U)AgNr>d$x@Avy}*X#9Wzt3nix)fqdT)gB1^o!HR;x7$phG`!GMRiJfCm7UN~K3TfzbvkYXq@UsXQToCao~Y zcDwzh?>C>%zn}xe-W+ZP;CMW~)c5<%8un&&-#F4B)9Li1zTalE`HAjGW5)u`0yOIP znKks7Aa*L#2u!Eb>8q;xtl4b77z_sQmdoWgL5+xvo{h8X#)z<#yUxz}F`&9wEWQd8 zP!%Dh&y2yw47k~B_NiDbJ`^gXPe~;XNhL~aI!tR)Vx7Y-E!x`QU~31dF^BEGuw{$j zn3IEBeZzdHhRfj_GA0hU_|hokaP*5#C~-KkM4QbmY%V`?TIrmi=_1c|Y9kQ5y{LP!R}1h2t>hC*38T8$K&x^kuWqEnE-V6HyBo+YJC;0yt{;1;{7kMZfT-J zaTJUI001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P) XZ)9b1s0M%T00000NkvXXu0mjftk2;g literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/BButton.imageset/b_button-2.png b/Limelight/Images.xcassets/BButton.imageset/b_button-2.png new file mode 100644 index 0000000000000000000000000000000000000000..18649f4660860b3bcaa2fdf5440090d2296b1941 GIT binary patch literal 1053 zcmV+&1mgRNP)SegT!#p5KoH^S zA-d-31ZB=cnG?eT&ozj!P!9{doxnSX-p}JO5(`d^h7?wKJFy+r3A)8~-7Kd!EDc43z?hv#CL0L1=WP)|vDxV!Q95O*VDKgD{Zp?+`G&^*z z!xSvw5o{pi!PA(K>* z%a26>c%6j8p8xCsgeJ^9h`shT0@!Z1U)AgNr>d$x@Avy}*X#9Wzt3nix)fqdT)gB1^o!HR;x7$phG`!GMRiJfCm7UN~K3TfzbvkYXq@UsXQToCao~Y zcDwzh?>C>%zn}xe-W+ZP;CMW~)c5<%8un&&-#F4B)9Li1zTalE`HAjGW5)u`0yOIP znKks7Aa*L#2u!Eb>8q;xtl4b77z_sQmdoWgL5+xvo{h8X#)z<#yUxz}F`&9wEWQd8 zP!%Dh&y2yw47k~B_NiDbJ`^gXPe~;XNhL~aI!tR)Vx7Y-E!x`QU~31dF^BEGuw{$j zn3IEBeZzdHhRfj_GA0hU_|hokaP*5#C~-KkM4QbmY%V`?TIrmi=_1c|Y9kQ5y{LP!R}1h2t>hC*38T8$K&x^kuWqEnE-V6HyBo+YJC;0yt{;1;{7kMZfT-J zaTJUI001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P) XZ)9b1s0M%T00000NkvXXu0mjftk2;g literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/BButton.imageset/b_button.png b/Limelight/Images.xcassets/BButton.imageset/b_button.png new file mode 100644 index 0000000000000000000000000000000000000000..18649f4660860b3bcaa2fdf5440090d2296b1941 GIT binary patch literal 1053 zcmV+&1mgRNP)SegT!#p5KoH^S zA-d-31ZB=cnG?eT&ozj!P!9{doxnSX-p}JO5(`d^h7?wKJFy+r3A)8~-7Kd!EDc43z?hv#CL0L1=WP)|vDxV!Q95O*VDKgD{Zp?+`G&^*z z!xSvw5o{pi!PA(K>* z%a26>c%6j8p8xCsgeJ^9h`shT0@!Z1U)AgNr>d$x@Avy}*X#9Wzt3nix)fqdT)gB1^o!HR;x7$phG`!GMRiJfCm7UN~K3TfzbvkYXq@UsXQToCao~Y zcDwzh?>C>%zn}xe-W+ZP;CMW~)c5<%8un&&-#F4B)9Li1zTalE`HAjGW5)u`0yOIP znKks7Aa*L#2u!Eb>8q;xtl4b77z_sQmdoWgL5+xvo{h8X#)z<#yUxz}F`&9wEWQd8 zP!%Dh&y2yw47k~B_NiDbJ`^gXPe~;XNhL~aI!tR)Vx7Y-E!x`QU~31dF^BEGuw{$j zn3IEBeZzdHhRfj_GA0hU_|hokaP*5#C~-KkM4QbmY%V`?TIrmi=_1c|Y9kQ5y{LP!R}1h2t>hC*38T8$K&x^kuWqEnE-V6HyBo+YJC;0yt{;1;{7kMZfT-J zaTJUI001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P) XZ)9b1s0M%T00000NkvXXu0mjftk2;g literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/DownButton.imageset/Contents.json b/Limelight/Images.xcassets/DownButton.imageset/Contents.json new file mode 100644 index 00000000..e57d1fe7 --- /dev/null +++ b/Limelight/Images.xcassets/DownButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "down.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "down-1.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "down-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/DownButton.imageset/down-1.png b/Limelight/Images.xcassets/DownButton.imageset/down-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0557ceec9a9a84d8d805e02d80ba588c9bc0dfee GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^wm|I7!3HD`OZJ;GFffLCx;TbZ+fHj~m z;icpX4~|CTfJzqYC~t4;{s)N`47{p)-8XCrInE+%*ur{q?%bR9CsQV$HPN3v_oZ6b z3?$`9~LhFW>RGn0xzP=$?|$Q1L@E8dip#ojH7n}H&D=s|wJ8sjY)SHGZ2A1~TsgEq~?bG{y z>SA@#r0<++cDD{H1w_RG!&$e)HKHUqKdq!Zu_%=xsZuW~CqF+WrBW}ssIs6WUoSH^ jF+Eie7*j?ju6fD%DXB#(*y`T_H8Oa*`njxgN@xNA0}sHS literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/DownButton.imageset/down-2.png b/Limelight/Images.xcassets/DownButton.imageset/down-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0557ceec9a9a84d8d805e02d80ba588c9bc0dfee GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^wm|I7!3HD`OZJ;GFffLCx;TbZ+fHj~m z;icpX4~|CTfJzqYC~t4;{s)N`47{p)-8XCrInE+%*ur{q?%bR9CsQV$HPN3v_oZ6b z3?$`9~LhFW>RGn0xzP=$?|$Q1L@E8dip#ojH7n}H&D=s|wJ8sjY)SHGZ2A1~TsgEq~?bG{y z>SA@#r0<++cDD{H1w_RG!&$e)HKHUqKdq!Zu_%=xsZuW~CqF+WrBW}ssIs6WUoSH^ jF+Eie7*j?ju6fD%DXB#(*y`T_H8Oa*`njxgN@xNA0}sHS literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/DownButton.imageset/down.png b/Limelight/Images.xcassets/DownButton.imageset/down.png new file mode 100644 index 0000000000000000000000000000000000000000..0557ceec9a9a84d8d805e02d80ba588c9bc0dfee GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^wm|I7!3HD`OZJ;GFffLCx;TbZ+fHj~m z;icpX4~|CTfJzqYC~t4;{s)N`47{p)-8XCrInE+%*ur{q?%bR9CsQV$HPN3v_oZ6b z3?$`9~LhFW>RGn0xzP=$?|$Q1L@E8dip#ojH7n}H&D=s|wJ8sjY)SHGZ2A1~TsgEq~?bG{y z>SA@#r0<++cDD{H1w_RG!&$e)HKHUqKdq!Zu_%=xsZuW~CqF+WrBW}ssIs6WUoSH^ jF+Eie7*j?ju6fD%DXB#(*y`T_H8Oa*`njxgN@xNA0}sHS literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/LeftButton.imageset/Contents.json b/Limelight/Images.xcassets/LeftButton.imageset/Contents.json new file mode 100644 index 00000000..b5b34f59 --- /dev/null +++ b/Limelight/Images.xcassets/LeftButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "left.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "left-1.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "left-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/LeftButton.imageset/left-1.png b/Limelight/Images.xcassets/LeftButton.imageset/left-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab41503b3f3fc957dceadbc47b4bd76be89932b GIT binary patch literal 525 zcmV+o0`mQdP)x6_lC79+Fr3% zL)$x8a5Mz4plB#y!O)Pvf}o*+iK8KciK3x`iJ>8biJ+l_v7>1KV@1;f#)hT|j0H^_ zm^Ye6FfTN%V2jZ-gDpbS4n{^ZFd~{^5z!2ah-OGcG|q|Yx_)lk_Okf zBVuU>BV%a>TZE+*Y%!KbFfS}^VBT1oz*w-ffU#j|0As~M2V=)V1{1+T1rx(U1QW$V z0~5zW0tnJ001p? zMObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)Z)9b1s0M%T P00000NkvXXu0mjf*0$LN literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/LeftButton.imageset/left-2.png b/Limelight/Images.xcassets/LeftButton.imageset/left-2.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab41503b3f3fc957dceadbc47b4bd76be89932b GIT binary patch literal 525 zcmV+o0`mQdP)x6_lC79+Fr3% zL)$x8a5Mz4plB#y!O)Pvf}o*+iK8KciK3x`iJ>8biJ+l_v7>1KV@1;f#)hT|j0H^_ zm^Ye6FfTN%V2jZ-gDpbS4n{^ZFd~{^5z!2ah-OGcG|q|Yx_)lk_Okf zBVuU>BV%a>TZE+*Y%!KbFfS}^VBT1oz*w-ffU#j|0As~M2V=)V1{1+T1rx(U1QW$V z0~5zW0tnJ001p? zMObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)Z)9b1s0M%T P00000NkvXXu0mjf*0$LN literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/LeftButton.imageset/left.png b/Limelight/Images.xcassets/LeftButton.imageset/left.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab41503b3f3fc957dceadbc47b4bd76be89932b GIT binary patch literal 525 zcmV+o0`mQdP)x6_lC79+Fr3% zL)$x8a5Mz4plB#y!O)Pvf}o*+iK8KciK3x`iJ>8biJ+l_v7>1KV@1;f#)hT|j0H^_ zm^Ye6FfTN%V2jZ-gDpbS4n{^ZFd~{^5z!2ah-OGcG|q|Yx_)lk_Okf zBVuU>BV%a>TZE+*Y%!KbFfS}^VBT1oz*w-ffU#j|0As~M2V=)V1{1+T1rx(U1QW$V z0~5zW0tnJ001p? zMObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(QrcZ!T$VVP|D7P)Z)9b1s0M%T P00000NkvXXu0mjf*0$LN literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/RightButton.imageset/Contents.json b/Limelight/Images.xcassets/RightButton.imageset/Contents.json new file mode 100644 index 00000000..a11eef90 --- /dev/null +++ b/Limelight/Images.xcassets/RightButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "right.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "right-1.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "right-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/RightButton.imageset/right-1.png b/Limelight/Images.xcassets/RightButton.imageset/right-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c717a8dcbc939499c07c0ce4984ac0367cfa249d GIT binary patch literal 549 zcmV+=0^0qFP)002D*1^@s6(3B4)k5B~-4wi)$4wmf^_9Q_;;en9`2lohrTMQyiQ@h&nom2ns zB3-cclVdyfos(pv=W%}Ox<21=98F|dc9@&GOBBj3%Cdaf1S~eFC5obWRw##1sC&ag zfC_?z0>zGn1jUMl2E~Sj2*rYh3Pp~E3`L5C4n>9~0g41m3Y0gNBq%Q|X;7=NBtosi zk_zRFB^k;IOFEP_mO@!#DU>CaLRn%dlqFW|P<`KjbY1t}G|ek37DA7jrs>QChfhF^6k2Y&v!dk$*dsd$3PZF@kar`0~vyi~9LA7oB zMm8IwfN?-wTxTJGaX?*N!N(590rl^{Va#9#i5lwWt^?XE$-bYZV2(Sb3g);6uV9X+ zJJP|N&kZGmtvZpG3bs1eK_Zw}7L7D8@BA!DU?iD;QozV^N+p1iW-FtEk>|l9gRxXt zpn|d0?jVA(R)wK~vDX_Sfd#2#MF9&|BaHwSwE8|~u&Sy~!S8j570k4IlN&=~1KaGz zkO;w!X_`KmHva&5k=#ATB4}a&001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(Qrc nZ!T$VVP|D7P)Z)9b1s0M%T00000NkvXXu0mjf${OgN literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/RightButton.imageset/right-2.png b/Limelight/Images.xcassets/RightButton.imageset/right-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c717a8dcbc939499c07c0ce4984ac0367cfa249d GIT binary patch literal 549 zcmV+=0^0qFP)002D*1^@s6(3B4)k5B~-4wi)$4wmf^_9Q_;;en9`2lohrTMQyiQ@h&nom2ns zB3-cclVdyfos(pv=W%}Ox<21=98F|dc9@&GOBBj3%Cdaf1S~eFC5obWRw##1sC&ag zfC_?z0>zGn1jUMl2E~Sj2*rYh3Pp~E3`L5C4n>9~0g41m3Y0gNBq%Q|X;7=NBtosi zk_zRFB^k;IOFEP_mO@!#DU>CaLRn%dlqFW|P<`KjbY1t}G|ek37DA7jrs>QChfhF^6k2Y&v!dk$*dsd$3PZF@kar`0~vyi~9LA7oB zMm8IwfN?-wTxTJGaX?*N!N(590rl^{Va#9#i5lwWt^?XE$-bYZV2(Sb3g);6uV9X+ zJJP|N&kZGmtvZpG3bs1eK_Zw}7L7D8@BA!DU?iD;QozV^N+p1iW-FtEk>|l9gRxXt zpn|d0?jVA(R)wK~vDX_Sfd#2#MF9&|BaHwSwE8|~u&Sy~!S8j570k4IlN&=~1KaGz zkO;w!X_`KmHva&5k=#ATB4}a&001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(Qrc nZ!T$VVP|D7P)Z)9b1s0M%T00000NkvXXu0mjf${OgN literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/RightButton.imageset/right.png b/Limelight/Images.xcassets/RightButton.imageset/right.png new file mode 100644 index 0000000000000000000000000000000000000000..c717a8dcbc939499c07c0ce4984ac0367cfa249d GIT binary patch literal 549 zcmV+=0^0qFP)002D*1^@s6(3B4)k5B~-4wi)$4wmf^_9Q_;;en9`2lohrTMQyiQ@h&nom2ns zB3-cclVdyfos(pv=W%}Ox<21=98F|dc9@&GOBBj3%Cdaf1S~eFC5obWRw##1sC&ag zfC_?z0>zGn1jUMl2E~Sj2*rYh3Pp~E3`L5C4n>9~0g41m3Y0gNBq%Q|X;7=NBtosi zk_zRFB^k;IOFEP_mO@!#DU>CaLRn%dlqFW|P<`KjbY1t}G|ek37DA7jrs>QChfhF^6k2Y&v!dk$*dsd$3PZF@kar`0~vyi~9LA7oB zMm8IwfN?-wTxTJGaX?*N!N(590rl^{Va#9#i5lwWt^?XE$-bYZV2(Sb3g);6uV9X+ zJJP|N&kZGmtvZpG3bs1eK_Zw}7L7D8@BA!DU?iD;QozV^N+p1iW-FtEk>|l9gRxXt zpn|d0?jVA(R)wK~vDX_Sfd#2#MF9&|BaHwSwE8|~u&Sy~!S8j570k4IlN&=~1KaGz zkO;w!X_`KmHva&5k=#ATB4}a&001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Qa(Qrc nZ!T$VVP|D7P)Z)9b1s0M%T00000NkvXXu0mjf${OgN literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/UpButton.imageset/Contents.json b/Limelight/Images.xcassets/UpButton.imageset/Contents.json new file mode 100644 index 00000000..523b6d71 --- /dev/null +++ b/Limelight/Images.xcassets/UpButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "up-1.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "up.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "up-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/UpButton.imageset/up-1.png b/Limelight/Images.xcassets/UpButton.imageset/up-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b194ede9056d6d1af9d5daaf42d9c1658e1463 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^wm|H|!3HGn$?WfCU|JB!TyS9Kg%T?l z%wG00ifd4KzuHOvTvVNlju@mP_g#a;=Y&dpB>Zv5Z;HlzK1!`8#{Oio^_`54>^oi^(RZ>symCA`ta37Ec+;7S58gbu@L|${g%2Jb z*!M8$;Jycs4z7E6u_5;0VrKbPckX-K{c?Lm*RkypTgSJDC7ipCC7gd>n>zEh$-ak6 zzvj2vTliML`iUdT1k0gQ7S`HrCw4_ett?yrCxGTWkE^4US@7$da52U env6_b^OEyZQj1ow)xQI3WbkzLb6Mw<&;$U09KP-V literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/UpButton.imageset/up-2.png b/Limelight/Images.xcassets/UpButton.imageset/up-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b194ede9056d6d1af9d5daaf42d9c1658e1463 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^wm|H|!3HGn$?WfCU|JB!TyS9Kg%T?l z%wG00ifd4KzuHOvTvVNlju@mP_g#a;=Y&dpB>Zv5Z;HlzK1!`8#{Oio^_`54>^oi^(RZ>symCA`ta37Ec+;7S58gbu@L|${g%2Jb z*!M8$;Jycs4z7E6u_5;0VrKbPckX-K{c?Lm*RkypTgSJDC7ipCC7gd>n>zEh$-ak6 zzvj2vTliML`iUdT1k0gQ7S`HrCw4_ett?yrCxGTWkE^4US@7$da52U env6_b^OEyZQj1ow)xQI3WbkzLb6Mw<&;$U09KP-V literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/UpButton.imageset/up.png b/Limelight/Images.xcassets/UpButton.imageset/up.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b194ede9056d6d1af9d5daaf42d9c1658e1463 GIT binary patch literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^wm|H|!3HGn$?WfCU|JB!TyS9Kg%T?l z%wG00ifd4KzuHOvTvVNlju@mP_g#a;=Y&dpB>Zv5Z;HlzK1!`8#{Oio^_`54>^oi^(RZ>symCA`ta37Ec+;7S58gbu@L|${g%2Jb z*!M8$;Jycs4z7E6u_5;0VrKbPckX-K{c?Lm*RkypTgSJDC7ipCC7gd>n>zEh$-ak6 zzvj2vTliML`iUdT1k0gQ7S`HrCw4_ett?yrCxGTWkE^4US@7$da52U env6_b^OEyZQj1ow)xQI3WbkzLb6Mw<&;$U09KP-V literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/XButton.imageset/Contents.json b/Limelight/Images.xcassets/XButton.imageset/Contents.json new file mode 100644 index 00000000..82e66ef9 --- /dev/null +++ b/Limelight/Images.xcassets/XButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x", + "filename" : "x_button-1.png" + }, + { + "idiom" : "universal", + "scale" : "2x", + "filename" : "x_button.png" + }, + { + "idiom" : "universal", + "scale" : "3x", + "filename" : "x_button-2.png" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Limelight/Images.xcassets/XButton.imageset/x_button-1.png b/Limelight/Images.xcassets/XButton.imageset/x_button-1.png new file mode 100644 index 0000000000000000000000000000000000000000..125ce38ef01f1a282ea8f9721efac9840d337898 GIT binary patch literal 1078 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 literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/YButton.imageset/y_button-2.png b/Limelight/Images.xcassets/YButton.imageset/y_button-2.png new file mode 100644 index 0000000000000000000000000000000000000000..626f2240e2f1c14d2168ff166e4304228d24f6f0 GIT binary patch literal 969 zcmV;)12+7LP)vR&YN$FLDH^HNY1LRYJe3X& zc5KV5+*4;YZBpBL&-SzQROv2FobR6f?DwAEMG<04lH@i`(>NE=YPIh3&#a8VwY^?1 zh3~>WqEH&VEWCK9(|MhLKIQ=4nh>~`yk{E6@r_r|;DvHYr_+yd=2}2cIC#x4-$St z3IK=0;RhAad_G^CoBPN(TB$4xz?v38Qh&Z&F27RgcSLDzrGi?mR^M`1E27#*58x?S zY8#KopBP}pWzC`e&KtG?M&HzhFzu$l7g7)nJQcMna z1t72^nStPt24*CEfvy1D`vfV5G9A)DK{6WW3c!7I4%4CPI>48#eg>%F(&wO(fuItH zH8sPU99TDyrNyZo8mS#Tj18pwLdq7yDJO-gz9Ao~F>?5ZjfrN8FKeNJqhEYN$-s#v zPByQQTz=-X(j!AV@;qNt8-d{|UY9El9P&`EI&}Herp75vu9sk`Zi271Vrs1+6ADDD z1$cZb`Gise%GWuu)*@uSK}4zGCjE!bFL59^gj&&(dfCql&H);gez^pw!6LNYlrO>5 zMv8%YaE6l8x(j>gm;y-Wz!k(qMIkiMOaOZL zHyBl*%4;)O-aWxA@%|687>({z<31t)001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Q ra(QrcZ!T$VVP|D7P)Z)9b1s0M%T00000NkvXXu0mjfrXRk_ literal 0 HcmV?d00001 diff --git a/Limelight/Images.xcassets/YButton.imageset/y_button.png b/Limelight/Images.xcassets/YButton.imageset/y_button.png new file mode 100644 index 0000000000000000000000000000000000000000..626f2240e2f1c14d2168ff166e4304228d24f6f0 GIT binary patch literal 969 zcmV;)12+7LP)vR&YN$FLDH^HNY1LRYJe3X& zc5KV5+*4;YZBpBL&-SzQROv2FobR6f?DwAEMG<04lH@i`(>NE=YPIh3&#a8VwY^?1 zh3~>WqEH&VEWCK9(|MhLKIQ=4nh>~`yk{E6@r_r|;DvHYr_+yd=2}2cIC#x4-$St z3IK=0;RhAad_G^CoBPN(TB$4xz?v38Qh&Z&F27RgcSLDzrGi?mR^M`1E27#*58x?S zY8#KopBP}pWzC`e&KtG?M&HzhFzu$l7g7)nJQcMna z1t72^nStPt24*CEfvy1D`vfV5G9A)DK{6WW3c!7I4%4CPI>48#eg>%F(&wO(fuItH zH8sPU99TDyrNyZo8mS#Tj18pwLdq7yDJO-gz9Ao~F>?5ZjfrN8FKeNJqhEYN$-s#v zPByQQTz=-X(j!AV@;qNt8-d{|UY9El9P&`EI&}Herp75vu9sk`Zi271Vrs1+6ADDD z1$cZb`Gise%GWuu)*@uSK}4zGCjE!bFL59^gj&&(dfCql&H);gez^pw!6LNYlrO>5 zMv8%YaE6l8x(j>gm;y-Wz!k(qMIkiMOaOZL zHyBl*%4;)O-aWxA@%|687>({z<31t)001p?MObuGZ)S9NVRB^vVtFoNY;SL5WO*)Q ra(QrcZ!T$VVP|D7P)Z)9b1s0M%T00000NkvXXu0mjfrXRk_ literal 0 HcmV?d00001 diff --git a/Limelight/Input/OnScreenControls.h b/Limelight/Input/OnScreenControls.h new file mode 100644 index 00000000..f9618689 --- /dev/null +++ b/Limelight/Input/OnScreenControls.h @@ -0,0 +1,16 @@ +// +// OnScreenControls.h +// Limelight +// +// Created by Diego Waxemberg on 12/28/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import + +@interface OnScreenControls : NSObject + +- (id) initWithView:(UIView*)view; +- (void) handleTouchDownEvent:(UIEvent*)event; +- (void) handleTouchUpEvent:(UIEvent*) event; +@end diff --git a/Limelight/Input/OnScreenControls.m b/Limelight/Input/OnScreenControls.m new file mode 100644 index 00000000..8104d1b2 --- /dev/null +++ b/Limelight/Input/OnScreenControls.m @@ -0,0 +1,193 @@ +// +// OnScreenControls.m +// Limelight +// +// Created by Diego Waxemberg on 12/28/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "OnScreenControls.h" +#include "Limelight.h" + +#define UPDATE_BUTTON(x, y) (buttonFlags = \ +(y) ? (buttonFlags | (x)) : (buttonFlags & ~(x))) + +@implementation OnScreenControls { + UIView* _view; + BOOL shouldDrawControls; + CALayer* _aButton; + CALayer* _bButton; + CALayer* _xButton; + CALayer* _yButton; + CALayer* _upButton; + CALayer* _downButton; + CALayer* _leftButton; + CALayer* _rightButton; + + short buttonFlags; + short leftStickX, leftStickY; + short rightStickX, rightStickY; + char leftTrigger, rightTrigger; +} + +static const float BUTTON_SIZE = 50; +static const float BUTTON_DIST = 20; +static float BUTTON_CENTER_X; +static float BUTTON_CENTER_Y; + +static const float D_PAD_SHORT = 50; +static const float D_PAD_LONG = 65; +static const float D_PAD_DIST = 15; +static float D_PAD_CENTER_X; +static float D_PAD_CENTER_Y; + +- (id) initWithView:(UIView*)view { + self = [self init]; + _view = view; + shouldDrawControls = YES; + + D_PAD_CENTER_X = _view.frame.size.width * .15; + D_PAD_CENTER_Y = _view.frame.size.height * .75; + BUTTON_CENTER_X = _view.frame.size.width * .85; + BUTTON_CENTER_Y = _view.frame.size.height * .75; + + [self drawButtons]; + return self; +} + +- (void) drawButtons { + // create A button + _aButton = [CALayer layer]; + _aButton.frame = CGRectMake(BUTTON_CENTER_X - BUTTON_SIZE / 2, BUTTON_CENTER_Y + BUTTON_DIST, BUTTON_SIZE, BUTTON_SIZE); + _aButton.contents = (id) [UIImage imageNamed:@"AButton"].CGImage; + [_view.layer addSublayer:_aButton]; + + // create B button + _bButton = [CALayer layer]; + _bButton.frame = CGRectMake(BUTTON_CENTER_X + BUTTON_DIST, BUTTON_CENTER_Y - BUTTON_SIZE / 2, BUTTON_SIZE, BUTTON_SIZE); + _bButton.contents = (id) [UIImage imageNamed:@"BButton"].CGImage; + [_view.layer addSublayer:_bButton]; + + // create X Button + _xButton = [CALayer layer]; + _xButton.frame = CGRectMake(BUTTON_CENTER_X - BUTTON_DIST - BUTTON_SIZE, BUTTON_CENTER_Y - BUTTON_SIZE / 2, BUTTON_SIZE, BUTTON_SIZE); + _xButton.contents = (id) [UIImage imageNamed:@"XButton"].CGImage; + [_view.layer addSublayer:_xButton]; + + // create Y Button + _yButton = [CALayer layer]; + _yButton.frame = CGRectMake(BUTTON_CENTER_X - BUTTON_SIZE / 2, BUTTON_CENTER_Y - BUTTON_DIST - BUTTON_SIZE, BUTTON_SIZE, BUTTON_SIZE); + _yButton.contents = (id) [UIImage imageNamed:@"YButton"].CGImage; + [_view.layer addSublayer:_yButton]; + + // create Down button + _downButton = [CALayer layer]; + _downButton.frame = CGRectMake(D_PAD_CENTER_X - D_PAD_SHORT / 2, D_PAD_CENTER_Y + D_PAD_DIST, D_PAD_SHORT, D_PAD_LONG); + _downButton.contents = (id) [UIImage imageNamed:@"DownButton"].CGImage; + [_view.layer addSublayer:_downButton]; + + // create Right button + _rightButton = [CALayer layer]; + _rightButton.frame = CGRectMake(D_PAD_CENTER_X + D_PAD_DIST, D_PAD_CENTER_Y - D_PAD_SHORT / 2, D_PAD_LONG, D_PAD_SHORT); + _rightButton.contents = (id) [UIImage imageNamed:@"RightButton"].CGImage; + [_view.layer addSublayer:_rightButton]; + + // create Up button + _upButton = [CALayer layer]; + _upButton.frame = CGRectMake(D_PAD_CENTER_X - D_PAD_SHORT / 2, D_PAD_CENTER_Y - D_PAD_DIST - D_PAD_LONG, D_PAD_SHORT, D_PAD_LONG); + _upButton.contents = (id) [UIImage imageNamed:@"UpButton"].CGImage; + [_view.layer addSublayer:_upButton]; + + // create Left button + _leftButton = [CALayer layer]; + _leftButton.frame = CGRectMake(D_PAD_CENTER_X - D_PAD_DIST - D_PAD_LONG, D_PAD_CENTER_Y - D_PAD_SHORT / 2, D_PAD_LONG, D_PAD_SHORT); + _leftButton.contents = (id) [UIImage imageNamed:@"LeftButton"].CGImage; + [_view.layer addSublayer:_leftButton]; +} + +- (void)handleTouchDownEvent:(UIEvent*)event { + for (UITouch* touch in [event allTouches]) { + CGPoint touchLocation = [touch locationInView:_view]; + + if ([_aButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(A_FLAG, 1); + } else if ([_bButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(B_FLAG, 1); + } else if ([_xButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(X_FLAG, 1); + } else if ([_yButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(Y_FLAG, 1); + } else if ([_upButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(UP_FLAG, 1); + } else if ([_downButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(DOWN_FLAG, 1); + } else if ([_leftButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(LEFT_FLAG, 1); + } else if ([_rightButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(RIGHT_FLAG, 1); + } + /* + + UPDATE_BUTTON(LB_FLAG, gamepad.leftShoulder.pressed); + UPDATE_BUTTON(RB_FLAG, gamepad.rightShoulder.pressed); + + leftStickX = gamepad.leftThumbstick.xAxis.value * 0x7FFE; + leftStickY = gamepad.leftThumbstick.yAxis.value * 0x7FFE; + + rightStickX = gamepad.rightThumbstick.xAxis.value * 0x7FFE; + rightStickY = gamepad.rightThumbstick.yAxis.value * 0x7FFE; + + leftTrigger = gamepad.leftTrigger.value * 0xFF; + rightTrigger = gamepad.rightTrigger.value * 0xFF; + */ + // We call LiSendControllerEvent while holding a lock to prevent + // multiple simultaneous calls since this function isn't thread safe. + } + LiSendControllerEvent(buttonFlags, leftTrigger, rightTrigger, + leftStickX, leftStickY, rightStickX, rightStickY); +} + +- (void)handleTouchUpEvent:(UIEvent*)event { + + for (UITouch* touch in [event allTouches]) { + CGPoint touchLocation = [touch locationInView:_view]; + + if ([_aButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(A_FLAG, 0); + } else if ([_bButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(B_FLAG, 0); + } else if ([_xButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(X_FLAG, 0); + } else if ([_yButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(Y_FLAG, 0); + } else if ([_upButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(UP_FLAG, 0); + } else if ([_downButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(DOWN_FLAG, 0); + } else if ([_leftButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(LEFT_FLAG, 0); + } else if ([_rightButton.presentationLayer hitTest:touchLocation]) { + UPDATE_BUTTON(RIGHT_FLAG, 0); + } + /* + UPDATE_BUTTON(LB_FLAG, gamepad.leftShoulder.pressed); + UPDATE_BUTTON(RB_FLAG, gamepad.rightShoulder.pressed); + + leftStickX = gamepad.leftThumbstick.xAxis.value * 0x7FFE; + leftStickY = gamepad.leftThumbstick.yAxis.value * 0x7FFE; + + rightStickX = gamepad.rightThumbstick.xAxis.value * 0x7FFE; + rightStickY = gamepad.rightThumbstick.yAxis.value * 0x7FFE; + + leftTrigger = gamepad.leftTrigger.value * 0xFF; + rightTrigger = gamepad.rightTrigger.value * 0xFF; + */ + // We call LiSendControllerEvent while holding a lock to prevent + // multiple simultaneous calls since this function isn't thread safe. + } + LiSendControllerEvent(buttonFlags, leftTrigger, rightTrigger, + leftStickX, leftStickY, rightStickX, rightStickY); +} + + +@end diff --git a/Limelight/Input/StreamView.h b/Limelight/Input/StreamView.h index b722ed91..a7aa4e5f 100644 --- a/Limelight/Input/StreamView.h +++ b/Limelight/Input/StreamView.h @@ -10,4 +10,6 @@ @interface StreamView : UIView +- (void) setupOnScreenControls; + @end diff --git a/Limelight/Input/StreamView.m b/Limelight/Input/StreamView.m index 905d84d3..748ed989 100644 --- a/Limelight/Input/StreamView.m +++ b/Limelight/Input/StreamView.m @@ -8,17 +8,23 @@ #import "StreamView.h" #include +#import "OnScreenControls.h" @implementation StreamView { CGPoint touchLocation; BOOL touchMoved; + OnScreenControls* onScreenControls; +} + +- (void) setupOnScreenControls { + onScreenControls = [[OnScreenControls alloc] initWithView:self]; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; touchLocation = [touch locationInView:self]; touchMoved = false; - + [onScreenControls handleTouchDownEvent:event]; NSLog(@"Touch down"); } @@ -53,8 +59,7 @@ - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"Touch up"); - - + [onScreenControls handleTouchUpEvent:event]; if (!touchMoved) { if ([[event allTouches] count] == 2) { NSLog(@"Sending right mouse button press"); diff --git a/Limelight/Stream/StreamManager.m b/Limelight/Stream/StreamManager.m index bc648009..8ccc07c5 100644 --- a/Limelight/Stream/StreamManager.m +++ b/Limelight/Stream/StreamManager.m @@ -10,6 +10,7 @@ #import "CryptoManager.h" #import "HttpManager.h" #import "Utils.h" +#import "OnScreenControls.h" @implementation StreamManager { StreamConfiguration* _config; diff --git a/Limelight/ViewControllers/StreamFrameViewController.m b/Limelight/ViewControllers/StreamFrameViewController.m index 30c315ad..20b9ebe6 100644 --- a/Limelight/ViewControllers/StreamFrameViewController.m +++ b/Limelight/ViewControllers/StreamFrameViewController.m @@ -11,6 +11,7 @@ #import "VideoDecoderRenderer.h" #import "StreamManager.h" #import "ControllerSupport.h" +#import "StreamView.h" #include #include @@ -63,6 +64,7 @@ [self.stageLabel setText:@"Waiting for first frame..."]; [self.stageLabel sizeToFit]; }); + [(StreamView*)self.view setupOnScreenControls]; } - (void)connectionTerminated:(long)errorCode {