Skip to content

Commit

Permalink
Unified Desktop: Support 2xDSF display
Browse files Browse the repository at this point in the history
* Moved and renamed accelerator functions for UI scaling as
it now handles resolution change. The term "zoom" would be  more appropriate as it describe the feature not how it's implemented.

* Cleanup the obsolete ui scaling code for unified desktop in RootWindowTransformers

BUG=514877
TEST=covered by unit tests. manual.

Review URL: https://codereview.chromium.org/1263853002

Cr-Commit-Position: refs/heads/master@{#341172}
  • Loading branch information
mitoshima authored and Commit bot committed Jul 30, 2015
1 parent 0905996 commit af6e857
Show file tree
Hide file tree
Showing 12 changed files with 318 additions and 143 deletions.
49 changes: 49 additions & 0 deletions ash/accelerators/accelerator_commands.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

#include "ash/accelerators/accelerator_commands.h"

#include "ash/display/display_manager.h"
#include "ash/display/display_util.h"
#include "ash/shell.h"
#include "ash/shell_delegate.h"
#include "ash/wm/mru_window_tracker.h"
Expand Down Expand Up @@ -56,5 +58,52 @@ void ToggleTouchHudProjection() {
Shell::GetInstance()->SetTouchHudProjectionEnabled(!enabled);
}

bool IsInternalDisplayZoomEnabled() {
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
return display_manager->IsDisplayUIScalingEnabled() ||
display_manager->IsInUnifiedMode();
}

bool ZoomInternalDisplay(bool up) {
if (up)
base::RecordAction(base::UserMetricsAction("Accel_Scale_Ui_Up"));
else
base::RecordAction(base::UserMetricsAction("Accel_Scale_Ui_Down"));

DisplayManager* display_manager = Shell::GetInstance()->display_manager();

int64 display_id = display_manager->IsInUnifiedMode()
? DisplayManager::kUnifiedDisplayId
: display_manager->GetDisplayIdForUIScaling();
const DisplayInfo& display_info = display_manager->GetDisplayInfo(display_id);
DisplayMode mode;

if (display_manager->IsInUnifiedMode()) {
if (!GetDisplayModeForNextResolution(display_info, up, &mode))
return false;
} else {
if (!GetDisplayModeForNextUIScale(display_info, up, &mode))
return false;
}
return display_manager->SetDisplayMode(display_id, mode);
}

void ResetInternalDisplayZoom() {
base::RecordAction(base::UserMetricsAction("Accel_Scale_Ui_Reset"));
DisplayManager* display_manager = Shell::GetInstance()->display_manager();

if (display_manager->IsInUnifiedMode()) {
const DisplayInfo& display_info =
display_manager->GetDisplayInfo(DisplayManager::kUnifiedDisplayId);
const std::vector<DisplayMode>& modes = display_info.display_modes();
auto iter =
std::find_if(modes.begin(), modes.end(),
[](const DisplayMode& mode) { return mode.native; });
display_manager->SetDisplayMode(DisplayManager::kUnifiedDisplayId, *iter);
} else {
SetDisplayUIScale(display_manager->GetDisplayIdForUIScaling(), 1.0f);
}
}

} // namespace accelerators
} // namespace ash
9 changes: 9 additions & 0 deletions ash/accelerators/accelerator_commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,15 @@ ASH_EXPORT void ToggleFullscreen();
// Toggles touch HUD.
ASH_EXPORT void ToggleTouchHudProjection();

// True if the desktop zoom accelerator is enabled.
bool IsInternalDisplayZoomEnabled();

// Change internal display zooming up or down.
ASH_EXPORT bool ZoomInternalDisplay(bool up);

// Reset the display zooming to the default state.
ASH_EXPORT void ResetInternalDisplayZoom();

} // namespace accelerators
} // namespace ash

