compositing: Don't translate points to layer space when using WebRender.

This makes mouse events take the same code path, regardless of whether
WebRender is in use or not. This approach enables accurate
display-list-based hit testing when WebRender is in use.

Closes #11108.
This commit is contained in:
Patrick Walton 2016-05-31 23:23:47 -07:00
parent e8cf789fc5
commit 9a9762fc95

View file

@ -1387,17 +1387,15 @@ impl<Window: WindowMethods> IOCompositor<Window> {
MouseWindowEvent::MouseUp(_, p) => p, MouseWindowEvent::MouseUp(_, p) => p,
}; };
if let Some(ref webrender_api) = self.webrender_api { if self.webrender_api.is_some() {
let root_pipeline_id = match self.get_root_pipeline_id() { let root_pipeline_id = match self.get_root_pipeline_id() {
Some(root_pipeline_id) => root_pipeline_id, Some(root_pipeline_id) => root_pipeline_id,
None => return, None => return,
}; };
if self.pipeline(root_pipeline_id).is_none() {
return;
}
let (translated_point, translated_pipeline_id) = if let Some(pipeline) = self.pipeline(root_pipeline_id) {
webrender_api.translate_point_to_layer_space(&point.to_untyped()); let dppx = self.page_zoom * self.device_pixels_per_screen_px();
let translated_point = (point / dppx).to_untyped();
let event_to_send = match mouse_window_event { let event_to_send = match mouse_window_event {
MouseWindowEvent::Click(button, _) => { MouseWindowEvent::Click(button, _) => {
MouseButtonEvent(MouseEventType::Click, button, translated_point) MouseButtonEvent(MouseEventType::Click, button, translated_point)
@ -1409,9 +1407,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
MouseButtonEvent(MouseEventType::MouseUp, button, translated_point) MouseButtonEvent(MouseEventType::MouseUp, button, translated_point)
} }
}; };
let translated_pipeline_id = translated_pipeline_id.from_webrender(); let msg = ConstellationControlMsg::SendEvent(root_pipeline_id, event_to_send);
let msg = ConstellationControlMsg::SendEvent(translated_pipeline_id, event_to_send);
if let Some(pipeline) = self.pipeline(translated_pipeline_id) {
if let Err(e) = pipeline.script_chan.send(msg) { if let Err(e) = pipeline.script_chan.send(msg) {
warn!("Sending control event to script failed ({}).", e); warn!("Sending control event to script failed ({}).", e);
} }
@ -1431,7 +1427,7 @@ impl<Window: WindowMethods> IOCompositor<Window> {
return return
} }
if let Some(ref webrender_api) = self.webrender_api { if self.webrender_api.is_some() {
let root_pipeline_id = match self.get_root_pipeline_id() { let root_pipeline_id = match self.get_root_pipeline_id() {
Some(root_pipeline_id) => root_pipeline_id, Some(root_pipeline_id) => root_pipeline_id,
None => return, None => return,
@ -1440,12 +1436,10 @@ impl<Window: WindowMethods> IOCompositor<Window> {
return; return;
} }
let (translated_point, translated_pipeline_id) = let dppx = self.page_zoom * self.device_pixels_per_screen_px();
webrender_api.translate_point_to_layer_space(&cursor.to_untyped()); let event_to_send = MouseMoveEvent(Some((cursor / dppx).to_untyped()));
let translated_pipeline_id = translated_pipeline_id.from_webrender(); let msg = ConstellationControlMsg::SendEvent(root_pipeline_id, event_to_send);
let event_to_send = MouseMoveEvent(Some(translated_point)); if let Some(pipeline) = self.pipeline(root_pipeline_id) {
let msg = ConstellationControlMsg::SendEvent(translated_pipeline_id, event_to_send);
if let Some(pipeline) = self.pipeline(translated_pipeline_id) {
if let Err(e) = pipeline.script_chan.send(msg) { if let Err(e) = pipeline.script_chan.send(msg) {
warn!("Sending mouse control event to script failed ({}).", e); warn!("Sending mouse control event to script failed ({}).", e);
} }