blob: 0d9a7ed58c3b10b9dcbc62f6652399ceba95f1dd [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_EVENTS_SELECT_TO_SPEAK_EVENT_HANDLER_H_
#define ASH_EVENTS_SELECT_TO_SPEAK_EVENT_HANDLER_H_
#include <set>
#include "ash/ash_export.h"
#include "base/memory/raw_ptr.h"
#include "ui/events/event.h"
#include "ui/events/event_handler.h"
#include "ui/events/keycodes/keyboard_codes_posix.h"
namespace ash {
class SelectToSpeakEventHandlerDelegate;
// SelectToSpeakEventHandler sends touch, mouse and key events to
// the Select-to-Speak extension (via the delegate) when it is enabled.
class ASH_EXPORT SelectToSpeakEventHandler : public ui::EventHandler {
public:
explicit SelectToSpeakEventHandler(
SelectToSpeakEventHandlerDelegate* delegate);
SelectToSpeakEventHandler(const SelectToSpeakEventHandler&) = delete;
SelectToSpeakEventHandler& operator=(const SelectToSpeakEventHandler&) =
delete;
~SelectToSpeakEventHandler() override;
// Called when the Select-to-Speak extension changes state. |is_selecting| is
// true if the extension wants to begin capturing mouse or touch events, in
// which case this handler needs to start forwarding those events if it was
// in an inactive state.
void SetSelectToSpeakStateSelecting(bool is_selecting);
private:
// ui::EventHandler:
void OnKeyEvent(ui::KeyEvent* event) override;
void OnMouseEvent(ui::MouseEvent* event) override;
void OnTouchEvent(ui::TouchEvent* event) override;
// Returns true if Select to Speak is enabled.
bool IsSelectToSpeakEnabled();
void CancelEvent(ui::Event* event);
enum State {
// The search key is not down, no selection has been requested.
// No other keys or mouse events are captured.
INACTIVE,
// The Search key is down but the mouse button and 'S' key are not.
SEARCH_DOWN,
// The user held down Search and clicked the mouse button. We're capturing
// all mouse events from now on until either Search or the mouse button is
// released.
CAPTURING_MOUSE,
// The mouse was released, but Search is still held down. If the user
// clicks again, we'll go back to the state CAPTURING. This is different
// than the state SEARCH_DOWN because we know the user clicked at least
// once, so when Search is released we'll handle that event too, so as
// to not trigger opening the Search UI.
MOUSE_RELEASED,
// The Search key was released while the mouse was still down, cancelling
// the Select-to-Speak event. Stay in this mode until the mouse button
// is released, too.
WAIT_FOR_MOUSE_RELEASE,
// The user held down Search and clicked the speak selection key. We're
// waiting for the event where the speak selection key is released or the
// search key is released.
CAPTURING_SPEAK_SELECTION_KEY,
// The user held down Search and clicked and released the speak selection
// key. We will wait for the Search key to be released too. This is
// different than SEARCH_DOWN because we know the user used the speak
// selection key, so when Search is released we will capture that event to
// not trigger opening the Search UI.
SPEAK_SELECTION_KEY_RELEASED,
// The Search key was released while the selection key was still down. Stay
// in this mode until the speak selection key is released too.
WAIT_FOR_SPEAK_SELECTION_KEY_RELEASE,
// The user has clicked a button in the Chrome UI indicating they want to
// start capturing mouse or touch events. The next mouse or touch events
// should be captured.
SELECTION_REQUESTED,
// Mouse events are being captured, but do not need to wait for any key
// events when the mouse is released, unlike WAIT_FOR_MOUSE_RELEASE.
// Only mouse events will be captured until the mouse released event is
// received.
CAPTURING_MOUSE_ONLY,
// Touch events are being captured, similar to CAPTURING_MOUSE_ONLY.
CAPTURING_TOUCH_ONLY
};
State state_ = INACTIVE;
ui::PointerId touch_id_ = ui::kPointerIdUnknown;
ui::EventPointerType touch_type_ = ui::EventPointerType::kUnknown;
std::set<ui::KeyboardCode> keys_currently_down_;
// The delegate used to send key events to the Select-to-Speak extension.
raw_ptr<SelectToSpeakEventHandlerDelegate> delegate_;
};
} // namespace ash
#endif // ASH_EVENTS_SELECT_TO_SPEAK_EVENT_HANDLER_H_