Expand Down
57 changes: 4 additions & 53 deletions ash/accelerators/accelerator_controller.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
#include "ash/accelerators/debug_commands.h"
#include "ash/ash_switches.h"
#include "ash/debug.h"
#include "ash/display/display_manager.h"
#include "ash/display/display_util.h"
#include "ash/display/window_tree_host_manager.h"
#include "ash/focus_cycler.h"
#include "ash/gpu_support.h"
Expand Down Expand Up @@ -288,53 +286,6 @@ void HandleRotateActiveWindow() {
}
}

void HandleScaleReset() {
base::RecordAction(UserMetricsAction("Accel_Scale_Ui_Reset"));
DisplayManager* display_manager = Shell::GetInstance()->display_manager();

if (display_manager->IsInUnifiedMode()) {
const DisplayInfo& display_info =
display_manager->GetDisplayInfo(DisplayManager::kUnifiedDisplayId);
const std::vector<DisplayMode>& modes = display_info.display_modes();
auto iter =
std::find_if(modes.begin(), modes.end(),
[](const DisplayMode& mode) { return mode.native; });
display_manager->SetDisplayMode(DisplayManager::kUnifiedDisplayId, *iter);
} else {
SetDisplayUIScale(display_manager->GetDisplayIdForUIScaling(), 1.0f);
}
}

bool CanHandleScaleUI() {
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
return display_manager->IsDisplayUIScalingEnabled() ||
display_manager->IsInUnifiedMode();
}

void HandleScaleUI(bool up) {
if (up)
base::RecordAction(UserMetricsAction("Accel_Scale_Ui_Up"));
else
base::RecordAction(UserMetricsAction("Accel_Scale_Ui_Down"));

DisplayManager* display_manager = Shell::GetInstance()->display_manager();

int64 display_id = display_manager->IsInUnifiedMode()
? DisplayManager::kUnifiedDisplayId
: display_manager->GetDisplayIdForUIScaling();
const DisplayInfo& display_info = display_manager->GetDisplayInfo(display_id);
DisplayMode mode;

if (display_manager->IsInUnifiedMode()) {
if (!GetDisplayModeForNextResolution(display_info, up, &mode))
return;
} else {
if (!GetDisplayModeForNextUIScale(display_info, up, &mode))
return;
}
display_manager->SetDisplayMode(display_id, mode);
}

