From b6b1e29c5f25e58d86eaddb6ef9381daccc15df3 Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Tue, 6 Jun 2017 21:37:02 -0700 Subject: [PATCH] Initial support for fullscreen, setIcon and title on HTML5 window (resolve #985) --- lime/_backend/html5/HTML5Window.hx | 129 ++++++++++++++++++++++++++++- lime/ui/Window.hx | 2 + 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/lime/_backend/html5/HTML5Window.hx b/lime/_backend/html5/HTML5Window.hx index ac16aea09..554afa643 100644 --- a/lime/_backend/html5/HTML5Window.hx +++ b/lime/_backend/html5/HTML5Window.hx @@ -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 (); 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))) { diff --git a/lime/ui/Window.hx b/lime/ui/Window.hx index b9e399816..959408be9 100644 --- a/lime/ui/Window.hx +++ b/lime/ui/Window.hx @@ -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;