wlt: toolkit: notify keyboard-cbs whether a key was handled

All keyboard-cbs have to return whether they handled a key now.
Furthermore, they get as parameter a flag that notifies them whether a
previous handled already handled the key.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-10-01 17:00:58 +02:00
parent 394ee75f38
commit c28ea5c974
3 changed files with 28 additions and 16 deletions

View File

@ -306,14 +306,14 @@ static void widget_prepare_resize(struct wlt_widget *widget,
} }
} }
static void widget_key(struct wlt_widget *widget, unsigned int mask, static bool widget_key(struct wlt_widget *widget, unsigned int mask,
uint32_t sym, uint32_t state, void *data) uint32_t sym, uint32_t state, bool handled, void *data)
{ {
struct wlt_terminal *term = data; struct wlt_terminal *term = data;
uint32_t ucs4; uint32_t ucs4;
if (state != WL_KEYBOARD_KEY_STATE_PRESSED) if (handled || state != WL_KEYBOARD_KEY_STATE_PRESSED)
return; return false;
ucs4 = xkb_keysym_to_utf32(sym) ? : TSM_VTE_INVALID; ucs4 = xkb_keysym_to_utf32(sym) ? : TSM_VTE_INVALID;
@ -321,31 +321,34 @@ static void widget_key(struct wlt_widget *widget, unsigned int mask,
sym == wlt_conf.grab_scroll_up->keysym) { sym == wlt_conf.grab_scroll_up->keysym) {
tsm_screen_sb_up(term->scr, 1); tsm_screen_sb_up(term->scr, 1);
wlt_window_schedule_redraw(term->wnd); wlt_window_schedule_redraw(term->wnd);
return; return true;
} }
if (SHL_HAS_BITS(mask, wlt_conf.grab_scroll_down->mods) && if (SHL_HAS_BITS(mask, wlt_conf.grab_scroll_down->mods) &&
sym == wlt_conf.grab_scroll_down->keysym) { sym == wlt_conf.grab_scroll_down->keysym) {
tsm_screen_sb_down(term->scr, 1); tsm_screen_sb_down(term->scr, 1);
wlt_window_schedule_redraw(term->wnd); wlt_window_schedule_redraw(term->wnd);
return; return true;
} }
if (SHL_HAS_BITS(mask, wlt_conf.grab_page_up->mods) && if (SHL_HAS_BITS(mask, wlt_conf.grab_page_up->mods) &&
sym == wlt_conf.grab_page_up->keysym) { sym == wlt_conf.grab_page_up->keysym) {
tsm_screen_sb_page_up(term->scr, 1); tsm_screen_sb_page_up(term->scr, 1);
wlt_window_schedule_redraw(term->wnd); wlt_window_schedule_redraw(term->wnd);
return; return true;
} }
if (SHL_HAS_BITS(mask, wlt_conf.grab_page_down->mods) && if (SHL_HAS_BITS(mask, wlt_conf.grab_page_down->mods) &&
sym == wlt_conf.grab_page_down->keysym) { sym == wlt_conf.grab_page_down->keysym) {
tsm_screen_sb_page_down(term->scr, 1); tsm_screen_sb_page_down(term->scr, 1);
wlt_window_schedule_redraw(term->wnd); wlt_window_schedule_redraw(term->wnd);
return; return true;
} }
if (tsm_vte_handle_keyboard(term->vte, sym, mask, ucs4)) { if (tsm_vte_handle_keyboard(term->vte, sym, mask, ucs4)) {
tsm_screen_sb_reset(term->scr); tsm_screen_sb_reset(term->scr);
wlt_window_schedule_redraw(term->wnd); wlt_window_schedule_redraw(term->wnd);
return true;
} }
return false;
} }
static void vte_event(struct tsm_vte *vte, const char *u8, size_t len, static void vte_event(struct tsm_vte *vte, const char *u8, size_t len,

View File

@ -633,6 +633,7 @@ static void keyboard_key(void *data, struct wl_keyboard *keyboard,
struct shl_dlist *iter; struct shl_dlist *iter;
struct wlt_widget *widget; struct wlt_widget *widget;
struct itimerspec spec; struct itimerspec spec;
bool handled;
disp->last_serial = serial; disp->last_serial = serial;
if (!disp->xkb_state) if (!disp->xkb_state)
@ -648,11 +649,14 @@ static void keyboard_key(void *data, struct wl_keyboard *keyboard,
if (num_syms == 1) if (num_syms == 1)
sym = syms[0]; sym = syms[0];
handled = false;
shl_dlist_for_each(iter, &wnd->widget_list) { shl_dlist_for_each(iter, &wnd->widget_list) {
widget = shl_dlist_entry(iter, struct wlt_widget, list); widget = shl_dlist_entry(iter, struct wlt_widget, list);
if (widget->keyboard_cb) if (widget->keyboard_cb) {
widget->keyboard_cb(widget, mask, sym, state, if (widget->keyboard_cb(widget, mask, sym, state,
widget->data); handled, widget->data))
handled = true;
}
} }
if (state == WL_KEYBOARD_KEY_STATE_RELEASED && if (state == WL_KEYBOARD_KEY_STATE_RELEASED &&
@ -675,17 +679,21 @@ static void repeat_event(struct ev_timer *timer, uint64_t num, void *data)
struct wlt_widget *widget; struct wlt_widget *widget;
struct shl_dlist *iter; struct shl_dlist *iter;
unsigned int mask; unsigned int mask;
bool handled;
if (!wnd) if (!wnd)
return; return;
mask = shl_get_xkb_mods(disp->xkb_state); mask = shl_get_xkb_mods(disp->xkb_state);
handled = false;
shl_dlist_for_each(iter, &wnd->widget_list) { shl_dlist_for_each(iter, &wnd->widget_list) {
widget = shl_dlist_entry(iter, struct wlt_widget, list); widget = shl_dlist_entry(iter, struct wlt_widget, list);
if (widget->keyboard_cb) if (widget->keyboard_cb) {
widget->keyboard_cb(widget, mask, disp->repeat_sym, if (widget->keyboard_cb(widget, mask, disp->repeat_sym,
WL_KEYBOARD_KEY_STATE_PRESSED, WL_KEYBOARD_KEY_STATE_PRESSED,
widget->data); handled, widget->data))
handled = true;
}
} }
} }

View File

@ -112,10 +112,11 @@ typedef void (*wlt_widget_pointer_button_cb) (struct wlt_widget *widget,
uint32_t button, uint32_t button,
uint32_t state, uint32_t state,
void *data); void *data);
typedef void (*wlt_widget_keyboard_cb) (struct wlt_widget *widget, typedef bool (*wlt_widget_keyboard_cb) (struct wlt_widget *widget,
unsigned int mods, unsigned int mods,
uint32_t key, uint32_t key,
uint32_t state, uint32_t state,
bool handled,
void *data); void *data);
int wlt_display_new(struct wlt_display **out, int wlt_display_new(struct wlt_display **out,