如何从X11窗口句柄创建gtk窗口句柄

问题描述

我正在尝试使用GLFW窗口打开gtk文件对话框窗口。 现在,由于GLFW是一个相当低级的API,它仅公开X11窗口和显示,因为它只是创建了一个没有GUI内容的窗口。

我遇到的问题是gtk_file_chooser_dialog_new()希望传递父窗口,但是由于我只有X11句柄,因此我不确定如何从中创建GTK句柄。

我遵循了this教程,产生了以下代码

    glfwSetKeyCallback(windowHandle1,[](GLFWwindow *window,int keyCode,int scanCode,int action,int mods) {
        if (action == GLFW_PRESS)
        {
            if (keyCode == GLFW_KEY_O && mods == (GLFW_MOD_SHIFT | GLFW_MOD_CONTROL))
            {
                GtkWidget *dialog;
                GtkFileChooserAction fileAction = GTK_FILE_CHOOSER_ACTION_OPEN;
                gint res;

//              Window x11Window = glfwGetX11Window(window);
//              display *x11display = glfwGetX11display();

                int argc = 0;
                gtk_init(&argc,nullptr);  // Todo: don't do this every time

                dialog = gtk_file_chooser_dialog_new("Open File",nullptr,// should be _GtkWindow of the GLFWwindow
                                                     fileAction,_("_Cancel"),GTK_RESPONSE_CANCEL,_("_Open"),GTK_RESPONSE_ACCEPT,nullptr);

                res = gtk_dialog_run(GTK_DIALOG(dialog));
                if (res == GTK_RESPONSE_ACCEPT)
                {
                    char *filename;
                    GtkFileChooser *chooser = GTK_FILE_CHOOSER(dialog);
                    filename = gtk_file_chooser_get_filename(chooser);
                    std::cout << filename << std::endl;
                    g_free(filename);
                }

                gtk_widget_destroy(dialog);
                std::cout << "destroyed file dialog" << std::endl;
            }
        }
    });

这将打开一个打开的文件对话框,但是因为我没有指定父窗口,所以主窗口仍然可以聚焦,并且另一个问题是即使我调用{{1} }。

我已经看过this帖子,但是唯一的答案似乎是获取文件对话框窗口的xid,这不是我想要的。

This谷歌搜索结果似乎也无济于事,因为它会在显示屏幕上创建一个全新的gdk(而非gtk)窗口。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)