我正在尝试使用 GTK 的 argv 处理,但主循环似乎存在一些问题。
--display
我的目标是在GTK 删除其选项(如这就是我试图在command_line
信号处理程序中打开窗口的原因。
这按预期工作,在窗口关闭时退出。
#include <gtkmm.h>
int main(int argc, char **argv) {
auto app = Gtk::Application::create(argc, argv, "my.app");
Gtk::ApplicationWindow win;
return app->run(win);
}
但是简单地添加HANDLES_COMMAND_LINE
标志会破坏:该窗口永远不会显示。
#include <gtkmm.h>
int on_cmd(const Glib::RefPtr<Gio::ApplicationCommandLine> &) {
return 0;
}
int main(int argc, char **argv) {
auto app = Gtk::Application::create(argc, argv, "my.app",
Gio::APPLICATION_HANDLES_COMMAND_LINE);
app->signal_command_line().connect(sigc::ptr_fun(on_cmd), false);
Gtk::ApplicationWindow win;
return app->run(win);
}
所以我认为command_line
处理程序实际上不应该返回?但是文档说run
启动了主循环。我还没有找到一个简单地等待主循环完成的方法,所以我手动启动它。窗口再次显示,但当然循环一旦关闭就会继续,这是该代码的最小问题:
#include <gtkmm.h>
int on_cmd(const Glib::RefPtr<Gio::ApplicationCommandLine> &,
Glib::RefPtr<Gtk::Application> &app) {
Gtk::ApplicationWindow win(app);
// app->run(win); --- lands here again -> stack overflow.
win.show();
// This looks very wrong but seems to work?!
while(true)
Glib::MainContext::get_default()->iteration(true);
// never reach this
return 0;
}
int main(int argc, char **argv) {
auto app = Gtk::Application::create(argc, argv, "my.app",
Gio::APPLICATION_HANDLES_COMMAND_LINE);
app->signal_command_line().connect(
sigc::bind(sigc::ptr_fun(on_cmd), app), false);
return app->run();
}
(gtkmm-3.0 版本 3.5.13)