Introduce a MouseButton enum.

This commit is contained in:
Ms2ger 2015-04-02 17:52:12 +02:00
parent 85808c1cdd
commit 6b127a8df8
16 changed files with 57 additions and 20 deletions

View file

@ -13,6 +13,7 @@ use layers::geometry::DevicePixel;
use layers::platform::surface::NativeGraphicsMetadata; use layers::platform::surface::NativeGraphicsMetadata;
use msg::compositor_msg::{PaintState, ReadyState}; use msg::compositor_msg::{PaintState, ReadyState};
use msg::constellation_msg::{Key, KeyState, KeyModifiers}; use msg::constellation_msg::{Key, KeyState, KeyModifiers};
use script_traits::MouseButton;
use url::Url; use url::Url;
use util::cursor::Cursor; use util::cursor::Cursor;
use util::geometry::ScreenPx; use util::geometry::ScreenPx;
@ -21,9 +22,9 @@ use std::rc::Rc;
#[derive(Clone)] #[derive(Clone)]
pub enum MouseWindowEvent { pub enum MouseWindowEvent {
Click(uint, TypedPoint2D<DevicePixel, f32>), Click(MouseButton, TypedPoint2D<DevicePixel, f32>),
MouseDown(uint, TypedPoint2D<DevicePixel, f32>), MouseDown(MouseButton, TypedPoint2D<DevicePixel, f32>),
MouseUp(uint, TypedPoint2D<DevicePixel, f32>), MouseUp(MouseButton, TypedPoint2D<DevicePixel, f32>),
} }
#[derive(Clone)] #[derive(Clone)]

View file

