static si_t deal_with_keybd(struct input_device * self, struct list* msg_list) { struct input_event ie; union message msg=(const union message){{0}}; /* 读取数据 */ if(uds_read(&self->uds, &ie, sizeof(struct input_event)) < 0) { EGUI_PRINT_ERROR("failed to read from keybd input device."); return -1; } /* 时间 */ msg.mouse.time.tv_sec = ie.time.tv_sec; msg.mouse.time.tv_usec = ie.time.tv_usec; /** * 只处理按键事件 **/ if(ie.type != EV_KEY) { return 0; } /* 松开键盘的键 */ if(ie.value == 0) { msg.keybd.type = MESSAGE_TYPE_KEYBD_RELEASE; msg.keybd.value = 0; } /* 按下键盘的键 */ else if(ie.value == 1) { msg.keybd.type = MESSAGE_TYPE_KEYBD_PRESS; msg.keybd.value = 1; } /* 长时间按下键盘的键 */ else if(ie.value == 2) { msg.keybd.type = MESSAGE_TYPE_KEYBD_CLICK; msg.keybd.value = 2; } /* 哪个键 */ switch(ie.code) { case KEY_ESC: msg.keybd.code = INPUT_CODE_KEYBD_ESC; break; case KEY_1: msg.keybd.code = INPUT_CODE_KEYBD_1; break; case KEY_2: msg.keybd.code = INPUT_CODE_KEYBD_2; break; case KEY_3: msg.keybd.code = INPUT_CODE_KEYBD_3; break; case KEY_4: msg.keybd.code = INPUT_CODE_KEYBD_4; break; case KEY_5: msg.keybd.code = INPUT_CODE_KEYBD_5; break; case KEY_6: msg.keybd.code = INPUT_CODE_KEYBD_6; break; case KEY_7: msg.keybd.code = INPUT_CODE_KEYBD_7; break; case KEY_8: msg.keybd.code = INPUT_CODE_KEYBD_8; break; case KEY_9: msg.keybd.code = INPUT_CODE_KEYBD_9; break; case KEY_0: msg.keybd.code = INPUT_CODE_KEYBD_0; break; case KEY_MINUS: msg.keybd.code = INPUT_CODE_KEYBD_SUB; break; case KEY_EQUAL: msg.keybd.code = INPUT_CODE_KEYBD_EQUAL; break; case KEY_BACKSPACE: msg.keybd.code = INPUT_CODE_KEYBD_BACKSPACE; break; case KEY_TAB: msg.keybd.code = INPUT_CODE_KEYBD_TAB; break; case KEY_Q: msg.keybd.code = INPUT_CODE_KEYBD_Q; break; case KEY_W: msg.keybd.code = INPUT_CODE_KEYBD_W; break; case KEY_E: msg.keybd.code = INPUT_CODE_KEYBD_E; break; case KEY_R: msg.keybd.code = INPUT_CODE_KEYBD_R; break; case KEY_T: msg.keybd.code = INPUT_CODE_KEYBD_T; break; case KEY_Y: msg.keybd.code = INPUT_CODE_KEYBD_Y; break; case KEY_U: msg.keybd.code = INPUT_CODE_KEYBD_U; break; case KEY_I: msg.keybd.code = INPUT_CODE_KEYBD_I; break; case KEY_O: msg.keybd.code = INPUT_CODE_KEYBD_O; break; case KEY_P: msg.keybd.code = INPUT_CODE_KEYBD_P; break; case KEY_LEFTBRACE: msg.keybd.code = INPUT_CODE_KEYBD_L_BRACE; break; case KEY_RIGHTBRACE: msg.keybd.code = INPUT_CODE_KEYBD_R_BRACE; break; case KEY_ENTER: msg.keybd.code = INPUT_CODE_KEYBD_ENTER; break; case KEY_LEFTCTRL: msg.keybd.code = INPUT_CODE_KEYBD_L_CTRL; break; case KEY_A: msg.keybd.code = INPUT_CODE_KEYBD_A; break; case KEY_S: msg.keybd.code = INPUT_CODE_KEYBD_S; break; case KEY_D: msg.keybd.code = INPUT_CODE_KEYBD_D; break; case KEY_F: msg.keybd.code = INPUT_CODE_KEYBD_F; break; case KEY_G: msg.keybd.code = INPUT_CODE_KEYBD_G; break; case KEY_H: msg.keybd.code = INPUT_CODE_KEYBD_H; break; case KEY_J: msg.keybd.code = INPUT_CODE_KEYBD_J; break; case KEY_K: msg.keybd.code = INPUT_CODE_KEYBD_K; break; case KEY_L: msg.keybd.code = INPUT_CODE_KEYBD_L; break; case KEY_SEMICOLON: msg.keybd.code = INPUT_CODE_KEYBD_SEMICOLON; break; case KEY_APOSTROPHE: msg.keybd.code = INPUT_CODE_KEYBD_APOSTROPHE; break; case KEY_GRAVE: msg.keybd.code = INPUT_CODE_KEYBD_GRAVE; break; case KEY_LEFTSHIFT: msg.keybd.code = INPUT_CODE_KEYBD_L_SHIFT; break; case KEY_BACKSLASH: msg.keybd.code = INPUT_CODE_KEYBD_BACKSLASH; break; case KEY_Z: msg.keybd.code = INPUT_CODE_KEYBD_Z; break; case KEY_X: msg.keybd.code = INPUT_CODE_KEYBD_X; break; case KEY_C: msg.keybd.code = INPUT_CODE_KEYBD_C; break; case KEY_V: msg.keybd.code = INPUT_CODE_KEYBD_V; break; case KEY_B: msg.keybd.code = INPUT_CODE_KEYBD_B; break; case KEY_N: msg.keybd.code = INPUT_CODE_KEYBD_N; break; case KEY_M: msg.keybd.code = INPUT_CODE_KEYBD_M; break; case KEY_COMMA: msg.keybd.code = INPUT_CODE_KEYBD_COMMA; break; case KEY_DOT: msg.keybd.code = INPUT_CODE_KEYBD_DOT; break; case KEY_SLASH: msg.keybd.code = INPUT_CODE_KEYBD_SLASH; break; case KEY_RIGHTSHIFT: msg.keybd.code = INPUT_CODE_KEYBD_R_SHIFT; break; case KEY_KPASTERISK: msg.keybd.code = INPUT_CODE_KEYBD_KPASTERISK; break; case KEY_LEFTALT: msg.keybd.code = INPUT_CODE_KEYBD_L_ALT; break; case KEY_SPACE: msg.keybd.code = INPUT_CODE_KEYBD_SPACE; break; case KEY_CAPSLOCK: msg.keybd.code = INPUT_CODE_KEYBD_CAPSLOCK; break; case KEY_F1: msg.keybd.code = INPUT_CODE_KEYBD_F1; break; case KEY_F2: msg.keybd.code = INPUT_CODE_KEYBD_F2; break; case KEY_F3: msg.keybd.code = INPUT_CODE_KEYBD_F3; break; case KEY_F4: msg.keybd.code = INPUT_CODE_KEYBD_F4; break; case KEY_F5: msg.keybd.code = INPUT_CODE_KEYBD_F5; break; case KEY_F6: msg.keybd.code = INPUT_CODE_KEYBD_F6; break; case KEY_F7: msg.keybd.code = INPUT_CODE_KEYBD_F7; break; case KEY_F8: msg.keybd.code = INPUT_CODE_KEYBD_F8; break; case KEY_F9: msg.keybd.code = INPUT_CODE_KEYBD_F9; break; case KEY_F10: msg.keybd.code = INPUT_CODE_KEYBD_F10; break; case KEY_NUMLOCK: msg.keybd.code = INPUT_CODE_KEYBD_NUMLOCK; break; case KEY_SCROLLLOCK: msg.keybd.code = INPUT_CODE_KEYBD_SCROLLLOCK; break; case KEY_KP7: msg.keybd.code = INPUT_CODE_KEYBD_KP_7; break; case KEY_KP8: msg.keybd.code = INPUT_CODE_KEYBD_KP_8; break; case KEY_KP9: msg.keybd.code = INPUT_CODE_KEYBD_KP_9; break; case KEY_KPMINUS: msg.keybd.code = INPUT_CODE_KEYBD_KP_SUB; break; case KEY_KP4: msg.keybd.code = INPUT_CODE_KEYBD_KP_4; break; case KEY_KP5: msg.keybd.code = INPUT_CODE_KEYBD_KP_5; break; case KEY_KP6: msg.keybd.code = INPUT_CODE_KEYBD_KP_6; break; case KEY_KPPLUS: msg.keybd.code = INPUT_CODE_KEYBD_KP_ADD; break; case KEY_KP1: msg.keybd.code = INPUT_CODE_KEYBD_KP_1; break; case KEY_KP2: msg.keybd.code = INPUT_CODE_KEYBD_KP_2; break; case KEY_KP3: msg.keybd.code = INPUT_CODE_KEYBD_KP_3; break; case KEY_KP0: msg.keybd.code = INPUT_CODE_KEYBD_KP_0; break; case KEY_KPDOT: msg.keybd.code = INPUT_CODE_KEYBD_KP_DOT; break; case KEY_F11: msg.keybd.code = INPUT_CODE_KEYBD_F11; break; case KEY_F12: msg.keybd.code = INPUT_CODE_KEYBD_F12; break; case KEY_KPENTER: msg.keybd.code = INPUT_CODE_KEYBD_KP_ENTER; break; case KEY_RIGHTCTRL: msg.keybd.code = INPUT_CODE_KEYBD_R_CTRL; break; case KEY_KPSLASH: msg.keybd.code = INPUT_CODE_KEYBD_KP_SLASH; break; case KEY_SYSRQ: msg.keybd.code = INPUT_CODE_KEYBD_SYSRQ; break; case KEY_RIGHTALT: msg.keybd.code = INPUT_CODE_KEYBD_R_ALT; break; case KEY_HOME: msg.keybd.code = INPUT_CODE_KEYBD_HOME; break; case KEY_UP: msg.keybd.code = INPUT_CODE_KEYBD_UP; break; case KEY_PAGEUP: msg.keybd.code = INPUT_CODE_KEYBD_PAGEUP; break; case KEY_LEFT: msg.keybd.code = INPUT_CODE_KEYBD_LEFT; break; case KEY_RIGHT: msg.keybd.code = INPUT_CODE_KEYBD_RIGHT; break; case KEY_END: msg.keybd.code = INPUT_CODE_KEYBD_END; break; case KEY_DOWN: msg.keybd.code = INPUT_CODE_KEYBD_DOWN; break; case KEY_PAGEDOWN: msg.keybd.code = INPUT_CODE_KEYBD_PAGEDOWN; break; case KEY_INSERT: msg.keybd.code = INPUT_CODE_KEYBD_INSERT; break; case KEY_DELETE: msg.keybd.code = INPUT_CODE_KEYBD_DELETE; break; case KEY_PAUSE: msg.keybd.code = INPUT_CODE_KEYBD_PAUSE; break; case KEY_LEFTMETA: msg.keybd.code = INPUT_CODE_KEYBD_L_META; break; case KEY_RIGHTMETA: msg.keybd.code = INPUT_CODE_KEYBD_R_META; break; case KEY_COMPOSE: msg.keybd.code = INPUT_CODE_KEYBD_COMPOSE; break; default: break; } list_push_back(msg_list, &msg, sizeof(union message)); return 0; }
static si_t basic_mouse(struct input_device * self, union message * m) { struct input_event ie; static int syn_ok; /* 读取数据 */ if(uds_read(&self->uds, &ie, sizeof(struct input_event)) < 0) { EGUI_PRINT_ERROR("failed to read from keybd input device."); return -1; } if(ie.type != EV_SYN && !syn_ok) { return 1; } /* 时间 */ m->mouse.time.tv_sec = ie.time.tv_sec; m->mouse.time.tv_usec = ie.time.tv_usec; if(ie.type == EV_SYN) { switch(ie.code) { case SYN_REPORT: syn_ok=1; return 1; break; case SYN_CONFIG: return 1; break; case SYN_MT_REPORT: /* FIXME: for touch-pad events, not implemented. */ return 1; break; case SYN_DROPPED: syn_ok=0; return 1; break; default: EGUI_PRINT_ERROR("Unknown input_event code %d for type EV_SYN.", ie.code); return -1; } } else if(ie.type == EV_KEY) { /* 松开鼠标的键 */ if(ie.value == 0) { /* 消息类型 */ m->mouse.type = MESSAGE_TYPE_MOUSE_RELEASE; m->mouse.value = 0; } /* 按下鼠标的键 */ else if(ie.value == 1) { /* 消息的类型 */ m->mouse.type = MESSAGE_TYPE_MOUSE_PRESS; m->mouse.value = 1; } /* 哪个键 */ switch(ie.code) { /* 左键 */ case BTN_LEFT: m->mouse.code = INPUT_CODE_MOUSE_L_KEY; break; /* 右键 */ case BTN_RIGHT: m->mouse.code = INPUT_CODE_MOUSE_R_KEY; break; /* 中键 */ case BTN_MIDDLE: m->mouse.code = INPUT_CODE_MOUSE_M_KEY; break; default: break; } return 0; } else if(ie.type == EV_REL || ie.type == EV_ABS) { /* 消息类型 */ if(ie.type == EV_REL) { m->mouse.type = MESSAGE_TYPE_MOUSE_MOVE; } else { m->mouse.type = MESSAGE_TYPE_MOUSE_MOVE_POINT; } /* 偏移多少 */ m->mouse.value = ie.value; /* 哪个方向的偏移 */ switch(ie.code) { case REL_X: m->mouse.code = INPUT_CODE_MOUSE_X_OFFSET; break; case REL_Y: m->mouse.code = INPUT_CODE_MOUSE_Y_OFFSET; break; case REL_WHEEL: m->mouse.code = INPUT_CODE_MOUSE_Z_OFFSET; break; default: break; } return 0; } else if(ie.type == EV_ABS) { static struct input_absinfo absinfo_x, absinfo_y, absinfo_wheel; static int init_flag = 0; const struct input_absinfo *absinfo_use; if(!init_flag) { ioctl(self->uds.sock_fd, EVIOCGABS(ABS_X), &absinfo_x); ioctl(self->uds.sock_fd, EVIOCGABS(ABS_Y), &absinfo_y); ioctl(self->uds.sock_fd, EVIOCGABS(ABS_WHEEL), &absinfo_wheel); init_flag = 1; } m->mouse.type = MESSAGE_TYPE_MOUSE_MOVE_POINT; switch(ie.code) { case ABS_X: m->mouse.code = INPUT_CODE_MOUSE_X_OFFSET; absinfo_use = &absinfo_x; break; case ABS_Y: m->mouse.code = INPUT_CODE_MOUSE_Y_OFFSET; absinfo_use = &absinfo_y; break; case ABS_WHEEL: m->mouse.code = INPUT_CODE_MOUSE_Z_OFFSET; absinfo_use = &absinfo_wheel; break; default: /* There are other kinds of signals like ABS_PRESSURE, * which is related to touchpads or touch screens. * * Besides, Linux 3.10.10 and later versions give ABS signals * even for touchpad on laptops, making the control harder * in our project. We should consider separating this part * from the server, making it into a plugin, so we can write * other kinds of handlers. */ return 1; break; } m->mouse.value = (ie.value-absinfo_use->minimum)/ (double)(absinfo_use->maximum-absinfo_use->minimum)*MOUSE_RESOLUTION; return 0; } else if(ie.type == EV_MSC){ if(ie.code == MSC_SCAN) { /* physical mapping of a key, ignoring */ return 1; } } return -1; }