Ejemplo n.º 1
0
static si_t
handle_window_activate
(union message * msg)
{
	struct object* node;
	si_t n = 0, i = 0;
	node = OBJECT_POINTER(application_widgets_for_each_increament(do_find_window, msg));

	if(node == NULL)
	{
		return 0;
	}

	object_move_first(node);
	if(global_application.focus != NULL)
	{
		dispatch_msg_to_subchilds(node, MESSAGE_TYPE_WINDOW_DEACTIVATE);
	}

	global_application.focus = WINDOW_POINTER(node);
	if(WIDGET_POINTER(node)->callback != NULL)
	{
		WIDGET_POINTER(node)->callback(node, msg);
	}

	dispatch_msg_to_subchilds(node, MESSAGE_TYPE_WIDGET_REPAINT);

	/**
	 * 次序提前
	 **/
	node = object_get_root(node)->parent;
	n = vector_size(&global_application.window_vector);
	for(i = 0; i < n; ++ i)
	{
		if(vector_at(&global_application.window_vector, i) == node)
		{
			vector_move_back(&global_application.window_vector, i);
			break;
		}
	}

	return 0;
}
/**
 * 通过按下鼠标消息设置那个是活动的
 * 设置活动用户应用程序和活动窗口
 *
 * @param msg 必须是鼠标按下消息
 *
 * @return 0
 **/
static si_t mask_active_by_mouse_down(union message * msg)
{
	struct window_info_iterator iter;
	window_info_iterator_clear(&iter);

	if(!all_app_traversal_decrement(&iter, _do_find_clicked_window, &msg->mouse.cursor_position)) {
        /* Clear useless pointers in tainted iter */
        window_info_iterator_clear(&iter);
    }

	/* 在桌面上按下了鼠标的某个键 */
	if(iter.app_info_ptr == NULL || iter.win_info_ptr == NULL)
	{
		/* 原来有活动窗口 */
		if(global_wm.active_win_info_ptr != NULL)
		{
			/* 发送激死消息给原来的活动窗口 */
			send_window_deactivate_message(&global_wm.active_app_info_ptr->uds, msg, (si_t)global_wm.active_win_info_ptr);
			/** 通知桌面 **/
			if(NULL != global_wm.desktop_app_ptr)
			{
				send_window_deactivate_message(&global_wm.desktop_app_ptr->uds, NULL,
					(si_t)object_get_root(OBJECT_POINTER(global_wm.active_win_info_ptr)));
			}

			/* 改变活动窗口 */
			global_wm.active_win_info_ptr = NULL;
			global_wm.active_app_info_ptr = NULL;
		}
	}
	/* 在窗口上按下了鼠标的某个键 */
	else if(global_wm.active_win_info_ptr != iter.win_info_ptr)
	{
		/* 原来有活动窗口 */
		if(global_wm.active_win_info_ptr != NULL)
		{
			/* 发送激死消息给原来的活动窗口 */
			send_window_deactivate_message(&global_wm.active_app_info_ptr->uds, msg, (si_t)global_wm.active_win_info_ptr);
			/** 通知桌面 **/
			if(NULL != global_wm.desktop_app_ptr)
			{
				send_window_deactivate_message(&global_wm.desktop_app_ptr->uds, NULL,
					(si_t)object_get_root(OBJECT_POINTER(global_wm.active_win_info_ptr)));
			}
		}

		/* 将活动窗口移动到该用户应用程序的窗口向量的尾部 */
		vector_move_back(&(iter.app_info_ptr->window_info_vector), iter.win_index);

		/* 将活动程序移动到用户应用程序向量的尾部 */
		vector_move_back(&(global_wm.application_info_vector), iter.app_index);

		/* 将活动窗口作为父控件的长子控件 */
		object_move_first(OBJECT_POINTER(iter.win_info_ptr));

		/* 改变活动窗口 */
		global_wm.active_win_info_ptr = iter.win_info_ptr;
		global_wm.active_app_info_ptr = iter.app_info_ptr;

		send_window_activate_message(&global_wm.active_app_info_ptr->uds, msg, (si_t)iter.win_info_ptr);
		if(NULL != global_wm.desktop_app_ptr)
		{
			send_window_activate_message(&global_wm.desktop_app_ptr->uds, NULL, (si_t)iter.top_win_info_ptr);
		}
	}

	return 0;
}