1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef ASH_ACCELERATOR_KEY_HOLD_DETECTOR_H_ 6#define ASH_ACCELERATOR_KEY_HOLD_DETECTOR_H_ 7 8#include "ash/ash_export.h" 9#include "base/memory/scoped_ptr.h" 10#include "ui/events/event_handler.h" 11 12namespace ui { 13class KeyEvent; 14} 15 16namespace ash { 17 18// This class is used to implement action when a user press and hold the key. 19// When a user just pressed and released a key, normal pressed event gets 20// generated upon release. 21class ASH_EXPORT KeyHoldDetector : public ui::EventHandler { 22 public: 23 class Delegate { 24 public: 25 virtual ~Delegate() {} 26 27 // If this return false, the event handler does not process 28 // the event at all. 29 virtual bool ShouldProcessEvent(const ui::KeyEvent* event) const = 0; 30 31 // This should return true if the event should start the state transition. 32 virtual bool IsStartEvent(const ui::KeyEvent* event) const = 0; 33 34 // Called when the key is held. 35 virtual void OnKeyHold(const ui::KeyEvent* event) = 0; 36 37 // Called when the key is release after hold. 38 virtual void OnKeyUnhold(const ui::KeyEvent* event) = 0; 39 }; 40 41 explicit KeyHoldDetector(scoped_ptr<Delegate> delegate); 42 virtual ~KeyHoldDetector(); 43 44 // ui::EventHandler overrides: 45 virtual void OnKeyEvent(ui::KeyEvent* key_event) OVERRIDE; 46 47 private: 48 // A state to keep track of one click and click and hold operation. 49 // 50 // One click: 51 // INITIAL --(first press)--> PRESSED --(release)--> INITIAL[SEND PRESS] 52 // 53 // Click and hold: 54 // INITIAL --(first press)--> PRESSED --(press)--> 55 // HOLD[OnKeyHold] --(press)--> HOLD[OnKeyHold] --(release)--> 56 // INITIAL[OnKeyUnhold] 57 enum State { 58 INITIAL, 59 PRESSED, 60 HOLD 61 }; 62 63 State state_; 64 scoped_ptr<Delegate> delegate_; 65 66 DISALLOW_COPY_AND_ASSIGN(KeyHoldDetector); 67}; 68 69} // namespace ash 70 71#endif // ASH_ACCELERATOR_KEY_HOLD_DETECTOR_H_ 72