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);
}