aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-10-14 10:48:35 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-10-14 10:48:35 -0700
commit92ca8c4c6d03f6e30f202a1b20f7a575aa385d31 (patch)
tree945c1a2e4eb0446f91c22a02be52d226f67db022
parent3c8c068617ea03fb8c1e884f570fbc986b9bf977 (diff)
parentc38633e9c324c6f38f54b96ec5a58058233fa9f2 (diff)
Merge branch 'glut_mouse_wheel' of github.com:anlambert/emscripten into incoming
Conflicts: AUTHORS
-rw-r--r--AUTHORS2
-rw-r--r--src/library_glut.js37
-rw-r--r--tests/glut_wheelevents.c68
-rw-r--r--tests/test_browser.py3
4 files changed, 105 insertions, 5 deletions
diff --git a/AUTHORS b/AUTHORS
index aaeb0ad9..8849cb12 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -100,3 +100,5 @@ a license to everyone to use it as detailed in LICENSE.)
* Patrick R. Martin <patrick.martin.r@gmail.com>
* Richard Quirk <richard.quirk@gmail.com>
* Marcos Scriven <marcos@scriven.org>
+* Antoine Lambert <antoine.lambert33@gmail.com>
+
diff --git a/src/library_glut.js b/src/library_glut.js
index 60dc6540..2321486a 100644
--- a/src/library_glut.js
+++ b/src/library_glut.js
@@ -189,12 +189,12 @@ var LibraryGLUT = {
}
},
- onMouseButtonDown: function(event){
+ onMouseButtonDown: function(event) {
Browser.calculateMouseEvent(event);
GLUT.buttons |= (1 << event['button']);
- if(event.target == Module["canvas"] && GLUT.mouseFunc){
+ if (event.target == Module["canvas"] && GLUT.mouseFunc) {
try {
event.target.setCapture();
} catch (e) {}
@@ -204,21 +204,40 @@ var LibraryGLUT = {
}
},
- onMouseButtonUp: function(event){
+ onMouseButtonUp: function(event) {
Browser.calculateMouseEvent(event);
GLUT.buttons &= ~(1 << event['button']);
- if(GLUT.mouseFunc) {
+ if (GLUT.mouseFunc) {
event.preventDefault();
GLUT.saveModifiers(event);
Runtime.dynCall('viiii', GLUT.mouseFunc, [event['button'], 1/*GLUT_UP*/, Browser.mouseX, Browser.mouseY]);
}
},
+ onMouseWheel: function(event) {
+ Browser.calculateMouseEvent(event);
+
+ // cross-browser wheel delta
+ var e = window.event || event; // old IE support
+ var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
+
+ var button = 3; // wheel up
+ if (delta < 0) {
+ button = 4; // wheel down
+ }
+
+ if (GLUT.mouseFunc) {
+ event.preventDefault();
+ GLUT.saveModifiers(event);
+ Runtime.dynCall('viiii', GLUT.mouseFunc, [button, 0/*GLUT_DOWN*/, Browser.mouseX, Browser.mouseY]);
+ }
+ },
+
// TODO add fullscreen API ala:
// http://johndyer.name/native-fullscreen-javascript-api-plus-jquery-plugin/
- onFullScreenEventChange: function(event){
+ onFullScreenEventChange: function(event) {
var width;
var height;
if (document["fullScreen"] || document["mozFullScreen"] || document["webkitIsFullScreen"]) {
@@ -279,6 +298,10 @@ var LibraryGLUT = {
window.addEventListener("mousemove", GLUT.onMousemove, true);
window.addEventListener("mousedown", GLUT.onMouseButtonDown, true);
window.addEventListener("mouseup", GLUT.onMouseButtonUp, true);
+ // IE9, Chrome, Safari, Opera
+ window.addEventListener("mousewheel", GLUT.onMouseWheel, true);
+ // Firefox
+ window.addEventListener("DOMMouseScroll", GLUT.onMouseWheel, true);
}
Browser.resizeListeners.push(function(width, height) {
@@ -298,6 +321,10 @@ var LibraryGLUT = {
window.removeEventListener("mousemove", GLUT.onMousemove, true);
window.removeEventListener("mousedown", GLUT.onMouseButtonDown, true);
window.removeEventListener("mouseup", GLUT.onMouseButtonUp, true);
+ // IE9, Chrome, Safari, Opera
+ window.removeEventListener("mousewheel", GLUT.onMouseWheel, true);
+ // Firefox
+ window.removeEventListener("DOMMouseScroll", GLUT.onMouseWheel, true);
}
Module["canvas"].width = Module["canvas"].height = 1;
} });
diff --git a/tests/glut_wheelevents.c b/tests/glut_wheelevents.c
new file mode 100644
index 00000000..7be01636
--- /dev/null
+++ b/tests/glut_wheelevents.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+#include <EGL/egl.h>
+#include <emscripten.h>
+
+#define MULTILINE(...) #__VA_ARGS__
+
+int wheel_up = 0;
+int wheel_down = 0;
+
+int result = 0;
+
+void mouseCB(int button, int state, int x, int y)
+{
+ if(button == 3)
+ {
+ wheel_up = 1;
+ }
+ else if (button == 4)
+ {
+ wheel_down = 1;
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ emscripten_run_script(MULTILINE(
+ Module.injectWheelEvent = function(x, y, delta) {
+ var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
+ var event = document.createEvent("MouseEvents");
+ if (!isFirefox) {
+ // mouse wheel event for IE9, Chrome, Safari, Opera
+ event.initMouseEvent('mousewheel', true, true, window,
+ 0, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y,
+ 0, 0, 0, 0, 0, null);
+ event.wheelDelta = delta;
+ } else {
+ // mouse wheel event for Firefox, the delta sign is inversed for that browser and is stored in the detail property of the mouse event
+ event.initMouseEvent('DOMMouseScroll', true, true, window,
+ -delta, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y, Module['canvas'].offsetLeft + x, Module['canvas'].offsetTop + y,
+ 0, 0, 0, 0, 0, null);
+ }
+ Module['canvas'].dispatchEvent(event);
+ }
+ ));
+
+
+ glutInit(&argc, argv);
+
+ glutMouseFunc(&mouseCB);
+
+ // inject wheel up event (delta > 0)
+ emscripten_run_script("Module.injectWheelEvent(100, 100, 1)");
+ if (wheel_up) {
+ printf("%s\n", "mouse wheel up event received");
+ }
+ // inject wheel down event (delta < 0)
+ emscripten_run_script("Module.injectWheelEvent(100, 100, -1)");
+ if (wheel_down) {
+ printf("%s\n", "mouse wheel down event received");
+ }
+
+ result = wheel_up && wheel_down;
+
+ REPORT_RESULT();
+ return 0;
+}
diff --git a/tests/test_browser.py b/tests/test_browser.py
index 1eba2ef5..ecd331fd 100644
--- a/tests/test_browser.py
+++ b/tests/test_browser.py
@@ -866,6 +866,9 @@ keydown(100);keyup(100); // trigger the end
def test_glut_touchevents(self):
self.btest('glut_touchevents.c', '1')
+ def test_glut_wheelevents(self):
+ self.btest('glut_wheelevents.c', '1')
+
def test_emscripten_get_now(self):
self.btest('emscripten_get_now.cpp', '1')