@ -66,7 +66,7 @@ use msg::constellation_msg::{SUPER, ALT, SHIFT, CONTROL};
use net::resource_task::ControlMsg::{SetCookiesForUrl, GetCookiesForUrl}; use net::resource_task::ControlMsg::{SetCookiesForUrl, GetCookiesForUrl};
use net::cookie_storage::CookieSource::NonHTTP; use net::cookie_storage::CookieSource::NonHTTP;
use script_task::Runnable; use script_task::Runnable;
use script_traits::UntrustedNodeAddress; use script_traits::{MouseButton, UntrustedNodeAddress};
use util::{opts, namespace}; use util::{opts, namespace};
use util::str::{DOMString, split_html_space_chars}; use util::str::{DOMString, split_html_space_chars};
use layout_interface::{ReflowGoal, ReflowQueryType}; use layout_interface::{ReflowGoal, ReflowQueryType};
@ -216,7 +216,8 @@ pub trait DocumentHelpers<'a> {
fn title_changed(self); fn title_changed(self);
fn send_title_to_compositor(self); fn send_title_to_compositor(self);
fn dirty_all_nodes(self); fn dirty_all_nodes(self);
fn handle_click_event(self, js_runtime: *mut JSRuntime, _button: uint, point: Point2D<f32>); fn handle_click_event(self, js_runtime: *mut JSRuntime,
button: MouseButton, point: Point2D<f32>);
fn dispatch_key_event(self, key: Key, state: KeyState, fn dispatch_key_event(self, key: Key, state: KeyState,
modifiers: KeyModifiers, compositor: &mut Box<ScriptListener+'static>); modifiers: KeyModifiers, compositor: &mut Box<ScriptListener+'static>);
@ -483,7 +484,8 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
} }
} }
fn handle_click_event(self, js_runtime: *mut JSRuntime, _button: uint, point: Point2D<f32>) { fn handle_click_event(self, js_runtime: *mut JSRuntime,
_button: MouseButton, point: Point2D<f32>) {
debug!("ClickEvent: clicked at {:?}", point); debug!("ClickEvent: clicked at {:?}", point);
let node = match self.hit_test(&point) { let node = match self.hit_test(&point) {
Some(node_address) => { Some(node_address) => {

View file

@ -1205,10 +1205,10 @@ impl ScriptTask {
self.handle_reflow_event(pipeline_id); self.handle_reflow_event(pipeline_id);
} }
ClickEvent(_button, point) => { ClickEvent(button, point) => {
let page = get_page(&self.root_page(), pipeline_id); let page = get_page(&self.root_page(), pipeline_id);
let document = page.document().root(); let document = page.document().root();
document.r().handle_click_event(self.js_runtime.ptr, _button, point); document.r().handle_click_event(self.js_runtime.ptr, button, point);
} }
MouseDownEvent(..) => {} MouseDownEvent(..) => {}

View file

@ -2,8 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#![feature(int_uint)]
extern crate devtools_traits; extern crate devtools_traits;
extern crate geom; extern crate geom;
extern crate libc; extern crate libc;
@ -81,13 +79,21 @@ pub enum ConstellationControlMsg {
unsafe impl Send for ConstellationControlMsg { unsafe impl Send for ConstellationControlMsg {
} }
/// The mouse button involved in the event.
#[derive(Clone, Debug)]
pub enum MouseButton {
Left,
Middle,
Right,
}
/// Events from the compositor that the script task needs to know about /// Events from the compositor that the script task needs to know about
pub enum CompositorEvent { pub enum CompositorEvent {
ResizeEvent(WindowSizeData), ResizeEvent(WindowSizeData),
ReflowEvent(SmallVec1<UntrustedNodeAddress>), ReflowEvent(SmallVec1<UntrustedNodeAddress>),
ClickEvent(uint, Point2D<f32>), ClickEvent(MouseButton, Point2D<f32>),
MouseDownEvent(uint, Point2D<f32>), MouseDownEvent(MouseButton, Point2D<f32>),
MouseUpEvent(uint, Point2D<f32>), MouseUpEvent(MouseButton, Point2D<f32>),
MouseMoveEvent(Point2D<f32>), MouseMoveEvent(Point2D<f32>),
KeyEvent(Key, KeyState, KeyModifiers), KeyEvent(Key, KeyState, KeyModifiers),
} }

View file

@ -398,6 +398,7 @@ dependencies = [
"layers 0.1.0 (git+https://github.com/servo/rust-layers)", "layers 0.1.0 (git+https://github.com/servo/rust-layers)",
"libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"msg 0.0.1", "msg 0.0.1",
"script_traits 0.0.1",
"time 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
"url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
"util 0.0.1", "util 0.0.1",

2
ports/cef/Cargo.lock generated
View file

@ -21,6 +21,7 @@ dependencies = [
"plugins 0.0.1", "plugins 0.0.1",
"png 0.1.0 (git+https://github.com/servo/rust-png)", "png 0.1.0 (git+https://github.com/servo/rust-png)",
"script 0.0.1", "script 0.0.1",
"script_traits 0.0.1",
"servo 0.0.1", "servo 0.0.1",
"stb_image 0.1.0 (git+https://github.com/servo/rust-stb-image)", "stb_image 0.1.0 (git+https://github.com/servo/rust-stb-image)",
"style 0.0.1", "style 0.0.1",
@ -403,6 +404,7 @@ dependencies = [
"layers 0.1.0 (git+https://github.com/servo/rust-layers)", "layers 0.1.0 (git+https://github.com/servo/rust-layers)",
"libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"msg 0.0.1", "msg 0.0.1",
"script_traits 0.0.1",
"time 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
"url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
"util 0.0.1", "util 0.0.1",

View file

@ -26,6 +26,9 @@ path = "../../components/gfx"
[dependencies.script] [dependencies.script]
path = "../../components/script" path = "../../components/script"
[dependencies.script_traits]
path = "../../components/script_traits"
[dependencies.net] [dependencies.net]
path = "../../components/net" path = "../../components/net"

View file

@ -13,6 +13,7 @@ use geom::point::TypedPoint2D;
use geom::size::TypedSize2D; use geom::size::TypedSize2D;
use libc::{c_double, c_int}; use libc::{c_double, c_int};
use msg::constellation_msg::{self, KeyModifiers, KeyState}; use msg::constellation_msg::{self, KeyModifiers, KeyState};
use script_traits::MouseButton;
use std::cell::RefCell; use std::cell::RefCell;
pub struct ServoCefBrowserHost { pub struct ServoCefBrowserHost {
@ -110,7 +111,11 @@ full_cef_class_impl! {
let event: &cef_mouse_event = event; let event: &cef_mouse_event = event;
let mouse_button_type: cef_mouse_button_type_t = mouse_button_type; let mouse_button_type: cef_mouse_button_type_t = mouse_button_type;
let mouse_up: c_int = mouse_up; let mouse_up: c_int = mouse_up;
let button_type = mouse_button_type as uint; let button_type = match mouse_button_type {
cef_mouse_button_type_t::MBT_LEFT => MouseButton::Left,
cef_mouse_button_type_t::MBT_MIDDLE => MouseButton::Middle,
cef_mouse_button_type_t::MBT_RIGHT => MouseButton::Right,
};
let point = TypedPoint2D((*event).x as f32, (*event).y as f32); let point = TypedPoint2D((*event).x as f32, (*event).y as f32);
if mouse_up != 0 { if mouse_up != 0 {
this.downcast().send_window_event(WindowEvent::MouseWindowEventClass( this.downcast().send_window_event(WindowEvent::MouseWindowEventClass(

View file

@ -32,6 +32,7 @@ extern crate js;
extern crate layers; extern crate layers;
extern crate png; extern crate png;
extern crate script; extern crate script;
extern crate script_traits;
extern crate unicode; extern crate unicode;
extern crate net; extern crate net;

View file

@ -14,6 +14,9 @@ headless = ["glutin/headless"]
[dependencies.compositing] [dependencies.compositing]
path = "../../components/compositing" path = "../../components/compositing"
[dependencies.script_traits]
path = "../../components/script_traits"
[dependencies.geom] [dependencies.geom]
git = "https://github.com/servo/rust-geom" git = "https://github.com/servo/rust-geom"

View file

@ -17,6 +17,7 @@ extern crate glutin;
extern crate layers; extern crate layers;
extern crate libc; extern crate libc;
extern crate msg; extern crate msg;
#[cfg(feature = "window")] extern crate script_traits;
extern crate time; extern crate time;
extern crate util; extern crate util;
extern crate egl; extern crate egl;

View file

@ -224,13 +224,15 @@ impl Window {
/// Helper function to handle a click /// Helper function to handle a click
fn handle_mouse(&self, button: glutin::MouseButton, action: glutin::ElementState, x: i32, y: i32) { fn handle_mouse(&self, button: glutin::MouseButton, action: glutin::ElementState, x: i32, y: i32) {
use script_traits::MouseButton;
// FIXME(tkuehn): max pixel dist should be based on pixel density // FIXME(tkuehn): max pixel dist should be based on pixel density
let max_pixel_dist = 10f64; let max_pixel_dist = 10f64;
let event = match action { let event = match action {
ElementState::Pressed => { ElementState::Pressed => {
self.mouse_down_point.set(Point2D(x, y)); self.mouse_down_point.set(Point2D(x, y));
self.mouse_down_button.set(Some(button)); self.mouse_down_button.set(Some(button));
MouseWindowEvent::MouseDown(0, TypedPoint2D(x as f32, y as f32)) MouseWindowEvent::MouseDown(MouseButton::Left, TypedPoint2D(x as f32, y as f32))
} }
ElementState::Released => { ElementState::Released => {
match self.mouse_down_button.get() { match self.mouse_down_button.get() {
@ -241,13 +243,13 @@ impl Window {
pixel_dist.y * pixel_dist.y) as f64).sqrt(); pixel_dist.y * pixel_dist.y) as f64).sqrt();
if pixel_dist < max_pixel_dist { if pixel_dist < max_pixel_dist {
let click_event = MouseWindowEvent::Click( let click_event = MouseWindowEvent::Click(
0, TypedPoint2D(x as f32, y as f32)); MouseButton::Left, TypedPoint2D(x as f32, y as f32));
self.event_queue.borrow_mut().push(WindowEvent::MouseWindowEventClass(click_event)); self.event_queue.borrow_mut().push(WindowEvent::MouseWindowEventClass(click_event));
} }
} }
Some(_) => (), Some(_) => (),
} }
MouseWindowEvent::MouseUp(0, TypedPoint2D(x as f32, y as f32)) MouseWindowEvent::MouseUp(MouseButton::Left, TypedPoint2D(x as f32, y as f32))
} }
}; };
self.event_queue.borrow_mut().push(WindowEvent::MouseWindowEventClass(event)); self.event_queue.borrow_mut().push(WindowEvent::MouseWindowEventClass(event));

1
ports/gonk/Cargo.lock generated
View file

@ -15,6 +15,7 @@ dependencies = [
"net 0.0.1", "net 0.0.1",
"profile 0.0.1", "profile 0.0.1",
"script 0.0.1", "script 0.0.1",
"script_traits 0.0.1",
"servo 0.0.1", "servo 0.0.1",
"time 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.19 (registry+https://github.com/rust-lang/crates.io-index)",
"url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)", "url 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",

View file

@ -20,6 +20,9 @@ path = "../../components/msg"
[dependencies.script] [dependencies.script]
path = "../../components/script" path = "../../components/script"
[dependencies.script_traits]
path = "../../components/script_traits"
[dependencies.net] [dependencies.net]
path = "../../components/net" path = "../../components/net"

View file

@ -2,6 +2,8 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use script_traits::MouseButton;
use std::path::Path; use std::path::Path;
use std::mem::size_of; use std::mem::size_of;
use std::mem::transmute; use std::mem::transmute;
@ -167,9 +169,12 @@ fn read_input_device(device_path: &Path,
if dist < 16 { if dist < 16 {
let click_pt = TypedPoint2D(slotA.x as f32, slotA.y as f32); let click_pt = TypedPoint2D(slotA.x as f32, slotA.y as f32);
println!("Dispatching click!"); println!("Dispatching click!");
sender.send(WindowEvent::MouseWindowEventClass(MouseWindowEvent::MouseDown(0, click_pt))).ok().unwrap(); sender.send(WindowEvent::MouseWindowEventClass(MouseWindowEvent::MouseDown(MouseButton::Left, click_pt)))
sender.send(WindowEvent::MouseWindowEventClass(MouseWindowEvent::MouseUp(0, click_pt))).ok().unwrap(); .ok().unwrap();
sender.send(WindowEvent::MouseWindowEventClass(MouseWindowEvent::Click(0, click_pt))).ok().unwrap(); sender.send(WindowEvent::MouseWindowEventClass(MouseWindowEvent::MouseUp(MouseButton::Left, click_pt)))
.ok().unwrap();
sender.send(WindowEvent::MouseWindowEventClass(MouseWindowEvent::Click(MouseButton::Left, click_pt)))
.ok().unwrap();
} }
} else { } else {
println!("Touch down"); println!("Touch down");

View file

@ -16,6 +16,7 @@ extern crate time;
extern crate util; extern crate util;
extern crate compositing; extern crate compositing;
extern crate script_traits;
extern crate geom; extern crate geom;
extern crate libc; extern crate libc;