2015-05-04 79 views
1

我試圖將窗口標題與 按鍵上的窗口標籤交換。無效的UTF-8字符串

下面是我的代碼:

#include<gtk/gtk.h> 
static gboolean key_press_event(GtkWidget*,GdkEvent*,gpointer); 

    int main(int argv, char* argc[]) 
    { 
     GtkWidget *window,*label; 
     gtk_init(&argv,&argc); 
     window=gtk_window_new(GTK_WINDOW_TOPLEVEL); 
     gtk_window_set_title(GTK_WINDOW(window),"Sajith"); 
     gtk_widget_set_size_request(window,300,100); 
     label=gtk_label_new("Sam"); 
     gtk_label_set_selectable(GTK_LABEL(label),TRUE); 
     gtk_container_add(GTK_CONTAINER(window),label); 
     g_signal_connect(G_OBJECT(window),"key_press_event", 
         G_CALLBACK(key_press_event),label); 
     gtk_widget_show_all(window); 
     gtk_main(); 
    } 
    static gboolean key_press_event(GtkWidget* window, GdkEvent* event, gpointer label) 
    { 
     GtkWidget* newlabel; 
     newlabel=GTK_LABEL(label); 
     const gchar* wtitle=gtk_window_get_title(GTK_WINDOW(window)); 
     gtk_window_set_title(GTK_WINDOW(window),gtk_label_get_text(GTK_LABEL(newlabel))); 
     gtk_label_set_text(GTK_LABEL(newlabel),wtitle); 

     /* I am not sure if I could pass wtitle here*/ 
     return FALSE; 
    } 

在執行窗口標題被成功交換,但標籤是沒有的。 另外,我在終端上收到以下警告。

(2p1:12005): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text() 

任何幫助表示讚賞。

回答

3

gtk_window_get_title()返回窗口所擁有的靜態緩衝區。在調用gtk_window_set_title()之後,該緩衝區將被更改。

爲了實現你想要的,你應該在你的回調函數中創建一個字符串的副本。您可以使用strdup(),但它可能不適用於所有平臺。由於您使用的是依賴於GLib的GTK +,因此您可以使用g_strdup()。示例:

gchar* wtitle = g_strdup(gtk_window_get_title(GTK_WINDOW(window))); 

請記住在回調函數返回之前釋放它,並返回g_free(wtitle)

至於返回值,由於回調函數返回gboolean,所以不能返回wtitle。對於您的情況,我沒有看到返回TRUEFALSE之間的差異,因爲無論如何都沒有任何默認處理程序。如果您使用的是類似於GtkEntry的標籤,而不是標籤,那麼如果您不希望輸入內容中的文本被輸入密鑰替換,則會返回TRUE

+0

謝謝,這解決了這個問題。 – sjsam