Beispiel #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;
}
static si_t handle_minimize_button_release(union message* msg)
{
	struct object* tree = NULL;
	struct object* node = NULL;
	int i = 0, j = 0;
	struct window_info_iterator iter;
	/* 不能最小化或不在活动窗口的最小化按钮内释放 */
	if(global_wm.active_win_info_ptr->minimize_enable != 1
		|| !is_point_in_area(&(msg->mouse.cursor_position), &(global_wm.active_win_info_ptr->minimize_button_area)))
	{
		return 0;
	}

	/**
	 * send minmize msg to every client window(including subwindows)
	 **/
	tree = object_get_root(OBJECT_POINTER(global_wm.active_win_info_ptr))->parent;
	node = tree->lchild;
	while(node != NULL)
	{
		EGUI_PRINT_INFO("send minimized msg to %s", ((struct window_info*)node)->title);
		send_window_minimize_message(&global_wm.active_app_info_ptr->uds, msg, (si_t)node);
		node = object_tree_iterator_increment(tree, node);
	}

	/**
	 * send deactive msg to client
	 **/
	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)tree->parent);
	}

	window_info_iterator_clear(&iter);
	/* get next active window and application */
	if(all_app_traversal_decrement(&iter, _do_find_next_active_window, tree->parent))
	{
		global_wm.active_win_info_ptr = iter.win_info_ptr;
		global_wm.active_app_info_ptr = iter.app_info_ptr;
	}
	else
	{
		global_wm.active_win_info_ptr = NULL;
		global_wm.active_app_info_ptr = NULL;
		return 0;
	}

	/**
	 * 获得顶层窗口
	 **/
	node = object_get_root(OBJECT_POINTER(global_wm.active_win_info_ptr));
	/**
	 * move next active window back
	 **/
	i = application_info_get_win_index(global_wm.active_app_info_ptr, (struct window_info*)node);
	j = window_manager_get_app_index(global_wm.active_app_info_ptr);
	vector_move_back(&(global_wm.active_app_info_ptr->window_info_vector), i);
	vector_move_back(&(global_wm.application_info_vector), j);

	/**
	 * send active msg
	 **/
	send_window_activate_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_activate_message(&global_wm.desktop_app_ptr->uds, NULL, (si_t)node);
	}

	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;
}