clutter: Add ClutterModifierSet argument to key event constructor

This struct contains the pressed/latched/locked set of modifiers applying
to the event, and may be filled in by backends generating those events.
Other places where we forward modified key events, state may be normally
obtained from the original event.

Since this constructor is used in a variety of places, this commit
updates them all in one go.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3369>
This commit is contained in:
Carlos Garnacho 2023-11-06 11:42:12 +01:00 committed by Marge Bot
parent 2e897fccd5
commit 38228da550
8 changed files with 45 additions and 0 deletions

View File

@ -18,6 +18,7 @@ ClutterEvent * clutter_event_key_new (ClutterEventType type,
ClutterEventFlags flags, ClutterEventFlags flags,
int64_t timestamp_us, int64_t timestamp_us,
ClutterInputDevice *source_device, ClutterInputDevice *source_device,
ClutterModifierSet raw_modifiers,
ClutterModifierType modifiers, ClutterModifierType modifiers,
uint32_t keyval, uint32_t keyval,
uint32_t evcode, uint32_t evcode,

View File

@ -1858,6 +1858,7 @@ clutter_event_key_new (ClutterEventType type,
ClutterEventFlags flags, ClutterEventFlags flags,
int64_t timestamp_us, int64_t timestamp_us,
ClutterInputDevice *source_device, ClutterInputDevice *source_device,
ClutterModifierSet raw_modifiers,
ClutterModifierType modifiers, ClutterModifierType modifiers,
uint32_t keyval, uint32_t keyval,
uint32_t evcode, uint32_t evcode,
@ -1877,6 +1878,7 @@ clutter_event_key_new (ClutterEventType type,
event->key.time_us = timestamp_us; event->key.time_us = timestamp_us;
event->key.flags = flags; event->key.flags = flags;
event->key.raw_modifiers = raw_modifiers;
event->key.modifier_state = modifiers; event->key.modifier_state = modifiers;
event->key.keyval = keyval; event->key.keyval = keyval;
event->key.hardware_keycode = keycode; event->key.hardware_keycode = keycode;

View File

@ -360,8 +360,14 @@ clutter_input_method_notify_key_event (ClutterInputMethod *im,
{ {
if (!filtered) if (!filtered)
{ {
ClutterModifierSet raw_modifiers;
ClutterEvent *copy; ClutterEvent *copy;
clutter_event_get_key_state (event,
&raw_modifiers.pressed,
&raw_modifiers.latched,
&raw_modifiers.locked);
/* XXX: we rely on the IM implementation to notify back of /* XXX: we rely on the IM implementation to notify back of
* key events in the exact same order they were given. * key events in the exact same order they were given.
*/ */
@ -370,6 +376,7 @@ clutter_input_method_notify_key_event (ClutterInputMethod *im,
CLUTTER_EVENT_FLAG_INPUT_METHOD, CLUTTER_EVENT_FLAG_INPUT_METHOD,
clutter_event_get_time_us (event), clutter_event_get_time_us (event),
clutter_event_get_device (event), clutter_event_get_device (event),
raw_modifiers,
clutter_event_get_state (event), clutter_event_get_state (event),
clutter_event_get_key_symbol (event), clutter_event_get_key_symbol (event),
clutter_event_get_event_code (event), clutter_event_get_event_code (event),
@ -490,6 +497,7 @@ clutter_input_method_forward_key (ClutterInputMethod *im,
CLUTTER_EVENT_FLAG_INPUT_METHOD, CLUTTER_EVENT_FLAG_INPUT_METHOD,
time_, time_,
keyboard, keyboard,
(ClutterModifierSet) { 0, },
state, state,
keyval, keyval,
keycode - 8, keycode - 8,

View File

@ -275,14 +275,21 @@ trigger_slow_keys (gpointer data)
{ {
SlowKeysEventPending *slow_keys_event = data; SlowKeysEventPending *slow_keys_event = data;
MetaInputDeviceNative *device = slow_keys_event->device; MetaInputDeviceNative *device = slow_keys_event->device;
ClutterModifierSet raw_modifiers;
ClutterEvent *event = slow_keys_event->event; ClutterEvent *event = slow_keys_event->event;
ClutterEvent *copy; ClutterEvent *copy;
clutter_event_get_key_state (event,
&raw_modifiers.pressed,
&raw_modifiers.latched,
&raw_modifiers.locked);
/* Alter timestamp and emit the event */ /* Alter timestamp and emit the event */
copy = clutter_event_key_new (clutter_event_type (event), copy = clutter_event_key_new (clutter_event_type (event),
clutter_event_get_flags (event), clutter_event_get_flags (event),
g_get_monotonic_time (), g_get_monotonic_time (),
clutter_event_get_source_device (event), clutter_event_get_source_device (event),
raw_modifiers,
clutter_event_get_state (event), clutter_event_get_state (event),
clutter_event_get_key_symbol (event), clutter_event_get_key_symbol (event),
clutter_event_get_event_code (event), clutter_event_get_event_code (event),
@ -524,6 +531,7 @@ rewrite_stickykeys_event (ClutterEvent *event,
{ {
MetaSeatImpl *seat_impl = seat_impl_from_device_native (device); MetaSeatImpl *seat_impl = seat_impl_from_device_native (device);
struct xkb_state *xkb_state; struct xkb_state *xkb_state;
ClutterModifierSet raw_modifiers;
ClutterEvent *rewritten_event; ClutterEvent *rewritten_event;
ClutterModifierType modifiers; ClutterModifierType modifiers;
@ -533,11 +541,18 @@ rewrite_stickykeys_event (ClutterEvent *event,
xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_EFFECTIVE) | xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_EFFECTIVE) |
seat_impl->button_state; seat_impl->button_state;
raw_modifiers = (ClutterModifierSet) {
.pressed = xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_DEPRESSED),
.latched = xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_LATCHED),
.locked = xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_LOCKED),
};
rewritten_event = rewritten_event =
clutter_event_key_new (clutter_event_type (event), clutter_event_key_new (clutter_event_type (event),
clutter_event_get_flags (event), clutter_event_get_flags (event),
clutter_event_get_time_us (event), clutter_event_get_time_us (event),
clutter_event_get_source_device (event), clutter_event_get_source_device (event),
raw_modifiers,
modifiers, modifiers,
clutter_event_get_key_symbol (event), clutter_event_get_key_symbol (event),
clutter_event_get_event_code (event), clutter_event_get_event_code (event),

View File

@ -53,6 +53,7 @@ meta_key_event_new_from_evdev (ClutterInputDevice *device,
char buffer[8]; char buffer[8];
gunichar unicode_value; gunichar unicode_value;
ClutterModifierType modifiers; ClutterModifierType modifiers;
ClutterModifierSet raw_modifiers;
int n; int n;
/* We use a fixed offset of 8 because evdev starts KEY_* numbering from /* We use a fixed offset of 8 because evdev starts KEY_* numbering from
@ -63,6 +64,12 @@ meta_key_event_new_from_evdev (ClutterInputDevice *device,
sym = xkb_state_key_get_one_sym (xkb_state, key); sym = xkb_state_key_get_one_sym (xkb_state, key);
raw_modifiers = (ClutterModifierSet) {
.pressed = xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_DEPRESSED),
.latched = xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_LATCHED),
.locked = xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_LOCKED),
};
modifiers = xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_EFFECTIVE) | modifiers = xkb_state_serialize_mods (xkb_state, XKB_STATE_MODS_EFFECTIVE) |
button_state; button_state;
@ -85,6 +92,7 @@ meta_key_event_new_from_evdev (ClutterInputDevice *device,
flags, flags,
time_us, time_us,
device, device,
raw_modifiers,
modifiers, modifiers,
sym, sym,
key - 8, key - 8,

View File

@ -2111,6 +2111,7 @@ meta_seat_x11_translate_event (MetaSeatX11 *seat,
MetaKeymapX11 *keymap_x11 = seat->keymap; MetaKeymapX11 *keymap_x11 = seat->keymap;
char buffer[7] = { 0, }; char buffer[7] = { 0, };
uint32_t keyval, evcode, keycode; uint32_t keyval, evcode, keycode;
ClutterModifierSet raw_modifiers;
ClutterModifierType state; ClutterModifierType state;
int len; int len;
gunichar unicode_value; gunichar unicode_value;
@ -2119,6 +2120,12 @@ meta_seat_x11_translate_event (MetaSeatX11 *seat,
if (!source_device) if (!source_device)
return NULL; return NULL;
raw_modifiers = (ClutterModifierSet) {
.pressed = xev->mods.base,
.latched = xev->mods.latched,
.locked = xev->mods.locked,
};
state = translate_state (&xev->buttons, &xev->mods, &xev->group); state = translate_state (&xev->buttons, &xev->mods, &xev->group);
keycode = xev->detail; keycode = xev->detail;
@ -2156,6 +2163,7 @@ meta_seat_x11_translate_event (MetaSeatX11 *seat,
CLUTTER_EVENT_NONE, CLUTTER_EVENT_NONE,
ms2us (xev->time), ms2us (xev->time),
source_device, source_device,
raw_modifiers,
state, state,
keyval, keyval,
evcode, evcode,

View File

@ -235,6 +235,7 @@ send_keyval (KeyGroup *group, int keyval)
CLUTTER_EVENT_FLAG_SYNTHETIC, CLUTTER_EVENT_FLAG_SYNTHETIC,
CLUTTER_CURRENT_TIME, CLUTTER_CURRENT_TIME,
clutter_seat_get_keyboard (seat), clutter_seat_get_keyboard (seat),
(ClutterModifierSet) { 0, },
0, 0,
keyval, keyval,
0, 0, 0); 0, 0, 0);

View File

@ -339,6 +339,7 @@ send_keyval (ClutterText *text, int keyval)
CLUTTER_EVENT_FLAG_SYNTHETIC, CLUTTER_EVENT_FLAG_SYNTHETIC,
CLUTTER_CURRENT_TIME, CLUTTER_CURRENT_TIME,
clutter_seat_get_keyboard (seat), clutter_seat_get_keyboard (seat),
(ClutterModifierSet) { 0, },
0, keyval, 0, 0, 0); 0, keyval, 0, 0, 0);
clutter_actor_event (CLUTTER_ACTOR (text), event, FALSE); clutter_actor_event (CLUTTER_ACTOR (text), event, FALSE);
@ -358,6 +359,7 @@ send_unichar (ClutterText *text, gunichar unichar)
CLUTTER_EVENT_FLAG_SYNTHETIC, CLUTTER_EVENT_FLAG_SYNTHETIC,
CLUTTER_CURRENT_TIME, CLUTTER_CURRENT_TIME,
clutter_seat_get_keyboard (seat), clutter_seat_get_keyboard (seat),
(ClutterModifierSet) { 0, },
0, 0, 0, 0, unichar); 0, 0, 0, 0, unichar);
clutter_actor_event (CLUTTER_ACTOR (text), event, FALSE); clutter_actor_event (CLUTTER_ACTOR (text), event, FALSE);