|
@@ -0,0 +1,173 @@
|
|
|
+package hxd;
|
|
|
+
|
|
|
+enum Platform {
|
|
|
+ IOS;
|
|
|
+ Android;
|
|
|
+ WebGL;
|
|
|
+ PC;
|
|
|
+ Console;
|
|
|
+ FlashPlayer;
|
|
|
+}
|
|
|
+
|
|
|
+enum SystemValue {
|
|
|
+ IsTouch;
|
|
|
+ IsWindowed;
|
|
|
+ IsMobile;
|
|
|
+}
|
|
|
+
|
|
|
+class System {
|
|
|
+
|
|
|
+ public static var width(get,never) : Int;
|
|
|
+ public static var height(get, never) : Int;
|
|
|
+ public static var lang(get, never) : String;
|
|
|
+ public static var platform(get, never) : Platform;
|
|
|
+ public static var screenDPI(get,never) : Float;
|
|
|
+ public static var setCursor = setNativeCursor;
|
|
|
+ public static var allowTimeout(get, set) : Bool;
|
|
|
+
|
|
|
+ public static function timeoutTick() : Void {
|
|
|
+ }
|
|
|
+
|
|
|
+ static var loopFunc : Void -> Void;
|
|
|
+
|
|
|
+ // JS
|
|
|
+ static var loopInit = false;
|
|
|
+ static var currentNativeCursor:hxd.Cursor;
|
|
|
+ static var currentCustomCursor:hxd.Cursor.CustomCursor;
|
|
|
+
|
|
|
+ /** If greater than 0, this will reduce loop framerate to reduce CPU usage **/
|
|
|
+ public static var fpsLimit = -1;
|
|
|
+
|
|
|
+ public static function getCurrentLoop() : Void -> Void {
|
|
|
+ return loopFunc;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function setLoop( f : Void -> Void ) : Void {
|
|
|
+ if( !loopInit ) {
|
|
|
+ loopInit = true;
|
|
|
+ browserLoop();
|
|
|
+ }
|
|
|
+ loopFunc = f;
|
|
|
+ }
|
|
|
+
|
|
|
+ static function browserLoop() {
|
|
|
+ if( js.Browser.supported ) {
|
|
|
+ var window : Dynamic = js.Browser.window;
|
|
|
+ var rqf : Dynamic = window.requestAnimationFrame ||
|
|
|
+ window.webkitRequestAnimationFrame ||
|
|
|
+ window.mozRequestAnimationFrame;
|
|
|
+ if( fpsLimit>0 )
|
|
|
+ js.Browser.window.setTimeout( ()->rqf(browserLoop), 1000/fpsLimit );
|
|
|
+ else
|
|
|
+ rqf(browserLoop);
|
|
|
+ } else {
|
|
|
+ #if (nodejs && hxnodejs)
|
|
|
+ js.node.Timers.setTimeout(browserLoop, 0);
|
|
|
+ #else
|
|
|
+ throw "Cannot use browserLoop without Browser support nor defining nodejs + hxnodejs";
|
|
|
+ #end
|
|
|
+ }
|
|
|
+ if( loopFunc != null ) loopFunc();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function start( callb : Void -> Void ) : Void {
|
|
|
+ callb();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function setNativeCursor( c : Cursor ) : Void {
|
|
|
+ if( currentNativeCursor != null && c.equals(currentNativeCursor) )
|
|
|
+ return;
|
|
|
+ currentNativeCursor = c;
|
|
|
+ currentCustomCursor = null;
|
|
|
+ var canvas = @:privateAccess hxd.Window.getInstance().canvas;
|
|
|
+ if( canvas != null ) {
|
|
|
+ canvas.style.cursor = switch( c ) {
|
|
|
+ case Default: "default";
|
|
|
+ case Button: "pointer";
|
|
|
+ case Move: "move";
|
|
|
+ case TextInput: "text";
|
|
|
+ case Hide: "none";
|
|
|
+ case Callback(_): throw "assert";
|
|
|
+ case Custom(cur):
|
|
|
+ if ( cur.alloc == null ) {
|
|
|
+ cur.alloc = new Array();
|
|
|
+ for ( frame in cur.frames ) {
|
|
|
+ cur.alloc.push("url(\"" + frame.toNative().canvas.toDataURL("image/png") + "\") " + cur.offsetX + " " + cur.offsetY + ", default");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ( cur.frames.length > 1 ) {
|
|
|
+ currentCustomCursor = cur;
|
|
|
+ cur.reset();
|
|
|
+ }
|
|
|
+ cur.alloc[cur.frameIndex];
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function getDeviceName() : String {
|
|
|
+ return "Unknown";
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function getDefaultFrameRate() : Float {
|
|
|
+ return 60.;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function getValue( s : SystemValue ) : Bool {
|
|
|
+ return switch( s ) {
|
|
|
+ case IsWindowed: true;
|
|
|
+ case IsTouch: platform==Android || platform==IOS;
|
|
|
+ case IsMobile: platform==Android || platform==IOS;
|
|
|
+ default: false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function exit() : Void {
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function openURL( url : String ) : Void {
|
|
|
+ js.Browser.window.open(url, '_blank');
|
|
|
+ }
|
|
|
+
|
|
|
+ static function updateCursor() : Void {
|
|
|
+ if ( currentCustomCursor != null ) {
|
|
|
+ var change = currentCustomCursor.update(hxd.Timer.elapsedTime);
|
|
|
+ if ( change != -1 ) {
|
|
|
+ var canvas = @:privateAccess hxd.Window.getInstance().canvas;
|
|
|
+ if ( canvas != null ) {
|
|
|
+ canvas.style.cursor = currentCustomCursor.alloc[change];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function getClipboardText() : String {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function setClipboardText(text:String) : Bool {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // getters
|
|
|
+
|
|
|
+ static function get_width() : Int return Math.round(js.Browser.document.body.clientWidth * js.Browser.window.devicePixelRatio);
|
|
|
+ static function get_height() : Int return Math.round(js.Browser.document.body.clientHeight * js.Browser.window.devicePixelRatio);
|
|
|
+ static function get_lang() : String return "en";
|
|
|
+ static function get_platform() : Platform {
|
|
|
+ var ua = js.Browser.navigator.userAgent.toLowerCase();
|
|
|
+ if( ua.indexOf("android")>=0 )
|
|
|
+ return Android;
|
|
|
+ else if( ua.indexOf("ipad")>=0 || ua.indexOf("iphone")>=0 || ua.indexOf("ipod")>=0 )
|
|
|
+ return IOS;
|
|
|
+ else
|
|
|
+ return PC;
|
|
|
+ }
|
|
|
+ static function get_screenDPI() : Int return 72;
|
|
|
+ static function get_allowTimeout() return false;
|
|
|
+ static function set_allowTimeout(b) return false;
|
|
|
+
|
|
|
+ static function __init__() : Void {
|
|
|
+ haxe.MainLoop.add(updateCursor, -1);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|