forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			377 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			377 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha; | ||
|  | 
 | ||
|  | import kha.WindowOptions; | ||
|  | 
 | ||
|  | @:structInit | ||
|  | class SystemOptions { | ||
|  | 	@:optional public var title: String = "Kha"; | ||
|  | 	@:optional public var width: Int = -1; | ||
|  | 	@:optional public var height: Int = -1; | ||
|  | 	@:optional public var window: WindowOptions = null; | ||
|  | 	@:optional public var framebuffer: FramebufferOptions = null; | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Used to provide parameters for System.start | ||
|  | 	 * @param title The application title is the default window title (unless the window parameter provides a title of its own) | ||
|  | 	 * and is used for various other purposes - for example for save data locations | ||
|  | 	 * @param width Just a shortcut which overwrites window.width if set | ||
|  | 	 * @param height Just a shortcut which overwrites window.height if set | ||
|  | 	 * @param window Optionally provide window options | ||
|  | 	 * @param framebuffer Optionally provide framebuffer options | ||
|  | 	 */ | ||
|  | 	public function new(title: String = "Kha", ?width: Int = -1, ?height: Int = -1, window: WindowOptions = null, framebuffer: FramebufferOptions = null) { | ||
|  | 		this.title = title; | ||
|  | 		this.window = window == null ? {} : window; | ||
|  | 
 | ||
|  | 		if (width > 0) { | ||
|  | 			this.window.width = width; | ||
|  | 			this.width = width; | ||
|  | 		} | ||
|  | 		else { | ||
|  | 			this.width = this.window.width; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (height > 0) { | ||
|  | 			this.window.height = height; | ||
|  | 			this.height = height; | ||
|  | 		} | ||
|  | 		else { | ||
|  | 			this.height = this.window.height; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (this.window.title == null) { | ||
|  | 			this.window.title = title; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		this.framebuffer = framebuffer == null ? {} : framebuffer; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | typedef OldSystemOptions = { | ||
|  | 	?title: String, | ||
|  | 	?width: Int, | ||
|  | 	?height: Int, | ||
|  | 	?samplesPerPixel: Int, | ||
|  | 	?vSync: Bool, | ||
|  | 	?windowMode: WindowMode, | ||
|  | 	?resizable: Bool, | ||
|  | 	?maximizable: Bool, | ||
|  | 	?minimizable: Bool | ||
|  | } | ||
|  | 
 | ||
|  | @:allow(kha.SystemImpl) | ||
|  | class System { | ||
|  | 	static var renderListeners: Array<Array<Framebuffer>->Void> = []; | ||
|  | 	static var foregroundListeners: Array<Void->Void> = []; | ||
|  | 	static var resumeListeners: Array<Void->Void> = []; | ||
|  | 	static var pauseListeners: Array<Void->Void> = []; | ||
|  | 	static var backgroundListeners: Array<Void->Void> = []; | ||
|  | 	static var shutdownListeners: Array<Void->Void> = []; | ||
|  | 	static var dropFilesListeners: Array<String->Void> = []; | ||
|  | 	static var cutListener: Void->String = null; | ||
|  | 	static var copyListener: Void->String = null; | ||
|  | 	static var pasteListener: String->Void = null; | ||
|  | 	static var loginListener: Void->Void = null; | ||
|  | 	static var logoutListener: Void->Void = null; | ||
|  | 	static var theTitle: String; | ||
|  | 
 | ||
|  | 	@:deprecated("Use System.start instead") | ||
|  | 	public static function init(options: OldSystemOptions, callback: Void->Void): Void { | ||
|  | 		var features: kha.WindowFeatures = None; | ||
|  | 		if (options.resizable) | ||
|  | 			features |= WindowFeatures.FeatureResizable; | ||
|  | 		if (options.maximizable) | ||
|  | 			features |= WindowFeatures.FeatureMaximizable; | ||
|  | 		if (options.minimizable) | ||
|  | 			features |= WindowFeatures.FeatureMinimizable; | ||
|  | 
 | ||
|  | 		var newOptions: SystemOptions = { | ||
|  | 			title: options.title, | ||
|  | 			width: options.width, | ||
|  | 			height: options.height, | ||
|  | 			window: { | ||
|  | 				mode: options.windowMode, | ||
|  | 				windowFeatures: features | ||
|  | 			}, | ||
|  | 			framebuffer: { | ||
|  | 				samplesPerPixel: options.samplesPerPixel, | ||
|  | 				verticalSync: options.vSync | ||
|  | 			} | ||
|  | 		}; | ||
|  | 		start(newOptions, function(_) { | ||
|  | 			callback(); | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function start(options: SystemOptions, callback: Window->Void): Void { | ||
|  | 		theTitle = options.title; | ||
|  | 		SystemImpl.init(options, callback); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static var title(get, never): String; | ||
|  | 
 | ||
|  | 	static function get_title(): String { | ||
|  | 		return theTitle; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:deprecated("Use System.notifyOnFrames instead") | ||
|  | 	public static function notifyOnRender(listener: Framebuffer->Void, id: Int = 0): Void { | ||
|  | 		renderListeners.push(function(framebuffers: Array<Framebuffer>) { | ||
|  | 			if (id < framebuffers.length) { | ||
|  | 				listener(framebuffers[id]); | ||
|  | 			} | ||
|  | 		}); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * The provided listener is called when new framebuffers are ready for rendering into. | ||
|  | 	 * Each framebuffer corresponds to the kha.Window of the same index, single-window | ||
|  | 	 * applications always receive an array of only one framebuffer. | ||
|  | 	 * @param listener | ||
|  | 	 * The callback to add | ||
|  | 	 */ | ||
|  | 	public static function notifyOnFrames(listener: Array<Framebuffer>->Void): Void { | ||
|  | 		renderListeners.push(listener); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Removes a previously set frames listener. | ||
|  | 	 * @param listener | ||
|  | 	 * The callback to remove | ||
|  | 	 */ | ||
|  | 	public static function removeFramesListener(listener: Array<Framebuffer>->Void): Void { | ||
|  | 		renderListeners.remove(listener); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function notifyOnApplicationState(foregroundListener: Void->Void, resumeListener: Void->Void, pauseListener: Void->Void, | ||
|  | 			backgroundListener: Void->Void, shutdownListener: Void->Void): Void { | ||
|  | 		if (foregroundListener != null) | ||
|  | 			foregroundListeners.push(foregroundListener); | ||
|  | 		if (resumeListener != null) | ||
|  | 			resumeListeners.push(resumeListener); | ||
|  | 		if (pauseListener != null) | ||
|  | 			pauseListeners.push(pauseListener); | ||
|  | 		if (backgroundListener != null) | ||
|  | 			backgroundListeners.push(backgroundListener); | ||
|  | 		if (shutdownListener != null) | ||
|  | 			shutdownListeners.push(shutdownListener); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function removeApplicationStateListeners(foregroundListener: Void->Void, resumeListener: Void->Void, pauseListener: Void->Void, | ||
|  | 			backgroundListener: Void->Void, shutdownListener: Void->Void): Void { | ||
|  | 		if (foregroundListener != null) | ||
|  | 			foregroundListeners.remove(foregroundListener); | ||
|  | 		if (resumeListener != null) | ||
|  | 			resumeListeners.remove(resumeListener); | ||
|  | 		if (pauseListener != null) | ||
|  | 			pauseListeners.remove(pauseListener); | ||
|  | 		if (backgroundListener != null) | ||
|  | 			backgroundListeners.remove(backgroundListener); | ||
|  | 		if (shutdownListener != null) | ||
|  | 			shutdownListeners.remove(shutdownListener); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function notifyOnDropFiles(dropFilesListener: String->Void): Void { | ||
|  | 		dropFilesListeners.push(dropFilesListener); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function removeDropListener(listener: String->Void): Void { | ||
|  | 		dropFilesListeners.remove(listener); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function notifyOnCutCopyPaste(cutListener: Void->String, copyListener: Void->String, pasteListener: String->Void): Void { | ||
|  | 		System.cutListener = cutListener; | ||
|  | 		System.copyListener = copyListener; | ||
|  | 		System.pasteListener = pasteListener; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/*public static function copyToClipboard(text: String) { | ||
|  | 		SystemImpl.copyToClipboard(text); | ||
|  | 	}*/ | ||
|  | 	public static function notifyOnLoginLogout(loginListener: Void->Void, logoutListener: Void->Void) { | ||
|  | 		System.loginListener = loginListener; | ||
|  | 		System.logoutListener = logoutListener; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function login(): Void { | ||
|  | 		SystemImpl.login(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function waitingForLogin(): Bool { | ||
|  | 		return SystemImpl.waitingForLogin(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function allowUserChange(): Void { | ||
|  | 		SystemImpl.allowUserChange(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function disallowUserChange(): Void { | ||
|  | 		SystemImpl.disallowUserChange(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function render(framebuffers: Array<Framebuffer>): Void { | ||
|  | 		for (listener in renderListeners) { | ||
|  | 			listener(framebuffers); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function foreground(): Void { | ||
|  | 		for (listener in foregroundListeners) { | ||
|  | 			listener(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function resume(): Void { | ||
|  | 		for (listener in resumeListeners) { | ||
|  | 			listener(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function pause(): Void { | ||
|  | 		for (listener in pauseListeners) { | ||
|  | 			listener(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function background(): Void { | ||
|  | 		for (listener in backgroundListeners) { | ||
|  | 			listener(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function shutdown(): Void { | ||
|  | 		for (listener in shutdownListeners) { | ||
|  | 			listener(); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	static function dropFiles(filePath: String): Void { | ||
|  | 		for (listener in dropFilesListeners) { | ||
|  | 			listener(filePath); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static var time(get, null): Float; | ||
|  | 
 | ||
|  | 	static function get_time(): Float { | ||
|  | 		return SystemImpl.getTime(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function windowWidth(window: Int = 0): Int { | ||
|  | 		return Window.get(window).width; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function windowHeight(window: Int = 0): Int { | ||
|  | 		return Window.get(window).height; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static var screenRotation(get, null): ScreenRotation; | ||
|  | 
 | ||
|  | 	static function get_screenRotation(): ScreenRotation { | ||
|  | 		return RotationNone; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static var systemId(get, null): String; | ||
|  | 
 | ||
|  | 	static function get_systemId(): String { | ||
|  | 		return SystemImpl.getSystemId(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Pulses the vibration hardware on the device for time in milliseconds, if such hardware exists. | ||
|  | 	 */ | ||
|  | 	public static function vibrate(ms: Int): Void { | ||
|  | 		return SystemImpl.vibrate(ms); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * The IS0 639 system current language identifier. | ||
|  | 	 */ | ||
|  | 	public static var language(get, never): String; | ||
|  | 
 | ||
|  | 	static function get_language(): String { | ||
|  | 		return SystemImpl.getLanguage(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/** | ||
|  | 	 * Schedules the application to stop as soon as possible. This is not possible on all targets. | ||
|  | 	 * @return Returns true if the application can be stopped | ||
|  | 	 */ | ||
|  | 	public static function stop(): Bool { | ||
|  | 		return SystemImpl.requestShutdown(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function loadUrl(url: String): Void { | ||
|  | 		SystemImpl.loadUrl(url); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:deprecated("This only returns a default value") | ||
|  | 	public static function canSwitchFullscreen(): Bool { | ||
|  | 		return true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:deprecated("Use the kha.Window API instead") | ||
|  | 	public static function isFullscreen(): Bool { | ||
|  | 		return Window.get(0).mode == WindowMode.Fullscreen || Window.get(0).mode == WindowMode.ExclusiveFullscreen; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:deprecated("Use the kha.Window API instead") | ||
|  | 	public static function requestFullscreen(): Void { | ||
|  | 		Window.get(0).mode = WindowMode.Fullscreen; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:deprecated("Use the kha.Window API instead") | ||
|  | 	public static function exitFullscreen(): Void { | ||
|  | 		Window.get(0).mode = WindowMode.Windowed; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:deprecated("This does nothing") | ||
|  | 	public static function notifyOnFullscreenChange(func: Void->Void, error: Void->Void): Void {} | ||
|  | 
 | ||
|  | 	@:deprecated("This does nothing") | ||
|  | 	public static function removeFullscreenListener(func: Void->Void, error: Void->Void): Void {} | ||
|  | 
 | ||
|  | 	@:deprecated("This does nothing. On Windows you can use Window.resize instead after setting the mode to ExclusiveFullscreen") | ||
|  | 	public static function changeResolution(width: Int, height: Int): Void {} | ||
|  | 
 | ||
|  | 	@:deprecated("Use System.stop instead") | ||
|  | 	public static function requestShutdown(): Void { | ||
|  | 		stop(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:deprecated("Use the kha.Window API instead") | ||
|  | 	public static var vsync(get, null): Bool; | ||
|  | 
 | ||
|  | 	static function get_vsync(): Bool { | ||
|  | 		return Window.get(0).vSynced; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:deprecated("Use the kha.Display API instead") | ||
|  | 	public static var refreshRate(get, null): Int; | ||
|  | 
 | ||
|  | 	static function get_refreshRate(): Int { | ||
|  | 		return Display.primary.frequency; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:deprecated("Use the kha.Display API instead") | ||
|  | 	public static function screenDpi(): Int { | ||
|  | 		return Display.primary.pixelsPerInch; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function safeZone(): Float { | ||
|  | 		return SystemImpl.safeZone(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function automaticSafeZone(): Bool { | ||
|  | 		return SystemImpl.automaticSafeZone(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function setSafeZone(value: Float): Void { | ||
|  | 		SystemImpl.setSafeZone(value); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public static function unlockAchievement(id: Int): Void { | ||
|  | 		SystemImpl.unlockAchievement(id); | ||
|  | 	} | ||
|  | } |