Index: ash/accelerators/exit_warning_handler.cc |
diff --git a/ash/accelerators/exit_warning_handler.cc b/ash/accelerators/exit_warning_handler.cc |
index a285560ee9cc85dabd2f255cd1ad05ad0d7eee68..aa26683b7fd5096ec150c1cebdf0914fcbf2db2d 100644 |
--- a/ash/accelerators/exit_warning_handler.cc |
+++ b/ash/accelerators/exit_warning_handler.cc |
@@ -4,6 +4,7 @@ |
#include "ash/accelerators/exit_warning_handler.h" |
+#include "ash/accelerators/accelerator_controller.h" |
#include "ash/shell.h" |
#include "ash/shell_delegate.h" |
#include "ash/shell_window_ids.h" |
@@ -26,7 +27,7 @@ namespace ash { |
namespace { |
const int64 kDoublePressTimeOutMilliseconds = 300; |
-const int64 kHoldTimeOutMilliseconds = 1700; |
+const int64 kHoldTimeOutMilliseconds = 1000; |
const SkColor kForegroundColor = 0xFFFFFFFF; |
const SkColor kBackgroundColor = 0xE0808080; |
const int kHorizontalMarginAroundText = 100; |
@@ -73,10 +74,11 @@ class ExitWarningWidgetDelegateView : public views::WidgetDelegateView { |
} // namespace |
-ExitWarningHandler::ExitWarningHandler() |
- : state_(IDLE), |
- widget_(NULL), |
- stub_timers_for_test_(false) { |
+ExitWarningHandler::ExitWarningHandler(AcceleratorControllerContext* context) |
+ : context_(context), |
+ state_(IDLE), |
+ widget_(NULL), |
+ stub_timers_for_test_(false) { |
} |
ExitWarningHandler::~ExitWarningHandler() { |
@@ -84,30 +86,24 @@ ExitWarningHandler::~ExitWarningHandler() { |
Hide(); |
} |
-void ExitWarningHandler::HandleExitKey(bool press) { |
+void ExitWarningHandler::HandleAccelerator() { |
+ if (!context_) |
+ return; |
switch (state_) { |
case IDLE: |
- if (press) { |
- state_ = WAIT_FOR_QUICK_RELEASE; |
- Show(); |
- StartTimers(); |
- } |
- break; |
- case WAIT_FOR_QUICK_RELEASE: |
- if (!press) |
- state_ = WAIT_FOR_DOUBLE_PRESS; |
+ state_ = WAIT_FOR_DOUBLE_PRESS; |
+ accelerator_ = context_->current_accelerator(); |
+ Show(); |
+ StartTimers(); |
break; |
case WAIT_FOR_DOUBLE_PRESS: |
- if (press) { |
- state_ = EXITING; |
- CancelTimers(); |
- Hide(); |
- Shell::GetInstance()->delegate()->Exit(); |
- } |
+ state_ = EXITING; |
+ CancelTimers(); |
+ Hide(); |
+ Shell::GetInstance()->delegate()->Exit(); |
break; |
case WAIT_FOR_LONG_HOLD: |
- if (!press) |
- state_ = CANCELED; |
+ state_ = CANCELED; |
break; |
case CANCELED: |
case EXITING: |
@@ -119,21 +115,25 @@ void ExitWarningHandler::HandleExitKey(bool press) { |
} |
void ExitWarningHandler::Timer1Action() { |
- if (state_ == WAIT_FOR_QUICK_RELEASE) |
+ if (state_ == WAIT_FOR_DOUBLE_PRESS) |
state_ = WAIT_FOR_LONG_HOLD; |
- else if (state_ == WAIT_FOR_DOUBLE_PRESS) |
- state_ = CANCELED; |
} |
void ExitWarningHandler::Timer2Action() { |
+ Hide(); |
if (state_ == CANCELED) { |
state_ = IDLE; |
- Hide(); |
- } |
- else if (state_ == WAIT_FOR_LONG_HOLD) { |
- state_ = EXITING; |
- Hide(); |
- Shell::GetInstance()->delegate()->Exit(); |
+ } else if (state_ == WAIT_FOR_LONG_HOLD) { |
+ if (accelerator_ == context_->current_accelerator()) { |
+ // We detect if the user has released any one of the keys that |
+ // make up the shortcut by comparing "our" accelerator to the one |
+ // from the current context and do not exit in that case. |
+ state_ = EXITING; |
+ Shell::GetInstance()->delegate()->Exit(); |
+ } |
+ else { |
+ state_ = IDLE; |
+ } |
} |
} |