window: Add key-repeat to toy toolkit

This commit is contained in:
Kristian Høgsberg 2012-06-20 14:52:12 -04:00
parent 3033425a49
commit cf4d244082

View file

@ -212,6 +212,12 @@ struct input {
xkb_mod_mask_t alt_mask;
xkb_mod_mask_t shift_mask;
} xkb;
struct task repeat_task;
int repeat_timer_fd;
uint32_t repeat_sym;
uint32_t repeat_key;
uint32_t repeat_time;
};
struct output {
@ -1826,6 +1832,7 @@ keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
const xkb_keysym_t *syms;
xkb_keysym_t sym;
xkb_mod_mask_t mask;
struct itimerspec its;
input->display->serial = serial;
code = key + 8;
@ -1845,20 +1852,54 @@ keyboard_handle_key(void *data, struct wl_keyboard *keyboard,
if (mask & input->xkb.shift_mask)
input->modifiers |= MOD_SHIFT_MASK;
if (num_syms == 1 && syms[0] == XKB_KEY_F5 &&
input->modifiers == MOD_ALT_MASK) {
sym = XKB_KEY_NoSymbol;
if (num_syms == 1)
sym = syms[0];
if (sym == XKB_KEY_F5 && input->modifiers == MOD_ALT_MASK) {
if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
window_set_maximized(window,
window->type != TYPE_MAXIMIZED);
} else if (window->key_handler) {
if (num_syms == 1)
sym = syms[0];
else
sym = XKB_KEY_NoSymbol;
(*window->key_handler)(window, input, time, key,
sym, state, window->user_data);
}
if (state == WL_KEYBOARD_KEY_STATE_RELEASED &&
key == input->repeat_key) {
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 0;
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 0;
timerfd_settime(input->repeat_timer_fd, 0, &its, NULL);
} else if (state == WL_KEYBOARD_KEY_STATE_PRESSED) {
input->repeat_sym = sym;
input->repeat_key = key;
input->repeat_time = time;
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 25 * 1000 * 1000;
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 400 * 1000 * 1000;
timerfd_settime(input->repeat_timer_fd, 0, &its, NULL);
}
}
static void
keyboard_repeat_func(struct task *task, uint32_t events)
{
struct input *input =
container_of(task, struct input, repeat_task);
struct window *window = input->keyboard_focus;
uint64_t exp;
read(input->repeat_timer_fd, &exp, sizeof (uint64_t));
if (window->key_handler) {
(*window->key_handler)(window, input, input->repeat_time,
input->repeat_key, input->repeat_sym,
WL_KEYBOARD_KEY_STATE_PRESSED,
window->user_data);
}
}
static void
@ -3228,6 +3269,11 @@ display_add_input(struct display *d, uint32_t id)
input);
input->pointer_surface = wl_compositor_create_surface(d->compositor);
input->repeat_timer_fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC);
input->repeat_task.run = keyboard_repeat_func;
display_watch_fd(d, input->repeat_timer_fd,
EPOLLIN, &input->repeat_task);
}
static void
@ -3254,6 +3300,7 @@ input_destroy(struct input *input)
wl_list_remove(&input->link);
wl_seat_destroy(input->seat);
close(input->repeat_timer_fd);
free(input);
}