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

Unified Diff: ui/views/widget/desktop_aura/desktop_screen_x11.cc

Issue 2963033002: Linux UI: Dynamically respond to changes in the scale factor (Closed)
Patch Set: LinuxUI may not exist in test scenarios Created 3 years, 6 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
Index: ui/views/widget/desktop_aura/desktop_screen_x11.cc
diff --git a/ui/views/widget/desktop_aura/desktop_screen_x11.cc b/ui/views/widget/desktop_aura/desktop_screen_x11.cc
index 55ed1a949eca87418da85ffd18d88acef32790f4..124312733d5927cdd173a345b1ec994c77c1a23c 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11.cc
@@ -11,6 +11,7 @@
#undef RootWindow
#include "base/logging.h"
+#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher.h"
@@ -37,10 +38,6 @@
namespace {
-// The delay to perform configuration after RRNotify. See the comment
-// in |Dispatch()|.
-const int64_t kConfigureDelayMs = 500;
-
double GetDeviceScaleFactor() {
float device_scale_factor = 1.0f;
if (views::LinuxUI::instance()) {
@@ -91,7 +88,10 @@ DesktopScreenX11::DesktopScreenX11()
x_root_window_(DefaultRootWindow(xdisplay_)),
has_xrandr_(false),
xrandr_event_base_(0),
- primary_display_index_(0) {
+ primary_display_index_(0),
+ weak_factory_(this) {
+ if (views::LinuxUI::instance())
+ views::LinuxUI::instance()->AddDeviceScaleFactorObserver(this);
// We only support 1.3+. There were library changes before this and we should
// use the new interface instead of the 1.2 one.
int randr_version_major = 0;
@@ -120,6 +120,8 @@ DesktopScreenX11::DesktopScreenX11()
}
DesktopScreenX11::~DesktopScreenX11() {
+ if (views::LinuxUI::instance())
+ views::LinuxUI::instance()->AddDeviceScaleFactorObserver(this);
if (has_xrandr_ && ui::PlatformEventSource::GetInstance())
ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
}
@@ -247,18 +249,7 @@ uint32_t DesktopScreenX11::DispatchEvent(const ui::PlatformEvent& event) {
} else if (event->type - xrandr_event_base_ == RRNotify ||
(event->type == PropertyNotify &&
event->xproperty.atom == gfx::GetAtom("_NET_WORKAREA"))) {
- // There's some sort of observer dispatch going on here, but I don't think
- // it's the screen's?
- if (configure_timer_.get() && configure_timer_->IsRunning()) {
- configure_timer_->Reset();
- } else {
- configure_timer_.reset(new base::OneShotTimer());
- configure_timer_->Start(
- FROM_HERE,
- base::TimeDelta::FromMilliseconds(kConfigureDelayMs),
- this,
- &DesktopScreenX11::ConfigureTimerFired);
- }
+ RestartDelayedConfigurationTask();
} else {
NOTREACHED();
}
@@ -266,11 +257,15 @@ uint32_t DesktopScreenX11::DispatchEvent(const ui::PlatformEvent& event) {
return ui::POST_DISPATCH_NONE;
}
+void DesktopScreenX11::OnDeviceScaleFactorChanged() {
+ RestartDelayedConfigurationTask();
+}
+
// static
void DesktopScreenX11::UpdateDeviceScaleFactorForTest() {
DesktopScreenX11* screen =
static_cast<DesktopScreenX11*>(display::Screen::GetScreen());
- screen->ConfigureTimerFired();
+ screen->UpdateDisplays();
}
////////////////////////////////////////////////////////////////////////////////
@@ -283,7 +278,11 @@ DesktopScreenX11::DesktopScreenX11(
has_xrandr_(false),
xrandr_event_base_(0),
displays_(test_displays),
- primary_display_index_(0) {}
+ primary_display_index_(0),
+ weak_factory_(this) {
+ if (views::LinuxUI::instance())
+ views::LinuxUI::instance()->AddDeviceScaleFactorObserver(this);
+}
std::vector<display::Display> DesktopScreenX11::BuildDisplaysFromXRandRInfo() {
std::vector<display::Display> displays;
@@ -390,7 +389,14 @@ std::vector<display::Display> DesktopScreenX11::BuildDisplaysFromXRandRInfo() {
return displays;
}
-void DesktopScreenX11::ConfigureTimerFired() {
+void DesktopScreenX11::RestartDelayedConfigurationTask() {
+ delayed_configuration_task_.Reset(base::Bind(
+ &DesktopScreenX11::UpdateDisplays, weak_factory_.GetWeakPtr()));
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, delayed_configuration_task_.callback());
+}
+
+void DesktopScreenX11::UpdateDisplays() {
std::vector<display::Display> old_displays = displays_;
SetDisplaysInternal(BuildDisplaysFromXRandRInfo());
change_notifier_.NotifyDisplaysChanged(old_displays, displays_);
« no previous file with comments | « ui/views/widget/desktop_aura/desktop_screen_x11.h ('k') | ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698