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