summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authordnicoara@chromium.org <dnicoara@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-07 18:46:37 +0000
committerdnicoara@chromium.org <dnicoara@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-05-07 18:46:37 +0000
commit94044317facfb7c4d975a3e1ce512d7ca80bbecf (patch)
treecd9d94ca2e371533ed56a94df1a6fffbedb7b704 /ui
parent2fa89ef4d24b0cb46be663192f058677d7637f9d (diff)
downloadchromium_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.cc5
-rw-r--r--ui/base/cursor/ozone/cursor_factory_ozone.cc5
-rw-r--r--ui/base/cursor/ozone/cursor_factory_ozone.h5
-rw-r--r--ui/events/ozone/evdev/cursor_delegate_evdev.h3
-rw-r--r--ui/ozone/platform/dri/cursor_factory_evdev_dri.cc19
-rw-r--r--ui/ozone/platform/dri/cursor_factory_evdev_dri.h5
-rw-r--r--ui/ozone/platform/dri/dri_surface_factory.cc10
-rw-r--r--ui/ozone/platform/dri/dri_surface_factory.h2
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);