// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef ASH_ACCELERATOR_KEY_HOLD_DETECTOR_H_ #define ASH_ACCELERATOR_KEY_HOLD_DETECTOR_H_ #include "ash/ash_export.h" #include "base/memory/scoped_ptr.h" #include "ui/events/event_handler.h" namespace ui { class KeyEvent; } namespace ash { // This class is used to implement action when a user press and hold the key. // When a user just pressed and released a key, normal pressed event gets // generated upon release. class ASH_EXPORT KeyHoldDetector : public ui::EventHandler { public: class Delegate { public: virtual ~Delegate() {} // If this return false, the event handler does not process // the event at all. virtual bool ShouldProcessEvent(const ui::KeyEvent* event) const = 0; // This should return true if the event should start the state transition. virtual bool IsStartEvent(const ui::KeyEvent* event) const = 0; // Called when the key is held. virtual void OnKeyHold(const ui::KeyEvent* event) = 0; // Called when the key is release after hold. virtual void OnKeyUnhold(const ui::KeyEvent* event) = 0; }; explicit KeyHoldDetector(scoped_ptr<Delegate> delegate); virtual ~KeyHoldDetector(); // ui::EventHandler overrides: virtual void OnKeyEvent(ui::KeyEvent* key_event) OVERRIDE; private: // A state to keep track of one click and click and hold operation. // // One click: // INITIAL --(first press)--> PRESSED --(release)--> INITIAL[SEND PRESS] // // Click and hold: // INITIAL --(first press)--> PRESSED --(press)--> // HOLD[OnKeyHold] --(press)--> HOLD[OnKeyHold] --(release)--> // INITIAL[OnKeyUnhold] enum State { INITIAL, PRESSED, HOLD }; State state_; scoped_ptr<Delegate> delegate_; DISALLOW_COPY_AND_ASSIGN(KeyHoldDetector); }; } // namespace ash #endif // ASH_ACCELERATOR_KEY_HOLD_DETECTOR_H_