我正在使用C中的GTK +编辑器。我添加了一个在textview中显示光标位置的当前行号和列号的功能。它运作良好。但缺点是当我尝试使用箭头键移动光标时,行号和列号不会更新。以下是我更新行号和列号的代码
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 :(得分:3)
TextBuffer "cursor-position" property具有插入标记(aka游标)的缓冲区偏移量。与此属性更改对应的信号名为“notify :: cursor-position”,并且是defined in gobject的通知信号。
答案 1 :(得分:0)
有一个文本缓冲区信号列表here和一般小部件信号列表here。
后一个链接有一个名为key-release-event
的信号,你可能会感兴趣。
答案 2 :(得分:0)
这可能是完成这项工作的最佳方式。虽然GtKTextView上的move_cursor信号适用于按键。它不响应基于鼠标点击的光标位置更改。 GtKTextView上的通知信号适用于鼠标单击,但在尝试更新缓冲区的插入位置时会导致线程冲突。所以最好的方法是直接将信号“notify :: cursor-position”与GtKTextView后面的缓冲区相关联。无需将信号关联到GtKTextView。