Linux Kernel input handler处理

来源:互联网 发布:软件认证中心 编辑:程序博客网 时间:2024/04/24 15:19
/*
 * Pass values first through all filters and then, if event has not been * filtered out, through all open handles. This function is called with * dev->event_lock held and interrupts disabled. */static void input_pass_values(struct input_dev *dev,      struct input_value *vals, unsigned int count){struct input_handle *handle;struct input_value *v;if (!count)return;rcu_read_lock();handle = rcu_dereference(dev->grab);if (handle) {count = input_to_handler(handle, vals, count);} else {list_for_each_entry_rcu(handle, &dev->h_list, d_node)if (handle->open) {count = input_to_handler(handle, vals, count);if (!count)break;}}rcu_read_unlock();/* trigger auto repeat for key events */if (test_bit(EV_REP, dev->evbit) && test_bit(EV_KEY, dev->evbit)) {for (v = vals; v != vals + count; v++) {if (v->type == EV_KEY && v->value != 2) {if (v->value)input_start_autorepeat(dev, v->code);elseinput_stop_autorepeat(dev);}}}}
/* * Pass event first through all filters and then, if event has not been * filtered out, through all open handles. This function is called with * dev->event_lock held and interrupts disabled. */static unsigned int input_to_handler(struct input_handle *handle,struct input_value *vals, unsigned int count){struct input_handler *handler = handle->handler;struct input_value *end = vals;struct input_value *v;if (handler->filter) {for (v = vals; v != vals + count; v++) {if (handler->filter(handle, v->type, v->code, v->value))continue;if (end != v)*end = *v;end++;}count = end - vals;}if (!count)return 0;if (handler->events)handler->events(handle, vals, count);else if (handler->event)for (v = vals; v != vals + count; v++)handler->event(handle, v->type, v->code, v->value);return count;}
static struct input_handler kbd_handler = {.event= kbd_event,.match= kbd_match,.connect= kbd_connect,.disconnect= kbd_disconnect,.start= kbd_start,.name= "kbd",.id_table= kbd_ids,};int __init kbd_init(void){int i;int error;for (i = 0; i < MAX_NR_CONSOLES; i++) {kbd_table[i].ledflagstate = kbd_defleds();kbd_table[i].default_ledflagstate = kbd_defleds();kbd_table[i].ledmode = LED_SHOW_FLAGS;kbd_table[i].lockstate = KBD_DEFLOCK;kbd_table[i].slockstate = 0;kbd_table[i].modeflags = KBD_DEFMODE;kbd_table[i].kbdmode = default_utf8 ? VC_UNICODE : VC_XLATE;}kbd_init_leds();error = input_register_handler(&kbd_handler);if (error)return error;tasklet_enable(&keyboard_tasklet);tasklet_schedule(&keyboard_tasklet);return 0;}
0 0