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