コード例 #1
0
ファイル: application.c プロジェクト: FangKuangKuang/egui
/* XXX Not using */
si_t application_quit()
{
    si_t i, n;
    struct object * addr;

    /* 有多少个窗口 */
    n = vector_size(&(global_application.window_vector));

    /* 依次删除窗口 */
    for(i = n - 1; i >= 0; -- i)
    {
        addr = vector_at(&global_application.window_vector, i);

        /*
           这里没有逐个注销窗口类对象或者它的派生类对象。
           因为窗口管理程序收到用户应用程序的退出请求后,
           会释放关于这个用户应用程序的所有资源。
           */

        /* 释放这棵树 */
        object_tree_free(addr->parent);

        /* 从窗口向量中删除这个节点 */
        vector_erase(&global_application.window_vector, i);
    }

    vector_exit(&global_application.window_vector);

	event_listener_exit(&global_application.app_event_listener);
    uds_exit(&global_application.uds);

	free(global_application.name);

    return 0;
}
コード例 #2
0
ファイル: object.c プロジェクト: virajs/egui
si_t object_tree_free(struct object * root)
{
    /* 释放左子树 */
    if(root->lchild != NULL)
    {
        /* root->lchild 左子节点的地址 */
        object_tree_free(root->lchild);
    }

    /* 释放右子树 */
    if(root->rchild != NULL)
    {
        /* root->rchild 右子节点的地址 */
        object_tree_free(root->rchild);
    }

    /* root->node.data 与 root 的值一样 */
    free(root);

    return 0;
}
コード例 #3
0
ファイル: application.c プロジェクト: FangKuangKuang/egui
si_t application_exit()
{
    struct object * addr;
    si_t i, n;

    /**
     * release focus list
     **/
    list_exit(&(global_application.focus_list));

    /* 有多少个窗口 */
    n = vector_size(&(global_application.window_vector));

    /* 依次删除窗口 */
    for(i = n - 1; i >= 0; -- i)
    {
        addr = vector_at(&(global_application.window_vector), i);

        /*
            这里没有逐个注销窗口类对象或者它的派生类对象。
            因为窗口管理程序收到用户应用程序的退出请求后,
            会释放关于这个用户应用程序的所有资源。
        */

        /* 释放这棵树 */
        object_tree_free(addr->parent);

        /* 从窗口向量中删除这个节点 */
        vector_erase(&(global_application.window_vector), i);
    }

    vector_exit(&(global_application.window_vector));

	if(0 != cancel_application())
	{
		EGUI_PRINT_ERROR("failed to cancle application");
	}

	event_listener_exit(&global_application.app_event_listener);
	queue_exit(&global_application.message_queue);
    uds_exit(&global_application.uds);

	free(global_application.name);
    free(global_application.icon_root_path);

    term_restore();

    return 0;
}
コード例 #4
0
ファイル: object.c プロジェクト: FangKuangKuang/egui
int main()
{
    srand(time(NULL));
    while (1) {
        ui_t count;
        struct node_t *tree = NULL;
        if(scanf("%lu", &count)==EOF) {
            break;
        }
        tree = random_tree(count);
        print_tree(tree);
        object_tree_free(OBJECT_POINTER(tree));
    }
    return 0;
}
コード例 #5
0
ファイル: object.c プロジェクト: virajs/egui
/*
    如果 obj 有左子节点
    那么这个左子节点并不是 obj 子对象
    所以在析构以 obj 为根的树之前一定要要将 obj->lchild 成员清空

    如果 obj 在对象树中
    那么完成删除工作后一定要更新 root->parent 的 lchild 成员和 rchild 成员
    这是为了保证遍历的正确
*/
si_t object_remove(struct object * obj)
{
    struct object * tree;

    /* obj 有父对象 */
    if(obj->parent != NULL)
    {
        /* 找到这棵树根节点的父节点 */
        /* 没有的话 tree == NULL */
		tree = object_get_root(obj)->parent;

        /* obj 是由父节点右子节点 */
        if(obj == obj->parent->rchild)
        {
            /* obj 没有左子节点 */
            /* parent 的下一层对象只有 obj */
            if(obj->lchild == NULL)
            {
                /* 清除父节点中的指针 */
                obj->parent->rchild = NULL;
            }
            /* obj 有左子节点 */
            /* parent 的下一层有多个对象 */
            else
            {
                /* 处理 obj 同层的对象 */
                obj->parent->rchild = obj->lchild;
                obj->lchild->parent = obj->parent;

                /* 清空 obj->lchild */
                obj->lchild = NULL;
            }
        }
        /* obj 是由父节点左子节点 */
        /* 此时 parent 的下一层有多个对象 */
        else if(obj == obj->parent->lchild)
        {
            /* obj 没有左子节点 */
            /* obj 处于末端 */
            if(obj->lchild == NULL)
            {
                /* 清除父节点中的指针 */
                obj->parent->lchild = NULL;
            }
            /* obj 有左子节点 */
            /* obj 处于中间 */
            else
            {
                /* 处理 obj 同层的对象 */
                obj->parent->lchild = obj->lchild;
                obj->lchild->parent = obj->parent;

                /* 清空 obj->lchild */
                obj->lchild = NULL;
            }
        }

        /* 删除 obj 以及它的所有子对象 */
        object_tree_free(obj);

        /* obj 在对象树中 */
        /* 必须更新 root->parent 节点的 lchild 成员和 rchild 成员 */
        /* 此时 tree == root->parent */
        if(tree != NULL)
        {
            /* 更新最左边节点 */
            tree->lchild = object_tree_l_most_node(tree->parent);
            /* 更新最右边节点 */
            tree->rchild = object_tree_r_most_node(tree->parent);
        }
    }
    /* 没有父对象 */
    else
    {
        /* 清空 obj->lchild */
        obj->lchild = NULL;

        /* 删除 obj 以及它的所有子对象 */
        object_tree_free(obj);
    }

    return 0;
}