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;
}
예제 #2
0
파일: exec.c 프로젝트: hanguangyi/egui
static void application_handle_message(union message* msg)
{
	/**
	 * 如果是桌面程序 那么首先将消息发给桌面的回调函数处理
	 **/
	if(global_application.application_type & APPLICATION_TYPE_DESKTOP)
	{
		if(global_application.desktop_msg_handler != NULL)
		{
			global_application.desktop_msg_handler(global_application.desktop_ptr, msg);
		}
	}

    switch(msg->base.type)
    {
    case MESSAGE_TYPE_KEYBD_PRESS:
        handle_keybd_press(msg);
        break;

    case MESSAGE_TYPE_KEYBD_RELEASE:
        handle_keybd_release(msg);
        break;

    case MESSAGE_TYPE_KEYBD_CLICK:
        handle_keybd_click(msg);
        break;

    case MESSAGE_TYPE_MOUSE_MOVE:
        handle_mouse_move(msg);
        break;

    case MESSAGE_TYPE_MOUSE_PRESS:
        handle_mouse_press(msg);
        break;

    case MESSAGE_TYPE_MOUSE_RELEASE:
        handle_mouse_release(msg);
        break;

    case MESSAGE_TYPE_MOUSE_SINGLE_CLICK:
        handle_mouse_single_click(msg);
        break;

    case MESSAGE_TYPE_MOUSE_DOUBLE_CLICK:
        handle_mouse_double_click(msg);
        break;

    case MESSAGE_TYPE_WIDGET_REPAINT:
        handle_widget_repaint(msg);
        break;

    case MESSAGE_TYPE_WIDGET_MOVE:
        handle_widget_move(msg);
        break;

    case MESSAGE_TYPE_WIDGET_RESIZE:
        handle_widget_resize(msg);
        break;

    case MESSAGE_TYPE_WINDOW_ACTIVATE:
        handle_window_activate(msg);
        break;

    case MESSAGE_TYPE_WINDOW_DEACTIVATE:
        handle_window_deactivate(msg);
        break;

    case MESSAGE_TYPE_WINDOW_MINIMIZE:
        handle_window_minimize(msg);
        break;

    case MESSAGE_TYPE_WINDOW_MAXIMIZE:
        handle_window_maximize(msg);
        break;

    case MESSAGE_TYPE_WINDOW_RESTORE:
        handle_window_restore(msg);
        break;

    case MESSAGE_TYPE_WINDOW_CANCEL:
        handle_window_cancel(msg);
        break;

    default:
        application_widgets_for_each_increament(do_find_window, msg);
        break;
    }
}