/*
* Copyright (c) 2015-2017, Michael A. Updike All rights reserved.
* Licensed under the BSD-3-Clause
* https://opensource.org/licenses/BSD-3-Clause
* https://github.com/opus1269/photo-screen-saver/blob/master/LICENSE.md
*/
window.app = window.app || {};
/**
* Event handling for a {@link app.Screensaver}
* @namespace
*/
app.SSEvents = (function() {
'use strict';
new ExceptionHandler();
/**
* Starting mouse position
* @type {{x: ?int, y: ?int}}
* @const
* @private
* @memberOf app.SSEvents
*/
const _MOUSE_START = {x: null, y: null};
/**
* Close ourselves
* @private
* @memberOf app.SSEvents
*/
function _close() {
// send message to other screen savers to close themselves
Chrome.Msg.send(app.Msg.SS_CLOSE).catch(() => {});
setTimeout(function() {
// delay a little to process events
window.close();
}, 750);
}
/**
* Event: Fired when a registered command is activated using
* a keyboard shortcut.
* @see https://developer.chrome.com/extensions/commands#event-onCommand
* @param {string} cmd - keyboard command
* @private
* @memberOf app.SSEvents
*/
function _onKeyCommand(cmd) {
if (app.SSRunner.isInteractive()) {
if (cmd === 'ss-toggle-paused') {
Chrome.GA.event(Chrome.GA.EVENT.KEY_COMMAND, `${cmd}`);
app.SSRunner.togglePaused();
} else if (cmd === 'ss-forward') {
Chrome.GA.event(Chrome.GA.EVENT.KEY_COMMAND, `${cmd}`);
app.SSRunner.forward();
} else if (cmd === 'ss-back') {
Chrome.GA.event(Chrome.GA.EVENT.KEY_COMMAND, `${cmd}`);
app.SSRunner.back();
}
}
}
// noinspection JSUnusedLocalSymbols
/**
* Event: Fired when a message is sent from either an extension<br>
* (by runtime.sendMessage) or a content script (by tabs.sendMessage).
* @see https://developer.chrome.com/extensions/runtime#event-onMessage
* @param {Chrome.Msg.Message} request - details for the message
* @param {Object} [sender] - MessageSender object
* @param {Function} [response] - function to call once after processing
* @returns {boolean} true if asynchronous
* @private
* @memberOf app.SSEvents
*/
function _onMessage(request, sender, response) {
if (request.message === app.Msg.SS_CLOSE.message) {
_close();
} else if (request.message === app.Msg.SS_IS_SHOWING.message) {
// let people know we are here
response({message: 'OK'});
}
return false;
}
/**
* Event: KeyboardEvent
* @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
* @param {KeyboardEvent} ev - KeyboardEvent
* @private
* @memberOf app.SSEvents
*/
function _onKey(ev) {
const keyName = ev.key;
if (!app.SSRunner.isStarted()) {
_close();
return;
}
switch (keyName) {
case 'Alt':
case 'Shift':
case ' ':
case 'ArrowLeft':
case 'ArrowRight':
// fallthrough
if (!app.SSRunner.isInteractive()) {
_close();
}
break;
default:
_close();
break;
}
}
/**
* Event: mousemove
* @param {MouseEvent} ev - mousemove event
* @private
* @memberOf app.SSEvents
*/
function _onMouseMove(ev) {
if (_MOUSE_START.x && _MOUSE_START.y) {
const deltaX = Math.abs(ev.clientX - _MOUSE_START.x);
const deltaY = Math.abs(ev.clientY - _MOUSE_START.y);
if (Math.max(deltaX, deltaY) > 10) {
// close after a minimum amount of mouse movement
_close();
}
} else {
// first move, set values
_MOUSE_START.x = ev.clientX;
_MOUSE_START.y = ev.clientY;
}
}
/**
* Event: mouse click
* @private
* @memberOf app.SSEvents
*/
function _onMouseClick() {
if (app.SSRunner.isStarted()) {
const idx = app.SSViews.getSelectedIndex();
const allowPhotoClicks = Chrome.Storage.getBool('allowPhotoClicks');
if (allowPhotoClicks && (typeof(idx) !== 'undefined')) {
const view = app.SSViews.get(idx);
view.photo.showSource();
}
}
_close();
}
return {
/**
* Add the event listeners
* @memberOf app.SSEvents
*/
initialize: function() {
// listen for chrome messages
Chrome.Msg.listen(_onMessage);
// listen for key events
window.addEventListener('keydown', _onKey, false);
// listen for mousemove events
window.addEventListener('mousemove', _onMouseMove, false);
// listen for mouse click events
window.addEventListener('click', _onMouseClick, false);
// listen for special keyboard commands
chrome.commands.onCommand.addListener(_onKeyCommand);
},
};
})();