Chromium Code Reviews| Index: services/ui/public/cpp/window_tree_client.cc |
| diff --git a/services/ui/public/cpp/window_tree_client.cc b/services/ui/public/cpp/window_tree_client.cc |
| index b9f524e367738ac79b76f071666eaab1b5f3a604..b97fb6759cf725b185b772da1ce18960d73d14f4 100644 |
| --- a/services/ui/public/cpp/window_tree_client.cc |
| +++ b/services/ui/public/cpp/window_tree_client.cc |
| @@ -24,9 +24,11 @@ |
| #include "services/ui/public/cpp/window_tree_client_delegate.h" |
| #include "services/ui/public/cpp/window_tree_client_observer.h" |
| #include "services/ui/public/interfaces/window_manager_window_tree_factory.mojom.h" |
| +#include "ui/display/screen.h" |
| #include "ui/events/event.h" |
| #include "ui/gfx/geometry/insets.h" |
| #include "ui/gfx/geometry/size.h" |
| +#include "ui/gfx/geometry/vector2d_conversions.h" |
| namespace ui { |
| @@ -248,7 +250,30 @@ void WindowTreeClient::SetClientArea( |
| const gfx::Insets& client_area, |
| const std::vector<gfx::Rect>& additional_client_areas) { |
| DCHECK(tree_); |
| - tree_->SetClientArea(window_id, client_area, additional_client_areas); |
| + Window* window = GetWindowByServerId(window_id); |
| + // TODO(riajiang): Change to use display::GetDisplayWithDisplayId() after |
| + // https://codereview.chromium.org/2361283002/ is landed. |
| + int64_t display_id = window->display_id(); |
| + std::vector<display::Display> displays = |
| + display::Screen::GetScreen()->GetAllDisplays(); |
| + auto iter = std::find_if(displays.begin(), displays.end(), |
| + [display_id](const display::Display& display) { |
| + return display.id() == display_id; |
| + }); |
| + if (iter != displays.end()) { |
| + if (iter->device_scale_factor() == 1.f) { |
| + tree_->SetClientArea(window_id, client_area, additional_client_areas); |
| + } else { |
| + std::vector<gfx::Rect> scaled_additional_client_areas; |
| + for (const gfx::Rect& area : additional_client_areas) { |
| + scaled_additional_client_areas.push_back( |
| + gfx::ScaleToEnclosingRect(area, iter->device_scale_factor())); |
| + } |
| + tree_->SetClientArea(window_id, |
| + client_area.Scale(iter->device_scale_factor()), |
| + scaled_additional_client_areas); |
| + } |
| + } |
| } |
| void WindowTreeClient::SetHitTestMask(Id window_id, const gfx::Rect& mask) { |
| @@ -891,9 +916,32 @@ void WindowTreeClient::OnClientAreaChanged( |
| mojo::Array<gfx::Rect> new_additional_client_areas) { |
| Window* window = GetWindowByServerId(window_id); |
| if (window) { |
| - WindowPrivate(window).LocalSetClientArea( |
| - new_client_area, |
| - new_additional_client_areas.To<std::vector<gfx::Rect>>()); |
| + // TODO(riajiang): Change to use display::GetDisplayWithDisplayId() after |
|
sky
2016/10/06 16:38:13
You could at least make this code use a common fun
riajiang
2016/10/06 19:33:03
Yes! Done.
|
| + // https://codereview.chromium.org/2361283002/ is landed. |
| + int64_t display_id = window->display_id(); |
| + std::vector<display::Display> displays = |
| + display::Screen::GetScreen()->GetAllDisplays(); |
| + auto iter = std::find_if(displays.begin(), displays.end(), |
| + [display_id](const display::Display& display) { |
| + return display.id() == display_id; |
| + }); |
| + if (iter != displays.end()) { |
| + if (iter->device_scale_factor() == 1.f) { |
| + WindowPrivate(window).LocalSetClientArea( |
| + new_client_area, |
| + new_additional_client_areas.To<std::vector<gfx::Rect>>()); |
| + } else { |
| + std::vector<gfx::Rect> scaled_new_additional_client_areas; |
| + for (const gfx::Rect& area : new_additional_client_areas) { |
| + scaled_new_additional_client_areas.push_back( |
| + gfx::ScaleToEnclosingRect(area, |
| + 1.f / iter->device_scale_factor())); |
| + } |
| + WindowPrivate(window).LocalSetClientArea( |
| + new_client_area.Scale(1.f / iter->device_scale_factor()), |
| + scaled_new_additional_client_areas); |
| + } |
| + } |
| } |
| } |
| @@ -1407,8 +1455,27 @@ void WindowTreeClient::SetUnderlaySurfaceOffsetAndExtendedHitArea( |
| const gfx::Vector2d& offset, |
| const gfx::Insets& hit_area) { |
| if (window_manager_internal_client_) { |
| - window_manager_internal_client_->SetUnderlaySurfaceOffsetAndExtendedHitArea( |
| - server_id(window), offset.x(), offset.y(), hit_area); |
| + // TODO(riajiang): Change to use display::GetDisplayWithDisplayId() after |
| + // https://codereview.chromium.org/2361283002/ is landed. |
| + int64_t display_id = window->display_id(); |
| + std::vector<display::Display> displays = |
| + display::Screen::GetScreen()->GetAllDisplays(); |
| + auto iter = std::find_if(displays.begin(), displays.end(), |
| + [display_id](const display::Display& display) { |
| + return display.id() == display_id; |
| + }); |
| + if (iter != displays.end()) { |
| + if (iter->device_scale_factor() == 1.f) { |
| + window_manager_internal_client_ |
| + ->SetUnderlaySurfaceOffsetAndExtendedHitArea( |
| + server_id(window), offset.x(), offset.y(), hit_area); |
| + } else { |
| + window_manager_internal_client_ |
| + ->SetUnderlaySurfaceOffsetAndExtendedHitArea( |
| + server_id(window), offset.x(), offset.y(), |
| + hit_area.Scale(1.f / iter->device_scale_factor())); |
| + } |
| + } |
| } |
| } |