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 525694b793aca1993f6fcc5efd95f0461c0c769e..94a5c4eb06e66fc40e3c243ba5af9cb963ce4a3d 100644 |
--- a/ui/aura/window_tree_host_x11.cc |
+++ b/ui/aura/window_tree_host_x11.cc |
@@ -6,7 +6,6 @@ |
#include <strings.h> |
#include <X11/cursorfont.h> |
-#include <X11/extensions/Xfixes.h> |
#include <X11/extensions/XInput2.h> |
#include <X11/extensions/Xrandr.h> |
#include <X11/Xatom.h> |
@@ -27,8 +26,8 @@ |
#include "base/strings/stringprintf.h" |
#include "base/sys_info.h" |
#include "ui/aura/client/cursor_client.h" |
-#include "ui/aura/client/screen_position_client.h" |
#include "ui/aura/env.h" |
+#include "ui/aura/window.h" |
#include "ui/aura/window_event_dispatcher.h" |
#include "ui/base/cursor/cursor.h" |
#include "ui/base/ui_base_switches.h" |
@@ -108,136 +107,6 @@ bool default_override_redirect = false; |
} // namespace |
-namespace internal { |
- |
-// Accomplishes 2 tasks concerning touch event calibration: |
-// 1. Being a message-pump observer, |
-// routes all the touch events to the X root window, |
-// where they can be calibrated later. |
-// 2. Has the Calibrate method that does the actual bezel calibration, |
-// when invoked from X root window's event dispatcher. |
-class TouchEventCalibrate : public base::MessagePumpObserver { |
- public: |
- TouchEventCalibrate() |
- : left_(0), |
- right_(0), |
- top_(0), |
- bottom_(0) { |
- base::MessageLoopForUI::current()->AddObserver(this); |
-#if defined(USE_XI2_MT) |
- std::vector<std::string> parts; |
- if (Tokenize(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
- switches::kTouchCalibration), ",", &parts) >= 4) { |
- if (!base::StringToInt(parts[0], &left_)) |
- DLOG(ERROR) << "Incorrect left border calibration value passed."; |
- if (!base::StringToInt(parts[1], &right_)) |
- DLOG(ERROR) << "Incorrect right border calibration value passed."; |
- if (!base::StringToInt(parts[2], &top_)) |
- DLOG(ERROR) << "Incorrect top border calibration value passed."; |
- if (!base::StringToInt(parts[3], &bottom_)) |
- DLOG(ERROR) << "Incorrect bottom border calibration value passed."; |
- } |
-#endif // defined(USE_XI2_MT) |
- } |
- |
- virtual ~TouchEventCalibrate() { |
- base::MessageLoopForUI::current()->RemoveObserver(this); |
- } |
- |
- // Modify the location of the |event|, |
- // expanding it from |bounds| to (|bounds| + bezels). |
- // Required when touchscreen is bigger than screen (i.e. has bezels), |
- // because we receive events in touchscreen coordinates, |
- // which need to be expanded when converting to screen coordinates, |
- // so that location on bezels will be outside of screen area. |
- void Calibrate(ui::TouchEvent* event, const gfx::Rect& bounds) { |
-#if defined(USE_XI2_MT) |
- int x = event->x(); |
- int y = event->y(); |
- |
- if (!left_ && !right_ && !top_ && !bottom_) |
- return; |
- |
- const int resolution_x = bounds.width(); |
- const int resolution_y = bounds.height(); |
- // The "grace area" (10% in this case) is to make it easier for the user to |
- // navigate to the corner. |
- const double kGraceAreaFraction = 0.1; |
- if (left_ || right_) { |
- // Offset the x position to the real |
- x -= left_; |
- // Check if we are in the grace area of the left side. |
- // Note: We might not want to do this when the gesture is locked? |
- if (x < 0 && x > -left_ * kGraceAreaFraction) |
- x = 0; |
- // Check if we are in the grace area of the right side. |
- // Note: We might not want to do this when the gesture is locked? |
- if (x > resolution_x - left_ && |
- x < resolution_x - left_ + right_ * kGraceAreaFraction) |
- x = resolution_x - left_; |
- // Scale the screen area back to the full resolution of the screen. |
- x = (x * resolution_x) / (resolution_x - (right_ + left_)); |
- } |
- if (top_ || bottom_) { |
- // When there is a top bezel we add our border, |
- y -= top_; |
- |
- // Check if we are in the grace area of the top side. |
- // Note: We might not want to do this when the gesture is locked? |
- if (y < 0 && y > -top_ * kGraceAreaFraction) |
- y = 0; |
- |
- // Check if we are in the grace area of the bottom side. |
- // Note: We might not want to do this when the gesture is locked? |
- if (y > resolution_y - top_ && |
- y < resolution_y - top_ + bottom_ * kGraceAreaFraction) |
- y = resolution_y - top_; |
- // Scale the screen area back to the full resolution of the screen. |
- y = (y * resolution_y) / (resolution_y - (bottom_ + top_)); |
- } |
- |
- // Set the modified coordinate back to the event. |
- if (event->root_location() == event->location()) { |
- // Usually those will be equal, |
- // if not, I am not sure what the correct value should be. |
- event->set_root_location(gfx::Point(x, y)); |
- } |
- event->set_location(gfx::Point(x, y)); |
-#endif // defined(USE_XI2_MT) |
- } |
- |
- private: |
- // Overridden from base::MessagePumpObserver: |
- virtual void WillProcessEvent(const base::NativeEvent& event) OVERRIDE { |
-#if defined(USE_XI2_MT) |
- if (event->type == GenericEvent && |
- (event->xgeneric.evtype == XI_TouchBegin || |
- event->xgeneric.evtype == XI_TouchUpdate || |
- event->xgeneric.evtype == XI_TouchEnd)) { |
- XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(event->xcookie.data); |
- xievent->event = xievent->root; |
- xievent->event_x = xievent->root_x; |
- xievent->event_y = xievent->root_y; |
- } |
-#endif // defined(USE_XI2_MT) |
- } |
- |
- virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE { |
- } |
- |
- // The difference in screen's native resolution pixels between |
- // the border of the touchscreen and the border of the screen, |
- // aka bezel sizes. |
- int left_; |
- int right_; |
- int top_; |
- int bottom_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TouchEventCalibrate); |
-}; |
- |
-} // namespace internal |
- |
//////////////////////////////////////////////////////////////////////////////// |
// WindowTreeHostX11 |
@@ -248,8 +117,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; |
memset(&swa, 0, sizeof(swa)); |
@@ -308,17 +175,13 @@ WindowTreeHostX11::WindowTreeHostX11(const gfx::Rect& bounds) |
XRRSelectInput(xdisplay_, x_root_window_, |
RRScreenChangeNotifyMask | RROutputChangeNotifyMask); |
- Env::GetInstance()->AddObserver(this); |
CreateCompositor(GetAcceleratedWidget()); |
} |
WindowTreeHostX11::~WindowTreeHostX11() { |
- Env::GetInstance()->RemoveObserver(this); |
if (ui::PlatformEventSource::GetInstance()) |
ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); |
- UnConfineCursor(); |
- |
DestroyCompositor(); |
DestroyDispatcher(); |
XDestroyWindow(xdisplay_, xwindow_); |
@@ -351,12 +214,12 @@ uint32_t WindowTreeHostX11::DispatchEvent(const ui::PlatformEvent& event) { |
// EnterNotify creates ET_MOUSE_MOVE. Mark as synthesized as this is not |
// real mouse move event. |
mouse_event.set_flags(mouse_event.flags() | ui::EF_IS_SYNTHESIZED); |
- TranslateAndDispatchMouseEvent(&mouse_event); |
+ TranslateAndDispatchLocatedEvent(&mouse_event); |
break; |
} |
case LeaveNotify: { |
ui::MouseEvent mouse_event(xev); |
- TranslateAndDispatchMouseEvent(&mouse_event); |
+ TranslateAndDispatchLocatedEvent(&mouse_event); |
break; |
} |
case Expose: { |
@@ -380,13 +243,13 @@ uint32_t WindowTreeHostX11::DispatchEvent(const ui::PlatformEvent& event) { |
switch (ui::EventTypeFromNative(xev)) { |
case ui::ET_MOUSEWHEEL: { |
ui::MouseWheelEvent mouseev(xev); |
- TranslateAndDispatchMouseEvent(&mouseev); |
+ TranslateAndDispatchLocatedEvent(&mouseev); |
break; |
} |
case ui::ET_MOUSE_PRESSED: |
case ui::ET_MOUSE_RELEASED: { |
ui::MouseEvent mouseev(xev); |
- TranslateAndDispatchMouseEvent(&mouseev); |
+ TranslateAndDispatchLocatedEvent(&mouseev); |
break; |
} |
case ui::ET_UNKNOWN: |
@@ -412,13 +275,7 @@ uint32_t WindowTreeHostX11::DispatchEvent(const ui::PlatformEvent& 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_) { |
- UnConfineCursor(); |
- ConfineCursorToRootWindow(); |
- } |
+ OnConfigureNotify(); |
if (size_changed) |
OnHostResized(bounds.size()); |
if (origin_changed) |
@@ -479,7 +336,7 @@ uint32_t WindowTreeHostX11::DispatchEvent(const ui::PlatformEvent& event) { |
} |
ui::MouseEvent mouseev(xev); |
- TranslateAndDispatchMouseEvent(&mouseev); |
+ TranslateAndDispatchLocatedEvent(&mouseev); |
break; |
} |
} |
@@ -521,10 +378,6 @@ void WindowTreeHostX11::Hide() { |
} |
} |
-void WindowTreeHostX11::ToggleFullScreen() { |
- NOTIMPLEMENTED(); |
-} |
- |
gfx::Rect WindowTreeHostX11::GetBounds() const { |
return bounds_; |
} |
@@ -560,7 +413,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) { |
@@ -570,18 +422,6 @@ void WindowTreeHostX11::SetBounds(const gfx::Rect& bounds) { |
} |
} |
-gfx::Insets WindowTreeHostX11::GetInsets() const { |
- return insets_; |
-} |
- |
-void WindowTreeHostX11::SetInsets(const gfx::Insets& insets) { |
- insets_ = insets; |
- if (pointer_barriers_) { |
- UnConfineCursor(); |
- ConfineCursorToRootWindow(); |
- } |
-} |
- |
gfx::Point WindowTreeHostX11::GetLocationOnNativeScreen() const { |
return bounds_.origin(); |
} |
@@ -618,54 +458,6 @@ bool WindowTreeHostX11::QueryMouseLocation(gfx::Point* location_return) { |
win_y_return >= 0 && win_y_return < bounds_.height()); |
} |
-bool WindowTreeHostX11::ConfineCursorToRootWindow() { |
-#if XFIXES_MAJOR >= 5 |
- DCHECK(!pointer_barriers_.get()); |
- if (pointer_barriers_) |
- return false; |
- pointer_barriers_.reset(new XID[4]); |
- gfx::Rect bounds(bounds_); |
- bounds.Inset(insets_); |
- // Horizontal, top barriers. |
- pointer_barriers_[0] = XFixesCreatePointerBarrier( |
- xdisplay_, x_root_window_, |
- bounds.x(), bounds.y(), bounds.right(), bounds.y(), |
- BarrierPositiveY, |
- 0, XIAllDevices); |
- // Horizontal, bottom barriers. |
- pointer_barriers_[1] = XFixesCreatePointerBarrier( |
- xdisplay_, x_root_window_, |
- bounds.x(), bounds.bottom(), bounds.right(), bounds.bottom(), |
- BarrierNegativeY, |
- 0, XIAllDevices); |
- // Vertical, left barriers. |
- pointer_barriers_[2] = XFixesCreatePointerBarrier( |
- xdisplay_, x_root_window_, |
- bounds.x(), bounds.y(), bounds.x(), bounds.bottom(), |
- BarrierPositiveX, |
- 0, XIAllDevices); |
- // Vertical, right barriers. |
- pointer_barriers_[3] = XFixesCreatePointerBarrier( |
- xdisplay_, x_root_window_, |
- bounds.right(), bounds.y(), bounds.right(), bounds.bottom(), |
- BarrierNegativeX, |
- 0, XIAllDevices); |
-#endif |
- return true; |
-} |
- |
-void WindowTreeHostX11::UnConfineCursor() { |
-#if XFIXES_MAJOR >= 5 |
- if (pointer_barriers_) { |
- XFixesDestroyPointerBarrier(xdisplay_, pointer_barriers_[0]); |
- XFixesDestroyPointerBarrier(xdisplay_, pointer_barriers_[1]); |
- XFixesDestroyPointerBarrier(xdisplay_, pointer_barriers_[2]); |
- XFixesDestroyPointerBarrier(xdisplay_, pointer_barriers_[3]); |
- pointer_barriers_.reset(); |
- } |
-#endif |
-} |
- |
void WindowTreeHostX11::PostNativeEvent( |
const base::NativeEvent& native_event) { |
DCHECK(xwindow_); |
@@ -717,25 +509,6 @@ void WindowTreeHostX11::MoveCursorToNative(const gfx::Point& location) { |
} |
void WindowTreeHostX11::OnCursorVisibilityChangedNative(bool show) { |
- SetCrOSTapPaused(!show); |
-} |
- |
-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. |
- SetCrOSTapPaused(false); |
} |
ui::EventProcessor* WindowTreeHostX11::GetEventProcessor() { |
@@ -771,26 +544,11 @@ void WindowTreeHostX11::DispatchXI2Event(const base::NativeEvent& event) { |
// 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))) |
- break; |
-#endif // defined(OS_CHROMEOS) |
+ !bounds().Contains(ui::EventLocationFromNative(xev))) |
+ return; |
Yufeng Shen (Slow to review)
2014/04/09 21:35:51
Can we have a
virtual bool WindowTreeHostX11::IsTo
oshima
2014/04/09 23:52:15
I was actually wondering why this needs to be cros
|
+#endif |
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()); |
-#if defined(USE_XI2_MT) |
- if (is_internal_display_) |
- touch_calibrate_->Calibrate(&touchev, bounds_); |
-#endif // defined(USE_XI2_MT) |
- } |
-#endif // defined(OS_CHROMEOS) |
- SendEventToProcessor(&touchev); |
+ TranslateAndDispatchLocatedEvent(&touchev); |
break; |
} |
case ui::ET_MOUSE_MOVED: |
@@ -807,12 +565,12 @@ void WindowTreeHostX11::DispatchXI2Event(const base::NativeEvent& event) { |
xev = &last_event; |
} |
ui::MouseEvent mouseev(xev); |
- TranslateAndDispatchMouseEvent(&mouseev); |
+ TranslateAndDispatchLocatedEvent(&mouseev); |
break; |
} |
case ui::ET_MOUSEWHEEL: { |
ui::MouseWheelEvent mouseev(xev); |
- TranslateAndDispatchMouseEvent(&mouseev); |
+ TranslateAndDispatchLocatedEvent(&mouseev); |
break; |
} |
case ui::ET_SCROLL_FLING_START: |
@@ -846,63 +604,11 @@ void WindowTreeHostX11::SetCursorInternal(gfx::NativeCursor cursor) { |
XDefineCursor(xdisplay_, xwindow_, cursor.platform()); |
} |
-void WindowTreeHostX11::TranslateAndDispatchMouseEvent( |
- ui::MouseEvent* event) { |
- Window* root_window = window(); |
- client::ScreenPositionClient* screen_position_client = |
- client::GetScreenPositionClient(root_window); |
- gfx::Rect local(bounds_.size()); |
- |
- if (screen_position_client && !local.Contains(event->location())) { |
- gfx::Point location(event->location()); |
- // In order to get the correct point in screen coordinates |
- // during passive grab, we first need to find on which host window |
- // the mouse is on, and find out the screen coordinates on that |
- // host window, then convert it back to this host window's coordinate. |
- screen_position_client->ConvertHostPointToScreen(root_window, &location); |
- screen_position_client->ConvertPointFromScreen(root_window, &location); |
- ConvertPointToHost(&location); |
- event->set_location(location); |
- event->set_root_location(location); |
- } |
- SendEventToProcessor(event); |
-} |
+void WindowTreeHostX11::OnConfigureNotify() {} |
-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()) |
- return; |
- // Temporarily pause tap-to-click when the cursor is hidden. |
- Atom prop = atom_cache_.GetAtom("Tap Paused"); |
- unsigned char value = state; |
- XIDeviceList dev_list = |
- ui::DeviceListCacheX::GetInstance()->GetXI2DeviceList(xdisplay_); |
- |
- // Only slave pointer devices could possibly have tap-paused property. |
- for (int i = 0; i < dev_list.count; i++) { |
- if (dev_list[i].use == XISlavePointer) { |
- Atom old_type; |
- int old_format; |
- unsigned long old_nvalues, bytes; |
- unsigned char* data; |
- int result = XIGetProperty(xdisplay_, dev_list[i].deviceid, prop, 0, 0, |
- False, AnyPropertyType, &old_type, &old_format, |
- &old_nvalues, &bytes, &data); |
- if (result != Success) |
- continue; |
- XFree(data); |
- XIChangeProperty(xdisplay_, dev_list[i].deviceid, prop, XA_INTEGER, 8, |
- PropModeReplace, &value, 1); |
- } |
- } |
-#endif |
+void WindowTreeHostX11::TranslateAndDispatchLocatedEvent( |
+ ui::LocatedEvent* event) { |
+ SendEventToProcessor(event); |
} |
// static |