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

lymnna71  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(337)

我正在尝试用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;
            }
        }
    });

这会打开一个打开文件的对话框,但是因为我没有指定父窗口,所以主窗口仍然可以被聚焦,另一个问题是,由于某种原因,即使我调用gtk_widget_destroy(dialog),对话框也不会关闭。
我已经看了一下this post,但唯一的答案似乎是获得文件对话框窗口的xid,这不是我想做的。
This谷歌搜索结果似乎也没有帮助,因为它在默认显示上创建了一个全新的gdk(而不是gtk)窗口。

zmeyuzjn

zmeyuzjn1#

我也遇到了同样的问题,并找到了一个解决这个问题的方法。Null parent在这里不是真正的问题,而是缺乏事件调度,所以我添加了:

gtk_widget_destroy(dialog);
while (g_main_context_iteration(nullptr, false));

相关问题