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..dbd27e1f 100644
--- a/ServerLib/CWebservice.cs
+++ b/ServerLib/CWebservice.cs
@@ -58,6 +58,23 @@ namespace ServerLib
CServer.SendKeyEvent(key);
}
+ public void SendKeyStringEvent(string keyString, bool isShiftPressed = false, bool isAltPressed = false, bool isCtrlPressed = false)
+ {
+ 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, isShiftPressed, isAltPressed, isCtrlPressed);
+ }
+
#region profile
public int GetOwnProfileId()
{
diff --git a/ServerLib/DataStructs.cs b/ServerLib/DataStructs.cs
index 4d4bbed7..5b87398b 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, 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 0305e418..acb24799 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}&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",
ResponseFormat = WebMessageFormat.Json,
diff --git a/Vocaluxe/Base/Server/CVocaluxeServer.cs b/Vocaluxe/Base/Server/CVocaluxeServer.cs
index e0afa162..d882881e 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;
@@ -125,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));
@@ -157,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;
}
}
@@ -186,6 +186,43 @@ namespace Vocaluxe.Base.Server
return result;
}
+ 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, isAltPressed,
+ Char.IsUpper(key) || isShiftPressed,
+ isCtrlPressed, true,
+ isShiftPressed?Char.ToUpper(key) :key,
+ _ParseKeys(key)));
+ result = true;
+ }
+
+ return result;
+ }
+
+ private static Keys _ParseKeys(char keyText)
+ {
+ Keys key;
+
+ if (!Enum.TryParse(keyText.ToString(), true, out key))
+ {
+ switch (keyText)
+ {
+ case ' ':
+ key = Keys.Space;
+ break;
+ default:
+ key = Keys.None;
+ break;
+ }
+ }
+
+ 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..3ef1620b 100644
--- a/Vocaluxe/Website/index.html
+++ b/Vocaluxe/Website/index.html
@@ -297,14 +297,36 @@
+
+
+
+
+
+
-
+
+
diff --git a/Vocaluxe/Website/js/main.js b/Vocaluxe/Website/js/main.js
index 7d02e068..814d253b 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??
@@ -300,6 +300,8 @@
var songPageHandler;
var playlistPageHandler;
+ var t = this;
+
this.customSelectPlaylistSongCallback = null;
this.profileIdRequest = -1;
this.songIdRequest = -1;
@@ -316,9 +318,9 @@
};
this.reset = function () {
- this.customSelectPlaylistSongCallback = null;
- this.profileIdRequest = -1;
- this.songIdRequest = -1;
+ t.customSelectPlaylistSongCallback = null;
+ t.profileIdRequest = -1;
+ t.songIdRequest = -1;
};
var replaceTransitionHandler = function () {
@@ -639,7 +641,6 @@
var KeyboardPageHandler = function () {
var init = function () {
-
initKeyboardPageHandler();
};
@@ -686,25 +687,64 @@
});
});
- $('#keyboardButtonP').click(function () {
+ $('#keyboardButtonBackspace').click(function () {
request({
- url: "sendKeyEvent?key=p"
+ url: "sendKeyEvent?key=backspace"
});
});
- $('#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);
+ $("#keyboardAutoSend").change(function () {
+ if ($('#keyboardAutoSend').is(':checked')) {
+ $('#keyboardButtonSend').hide();
+ } else {
+ $('#keyboardButtonSend').show();
}
});
+
+ $('#keyboardButtonSend').click(function () {
+ sendKeyboardText();
+ });
+
+ $('#keyboardButtonKeys').keyup(function (e) {
+ if (!$('#keyboardAutoSend').is(':checked') && e.keyCode != 13) {
+ return;
+ }
+ sendKeyboardText();
+ });
+
+ function sendKeyboardText() {
+ var text = $('#keyboardButtonKeys')[0].value;
+
+ if (text.length <= 0) {
+ return;
+ }
+
+ $('#keyboardButtonKeys')[0].value = "";
+ $('#keyboardButtonKeys').first().focus();
+
+ /* 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;
+ });
+ }
};
init();
@@ -812,7 +852,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 +869,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 +894,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,27 +1398,29 @@
this.sessionId = "";
this.serverBaseAddress = "";
- var init = function() {
+ var t = this;
+
+ var init = function () {
initHeartbeat();
};
this.logout = function () {
- this.ownProfileId = -1;
-
- this.sessionId = "";
-
- pageHandler.reset();
+ t.ownProfileId = -1;
+
+ t.sessionId = "";
+
+ pageHandler.reset();
if (window.localStorage) {
window.localStorage.setItem("VocaluxeSessionKey", "");
}
$.mobile.changePage("#login", { transition: "slidefade" });
};
-
-
- var checkSession = function() {
- if (ownProfileId == -1
- && profileIdRequest == -1
+
+
+ var checkSession = function () {
+ if (t.ownProfileId == -1
+ && pageHandler.profileIdRequest == -1
&& ($.mobile.activePage.attr("id") == "displayProfile" || $.mobile.activePage.attr("id") == "login" || $.mobile.activePage.attr("id") == "discover")) {
return;
}
@@ -1386,17 +1428,17 @@
url: "getOwnProfileId"
}, "noOverlay").done(function (result) {
if (result == -1) {
- this.logout();
+ t.logout();
}
}).fail(function (result) {
- this.logout();
+ t.logout();
});
};
- var initHeartbeat = function() {
+ var initHeartbeat = function () {
setInterval(checkSession, 20000);
};
-
+
init();
}
diff --git a/Vocaluxe/Website/locales/de.json b/Vocaluxe/Website/locales/de.json
index ddf85d71..d9f2420a 100644
--- a/Vocaluxe/Website/locales/de.json
+++ b/Vocaluxe/Website/locales/de.json
@@ -76,5 +76,11 @@
"discoverConnectServerAddress": "Serveradresse:",
"discoverConnectButton": "Verbinden",
"Checking...": "Prüfen...",
- "timeout": "Zeitüberschreitung"
+ "timeout": "Zeitüberschreitung",
+ "keyboardButtonShift": "Umschalt",
+ "keyboardButtonAlt": "Alt",
+ "keyboardButtonCtrl": "Steuerung",
+ "keyboardButtonBackspace": "Rücktaste",
+ "keyboardAutoSend": "Tasten autom. senden",
+ "keyboardButtonSend": "Senden"
}
\ No newline at end of file
diff --git a/Vocaluxe/Website/locales/en.json b/Vocaluxe/Website/locales/en.json
index c6b28fd0..308d01c1 100644
--- a/Vocaluxe/Website/locales/en.json
+++ b/Vocaluxe/Website/locales/en.json
@@ -76,5 +76,11 @@
"discoverConnectServerAddress": "Serveraddress:",
"discoverConnectButton": "Connect",
"Checking...": "Checking...",
- "timeout": "Timeout"
+ "timeout": "Timeout",
+ "keyboardButtonShift": "Shift",
+ "keyboardButtonAlt": "Alt",
+ "keyboardButtonCtrl": "Control",
+ "keyboardButtonBackspace": "Backspace",
+ "keyboardAutoSend": "Auto send keys",
+ "keyboardButtonSend": "Send"
}
\ No newline at end of file