struct libinput_event base;
uint32_t time;
uint32_t key;
+ uint32_t seat_key_count;
enum libinput_keyboard_key_state state;
};
li_fixed_t x;
li_fixed_t y;
uint32_t button;
+ uint32_t seat_button_count;
enum libinput_pointer_button_state state;
enum libinput_pointer_axis axis;
li_fixed_t value;
return event->state;
}
+LIBINPUT_EXPORT uint32_t
+libinput_event_keyboard_get_seat_key_count(
+ struct libinput_event_keyboard *event)
+{
+ return event->seat_key_count;
+}
+
LIBINPUT_EXPORT uint32_t
libinput_event_pointer_get_time(struct libinput_event_pointer *event)
{
return event->state;
}
+LIBINPUT_EXPORT uint32_t
+libinput_event_pointer_get_seat_button_count(
+ struct libinput_event_pointer *event)
+{
+ return event->seat_button_count;
+}
+
LIBINPUT_EXPORT enum libinput_pointer_axis
libinput_event_pointer_get_axis(struct libinput_event_pointer *event)
{
return 0;
}
+static uint32_t
+update_seat_key_count(struct libinput_seat *seat,
+ int32_t key,
+ enum libinput_keyboard_key_state state)
+{
+ assert(key >= 0 && key <= KEY_MAX);
+
+ switch (state) {
+ case LIBINPUT_KEYBOARD_KEY_STATE_PRESSED:
+ return ++seat->button_count[key];
+ case LIBINPUT_KEYBOARD_KEY_STATE_RELEASED:
+ /* We might not have received the first PRESSED event. */
+ if (seat->button_count[key] == 0)
+ return 0;
+
+ return --seat->button_count[key];
+ }
+
+ return 0;
+}
+
+static uint32_t
+update_seat_button_count(struct libinput_seat *seat,
+ int32_t button,
+ enum libinput_pointer_button_state state)
+{
+ assert(button >= 0 && button <= KEY_MAX);
+
+ switch (state) {
+ case LIBINPUT_POINTER_BUTTON_STATE_PRESSED:
+ return ++seat->button_count[button];
+ case LIBINPUT_POINTER_BUTTON_STATE_RELEASED:
+ /* We might not have received the first PRESSED event. */
+ if (seat->button_count[button] == 0)
+ return 0;
+
+ return --seat->button_count[button];
+ }
+
+ return 0;
+}
+
static void
init_event_base(struct libinput_event *event,
struct libinput_device *device,
enum libinput_keyboard_key_state state)
{
struct libinput_event_keyboard *key_event;
+ uint32_t seat_key_count;
key_event = zalloc(sizeof *key_event);
if (!key_event)
return;
+ seat_key_count = update_seat_key_count(device->seat, key, state);
+
*key_event = (struct libinput_event_keyboard) {
.time = time,
.key = key,
.state = state,
+ .seat_key_count = seat_key_count,
};
post_device_event(device,
enum libinput_pointer_button_state state)
{
struct libinput_event_pointer *button_event;
+ int32_t seat_button_count;
button_event = zalloc(sizeof *button_event);
if (!button_event)
return;
+ seat_button_count = update_seat_button_count(device->seat,
+ button,
+ state);
+
*button_event = (struct libinput_event_pointer) {
.time = time,
.button = button,
.state = state,
+ .seat_button_count = seat_button_count,
};
post_device_event(device,
struct libinput_event *
libinput_event_keyboard_get_base_event(struct libinput_event_keyboard *event);
+/**
+ * @ingroup event_keyboard
+ *
+ * For the key of a LIBINPUT_EVENT_KEYBOARD_KEY event, return the total number
+ * of keys pressed on all devices on the associated seat after the event was
+ * triggered.
+ *
+ " @note It is an application bug to call this function for events other than
+ * LIBINPUT_EVENT_KEYBOARD_KEY. For other events, this function returns 0.
+ *
+ * @return the seat wide pressed key count for the key of this event
+ */
+uint32_t
+libinput_event_keyboard_get_seat_key_count(
+ struct libinput_event_keyboard *event);
+
/**
* @defgroup event_pointer Pointer events
*
enum libinput_pointer_button_state
libinput_event_pointer_get_button_state(struct libinput_event_pointer *event);
+/**
+ * @ingroup event_pointer
+ *
+ * For the button of a LIBINPUT_EVENT_POINTER_BUTTON event, return the total
+ * number of buttons pressed on all devices on the associated seat after the
+ * the event was triggered.
+ *
+ " @note It is an application bug to call this function for events other than
+ * LIBINPUT_EVENT_POINTER_BUTTON. For other events, this function returns 0.
+ *
+ * @return the seat wide pressed button count for the key of this event
+ */
+uint32_t
+libinput_event_pointer_get_seat_button_count(
+ struct libinput_event_pointer *event);
+
/**
* @ingroup event_pointer
*