Adding support for chrome, firefox, safari, opera and maybe others that represent the same options. Added fix for mouse position on cross browsers.

This commit is contained in:
underscorediscovery
2013-07-01 04:10:52 -02:30
parent 5115131a62
commit ddceaa6ea3
3 changed files with 179 additions and 16 deletions

View File

@@ -15,20 +15,44 @@ class InputHandler {
//lib.window_handle = canvas element
lib.window_handle.addEventListener('contextmenu', function(e){
e.preventDefault();
});
}); //contextmenu
//todo:better forward (more info passed on)
lib.window_handle.addEventListener('mousedown', function(e){
e.preventDefault();
lime_mousedown(e);
});
e.preventDefault();
lime_mousedown({
x:e.pageX - lib.render.canvas_position.x,
y:e.pageY - lib.render.canvas_position.y,
button:e.button
}); //mousedown
}); //mousedown
lib.window_handle.addEventListener('mousemove', function(e){
e.preventDefault();
lime_mousemove(e);
});
lime_mousemove({
x:e.pageX - lib.render.canvas_position.x,
y:e.pageY - lib.render.canvas_position.y,
button:e.button
}); //lime_mousemove
}); //mousemove
lib.window_handle.addEventListener('mouseup', function(e){
e.preventDefault();
lime_mouseup(e);
});
lime_mouseup({
x:e.pageX - lib.render.canvas_position.x,
y:e.pageY - lib.render.canvas_position.y,
button:e.button
}); //lime_mouseup
}); //mouseup
js.Browser.document.addEventListener('keydown', function(e){
e.value = e.which+32;

View File

@@ -20,6 +20,16 @@ import lime.geometry.Matrix3D;
import js.Browser;
import js.html.CanvasElement;
enum BrowserLike {
unknown;
chrome;
firefox;
opera;
ie;
safari;
}
#end //lime_html5
@@ -31,7 +41,13 @@ class RenderHandler {
//direct_renderer_handle for drawing
public var direct_renderer_handle : Dynamic;
public function startup() {
#if lime_html5
public var requestAnimFrame : Dynamic;
public var browser : BrowserLike;
public var canvas_position : Dynamic;
#end //lime_html5
public function startup() {
#if lime_native
@@ -47,10 +63,44 @@ class RenderHandler {
#end //lime_native
#if lime_html5
direct_renderer_handle = lib.window_handle.getContext('webgl');
//default to 0,0
canvas_position = {x:0, y:0};
//default to unknown
browser = BrowserLike.unknown;
var _window_handle : js.html.CanvasElement = cast lib.window_handle;
direct_renderer_handle = _window_handle.getContextWebGL({ alpha:false, premultipliedAlpha:false });
//for use with mouseoffsets and so on
update_canvas_position();
if(direct_renderer_handle == null) {
throw "WebGL is required to run this";
}
lime.gl.GL.nmeContext = direct_renderer_handle;
requestAnimFrame = js.Browser.window.requestAnimationFrame;
if(requestAnimFrame != null) {
browser = BrowserLike.chrome;
} else {
var _firefox = untyped js.Browser.window.mozRequestAnimationFrame;
var _safari = untyped js.Browser.window.webkitRequestAnimationFrame;
var _opera = untyped js.Browser.window.oRequestAnimationFrame;
if(_firefox) {
browser = BrowserLike.firefox;
} else if(_safari) {
browser = BrowserLike.safari;
} else if(_opera){
browser = BrowserLike.opera;
}
} //else there is no RequestAnimationFrame
#end //lime_html5
//Done.
@@ -62,11 +112,95 @@ class RenderHandler {
lib._debug(':: lime :: \t RenderHandler shut down.');
}
public function on_resize(_event:Dynamic) {
#if lime_html5
update_canvas_position();
#end //lime_html5
//todo: more things?
}
#if lime_html5
public function update_canvas_position() {
// see the following link for this implementation
// http://www.quirksmode.org/js/findpos.html
var curleft = 0;
var curtop = 0;
//start at the canvas
var _obj : Dynamic = lib.window_handle;
var _has_parent : Bool = true;
var _max_count = 0;
while(_has_parent == true) {
_max_count++;
if(_max_count > 30) {
_has_parent = false;
break;
} //prevent rogue endless loops
if(_obj.offsetParent) {
//it still has an offset parent, add it up
curleft += _obj.offsetLeft;
curtop += _obj.offsetTop;
//then move onto the parent
_obj = _obj.offsetParent;
} else {
//we are done
_has_parent = false;
}
} //while
canvas_position = { x:curleft, y:curtop };
}
public function _requestAnimFrame(callback) {
if(browser == BrowserLike.chrome) {
requestAnimFrame(callback);
} else //chrome
if(browser == BrowserLike.firefox) {
untyped {
js.Browser.window.mozRequestAnimationFrame(callback);
}
} else //firefox
if(browser == BrowserLike.safari) {
untyped {
js.Browser.window.webkitRequestAnimationFrame(callback);
}
} else //safari
if(browser == BrowserLike.opera) {
untyped {
js.Browser.window.oRequestAnimationFrame(callback);
}
} else { //opera
js.Browser.window.setTimeout(cast callback, 16);
} //no RAF? fall back to setTimeout for now
}
#end //lime_html5
public function render() {
#if lime_html5
on_render();
js.Browser.window.requestAnimationFrame(lib.on_update);
_requestAnimFrame( lib.on_update );
return true;
#end
@@ -76,13 +210,13 @@ class RenderHandler {
}
public function on_render() {
public function on_render() {
if( lib.host.render != null ) {
lib.host.render();
}
}
} //on_render
//nme functions
#if lime_native
@@ -90,7 +224,6 @@ class RenderHandler {
private static var nme_doc_add_child = Libs.load("nme","nme_doc_add_child", 2);
private static var nme_direct_renderer_create = Libs.load("nme","nme_direct_renderer_create", 0);
private static var nme_direct_renderer_set = Libs.load("nme","nme_direct_renderer_set", 2);
#end //lime_native
}

View File

@@ -80,7 +80,7 @@ class WindowHandler {
#if lime_html5
//start the run loop on html5, as there is no
//window creation callback there.
js.Browser.window.requestAnimationFrame(lib.on_update);
lib.render.render();
#end
lib._debug(':: lime :: \t WindowHandler Initialized.');
@@ -113,6 +113,12 @@ class WindowHandler {
} //on_redraw
public function on_resize(_event:Dynamic) {
//make sure the view is informed
lib.render.on_resize(_event);
//todo:
//nmeOnResize(_event.x, _event.y);
//if (renderRequest == null)
// nmeRender(false);