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->Void> = []; static var foregroundListeners: ArrayVoid> = []; static var resumeListeners: ArrayVoid> = []; static var pauseListeners: ArrayVoid> = []; static var backgroundListeners: ArrayVoid> = []; static var shutdownListeners: ArrayVoid> = []; static var dropFilesListeners: ArrayVoid> = []; 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) { 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->Void): Void { renderListeners.push(listener); } /** * Removes a previously set frames listener. * @param listener * The callback to remove */ public static function removeFramesListener(listener: Array->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): 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); } }