void default_pointer_handler(XEvent *ev) { XEvent tmp; Window win_pressed; WThing *t; bool mouse_grab_held=FALSE; if(grab_held()) return; win_pressed=ev->xbutton.window; if(!handle_button_press(&ev->xbutton)) return; mouse_grab_held=TRUE; while(mouse_grab_held){ XFlush(wglobal.dpy); get_event_mask(ev, GRAB_EV_MASK); switch(ev->type){ CASE_EVENT(ButtonRelease) if(handle_button_release(&(ev->xbutton))){ ungrab_kb_ptr(); mouse_grab_held=FALSE; } break; CASE_EVENT(MotionNotify) handle_pointer_motion(&(ev->xmotion)); break; CASE_EVENT(Expose) handle_expose(&(ev->xexpose)); break; } } }
si_t window_manager_input_handler(struct egui_uds* uds_ptr, addr_t arg) { struct input_device* input_device_ptr = (struct input_device*)arg; NOT_USED(uds_ptr); if(0 != input_device_ptr->deal_with_input(input_device_ptr, &global_wm.message_list)) { EGUI_PRINT_ERROR("failed to deal with input"); } /* 消息队列非空 */ while(list_empty(&(global_wm.message_list)) == 0) { union message * message; /* 获得第一个消息 */ message = list_front(&(global_wm.message_list)); /* 消息中光标的位置 */ message->base.cursor_position.x = global_wm.old_cursor.x; message->base.cursor_position.y = global_wm.old_cursor.y; /* 有包含窗口的用户应用程序 */ if(global_wm.active_app_info_ptr != NULL && global_wm.active_win_info_ptr != NULL) { send_input_message(&global_wm.active_app_info_ptr->uds, message, (si_t)global_wm.active_win_info_ptr); } if(message->base.type == MESSAGE_TYPE_MOUSE_PRESS) { /** * if not clicked in workspace area, send to desktop thread **/ if(!is_point_in_area(&message->base.cursor_position, &global_wm.work_area) && NULL != global_wm.desktop_app_ptr) { send_input_message(&global_wm.desktop_app_ptr->uds, message, 0); } else { /* 更新活动窗口 */ mask_active_by_mouse_down(message); handle_desktop_press(message); handle_button_press(message); handle_title_bar_press(message); handle_frame_press(message); } } else if(message->base.type == MESSAGE_TYPE_MOUSE_RELEASE) { /** * if not clicked in workspace area, send to desktop thread **/ if(!is_point_in_area(&message->base.cursor_position, &global_wm.work_area)) { send_input_message(&global_wm.desktop_app_ptr->uds, message, 0); } else { handle_desktop_release(message); handle_button_release(message); handle_widget_move(message); handle_widget_resize(message); } } /* 绘制鼠标并且更新光标的坐标 */ else if(message->base.type == MESSAGE_TYPE_MOUSE_MOVE || message->base.type == MESSAGE_TYPE_MOUSE_MOVE_POINT) { if(message->mouse.code == INPUT_CODE_MOUSE_X_OFFSET) { if(message->base.type == MESSAGE_TYPE_MOUSE_MOVE) { global_wm.new_cursor.x = global_wm.new_cursor.x + message->mouse.value; } else { global_wm.new_cursor.x = (double)message->mouse.value/MOUSE_RESOLUTION* global_screen.width; } if(global_wm.new_cursor.x < 0) { global_wm.new_cursor.x = 0; } else if(global_wm.new_cursor.x >= (si_t)global_screen.width) { global_wm.new_cursor.x = global_screen.width - 1; } } else if(message->mouse.code == INPUT_CODE_MOUSE_Y_OFFSET) { if(message->base.type == MESSAGE_TYPE_MOUSE_MOVE) { global_wm.new_cursor.y = global_wm.new_cursor.y + message->mouse.value; } else { global_wm.new_cursor.y = (double)message->mouse.value/MOUSE_RESOLUTION* global_screen.height; } if(global_wm.new_cursor.y < 0) { global_wm.new_cursor.y = 0; } else if(global_wm.new_cursor.y >= (si_t)global_screen.height) { global_wm.new_cursor.y = global_screen.height - 1; } } accumulate_widget_move(message); accumulate_widget_resize(message); cursor_paint(); global_wm.old_cursor = global_wm.new_cursor; } /* 删除已分发的消息 */ list_pop_front(&(global_wm.message_list)); } return 0; }