From 7297474b2e683f6e6e382891b2ec36e7f22c0764 Mon Sep 17 00:00:00 2001 From: Greg Denehy Date: Sun, 30 Apr 2017 15:23:04 +0930 Subject: [PATCH] Added programatic support for custom key bindings with optional descriptions to be added to the help screen --- js/reveal.js | 71 +++++++++++++++++++++++++++++++++++++++++-- plugin/notes/notes.js | 14 +-------- 2 files changed, 70 insertions(+), 15 deletions(-) diff --git a/js/reveal.js b/js/reveal.js index e25337e..e8833c4 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -232,7 +232,10 @@ 'B , .': 'Pause', 'F': 'Fullscreen', 'ESC, O': 'Slide overview' - }; + }, + + // Holds custom key code mappings + registeredKeyBindings = {}; /** * Starts up the presentation if the client is capable. @@ -1091,6 +1094,33 @@ } + /** + * Add a custom key binding with optional description to be added to the help screen + */ + function addKeyBinding(binding, callback) { + if (typeof binding === 'object' && binding.code) { + registeredKeyBindings[binding.code] = { + callback: callback, + key: binding.key, + description: binding.description + } + } + else { + registeredKeyBindings[binding] = { + callback: callback, + key: null, + description: null + } + } + } + + /** + * Removes the specified custom key binding + */ + function removeKeyBinding(binding) { + delete registeredKeyBindings[binding]; + } + /** * Extend object a with the properties of object b. * If there's a conflict, object b takes precedence. @@ -1518,6 +1548,13 @@ html += '' + key + '' + keyboardShortcuts[ key ] + ''; } + // add custom key bindings that have associated descriptions + for( var binding in registeredKeyBindings ) { + if (registeredKeyBindings[binding].key && registeredKeyBindings[binding].description) { + html += '' + registeredKeyBindings[binding].key + '' + registeredKeyBindings[binding].description + ''; + } + } + html += ''; dom.overlay.innerHTML = [ @@ -3967,7 +4004,31 @@ } - // 2. System defined key bindings + // 2. Registered custom key bindings + if( triggered === false ) { + + for( key in registeredKeyBindings ) { + + // Check if this binding matches the pressed key + if( parseInt( key, 10 ) === event.keyCode ) { + + var value = registeredKeyBindings[ key ].callback; + + // Callback function + if( typeof value === 'function' ) { + value.apply( null, [ event ] ); + } + // String shortcuts to reveal.js API + else if( typeof value === 'string' && typeof Reveal[ value ] === 'function' ) { + Reveal[ value ].call(); + } + + triggered = true; + } + } + } + + // 3. System defined key bindings if( triggered === false ) { // Assume true and try to prove false @@ -4676,6 +4737,12 @@ } }, + // Adds a custom key binding + addKeyBinding: addKeyBinding, + + // Removes a custom key binding + removeKeyBinding: removeKeyBinding, + // Programatically triggers a keyboard event triggerKey: function( keyCode ) { onDocumentKeyDown( { keyCode: keyCode } ); diff --git a/plugin/notes/notes.js b/plugin/notes/notes.js index 202e73b..8980fb4 100644 --- a/plugin/notes/notes.js +++ b/plugin/notes/notes.js @@ -106,19 +106,7 @@ var RevealNotes = (function() { } // Open the notes when the 's' key is hit - document.addEventListener( 'keydown', function( event ) { - // Disregard the event if the target is editable or a - // modifier is present - if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return; - - // Disregard the event if keyboard is disabled - if ( Reveal.getConfig().keyboard === false ) return; - - if( event.keyCode === 83 ) { - event.preventDefault(); - openNotes(); - } - }, false ); + Reveal.addKeyBinding({code: 83, key: 'S', description: 'Speaker notes'}, openNotes); }