| Index: ash/magnifier/magnifier_key_scroller.cc
|
| diff --git a/ash/magnifier/magnifier_key_scroller.cc b/ash/magnifier/magnifier_key_scroller.cc
|
| index 745fe8a59c841a367e540a0d914d707d96d31d53..6048fbb2892dca03d097c9738d07d5a6f72cad97 100644
|
| --- a/ash/magnifier/magnifier_key_scroller.cc
|
| +++ b/ash/magnifier/magnifier_key_scroller.cc
|
| @@ -4,25 +4,50 @@
|
|
|
| #include "ash/magnifier/magnifier_key_scroller.h"
|
|
|
| -#include <X11/Xlib.h>
|
| -
|
| -#undef RootWindow
|
| -#undef Status
|
| -
|
| +#include "ash/accelerators/key_hold_detector.h"
|
| #include "ash/ash_switches.h"
|
| #include "ash/magnifier/magnification_controller.h"
|
| #include "ash/shell.h"
|
| #include "base/command_line.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "ui/aura/root_window.h"
|
| -#include "ui/aura/window_tracker.h"
|
|
|
| namespace ash {
|
| namespace {
|
| -
|
| bool magnifier_key_scroller_enabled = false;
|
| +}
|
|
|
| -void ScrollScreen(ui::KeyEvent* event) {
|
| +// static
|
| +bool MagnifierKeyScroller::IsEnabled() {
|
| + return (magnifier_key_scroller_enabled ||
|
| + CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kAshEnableMagnifierKeyScroller)) &&
|
| + ash::Shell::GetInstance()->magnification_controller()->IsEnabled();
|
| +}
|
| +
|
| +// static
|
| +void MagnifierKeyScroller::SetEnabled(bool enabled) {
|
| + magnifier_key_scroller_enabled = enabled;
|
| +}
|
| +
|
| +// static
|
| +ui::EventHandler* MagnifierKeyScroller::CreateHandler() {
|
| + scoped_ptr<KeyHoldDetector::Delegate> delegate(new MagnifierKeyScroller());
|
| + return new KeyHoldDetector(delegate.Pass());
|
| +}
|
| +
|
| +bool MagnifierKeyScroller::ShouldProcessEvent(const ui::KeyEvent* event) const {
|
| + return IsEnabled() &&
|
| + (event->key_code() == ui::VKEY_UP ||
|
| + event->key_code() == ui::VKEY_DOWN ||
|
| + event->key_code() == ui::VKEY_LEFT ||
|
| + event->key_code() == ui::VKEY_RIGHT);
|
| +}
|
| +
|
| +bool MagnifierKeyScroller::IsStartEvent(const ui::KeyEvent* event) const {
|
| + return event->type() == ui::ET_KEY_PRESSED &&
|
| + event->flags() & ui::EF_SHIFT_DOWN;
|
| +}
|
| +
|
| +void MagnifierKeyScroller::OnKeyHold(const ui::KeyEvent* event) {
|
| MagnificationController* controller =
|
| Shell::GetInstance()->magnification_controller();
|
| switch (event->key_code()) {
|
| @@ -43,104 +68,14 @@ void ScrollScreen(ui::KeyEvent* event) {
|
| }
|
| }
|
|
|
| -void DispatchPressedEvent(XEvent native_event,
|
| - scoped_ptr<aura::WindowTracker> tracker) {
|
| - // The target window may be gone.
|
| - if (tracker->windows().empty())
|
| - return;
|
| - aura::Window* target = *(tracker->windows().begin());
|
| - ui::KeyEvent event(&native_event, false);
|
| - event.set_flags(event.flags() | ui::EF_IS_SYNTHESIZED);
|
| - ui::EventDispatchDetails result ALLOW_UNUSED =
|
| - target->GetDispatcher()->OnEventFromSource(&event);
|
| -}
|
| -
|
| -void PostPressedEvent(ui::KeyEvent* event) {
|
| - // Modify RELEASED event to PRESSED event.
|
| - XEvent xkey = *(event->native_event());
|
| - xkey.xkey.type = KeyPress;
|
| - xkey.xkey.state |= ShiftMask;
|
| - scoped_ptr<aura::WindowTracker> tracker(new aura::WindowTracker);
|
| - tracker->Add(static_cast<aura::Window*>(event->target()));
|
| -
|
| - base::MessageLoopForUI::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&DispatchPressedEvent, xkey, base::Passed(&tracker)));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// static
|
| -bool MagnifierKeyScroller::IsEnabled() {
|
| - return (magnifier_key_scroller_enabled ||
|
| - CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kAshEnableMagnifierKeyScroller)) &&
|
| - ash::Shell::GetInstance()->magnification_controller()->IsEnabled();
|
| -}
|
| -
|
| -// static
|
| -void MagnifierKeyScroller::SetEnabled(bool enabled) {
|
| - magnifier_key_scroller_enabled = enabled;
|
| +void MagnifierKeyScroller::OnKeyUnhold(const ui::KeyEvent* event) {
|
| + MagnificationController* controller =
|
| + Shell::GetInstance()->magnification_controller();
|
| + controller->SetScrollDirection(MagnificationController::SCROLL_NONE);
|
| }
|
|
|
| -MagnifierKeyScroller::MagnifierKeyScroller()
|
| - : state_(INITIAL) {}
|
| +MagnifierKeyScroller::MagnifierKeyScroller() {}
|
|
|
| MagnifierKeyScroller::~MagnifierKeyScroller() {}
|
|
|
| -void MagnifierKeyScroller::OnKeyEvent(
|
| - ui::KeyEvent* event) {
|
| - if (!IsEnabled())
|
| - return;
|
| -
|
| - if (event->key_code() != ui::VKEY_UP &&
|
| - event->key_code() != ui::VKEY_DOWN &&
|
| - event->key_code() != ui::VKEY_LEFT &&
|
| - event->key_code() != ui::VKEY_RIGHT) {
|
| - return;
|
| - }
|
| -
|
| - if (event->type() == ui::ET_KEY_PRESSED &&
|
| - event->flags() & ui::EF_SHIFT_DOWN) {
|
| - switch (state_) {
|
| - case INITIAL:
|
| - // Pass through posted event.
|
| - if (event->flags() & ui::EF_IS_SYNTHESIZED) {
|
| - event->set_flags(event->flags() & ~ui::EF_IS_SYNTHESIZED);
|
| - return;
|
| - }
|
| - state_ = PRESSED;
|
| - // Don't process ET_KEY_PRESSED event yet. The ET_KEY_PRESSED
|
| - // event will be generated upon ET_KEY_RELEASEED event below.
|
| - event->StopPropagation();
|
| - break;
|
| - case PRESSED:
|
| - state_ = HOLD;
|
| - // pass through
|
| - case HOLD:
|
| - ScrollScreen(event);
|
| - event->StopPropagation();
|
| - break;
|
| - }
|
| - } else if (event->type() == ui::ET_KEY_RELEASED) {
|
| - switch (state_) {
|
| - case INITIAL:
|
| - break;
|
| - case PRESSED: {
|
| - PostPressedEvent(event);
|
| - event->StopPropagation();
|
| - break;
|
| - }
|
| - case HOLD: {
|
| - MagnificationController* controller =
|
| - Shell::GetInstance()->magnification_controller();
|
| - controller->SetScrollDirection(MagnificationController::SCROLL_NONE);
|
| - event->StopPropagation();
|
| - break;
|
| - }
|
| - }
|
| - state_ = INITIAL;
|
| - }
|
| -}
|
| -
|
| } // namespace ash
|
|
|