diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-27 08:55:13 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-27 08:55:13 +0000 |
commit | a2fb9c5c597e50b6707d5c3475d1eb2cbdc2431d (patch) | |
tree | 07fc79dec63f3f53efe04da831d9c3a5b54d6f98 /ash | |
parent | 09fbf95606906f3aa0d95907d213bcecf0b93ed0 (diff) | |
download | chromium_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.cc | 33 | ||||
-rw-r--r-- | ash/accelerators/accelerator_table.cc | 14 | ||||
-rw-r--r-- | ash/accelerators/accelerator_table.h | 1 | ||||
-rw-r--r-- | ash/display/display_controller_unittest.cc | 14 | ||||
-rw-r--r-- | ash/display/display_manager.cc | 34 | ||||
-rw-r--r-- | ash/display/display_manager.h | 6 | ||||
-rw-r--r-- | ash/display/display_manager_unittest.cc | 35 |
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 |