2012-11-22 55 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。