summaryrefslogtreecommitdiffstats
path: root/ash
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-27 08:55:13 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-27 08:55:13 +0000
commita2fb9c5c597e50b6707d5c3475d1eb2cbdc2431d (patch)
tree07fc79dec63f3f53efe04da831d9c3a5b54d6f98 /ash
parent09fbf95606906f3aa0d95907d213bcecf0b93ed0 (diff)
downloadchromium_src-a2fb9c5c597e50b6707d5c3475d1eb2cbdc2431d.zip
chromium_src-a2fb9c5c597e50b6707d5c3475d1eb2cbdc2431d.tar.gz
chromium_src-a2fb9c5c597e50b6707d5c3475d1eb2cbdc2431d.tar.bz2
Add more UI scales. short cut to reset ui scale
0.5, 0.625 and 1.125 (640, 800 and 1440 on Pixel) Reassigned shortcut to shift/ctrl/-+ Add reset UI scales (to shift/ctrl/0) BUG=223808 TEST=covered by test. Review URL: https://chromiumcodereview.appspot.com/12586011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@190869 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ash')
-rw-r--r--ash/accelerators/accelerator_controller.cc33
-rw-r--r--ash/accelerators/accelerator_table.cc14
-rw-r--r--ash/accelerators/accelerator_table.h1
-rw-r--r--ash/display/display_controller_unittest.cc14
-rw-r--r--ash/display/display_manager.cc34
-rw-r--r--ash/display/display_manager.h6
-rw-r--r--ash/display/display_manager_unittest.cc35
7 files changed, 97 insertions, 40 deletions
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc
index 02be206..fc95d9c 100644
--- a/ash/accelerators/accelerator_controller.cc
+++ b/ash/accelerators/accelerator_controller.cc
@@ -172,18 +172,25 @@ gfx::Display::Rotation GetNextRotation(gfx::Display::Rotation current) {
}
bool HandleScaleUI(bool up) {
- // UI Scaling is effective only on internal display.
- int64 display_id = gfx::Display::InternalDisplayId();
-#if defined(OS_CHROMEOS)
- // On linux desktop, allow ui scalacing on the first dislpay.
- if (!base::chromeos::IsRunningOnChromeOS())
- display_id = Shell::GetInstance()->display_manager()->first_display_id();
-#endif
- const DisplayInfo& display_info = Shell::GetInstance()->display_manager()->
- GetDisplayInfo(display_id);
- Shell::GetInstance()->display_manager()->SetDisplayUIScale(
- display_id,
- internal::DisplayManager::GetNextUIScale(display_info.ui_scale(), up));
+ internal::DisplayManager* display_manager =
+ Shell::GetInstance()->display_manager();
+ int64 display_id = display_manager->GetDisplayIdForUIScaling();
+ if (display_id == gfx::Display::kInvalidDisplayID)
+ return false;
+ const DisplayInfo& display_info = display_manager->GetDisplayInfo(display_id);
+ float next_scale =
+ internal::DisplayManager::GetNextUIScale(display_info.ui_scale(), up);
+ display_manager->SetDisplayUIScale(display_id, next_scale);
+ return true;
+}
+
+bool HandleScaleReset() {
+ internal::DisplayManager* display_manager =
+ Shell::GetInstance()->display_manager();
+ int64 display_id = display_manager->GetDisplayIdForUIScaling();
+ if (display_id == gfx::Display::kInvalidDisplayID)
+ return false;
+ display_manager->SetDisplayUIScale(display_id, 1.0f);
return true;
}
@@ -792,6 +799,8 @@ bool AcceleratorController::PerformAction(int action,
return HandleScaleUI(true /* up */);
case SCALE_UI_DOWN:
return HandleScaleUI(false /* down */);
+ case SCALE_UI_RESET:
+ return HandleScaleReset();
case ROTATE_WINDOW:
return HandleRotateActiveWindow();
case ROTATE_SCREEN:
diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc
index a8b21ca..9daa8b1 100644
--- a/ash/accelerators/accelerator_table.cc
+++ b/ash/accelerators/accelerator_table.cc
@@ -78,10 +78,8 @@ const AcceleratorData kAcceleratorData[] = {
{ true, ui::VKEY_POWER, ui::EF_SHIFT_DOWN, LOCK_PRESSED },
{ false, ui::VKEY_POWER, ui::EF_SHIFT_DOWN, LOCK_RELEASED },
// Extra shortcut to rotate/scale up/down the screen on linux desktop.
- { true, ui::VKEY_F3, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, ROTATE_SCREEN },
- { true, ui::VKEY_F2, ui::EF_CONTROL_DOWN , SCALE_UI_UP },
- { true, ui::VKEY_F2,
- ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, SCALE_UI_DOWN },
+ { true, ui::VKEY_R,
+ ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, ROTATE_SCREEN },
#endif // !defined(NDEBUG)
{ true, ui::VKEY_O, ui::EF_CONTROL_DOWN, OPEN_FILE_DIALOG },
{ true, ui::VKEY_M, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN,
@@ -105,10 +103,12 @@ const AcceleratorData kAcceleratorData[] = {
NEW_INCOGNITO_WINDOW },
{ true, ui::VKEY_N, ui::EF_CONTROL_DOWN, NEW_WINDOW },
{ true, ui::VKEY_T, ui::EF_CONTROL_DOWN, NEW_TAB },
- { true, ui::VKEY_BROWSER_BACK,
+ { true, ui::VKEY_OEM_MINUS,
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, SCALE_UI_UP },
- { true, ui::VKEY_BROWSER_FORWARD,
+ { true, ui::VKEY_OEM_PLUS,
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, SCALE_UI_DOWN },
+ { true, ui::VKEY_0,
+ ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, SCALE_UI_RESET },
{ true, ui::VKEY_BROWSER_REFRESH,
ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN, ROTATE_SCREEN },
{ true, ui::VKEY_BROWSER_REFRESH,
@@ -312,6 +312,7 @@ const AcceleratorAction kNonrepeatableActions[] = {
ROTATE_WINDOW,
SCALE_UI_UP,
SCALE_UI_DOWN,
+ SCALE_UI_RESET,
TOGGLE_MAXIMIZED,
WINDOW_MINIMIZE,
};
@@ -342,6 +343,7 @@ const AcceleratorAction kActionsAllowedInAppMode[] = {
ROTATE_SCREEN,
SCALE_UI_UP,
SCALE_UI_DOWN,
+ SCALE_UI_RESET,
SWAP_PRIMARY_DISPLAY,
SWITCH_IME, // Switch to another IME depending on the accelerator.
TOGGLE_CAPS_LOCK,
diff --git a/ash/accelerators/accelerator_table.h b/ash/accelerators/accelerator_table.h
index d358750..b28e4e9 100644
--- a/ash/accelerators/accelerator_table.h
+++ b/ash/accelerators/accelerator_table.h
@@ -49,6 +49,7 @@ enum AcceleratorAction {
ROTATE_SCREEN,
ROTATE_WINDOW,
SCALE_UI_DOWN,
+ SCALE_UI_RESET,
SCALE_UI_UP,
SELECT_LAST_WIN,
SELECT_WIN_0,
diff --git a/ash/display/display_controller_unittest.cc b/ash/display/display_controller_unittest.cc
index 02513fa..28018ce 100644
--- a/ash/display/display_controller_unittest.cc
+++ b/ash/display/display_controller_unittest.cc
@@ -243,14 +243,14 @@ TEST_F(DisplayControllerTest, BoundsUpdated) {
EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString());
EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays());
- UpdateDisplay("400x500,700x700*2");
+ UpdateDisplay("400x500*2,300x300");
EXPECT_EQ(1, observer.CountAndReset());
ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
- EXPECT_EQ("0,0 400x500", GetPrimaryDisplay().bounds().ToString());
- EXPECT_EQ("0,500 350x350", GetSecondaryDisplay().bounds().ToString());
+ EXPECT_EQ("0,0 200x250", GetPrimaryDisplay().bounds().ToString());
+ EXPECT_EQ("0,250 300x300", GetSecondaryDisplay().bounds().ToString());
// No change
- UpdateDisplay("400x500,700x700*2");
+ UpdateDisplay("400x500*2,300x300");
EXPECT_EQ(0, observer.CountAndReset());
// Rotation
@@ -260,12 +260,14 @@ TEST_F(DisplayControllerTest, BoundsUpdated) {
display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90);
EXPECT_EQ(0, observer.CountAndReset());
- // UI scale
+ // UI scale is eanbled only on internal display (=1st display in unittest).
int64 secondary_id = GetSecondaryDisplay().id();
gfx::Display::SetInternalDisplayId(secondary_id);
display_manager->SetDisplayUIScale(secondary_id, 1.25f);
+ EXPECT_EQ(0, observer.CountAndReset());
+ display_manager->SetDisplayUIScale(primary_id, 1.25f);
EXPECT_EQ(1, observer.CountAndReset());
- display_manager->SetDisplayUIScale(secondary_id, 1.25f);
+ display_manager->SetDisplayUIScale(primary_id, 1.25f);
EXPECT_EQ(0, observer.CountAndReset());
}
diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc
index d0b31c4..d5c1440 100644
--- a/ash/display/display_manager.cc
+++ b/ash/display/display_manager.cc
@@ -54,10 +54,10 @@ typedef std::vector<DisplayInfo> DisplayInfoList;
namespace {
-// List of value UI Scale values. These scales are equivalent to 1024,
-// 1280, 1600 and 1920 pixel width respectively on 2560 pixel width 2x
+// List of value UI Scale values. These scales are equivalent to 640, 800, 1024,
+// 1280, 1440, 1600 and 1920 pixel width respectively on 2560 pixel width 2x
// density display.
-const float kUIScales[] = {0.8f, 1.0f, 1.25f, 1.5f};
+const float kUIScales[] = {0.5f, 0.625f, 0.8f, 1.0f, 1.125f, 1.25f, 1.5f};
const size_t kUIScaleTableSize = arraysize(kUIScales);
struct DisplaySortFunctor {
@@ -265,18 +265,7 @@ bool DisplayManager::IsDisplayUIScalingEnabled() const {
HasSwitch(switches::kAshDisableUIScaling);
if (!enabled)
return false;
- // UI Scaling is effective only when the internal display has
- // 2x density (currently Pixel).
- int64 display_id = gfx::Display::InternalDisplayId();
-#if defined(OS_CHROMEOS)
- // On linux desktop, allow ui scaling on the first dislpay if an internal
- // display isn't specified.
- if (display_id == gfx::Display::kInvalidDisplayID &&
- !base::chromeos::IsRunningOnChromeOS()) {
- display_id = Shell::GetInstance()->display_manager()->first_display_id();
- }
-#endif
- return GetDisplayForId(display_id).device_scale_factor() == 2.0f;
+ return GetDisplayIdForUIScaling() != gfx::Display::kInvalidDisplayID;
}
gfx::Insets DisplayManager::GetOverscanInsets(int64 display_id) const {
@@ -431,7 +420,6 @@ void DisplayManager::UpdateDisplays(
}
displays_ = new_displays;
-
// Temporarily add displays to be removed because display object
// being removed are accessed during shutting down the root.
displays_.insert(displays_.end(), removed_displays.begin(),
@@ -574,6 +562,20 @@ void DisplayManager::OnRootWindowResized(const aura::RootWindow* root,
}
}
+int64 DisplayManager::GetDisplayIdForUIScaling() const {
+ // UI Scaling is effective only on internal display.
+ int64 display_id = gfx::Display::InternalDisplayId();
+#if defined(OS_CHROMEOS)
+ // On linux desktop, allow ui scalacing on the first dislpay.
+ if (!base::chromeos::IsRunningOnChromeOS())
+ display_id = first_display_id();
+#elif defined(OS_WIN)
+ display_id = first_display_id();
+#endif
+ return GetDisplayForId(display_id).device_scale_factor() == 2.0f ?
+ display_id : gfx::Display::kInvalidDisplayID;
+}
+
void DisplayManager::Init() {
// TODO(oshima): Move this logic to DisplayChangeObserver.
const string size_str = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
diff --git a/ash/display/display_manager.h b/ash/display/display_manager.h
index 679a8ad..e4918b5 100644
--- a/ash/display/display_manager.h
+++ b/ash/display/display_manager.h
@@ -156,6 +156,12 @@ class ASH_EXPORT DisplayManager : public aura::RootWindowObserver {
// Returns the human-readable name for the display |id|.
std::string GetDisplayNameForId(int64 id);
+ // Returns the display id that is capable of UI scaling. On device,
+ // this returns internal display's ID if its device scale factor is 2,
+ // or invalid ID if such internal display doesn't exist. On linux
+ // desktop, this returns the first display ID.
+ int64 GetDisplayIdForUIScaling() const;
+
// RootWindowObserver overrides:
virtual void OnRootWindowResized(const aura::RootWindow* root,
const gfx::Size& new_size) OVERRIDE;
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc
index 3f76976..3e84579 100644
--- a/ash/display/display_manager_unittest.cc
+++ b/ash/display/display_manager_unittest.cc
@@ -700,5 +700,40 @@ TEST_F(DisplayManagerTest, Rotate) {
GetDisplayInfoAt(1).size_in_pixel().ToString());
}
+TEST_F(DisplayManagerTest, UIScale) {
+ // 1x display does not support scaling.
+ UpdateDisplay("100x200");
+ int64 display_id = Shell::GetScreen()->GetPrimaryDisplay().id();
+
+ display_manager()->SetDisplayUIScale(display_id, 1.5f);
+ EXPECT_EQ(1.0f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 1.25f);
+ EXPECT_EQ(1.0f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 1.125f);
+ EXPECT_EQ(1.0, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 0.8f);
+ EXPECT_EQ(1.0f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 0.625f);
+ EXPECT_EQ(1.0f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 0.5f);
+ EXPECT_EQ(1.0f, GetDisplayInfoAt(0).ui_scale());
+
+ // 2x display supports all scales.
+ UpdateDisplay("100x200*2");
+ EXPECT_EQ(1.0f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 1.5f);
+ EXPECT_EQ(1.5f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 1.25f);
+ EXPECT_EQ(1.25f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 1.125f);
+ EXPECT_EQ(1.125f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 0.8f);
+ EXPECT_EQ(0.8f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 0.625f);
+ EXPECT_EQ(0.625f, GetDisplayInfoAt(0).ui_scale());
+ display_manager()->SetDisplayUIScale(display_id, 0.5f);
+ EXPECT_EQ(0.5f, GetDisplayInfoAt(0).ui_scale());
+}
+
} // namespace internal
} // namespace ash