116 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
package kha.input;
 | 
						|
 | 
						|
import kha.netsync.Controller;
 | 
						|
 | 
						|
/** See `Keyboard.disableSystemInterventions` */
 | 
						|
enum BlockInterventions {
 | 
						|
	Default;
 | 
						|
	Full;
 | 
						|
	None;
 | 
						|
	Custom(func: (code: KeyCode) -> Bool);
 | 
						|
}
 | 
						|
 | 
						|
@:allow(kha.SystemImpl)
 | 
						|
@:expose
 | 
						|
class Keyboard extends Controller {
 | 
						|
	static var keyBehavior = BlockInterventions.Default;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get current Keyboard.
 | 
						|
	 * @param num (optional) keyboard id (0 by default).
 | 
						|
	 */
 | 
						|
	public static function get(num: Int = 0): Keyboard {
 | 
						|
		return SystemImpl.getKeyboard(num);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Disables system hotkeys (html5 only).
 | 
						|
	 * @param behavior can be:
 | 
						|
	 *   Default - allow F-keys and char keys.
 | 
						|
	 *   Full - disable all keys (that browser allows).
 | 
						|
	 *   None - do not block any key.
 | 
						|
	 *   Custom(func:(code:Int)->Bool) - set custom handler for keydown event (should return true if keycode blocked).
 | 
						|
	 */
 | 
						|
	public static function disableSystemInterventions(behavior: BlockInterventions): Void {
 | 
						|
		keyBehavior = behavior;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Creates event handlers from passed functions.
 | 
						|
	 * @param downListener (optional) function with `key:KeyCode` argument, fired when a key is pressed down.
 | 
						|
	 * @param upListener (optional) function with `key:KeyCode` argument, fired when a key is released.
 | 
						|
	 * @param pressListener (optional) function with `char:String` argument, fired when a key that produces a character value is pressed down.
 | 
						|
	 */
 | 
						|
	public function notify(?downListener: (key: KeyCode) -> Void, ?upListener: (key: KeyCode) -> Void, ?pressListener: (char: String) -> Void = null): Void {
 | 
						|
		if (downListener != null)
 | 
						|
			downListeners.push(downListener);
 | 
						|
		if (upListener != null)
 | 
						|
			upListeners.push(upListener);
 | 
						|
		if (pressListener != null)
 | 
						|
			pressListeners.push(pressListener);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Removes event handlers from the passed functions that were passed to `notify` function.
 | 
						|
	 */
 | 
						|
	public function remove(?downListener: (key: KeyCode) -> Void, ?upListener: (key: KeyCode) -> Void, ?pressListener: (char: String) -> Void): Void {
 | 
						|
		if (downListener != null)
 | 
						|
			downListeners.remove(downListener);
 | 
						|
		if (upListener != null)
 | 
						|
			upListeners.remove(upListener);
 | 
						|
		if (pressListener != null)
 | 
						|
			pressListeners.remove(pressListener);
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Show virtual keyboard (if it exists).
 | 
						|
	 */
 | 
						|
	public function show(): Void {}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Hide virtual keyboard (if it exists).
 | 
						|
	 */
 | 
						|
	public function hide(): Void {}
 | 
						|
 | 
						|
	static var instance: Keyboard;
 | 
						|
 | 
						|
	var downListeners: Array<(key: KeyCode) -> Void>;
 | 
						|
	var upListeners: Array<(key: KeyCode) -> Void>;
 | 
						|
	var pressListeners: Array<(char: String) -> Void>;
 | 
						|
 | 
						|
	function new() {
 | 
						|
		super();
 | 
						|
		downListeners = [];
 | 
						|
		upListeners = [];
 | 
						|
		pressListeners = [];
 | 
						|
		instance = this;
 | 
						|
	}
 | 
						|
 | 
						|
	@input
 | 
						|
	function sendDownEvent(code: KeyCode): Void {
 | 
						|
		#if sys_server
 | 
						|
		// js.Node.console.log(kha.Scheduler.time() + " Down: " + key + " from " + kha.network.Session.the().me.id);
 | 
						|
		#end
 | 
						|
		for (listener in downListeners) {
 | 
						|
			listener(code);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	@input
 | 
						|
	function sendUpEvent(code: KeyCode): Void {
 | 
						|
		#if sys_server
 | 
						|
		// js.Node.console.log(kha.Scheduler.time() + " Up: " + key + " from " + kha.network.Session.the().me.id);
 | 
						|
		#end
 | 
						|
		for (listener in upListeners) {
 | 
						|
			listener(code);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	@input
 | 
						|
	function sendPressEvent(char: String): Void {
 | 
						|
		for (listener in pressListeners) {
 | 
						|
			listener(char);
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |