mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 21:51:23 +00:00
GUACAMOLE-55: Only the guacClipboard directive should fire guacClipboard events.
This commit is contained in:
@@ -32,7 +32,6 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
|
|||||||
// Required services
|
// Required services
|
||||||
var $location = $injector.get('$location');
|
var $location = $injector.get('$location');
|
||||||
var authenticationService = $injector.get('authenticationService');
|
var authenticationService = $injector.get('authenticationService');
|
||||||
var clipboardService = $injector.get('clipboardService');
|
|
||||||
var guacClientManager = $injector.get('guacClientManager');
|
var guacClientManager = $injector.get('guacClientManager');
|
||||||
var guacNotification = $injector.get('guacNotification');
|
var guacNotification = $injector.get('guacNotification');
|
||||||
var preferenceService = $injector.get('preferenceService');
|
var preferenceService = $injector.get('preferenceService');
|
||||||
@@ -245,15 +244,6 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
|
|||||||
*/
|
*/
|
||||||
var keysCurrentlyPressed = {};
|
var keysCurrentlyPressed = {};
|
||||||
|
|
||||||
/**
|
|
||||||
* Map of all currently pressed keys (by keysym) to the clipboard contents
|
|
||||||
* received from the remote desktop while those keys were pressed. All keys
|
|
||||||
* not currently pressed will not have entries within this map.
|
|
||||||
*
|
|
||||||
* @type Object.<Number, String>
|
|
||||||
*/
|
|
||||||
var clipboardDataFromKey = {};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if all currently pressed keys are in the set of menu keys.
|
* Check to see if all currently pressed keys are in the set of menu keys.
|
||||||
*/
|
*/
|
||||||
@@ -384,24 +374,11 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
|
|||||||
|
|
||||||
$scope.$watch('menu.shown', function menuVisibilityChanged(menuShown, menuShownPreviousState) {
|
$scope.$watch('menu.shown', function menuVisibilityChanged(menuShown, menuShownPreviousState) {
|
||||||
|
|
||||||
// Send clipboard data if menu is hidden
|
|
||||||
if (!menuShown && menuShownPreviousState)
|
|
||||||
$scope.$broadcast('guacClipboard', 'text/plain', $scope.client.clipboardData);
|
|
||||||
|
|
||||||
// Disable client keyboard if the menu is shown
|
// Disable client keyboard if the menu is shown
|
||||||
$scope.client.clientProperties.keyboardEnabled = !menuShown;
|
$scope.client.clientProperties.keyboardEnabled = !menuShown;
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Watch clipboard for new data, associating it with any pressed keys
|
|
||||||
$scope.$watch('client.clipboardData', function clipboardChanged(data) {
|
|
||||||
|
|
||||||
// Associate new clipboard data with any currently-pressed key
|
|
||||||
for (var keysym in keysCurrentlyPressed)
|
|
||||||
clipboardDataFromKey[keysym] = data;
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
// Track pressed keys, opening the Guacamole menu after Ctrl+Alt+Shift
|
// Track pressed keys, opening the Guacamole menu after Ctrl+Alt+Shift
|
||||||
$scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) {
|
$scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) {
|
||||||
|
|
||||||
@@ -437,18 +414,9 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Update pressed keys as they are released, synchronizing the clipboard
|
// Update pressed keys as they are released
|
||||||
// with any data that appears to have come from those key presses
|
|
||||||
$scope.$on('guacKeyup', function keyupListener(event, keysym, keyboard) {
|
$scope.$on('guacKeyup', function keyupListener(event, keysym, keyboard) {
|
||||||
|
|
||||||
// Sync local clipboard with any clipboard data received while this
|
|
||||||
// key was pressed (if any)
|
|
||||||
var clipboardData = clipboardDataFromKey[keysym];
|
|
||||||
if (clipboardData) {
|
|
||||||
clipboardService.setLocalClipboard(clipboardData);
|
|
||||||
delete clipboardDataFromKey[keysym];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark key as released
|
// Mark key as released
|
||||||
delete keysCurrentlyPressed[keysym];
|
delete keysCurrentlyPressed[keysym];
|
||||||
|
|
||||||
@@ -561,19 +529,6 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hide status and sync local clipboard once connected
|
|
||||||
else if (connectionState === ManagedClientState.ConnectionState.CONNECTED) {
|
|
||||||
|
|
||||||
// Sync with local clipboard
|
|
||||||
clipboardService.getLocalClipboard().then(function clipboardRead(data) {
|
|
||||||
$scope.$broadcast('guacClipboard', 'text/plain', data);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Hide status notification
|
|
||||||
guacNotification.showStatus(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hide status for all other states
|
// Hide status for all other states
|
||||||
else
|
else
|
||||||
guacNotification.showStatus(false);
|
guacNotification.showStatus(false);
|
||||||
|
@@ -23,7 +23,9 @@
|
|||||||
* cannot be directly accessed, the user can at least directly copy/paste data
|
* cannot be directly accessed, the user can at least directly copy/paste data
|
||||||
* within the field provided by this directive. The contents of this clipboard
|
* within the field provided by this directive. The contents of this clipboard
|
||||||
* directive, whether retrieved from the local or manipulated manually by the
|
* directive, whether retrieved from the local or manipulated manually by the
|
||||||
* user, are exposed via the "data" attribute.
|
* user, are exposed via the "data" attribute. In addition to updating the
|
||||||
|
* "data" attribute, changes to clipboard data will be broadcast on the scope
|
||||||
|
* via "guacClipboard" events.
|
||||||
*/
|
*/
|
||||||
angular.module('client').directive('guacClipboard', [function guacClipboard() {
|
angular.module('client').directive('guacClipboard', [function guacClipboard() {
|
||||||
|
|
||||||
@@ -59,7 +61,87 @@ angular.module('client').directive('guacClipboard', [function guacClipboard() {
|
|||||||
config.controller = ['$scope', '$injector', '$element',
|
config.controller = ['$scope', '$injector', '$element',
|
||||||
function guacClipboardController($scope, $injector, $element) {
|
function guacClipboardController($scope, $injector, $element) {
|
||||||
|
|
||||||
// STUB
|
// Required services
|
||||||
|
var $rootScope = $injector.get('$rootScope');
|
||||||
|
var clipboardService = $injector.get('clipboardService');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of all currently pressed keys by keysym. If a particular key is
|
||||||
|
* currently pressed, the value stored under that key's keysym within
|
||||||
|
* this map will be true. All keys not currently pressed will not have entries
|
||||||
|
* within this map.
|
||||||
|
*
|
||||||
|
* @type Object.<Number, Boolean>
|
||||||
|
*/
|
||||||
|
var keysCurrentlyPressed = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of all currently pressed keys (by keysym) to the clipboard
|
||||||
|
* contents received while those keys were pressed. All keys not
|
||||||
|
* currently pressed will not have entries within this map.
|
||||||
|
*
|
||||||
|
* @type Object.<Number, String>
|
||||||
|
*/
|
||||||
|
var clipboardDataFromKey = {};
|
||||||
|
|
||||||
|
// Watch clipboard for new data, associating it with any pressed keys
|
||||||
|
$scope.$watch('data', function clipboardChanged(data) {
|
||||||
|
|
||||||
|
// Associate new clipboard data with any currently-pressed key
|
||||||
|
for (var keysym in keysCurrentlyPressed)
|
||||||
|
clipboardDataFromKey[keysym] = data;
|
||||||
|
|
||||||
|
// Notify of updated clipboard data
|
||||||
|
$rootScope.$broadcast('guacClipboard', 'text/plain', data);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Track pressed keys
|
||||||
|
$scope.$on('guacKeydown', function keydownListener(event, keysym, keyboard) {
|
||||||
|
|
||||||
|
// Record key as pressed
|
||||||
|
keysCurrentlyPressed[keysym] = true;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update pressed keys as they are released, synchronizing the clipboard
|
||||||
|
// with any data that appears to have come from those key presses
|
||||||
|
$scope.$on('guacKeyup', function keyupListener(event, keysym, keyboard) {
|
||||||
|
|
||||||
|
// Sync local clipboard with any clipboard data received while this
|
||||||
|
// key was pressed (if any)
|
||||||
|
var clipboardData = clipboardDataFromKey[keysym];
|
||||||
|
if (clipboardData) {
|
||||||
|
clipboardService.setLocalClipboard(clipboardData);
|
||||||
|
delete clipboardDataFromKey[keysym];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark key as released
|
||||||
|
delete keysCurrentlyPressed[keysym];
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the clipboard data has changed, firing a new
|
||||||
|
* "guacClipboard" event if it has.
|
||||||
|
*/
|
||||||
|
var checkClipboard = function checkClipboard() {
|
||||||
|
clipboardService.getLocalClipboard().then(function clipboardRead(data) {
|
||||||
|
$scope.data = data;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attempt to read the clipboard if it may have changed
|
||||||
|
window.addEventListener('load', checkClipboard, true);
|
||||||
|
window.addEventListener('copy', checkClipboard, true);
|
||||||
|
window.addEventListener('cut', checkClipboard, true);
|
||||||
|
window.addEventListener('focus', function focusGained(e) {
|
||||||
|
|
||||||
|
// Only recheck clipboard if it's the window itself that gained focus
|
||||||
|
if (e.target === window)
|
||||||
|
checkClipboard();
|
||||||
|
|
||||||
|
}, true);
|
||||||
|
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
@@ -24,8 +24,7 @@ angular.module('client').factory('clipboardService', ['$injector',
|
|||||||
function clipboardService($injector) {
|
function clipboardService($injector) {
|
||||||
|
|
||||||
// Get required services
|
// Get required services
|
||||||
var $q = $injector.get('$q');
|
var $q = $injector.get('$q');
|
||||||
var $rootScope = $injector.get('$rootScope');
|
|
||||||
|
|
||||||
var service = {};
|
var service = {};
|
||||||
|
|
||||||
@@ -44,14 +43,6 @@ angular.module('client').factory('clipboardService', ['$injector',
|
|||||||
*/
|
*/
|
||||||
var clipboardContent = document.createElement('textarea');
|
var clipboardContent = document.createElement('textarea');
|
||||||
|
|
||||||
/**
|
|
||||||
* The contents of the last clipboard event broadcast by this service when
|
|
||||||
* the clipboard contents changed.
|
|
||||||
*
|
|
||||||
* @type String
|
|
||||||
*/
|
|
||||||
var lastClipboardEvent = '';
|
|
||||||
|
|
||||||
// Ensure textarea is selectable but not visible
|
// Ensure textarea is selectable but not visible
|
||||||
clipElement.appendChild(clipboardContent);
|
clipElement.appendChild(clipboardContent);
|
||||||
clipElement.style.position = 'absolute';
|
clipElement.style.position = 'absolute';
|
||||||
@@ -129,34 +120,6 @@ angular.module('client').factory('clipboardService', ['$injector',
|
|||||||
return deferred.promise;
|
return deferred.promise;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks whether the clipboard data has changed, firing a new
|
|
||||||
* "guacClipboard" event if it has.
|
|
||||||
*/
|
|
||||||
var checkClipboard = function checkClipboard() {
|
|
||||||
service.getLocalClipboard().then(function clipboardRead(data) {
|
|
||||||
|
|
||||||
// Fire clipboard event if the data has changed
|
|
||||||
if (data !== lastClipboardEvent) {
|
|
||||||
$rootScope.$broadcast('guacClipboard', 'text/plain', data);
|
|
||||||
lastClipboardEvent = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Attempt to read the clipboard if it may have changed
|
|
||||||
window.addEventListener('load', checkClipboard, true);
|
|
||||||
window.addEventListener('copy', checkClipboard, true);
|
|
||||||
window.addEventListener('cut', checkClipboard, true);
|
|
||||||
window.addEventListener('focus', function focusGained(e) {
|
|
||||||
|
|
||||||
// Only recheck clipboard if it's the window itself that gained focus
|
|
||||||
if (e.target === window)
|
|
||||||
checkClipboard();
|
|
||||||
|
|
||||||
}, true);
|
|
||||||
|
|
||||||
return service;
|
return service;
|
||||||
|
|
||||||
}]);
|
}]);
|
||||||
|
@@ -383,6 +383,10 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
|
|||||||
ManagedClientState.setConnectionState(managedClient.clientState,
|
ManagedClientState.setConnectionState(managedClient.clientState,
|
||||||
ManagedClientState.ConnectionState.CONNECTED);
|
ManagedClientState.ConnectionState.CONNECTED);
|
||||||
|
|
||||||
|
// Send any clipboard data already provided
|
||||||
|
if (managedClient.clipboardData)
|
||||||
|
client.setClipboard(managedClient.clipboardData);
|
||||||
|
|
||||||
// Begin streaming audio input if possible
|
// Begin streaming audio input if possible
|
||||||
requestAudioStream(client);
|
requestAudioStream(client);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user