我有一个GtkTextView
小部件,当用户右键单击某个单词时,我想显示一个自定义弹出菜单。为了显示适当的菜单,我需要知道该位置的单词。
如下所示:
我正在阅读文档,但我还没有找到方法。
有谁知道怎么做?
答案 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()
来检索布局相对于布局的位置小部件。