如何捕获在GTK中进行右键单击的单词?

时间:2014-02-10 22:58:00

标签: c gtk

我有一个GtkTextView小部件,当用户右键单击某个单词时,我想显示一个自定义弹出菜单。为了显示适当的菜单,我需要知道该位置的单词。

如下所示: enter image description here

我正在阅读文档,但我还没有找到方法。

有谁知道怎么做?

2 个答案:

答案 0 :(得分:2)

我通过将button-press-event信号从GtkTextView连接到创建菜单的函数来实现它

g_signal_connect(text_view, "button-press-event", G_CALLBACK(right_click_menu), NULL);

处理菜单创建的功能会在预期按钮未生成时忽略该事件(右键单击)

if(event->button.button != 3)
    return FALSE;

获取该字词只需使用gtk_text_view_window_to_buffer_coords传递的坐标调用GdkEvent

int x, y;
gtk_text_view_window_to_buffer_coords(  GTK_TEXT_VIEW(text_view),
                                        GTK_TEXT_WINDOW_WIDGET,
                                        event->button.x,
                                        event->button.y,
                                        &x,
                                        &y                      );

并要求使用

的迭代器
GtkTextIter iter;
gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(text_view), &iter, x, y);

然后使用GtkTextIter函数(https://developer.gnome.org/gtk3/stable/GtkTextIter.html)来确定单词边界。

答案 1 :(得分:1)

GTK +使用Pango库进行文本布局。 Pango API提供函数pango_layout_xy_to_index(),当给定布局内的坐标时,将为您提供创建布局的文本中的字节索引。

通过这些信息,您可以通过向前/向后搜索相应的标点来识别给定角色所在的单词。

如果您使用GtkEntry作为窗口小部件,然后将鼠标坐标从点击转换为布局坐标,则需要使用gtk_entry_get_layout_offsets()来检索布局相对于布局的位置小部件。