0

我正在使用 C 语言编写 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));

}

我想问题出在“改变”的信号上。由于光标是用箭头键移动的,所以缓冲区不会改变。所以任何人都可以建议我一个更好的方法来解决这个问题。

提前致谢 :)。

4

3 回答 3

4

TextBuffer “光标位置”属性具有插入标记(又名光标)的缓冲区偏移量。与该属性变化对应的信号被命名为“notify::cursor-position”,并且是在 gobject 中定义的通知信号。

于 2012-11-23T03:30:19.410 回答
0

这可能是完成这项工作的最佳方式。虽然 GtKTextView 上的 move_cursor 信号很适合按键操作。它不响应基于鼠标单击的光标位置更改。GtKTextView 上的通知信号适用于鼠标单击,但在尝试更新缓冲区的插入位置时会导致线程冲突。所以最好的办法是直接将信号“notify::cursor-position”关联到GtKTextView后面的缓冲区。无需将信号关联到 GtKTextView。

于 2014-10-23T16:52:14.397 回答
0

这里有一个文本缓冲区信号列表,这里有一个通用小部件信号列表。

后一个链接有一个名为的信号key-release-event,您可能会觉得它很有趣。

于 2012-11-22T19:42:12.763 回答