Skip to content

Commit

Permalink
Merge 1.5.4 changes back to master.
Browse files Browse the repository at this point in the history
  • Loading branch information
mike-jumper committed Oct 24, 2023
2 parents eb76322 + 57d3b1e commit ac6e501
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 2 deletions.
75 changes: 73 additions & 2 deletions guacamole/src/main/frontend/src/app/player/directives/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
* THE SOFTWARE.
*/

/* global _ */

/**
* Directive which plays back session recordings. This directive emits the
* following events based on state changes within the current recording:
Expand Down Expand Up @@ -81,6 +83,30 @@ angular.module('player').directive('guacPlayer', ['$injector', function guacPlay
const keyEventDisplayService = $injector.get('keyEventDisplayService');
const playerTimeService = $injector.get('playerTimeService');

/**
* The number of milliseconds after the last detected mouse activity after
* which the associated CSS class should be removed.
*
* @type {number}
*/
const MOUSE_CLEANUP_DELAY = 4000;

/**
* The number of milliseconds after the last detected mouse activity before
* the cleanup timer to remove the associated CSS class should be scheduled.
*
* @type {number}
*/
const MOUSE_DEBOUNCE_DELAY = 250;

/**
* The number of milliseconds, after the debounce delay, before the mouse
* activity cleanup timer should run.
*
* @type {number}
*/
const MOUSE_CLEANUP_TIMER_DELAY = MOUSE_CLEANUP_DELAY - MOUSE_DEBOUNCE_DELAY;

const config = {
restrict : 'E',
templateUrl : 'app/player/templates/player.html'
Expand All @@ -97,8 +123,8 @@ angular.module('player').directive('guacPlayer', ['$injector', function guacPlay

};

config.controller = ['$scope', '$element', '$injector',
function guacPlayerController($scope) {
config.controller = ['$scope', '$element', '$window',
function guacPlayerController($scope, $element, $window) {

/**
* Guacamole.SessionRecording instance to be used to playback the
Expand Down Expand Up @@ -179,6 +205,14 @@ angular.module('player').directive('guacPlayer', ['$injector', function guacPlay
*/
var resumeAfterSeekRequest = false;

/**
* A scheduled timer to clean up the mouse activity CSS class, or null
* if no timer is scheduled.
*
* @type {number}
*/
var mouseActivityTimer = null;

/**
* Return true if any batches of key event logs are available for this
* recording, or false otherwise.
Expand Down Expand Up @@ -401,6 +435,43 @@ angular.module('player').directive('guacPlayer', ['$injector', function guacPlay
$scope.$on('$destroy', function playerDestroyed() {
$scope.recording.pause();
$scope.recording.abort();
mouseActivityTimer !== null && $window.clearTimeout(mouseActivityTimer);
});

/**
* Clean up the mouse movement class after no mouse activity has been
* detected for the appropriate time period.
*/
const scheduleCleanupTimeout = _.debounce(() =>
mouseActivityTimer = $window.setTimeout(() => {
mouseActivityTimer = null;
$element.removeClass('recent-mouse-movement');
}, MOUSE_CLEANUP_TIMER_DELAY),

/*
* Only schedule the cleanup task after the mouse hasn't moved
* for a reasonable amount of time to ensure that the number of
* created cleanup timers remains reasonable.
*/
MOUSE_DEBOUNCE_DELAY);

/*
* When the mouse moves inside the player, add a CSS class signifying
* recent mouse movement, to be automatically cleaned up after a period
* of time with no detected mouse movement.
*/
$element.on('mousemove', () => {

// Clean up any existing cleanup timer
if (mouseActivityTimer !== null) {
$window.clearTimeout(mouseActivityTimer);
mouseActivityTimer = null;
}

// Add the marker CSS class, and schedule its removal
$element.addClass('recent-mouse-movement');
scheduleCleanupTimeout();

});

}];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,3 +112,7 @@
-o-transition-delay: 0s;
transition-delay: 0s;
}

.settings.connectionHistoryPlayer guac-player.recent-mouse-movement .guac-player-controls.playing {
opacity: 1;
}

0 comments on commit ac6e501

Please sign in to comment.