Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Unified Diff: services/ui/public/cpp/window_tree_client.cc

Issue 2341483004: Fix event dispatching and window resizing in high-dpi mode. (Closed)
Patch Set: client area Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ui/aura/window_event_dispatcher.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()));
+ }
+ }
}
}
« no previous file with comments | « no previous file | ui/aura/window_event_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698