Files
qemu/include/ui/input.h
T
Akihiko OdakiandMarc-André Lureau 184c07600d ui/input: Use Linux key codes for internal key events
Linux input key codes are a better internal representation than
QKeyCode:

- With Linux input key codes as the internal representation, keys
  previously lost solely because the middle layer between event sources
  and sinks used QKeyCode will be preserved, since Linux key codes
  cover all keys that those sources and sinks use. For example,
  KEY_KPJPCOMMA cannot be represented with QKeyCode, but it is widely
  supported by event sources and sinks since it is included in linux,
  atset1, atset2, usb, x11, osx, qnum (derived from atset1),
  xorgxquartz, and xorgevdev (derived from linux).

- They make it possible to pass through Linux host key codes to Linux
  guests to preserve all key inputs.

- They simplify consumers by avoiding QKeyCode aliases, namely
  asterisk/kp_multiply and sysrq/print.

This matches the approach used by virtio and Xen.

Signed-off-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-ID: <20260520-input-v3-4-7c9e4c7abe34@rsg.ci.i.u-tokyo.ac.jp>
2026-05-25 01:00:54 +04:00

206 lines
7.7 KiB
C

#ifndef INPUT_H
#define INPUT_H
#include "qapi/qapi-types-ui.h"
#include "qemu/notify.h"
#define INPUT_EVENT_MASK_KEY (1<<INPUT_EVENT_KIND_KEY)
#define INPUT_EVENT_MASK_BTN (1<<INPUT_EVENT_KIND_BTN)
#define INPUT_EVENT_MASK_REL (1<<INPUT_EVENT_KIND_REL)
#define INPUT_EVENT_MASK_ABS (1<<INPUT_EVENT_KIND_ABS)
#define INPUT_EVENT_MASK_MTT (1<<INPUT_EVENT_KIND_MTT)
#define INPUT_EVENT_ABS_MIN 0x0000
#define INPUT_EVENT_ABS_MAX 0x7FFF
#define INPUT_EVENT_SLOTS_MIN 0x0
#define INPUT_EVENT_SLOTS_MAX 0xa
typedef struct QemuInputHandler QemuInputHandler;
typedef struct QemuInputHandlerState QemuInputHandlerState;
typedef struct QemuInputKeyEvent {
unsigned int key;
bool down;
} QemuInputKeyEvent;
typedef struct QemuInputEvent {
InputEventKind type;
union {
QemuInputKeyEvent key;
InputBtnEvent btn;
InputMoveEvent rel;
InputMoveEvent abs;
InputMultiTouchEvent mtt;
};
} QemuInputEvent;
typedef void (*QemuInputHandlerEvent)(DeviceState *dev, QemuConsole *src,
QemuInputEvent *evt);
typedef void (*QemuInputHandlerSync)(DeviceState *dev);
struct QemuInputHandler {
const char *name;
uint32_t mask;
QemuInputHandlerEvent event;
QemuInputHandlerSync sync;
};
QemuInputHandlerState *qemu_input_handler_register(DeviceState *dev,
const QemuInputHandler *handler);
void qemu_input_handler_activate(QemuInputHandlerState *s);
void qemu_input_handler_deactivate(QemuInputHandlerState *s);
void qemu_input_handler_unregister(QemuInputHandlerState *s);
void qemu_input_handler_bind(QemuInputHandlerState *s,
const char *device_id, int head,
Error **errp);
void qemu_input_event_send(QemuConsole *src, QemuInputEvent *evt);
void qemu_input_event_send_impl(QemuConsole *src, QemuInputEvent *evt);
void qemu_input_event_sync(void);
void qemu_input_event_sync_impl(void);
void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down);
void qemu_input_event_send_key_linux(QemuConsole *src, unsigned int lnx,
bool down);
void qemu_input_event_send_key_number(QemuConsole *src, int num, bool down);
void qemu_input_event_send_key_qcode(QemuConsole *src, QKeyCode q, bool down);
void qemu_input_event_send_key_delay(uint32_t delay_ms);
int qemu_input_key_number_to_qcode(unsigned int nr);
unsigned int qemu_input_key_number_to_linux(unsigned int nr);
int qemu_input_key_value_to_number(const KeyValue *value);
int qemu_input_key_value_to_qcode(const KeyValue *value);
unsigned int qemu_input_key_value_to_linux(const KeyValue *value);
int qemu_input_qcode_to_scancode(QKeyCode qcode, bool down, int *codes);
int qemu_input_linux_to_scancode(unsigned int lnx, bool down, int *codes);
int qemu_input_linux_to_qcode(unsigned int lnx);
void qemu_input_queue_btn(QemuConsole *src, InputButton btn, bool down);
void qemu_input_update_buttons(QemuConsole *src, uint32_t *button_map,
uint32_t button_old, uint32_t button_new);
bool qemu_input_is_absolute(QemuConsole *con);
int qemu_input_scale_axis(int value,
int min_in, int max_in,
int min_out, int max_out);
void qemu_input_queue_rel(QemuConsole *src, InputAxis axis, int value);
void qemu_input_queue_abs(QemuConsole *src, InputAxis axis, int value,
int min_in, int max_in);
void qemu_input_queue_mtt(QemuConsole *src, InputMultiTouchType type, int slot,
int tracking_id);
void qemu_input_queue_mtt_abs(QemuConsole *src, InputAxis axis, int value,
int min_in, int max_in,
int slot, int tracking_id);
/* Touch devices */
typedef struct touch_slot {
int x;
int y;
int tracking_id;
} touch_slot;
void qemu_input_touch_event(QemuConsole *con,
struct touch_slot touch_slots[INPUT_EVENT_SLOTS_MAX],
uint64_t num_slot,
int width, int height,
double x, double y,
InputMultiTouchType type,
Error **errp);
void qemu_input_check_mode_change(void);
void qemu_add_mouse_mode_change_notifier(Notifier *notify);
void qemu_remove_mouse_mode_change_notifier(Notifier *notify);
extern const guint qemu_input_map_atset1_to_qcode_len;
extern const guint16 qemu_input_map_atset1_to_qcode[];
extern const guint qemu_input_map_atset1_to_linux_len;
extern const guint16 qemu_input_map_atset1_to_linux[];
extern const guint qemu_input_map_linux_to_qcode_len;
extern const guint16 qemu_input_map_linux_to_qcode[];
extern const guint qemu_input_map_qcode_to_atset1_len;
extern const guint16 qemu_input_map_qcode_to_atset1[];
extern const guint qemu_input_map_linux_to_atset1_len;
extern const guint16 qemu_input_map_linux_to_atset1[];
extern const guint qemu_input_map_qcode_to_atset2_len;
extern const guint16 qemu_input_map_qcode_to_atset2[];
extern const guint qemu_input_map_linux_to_atset2_len;
extern const guint16 qemu_input_map_linux_to_atset2[];
extern const guint qemu_input_map_qcode_to_atset3_len;
extern const guint16 qemu_input_map_qcode_to_atset3[];
extern const guint qemu_input_map_linux_to_atset3_len;
extern const guint16 qemu_input_map_linux_to_atset3[];
extern const guint qemu_input_map_qcode_to_linux_len;
extern const guint16 qemu_input_map_qcode_to_linux[];
extern const guint qemu_input_map_qcode_to_qnum_len;
extern const guint16 qemu_input_map_qcode_to_qnum[];
extern const guint qemu_input_map_linux_to_qnum_len;
extern const guint16 qemu_input_map_linux_to_qnum[];
extern const guint qemu_input_map_qcode_to_sun_len;
extern const guint16 qemu_input_map_qcode_to_sun[];
extern const guint qemu_input_map_linux_to_sun_len;
extern const guint16 qemu_input_map_linux_to_sun[];
extern const guint qemu_input_map_qnum_to_qcode_len;
extern const guint16 qemu_input_map_qnum_to_qcode[];
extern const guint qemu_input_map_qnum_to_linux_len;
extern const guint16 qemu_input_map_qnum_to_linux[];
extern const guint qemu_input_map_usb_to_qcode_len;
extern const guint16 qemu_input_map_usb_to_qcode[];
extern const guint qemu_input_map_usb_to_linux_len;
extern const guint16 qemu_input_map_usb_to_linux[];
extern const guint qemu_input_map_win32_to_qcode_len;
extern const guint16 qemu_input_map_win32_to_qcode[];
extern const guint qemu_input_map_win32_to_linux_len;
extern const guint16 qemu_input_map_win32_to_linux[];
extern const guint qemu_input_map_x11_to_qcode_len;
extern const guint16 qemu_input_map_x11_to_qcode[];
extern const guint qemu_input_map_x11_to_linux_len;
extern const guint16 qemu_input_map_x11_to_linux[];
extern const guint qemu_input_map_xorgevdev_to_qcode_len;
extern const guint16 qemu_input_map_xorgevdev_to_qcode[];
extern const guint qemu_input_map_xorgkbd_to_qcode_len;
extern const guint16 qemu_input_map_xorgkbd_to_qcode[];
extern const guint qemu_input_map_xorgkbd_to_linux_len;
extern const guint16 qemu_input_map_xorgkbd_to_linux[];
extern const guint qemu_input_map_xorgxquartz_to_qcode_len;
extern const guint16 qemu_input_map_xorgxquartz_to_qcode[];
extern const guint qemu_input_map_xorgxquartz_to_linux_len;
extern const guint16 qemu_input_map_xorgxquartz_to_linux[];
extern const guint qemu_input_map_xorgxwin_to_qcode_len;
extern const guint16 qemu_input_map_xorgxwin_to_qcode[];
extern const guint qemu_input_map_xorgxwin_to_linux_len;
extern const guint16 qemu_input_map_xorgxwin_to_linux[];
extern const guint qemu_input_map_osx_to_qcode_len;
extern const guint16 qemu_input_map_osx_to_qcode[];
extern const guint qemu_input_map_osx_to_linux_len;
extern const guint16 qemu_input_map_osx_to_linux[];
#endif /* INPUT_H */