wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在MS Windows上重用GTK中不同父级的模态对话框 – 破碎的焦点大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在重用GTK中的模态对话框 – 我使用gtk_window_set_transient_for设置它的父对话框,运行它,然后将它的父对象重置为另一个对话框并再次运行它. 在Linux上一切都很好,但在MS Windows上第二次显示此对话框时,所有GTK窗口都混淆了哪一个是活动的. 这是一个测试程序: #include <gtk/gtk.h> GtkWidget* main_window;@H_197_5@
我正在重用GTK中的模态对话框 – 我使用gtk_window_set_transient_for设置它的父对话框,运行它,然后将它的父对象重置为另一个对话框并再次运行它.

Linux上一切都很好,但在MS Windows上第二次显示此对话框时,所有GTK窗口都混淆了哪一个是活动的.

这是一个测试程序:

#include <gtk/gtk.h>

GtkWidget* main_window;

void run_reused_dialog(
    GtkWidget* reused_dialog,const gchar *parent_title,const gchar *reused_dialog_title
) {
    GtkWidget* parent_dialog = gtk_dialog_new_with_buttons(
        parent_title,GTK_WINDOW(main_window),GTK_DIALOG_MODAL,GTK_STOCK_OK,GTK_RESPONSE_ACCEPT,NULL
    );
    gtk_container_add(
        GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(parent_dialog))),gtk_label_new(parent_titlE)
    );
    gtk_widget_show_all(parent_dialog);
    gtk_dialog_run(GTK_DIALOG(parent_dialog));

    gtk_window_set_transient_for(GTK_WINDOW(reused_dialog),GTK_WINDOW(parent_dialog));
    gtk_window_set_title(GTK_WINDOW(reused_dialog),reused_dialog_titlE);
    GtkWidget* reused_dialog_label = gtk_label_new(GTK_WINDOW(reused_dialog)->titlE);
    gtk_container_add(
        GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(reused_dialog))),reused_dialog_label
    );
    gtk_widget_show_all(reused_dialog);
    gtk_dialog_run(GTK_DIALOG(reused_dialog));
    gtk_widget_hide(reused_dialog);
    gtk_container_remove(
        GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(reused_dialog))),reused_dialog_label
    );
    gtk_widget_hide(parent_dialog);
    gtk_widget_destroy(parent_dialog);
}

int main(int argc,char *argv[])
{
    gtk_init(&argc,&argv);
    main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(main_window,"delete-event",G_CALLBACK(gtk_main_quit),null);
    gtk_widget_show_all(main_window);

    /* This is a dialog which will be reused */
    GtkWidget* reused_dialog = gtk_dialog_new_with_buttons(
        "Reused dialog",NULL
    );
    gtk_container_add(
        GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(reused_dialog))),gtk_label_new(GTK_WINDOW(reused_dialog)->titlE)
    );

    /* Show first dialog which will display reused dialog */
    run_reused_dialog(
        reused_dialog,"First dialog. Click OK to display reused dialog","Reused dialog. Click OK to close"
    );

    /* Show second dialog which will display reused dialog */
    run_reused_dialog(
        reused_dialog,"Second dialog. Click OK to display reused dialog","Reused dialog. Switch to another application and switch BACk"
    );

    gtk_main();
    return 0;
}

显示“重用对话框.切换到另一个应用程序并切换回”对话框时,它会忽略鼠标,但会对键盘输入作出反应.有时切换到另一个应用程序并返回触发此问题.

问题:

>我做错了什么或者它是Windows GTK端口的错误
>如何在不使用每次使用时重新创建此对话框的情况下解决它?
>我是否可以重复使用GTK对话框?

带有所需GTK库的示例程序源和已编译的可执行文件here.这是使用i686-pc-mingw32-gcc gtk-reused-dialog.c进行交叉编译的.$(mingw32-pkg-config –cflags –libs gtk -2.0 )-mwindows在Fedora Linux 15上使用mingw32-gtk2包并安装了它的依赖项.

解决方法

这是我的猜测:

>问题与焦点攫取有关;
>窗口小部件仅在模态标志changes its state调用抓取API;
>平台之间的差异主要是由于实施细节;
>你不能只有一个模态窗口.

显示reused_dialog时,不清楚哪个对话框是模态的(parent_window仍然存活).

正确的解决方案:我怀疑如果您重构代码显示来自回调的reused_dialog(例如,使用response信号),您将获得所需的结果,因为这是通常的方法™.

如果您不想重构,可以尝试其中一种解决方案/解决方案(大致按照我认为更好的顺序):

>在运行之前,始终取消激活reused_dialog的模态状态; gtk_dialog_run()will set it再次触发请求:

...
gtk_window_set_modal(GTK_WINDOW(reused_dialog),falSE);
gtk_dialog_run(GTK_DIALOG(reused_dialog));
...

>在运行之前手动抓住reused_dialog中的焦点:

...
gtk_grab_add(reused_dialog);
gtk_dialog_run(GTK_DIALOG(reused_dialog));
...

>运行后取消激活parent_window的模态状态:

...
gtk_dialog_run(GTK_DIALOG(parent_dialog));
gtk_window_set_modal(GTK_WINDOW(parent_dialog),falSE);
...

大佬总结

以上是大佬教程为你收集整理的在MS Windows上重用GTK中不同父级的模态对话框 – 破碎的焦点全部内容,希望文章能够帮你解决在MS Windows上重用GTK中不同父级的模态对话框 – 破碎的焦点所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。