summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-31 20:48:39 +0000
committeroshima@chromium.org <oshima@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-31 20:48:39 +0000
commit5378d79012fc21aad9df86c7502f0b8cf4daf8f3 (patch)
tree8b9eccd48cbebb7411844ca4d35ef8a5a1520165
parent4fc24b6fc8a2f232edd5b05d16d5985e298f5bdc (diff)
downloadchromium_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.cc15
-rw-r--r--chrome/browser/chromeos/chrome_browser_main_chromeos.cc8
-rw-r--r--chromeos/display/output_configurator.cc17
-rw-r--r--chromeos/display/output_configurator.h5
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_;