mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-30 00:23:21 +00:00 
			
		
		
		
	| @@ -23,4 +23,4 @@ | |||||||
| /** | /** | ||||||
|  * The module for code used to connect to a connection or balancing group. |  * The module for code used to connect to a connection or balancing group. | ||||||
|  */ |  */ | ||||||
| angular.module('client', ['auth', 'history', 'rest']); | angular.module('client', ['auth', 'history', 'osk', 'rest']); | ||||||
|   | |||||||
| @@ -146,6 +146,9 @@ angular.module('home').controller('clientController', ['$scope', '$routeParams', | |||||||
|     // Hide menu by default |     // Hide menu by default | ||||||
|     $scope.menuShown = false; |     $scope.menuShown = false; | ||||||
|  |  | ||||||
|  |     // Use physical keyboard by default | ||||||
|  |     $scope.inputMethod = 'none'; | ||||||
|  |  | ||||||
|     // Convenience method for closing the menu |     // Convenience method for closing the menu | ||||||
|     $scope.closeMenu = function closeMenu() { |     $scope.closeMenu = function closeMenu() { | ||||||
|         $scope.menuShown = false; |         $scope.menuShown = false; | ||||||
| @@ -198,6 +201,14 @@ angular.module('home').controller('clientController', ['$scope', '$routeParams', | |||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // Show/hide UI elements depending on input method | ||||||
|  |     $scope.$watch('inputMethod', function setInputMethod(inputMethod) { | ||||||
|  |  | ||||||
|  |         // Show on-screen keyboard only if selected | ||||||
|  |         $scope.showOSK = (inputMethod === 'osk'); | ||||||
|  |  | ||||||
|  |     }); | ||||||
|  |  | ||||||
|     $scope.$watch('menuShown', function setKeyboardEnabled(menuShown, menuShownPreviousState) { |     $scope.$watch('menuShown', function setKeyboardEnabled(menuShown, menuShownPreviousState) { | ||||||
|          |          | ||||||
|         // Send clipboard data if menu is hidden |         // Send clipboard data if menu is hidden | ||||||
|   | |||||||
| @@ -34,120 +34,10 @@ | |||||||
|     background: #222; |     background: #222; | ||||||
|     opacity: 0.85; |     opacity: 0.85; | ||||||
|  |  | ||||||
|  |     visibility: hidden; | ||||||
|     z-index: 1; |     z-index: 1; | ||||||
| } | } | ||||||
|  |  | ||||||
| .guac-keyboard { | .keyboard-container.shown { | ||||||
|     display: inline-block; |     visibility: visible; | ||||||
|     width: 100%; |  | ||||||
|      |  | ||||||
|     margin: 0; |  | ||||||
|     padding: 0; |  | ||||||
|     cursor: default; |  | ||||||
|  |  | ||||||
|     text-align: left; |  | ||||||
|     vertical-align: middle; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard .guac-keyboard-key-container { |  | ||||||
|     display: inline-block; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard .guac-keyboard-key { |  | ||||||
|     background: #444; |  | ||||||
|     border: 1px outset #888; |  | ||||||
|     -moz-border-radius: 0.1em; |  | ||||||
|     -webkit-border-radius: 0.1em; |  | ||||||
|     -khtml-border-radius: 0.1em; |  | ||||||
|     border-radius: 0.1em; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard .guac-keyboard-cap { |  | ||||||
|     color: white; |  | ||||||
|     font-family: sans-serif; |  | ||||||
|     font-size: 50%; |  | ||||||
|     font-weight: lighter; |  | ||||||
|     text-align: center; |  | ||||||
|     white-space: pre; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard .guac-keyboard-key:hover { |  | ||||||
|     cursor: pointer; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard .guac-keyboard-key.highlight { |  | ||||||
|     background: #666; |  | ||||||
|     border-color: #666; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-shift .guac-keyboard-key.shift, |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-numsym .guac-keyboard-key.numsym { |  | ||||||
|     background: #882; |  | ||||||
|     border-color: #DD4; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-control .guac-keyboard-key.control, |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-numsym .guac-keyboard-key.numsym { |  | ||||||
|     background: #882; |  | ||||||
|     border-color: #DD4; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-alt .guac-keyboard-key.alt, |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-numsym .guac-keyboard-key.numsym { |  | ||||||
|     background: #882; |  | ||||||
|     border-color: #DD4; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-super .guac-keyboard-key.super, |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-numsym .guac-keyboard-key.numsym { |  | ||||||
|     background: #882; |  | ||||||
|     border-color: #DD4; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard .guac-keyboard-key.guac-keyboard-pressed { |  | ||||||
|     background: #822; |  | ||||||
|     border-color: #D44; |  | ||||||
|     border-style: inset; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard .guac-keyboard-row { |  | ||||||
|     line-height: 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard .guac-keyboard-column { |  | ||||||
|     display: inline-block; |  | ||||||
|     text-align: center; |  | ||||||
|     vertical-align: top; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .guac-keyboard .guac-keyboard-gap { |  | ||||||
|     display: inline-block; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* Hide keycaps requiring modifiers which are NOT currently active. */ |  | ||||||
| .guac-keyboard:not(.guac-keyboard-modifier-caps) |  | ||||||
| .guac-keyboard-cap.guac-keyboard-requires-caps, |  | ||||||
|  |  | ||||||
| .guac-keyboard:not(.guac-keyboard-modifier-numsym) |  | ||||||
| .guac-keyboard-cap.guac-keyboard-requires-numsym, |  | ||||||
|  |  | ||||||
| .guac-keyboard:not(.guac-keyboard-modifier-shift) |  | ||||||
| .guac-keyboard-cap.guac-keyboard-requires-shift, |  | ||||||
|  |  | ||||||
| /* Hide keycaps NOT requiring modifiers which ARE currently active, where that |  | ||||||
|    modifier is used to determine which cap is displayed for the current key. */ |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-shift |  | ||||||
| .guac-keyboard-key.guac-keyboard-uses-shift |  | ||||||
| .guac-keyboard-cap:not(.guac-keyboard-requires-shift), |  | ||||||
|  |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-numsym |  | ||||||
| .guac-keyboard-key.guac-keyboard-uses-numsym |  | ||||||
| .guac-keyboard-cap:not(.guac-keyboard-requires-numsym), |  | ||||||
|  |  | ||||||
| .guac-keyboard.guac-keyboard-modifier-caps |  | ||||||
| .guac-keyboard-key.guac-keyboard-uses-caps |  | ||||||
| .guac-keyboard-cap:not(.guac-keyboard-requires-caps) { |  | ||||||
|  |  | ||||||
|     display: none; |  | ||||||
|      |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -48,20 +48,20 @@ | |||||||
|  |  | ||||||
|             <!-- No IME --> |             <!-- No IME --> | ||||||
|             <div class="choice"> |             <div class="choice"> | ||||||
|                 <label><input name="input-method" ng-change="closeMenu()" type="radio" value="ime-none" id="ime-none"/> {{'client.none' | translate}}</label> |                 <label><input name="input-method" ng-change="closeMenu()" ng-model="inputMethod" type="radio" value="none"/> {{'client.none' | translate}}</label> | ||||||
|                 <p class="caption"><label for="ime-none">{{'client.noneDesc' | translate}}</label></p> |                 <p class="caption"><label for="ime-none">{{'client.noneDesc' | translate}}</label></p> | ||||||
|             </div> |             </div> | ||||||
|  |  | ||||||
|             <!-- Text input --> |             <!-- Text input --> | ||||||
|             <div class="choice"> |             <div class="choice"> | ||||||
|                 <div class="figure"><label for="ime-text"><img src="images/settings/tablet-keys.png" alt=""/></label></div> |                 <div class="figure"><label for="ime-text"><img src="images/settings/tablet-keys.png" alt=""/></label></div> | ||||||
|                 <label><input name="input-method" ng-change="closeMenu()" type="radio" value="ime-text" id="ime-text"/> {{'client.textInput' | translate}}</label> |                 <label><input name="input-method" ng-change="closeMenu()" ng-model="inputMethod" type="radio" value="text"/> {{'client.textInput' | translate}}</label> | ||||||
|                 <p class="caption"><label for="ime-text">{{'client.textInputDesc' | translate}} </label></p> |                 <p class="caption"><label for="ime-text">{{'client.textInputDesc' | translate}} </label></p> | ||||||
|             </div> |             </div> | ||||||
|  |  | ||||||
|             <!-- Guac OSK --> |             <!-- Guac OSK --> | ||||||
|             <div class="choice"> |             <div class="choice"> | ||||||
|                 <label><input name="input-method" ng-change="closeMenu()" type="radio" value="ime-osk" id="ime-osk"/> {{'client.osk' | translate}}</label> |                 <label><input name="input-method" ng-change="closeMenu()" ng-model="inputMethod" type="radio" value="osk"/> {{'client.osk' | translate}}</label> | ||||||
|                 <p class="caption"><label for="ime-osk">{{'client.oskDesc' | translate}}</label></p> |                 <p class="caption"><label for="ime-osk">{{'client.oskDesc' | translate}}</label></p> | ||||||
|             </div> |             </div> | ||||||
|  |  | ||||||
| @@ -103,6 +103,11 @@ | |||||||
|          |          | ||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|  |     <!-- On-screen keyboard --> | ||||||
|  |     <div class="keyboard-container" ng-class="{shown: showOSK}"> | ||||||
|  |         <guac-osk layout="'client.oskLayout' | translate"/> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|     <!-- Images which should be preloaded --> |     <!-- Images which should be preloaded --> | ||||||
|     <div id="preload"> |     <div id="preload"> | ||||||
|         <img src="images/action-icons/guac-close.png" alt=""/> |         <img src="images/action-icons/guac-close.png" alt=""/> | ||||||
|   | |||||||
							
								
								
									
										114
									
								
								guacamole/src/main/webapp/app/osk/directives/guacOsk.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								guacamole/src/main/webapp/app/osk/directives/guacOsk.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2014 Glyptodon LLC | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in | ||||||
|  |  * all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |  * THE SOFTWARE. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * A directive which displays the Guacamole on-screen keyboard. | ||||||
|  |  */ | ||||||
|  | angular.module('osk').directive('guacOsk', [function guacOsk() { | ||||||
|  |  | ||||||
|  |     return { | ||||||
|  |         restrict: 'E', | ||||||
|  |         replace: true, | ||||||
|  |         scope: { | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * The URL for the Guacamole on-screen keyboard layout to use. | ||||||
|  |              * | ||||||
|  |              * @type String | ||||||
|  |              */ | ||||||
|  |             layout : '=' | ||||||
|  |  | ||||||
|  |         }, | ||||||
|  |  | ||||||
|  |         templateUrl: 'app/osk/templates/guacOsk.html', | ||||||
|  |         controller: ['$scope', '$rootScope', '$window', '$element', | ||||||
|  |             function guacOsk($scope, $rootScope, $window, $element) { | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * The current on-screen keyboard, if any. | ||||||
|  |              * | ||||||
|  |              * @type Guacamole.OnScreenKeyboard | ||||||
|  |              */ | ||||||
|  |             var keyboard = null; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * The main containing element for the entire directive. | ||||||
|  |              *  | ||||||
|  |              * @type Element | ||||||
|  |              */ | ||||||
|  |             var main = $element[0]; | ||||||
|  |  | ||||||
|  |             /** | ||||||
|  |              * Event listener which resizes the current keyboard, if any, such | ||||||
|  |              * that it fits within available space. | ||||||
|  |              */ | ||||||
|  |             var resizeListener = function resizeListener() { | ||||||
|  |  | ||||||
|  |                 // Resize keyboard, if defined | ||||||
|  |                 if (keyboard) | ||||||
|  |                     keyboard.resize(main.offsetWidth); | ||||||
|  |  | ||||||
|  |             }; | ||||||
|  |  | ||||||
|  |             // Set layout whenever URL changes | ||||||
|  |             $scope.$watch("layout", function setLayout(layout) { | ||||||
|  |  | ||||||
|  |                 // Remove current keyboard | ||||||
|  |                 keyboard = null; | ||||||
|  |                 main.innerHTML = ""; | ||||||
|  |  | ||||||
|  |                 // Load new keyboard | ||||||
|  |                 if (layout) { | ||||||
|  |  | ||||||
|  |                     // 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('guacKeydown', keysym); | ||||||
|  |                     }; | ||||||
|  |                      | ||||||
|  |                     // Broadcast keydown for each key released  | ||||||
|  |                     keyboard.onkeyup = function(keysym) { | ||||||
|  |                         $rootScope.$broadcast('guacKeyup', keysym); | ||||||
|  |                     }; | ||||||
|  |  | ||||||
|  |                     // Resize keyboard whenever window changes size | ||||||
|  |                     $window.addEventListener('resize', resizeListener); | ||||||
|  |  | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |             }); // end layout scope watch | ||||||
|  |  | ||||||
|  |             // Clean up event listeners upon destroy | ||||||
|  |             $scope.$on('$destroy', function destroyKeyboard() { | ||||||
|  |                 $window.removeEventListener('resize', resizeListener); | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |         }] | ||||||
|  |  | ||||||
|  |     }; | ||||||
|  | }]); | ||||||
							
								
								
									
										26
									
								
								guacamole/src/main/webapp/app/osk/oskModule.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								guacamole/src/main/webapp/app/osk/oskModule.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2014 Glyptodon LLC | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in | ||||||
|  |  * all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |  * THE SOFTWARE. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Module for displaying the Guacamole on-screen keyboard. | ||||||
|  |  */ | ||||||
|  | angular.module('osk', []); | ||||||
							
								
								
									
										136
									
								
								guacamole/src/main/webapp/app/osk/styles/osk.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								guacamole/src/main/webapp/app/osk/styles/osk.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,136 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2014 Glyptodon LLC | ||||||
|  |  * | ||||||
|  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |  * of this software and associated documentation files (the "Software"), to deal | ||||||
|  |  * in the Software without restriction, including without limitation the rights | ||||||
|  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |  * copies of the Software, and to permit persons to whom the Software is | ||||||
|  |  * furnished to do so, subject to the following conditions: | ||||||
|  |  * | ||||||
|  |  * The above copyright notice and this permission notice shall be included in | ||||||
|  |  * all copies or substantial portions of the Software. | ||||||
|  |  * | ||||||
|  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |  * THE SOFTWARE. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | .guac-keyboard { | ||||||
|  |     display: inline-block; | ||||||
|  |     width: 100%; | ||||||
|  |      | ||||||
|  |     margin: 0; | ||||||
|  |     padding: 0; | ||||||
|  |     cursor: default; | ||||||
|  |  | ||||||
|  |     text-align: left; | ||||||
|  |     vertical-align: middle; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard .guac-keyboard-key-container { | ||||||
|  |     display: inline-block; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard .guac-keyboard-key { | ||||||
|  |     background: #444; | ||||||
|  |     border: 1px outset #888; | ||||||
|  |     -moz-border-radius: 0.1em; | ||||||
|  |     -webkit-border-radius: 0.1em; | ||||||
|  |     -khtml-border-radius: 0.1em; | ||||||
|  |     border-radius: 0.1em; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard .guac-keyboard-cap { | ||||||
|  |     color: white; | ||||||
|  |     font-family: sans-serif; | ||||||
|  |     font-size: 50%; | ||||||
|  |     font-weight: lighter; | ||||||
|  |     text-align: center; | ||||||
|  |     white-space: pre; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard .guac-keyboard-key:hover { | ||||||
|  |     cursor: pointer; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard .guac-keyboard-key.highlight { | ||||||
|  |     background: #666; | ||||||
|  |     border-color: #666; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-shift .guac-keyboard-key.shift, | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-numsym .guac-keyboard-key.numsym { | ||||||
|  |     background: #882; | ||||||
|  |     border-color: #DD4; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-control .guac-keyboard-key.control, | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-numsym .guac-keyboard-key.numsym { | ||||||
|  |     background: #882; | ||||||
|  |     border-color: #DD4; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-alt .guac-keyboard-key.alt, | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-numsym .guac-keyboard-key.numsym { | ||||||
|  |     background: #882; | ||||||
|  |     border-color: #DD4; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-super .guac-keyboard-key.super, | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-numsym .guac-keyboard-key.numsym { | ||||||
|  |     background: #882; | ||||||
|  |     border-color: #DD4; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard .guac-keyboard-key.guac-keyboard-pressed { | ||||||
|  |     background: #822; | ||||||
|  |     border-color: #D44; | ||||||
|  |     border-style: inset; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard .guac-keyboard-row { | ||||||
|  |     line-height: 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard .guac-keyboard-column { | ||||||
|  |     display: inline-block; | ||||||
|  |     text-align: center; | ||||||
|  |     vertical-align: top; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .guac-keyboard .guac-keyboard-gap { | ||||||
|  |     display: inline-block; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Hide keycaps requiring modifiers which are NOT currently active. */ | ||||||
|  | .guac-keyboard:not(.guac-keyboard-modifier-caps) | ||||||
|  | .guac-keyboard-cap.guac-keyboard-requires-caps, | ||||||
|  |  | ||||||
|  | .guac-keyboard:not(.guac-keyboard-modifier-numsym) | ||||||
|  | .guac-keyboard-cap.guac-keyboard-requires-numsym, | ||||||
|  |  | ||||||
|  | .guac-keyboard:not(.guac-keyboard-modifier-shift) | ||||||
|  | .guac-keyboard-cap.guac-keyboard-requires-shift, | ||||||
|  |  | ||||||
|  | /* Hide keycaps NOT requiring modifiers which ARE currently active, where that | ||||||
|  |    modifier is used to determine which cap is displayed for the current key. */ | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-shift | ||||||
|  | .guac-keyboard-key.guac-keyboard-uses-shift | ||||||
|  | .guac-keyboard-cap:not(.guac-keyboard-requires-shift), | ||||||
|  |  | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-numsym | ||||||
|  | .guac-keyboard-key.guac-keyboard-uses-numsym | ||||||
|  | .guac-keyboard-cap:not(.guac-keyboard-requires-numsym), | ||||||
|  |  | ||||||
|  | .guac-keyboard.guac-keyboard-modifier-caps | ||||||
|  | .guac-keyboard-key.guac-keyboard-uses-caps | ||||||
|  | .guac-keyboard-cap:not(.guac-keyboard-requires-caps) { | ||||||
|  |  | ||||||
|  |     display: none; | ||||||
|  |      | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								guacamole/src/main/webapp/app/osk/templates/guacOsk.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								guacamole/src/main/webapp/app/osk/templates/guacOsk.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | <div class="osk"> | ||||||
|  |     <!-- | ||||||
|  |        Copyright (C) 2014 Glyptodon LLC | ||||||
|  |  | ||||||
|  |        Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  |        of this software and associated documentation files (the "Software"), to deal | ||||||
|  |        in the Software without restriction, including without limitation the rights | ||||||
|  |        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||||
|  |        copies of the Software, and to permit persons to whom the Software is | ||||||
|  |        furnished to do so, subject to the following conditions: | ||||||
|  |  | ||||||
|  |        The above copyright notice and this permission notice shall be included in | ||||||
|  |        all copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  |        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  |        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  |        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  |        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  |        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||||
|  |        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||||||
|  |        THE SOFTWARE. | ||||||
|  |     --> | ||||||
|  |  | ||||||
|  | </div> | ||||||
| @@ -206,6 +206,7 @@ | |||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|     "client": { |     "client": { | ||||||
|  |         "oskLayout"         : "layouts/en-us-qwerty.xml", | ||||||
|         "ctrl"              : "Ctrl", |         "ctrl"              : "Ctrl", | ||||||
|         "alt"               : "Alt", |         "alt"               : "Alt", | ||||||
|         "esc"               : "Esc", |         "esc"               : "Esc", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user