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