/** * sparse_keymap_setup - set up sparse keymap for an input device * @dev: Input device * @keymap: Keymap in form of array of &key_entry structures ending * with %KE_END type entry * @setup: Function that can be used to adjust keymap entries * depending on device's needs, may be %NULL * * The function calculates size and allocates copy of the original * keymap after which sets up input device event bits appropriately. * The allocated copy of the keymap is automatically freed when it * is no longer needed.
*/ int sparse_keymap_setup(struct input_dev *dev, conststruct key_entry *keymap, int (*setup)(struct input_dev *, struct key_entry *))
{
size_t map_size = 1; /* to account for the last KE_END entry */ conststruct key_entry *e; struct key_entry *map, *entry; int i; int error;
for (e = keymap; e->type != KE_END; e++)
map_size++;
/** * sparse_keymap_report_entry - report event corresponding to given key entry * @dev: Input device for which event should be reported * @ke: key entry describing event * @value: Value that should be reported (ignored by %KE_SW entries) * @autorelease: Signals whether release event should be emitted for %KE_KEY * entries right after reporting press event, ignored by all other * entries * * This function is used to report input event described by given * &struct key_entry.
*/ void sparse_keymap_report_entry(struct input_dev *dev, conststruct key_entry *ke, unsignedint value, bool autorelease)
{ switch (ke->type) { case KE_KEY:
input_event(dev, EV_MSC, MSC_SCAN, ke->code);
input_report_key(dev, ke->keycode, value);
input_sync(dev); if (value && autorelease) {
input_report_key(dev, ke->keycode, 0);
input_sync(dev);
} break;
case KE_SW:
value = ke->sw.value;
fallthrough;
case KE_VSW:
input_report_switch(dev, ke->sw.code, value);
input_sync(dev); break;
}
}
EXPORT_SYMBOL(sparse_keymap_report_entry);
/** * sparse_keymap_report_event - report event corresponding to given scancode * @dev: Input device using sparse keymap * @code: Scan code * @value: Value that should be reported (ignored by %KE_SW entries) * @autorelease: Signals whether release event should be emitted for %KE_KEY * entries right after reporting press event, ignored by all other * entries * * This function is used to perform lookup in an input device using sparse * keymap and report corresponding event. Returns %true if lookup was * successful and %false otherwise.
*/ bool sparse_keymap_report_event(struct input_dev *dev, unsignedint code, unsignedint value, bool autorelease)
{ conststruct key_entry *ke =
sparse_keymap_entry_from_scancode(dev, code); struct key_entry unknown_ke;
if (ke) {
sparse_keymap_report_entry(dev, ke, value, autorelease); returntrue;
}
/* Report an unknown key event as a debugging aid */
unknown_ke.type = KE_KEY;
unknown_ke.code = code;
unknown_ke.keycode = KEY_UNKNOWN;
sparse_keymap_report_entry(dev, &unknown_ke, value, true);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.