spice-gtk如何實現添加自己的界面

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章