我正试图用gtkmm生成过程,但我遇到了一个问题。下面是我的代码片段:
std::vector<std::string> args, envp;
args.push_back("/usr/libexec/mc/ext.d/doc.sh");
args.push_back("open");
args.push_back("pdf");
envp.push_back("MC_EXT_FILENAME="DATADIR"/bsbguide.pdf");
Glib::spawn_async("", args, envp, Glib::SPAWN_SEARCH_PATH);`
任务是打开安装在DATADIR
中的pdf文件(这个变量是用automake定义的)。这个变量推入envp是必不可少的打开文件使用Midnight Commander的东西。命令
MC_EXT_FILENAME="some_file" /usr/libexec/mc/ext.d/doc.sh open pdf
将使用PDF查看器准确打开some_file
。
程序编译并工作,但是当我试图用这些函数调用程序时,我得到这个:
(zathura:3014): Gtk-WARNING **: cannot open display:
什么也没发生。同样的命令从控制台结果打开pdf文件与我的pdf查看器(Zathura)。我在Devhelp中发现了这个:
如果您正在编写一个GTK+应用程序,并且您正在生成的程序也是一个图形应用程序,那么您可能希望使用
gdk_spawn_on_screen()
来确保生成的程序在正确的屏幕上打开窗口。
但是我没有找到这样的函数。也许有一种更优雅、更正确的方法,可以用用户默认的PDF打开文件,而不需要MC部件?如果不是,我怎样才能使它工作?如果是没有gdk_spawn_on_screen
的c++风格就更好了。
所以,作为一个简单的解决方案,我发现是这样的代码
setenv("MC_EXT_FILENAME", DATADIR"/bsbguide.pdf", true);
Glib::spawn_command_line_async("/usr/libexec/mc/ext.d/doc.sh open pdf");