From 9773aa31d869ed36c8f2580b25d616d61581afb4 Mon Sep 17 00:00:00 2001 From: lukeIam Date: Sun, 9 Nov 2014 21:29:15 +0100 Subject: [PATCH 1/3] Reactivated and modified text field for keyboard --- ServerLib/CServer.cs | 1 + ServerLib/CWebservice.cs | 17 ++++++ ServerLib/DataStructs.cs | 1 + ServerLib/ICWebservice.cs | 5 ++ Vocaluxe/Base/Server/CVocaluxeServer.cs | 26 +++++++++ Vocaluxe/Website/index.html | 4 +- Vocaluxe/Website/js/main.js | 74 +++++++++++++------------ 7 files changed, 91 insertions(+), 37 deletions(-) diff --git a/ServerLib/CServer.cs b/ServerLib/CServer.cs index e4c46301..b085e2c1 100644 --- a/ServerLib/CServer.cs +++ b/ServerLib/CServer.cs @@ -33,6 +33,7 @@ namespace ServerLib private bool _Encrypted; public static SendKeyEventDelegate SendKeyEvent { internal get; set; } + public static SendKeyStringEventDelegate SendKeyStringEvent { internal get; set; } #region profile public static GetProfileDataDelegate GetProfileData { internal get; set; } diff --git a/ServerLib/CWebservice.cs b/ServerLib/CWebservice.cs index 97a8962c..7aaeb4e4 100644 --- a/ServerLib/CWebservice.cs +++ b/ServerLib/CWebservice.cs @@ -58,6 +58,23 @@ namespace ServerLib CServer.SendKeyEvent(key); } + public void SendKeyStringEvent(string keyString) + { + if (!_CheckRight(EUserRights.UseKeyboard)) + return; + + if (CServer.SendKeyStringEvent == null) + { + if (WebOperationContext.Current != null) + { + WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotFound; + WebOperationContext.Current.OutgoingResponse.StatusDescription = "Not found"; + } + } + else + CServer.SendKeyStringEvent(keyString); + } + #region profile public int GetOwnProfileId() { diff --git a/ServerLib/DataStructs.cs b/ServerLib/DataStructs.cs index 4d4bbed7..4ca7a0b7 100644 --- a/ServerLib/DataStructs.cs +++ b/ServerLib/DataStructs.cs @@ -26,6 +26,7 @@ using System.Text.RegularExpressions; namespace ServerLib { public delegate bool SendKeyEventDelegate(string key); + public delegate bool SendKeyStringEventDelegate(string keyString); #region profile public delegate SProfileData GetProfileDataDelegate(int profileId, bool isReadonly); diff --git a/ServerLib/ICWebservice.cs b/ServerLib/ICWebservice.cs index 0305e418..e4eeb0c3 100644 --- a/ServerLib/ICWebservice.cs +++ b/ServerLib/ICWebservice.cs @@ -30,6 +30,11 @@ namespace ServerLib UriTemplate = "/sendKeyEvent?key={key}")] void SendKeyEvent(string key); + [OperationContract, WebInvoke(Method = "GET", + ResponseFormat = WebMessageFormat.Json, + UriTemplate = "/sendKeyStringEvent?keyString={keyString}")] + void SendKeyStringEvent(string keyString); + #region profile [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, diff --git a/Vocaluxe/Base/Server/CVocaluxeServer.cs b/Vocaluxe/Base/Server/CVocaluxeServer.cs index e0afa162..2b58c726 100644 --- a/Vocaluxe/Base/Server/CVocaluxeServer.cs +++ b/Vocaluxe/Base/Server/CVocaluxeServer.cs @@ -64,6 +64,7 @@ namespace Vocaluxe.Base.Server _Server = new CServer(CConfig.ServerPort, CConfig.ServerEncryption == EOffOn.TR_CONFIG_ON); CServer.SendKeyEvent = _SendKeyEvent; + CServer.SendKeyStringEvent = _sendKeyStringEvent; CServer.GetProfileData = _GetProfileData; CServer.SendProfileData = _SendProfileData; CServer.GetProfileList = _GetProfileList; @@ -186,6 +187,31 @@ namespace Vocaluxe.Base.Server return result; } + private static bool _sendKeyStringEvent(string keyString) + { + bool result = false; + + foreach (var key in keyString.ToCharArray()) + { + Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, Char.IsUpper(key), false, false, key, _ParseKeys(key))); + result = true; + } + + return result; + } + + private static Keys _ParseKeys(char keyText) + { + Keys key; + + if (!Enum.TryParse(keyText.ToString(), true, out key)) + { + key = Keys.None; + } + + return key; + } + #region profile private static SProfileData _GetProfileData(int profileId, bool isReadonly) { diff --git a/Vocaluxe/Website/index.html b/Vocaluxe/Website/index.html index 0501220f..dbe2b538 100644 --- a/Vocaluxe/Website/index.html +++ b/Vocaluxe/Website/index.html @@ -301,10 +301,10 @@ P - + diff --git a/Vocaluxe/Website/js/main.js b/Vocaluxe/Website/js/main.js index 7d02e068..96cab4b9 100644 --- a/Vocaluxe/Website/js/main.js +++ b/Vocaluxe/Website/js/main.js @@ -26,11 +26,11 @@ function preStart() { translator.translationLoaded.done(function () { translator.translate(); - + sessionHandler = new SessionHandler(); imageLoader = new ImageLoader(); externalServices = new ExternalServices(); - pageHandler = new PageHandler(); + pageHandler = new PageHandler(); pageHandler.init(); }); @@ -154,7 +154,7 @@ } }; } - + function ExternalServices() { var popupVideoHeight = 390; var popupVideoWidth = 640; @@ -190,7 +190,7 @@ 'height': h - (ifrPadding + ifrBorder) }; } - + $("#popupVideo").find("a").click(function () { $("#popupVideo").popup("close"); $("#popupVideo").popup("close"); //Sometimes twice?? @@ -316,9 +316,9 @@ }; this.reset = function () { - this.customSelectPlaylistSongCallback = null; - this.profileIdRequest = -1; - this.songIdRequest = -1; + this.customSelectPlaylistSongCallback = null; + this.profileIdRequest = -1; + this.songIdRequest = -1; }; var replaceTransitionHandler = function () { @@ -693,17 +693,21 @@ }); $('#keyboardButtonKeys').keyup(function (e) { - var c = String.fromCharCode(e.keyCode); - if (c.match(/\w/)) { - c = e.keyCode >= 65 ? c.toLowerCase() : c; - request({ - url: "sendKeyEvent?key=" + c - }); - } - var oldText = $('#keyboardButtonKeys')[0].value; - if (oldText.length > 0) { - $('#keyboardButtonKeys')[0].value = oldText.slice(1); + var text = $('#keyboardButtonKeys')[0].value; + + $('#keyboardButtonKeys')[0].value = ""; + if (text.length <= 0) { + return; } + + request({ + contentType: "application/json;charset=utf-8", + type: "GET", + url: "sendKeyStringEvent?keyString=" + text + }).fail(function () { + $('#keyboardButtonKeys')[0].value = text + $('#keyboardButtonKeys')[0].value; + }); + }); }; @@ -812,7 +816,7 @@ } }; - var handleDisplayProfileData = function(data) { + var handleDisplayProfileData = function (data) { $('#playerName').prop("value", data.PlayerName); imageLoader.addImage($('#playerAvatar')[0], data.Avatar, "img/profile.png"); @@ -829,19 +833,19 @@ $('#playerPassword').prop('disabled', false).prop("value", "***__oldPassword__***").parent().show(); $('#playerPasswordLabel').show(); - $('#playerAvatar').click(function() { + $('#playerAvatar').click(function () { if ($('#captureContainer').length > 0) { $('#captureContainer').remove(); } if (document.location.protocol == "file:" - && typeof(navigator) != 'undefined' - && typeof(navigator.camera) != 'undefined' - && typeof(navigator.camera.getPicture) != 'undefined') { - navigator.camera.getPicture(function(imageData) { + && typeof (navigator) != 'undefined' + && typeof (navigator.camera) != 'undefined' + && typeof (navigator.camera.getPicture) != 'undefined') { + navigator.camera.getPicture(function (imageData) { $('#playerAvatar').prop("src", "data:image/jpeg;base64," + imageData); $('#playerAvatar').data("changed", true); - }, function() { + }, function () { //Fail - do nothing }, { destinationType: navigator.camera.DestinationType.DATA_URL, @@ -854,11 +858,11 @@ } else { $(document.body).append('
'); - $('#capture').change(function(eventData) { + $('#capture').change(function (eventData) { if (eventData && eventData.target && eventData.target.files && eventData.target.files.length == 1) { var file = eventData.target.files[0]; var reader = new FileReader(); - reader.onloadend = function(e) { + reader.onloadend = function (e) { $('#playerAvatar').prop("src", e.target.result); $('#playerAvatar').data("changed", true); $('#captureContainer').remove(); @@ -1358,25 +1362,25 @@ this.sessionId = ""; this.serverBaseAddress = ""; - var init = function() { + var init = function () { initHeartbeat(); }; this.logout = function () { this.ownProfileId = -1; - + this.sessionId = ""; - - pageHandler.reset(); + + pageHandler.reset(); if (window.localStorage) { window.localStorage.setItem("VocaluxeSessionKey", ""); } $.mobile.changePage("#login", { transition: "slidefade" }); }; - - - var checkSession = function() { + + + var checkSession = function () { if (ownProfileId == -1 && profileIdRequest == -1 && ($.mobile.activePage.attr("id") == "displayProfile" || $.mobile.activePage.attr("id") == "login" || $.mobile.activePage.attr("id") == "discover")) { @@ -1393,10 +1397,10 @@ }); }; - var initHeartbeat = function() { + var initHeartbeat = function () { setInterval(checkSession, 20000); }; - + init(); } From 53153774b7680aa9929932057ef6b0e7b52848a4 Mon Sep 17 00:00:00 2001 From: lukeIam Date: Sun, 9 Nov 2014 21:54:52 +0100 Subject: [PATCH 2/3] Fixed: remote keyboard not working in input fields --- Vocaluxe/Base/Server/CVocaluxeServer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Vocaluxe/Base/Server/CVocaluxeServer.cs b/Vocaluxe/Base/Server/CVocaluxeServer.cs index 2b58c726..f2b22b45 100644 --- a/Vocaluxe/Base/Server/CVocaluxeServer.cs +++ b/Vocaluxe/Base/Server/CVocaluxeServer.cs @@ -193,7 +193,7 @@ namespace Vocaluxe.Base.Server foreach (var key in keyString.ToCharArray()) { - Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, Char.IsUpper(key), false, false, key, _ParseKeys(key))); + Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, Char.IsUpper(key), false, true, key, _ParseKeys(key))); result = true; } From e10de6ca0ef877b4ae3e540b150ca8a9d90dd4d0 Mon Sep 17 00:00:00 2001 From: lukeIam Date: Tue, 11 Nov 2014 22:05:43 +0100 Subject: [PATCH 3/3] Added backspace and Alt, Shift, Ctrl to the remote keyboard --- ServerLib/CWebservice.cs | 4 +- ServerLib/DataStructs.cs | 2 +- ServerLib/ICWebservice.cs | 4 +- Vocaluxe/Base/Server/CVocaluxeServer.cs | 53 +++++++++++++++---------- Vocaluxe/Website/index.html | 19 ++++++++- Vocaluxe/Website/js/main.js | 21 +++++++++- Vocaluxe/Website/locales/de.json | 7 +++- Vocaluxe/Website/locales/en.json | 7 +++- 8 files changed, 86 insertions(+), 31 deletions(-) diff --git a/ServerLib/CWebservice.cs b/ServerLib/CWebservice.cs index 7aaeb4e4..dbd27e1f 100644 --- a/ServerLib/CWebservice.cs +++ b/ServerLib/CWebservice.cs @@ -58,7 +58,7 @@ namespace ServerLib CServer.SendKeyEvent(key); } - public void SendKeyStringEvent(string keyString) + public void SendKeyStringEvent(string keyString, bool isShiftPressed = false, bool isAltPressed = false, bool isCtrlPressed = false) { if (!_CheckRight(EUserRights.UseKeyboard)) return; @@ -72,7 +72,7 @@ namespace ServerLib } } else - CServer.SendKeyStringEvent(keyString); + CServer.SendKeyStringEvent(keyString, isShiftPressed, isAltPressed, isCtrlPressed); } #region profile diff --git a/ServerLib/DataStructs.cs b/ServerLib/DataStructs.cs index 4ca7a0b7..5b87398b 100644 --- a/ServerLib/DataStructs.cs +++ b/ServerLib/DataStructs.cs @@ -26,7 +26,7 @@ using System.Text.RegularExpressions; namespace ServerLib { public delegate bool SendKeyEventDelegate(string key); - public delegate bool SendKeyStringEventDelegate(string keyString); + public delegate bool SendKeyStringEventDelegate(string keyString, bool isShiftPressed , bool isAltPressed , bool isCtrlPressed); #region profile public delegate SProfileData GetProfileDataDelegate(int profileId, bool isReadonly); diff --git a/ServerLib/ICWebservice.cs b/ServerLib/ICWebservice.cs index e4eeb0c3..acb24799 100644 --- a/ServerLib/ICWebservice.cs +++ b/ServerLib/ICWebservice.cs @@ -32,8 +32,8 @@ namespace ServerLib [OperationContract, WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, - UriTemplate = "/sendKeyStringEvent?keyString={keyString}")] - void SendKeyStringEvent(string keyString); + UriTemplate = "/sendKeyStringEvent?keyString={keyString}&shift={isShiftPressed}&alt={isAltPressed}&ctrl={isCtrlPressed}")] + void SendKeyStringEvent(string keyString, bool isShiftPressed = false, bool isAltPressed = false, bool isCtrlPressed = false); #region profile [OperationContract, WebInvoke(Method = "GET", diff --git a/Vocaluxe/Base/Server/CVocaluxeServer.cs b/Vocaluxe/Base/Server/CVocaluxeServer.cs index f2b22b45..d882881e 100644 --- a/Vocaluxe/Base/Server/CVocaluxeServer.cs +++ b/Vocaluxe/Base/Server/CVocaluxeServer.cs @@ -126,9 +126,11 @@ namespace Vocaluxe.Base.Server private static bool _SendKeyEvent(string key) { bool result = false; - if (!string.IsNullOrEmpty(key)) + var lowerKey = key.ToLower(); + + if (!string.IsNullOrEmpty(lowerKey)) { - switch (key.ToLower()) + switch (lowerKey) { case "up": Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, Keys.Up)); @@ -158,25 +160,22 @@ namespace Vocaluxe.Base.Server Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, Keys.Tab)); result = true; break; + case "backspace": + Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, Keys.Back)); + result = true; + break; default: - foreach (char c in key) + if (lowerKey.StartsWith("f")) { - bool shift = true; - char keyChar; - if (char.ToUpper(c) != c) - { - keyChar = char.ToUpper(c); - shift = false; - } - else - keyChar = c; + var numberString = lowerKey.Substring(1); + int number; + Keys fKey; - if ((keyChar >= '0' && keyChar <= '9') || (keyChar >= 'A' && keyChar <= 'Z')) + if (Int32.TryParse(numberString, out number) && number >= 1 + && number <= 12 + && Enum.TryParse("F" + number, true, out fKey)) { - Keys keys = (Keys)keyChar; - if (shift) - keys |= Keys.Shift; - Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, keys)); + Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, false, false, false, Char.MinValue, fKey)); result = true; } } @@ -187,13 +186,17 @@ namespace Vocaluxe.Base.Server return result; } - private static bool _sendKeyStringEvent(string keyString) + private static bool _sendKeyStringEvent(string keyString, bool isShiftPressed , bool isAltPressed , bool isCtrlPressed ) { bool result = false; - + foreach (var key in keyString.ToCharArray()) { - Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, false, Char.IsUpper(key), false, true, key, _ParseKeys(key))); + Controller.AddKeyEvent(new SKeyEvent(ESender.Keyboard, isAltPressed, + Char.IsUpper(key) || isShiftPressed, + isCtrlPressed, true, + isShiftPressed?Char.ToUpper(key) :key, + _ParseKeys(key))); result = true; } @@ -206,7 +209,15 @@ namespace Vocaluxe.Base.Server if (!Enum.TryParse(keyText.ToString(), true, out key)) { - key = Keys.None; + switch (keyText) + { + case ' ': + key = Keys.Space; + break; + default: + key = Keys.None; + break; + } } return key; diff --git a/Vocaluxe/Website/index.html b/Vocaluxe/Website/index.html index dbe2b538..fdb14c43 100644 --- a/Vocaluxe/Website/index.html +++ b/Vocaluxe/Website/index.html @@ -297,8 +297,25 @@
+
+ +
+
+
+ + + + + + +
+
- P +
diff --git a/Vocaluxe/Website/js/main.js b/Vocaluxe/Website/js/main.js index 96cab4b9..f7a69d9e 100644 --- a/Vocaluxe/Website/js/main.js +++ b/Vocaluxe/Website/js/main.js @@ -686,12 +686,13 @@ }); }); - $('#keyboardButtonP').click(function () { + $('#keyboardButtonBackspace').click(function () { request({ - url: "sendKeyEvent?key=p" + url: "sendKeyEvent?key=backspace" }); }); + $('#keyboardButtonKeys').keyup(function (e) { var text = $('#keyboardButtonKeys')[0].value; @@ -700,10 +701,26 @@ return; } + + /* if ($('#keyboardButtonFunct').is(':checked')) { + $('#keyboardButtonKeys')[0].value = text.splice(1) + $('#keyboardButtonKeys')[0].value; + var numericElements = /^[0-9][0-9]?/.exec(text.charAt(0)); + if (parseInt(numericElements)) { + request({ + url: "sendKeyEvent?key=F" + numericElements + }); + } + $("#keyboardButtonFunct").attr("checked", false).checkboxradio("refresh"); + }*/ + request({ contentType: "application/json;charset=utf-8", type: "GET", url: "sendKeyStringEvent?keyString=" + text + + "&shift=" + $('#keyboardButtonShift').is(':checked') + + "&alt=" + $('#keyboardButtonAlt').is(':checked') + + "&ctrl=" + $('#keyboardButtonCtrl').is(':checked') + }).fail(function () { $('#keyboardButtonKeys')[0].value = text + $('#keyboardButtonKeys')[0].value; }); diff --git a/Vocaluxe/Website/locales/de.json b/Vocaluxe/Website/locales/de.json index ddf85d71..7fc413c3 100644 --- a/Vocaluxe/Website/locales/de.json +++ b/Vocaluxe/Website/locales/de.json @@ -76,5 +76,10 @@ "discoverConnectServerAddress": "Serveradresse:", "discoverConnectButton": "Verbinden", "Checking...": "Prüfen...", - "timeout": "Zeitüberschreitung" + "timeout": "Zeitüberschreitung", + "keyboardButtonShift": "Umschalt", + "keyboardButtonAlt": "Alt", + "keyboardButtonCtrl": "Steuerung", + "keyboardButtonFunct": "Funktion", + "keyboardButtonBackspace": "Rücktaste" } \ No newline at end of file diff --git a/Vocaluxe/Website/locales/en.json b/Vocaluxe/Website/locales/en.json index c6b28fd0..4a7da86a 100644 --- a/Vocaluxe/Website/locales/en.json +++ b/Vocaluxe/Website/locales/en.json @@ -76,5 +76,10 @@ "discoverConnectServerAddress": "Serveraddress:", "discoverConnectButton": "Connect", "Checking...": "Checking...", - "timeout": "Timeout" + "timeout": "Timeout", + "keyboardButtonShift": "Shift", + "keyboardButtonAlt": "Alt", + "keyboardButtonCtrl": "Control", + "keyboardButtonFunct": "Function", + "keyboardButtonBackspace": "Backspace" } \ No newline at end of file