spice-gtk如何实现添加自己的界面

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FlayHigherGT/article/details/84023252

spice-gtk-0.35是红帽的一款远程连接客户端,连接服务器的方式之前有讲到,今天讲一讲如何改造spice-gtk的源码能使spicy变成我们自己的界面。

原运行模式

首先我看一下spicy的运行方式,毋庸置疑main函数开始看起,main函数在spice-gtk-0.35/tools/spicy.c里面,下面是spicy

https://blog.csdn.net/FlayHigherGT/article/details/83780686

main函数的流程分析,主函数通过一系列的设置参数读配置文件后(命令行设置参数或者图形界面设置参数),开始创建连接对象,进行连接。connection_connect(conn)就是连接的函数,g_main_loop_run(mainloop)使程序睡眠,那么很重要的是,什么时候使用

    connection_connect(conn);
    if (connections > 0)
        g_main_loop_run(mainloop);
    g_main_loop_unref(mainloop);

g_main_loop_quit退出主函数的睡眠呢?答案在这里:

static void connection_destroy(spice_connection *conn)
{
    g_object_unref(conn->session);
    g_hash_table_unref(conn->transfers);
    g_free(conn);

    connections--;
    SPICE_DEBUG("%s (%d)", __FUNCTION__, connections);
    if (connections > 0) {
        return;
    }

    g_main_loop_quit(mainloop);
}

很简单的发现,这是程序的最后阶段,所有的对象已经释放掉了,最后进行g_main_loop_quit(mainloop),主程序就会结束,整个软件就结束了。那么我们现在需要实现spicy生成一个我们自己的界面,在界面中我们可以做任何事情,比如收集我们需要的参数啊,实现我们自己的功能。

添加我们的界面

很简单在connection_connect(conn);之前将我们的界面实现好,并且完成程序的停止,他原来的main_loop都去掉,我们不需要他的main_loop,在我们的界面程序中执行main_loop就好了,把connection_connect(conn);这一步放到我们的界面中去实现,界面中手机满参数之后设置好参数之后,我们进行连接,把之前g_main_loop_run(mainloop);之后的一些释放内存的代码放到static void connection_destroy(spice_connection *conn)中间的main_loop_quit后面,当然main_loop_quit现在也不需要了。

这样spicy一开始就是我们自己的界面,某些按钮实现收集参数,收集完之后,当实现某些按钮的点击——就进行connection_connect(conn);退出的时候还是原来的connection_destroy,销毁连接,之后还是回到我们的界面。

注意:

中间遇到一个问题,在退出连接的时候如果程序不结束而回到我们的界面,他是其实是已经断开连接了,只是并没有销毁window窗口,需要我们自己来完成。因为我们一般连接都只有一个窗口,所以下面程序都会走到win->monitor_id == 0这一步,而这一步他不会del_window()销毁窗口,他只是用结束主程序来结束所有的东西,而我们并不需要结束主程序,所以我们需要自己加一步销毁窗口,只有退出连接之后就不会有任何残留了。

static gboolean delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    SpiceWindow *win = data;

    if (win->monitor_id == 0)
        del_window(win->conn, win);//+++添加+++
        connection_disconnect(win->conn);
    else
        del_window(win->conn, win);

    return true;
}

猜你喜欢

转载自blog.csdn.net/FlayHigherGT/article/details/84023252