diff options
author | dnicoara@chromium.org <dnicoara@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-07 18:46:37 +0000 |
---|---|---|
committer | dnicoara@chromium.org <dnicoara@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-05-07 18:46:37 +0000 |
commit | 94044317facfb7c4d975a3e1ce512d7ca80bbecf (patch) | |
tree | cd9d94ca2e371533ed56a94df1a6fffbedb7b704 /ui | |
parent | 2fa89ef4d24b0cb46be663192f058677d7637f9d (diff) | |
download | chromium_src-94044317facfb7c4d975a3e1ce512d7ca80bbecf.zip chromium_src-94044317facfb7c4d975a3e1ce512d7ca80bbecf.tar.gz chromium_src-94044317facfb7c4d975a3e1ce512d7ca80bbecf.tar.bz2 |
[Ozone] Proper cursor support for multi-monitor configurations
NOTRY=true
Review URL: https://codereview.chromium.org/262163003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@268877 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r-- | ui/aura/window_tree_host_ozone.cc | 5 | ||||
-rw-r--r-- | ui/base/cursor/ozone/cursor_factory_ozone.cc | 5 | ||||
-rw-r--r-- | ui/base/cursor/ozone/cursor_factory_ozone.h | 5 | ||||
-rw-r--r-- | ui/events/ozone/evdev/cursor_delegate_evdev.h | 3 | ||||
-rw-r--r-- | ui/ozone/platform/dri/cursor_factory_evdev_dri.cc | 19 | ||||
-rw-r--r-- | ui/ozone/platform/dri/cursor_factory_evdev_dri.h | 5 | ||||
-rw-r--r-- | ui/ozone/platform/dri/dri_surface_factory.cc | 10 | ||||
-rw-r--r-- | ui/ozone/platform/dri/dri_surface_factory.h | 2 |
8 files changed, 38 insertions, 16 deletions
diff --git a/ui/aura/window_tree_host_ozone.cc b/ui/aura/window_tree_host_ozone.cc index 44514d0..5b4a29f 100644 --- a/ui/aura/window_tree_host_ozone.cc +++ b/ui/aura/window_tree_host_ozone.cc @@ -40,8 +40,9 @@ WindowTreeHostOzone::~WindowTreeHostOzone() { bool WindowTreeHostOzone::CanDispatchEvent(const ui::PlatformEvent& ne) { CHECK(ne); ui::Event* event = static_cast<ui::Event*>(ne); - if (event->IsMouseEvent() || event->IsScrollEvent() || event->IsTouchEvent()) - return bounds_.Contains(static_cast<ui::LocatedEvent*>(event)->location()); + if (event->IsMouseEvent() || event->IsScrollEvent()) + return ui::CursorFactoryOzone::GetInstance()->GetCursorWindow() == widget_; + return true; } diff --git a/ui/base/cursor/ozone/cursor_factory_ozone.cc b/ui/base/cursor/ozone/cursor_factory_ozone.cc index 46c1da3..709412e 100644 --- a/ui/base/cursor/ozone/cursor_factory_ozone.cc +++ b/ui/base/cursor/ozone/cursor_factory_ozone.cc @@ -47,4 +47,9 @@ void CursorFactoryOzone::SetCursor(gfx::AcceleratedWidget widget, NOTIMPLEMENTED(); } +gfx::AcceleratedWidget CursorFactoryOzone::GetCursorWindow() { + NOTIMPLEMENTED(); + return 0; +} + } // namespace ui diff --git a/ui/base/cursor/ozone/cursor_factory_ozone.h b/ui/base/cursor/ozone/cursor_factory_ozone.h index 8ea2e74..ac18a50 100644 --- a/ui/base/cursor/ozone/cursor_factory_ozone.h +++ b/ui/base/cursor/ozone/cursor_factory_ozone.h @@ -43,6 +43,11 @@ class UI_BASE_EXPORT CursorFactoryOzone { // TODO(spang): Move this. virtual void SetCursor(gfx::AcceleratedWidget widget, PlatformCursor cursor); + // Returns the window on which the cursor is active. + // TODO(dnicoara) Move this once the WindowTreeHost refactoring finishes and + // WindowTreeHost::CanDispatchEvent() is no longer present. + virtual gfx::AcceleratedWidget GetCursorWindow(); + private: static CursorFactoryOzone* impl_; // not owned }; diff --git a/ui/events/ozone/evdev/cursor_delegate_evdev.h b/ui/events/ozone/evdev/cursor_delegate_evdev.h index b9ed4e9..586ce8d 100644 --- a/ui/events/ozone/evdev/cursor_delegate_evdev.h +++ b/ui/events/ozone/evdev/cursor_delegate_evdev.h @@ -22,8 +22,7 @@ class EVENTS_EXPORT CursorDelegateEvdev { virtual void MoveCursorTo(gfx::AcceleratedWidget widget, const gfx::PointF& location) = 0; - // Window under cursor & location in window. - virtual gfx::AcceleratedWidget window() = 0; + // Location in window. virtual gfx::PointF location() = 0; }; diff --git a/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc b/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc index 46b26db..273dd1ae 100644 --- a/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc +++ b/ui/ozone/platform/dri/cursor_factory_evdev_dri.cc @@ -14,9 +14,7 @@ CursorFactoryEvdevDri::CursorFactoryEvdevDri(DriSurfaceFactory* dri) // TODO(dnicoara) Assume the first widget since at this point there are no // widgets initialized. cursor_window_ = DriSurfaceFactory::kDefaultWidgetHandle; - cursor_bounds_ = gfx::RectF(0, 0, 2560, 1700); // TODO(spang): Argh! - cursor_location_ = - gfx::PointF(cursor_bounds_.width() / 2, cursor_bounds_.height() / 2); + cursor_location_ = gfx::PointF(2560 / 2, 1700 / 2); // TODO(spang): Argh! // The DRI cursor is invisible unless explicitly set. Therefore, set the // pointer cursor on initialization. @@ -31,6 +29,7 @@ void CursorFactoryEvdevDri::SetBitmapCursor( scoped_refptr<BitmapCursorOzone> cursor) { if (cursor_ == cursor) return; + cursor_ = cursor; if (cursor_) dri_->SetHardwareCursor( @@ -41,12 +40,16 @@ void CursorFactoryEvdevDri::SetBitmapCursor( void CursorFactoryEvdevDri::MoveCursorTo(gfx::AcceleratedWidget widget, const gfx::PointF& location) { + if (widget != cursor_window_) + dri_->UnsetHardwareCursor(cursor_window_); + cursor_window_ = widget; cursor_location_ = location; - cursor_location_.SetToMax( - gfx::PointF(cursor_bounds_.x(), cursor_bounds_.y())); - cursor_location_.SetToMin( - gfx::PointF(cursor_bounds_.right(), cursor_bounds_.bottom())); + + gfx::Size size = dri_->GetWidgetSize(cursor_window_); + cursor_location_.SetToMax(gfx::PointF(0, 0)); + cursor_location_.SetToMin(gfx::PointF(size.width(), size.height())); + if (cursor_) dri_->MoveHardwareCursor(cursor_window_, bitmap_location()); } @@ -55,7 +58,7 @@ void CursorFactoryEvdevDri::MoveCursor(const gfx::Vector2dF& delta) { MoveCursorTo(cursor_window_, cursor_location_ + delta); } -gfx::AcceleratedWidget CursorFactoryEvdevDri::window() { +gfx::AcceleratedWidget CursorFactoryEvdevDri::GetCursorWindow() { return cursor_window_; } diff --git a/ui/ozone/platform/dri/cursor_factory_evdev_dri.h b/ui/ozone/platform/dri/cursor_factory_evdev_dri.h index b1a1a7d..da13219 100644 --- a/ui/ozone/platform/dri/cursor_factory_evdev_dri.h +++ b/ui/ozone/platform/dri/cursor_factory_evdev_dri.h @@ -25,6 +25,7 @@ class CursorFactoryEvdevDri : public BitmapCursorFactoryOzone, virtual ~CursorFactoryEvdevDri(); // BitmapCursorFactoryOzone: + virtual gfx::AcceleratedWidget GetCursorWindow() OVERRIDE; virtual void SetBitmapCursor(gfx::AcceleratedWidget widget, scoped_refptr<BitmapCursorOzone> cursor) OVERRIDE; @@ -33,7 +34,6 @@ class CursorFactoryEvdevDri : public BitmapCursorFactoryOzone, virtual void MoveCursorTo(gfx::AcceleratedWidget widget, const gfx::PointF& location) OVERRIDE; virtual void MoveCursor(const gfx::Vector2dF& delta) OVERRIDE; - virtual gfx::AcceleratedWidget window() OVERRIDE; virtual gfx::PointF location() OVERRIDE; private: @@ -49,9 +49,6 @@ class CursorFactoryEvdevDri : public BitmapCursorFactoryOzone, // The window under the cursor. gfx::AcceleratedWidget cursor_window_; - // The bounds of the window under the cursor. - gfx::RectF cursor_bounds_; - // The location of the cursor within the window. gfx::PointF cursor_location_; }; diff --git a/ui/ozone/platform/dri/dri_surface_factory.cc b/ui/ozone/platform/dri/dri_surface_factory.cc index 9384a91..78d7acf 100644 --- a/ui/ozone/platform/dri/dri_surface_factory.cc +++ b/ui/ozone/platform/dri/dri_surface_factory.cc @@ -315,6 +315,16 @@ bool DriSurfaceFactory::DisableHardwareDisplayController(uint32_t crtc) { return drm_->DisableCrtc(crtc); } +gfx::Size DriSurfaceFactory::GetWidgetSize(gfx::AcceleratedWidget w) { + if (IsWidgetValid(w)) { + HardwareDisplayController* controller = GetControllerForWidget(w); + return gfx::Size(controller->get_mode().hdisplay, + controller->get_mode().vdisplay); + } + + return gfx::Size(0, 0); +} + void DriSurfaceFactory::SetHardwareCursor(gfx::AcceleratedWidget window, const SkBitmap& image, const gfx::Point& location) { diff --git a/ui/ozone/platform/dri/dri_surface_factory.h b/ui/ozone/platform/dri/dri_surface_factory.h index 946434d..6984b7b 100644 --- a/ui/ozone/platform/dri/dri_surface_factory.h +++ b/ui/ozone/platform/dri/dri_surface_factory.h @@ -54,6 +54,8 @@ class OZONE_EXPORT DriSurfaceFactory : public gfx::SurfaceFactoryOzone { virtual scoped_ptr<gfx::VSyncProvider> CreateVSyncProvider( gfx::AcceleratedWidget w); + gfx::Size GetWidgetSize(gfx::AcceleratedWidget w); + void SetHardwareCursor(gfx::AcceleratedWidget window, const SkBitmap& image, const gfx::Point& location); |