2012-11-22 97 views
0

我正在C中使用GTK +編輯器。我添加了一個顯示當前行號和列表號在光標位置的功能。它的工作很好。但缺點是當我嘗試用箭頭鍵移動光標時,行號和列號不會更新。下面是我的代碼更新行號和列號在GTK文本緩衝區中檢測光標移動

update_statusbar(GtkTextBuffer *buffer,GtkStatusbar *statusbar) 
{ 
    gchar *msg; 
    gint row, col; 
    GtkTextIter iter; 

    gtk_statusbar_pop(statusbar, 0); 
    g_print("c"); 
    gtk_text_buffer_get_iter_at_mark(buffer, 
     &iter, gtk_text_buffer_get_insert(buffer)); 

    row = gtk_text_iter_get_line(&iter); 
    col = gtk_text_iter_get_line_offset(&iter); 

    msg = g_strdup_printf("Col %d Ln %d", col+1, row+1); 

    gtk_statusbar_push(statusbar, 0, msg); 

    g_free(msg); 
} 

int main (int argc, char *argv[]) 
{ 
. 
. 
. 
. 
. 
. 
    g_signal_connect(buffer, "changed", G_CALLBACK(update_statusbar), statusbar); 
    update_statusbar(buffer, GTK_STATUSBAR (statusbar)); 

} 

我想問題是「改變」的信號。由於光標用箭頭鍵移動,緩衝區不會被改變。所以任何人都可以建議我解決問題的更好方法。

在此先感謝:)。

+0

這種感覺是「這是我的代碼,爲我修好。」你有什麼嘗試?你怎麼知道這個問題在這塊代碼中? – Richard

+0

此代碼在緩衝區更改時工作良好。我的狀態欄中的行號和列號發生了變化。我提供我的代碼只是作爲我的問題的參考。 –

回答

0

有一個文本緩衝區信號列表here和一般窗口小部件信號列表here

後一個鏈接有一個信號叫key-release-event,你可能會覺得有趣。

+0

這解決了我的問題,謝謝:) –

0

這可能是做這份工作的最好方法。雖然GtKTextView上的move_cursor信號對於按鍵非常適用。它不響應基於鼠標點擊的光標位置更改。 GtKTextView上的通知信號適用於鼠標點擊,但在嘗試更新緩衝區的插入位置時會導致線程衝突。所以最好的辦法是將信號「notify :: cursor-position」直接關聯到GtKTextView後面的緩衝區。無需將信號關聯到GtKTextView。