switch (type) { case POLLIN: temp = &rset; break; case POLLOUT: temp = wsetptr; break; case POLLERR: temp = esetptr; break; } } }
return (n > 0); }
4、输入等待事件: IAL_WaitEvent
static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except, struct timeval *timeout) {
fprintf(stderr,\); fd_set rfds; int retvalue = 0; int fd, e;
if (!in) { //如果可读文件描述符集合为空 in = &rfds; //设置可读文件描述符指向rfds
FD_ZERO (in);//将rfds对应的内存空间的文件描述符清空 }
//如果事件类型为鼠标事件且鼠标的文件描述符mouse_fd >= 0 if (which & IAL_MOUSEEVENT && mouse_fd >= 0) { fd = mouse_fd; //文件描述符等于鼠标文件描述符 FD_SET (fd, in); //将文件描述符fd加入到可读文件描述符中 #ifdef _LITE_VERSION //如果为非多线程模式,
if (fd > maxfd) maxfd = fd; //如果文件描述符大于最大文件描述符大于0, #endif }
//如果事件类型为键盘事件且键盘的文件描述符kbd_fd >= 0 if (which & IAL_KEYEVENT && kbd_fd >= 0) { fd = kbd_fd; //文件描述符等于鼠标文件描述符
FD_SET (kbd_fd, in); //将文件描述符fd加入到可读文件描述符中 #ifdef _LITE_VERSION
if (fd > maxfd) maxfd = fd; //如果文件描述符大于最大文件描述符 #endif
}
//将处于就绪状态并且已经包含在fd_set结构中的描述符总数赋给e e = select (maxfd + 1, in, out, except, timeout) ; if (e > 0) {//如果e大于0
fd = mouse_fd; //设置文件描述符为鼠标描述符 /* If data is present on the mouse fd, service it: */
if (fd >= 0 && FD_ISSET (fd, in)) { //如果fd大于0且位于可读文件描述符集中 FD_CLR (fd, in); //从可读文件描述符集中删除该描述符
retvalue |= IAL_MOUSEEVENT; //返回值设为包含IAL_MOUSEEVENT }
fd = kbd_fd; //设置文件描述符为鼠标描述符 /* If data is present on the keyboard fd, service it: */
if (fd >= 0 && FD_ISSET (fd, in)) {//如果fd大于0且位于可读文件描述符集中 FD_CLR (fd, in); //从可读文件描述符集中删除该描述符 if (read_key ()) //读取键盘按键信息成功
retvalue |= IAL_KEYEVENT; //返回值设为包含IAL_KEYEVENT else { /* play at a timeout event *///读取键盘按键信息失败 if (timeout) { //timeout不为0
timeout->tv_sec = 0; //设置timeout为0 timeout->tv_usec = 0; } } }
} else if (e < 0) {//如果e<0,表示出现错误,返回-1 return -1; }
return retvalue;//返回retvalue }
5、读取键盘按键信息
static int read_key (void) {
static unsigned char last; struct QVFbKeyData l_kbd_data; int ret;
unsigned char scancode;
ret = read (kbd_fd, &l_kbd_data, sizeof (struct QVFbKeyData));
if (ret == sizeof (struct QVFbKeyData)) { kbd_data = l_kbd_data; }
else
return 0;
if (kbd_data.repeat) { return 0; }
if (kbd_data.unicode == 0 && !kbd_data.press) { kbd_state [last] = 0; } else {
// scancode = keycode_to_scancode (HIWORD (kbd_data.unicode) & 0x00FF, // LOWORD (kbd_data.unicode));
scancode = keycode_to_scancode (LOWORD (kbd_data.unicode),HIWORD (kbd_data.unicode) & 0x00FF);
kbd_state [scancode] = kbd_data.press ? 1 : 0; last = scancode; }
nr_changed_keys = last + 1; return 1; }
6 、解析事件ParseEvent
函数作用:将event时间转换成 MSG 类型的事件并加入到消息队列中
static void ParseEvent (PMSGQUEUE msg_que, int event) {
LWEVENT lwe; PMOUSEEVENT me; PKEYEVENT ke; MSG Msg;
ke = &(lwe.data.ke); me = &(lwe.data.me); me->x = 0; me->y = 0;
Msg.hwnd = HWND_DESKTOP; Msg.wParam = 0; Msg.lParam = 0;
lwe.status = 0L;
//根据event事件获得底层事件lwe的值 if (!GetLWEvent (event, &lwe)) return;
Msg.time = __mg_timer_counter; //若底层事件为超时事件
if (lwe.type == LWETYPE_TIMEOUT) {
Msg.message = MSG_TIMEOUT;//消息类型为MSG_TIMEOUT Msg.wParam = (WPARAM)lwe.count; Msg.lParam = 0;
QueueMessage (msg_que, &Msg);//将消息加入消息队列 }
else if (lwe.type == LWETYPE_KEY) {//若底层事件为键盘事件
Msg.wParam = ke->scancode;//消息的wParam成员值为键盘事件的扫描码成员 Msg.lParam = ke->status;//消息的wParam成员值为键盘事件的状态成员 if (ke->event == KE_KEYDOWN){//如果键盘事件为击键事件 Msg.message = MSG_KEYDOWN;//消息类型为MSG_KEYDOWN }
else if (ke->event == KE_KEYUP) {//如果键盘事件为按键释放事件 Msg.message = MSG_KEYUP;//消息类型为MSG_KEYUP }
else if (ke->event == KE_KEYLONGPRESS) { Msg.message = MSG_KEYLONGPRESS; }
else if (ke->event == KE_KEYALWAYSPRESS) { Msg.message = MSG_KEYALWAYSPRESS; }
if (!(srv_evt_hook && srv_evt_hook (&Msg))) { QueueMessage (msg_que, &Msg); } }
else if (lwe.type == LWETYPE_MOUSE) {//若底层事件为鼠标事件 Msg.wParam = me->status;//消息的wParam参数为鼠标的状态信息 switch (me->event) {//判断鼠标事件的类型,并依此确定消息的类型 case ME_MOVED: //鼠标移动事件 Msg.message = MSG_MOUSEMOVE; SetCursor (GetSystemCursor (IDC_ARROW)); break;
case ME_LEFTDOWN:
Msg.message = MSG_LBUTTONDOWN; break; case ME_LEFTUP:
Msg.message = MSG_LBUTTONUP; break;
case ME_LEFTDBLCLICK:
Msg.message = MSG_LBUTTONDBLCLK;
break;
case ME_RIGHTDOWN:
Msg.message = MSG_RBUTTONDOWN; break; case ME_RIGHTUP:
Msg.message = MSG_RBUTTONUP; break;
case ME_RIGHTDBLCLICK:
Msg.message = MSG_RBUTTONDBLCLK; break; }
Msg.lParam = MAKELONG (me->x, me->y);//将鼠标信息转换为消息的lParam if (!(srv_evt_hook && srv_evt_hook (&Msg))) {
QueueMessage (msg_que, &Msg);//将消息加入消息队列 } } }
7、获取底层事件:GetLWEvent
根据event的值确定lwe的成员值
BOOL GetLWEvent (int event, PLWEVENT lwe) {
static LWEVENT old_lwe = {0, 0}; unsigned int interval; int button;
PMOUSEEVENT me = &(lwe->data.me); PKEYEVENT ke = &(lwe->data.ke); const char* keystate; int i;
int make; /* 0 = release, 1 = presse */ //如果事件类型为0,表示超时事件或者错误事件 if (event == 0) {
/*#define DEF_USEC_TIMEOUT 300000 timeoutusec = DEF_USEC_TIMEOUT | timeoutusec = mytimeoutusec; timeout_threshold = timeoutusec / 10000; timeout_count = timeout_threshold;
#define DEF_REPEAT_TIME 50000 repeatusec = DEF_REPEAT_TIME; | repeatusec = myrepeatusec repeat_threshold = repeatusec / 10000; */ //如果超时
if (__mg_timer_counter >= timeout_count) {
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库MINIGUI输入模块代码文件分析(7)在线全文阅读。
相关推荐: