diff --git a/guacamole/src/main/webapp/app/osk/directives/guacOsk.js b/guacamole/src/main/webapp/app/osk/directives/guacOsk.js
index decb06f8d..bca9bc9b4 100644
--- a/guacamole/src/main/webapp/app/osk/directives/guacOsk.js
+++ b/guacamole/src/main/webapp/app/osk/directives/guacOsk.js
@@ -40,8 +40,13 @@ angular.module('osk').directive('guacOsk', [function guacOsk() {
},
templateUrl: 'app/osk/templates/guacOsk.html',
- controller: ['$scope', '$rootScope', '$window', '$element',
- function guacOsk($scope, $rootScope, $window, $element) {
+ controller: ['$scope', '$injector', '$element',
+ function guacOsk($scope, $injector, $element) {
+
+ // Required services
+ var $http = $injector.get('$http');
+ var $rootScope = $injector.get('$rootScope');
+ var cacheService = $injector.get('cacheService');
/**
* The current on-screen keyboard, if any.
@@ -67,7 +72,7 @@ angular.module('osk').directive('guacOsk', [function guacOsk() {
};
// Set layout whenever URL changes
- $scope.$watch("layout", function setLayout(layout) {
+ $scope.$watch("layout", function setLayout(url) {
// Remove current keyboard
if (keyboard) {
@@ -76,24 +81,40 @@ angular.module('osk').directive('guacOsk', [function guacOsk() {
}
// Load new keyboard
- if (layout) {
+ if (url) {
- // Add OSK element
- keyboard = new Guacamole.OnScreenKeyboard(layout);
- main.appendChild(keyboard.getElement());
+ // Retrieve layout JSON
+ $http({
+ cache : cacheService.languages,
+ method : 'GET',
+ url : url
+ })
- // Init size
- keyboard.resize(main.offsetWidth);
+ // Build OSK with retrieved layout
+ .success(function layoutRetrieved(layout) {
- // Broadcast keydown for each key pressed
- keyboard.onkeydown = function(keysym) {
- $rootScope.$broadcast('guacSyntheticKeydown', keysym);
- };
-
- // Broadcast keydown for each key released
- keyboard.onkeyup = function(keysym) {
- $rootScope.$broadcast('guacSyntheticKeyup', keysym);
- };
+ // Abort if the layout changed while we were waiting for a response
+ if ($scope.layout !== url)
+ return;
+
+ // Add OSK element
+ keyboard = new Guacamole.OnScreenKeyboard(layout);
+ main.appendChild(keyboard.getElement());
+
+ // Init size
+ keyboard.resize(main.offsetWidth);
+
+ // Broadcast keydown for each key pressed
+ keyboard.onkeydown = function(keysym) {
+ $rootScope.$broadcast('guacSyntheticKeydown', keysym);
+ };
+
+ // Broadcast keydown for each key released
+ keyboard.onkeyup = function(keysym) {
+ $rootScope.$broadcast('guacSyntheticKeyup', keysym);
+ };
+
+ });
}
diff --git a/guacamole/src/main/webapp/layouts/en-us-qwerty-mobile.xml b/guacamole/src/main/webapp/layouts/en-us-qwerty-mobile.xml
deleted file mode 100644
index a61ec4c2b..000000000
--- a/guacamole/src/main/webapp/layouts/en-us-qwerty-mobile.xml
+++ /dev/null
@@ -1,316 +0,0 @@
-
-
-
-
-
-
-
-
-
- Tab
-
-
-
- q
- 1
- Q
- q
-
-
-
- w
- 2
- W
- w
-
-
-
- e
- 3
- E
- e
-
-
-
- r
- 4
- R
- r
-
-
-
- t
- 5
- T
- t
-
-
-
- y
- 6
- Y
- y
-
-
-
- u
- 7
- U
- u
-
-
-
- i
- 8
- I
- i
-
-
-
- o
- 9
- O
- o
-
-
-
- p
- 0
- P
- p
-
-
-
- [
- {
-
-
-
- ]
- }
-
-
-
- Back
-
-
-
-
-
-
-
- ?123
-
-
-
- a
- #
- A
- a
-
-
-
- s
- $
- S
- s
-
-
-
- d
- %
- D
- d
-
-
-
- f
- &
- F
- f
-
-
-
- g
- *
- G
- g
-
-
-
- h
- -
- H
- h
-
-
-
- j
- +
- J
- j
-
-
-
- k
- (
- K
- k
-
-
-
- l
- )
- L
- l
-
-
-
- ;
- :
-
-
-
- '
- "
-
-
-
- Enter
-
-
-
-
-
-
-
- Shift
-
-
-
- z
- <
- Z
- z
-
-
-
- x
- >
- X
- x
-
-
-
- c
- =
- C
- c
-
-
-
- v
- '
- V
- v
-
-
-
- b
- ;
- B
- b
-
-
-
- n
- ,
- N
- n
-
-
-
- m
- .
- M
- m
-
-
-
- ,
- !
- !
- !
-
-
-
- .
- ?
- ?
- ?
-
-
-
- /
- ?
-
-
-
- Shift
-
-
-
-
-
-
-
- Ctrl
-
-
-
- Super
-
-
-
- Alt
-
-
-
-
-
-
-
- Alt
-
-
-
- Menu
-
-
-
- Ctrl
-
-
-
diff --git a/guacamole/src/main/webapp/layouts/en-us-qwerty.xml b/guacamole/src/main/webapp/layouts/en-us-qwerty.xml
deleted file mode 100644
index 8cf8bb5e0..000000000
--- a/guacamole/src/main/webapp/layouts/en-us-qwerty.xml
+++ /dev/null
@@ -1,500 +0,0 @@
-
-
-
-
-
-
-
-
-
- Esc
-
-
-
- F1
-
-
-
- F2
-
-
-
- F3
-
-
-
- F4
-
-
-
- F5
-
-
-
- F6
-
-
-
- F7
-
-
-
- F8
-
-
-
- F9
-
-
-
- F10
-
-
-
- F11
-
-
-
- F12
-
-
-
-
-
-
-
-
- `
- ~
-
-
-
- 1
- !
-
-
-
- 2
- @
-
-
-
- 3
- #
-
-
-
- 4
- $
-
-
-
- 5
- %
-
-
-
- 6
- ^
-
-
-
- 7
- &
-
-
-
- 8
- *
-
-
-
- 9
- (
-
-
-
- 0
- )
-
-
-
- -
- _
-
-
-
- =
- +
-
-
-
- Back
-
-
-
-
-
-
-
- Tab
-
-
-
- q
- Q
- Q
- q
-
-
-
- w
- W
- W
- w
-
-
-
- e
- E
- E
- e
-
-
-
- r
- R
- R
- r
-
-
-
- t
- T
- T
- t
-
-
-
- y
- Y
- Y
- y
-
-
-
- u
- U
- U
- u
-
-
-
- i
- I
- I
- i
-
-
-
- o
- O
- O
- o
-
-
-
- p
- P
- P
- p
-
-
-
- [
- {
-
-
-
- ]
- }
-
-
-
- \
- |
-
-
-
-
-
-
-
- Caps
-
-
-
- a
- A
- A
- a
-
-
-
- s
- S
- S
- s
-
-
-
- d
- D
- D
- d
-
-
-
- f
- F
- F
- f
-
-
-
- g
- G
- G
- g
-
-
-
- h
- H
- H
- h
-
-
-
- j
- J
- J
- j
-
-
-
- k
- K
- K
- k
-
-
-
- l
- L
- L
- l
-
-
-
- ;
- :
-
-
-
- '
- "
-
-
-
- Enter
-
-
-
-
-
-
-
- Shift
-
-
-
- z
- Z
- Z
- z
-
-
-
- x
- X
- X
- x
-
-
-
- c
- C
- C
- c
-
-
-
- v
- V
- V
- v
-
-
-
- b
- B
- B
- b
-
-
-
- n
- N
- N
- n
-
-
-
- m
- M
- M
- m
-
-
-
- ,
- <
-
-
-
- .
- >
-
-
-
- /
- ?
-
-
-
- Shift
-
-
-
-
-
-
-
- Ctrl
-
-
-
- Super
-
-
-
- Alt
-
-
-
-
-
-
-
- Alt
-
-
-
- Menu
-
-
-
- Ctrl
-
-
-
-
-
-
-
-
-
-
-
- Ins
-
-
-
- Home
-
-
-
- PgUp
-
-
-
-
-
- Del
-
-
-
- End
-
-
-
- PgDn
-
-
-
-
-
-
-
- ↑
-
-
-
-
-
- ←
-
-
-
- ↓
-
-
-
- →
-
-
-
-
diff --git a/guacamole/src/main/webapp/translations/en_US.json b/guacamole/src/main/webapp/translations/en_US.json
index 2ea7b6f78..79e5a6db6 100644
--- a/guacamole/src/main/webapp/translations/en_US.json
+++ b/guacamole/src/main/webapp/translations/en_US.json
@@ -117,7 +117,7 @@
"TEXT_RECONNECT_COUNTDOWN" : "Reconnecting in {REMAINING} {REMAINING, plural, one{second} other{seconds}}...",
"TEXT_FILE_TRANSFER_PROGRESS" : "{PROGRESS} {UNIT, select, b{B} kb{KB} mb{MB} gb{GB} other{}}",
- "URL_OSK_LAYOUT" : "layouts/en-us-qwerty.xml"
+ "URL_OSK_LAYOUT" : "layouts/en-us-qwerty.json"
},