196 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			196 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha; | ||
|  | 
 | ||
|  | import js.Syntax; | ||
|  | import js.html.MutationObserver; | ||
|  | 
 | ||
|  | class Window { | ||
|  | 	static var windows: Array<Window> = []; | ||
|  | 	static var resizeCallbacks: Array<Array<Int->Int->Void>> = []; | ||
|  | 
 | ||
|  | 	var num: Int; | ||
|  | 	var canvas: js.html.CanvasElement; | ||
|  | 	var defaultWidth: Int; | ||
|  | 	var defaultHeight: Int; | ||
|  | 
 | ||
|  | 	@:noCompletion | ||
|  | 	@:noDoc | ||
|  | 	public function new(num: Int, defaultWidth: Int, defaultHeight: Int, canvas: js.html.CanvasElement) { | ||
|  | 		this.num = num; | ||
|  | 		this.canvas = canvas; | ||
|  | 		this.defaultWidth = defaultWidth; | ||
|  | 		this.defaultHeight = defaultHeight; | ||
|  | 		windows.push(this); | ||
|  | 		resizeCallbacks[num] = []; | ||
|  | 		windows.push(this); | ||
|  | 		final observer: MutationObserver = new MutationObserver(function(mutations: Array<js.html.MutationRecord>, observer: MutationObserver) { | ||
|  | 			var isResize = false; | ||
|  | 			for (mutation in mutations) { | ||
|  | 				if (mutation.attributeName == "width" || mutation.attributeName == "height") { | ||
|  | 					isResize = true; | ||
|  | 					break; | ||
|  | 				} | ||
|  | 			} | ||
|  | 			if (isResize) { | ||
|  | 				this.resize(canvas.width, canvas.height); | ||
|  | 			} | ||
|  | 		}); | ||
|  | 		observer.observe(canvas, {attributes: true}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function create(win: WindowOptions = null, frame: FramebufferOptions = null): Window { | ||
|  | 		return null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function destroy(window: Window): Void {} | ||
|  | 
 | ||
|  | 	public static function get(index: Int): Window { | ||
|  | 		return windows[index]; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static var all(get, never): Array<Window>; | ||
|  | 
 | ||
|  | 	static function get_all(): Array<Window> { | ||
|  | 		return windows; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function resize(width: Int, height: Int): Void { | ||
|  | 		for (callback in resizeCallbacks[num]) { | ||
|  | 			callback(width, height); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function move(x: Int, y: Int): Void {} | ||
|  | 
 | ||
|  | 	public function changeWindowFeatures(features: Int): Void {} | ||
|  | 
 | ||
|  | 	public function changeFramebuffer(frame: FramebufferOptions): Void {} | ||
|  | 
 | ||
|  | 	public var x(get, set): Int; | ||
|  | 
 | ||
|  | 	function get_x(): Int { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function set_x(value: Int): Int { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var y(get, set): Int; | ||
|  | 
 | ||
|  | 	function get_y(): Int { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function set_y(value: Int): Int { | ||
|  | 		return 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var width(get, set): Int; | ||
|  | 
 | ||
|  | 	function get_width(): Int { | ||
|  | 		return canvas.width == 0 ? defaultWidth : canvas.width; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function set_width(value: Int): Int { | ||
|  | 		return 800; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var height(get, set): Int; | ||
|  | 
 | ||
|  | 	function get_height(): Int { | ||
|  | 		return canvas.height == 0 ? defaultHeight : canvas.height; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function set_height(value: Int): Int { | ||
|  | 		return 600; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var mode(get, set): WindowMode; | ||
|  | 
 | ||
|  | 	function get_mode(): WindowMode { | ||
|  | 		return isFullscreen() ? Fullscreen : Windowed; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function set_mode(mode: WindowMode): WindowMode { | ||
|  | 		if (mode == Fullscreen || mode == ExclusiveFullscreen) { | ||
|  | 			if (!isFullscreen()) { | ||
|  | 				requestFullscreen(); | ||
|  | 			} | ||
|  | 		} | ||
|  | 		else { | ||
|  | 			if (isFullscreen()) { | ||
|  | 				exitFullscreen(); | ||
|  | 			} | ||
|  | 		} | ||
|  | 		return mode; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function isFullscreen(): Bool { | ||
|  | 		return Syntax.code("document.fullscreenElement === this.canvas ||
 | ||
|  | 			document.mozFullScreenElement === this.canvas || | ||
|  | 			document.webkitFullscreenElement === this.canvas || | ||
|  | 			document.msFullscreenElement === this.canvas ");
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function requestFullscreen(): Void { | ||
|  | 		untyped if (canvas.requestFullscreen) { | ||
|  | 			var c: Dynamic = canvas; | ||
|  | 			c.requestFullscreen({navigationUI: "hide"}); | ||
|  | 		} | ||
|  | 		else if (canvas.msRequestFullscreen) { | ||
|  | 			canvas.msRequestFullscreen(); | ||
|  | 		} | ||
|  | 		else if (canvas.mozRequestFullScreen) { | ||
|  | 			canvas.mozRequestFullScreen(); | ||
|  | 		} | ||
|  | 		else if (canvas.webkitRequestFullscreen) { | ||
|  | 			canvas.webkitRequestFullscreen(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function exitFullscreen(): Void { | ||
|  | 		untyped if (document.exitFullscreen) { | ||
|  | 			document.exitFullscreen(); | ||
|  | 		} | ||
|  | 		else if (document.msExitFullscreen) { | ||
|  | 			document.msExitFullscreen(); | ||
|  | 		} | ||
|  | 		else if (document.mozCancelFullScreen) { | ||
|  | 			document.mozCancelFullScreen(); | ||
|  | 		} | ||
|  | 		else if (document.webkitExitFullscreen) { | ||
|  | 			document.webkitExitFullscreen(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var visible(get, set): Bool; | ||
|  | 
 | ||
|  | 	function get_visible(): Bool { | ||
|  | 		return true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function set_visible(value: Bool): Bool { | ||
|  | 		return true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var title(get, set): String; | ||
|  | 
 | ||
|  | 	function get_title(): String { | ||
|  | 		return "Kha"; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function set_title(value: String): String { | ||
|  | 		return "Kha"; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function notifyOnResize(callback: Int->Int->Void): Void { | ||
|  | 		resizeCallbacks[num].push(callback); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var vSynced(get, never): Bool; | ||
|  | 
 | ||
|  | 	function get_vSynced(): Bool { | ||
|  | 		return true; | ||
|  | 	} | ||
|  | } |