Initial support for fullscreen, setIcon and title on HTML5 window (resolve #985)

This commit is contained in:
Joshua Granick
2017-06-06 21:37:02 -07:00
parent f4e003d799
commit b6b1e29c5f
2 changed files with 129 additions and 2 deletions

View File

@@ -8,11 +8,13 @@ import js.html.Element;
import js.html.FocusEvent;
import js.html.InputElement;
import js.html.InputEvent;
import js.html.LinkElement;
import js.html.MouseEvent;
import js.html.TouchEvent;
import js.html.ClipboardEvent;
import js.Browser;
import lime.app.Application;
import lime.graphics.utils.ImageCanvasUtil;
import lime.graphics.Image;
import lime.system.Display;
import lime.system.DisplayMode;
@@ -50,8 +52,11 @@ class HTML5Window {
private var cacheMouseY:Float;
private var currentTouches = new Map<Int, Touch> ();
private var enableTextEvents:Bool;
private var isFullscreen:Bool;
private var parent:Window;
private var primaryTouch:Touch;
private var requestedFullscreen:Bool;
private var resizeElement:Bool;
private var scale = 1.0;
private var setHeight:Int;
private var setWidth:Int;
@@ -162,7 +167,7 @@ class HTML5Window {
cacheElementWidth = parent.width;
cacheElementHeight = parent.height;
parent.fullscreen = true;
resizeElement = true;
}
@@ -295,6 +300,42 @@ class HTML5Window {
}
private function handleFullscreenEvent (event:Dynamic):Void {
var fullscreenElement = untyped (document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement);
if (fullscreenElement != null) {
isFullscreen = true;
parent.__fullscreen = true;
if (requestedFullscreen) {
requestedFullscreen = false;
parent.onFullscreen.dispatch ();
}
} else {
isFullscreen = false;
parent.__fullscreen = false;
var changeEvents = [ "fullscreenchange", "mozfullscreenchange", "webkitfullscreenchange", "MSFullscreenChange" ];
var errorEvents = [ "fullscreenerror", "mozfullscreenerror", "webkitfullscreenerror", "MSFullscreenError" ];
for (i in 0...changeEvents.length) {
Browser.document.removeEventListener (changeEvents[i], handleFullscreenEvent, false);
Browser.document.removeEventListener (errorEvents[i], handleFullscreenEvent, false);
}
}
}
private function handleGamepadEvent (event:Dynamic):Void {
switch (event.type) {
@@ -781,6 +822,59 @@ class HTML5Window {
public function setFullscreen (value:Bool):Bool {
if (value) {
if (!requestedFullscreen && !isFullscreen) {
requestedFullscreen = true;
untyped {
if (element.requestFullscreen) {
document.addEventListener ("fullscreenchange", handleFullscreenEvent, false);
document.addEventListener ("fullscreenerror", handleFullscreenEvent, false);
element.requestFullscreen ();
} else if (element.mozRequestFullScreen) {
document.addEventListener ("mozfullscreenchange", handleFullscreenEvent, false);
document.addEventListener ("mozfullscreenerror", handleFullscreenEvent, false);
element.mozRequestFullScreen ();
} else if (element.webkitRequestFullscreen) {
document.addEventListener ("webkitfullscreenchange", handleFullscreenEvent, false);
document.addEventListener ("webkitfullscreenerror", handleFullscreenEvent, false);
element.webkitRequestFullscreen ();
} else if (element.msRequestFullscreen) {
document.addEventListener ("MSFullscreenChange", handleFullscreenEvent, false);
document.addEventListener ("MSFullscreenError", handleFullscreenEvent, false);
element.msRequestFullscreen ();
}
}
}
} else if (isFullscreen) {
requestedFullscreen = false;
untyped {
if (document.exitFullscreen) document.exitFullscreen ();
else if (document.mozCancelFullScreen) document.mozCancelFullScreen ();
else if (document.webkitExitFullscreen) document.webkitExitFullscreen ();
else if (document.msExitFullscreen) document.msExitFullscreen ();
}
}
return value;
}
@@ -788,7 +882,32 @@ class HTML5Window {
public function setIcon (image:Image):Void {
//var iconWidth = 16;
//var iconHeight = 16;
//image = image.clone ();
//if (image.width != iconWidth || image.height != iconHeight) {
//
//image.resize (iconWidth, iconHeight);
//
//}
ImageCanvasUtil.convertToCanvas (image);
var link:LinkElement = cast Browser.document.querySelector ("link[rel*='icon']");
if (link == null) {
link = cast Browser.document.createElement ("link");
}
link.type = "image/x-icon";
link.rel = "shortcut icon";
link.href = image.buffer.src.toDataURL ("image/x-icon");
Browser.document.getElementsByTagName ("head")[0].appendChild (link);
}
@@ -816,6 +935,12 @@ class HTML5Window {
public function setTitle (value:String):String {
if (value != null) {
Browser.document.title = value;
}
return value;
}
@@ -842,7 +967,7 @@ class HTML5Window {
cacheElementWidth = elementWidth;
cacheElementHeight = elementHeight;
var stretch = parent.fullscreen || (setWidth == 0 && setHeight == 0);
var stretch = resizeElement || (setWidth == 0 && setHeight == 0);
if (element != null && (div == null || (div != null && stretch))) {

View File

@@ -102,7 +102,9 @@ class Window {
if (Reflect.hasField (config, "height")) __height = config.height;
if (Reflect.hasField (config, "x")) __x = config.x;
if (Reflect.hasField (config, "y")) __y = config.y;
#if !web
if (Reflect.hasField (config, "fullscreen")) __fullscreen = config.fullscreen;
#end
if (Reflect.hasField (config, "borderless")) __borderless = config.borderless;
if (Reflect.hasField (config, "resizable")) __resizable = config.resizable;
if (Reflect.hasField (config, "title")) __title = config.title;