GTKのargv処理を使おうとしていますが、メインループに問題があるようです。
私の目標は、GTKがオプション(など--display
)を削除した後、ウィンドウを開く前にコマンドラインを解析することです。これは、アプリをCLIのみのインターフェイスでも使用できるようにし、両方のバリアントでGlibなどを使用するためです。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)