Make process_text() optional

Not all key processors support text injection (HID keyboard does not
support it).

Instead of providing a dummy op function, set it to NULL and check on
the caller side before calling it.
This commit is contained in:
Romain Vimont 2021-12-30 15:03:39 +01:00
parent 63e29b1782
commit bc674721dc
3 changed files with 17 additions and 11 deletions

View file

@ -387,15 +387,6 @@ sc_key_processor_process_key(struct sc_key_processor *kp,
} }
} }
static void
sc_key_processor_process_text(struct sc_key_processor *kp,
const struct sc_text_event *event) {
(void) kp;
(void) event;
// Never forward text input via HID (all the keys are injected separately)
}
bool bool
sc_hid_keyboard_init(struct sc_hid_keyboard *kb, struct sc_aoa *aoa) { sc_hid_keyboard_init(struct sc_hid_keyboard *kb, struct sc_aoa *aoa) {
kb->aoa = aoa; kb->aoa = aoa;
@ -415,7 +406,9 @@ sc_hid_keyboard_init(struct sc_hid_keyboard *kb, struct sc_aoa *aoa) {
static const struct sc_key_processor_ops ops = { static const struct sc_key_processor_ops ops = {
.process_key = sc_key_processor_process_key, .process_key = sc_key_processor_process_key,
.process_text = sc_key_processor_process_text, // Never forward text input via HID (all the keys are injected
// separately)
.process_text = NULL,
}; };
// Clipboard synchronization is requested over the control socket, while HID // Clipboard synchronization is requested over the control socket, while HID

View file

@ -384,6 +384,11 @@ rotate_client_right(struct screen *screen) {
static void static void
input_manager_process_text_input(struct input_manager *im, input_manager_process_text_input(struct input_manager *im,
const SDL_TextInputEvent *event) { const SDL_TextInputEvent *event) {
if (!im->kp->ops->process_text) {
// The key processor does not support text input
return;
}
if (is_shortcut_mod(im, SDL_GetModState())) { if (is_shortcut_mod(im, SDL_GetModState())) {
// A shortcut must never generate text events // A shortcut must never generate text events
return; return;
@ -620,6 +625,7 @@ input_manager_process_key(struct input_manager *im,
.mods_state = sc_mods_state_from_sdl(event->keysym.mod), .mods_state = sc_mods_state_from_sdl(event->keysym.mod),
}; };
assert(im->kp->ops->process_key);
im->kp->ops->process_key(im->kp, &evt, ack_to_wait); im->kp->ops->process_key(im->kp, &evt, ack_to_wait);
} }

View file

@ -29,17 +29,24 @@ struct sc_key_processor {
struct sc_key_processor_ops { struct sc_key_processor_ops {
/** /**
* Process the keyboard event * Process a keyboard event
* *
* The `sequence` number (if different from `SC_SEQUENCE_INVALID`) indicates * The `sequence` number (if different from `SC_SEQUENCE_INVALID`) indicates
* the acknowledgement number to wait for before injecting this event. * the acknowledgement number to wait for before injecting this event.
* This allows to ensure that the device clipboard is set before injecting * This allows to ensure that the device clipboard is set before injecting
* Ctrl+v on the device. * Ctrl+v on the device.
*
* This function is mandatory.
*/ */
void void
(*process_key)(struct sc_key_processor *kp, (*process_key)(struct sc_key_processor *kp,
const struct sc_key_event *event, uint64_t ack_to_wait); const struct sc_key_event *event, uint64_t ack_to_wait);
/**
* Process an input text
*
* This function is optional.
*/
void void
(*process_text)(struct sc_key_processor *kp, (*process_text)(struct sc_key_processor *kp,
const struct sc_text_event *event); const struct sc_text_event *event);