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