Added programatic support for custom key bindings with optional descriptions to be added to the help screen
This commit is contained in:
		
							
								
								
									
										71
									
								
								js/reveal.js
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								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 += '<tr><td>' + key + '</td><td>' + keyboardShortcuts[ key ] + '</td></tr>';
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			// add custom key bindings that have associated descriptions
 | 
			
		||||
			for( var binding in registeredKeyBindings ) {
 | 
			
		||||
				if (registeredKeyBindings[binding].key && registeredKeyBindings[binding].description) {
 | 
			
		||||
					html += '<tr><td>' + registeredKeyBindings[binding].key + '</td><td>' + registeredKeyBindings[binding].description + '</td></tr>';
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			html += '</table>';
 | 
			
		||||
 | 
			
		||||
			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 } );
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user