Commit 6ef57013 authored by Maksim Sisov's avatar Maksim Sisov Committed by Commit Bot

[ozone/wayland] Implement GetDisplayMatching.

Use display::FindDisplayWithBiggestIntersection to find
a display with biggest intersection with the specified rect.

If no display found, return a default display with invalid
id.

Bug: 875161
Change-Id: I585c3c23daba8ff0c2c58bc94f074fff6783a2d7
Reviewed-on: https://chromium-review.googlesource.com/c/1430002
Commit-Queue: Maksim Sisov <msisov@igalia.com>
Reviewed-by: default avatarRobert Kroeger <rjkroege@chromium.org>
Cr-Commit-Position: refs/heads/master@{#626487}
parent 8c00c3df
......@@ -129,9 +129,12 @@ display::Display WaylandScreen::GetDisplayNearestPoint(
display::Display WaylandScreen::GetDisplayMatching(
const gfx::Rect& match_rect) const {
// TODO(msisov): https://crbug.com/890272
NOTIMPLEMENTED_LOG_ONCE();
return GetPrimaryDisplay();
const display::Display* display_matching =
display::FindDisplayWithBiggestIntersection(display_list_.displays(),
match_rect);
if (!display_matching)
return display::Display();
return *display_matching;
}
void WaylandScreen::AddObserver(display::DisplayObserver* observer) {
......
......@@ -281,6 +281,76 @@ TEST_P(WaylandScreenTest, GetAcceleratedWidgetAtScreenPoint) {
window_->set_pointer_focus(false);
}
TEST_P(WaylandScreenTest, GetDisplayMatching) {
TestDisplayObserver observer;
platform_screen_->AddObserver(&observer);
const display::Display primary_display =
platform_screen_->GetPrimaryDisplay();
wl::MockOutput* output2 = server_.CreateAndInitializeOutput();
Sync();
// Place it on the right side of the primary display.
const gfx::Rect output2_rect =
gfx::Rect(primary_display.bounds().width(), 0, 1024, 768);
UpdateOutputGeometry(output2->resource(), output2_rect);
Sync();
const display::Display second_display = observer.GetDisplay();
EXPECT_EQ(second_display.bounds(), output2_rect);
// We have two displays: display1(0:0,1024x768) and display2(1024:0,1024x768).
EXPECT_EQ(
primary_display.id(),
platform_screen_->GetDisplayMatching(gfx::Rect(0, 0, 100, 100)).id());
EXPECT_EQ(
second_display.id(),
platform_screen_->GetDisplayMatching(gfx::Rect(1024, 0, 10, 10)).id());
// More pixels on second display.
EXPECT_EQ(
second_display.id(),
platform_screen_->GetDisplayMatching(gfx::Rect(1020, 0, 10, 10)).id());
// More pixels on first display.
EXPECT_EQ(
primary_display.id(),
platform_screen_->GetDisplayMatching(gfx::Rect(1018, 0, 10, 10)).id());
// Half pixels on second and half on primary.
EXPECT_EQ(
primary_display.id(),
platform_screen_->GetDisplayMatching(gfx::Rect(1019, 0, 10, 10)).id());
// Place second display 700 pixels below along y axis (1024:700,1024x768)
UpdateOutputGeometry(
output2->resource(),
gfx::Rect(gfx::Point(output2_rect.x(), output2_rect.y() + 700),
output2_rect.size()));
Sync();
// The match rect is located outside the displays.
EXPECT_EQ(
display::kInvalidDisplayId,
platform_screen_->GetDisplayMatching(gfx::Rect(1024, 0, 10, 10)).id());
// At least some of the pixels are located on the display.
EXPECT_EQ(
primary_display.id(),
platform_screen_->GetDisplayMatching(gfx::Rect(1023, 0, 10, 10)).id());
// Most of pixels are located on second display.
EXPECT_EQ(
second_display.id(),
platform_screen_->GetDisplayMatching(gfx::Rect(1023, 695, 10, 10)).id());
platform_screen_->RemoveObserver(&observer);
}
INSTANTIATE_TEST_SUITE_P(XdgVersionV5Test,
WaylandScreenTest,
::testing::Values(kXdgShellV5));
......
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