value);
}
-static int
-modifier_state_changed(struct weston_seat *seat)
+WL_EXPORT void
+notify_modifiers(struct wl_seat *wl_seat, uint32_t serial)
{
+ struct weston_seat *seat = (struct weston_seat *) wl_seat;
+ struct wl_keyboard *keyboard = &seat->keyboard;
+ struct wl_keyboard_grab *grab = keyboard->grab;
uint32_t mods_depressed, mods_latched, mods_locked, group;
uint32_t mods_lookup;
enum weston_led leds = 0;
- int ret = 0;
+ int changed = 0;
/* Serialize and update our internal state, checking to see if it's
* different to the previous state. */
mods_latched != seat->seat.keyboard->modifiers.mods_latched ||
mods_locked != seat->seat.keyboard->modifiers.mods_locked ||
group != seat->seat.keyboard->modifiers.group)
- ret = 1;
+ changed = 1;
seat->seat.keyboard->modifiers.mods_depressed = mods_depressed;
seat->seat.keyboard->modifiers.mods_latched = mods_latched;
seat->led_update(seat, leds);
seat->xkb_state.leds = leds;
- return ret;
+ if (changed) {
+ grab->interface->modifiers(grab,
+ serial,
+ keyboard->modifiers.mods_depressed,
+ keyboard->modifiers.mods_latched,
+ keyboard->modifiers.mods_locked,
+ keyboard->modifiers.group);
+ }
}
-static int
-update_modifier_state(struct weston_seat *seat, uint32_t key,
+static void
+update_modifier_state(struct weston_seat *seat, uint32_t serial, uint32_t key,
enum wl_keyboard_key_state state)
{
enum xkb_key_direction direction;
* broken keycode system, which starts at 8. */
xkb_state_update_key(seat->xkb_state.state, key + 8, direction);
- return modifier_state_changed(seat);
+ notify_modifiers(&seat->seat, serial);
}
WL_EXPORT void
struct wl_keyboard_grab *grab = seat->keyboard->grab;
uint32_t serial = wl_display_next_serial(compositor->wl_display);
uint32_t *k, *end;
- int mods = 0;
if (state == WL_KEYBOARD_KEY_STATE_PRESSED) {
if (compositor->ping_handler && focus)
weston_compositor_idle_release(compositor);
}
- if (update_state == STATE_UPDATE_AUTOMATIC)
- mods = update_modifier_state(ws, key, state);
end = seat->keyboard->keys.data + seat->keyboard->keys.size;
for (k = seat->keyboard->keys.data; k < end; k++) {
if (*k == key) {
}
grab->interface->key(grab, time, key, state);
- if (mods)
- grab->interface->modifiers(grab,
- wl_display_get_serial(compositor->wl_display),
- seat->keyboard->modifiers.mods_depressed,
- seat->keyboard->modifiers.mods_latched,
- seat->keyboard->modifiers.mods_locked,
- seat->keyboard->modifiers.group);
+
+ if (update_state == STATE_UPDATE_AUTOMATIC) {
+ update_modifier_state(ws,
+ wl_display_get_serial(compositor->wl_display),
+ key,
+ state);
+ }
}
WL_EXPORT void
wl_array_for_each(k, &seat->keyboard->keys) {
weston_compositor_idle_inhibit(compositor);
if (update_state == STATE_UPDATE_AUTOMATIC)
- update_modifier_state(ws, *k,
+ update_modifier_state(ws,
+ wl_display_next_serial(compositor->wl_display),
+ *k,
WL_KEYBOARD_KEY_STATE_PRESSED);
}