如何禁用GTK消息对话框拖放功能并移除关闭/最小化按钮
GTK模态MessageDialog禁用拖放、移除标题栏按钮方案
问题背景
需要实现仅含单个OK按钮的简易GTK消息对话框,初始创建代码如下:
widgetInfoDialog = gtk_message_dialog_new( NULL, GtkDialogFlags(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT), GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", sInfoTitle);
设置为模态后,常规的主窗口交互会被阻止,但用户仍然可以拖拽对话框内的文本,放置到主窗口的文本区域,效果如下:
需要实现两个需求:
- 禁用上述跨窗口文本拖放交互
- 移除对话框标题栏的关闭、最小化按钮
具体实现
GTK模态对话框仅会拦截常规鼠标、键盘输入事件,跨窗口拖放走独立的DND协议,不受模态状态限制,需要单独做配置,所有配置代码请在对话框调用gtk_widget_show_all()前添加。
1. 禁用文本拖放
GtkMessageDialog的消息文本由内部GtkLabel承载,只要禁用该标签的拖放源能力即可阻止文本被拖拽:
// 获取对话框的消息内容容器 GtkWidget *msgArea = gtk_message_dialog_get_message_area(GTK_MESSAGE_DIALOG(widgetInfoDialog)); // 遍历容器子控件找到承载文本的GtkLabel GList *children = gtk_container_get_children(GTK_CONTAINER(msgArea)); for (GList *it = children; it != NULL; it = it->next) { if (GTK_IS_LABEL(it->data)) { // 方案1:禁止文本选中,同时彻底禁用拖放(适合纯提示场景) gtk_label_set_selectable(GTK_LABEL(it->data), FALSE); // 方案2:保留文本选中复制能力,仅禁止拖拽,替换方案1即可 // gtk_drag_source_unset(it->data); } } g_list_free(children);
2. 移除标题栏关闭、最小化按钮
通过GDK窗口属性配置,告知窗口管理器仅保留窗口移动能力,其余功能按钮会自动被移除:
// 连接realize信号,等窗口底层GDK对象创建完成后再设置属性 g_signal_connect(widgetInfoDialog, "realize", G_CALLBACK(+[](GtkWidget *dialog, gpointer user_data){ GdkWindow *win = gtk_widget_get_window(dialog); // 仅允许移动窗口,移除关闭、最小化、最大化、调整大小的所有按钮和功能 gdk_window_set_functions(win, GDK_FUNC_MOVE); }), NULL);
如果需要保留窗口大小调整能力,可以将GDK_FUNC_MOVE替换为GDK_FUNC_MOVE | GDK_FUNC_RESIZE。
内容的提问来源于stack exchange,提问作者D.Caj
相关产品推荐
相关产品推荐

