我正在尝试用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)窗口。
1条答案
按热度按时间zmeyuzjn1#
我也遇到了同样的问题,并找到了一个解决这个问题的方法。Null parent在这里不是真正的问题,而是缺乏事件调度,所以我添加了: