summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Michelotti <michelotti.matthew@gmail.com>2018-05-05 14:35:33 -0500
committerMatthew Michelotti <michelotti.matthew@gmail.com>2018-05-05 14:35:33 -0500
commit62094392f676796ff715731b5cd1df510535dc1e (patch)
tree74327403339d89529ebacba830cfa66e57d22cb5
parent2dbc4f3e11dcd28d8e1ff26693afaf73ac7922fc (diff)
incorporated mouse events into key events
-rw-r--r--gate/src/core/sdl/event_handler.rs34
-rw-r--r--gate/src/core/wasm/mod.rs10
-rw-r--r--gate/src/core/wasm/wasm_exports.rs18
-rw-r--r--gate/src/input.rs5
-rw-r--r--gate_build/src/html/gate.js13
5 files changed, 69 insertions, 11 deletions
diff --git a/gate/src/core/sdl/event_handler.rs b/gate/src/core/sdl/event_handler.rs
index 27110c7..7f82d5e 100644
--- a/gate/src/core/sdl/event_handler.rs
+++ b/gate/src/core/sdl/event_handler.rs
@@ -14,9 +14,12 @@
use std::collections::HashSet;
-use sdl2::EventPump;
-use sdl2::event::Event;
-use sdl2::keyboard::Keycode as SdlKeyCode;
+use sdl2::{
+ EventPump,
+ event::Event,
+ keyboard::Keycode as SdlKeyCode,
+ mouse::MouseButton,
+};
use ::{App, AppContext};
use asset_id::AppAssetId;
@@ -53,6 +56,22 @@ impl EventHandler {
}
},
Event::MouseMotion { x, y, .. } => ctx.cursor = renderer.to_app_pos(x, y),
+ Event::MouseButtonDown { x, y, mouse_btn, .. } => {
+ ctx.cursor = renderer.to_app_pos(x, y);
+ if let Some(keycode) = mouse_button_to_gate_key(mouse_btn) {
+ if self.held_keys.insert(keycode) {
+ app.input(KeyEvent::Pressed, keycode, ctx);
+ }
+ }
+ },
+ Event::MouseButtonUp { x, y, mouse_btn, .. } => {
+ ctx.cursor = renderer.to_app_pos(x, y);
+ if let Some(keycode) = mouse_button_to_gate_key(mouse_btn) {
+ if self.held_keys.remove(&keycode) {
+ app.input(KeyEvent::Released, keycode, ctx);
+ }
+ }
+ },
_ => {},
}
if ctx.close_requested { break; }
@@ -107,3 +126,12 @@ fn sdl_to_gate_key(sdl: SdlKeyCode) -> Option<KeyCode> {
_ => None,
}
}
+
+fn mouse_button_to_gate_key(button: MouseButton) -> Option<KeyCode> {
+ match button {
+ MouseButton::Left => Some(KeyCode::MouseLeft),
+ MouseButton::Right => Some(KeyCode::MouseRight),
+ MouseButton::Middle => Some(KeyCode::MouseMiddle),
+ _ => None,
+ }
+}
diff --git a/gate/src/core/wasm/mod.rs b/gate/src/core/wasm/mod.rs
index 2521ad3..6a9ee4f 100644
--- a/gate/src/core/wasm/mod.rs
+++ b/gate/src/core/wasm/mod.rs
@@ -55,7 +55,8 @@ impl CoreAudio {
trait TraitAppRunner {
fn init(&mut self);
fn resize(&mut self, dims: (u32, u32));
- fn update_and_draw(&mut self, time_sec: f64, cursor_x: i32, cursor_y: i32);
+ fn update_and_draw(&mut self, time_sec: f64);
+ fn update_cursor(&mut self, cursor_x: i32, cursor_y: i32);
fn input(&mut self, event: KeyEvent, key: KeyCode);
fn music_count(&self) -> u16;
fn sound_count(&self) -> u16;
@@ -121,8 +122,7 @@ impl<AS: AppAssetId, AP: App<AS>> TraitAppRunner for AppRunner<AS, AP> {
self.ctx.dims = self.renderer.as_ref().unwrap().app_dims();
}
- fn update_and_draw(&mut self, time_sec: f64, cursor_x: i32, cursor_y: i32) {
- self.ctx.cursor = self.renderer.as_ref().unwrap().to_app_pos(cursor_x, cursor_y);
+ fn update_and_draw(&mut self, time_sec: f64) {
let elapsed = self.last_time_sec.map(|x| time_sec - x).unwrap_or(0.0).max(0.0).min(0.1);
if elapsed > 0.0 {
self.app.advance(elapsed, &mut self.ctx);
@@ -133,6 +133,10 @@ impl<AS: AppAssetId, AP: App<AS>> TraitAppRunner for AppRunner<AS, AP> {
self.renderer.as_mut().unwrap().flush();
}
+ fn update_cursor(&mut self, cursor_x: i32, cursor_y: i32) {
+ self.ctx.cursor = self.renderer.as_ref().unwrap().to_app_pos(cursor_x, cursor_y);
+ }
+
fn input(&mut self, event: KeyEvent, key: KeyCode) {
let success = if event == KeyEvent::Pressed {
self.held_keys.insert(key)
diff --git a/gate/src/core/wasm/wasm_exports.rs b/gate/src/core/wasm/wasm_exports.rs
index 0e51f1e..f8cdca4 100644
--- a/gate/src/core/wasm/wasm_exports.rs
+++ b/gate/src/core/wasm/wasm_exports.rs
@@ -33,7 +33,8 @@ pub unsafe extern "C" fn gateWasmOnResize(w: c_int, h: c_int) {
#[no_mangle]
pub unsafe extern "C" fn gateWasmUpdateAndDraw(time_millis: f64, cursor_x: c_int, cursor_y: c_int) {
- app_runner_borrow_mut().update_and_draw(time_millis / 1000.0, cursor_x as i32, cursor_y as i32);
+ app_runner_borrow_mut().update_cursor(cursor_x as i32, cursor_y as i32);
+ app_runner_borrow_mut().update_and_draw(time_millis / 1000.0);
}
#[no_mangle]
@@ -45,6 +46,21 @@ pub unsafe extern "C" fn gateWasmKeyEvent(code: c_int, down: bool) {
}
#[no_mangle]
+pub unsafe extern "C" fn gateWasmMouseEvent(cursor_x: c_int, cursor_y: c_int, button: c_int, down: bool) {
+ app_runner_borrow_mut().update_cursor(cursor_x as i32, cursor_y as i32);
+ let code = match button {
+ 0 => Some(KeyCode::MouseLeft),
+ 1 => Some(KeyCode::MouseMiddle),
+ 2 => Some(KeyCode::MouseRight),
+ _ => None,
+ };
+ if let Some(code) = code {
+ let event = if down { KeyEvent::Pressed } else { KeyEvent::Released };
+ app_runner_borrow_mut().input(event, code);
+ }
+}
+
+#[no_mangle]
pub unsafe extern "C" fn gateWasmIsAppDefined() -> c_int {
if app_runner_is_defined() { 1 } else { 0 }
}
diff --git a/gate/src/input.rs b/gate/src/input.rs
index e4085d7..60e5da0 100644
--- a/gate/src/input.rs
+++ b/gate/src/input.rs
@@ -16,7 +16,7 @@
#[cfg(target_arch = "wasm32")] use std::mem;
-/// Events related to a keyboard key.
+/// Events related to a keyboard key or similar button.
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum KeyEvent {
/// Key is pressed down.
@@ -25,7 +25,7 @@ pub enum KeyEvent {
Released,
}
-/// Enum for keyboard keys.
+/// Enum for keyboard keys and mouse buttons.
#[repr(u8)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum KeyCode {
@@ -34,6 +34,7 @@ pub enum KeyCode {
Right, Left, Down, Up,
Return,
Space,
+ MouseLeft, MouseRight, MouseMiddle,
}
#[cfg(target_arch = "wasm32")]
diff --git a/gate_build/src/html/gate.js b/gate_build/src/html/gate.js
index 2329cbb..0e21512 100644
--- a/gate_build/src/html/gate.js
+++ b/gate_build/src/html/gate.js
@@ -256,6 +256,7 @@ fetch("gate_app.wasm").then(response =>
Module.gateWasmOnResize = mod.exports.gateWasmOnResize;
Module.gateWasmUpdateAndDraw = mod.exports.gateWasmUpdateAndDraw;
Module.gateWasmKeyEvent = mod.exports.gateWasmKeyEvent;
+ Module.gateWasmMouseEvent = mod.exports.gateWasmMouseEvent;
Module.gateWasmMusicCount = mod.exports.gateWasmMusicCount;
Module.gateWasmSoundCount = mod.exports.gateWasmSoundCount;
Module.gateWasmSpriteVertSrc = mod.exports.gateWasmSpriteVertSrc;
@@ -411,7 +412,9 @@ function tryStart2 () {
requestAnimationFrame(updateAndDraw);
document.addEventListener('keydown', e => handleKeyEvent(e.key, true));
document.addEventListener('keyup', e => handleKeyEvent(e.key, false));
- document.addEventListener('mousemove', e => handleMouseMotionEvent(e));
+ document.addEventListener('mousemove', e => handleMouseMotion(e));
+ document.addEventListener('mousedown', e => handleMouseEvent(e, true));
+ document.addEventListener('mouseup', e => handleMouseEvent(e, false));
}
}
@@ -428,11 +431,17 @@ function handleKeyEvent(codeStr, down) {
}
}
-function handleMouseMotionEvent(evt) {
+function handleMouseMotion(evt) {
cursorPos.x = evt.clientX;
cursorPos.y = evt.clientY;
}
+function handleMouseEvent(evt, down) {
+ cursorPos.x = evt.clientX;
+ cursorPos.y = evt.clientY;
+ Module.gateWasmMouseEvent(cursorPos.x, cursorPos.y, evt.button, down)
+}
+
function resizeCanvas() {
const newWidth = Math.max(window.innerWidth, 100);
const newHeight = Math.max(window.innerHeight, 100);