LNXSDK/Kha/Sources/kha/System.hx

377 lines
10 KiB
Haxe
Raw Normal View History

2025-01-22 16:18:30 +01:00
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);
}
}