void HandleShowKeyboardOverlay() {
base::RecordAction(UserMetricsAction("Accel_Show_Keyboard_Overlay"));
ash::Shell::GetInstance()->new_window_delegate()->ShowKeyboardOverlay();
Expand Down Expand Up @@ -886,7 +837,7 @@ bool AcceleratorController::CanPerformAction(
case SCALE_UI_RESET:
case SCALE_UI_UP:
case SCALE_UI_DOWN:
return CanHandleScaleUI();
return accelerators::IsInternalDisplayZoomEnabled();
case SHOW_MESSAGE_CENTER_BUBBLE:
return CanHandleShowMessageCenterBubble();
case SWITCH_IME:
Expand Down Expand Up @@ -1095,13 +1046,13 @@ void AcceleratorController::PerformAction(AcceleratorAction action,
HandleRotateActiveWindow();
break;
case SCALE_UI_DOWN:
HandleScaleUI(false /* down */);
accelerators::ZoomInternalDisplay(false /* down */);
break;
case SCALE_UI_RESET:
HandleScaleReset();
accelerators::ResetInternalDisplayZoom();
break;
case SCALE_UI_UP:
HandleScaleUI(true /* up */);
accelerators::ZoomInternalDisplay(true /* up */);
break;
case SHOW_KEYBOARD_OVERLAY:
HandleShowKeyboardOverlay();
Expand Down
64 changes: 46 additions & 18 deletions ash/display/display_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <cmath>
#include <set>
#include <string>
#include <utility>
#include <vector>

#include "ash/ash_switches.h"
Expand Down Expand Up @@ -110,6 +111,15 @@ void MaybeInitInternalDisplay(DisplayInfo* info) {
}
}

gfx::Size GetMaxNativeSize(const DisplayInfo& info) {
gfx::Size size;
for (auto& mode : info.display_modes()) {
if (mode.size.GetArea() > size.GetArea())
size = mode.size;
}
return size;
}

} // namespace

using std::string;
Expand Down Expand Up @@ -453,17 +463,13 @@ DisplayMode DisplayManager::GetActiveModeForDisplayId(int64 display_id) const {
// restored mode to |display_mode_|, so it needs to look up the mode whose
// UI-scale value matches. See the TODO in RegisterDisplayProperty().
const DisplayInfo& info = GetDisplayInfo(display_id);
const std::vector<DisplayMode>& display_modes = info.display_modes();

if (GetDisplayIdForUIScaling() == display_id) {
for (size_t i = 0; i < display_modes.size(); ++i) {
if (info.configured_ui_scale() == display_modes[i].ui_scale)
return display_modes[i];
}
} else {
for (size_t i = 0; i < display_modes.size(); ++i) {
if (display_modes[i].native)
return display_modes[i];
for (auto& mode : info.display_modes()) {
if (GetDisplayIdForUIScaling() == display_id) {
if (info.configured_ui_scale() == mode.ui_scale)
return mode;
} else if (mode.native) {
return mode;
}
}
return selected_mode;
Expand Down Expand Up @@ -1114,11 +1120,19 @@ void DisplayManager::CreateSoftwareMirroringDisplayInfo(

// 1st Pass. Find the max size.
int max_height = std::numeric_limits<int>::min();
for (auto& info : *display_info_list)

int default_height = 0;
float default_device_scale_factor = 1.0f;
for (auto& info : *display_info_list) {
max_height = std::max(max_height, info.size_in_pixel().height());
if (!default_height || gfx::Display::IsInternalDisplayId(info.id())) {
default_height = info.size_in_pixel().height();
default_device_scale_factor = info.device_scale_factor();
}
}

std::vector<DisplayMode> display_mode_list;
std::set<float> scales;
std::set<std::pair<float, float>> dsf_scale_list;

// 2nd Pass. Compute the unified display size.
for (auto& info : *display_info_list) {
Expand All @@ -1131,20 +1145,34 @@ void DisplayManager::CreateSoftwareMirroringDisplayInfo(
info.id(), origin, 1.0f / scale);
unified_bounds.Union(display.bounds());

scales.insert(scale);
dsf_scale_list.insert(
std::make_pair(info.device_scale_factor(), scale));
}

DisplayInfo info(kUnifiedDisplayId, "Unified Desktop", false);
info.SetBounds(unified_bounds);

DisplayMode native_mode(unified_bounds.size(), 60.0f, false, true);
info.SetDisplayModes(CreateUnifiedDisplayModeList(native_mode, scales));
std::vector<DisplayMode> modes =
CreateUnifiedDisplayModeList(native_mode, dsf_scale_list);

// Find the default mode.
auto iter = std::find_if(
modes.begin(), modes.end(),
[default_height,
default_device_scale_factor](const DisplayMode& mode) {
return mode.size.height() == default_height &&
mode.device_scale_factor == default_device_scale_factor;
});
iter->native = true;
info.SetDisplayModes(modes);
info.set_device_scale_factor(iter->device_scale_factor);
info.SetBounds(gfx::Rect(iter->size));

// Forget the configured resolution if the original unified
// desktop resolution has changed.
if (display_info_.count(kUnifiedDisplayId) != 0 &&
display_info_[kUnifiedDisplayId].size_in_pixel() !=
info.size_in_pixel()) {
GetMaxNativeSize(display_info_[kUnifiedDisplayId]) !=
unified_bounds.size()) {
display_modes_.erase(kUnifiedDisplayId);
}

Expand All @@ -1153,7 +1181,7 @@ void DisplayManager::CreateSoftwareMirroringDisplayInfo(
DisplayMode mode;
if (GetSelectedModeForDisplayId(kUnifiedDisplayId, &mode) &&
FindDisplayMode(info, mode) != info.display_modes().end()) {
// TODO(oshima): device scale factor.
info.set_device_scale_factor(mode.device_scale_factor);
info.SetBounds(gfx::Rect(mode.size));
} else {
display_modes_.erase(kUnifiedDisplayId);
Expand Down
Loading

0 comments on commit af6e857

Please sign in to comment.