mirror of
https://github.com/lvgl/lvgl.git
synced 2026-05-27 03:25:28 +08:00
feat(wayland): improve pointer and touch responsiveness (#10017)
This commit is contained in:
@@ -43,6 +43,10 @@ static void keyboard_handle_modifiers(void * data, struct wl_keyboard * keyboard
|
|||||||
static void keyboard_handle_key(void * data, struct wl_keyboard * keyboard, uint32_t serial, uint32_t time,
|
static void keyboard_handle_key(void * data, struct wl_keyboard * keyboard, uint32_t serial, uint32_t time,
|
||||||
uint32_t key, uint32_t state);
|
uint32_t key, uint32_t state);
|
||||||
|
|
||||||
|
#ifdef WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION
|
||||||
|
static void keyboard_handle_repeat_info(void * data, struct wl_keyboard * wl_keyboard, int32_t rate, int32_t delay);
|
||||||
|
#endif
|
||||||
|
|
||||||
static lv_key_t keycode_xkb_to_lv(xkb_keysym_t xkb_key);
|
static lv_key_t keycode_xkb_to_lv(xkb_keysym_t xkb_key);
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
@@ -52,11 +56,14 @@ static lv_key_t keycode_xkb_to_lv(xkb_keysym_t xkb_key);
|
|||||||
static struct xkb_context * xkb_context;
|
static struct xkb_context * xkb_context;
|
||||||
|
|
||||||
static const struct wl_keyboard_listener keyboard_listener = {
|
static const struct wl_keyboard_listener keyboard_listener = {
|
||||||
.keymap = keyboard_handle_keymap,
|
.keymap = keyboard_handle_keymap,
|
||||||
.enter = keyboard_handle_enter,
|
.enter = keyboard_handle_enter,
|
||||||
.leave = keyboard_handle_leave,
|
.leave = keyboard_handle_leave,
|
||||||
.key = keyboard_handle_key,
|
.key = keyboard_handle_key,
|
||||||
.modifiers = keyboard_handle_modifiers,
|
.modifiers = keyboard_handle_modifiers,
|
||||||
|
#ifdef WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION
|
||||||
|
.repeat_info = keyboard_handle_repeat_info,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
@@ -248,6 +255,17 @@ static void keyboard_handle_modifiers(void * data, struct wl_keyboard * keyboard
|
|||||||
|
|
||||||
xkb_state_update_mask(kbdata->xkb_state, mods_depressed, mods_latched, mods_locked, 0, 0, group);
|
xkb_state_update_mask(kbdata->xkb_state, mods_depressed, mods_latched, mods_locked, 0, 0, group);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WL_KEYBOARD_REPEAT_INFO_SINCE_VERSION
|
||||||
|
static void keyboard_handle_repeat_info(void * data, struct wl_keyboard * wl_keyboard, int32_t rate, int32_t delay)
|
||||||
|
{
|
||||||
|
LV_UNUSED(data);
|
||||||
|
LV_UNUSED(wl_keyboard);
|
||||||
|
LV_UNUSED(rate);
|
||||||
|
LV_UNUSED(delay);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static lv_key_t keycode_xkb_to_lv(xkb_keysym_t xkb_key)
|
static lv_key_t keycode_xkb_to_lv(xkb_keysym_t xkb_key)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,10 @@ static void pointer_handle_button(void * data, struct wl_pointer * wl_pointer, u
|
|||||||
static void pointer_handle_axis(void * data, struct wl_pointer * wl_pointer, uint32_t time, uint32_t axis,
|
static void pointer_handle_axis(void * data, struct wl_pointer * wl_pointer, uint32_t time, uint32_t axis,
|
||||||
wl_fixed_t value);
|
wl_fixed_t value);
|
||||||
|
|
||||||
|
#ifdef WL_POINTER_FRAME_SINCE_VERSION
|
||||||
|
static void pointer_handle_frame(void * data, struct wl_pointer * pointer);
|
||||||
|
#endif
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* STATIC VARIABLES
|
* STATIC VARIABLES
|
||||||
**********************/
|
**********************/
|
||||||
@@ -61,6 +65,9 @@ static const struct wl_pointer_listener pointer_listener = {
|
|||||||
.motion = pointer_handle_motion,
|
.motion = pointer_handle_motion,
|
||||||
.button = pointer_handle_button,
|
.button = pointer_handle_button,
|
||||||
.axis = pointer_handle_axis,
|
.axis = pointer_handle_axis,
|
||||||
|
#ifdef WL_POINTER_FRAME_SINCE_VERSION
|
||||||
|
.frame = pointer_handle_frame,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
@@ -258,4 +265,14 @@ static void pointer_handle_axis(void * data, struct wl_pointer * pointer, uint32
|
|||||||
seat_pointer->wheel_diff += diff;
|
seat_pointer->wheel_diff += diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WL_POINTER_FRAME_SINCE_VERSION
|
||||||
|
static void pointer_handle_frame(void * data, struct wl_pointer * pointer)
|
||||||
|
{
|
||||||
|
LV_UNUSED(data);
|
||||||
|
LV_UNUSED(pointer);
|
||||||
|
lv_wayland_indevs_ready(pointer_read);
|
||||||
|
lv_wayland_indevs_ready(pointeraxis_read);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* LV_USE_WAYLAND */
|
#endif /* LV_USE_WAYLAND */
|
||||||
|
|||||||
@@ -209,6 +209,8 @@ void lv_wayland_seat_keyboard_delete(lv_wl_seat_keyboard_t * seat_keyboard);
|
|||||||
/* Updates indev's driver data with the given 'read_cb' to 'new_driver_data' */
|
/* Updates indev's driver data with the given 'read_cb' to 'new_driver_data' */
|
||||||
void lv_wayland_update_indevs(lv_indev_read_cb_t read_cb, void * new_driver_data);
|
void lv_wayland_update_indevs(lv_indev_read_cb_t read_cb, void * new_driver_data);
|
||||||
|
|
||||||
|
void lv_wayland_indevs_ready(lv_indev_read_cb_t read_cb);
|
||||||
|
|
||||||
#endif /* LV_USE_WAYLAND */
|
#endif /* LV_USE_WAYLAND */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
* DEFINES
|
* DEFINES
|
||||||
*********************/
|
*********************/
|
||||||
|
|
||||||
|
#define SEAT_VERSION (5)
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* TYPEDEFS
|
* TYPEDEFS
|
||||||
**********************/
|
**********************/
|
||||||
@@ -27,6 +29,10 @@
|
|||||||
|
|
||||||
static void seat_handle_capabilities(void * data, struct wl_seat * wl_seat, enum wl_seat_capability caps);
|
static void seat_handle_capabilities(void * data, struct wl_seat * wl_seat, enum wl_seat_capability caps);
|
||||||
|
|
||||||
|
#ifdef WL_SEAT_NAME_SINCE_VERSION
|
||||||
|
static void seat_handle_name(void * data, struct wl_seat * wl_seat, char const * name);
|
||||||
|
#endif
|
||||||
|
|
||||||
static lv_wl_seat_pointer_t * create_pointer(struct wl_seat * wl_seat);
|
static lv_wl_seat_pointer_t * create_pointer(struct wl_seat * wl_seat);
|
||||||
static void delete_pointer(lv_wl_seat_pointer_t * seat_pointer);
|
static void delete_pointer(lv_wl_seat_pointer_t * seat_pointer);
|
||||||
|
|
||||||
@@ -36,6 +42,9 @@ static void delete_pointer(lv_wl_seat_pointer_t * seat_pointer);
|
|||||||
|
|
||||||
static const struct wl_seat_listener seat_listener = {
|
static const struct wl_seat_listener seat_listener = {
|
||||||
.capabilities = seat_handle_capabilities,
|
.capabilities = seat_handle_capabilities,
|
||||||
|
#ifdef WL_SEAT_NAME_SINCE_VERSION
|
||||||
|
.name = seat_handle_name,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
@@ -54,7 +63,7 @@ void lv_wayland_seat_init(lv_wl_seat_t * seat, struct wl_registry * registry, ui
|
|||||||
{
|
{
|
||||||
LV_ASSERT_NULL(seat);
|
LV_ASSERT_NULL(seat);
|
||||||
LV_UNUSED(version);
|
LV_UNUSED(version);
|
||||||
seat->wl_seat = wl_registry_bind(registry, name, &wl_seat_interface, 1);
|
seat->wl_seat = wl_registry_bind(registry, name, &wl_seat_interface, (version < SEAT_VERSION) ? version : SEAT_VERSION);
|
||||||
wl_seat_add_listener(seat->wl_seat, &seat_listener, seat);
|
wl_seat_add_listener(seat->wl_seat, &seat_listener, seat);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +95,17 @@ void lv_wayland_update_indevs(lv_indev_read_cb_t read_cb, void * new_driver_data
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lv_wayland_indevs_ready(lv_indev_read_cb_t read_cb)
|
||||||
|
{
|
||||||
|
lv_indev_t * indev = NULL;
|
||||||
|
while((indev = lv_indev_get_next(indev))) {
|
||||||
|
if(lv_indev_get_read_cb(indev) != read_cb) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lv_timer_t * timer = lv_indev_get_read_timer(indev);
|
||||||
|
lv_timer_ready(timer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* STATIC FUNCTIONS
|
* STATIC FUNCTIONS
|
||||||
@@ -142,4 +162,13 @@ static void seat_handle_capabilities(void * data, struct wl_seat * wl_seat, enum
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WL_SEAT_NAME_SINCE_VERSION
|
||||||
|
static void seat_handle_name(void * data, struct wl_seat * wl_seat, char const * name)
|
||||||
|
{
|
||||||
|
LV_UNUSED(data);
|
||||||
|
LV_UNUSED(wl_seat);
|
||||||
|
LV_UNUSED(name);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* LV_USE_WAYLAND */
|
#endif /* LV_USE_WAYLAND */
|
||||||
|
|||||||
@@ -250,6 +250,7 @@ static void touch_handle_frame(void * data, struct wl_touch * wl_touch)
|
|||||||
{
|
{
|
||||||
LV_UNUSED(wl_touch);
|
LV_UNUSED(wl_touch);
|
||||||
LV_UNUSED(data);
|
LV_UNUSED(data);
|
||||||
|
lv_wayland_indevs_ready(touch_read);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void touch_handle_cancel(void * data, struct wl_touch * wl_touch)
|
static void touch_handle_cancel(void * data, struct wl_touch * wl_touch)
|
||||||
|
|||||||
Reference in New Issue
Block a user