diff options
author | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-31 20:48:39 +0000 |
---|---|---|
committer | oshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-08-31 20:48:39 +0000 |
commit | 5378d79012fc21aad9df86c7502f0b8cf4daf8f3 (patch) | |
tree | 8b9eccd48cbebb7411844ca4d35ef8a5a1520165 | |
parent | 4fc24b6fc8a2f232edd5b05d16d5985e298f5bdc (diff) | |
download | chromium_src-5378d79012fc21aad9df86c7502f0b8cf4daf8f3.zip chromium_src-5378d79012fc21aad9df86c7502f0b8cf4daf8f3.tar.gz chromium_src-5378d79012fc21aad9df86c7502f0b8cf4daf8f3.tar.bz2 |
Don't try to switch display mode if there is no external display
Switch to Dual Display in Login screen.
BUG=145844,145158
Review URL: https://chromiumcodereview.appspot.com/10899024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@154499 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | ash/accelerators/accelerator_controller.cc | 15 | ||||
-rw-r--r-- | chrome/browser/chromeos/chrome_browser_main_chromeos.cc | 8 | ||||
-rw-r--r-- | chromeos/display/output_configurator.cc | 17 | ||||
-rw-r--r-- | chromeos/display/output_configurator.h | 5 |
4 files changed, 29 insertions, 16 deletions
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc index 3c3c5c6..0f72f08 100644 --- a/ash/accelerators/accelerator_controller.cc +++ b/ash/accelerators/accelerator_controller.cc @@ -441,12 +441,15 @@ bool AcceleratorController::PerformAction(int action, Shell::GetInstance()->tray_delegate()->ToggleWifi(); return true; case CYCLE_DISPLAY_MODE: { - internal::OutputConfiguratorAnimation* animation = - Shell::GetInstance()->output_configurator_animation(); - animation->StartFadeOutAnimation(base::Bind( - base::IgnoreResult(&chromeos::OutputConfigurator::CycleDisplayMode), - base::Unretained(Shell::GetInstance()->output_configurator()))); - return true; + Shell* shell = Shell::GetInstance(); + if (shell->output_configurator()->connected_output_count() > 1) { + internal::OutputConfiguratorAnimation* animation = + shell->output_configurator_animation(); + animation->StartFadeOutAnimation(base::Bind( + base::IgnoreResult(&chromeos::OutputConfigurator::CycleDisplayMode), + base::Unretained(shell->output_configurator()))); + return true; + } } #endif case OPEN_FEEDBACK_PAGE: diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 0a8a01c..2fa9ca8 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc @@ -7,6 +7,7 @@ #include <string> #include <vector> +#include "ash/shell.h" #include "base/bind.h" #include "base/callback.h" #include "base/chromeos/chromeos_version.h" @@ -77,6 +78,7 @@ #include "chromeos/dbus/power_manager_client.h" #include "chromeos/dbus/session_manager_client.h" #include "chromeos/disks/disk_mount_manager.h" +#include "chromeos/display/output_configurator.h" #include "content/public/browser/notification_service.h" #include "content/public/common/main_function_params.h" #include "grit/platform_locale_settings.h" @@ -159,6 +161,12 @@ class StubLogin : public chromeos::LoginStatusConsumer, void OptionallyRunChromeOSLoginManager(const CommandLine& parsed_command_line, Profile* profile) { + // Login should always use dual display if there is an external display. + chromeos::OutputConfigurator* output_configurator = + ash::Shell::GetInstance()->output_configurator(); + if (output_configurator->connected_output_count() > 1) + output_configurator->SetDisplayMode(chromeos::STATE_DUAL_PRIMARY_ONLY); + if (parsed_command_line.HasSwitch(switches::kLoginManager)) { std::string first_screen = parsed_command_line.GetSwitchValueASCII(switches::kLoginScreen); diff --git a/chromeos/display/output_configurator.cc b/chromeos/display/output_configurator.cc index 38aef89..d94215f 100644 --- a/chromeos/display/output_configurator.cc +++ b/chromeos/display/output_configurator.cc @@ -221,6 +221,7 @@ static float ComputeDeviceScaleFactor(unsigned int width, OutputConfigurator::OutputConfigurator() : is_running_on_chrome_os_(base::chromeos::IsRunningOnChromeOS()), output_count_(0), + connected_output_count_(0), output_cache_(NULL), mirror_supported_(false), primary_output_index_(-1), @@ -359,6 +360,9 @@ bool OutputConfigurator::ScreenPowerSet(bool power_on, bool all_displays) { } bool OutputConfigurator::SetDisplayMode(OutputState new_state) { + if (output_state_ == new_state) + return true; + if (output_state_ == STATE_INVALID || output_state_ == STATE_HEADLESS || output_state_ == STATE_SINGLE) @@ -421,8 +425,6 @@ void OutputConfigurator::RemoveObserver(Observer* observer) { bool OutputConfigurator::TryRecacheOutputs(Display* display, XRRScreenResources* screen) { bool outputs_did_change = false; - int previous_connected_count = 0; - int new_connected_count = 0; if (output_count_ != screen->noutput) { outputs_did_change = true; @@ -435,11 +437,6 @@ bool OutputConfigurator::TryRecacheOutputs(Display* display, bool now_connected = (RR_Connected == output->connection); outputs_did_change = (now_connected != output_cache_[i].is_connected); XRRFreeOutputInfo(output); - - if (output_cache_[i].is_connected) - previous_connected_count += 1; - if (now_connected) - new_connected_count += 1; } } @@ -811,17 +808,17 @@ void OutputConfigurator::CheckIsProjectingAndNotify() { // Determine if there is an "internal" output and how many outputs are // connected. bool has_internal_output = false; - int connected_output_count = 0; + connected_output_count_ = 0; for (int i = 0; i < output_count_; ++i) { if (output_cache_[i].is_connected) { - connected_output_count += 1; + connected_output_count_ += 1; has_internal_output |= output_cache_[i].is_internal; } } // "Projecting" is defined as having more than 1 output connected while at // least one of them is an internal output. - bool is_projecting = has_internal_output && (connected_output_count > 1); + bool is_projecting = has_internal_output && (connected_output_count_ > 1); chromeos::DBusThreadManager::Get()->GetPowerManagerClient() ->SetIsProjecting(is_projecting); } diff --git a/chromeos/display/output_configurator.h b/chromeos/display/output_configurator.h index 6c526c8..32338b1 100644 --- a/chromeos/display/output_configurator.h +++ b/chromeos/display/output_configurator.h @@ -52,6 +52,8 @@ class CHROMEOS_EXPORT OutputConfigurator : public MessageLoop::Dispatcher { OutputConfigurator(); virtual ~OutputConfigurator(); + int connected_output_count() const { return connected_output_count_; } + OutputState output_state() const { return output_state_; } // Called when the user hits ctrl-F4 to request a display mode change. @@ -154,6 +156,9 @@ class CHROMEOS_EXPORT OutputConfigurator : public MessageLoop::Dispatcher { // The number of outputs in the output_cache_ array. int output_count_; + // The number of outputs that are connected. + int connected_output_count_; + // The list of cached output descriptions (|output_count_| elements long). scoped_array<CachedOutputDescription> output_cache_; |