#ifndef ASH_EVENTS_PERIPHERAL_CUSTOMIZATION_EVENT_REWRITER_H_
#define ASH_EVENTS_PERIPHERAL_CUSTOMIZATION_EVENT_REWRITER_H_
#include "ash/ash_export.h"
#include "ash/public/mojom/input_device_settings.mojom.h"
#include "ash/system/input_device_settings/input_device_settings_metrics_manager.h"
#include "base/containers/flat_map.h"
#include "base/containers/flat_set.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"
#include "ui/events/event.h"
#include "ui/events/event_dispatcher.h"
#include "ui/events/event_rewriter.h"
namespace ash {
class InputDeviceSettingsController;
class ASH_EXPORT PeripheralCustomizationEventRewriter
: public ui::EventRewriter {
public:
using ButtonRemappingList =
std::vector<std::pair<mojom::ButtonPtr, mojom::RemappingActionPtr>>;
enum class DeviceType { kMouse, kGraphicsTablet };
struct DeviceIdButton {
int device_id;
mojom::ButtonPtr button;
DeviceIdButton(int device_id, mojom::ButtonPtr button);
DeviceIdButton(DeviceIdButton&& device_id_button);
~DeviceIdButton();
DeviceIdButton& operator=(DeviceIdButton&& device_id_button);
friend bool operator<(const DeviceIdButton& left,
const DeviceIdButton& right);
};
struct RemappingActionResult {
raw_ref<mojom::RemappingAction> remapping_action;
InputDeviceSettingsMetricsManager::PeripheralCustomizationMetricsType
peripheral_kind;
RemappingActionResult(
mojom::RemappingAction& remapping_action,
InputDeviceSettingsMetricsManager::PeripheralCustomizationMetricsType
peripheral_kind);
RemappingActionResult(RemappingActionResult&& result);
~RemappingActionResult();
};
explicit PeripheralCustomizationEventRewriter(
InputDeviceSettingsController* input_device_settings_controller);
PeripheralCustomizationEventRewriter(
const PeripheralCustomizationEventRewriter&) = delete;
PeripheralCustomizationEventRewriter& operator=(
const PeripheralCustomizationEventRewriter&) = delete;
~PeripheralCustomizationEventRewriter() override;
void StartObservingMouse(
int device_id,
mojom::CustomizationRestriction customization_restriction);
void StartObservingGraphicsTablet(
int device_id,
mojom::CustomizationRestriction customization_restriction);
void StopObserving();
ui::EventDispatchDetails RewriteEvent(
const ui::Event& event,
const Continuation continuation) override;
const base::flat_map<int, mojom::CustomizationRestriction>&
mice_to_observe() {
return mice_to_observe_;
}
const base::flat_map<int, mojom::CustomizationRestriction>&
graphics_tablets_to_observe() {
return graphics_tablets_to_observe_;
}
private:
bool NotifyMouseEventObserving(const ui::MouseEvent& mouse_event,
DeviceType device_type);
bool NotifyMouseWheelEventObserving(
const ui::MouseWheelEvent& mouse_wheel_event,
DeviceType device_type);
bool NotifyKeyEventObserving(const ui::KeyEvent& key_event,
DeviceType device_type);
bool IsButtonCustomizable(const ui::KeyEvent& key_event);
bool RewriteEventFromButton(
const ui::Event& event,
const mojom::Button& button,
std::vector<std::unique_ptr<ui::Event>>& rewritten_event);
ui::EventDispatchDetails RewriteMouseEvent(const ui::MouseEvent& mouse_event,
const Continuation continuation);
ui::EventDispatchDetails RewriteMouseWheelEvent(
const ui::MouseWheelEvent& mouse_event,
const Continuation continuation);
ui::EventDispatchDetails RewriteKeyEvent(const ui::KeyEvent& key_event,
const Continuation continuation);
std::optional<DeviceType> GetDeviceTypeToObserve(int device_id);
std::optional<RemappingActionResult> GetRemappingAction(
int device_id,
const mojom::Button& button);
void UpdatePressedButtonMap(
mojom::ButtonPtr button,
const ui::Event& original_event,
const std::vector<std::unique_ptr<ui::Event>>& rewritten_event);
void UpdatePressedButtonMapFlags(const ui::KeyEvent& key_event);
void RemoveRemappedModifiers(ui::Event& event);
void ApplyRemappedModifiers(ui::Event& event);
std::unique_ptr<ui::Event> CloneEvent(const ui::Event& event);
base::flat_map<int, mojom::CustomizationRestriction> mice_to_observe_;
base::flat_map<int, mojom::CustomizationRestriction>
graphics_tablets_to_observe_;
base::flat_map<DeviceIdButton, int> device_button_to_flags_;
raw_ptr<InputDeviceSettingsController> input_device_settings_controller_;
std::unique_ptr<InputDeviceSettingsMetricsManager> metrics_manager_;
};
}
#endif