1. 程式人生 > >spice-gtk如何實現新增自己的介面

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