#ifndef UI_EVENTS_OZONE_EVDEV_KEYBOARD_EVDEV_H_
#define UI_EVENTS_OZONE_EVDEV_KEYBOARD_EVDEV_H_
#include <linux/input.h>
#include <bitset>
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "ui/events/ozone/evdev/event_device_util.h"
#include "ui/events/ozone/evdev/event_dispatch_callback.h"
#include "ui/events/ozone/keyboard/event_auto_repeat_handler.h"
#include "ui/events/ozone/layout/keyboard_layout_engine.h"
namespace ui {
class EventModifiers;
enum class DomCode;
class COMPONENT_EXPORT(EVDEV) KeyboardEvdev
: public EventAutoRepeatHandler::Delegate {
public:
KeyboardEvdev(EventModifiers* modifiers,
KeyboardLayoutEngine* keyboard_layout_engine,
const EventDispatchCallback& callback);
KeyboardEvdev(const KeyboardEvdev&) = delete;
KeyboardEvdev& operator=(const KeyboardEvdev&) = delete;
~KeyboardEvdev();
void OnKeyChange(unsigned int code,
unsigned int scan_code,
bool down,
bool suppress_auto_repeat,
base::TimeTicks timestamp,
int device_id,
int flags);
void SetCapsLockEnabled(bool enabled);
bool IsCapsLockEnabled();
bool IsAutoRepeatEnabled();
void SetAutoRepeatEnabled(bool enabled);
void SetAutoRepeatRate(const base::TimeDelta& delay,
const base::TimeDelta& interval);
void GetAutoRepeatRate(base::TimeDelta* delay, base::TimeDelta* interval);
bool SetCurrentLayoutByName(const std::string& layout_name);
private:
void UpdateModifier(int modifier_flag, bool down);
void RefreshModifiers();
void UpdateCapsLockLed();
void FlushInput(base::OnceClosure closure) override;
void DispatchKey(unsigned int key,
unsigned int scan_code,
bool down,
bool repeat,
base::TimeTicks timestamp,
int device_id,
int flags) override;
std::bitset<KEY_CNT> key_state_;
const EventDispatchCallback callback_;
const raw_ptr<EventModifiers> modifiers_;
const raw_ptr<KeyboardLayoutEngine> keyboard_layout_engine_;
EventAutoRepeatHandler auto_repeat_handler_;
base::WeakPtrFactory<KeyboardEvdev> weak_ptr_factory_{this};
};
}
#endif