WebGLWindow.jslib 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. var WebGLWindow = {
  2. focusListener: null,
  3. blurListener: null,
  4. resizeListener: null,
  5. WebGLWindowInit : function() {
  6. // use WebAssembly.Table : makeDynCall
  7. // when enable. dynCall is undefined
  8. if(typeof dynCall === "undefined")
  9. {
  10. // make Runtime.dynCall to undefined
  11. Runtime = { dynCall : undefined }
  12. }
  13. else
  14. {
  15. // Remove the `Runtime` object from "v1.37.27: 12/24/2017"
  16. // if Runtime not defined. create and add functon!!
  17. if(typeof Runtime === "undefined") Runtime = { dynCall : dynCall }
  18. }
  19. },
  20. WebGLWindowUninit : function() {
  21. if(focusListener) {
  22. window.removeEventListener('focus', this.focusListener);
  23. this.focusListener = null;
  24. }
  25. if(blurListener) {
  26. window.removeEventListener('blur', this.blurListener);
  27. this.blurListener = null;
  28. }
  29. if(resizeListener) {
  30. window.removeEventListener('resize', this.resizeListener);
  31. this.resizeListener = null;
  32. }
  33. },
  34. WebGLWindowGetCanvasName: function() {
  35. var elements = document.getElementsByTagName('canvas');
  36. var returnStr = "";
  37. if(elements.length >= 1)
  38. {
  39. returnStr = elements[0].parentNode.id;
  40. // workaround : for WebGLTemplate:Minimal temp! body element not have id!
  41. if(returnStr == '')
  42. {
  43. returnStr = elements[0].parentNode.id = 'WebGLWindow:Canvas:ParentNode';
  44. }
  45. }
  46. var bufferSize = lengthBytesUTF8(returnStr) + 1;
  47. var buffer = _malloc(bufferSize);
  48. stringToUTF8(returnStr, buffer, bufferSize);
  49. return buffer;
  50. },
  51. WebGLWindowOnFocus: function (cb) {
  52. this.focusListener = function () {
  53. (!!Runtime.dynCall) ? Runtime.dynCall("v", cb, []) : {{{ makeDynCall("v", "cb") }}}();
  54. };
  55. window.addEventListener('focus', this.focusListener);
  56. },
  57. WebGLWindowOnBlur: function (cb) {
  58. this.blurListener = function () {
  59. (!!Runtime.dynCall) ? Runtime.dynCall("v", cb, []) : {{{ makeDynCall("v", "cb") }}}();
  60. };
  61. window.addEventListener('blur', this.blurListener);
  62. },
  63. WebGLWindowOnResize: function(cb) {
  64. this.resizeListener = function () {
  65. (!!Runtime.dynCall) ? Runtime.dynCall("v", cb, []) : {{{ makeDynCall("v", "cb") }}}();
  66. };
  67. window.addEventListener('resize', this.resizeListener);
  68. },
  69. WebGLWindowInjectFullscreen : function () {
  70. document.makeFullscreen = function (id, keepAspectRatio) {
  71. // get fullscreen object
  72. var getFullScreenObject = function () {
  73. var doc = window.document;
  74. var objFullScreen = doc.fullscreenElement || doc.mozFullScreenElement || doc.webkitFullscreenElement || doc.msFullscreenElement;
  75. return (objFullScreen);
  76. }
  77. // handle fullscreen event
  78. var eventFullScreen = function (callback) {
  79. document.addEventListener("fullscreenchange", callback, false);
  80. document.addEventListener("webkitfullscreenchange", callback, false);
  81. document.addEventListener("mozfullscreenchange", callback, false);
  82. document.addEventListener("MSFullscreenChange", callback, false);
  83. }
  84. var removeEventFullScreen = function (callback) {
  85. document.removeEventListener("fullscreenchange", callback, false);
  86. document.removeEventListener("webkitfullscreenchange", callback, false);
  87. document.removeEventListener("mozfullscreenchange", callback, false);
  88. document.removeEventListener("MSFullscreenChange", callback, false);
  89. }
  90. var div = document.createElement("div");
  91. document.body.appendChild(div);
  92. // save canvas size to originSize
  93. var canvas = document.getElementsByTagName('canvas')[0];
  94. var originSize =
  95. {
  96. width : canvas.style.width,
  97. height : canvas.style.height,
  98. };
  99. var fullscreenRoot = document.getElementById(id);
  100. // when build with minimal default template
  101. // the fullscreenRoot is <body>
  102. var isBody = fullscreenRoot.tagName.toLowerCase() == "body";
  103. if(isBody)
  104. {
  105. // swip the id to div
  106. div.id = fullscreenRoot.id;
  107. fullscreenRoot.id = "";
  108. // overwrite the fullscreen root
  109. fullscreenRoot = canvas;
  110. }
  111. var beforeParent = fullscreenRoot.parentNode;
  112. var beforeStyle = window.getComputedStyle(fullscreenRoot);
  113. var beforeWidth = parseInt(beforeStyle.width);
  114. var beforeHeight = parseInt(beforeStyle.height);
  115. // to keep element index after fullscreen
  116. var index = Array.from(beforeParent.children).findIndex(function (v) { return v == fullscreenRoot; });
  117. div.appendChild(fullscreenRoot);
  118. // recv fullscreen function
  119. var fullscreenFunc = function () {
  120. if (getFullScreenObject()) {
  121. if (keepAspectRatio) {
  122. var ratio = Math.min(window.screen.width / beforeWidth, window.screen.height / beforeHeight);
  123. var width = Math.floor(beforeWidth * ratio);
  124. var height = Math.floor(beforeHeight * ratio);
  125. fullscreenRoot.style.width = width + 'px';
  126. fullscreenRoot.style.height = height + 'px';
  127. } else {
  128. fullscreenRoot.style.width = window.screen.width + 'px';
  129. fullscreenRoot.style.height = window.screen.height + 'px';
  130. }
  131. // make canvas size 100% to fix screen size
  132. canvas.style.width = "100%";
  133. canvas.style.height = "100%";
  134. } else {
  135. fullscreenRoot.style.width = beforeWidth + 'px';
  136. fullscreenRoot.style.height = beforeHeight + 'px';
  137. beforeParent.insertBefore(fullscreenRoot, Array.from(beforeParent.children)[index]);
  138. if(isBody)
  139. {
  140. beforeParent.id = div.id;
  141. }
  142. div.parentNode.removeChild(div);
  143. // set canvas size to origin size
  144. canvas.style.width = originSize.width;
  145. canvas.style.height = originSize.height;
  146. // remove this function
  147. removeEventFullScreen(fullscreenFunc);
  148. }
  149. }
  150. // listener fullscreen event
  151. eventFullScreen(fullscreenFunc);
  152. if (div.mozRequestFullScreen) div.mozRequestFullScreen();
  153. else if (div.webkitRequestFullScreen) div.webkitRequestFullScreen();
  154. else if (div.msRequestFullscreen) div.msRequestFullscreen();
  155. else if (div.requestFullscreen) div.requestFullscreen();
  156. }
  157. },
  158. MakeFullscreen : function (str) {
  159. document.makeFullscreen(UTF8ToString(str));
  160. },
  161. ExitFullscreen : function() {
  162. // get fullscreen object
  163. var doc = window.document;
  164. var objFullScreen = doc.fullscreenElement || doc.mozFullScreenElement || doc.webkitFullscreenElement || doc.msFullscreenElement;
  165. if (objFullScreen)
  166. {
  167. if (document.exitFullscreen) document.exitFullscreen();
  168. else if (document.msExitFullscreen) document.msExitFullscreen();
  169. else if (document.mozCancelFullScreen) document.mozCancelFullScreen();
  170. else if (document.webkitExitFullscreen) document.webkitExitFullscreen();
  171. }
  172. },
  173. IsFullscreen : function() {
  174. // get fullscreen object
  175. var doc = window.document;
  176. var objFullScreen = doc.fullscreenElement || doc.mozFullScreenElement || doc.webkitFullscreenElement || doc.msFullscreenElement;
  177. // check full screen elemenet is not null!
  178. return objFullScreen != null;
  179. },
  180. }
  181. mergeInto(LibraryManager.library, WebGLWindow);