Как создать графическую программу с помощью gtkmm

Я пытаюсь создать процесс с помощью 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);`

Задача состоит в том, чтобы открыть файл PDF, который установлен в DATADIR (эта переменная определяется с помощью automake). Эта переменная, помещенная в envp, необходима для открытия файла с помощью средств Midnight Commander. Команда

MC_EXT_FILENAME="some_file" /usr/libexec/mc/ext.d/doc.sh open pdf 

точно откроет some_file с помощью программы просмотра PDF.

Программа компилируется и работает, но когда я пытаюсь вызвать программы с этими функциями, я получаю следующее:

(zathura:3014): Gtk-WARNING **: cannot open display:

и ничего не происходит. Та же команда из консоли приводит к открытию файла PDF с помощью моей программы просмотра PDF (Zathura). Я нашел это в Devhelp:

Если вы пишете приложение GTK+, а создаваемая вами программа также является графическим приложением, то вместо этого вы можете использовать gdk_spawn_on_screen(), чтобы убедиться, что порожденная программа открывает свои окна на правильном экране.

Но такой функции я не нашел. Может быть есть более изящный и правильный способ открыть файл с пользовательским PDF по умолчанию, вьювером без частей MC? Если нет, то как я могу заставить это работать? Еще лучше, если это будет в стиле C++ без gdk_spawn_on_screen.


person Nikita    schedule 26.05.2014    source источник
comment
Но такой функции я не нашел. Это связано с тем, что gdk_spawn_on_screen() устарело в GTK+/GDK версии 2 и полностью удалено в версии 3. Документация GLib, которую вы процитировали, чрезвычайно устарела и нуждается в исправлении; для этого существует существующий отчет об ошибке. Настоящая замена теперь состоит в том, чтобы использовать GAppInfoContext, GdkAppInfoContext или, по крайней мере, установить DISPLAY env var перед созданием, если вы обнаружите, что это необходимо (что может зависеть от ОС).   -  person underscore_d    schedule 28.07.2017


Ответы (1)


Итак, в качестве простого обходного пути я нашел такой код

setenv("MC_EXT_FILENAME", DATADIR"/bsbguide.pdf", true);
Glib::spawn_command_line_async("/usr/libexec/mc/ext.d/doc.sh open pdf");
person Nikita    schedule 27.05.2014