如何在GTK的Entry和Textview组件中禁用emoji插入功能
GTK3 移除Entry/TextView右键菜单插入Emoji选项的方案
问题示意:
该Emoji插入功能是GTK 3.22及以上版本为文本输入组件内置的默认右键菜单项,可通过以下两种方案移除:
方案1:修改默认菜单(推荐,轻量化修改)
通过绑定组件的populate-popup信号,在默认菜单弹出前删除Emoji对应的菜单项,该方案不会影响原有其他默认菜单项的功能,且不受系统本地化语言影响。
C语言实现示例
- 绑定信号回调,GtkEntry和GtkTextView通用:
g_signal_connect(your_entry_widget, "populate-popup", G_CALLBACK(on_populate_popup), NULL); // GtkTextView绑定方式一致 // g_signal_connect(your_textview_widget, "populate-popup", G_CALLBACK(on_populate_popup), NULL);
- 实现回调函数:
static void on_populate_popup(GtkWidget *widget, GtkWidget *menu, gpointer user_data) { GList *menu_items = gtk_container_get_children(GTK_CONTAINER(menu)); for (GList *item = menu_items; item != NULL; item = item->next) { const gchar *action_name = gtk_widget_get_action_name(GTK_WIDGET(item->data)); // 插入Emoji菜单项对应的固定action名称为win.insert-emoji if (action_name && g_str_equal(action_name, "win.insert-emoji")) { gtk_widget_destroy(GTK_WIDGET(item->data)); break; } } g_list_free(menu_items); }
方案2:完全自定义右键菜单
如果本身就不需要GTK默认的右键菜单,可以直接拦截右键点击事件,弹出自定义菜单,自然不会出现Emoji插入选项:
static gboolean on_right_click(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { // 拦截鼠标右键点击 if (event->type == GDK_BUTTON_PRESS && event->button == GDK_BUTTON_SECONDARY) { // 此处弹出你自定义实现的GtkMenu即可 gtk_menu_popup(GTK_MENU(your_custom_menu), NULL, NULL, NULL, NULL, event->button, event->time); // 返回TRUE阻止事件继续传播,不会触发默认菜单逻辑 return TRUE; } return FALSE; } // 绑定信号 g_signal_connect(your_entry_widget, "button-press-event", G_CALLBACK(on_right_click), NULL);
其他语言参考(以Python PyGObject为例)
逻辑和C语言完全一致,绑定populate-popup信号删除对应菜单项即可:
def remove_emoji_menu(widget, menu): for item in menu.get_children(): if item.get_action_name() == "win.insert-emoji": item.destroy() break # GtkEntry绑定 entry.connect("populate-popup", remove_emoji_menu) # GtkTextView绑定 textview.connect("populate-popup", remove_emoji_menu)
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

