Index: ui/aura/window_tree_host_x11.cc |
diff --git a/ui/aura/window_tree_host_x11.cc b/ui/aura/window_tree_host_x11.cc |
index efb0a6b5fbc3a705ae562e351ce560cd964e1b1a..ccef1c19cd44b4c082e19889c5cd6af36cdebd75 100644 |
--- a/ui/aura/window_tree_host_x11.cc |
+++ b/ui/aura/window_tree_host_x11.cc |
@@ -249,7 +249,6 @@ WindowTreeHostX11::WindowTreeHostX11(const gfx::Rect& bounds) |
current_cursor_(ui::kCursorNull), |
window_mapped_(false), |
bounds_(bounds), |
- is_internal_display_(false), |
touch_calibrate_(new internal::TouchEventCalibrate), |
atom_cache_(xdisplay_, kAtomsToCache) { |
XSetWindowAttributes swa; |
@@ -409,7 +408,6 @@ uint32_t WindowTreeHostX11::Dispatch(const base::NativeEvent& event) { |
bool size_changed = bounds_.size() != bounds.size(); |
bool origin_changed = bounds_.origin() != bounds.origin(); |
bounds_ = bounds; |
- UpdateIsInternalDisplay(); |
// Always update barrier and mouse location because |bounds_| might |
// have already been updated in |SetBounds|. |
if (pointer_barriers_) { |
@@ -556,7 +554,6 @@ void WindowTreeHostX11::SetBounds(const gfx::Rect& bounds) { |
// (possibly synthetic) ConfigureNotify about the actual size and correct |
// |bounds_| later. |
bounds_ = bounds; |
- UpdateIsInternalDisplay(); |
if (origin_changed) |
OnHostMoved(bounds.origin()); |
if (size_changed || current_scale != new_scale) { |
@@ -724,14 +721,8 @@ void WindowTreeHostX11::OnWindowInitialized(Window* window) { |
} |
void WindowTreeHostX11::OnHostInitialized(WindowTreeHost* host) { |
- // TODO(beng): I'm not sure that this comment makes much sense anymore?? |
- // UpdateIsInternalDisplay relies on WED's kDisplayIdKey property being set |
- // available by the time WED::Init is called. (set in |
- // DisplayManager::CreateRootWindowForDisplay) |
- // Ready when NotifyHostInitialized is called from WED::Init. |
if (host != this) |
return; |
- UpdateIsInternalDisplay(); |
// We have to enable Tap-to-click by default because the cursor is set to |
// visible in Shell::InitRootWindowController. |
@@ -762,34 +753,18 @@ void WindowTreeHostX11::DispatchXI2Event(const base::NativeEvent& event) { |
case ui::ET_TOUCH_PRESSED: |
case ui::ET_TOUCH_CANCELLED: |
case ui::ET_TOUCH_RELEASED: { |
-#if defined(OS_CHROMEOS) |
// Bail out early before generating a ui::TouchEvent if this event |
- // is not within the range of this RootWindow. Converting an xevent |
- // to ui::TouchEvent might change the state of the global touch tracking |
- // state, e.g. touch release event can remove the touch id from the |
- // record, and doing this multiple time when there are multiple |
- // RootWindow will cause problem. So only generate the ui::TouchEvent |
- // when we are sure it belongs to this RootWindow. |
- if (base::SysInfo::IsRunningOnChromeOS() && |
- !bounds_.Contains(ui::EventLocationFromNative(xev))) |
+ // is targeting this RootWindow. |
oshima
2014/03/14 21:53:53
then you can do something like
if (GetTouchCalibr
Yufeng Shen (Slow to review)
2014/04/29 20:34:18
I moved TouchCalibrate into DeviceDataManager.
|
+ // Converting an xevent to ui::TouchEvent might change the state of |
+ // the global touch tracking state, e.g. touch release event can |
+ // remove the touch id from the record, and doing this multiple time |
+ // when there are multiple RootWindow will cause problem. So only |
+ // generate the ui::TouchEvent when we are sure it is targeting this |
+ // RootWindow. |
+ if (!IsTouchEventTargetingThisRootWindow(xev)) |
break; |
-#endif // defined(OS_CHROMEOS) |
ui::TouchEvent touchev(xev); |
-#if defined(OS_CHROMEOS) |
- if (base::SysInfo::IsRunningOnChromeOS()) { |
- // X maps the touch-surface to the size of the X root-window. |
- // In multi-monitor setup, Coordinate Transformation Matrix |
- // repositions the touch-surface onto part of X root-window |
- // containing aura root-window corresponding to the touchscreen. |
- // However, if aura root-window has non-zero origin, |
- // we need to relocate the event into aura root-window coordinates. |
- touchev.Relocate(bounds_.origin()); |
ynovikov
2014/03/27 23:35:53
I think this is the only use of Relocate(), could
Yufeng Shen (Slow to review)
2014/04/29 20:34:18
Done.
|
-#if defined(USE_XI2_MT) |
- if (is_internal_display_) |
- touch_calibrate_->Calibrate(&touchev, bounds_); |
-#endif // defined(USE_XI2_MT) |
- } |
-#endif // defined(OS_CHROMEOS) |
+ CalibrateTouchEvent(xev, &touchev); |
SendEventToProcessor(&touchev); |
break; |
} |
@@ -868,13 +843,6 @@ void WindowTreeHostX11::TranslateAndDispatchMouseEvent( |
SendEventToProcessor(event); |
} |
-void WindowTreeHostX11::UpdateIsInternalDisplay() { |
- Window* root_window = window(); |
- gfx::Screen* screen = gfx::Screen::GetScreenFor(root_window); |
- gfx::Display display = screen->GetDisplayNearestWindow(root_window); |
- is_internal_display_ = display.IsInternal(); |
-} |
- |
void WindowTreeHostX11::SetCrOSTapPaused(bool state) { |
#if defined(OS_CHROMEOS) |
if (!ui::IsXInput2Available()) |
@@ -905,6 +873,49 @@ void WindowTreeHostX11::SetCrOSTapPaused(bool state) { |
#endif |
} |
+bool WindowTreeHostX11::IsTouchEventTargetingThisRootWindow( |
+ const base::NativeEvent& event) { |
sadrul
2014/03/15 19:32:51
Just use XEvent* here.
Yufeng Shen (Slow to review)
2014/04/29 20:34:18
Done.
|
+#if defined(OS_CHROMEOS) |
+ XEvent* xev = event; |
+ XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data); |
+ int64 touch_display_id = |
+ ui::DeviceDataManager::GetInstance()->GetDisplayForTouchDevice( |
+ xiev->deviceid); |
+ // If we don't have record of display id for this touch device, then |
+ // fall backt to check if this touch event is within the bounds of |
sadrul
2014/03/15 19:32:51
*back
Yufeng Shen (Slow to review)
2014/04/29 20:34:18
Done.
|
+ // this root window. |
+ if (touch_display_id == gfx::Display::kInvalidDisplayID) { |
+ if (base::SysInfo::IsRunningOnChromeOS() && |
+ !bounds_.Contains(ui::EventLocationFromNative(xev))) |
ynovikov
2014/03/27 23:35:53
As I understand it, this check will be wrong most
Yufeng Shen (Slow to review)
2014/04/29 20:34:18
I am more interested in not regress the 1 monitor
|
+ return false; |
+ // If we do have record of the display id for this touch device, |
sadrul
2014/03/15 19:32:51
I don't think this comment is necessary here.
Yufeng Shen (Slow to review)
2014/04/29 20:34:18
Done.
|
+ // then check if this touch display id is associated with this |
+ // root window. |
+ } else if (touch_display_id != display_ids().first && |
+ touch_display_id != display_ids().second) { |
+ return false; |
+ } |
+#endif // defined(OS_CHROMEOS) |
+ return true; |
sadrul
2014/03/15 19:32:51
non-CHROMEOS case should do the bounds check.
Thi
Yufeng Shen (Slow to review)
2014/04/29 20:34:18
The original code does not do the bounds check in
|
+} |
+ |
+void WindowTreeHostX11::CalibrateTouchEvent(const base::NativeEvent& event, |
+ ui::TouchEvent* touchev) { |
+#if defined(OS_CHROMEOS) && defined(USE_XI2_MT) |
+ XEvent* xev = event; |
+ XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data); |
+ int64 touch_display_id = |
+ ui::DeviceDataManager::GetInstance()->GetDisplayForTouchDevice( |
+ xiev->deviceid); |
+ // On ChromeOS, if touch event is from internal display, we need to |
+ // calibrate its location for bezel region. |
+ if (base::SysInfo::IsRunningOnChromeOS() && |
+ touch_display_id == gfx::Display::InternalDisplayId()) { |
+ touch_calibrate_->Calibrate(touchev, bounds_); |
+ } |
+#endif // defined(OS_CHROMEOS) && defined(USE_XI2_MT) |
+} |
+ |
// static |
WindowTreeHost* WindowTreeHost::Create(const gfx::Rect& bounds) { |
return new WindowTreeHostX11(bounds); |