GTK: Как игнорировать ошибки "не могу открыть дисплей"?

Я написал несколько GTK-программ, использующих привязки gtkD для языка программирования D, которые в противном случае являются консольными приложениями, но способны отображать графики на экране и сохранять их в файл. Я хотел бы запустить их на компьютере, к которому у меня есть только SSH-доступ на консоли, что означает, что графики не будут отображаться на экране, а будут записываться в файлы.

Когда я вызываю Main.init(), я получаю Gtk-WARNING **: не могу открыть дисплей, как и ожидалось. Когда я вместо этого вызываю Main.initCheck() и игнорирую ошибки, я просто получаю больше ошибок позже при выполнении, связанных с отсутствием экрана.

Есть ли какой-нибудь простой способ заставить мою программу игнорировать тот факт, что экран недоступен, делать все его экранные рисунки на каком-то фиктивном устройстве (графический эквивалент /dev/null) и все же фактически рисовать в Pixmaps и Pixbufs (необходимо для сохранение графиков в файлы) и запускать части приложения без использования графического интерфейса?

Редактирование: В случаях, когда приложение запускает окно и блокирует цикл обработки событий, идеальным вариантом было бы немедленно закрыть окно (или не открыть его в первую очередь) и продолжить запуск деталей, не основанных на графическом интерфейсе. программы. Если это невозможно, я могу обойти это, убедившись, что я не запускаю никаких окон.

Кроме того, похоже, что Pixbufs и Pixmaps не работают без экрана. Я пробовал рисовать в Pixmap, создавая из этого Pixbuf и сохраняя результаты в файл, либо после вызова Main.checkInit() и игнорирования ошибок, либо без оператора init, либо GTK жалуется на отсутствие экрана.

2 ответа

Я считаю, что самое простое решение заключается в использовании только GdkPixbuf s для обработки ваших участков; насколько я знаю, gdk-pixbuf библиотека работает только с pixbufs в памяти и не нуждается в оконной системе. Держите обработку и отображение частей вашего кода строго разделенными. Если вы делаете это, не должно иметь значения, что нет экрана. Вы даже можете сделать параметр командной строки, чтобы отключить рисование на экране.

Вы также можете использовать GtkOffscreenWindow но это было доступно только после GTK 2.20, и, насколько я могу судить, привязки D покрывают только до 2.18.

В качестве альтернативы вы можете использовать переадресацию X в сеансе SSH; использование -X или же -Y в вашей командной строке SSH. См. Ваше руководство по SSH для получения дополнительной информации. Если вы используете X-сервер на компьютере, с которого вы работаете по SSH, графики могут отображаться на экране вашего локального компьютера.

Pixmaps не будут работать без сервера - они по определению (в терминологии X) являются ресурсами изображений, хранящимися на X сервере. Однако Pixbuf хранятся в клиентском приложении и должны работать без X.

Если вам нужны Pixmaps, но вы не хотите графику, у вас есть два варианта:

  1. Включить SSH X туннелирование, передав -X флаг. В этом случае ваше приложение сможет использовать локальный X-сервер.
  2. Используйте Xvfb - это фиктивный X-сервер, который вообще не выводит, а вся графика хранится в памяти.
Другие вопросы по тегам