Commit c77d5647 authored by David Reveman's avatar David Reveman Committed by Commit Bot

exo: Handle cursor hotspot adjustments correctly.

SetCursor should determine if cursor hotspot changed by looking
at the last set hotspot and not the last captured hotspot.

Bug: 842507
Test: exo_unittests --gtest_filter=PointerTest.SetCursor
Change-Id: I98de185a618adeb440165f372d8127bbc0c4a6f0
Reviewed-on: https://chromium-review.googlesource.com/1056667Reviewed-by: default avatarDaniele Castagna <dcastagna@chromium.org>
Commit-Queue: David Reveman <reveman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#558159}
parent 3e4c0624
...@@ -133,7 +133,7 @@ void Pointer::SetCursor(Surface* surface, const gfx::Point& hotspot) { ...@@ -133,7 +133,7 @@ void Pointer::SetCursor(Surface* surface, const gfx::Point& hotspot) {
cursor_changed = true; cursor_changed = true;
} }
if (hotspot != cursor_hotspot_) { if (hotspot != hotspot_) {
hotspot_ = hotspot; hotspot_ = hotspot;
cursor_changed = true; cursor_changed = true;
} }
......
...@@ -70,9 +70,10 @@ TEST_F(PointerTest, SetCursor) { ...@@ -70,9 +70,10 @@ TEST_F(PointerTest, SetCursor) {
pointer_surface->Commit(); pointer_surface->Commit();
// Set pointer surface. // Set pointer surface.
pointer->SetCursor(pointer_surface.get(), gfx::Point()); pointer->SetCursor(pointer_surface.get(), gfx::Point(5, 5));
RunAllPendingInMessageLoop(); RunAllPendingInMessageLoop();
const viz::RenderPass* last_render_pass;
{ {
viz::SurfaceId surface_id = pointer->host_window()->GetSurfaceId(); viz::SurfaceId surface_id = pointer->host_window()->GetSurfaceId();
viz::SurfaceManager* surface_manager = aura::Env::GetInstance() viz::SurfaceManager* surface_manager = aura::Env::GetInstance()
...@@ -84,10 +85,25 @@ TEST_F(PointerTest, SetCursor) { ...@@ -84,10 +85,25 @@ TEST_F(PointerTest, SetCursor) {
surface_manager->GetSurfaceForId(surface_id)->GetActiveFrame(); surface_manager->GetSurfaceForId(surface_id)->GetActiveFrame();
EXPECT_EQ(gfx::Rect(0, 0, 10, 10), EXPECT_EQ(gfx::Rect(0, 0, 10, 10),
frame.render_pass_list.back()->output_rect); frame.render_pass_list.back()->output_rect);
last_render_pass = frame.render_pass_list.back().get();
} }
// Adjust hotspot. // Adjust hotspot.
pointer->SetCursor(pointer_surface.get(), gfx::Point(1, 1)); pointer->SetCursor(pointer_surface.get(), gfx::Point());
RunAllPendingInMessageLoop();
// Verify that adjustment to hotspot resulted in new frame.
{
viz::SurfaceId surface_id = pointer->host_window()->GetSurfaceId();
viz::SurfaceManager* surface_manager = aura::Env::GetInstance()
->context_factory_private()
->GetFrameSinkManager()
->surface_manager();
ASSERT_TRUE(surface_manager->GetSurfaceForId(surface_id)->HasActiveFrame());
const viz::CompositorFrame& frame =
surface_manager->GetSurfaceForId(surface_id)->GetActiveFrame();
EXPECT_TRUE(frame.render_pass_list.back().get() != last_render_pass);
}
// Unset pointer surface. // Unset pointer surface.
pointer->SetCursor(nullptr, gfx::Point()); pointer->SetCursor(nullptr, gfx::Point());
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment