15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef ASH_ACCELERATOR_KEY_HOLD_DETECTOR_H_ 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define ASH_ACCELERATOR_KEY_HOLD_DETECTOR_H_ 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/ash_export.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/events/event_handler.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ui { 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class KeyEvent; 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ash { 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This class is used to implement action when a user press and hold the key. 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// When a user just pressed and released a key, normal pressed event gets 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// generated upon release. 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ASH_EXPORT KeyHoldDetector : public ui::EventHandler { 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) class Delegate { 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~Delegate() {} 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If this return false, the event handler does not process 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the event at all. 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool ShouldProcessEvent(const ui::KeyEvent* event) const = 0; 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This should return true if the event should start the state transition. 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool IsStartEvent(const ui::KeyEvent* event) const = 0; 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Called when the key is held. 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnKeyHold(const ui::KeyEvent* event) = 0; 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Called when the key is release after hold. 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnKeyUnhold(const ui::KeyEvent* event) = 0; 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit KeyHoldDetector(scoped_ptr<Delegate> delegate); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~KeyHoldDetector(); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // ui::EventHandler overrides: 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnKeyEvent(ui::KeyEvent* key_event) OVERRIDE; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private: 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A state to keep track of one click and click and hold operation. 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // One click: 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // INITIAL --(first press)--> PRESSED --(release)--> INITIAL[SEND PRESS] 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Click and hold: 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // INITIAL --(first press)--> PRESSED --(press)--> 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // HOLD[OnKeyHold] --(press)--> HOLD[OnKeyHold] --(release)--> 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // INITIAL[OnKeyUnhold] 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) enum State { 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) INITIAL, 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PRESSED, 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HOLD 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) State state_; 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<Delegate> delegate_; 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(KeyHoldDetector); 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace ash 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // ASH_ACCELERATOR_KEY_HOLD_DETECTOR_H_ 72