Auto merge of #20374 - paulrouget:hittest, r=glennw

Fix mouse click

<!-- Please describe your changes on the following line: -->

PR #20071 broke mouse click on hidpi screens.

---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [ ] These changes fix #__ (github issue number if applicable).

<!-- Either: -->
- [ ] There are tests for these changes OR
- [ ] These changes do not require tests because _____

<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->

<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/20374)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-03-21 05:46:09 -04:00 committed by GitHub
commit 1594d0b54c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -181,14 +181,14 @@ pub struct Window {
inner_size: Cell<TypedSize2D<u32, DeviceIndependentPixel>>, inner_size: Cell<TypedSize2D<u32, DeviceIndependentPixel>>,
mouse_down_button: Cell<Option<winit::MouseButton>>, mouse_down_button: Cell<Option<winit::MouseButton>>,
mouse_down_point: Cell<TypedPoint2D<i32, DeviceIndependentPixel>>, mouse_down_point: Cell<TypedPoint2D<i32, DevicePixel>>,
event_queue: RefCell<Vec<WindowEvent>>, event_queue: RefCell<Vec<WindowEvent>>,
/// id of the top level browsing context. It is unique as tabs /// id of the top level browsing context. It is unique as tabs
/// are not supported yet. None until created. /// are not supported yet. None until created.
browser_id: Cell<Option<BrowserId>>, browser_id: Cell<Option<BrowserId>>,
mouse_pos: Cell<TypedPoint2D<i32, DeviceIndependentPixel>>, mouse_pos: Cell<TypedPoint2D<i32, DevicePixel>>,
key_modifiers: Cell<GlutinKeyModifiers>, key_modifiers: Cell<GlutinKeyModifiers>,
current_url: RefCell<Option<ServoUrl>>, current_url: RefCell<Option<ServoUrl>>,
@ -515,37 +515,34 @@ impl Window {
} }
} }
let pos = self.mouse_pos.get().to_f32() * self.hidpi_factor(); let event = WindowEvent::Scroll(scroll_location, self.mouse_pos.get(), phase);
let event = WindowEvent::Scroll(scroll_location, pos.to_i32(), phase);
self.event_queue.borrow_mut().push(event); self.event_queue.borrow_mut().push(event);
} }
/// Helper function to handle a click /// Helper function to handle a click
fn handle_mouse(&self, button: winit::MouseButton, fn handle_mouse(&self, button: winit::MouseButton,
action: winit::ElementState, action: winit::ElementState,
coords: TypedPoint2D<i32, DeviceIndependentPixel>) { coords: TypedPoint2D<i32, DevicePixel>) {
use script_traits::MouseButton; use script_traits::MouseButton;
// FIXME(tkuehn): max pixel dist should be based on pixel density let max_pixel_dist = 10.0 * self.hidpi_factor().get();
let max_pixel_dist = 10f64;
let scaled_coords = coords.to_f32() * self.hidpi_factor();
let event = match action { let event = match action {
ElementState::Pressed => { ElementState::Pressed => {
self.mouse_down_point.set(coords); self.mouse_down_point.set(coords);
self.mouse_down_button.set(Some(button)); self.mouse_down_button.set(Some(button));
MouseWindowEvent::MouseDown(MouseButton::Left, scaled_coords) MouseWindowEvent::MouseDown(MouseButton::Left, coords.to_f32())
} }
ElementState::Released => { ElementState::Released => {
let mouse_up_event = MouseWindowEvent::MouseUp(MouseButton::Left, scaled_coords); let mouse_up_event = MouseWindowEvent::MouseUp(MouseButton::Left, coords.to_f32());
match self.mouse_down_button.get() { match self.mouse_down_button.get() {
None => mouse_up_event, None => mouse_up_event,
Some(but) if button == but => { Some(but) if button == but => {
let pixel_dist = self.mouse_down_point.get() - coords; let pixel_dist = self.mouse_down_point.get() - coords;
let pixel_dist = ((pixel_dist.x * pixel_dist.x + let pixel_dist = ((pixel_dist.x * pixel_dist.x +
pixel_dist.y * pixel_dist.y) as f64).sqrt(); pixel_dist.y * pixel_dist.y) as f32).sqrt();
if pixel_dist < max_pixel_dist { if pixel_dist < max_pixel_dist {
self.event_queue.borrow_mut().push(WindowEvent::MouseWindowEventClass(mouse_up_event)); self.event_queue.borrow_mut().push(WindowEvent::MouseWindowEventClass(mouse_up_event));
MouseWindowEvent::Click(MouseButton::Left, scaled_coords) MouseWindowEvent::Click(MouseButton::Left, coords.to_f32())
} else { } else {
mouse_up_event mouse_up_event
} }