GTK: как игнорировать ошибки не удается открыть?

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

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

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

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

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


person dsimcha    schedule 19.07.2010    source источник
comment
Я легко вижу разработчиков инструментария с графическим интерфейсом, даже не задумываясь о том, что кто-то захочет запустить приложение с графическим интерфейсом без графического интерфейса. Как правило, это не имеет смысла. На самом деле, я был бы больше удивлен, если бы это было возможно, чем если бы это было не так. Это было бы похоже на попытку запустить консольное приложение без stdin, stdout или stderr. Вещи просто не работают таким образом. Я понимаю, почему вы хотели бы этого при данных обстоятельствах, но вы делаете что-то в высшей степени ненормальное. Было бы гораздо разумнее изменить ваше приложение, чтобы просто пропустить графические элементы, если нет графического интерфейса (будь то с помощью флага командной строки или путем его обнаружения).   -  person Jonathan M Davis    schedule 21.07.2010
comment
@Johnathan: вместо этого я хотел бы изменить свое приложение, но это не кажется возможным, если не считать портирования моей графической библиотеки на совершенно другой графический бэкэнд (что может произойти в конечном итоге, но мне не хочется делать это в краткосрочной перспективе).   -  person dsimcha    schedule 21.07.2010


Ответы (2)


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

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

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

person ptomato    schedule 19.07.2010

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

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

  1. Включите туннелирование SSH X, передав флаг -X. В этом случае ваше приложение сможет использовать локальный X-сервер.
  2. Используйте Xvfb — это фиктивный X-сервер, который вообще не выводит, а вся графика хранится в памяти.
person el.pescado    schedule 20.07.2010
comment
Мне нужен Pixmap для рисования, но Pixbuf — это то, что нужно для сохранения. Есть ли где-нибудь Drawable, который является клиентской стороной и не требует экрана, который я могу использовать вместо Pixmap? - person dsimcha; 20.07.2010
comment
Возможен ли переход на графическую библиотеку, такую ​​как Cairo? - person el.pescado; 20.07.2010
comment
В конце концов, библиотека для построения графиков может быть перенесена в чистую графическую библиотеку, но даже в этом случае кажется глупым, что это не должно работать только с использованием GTK, и в краткосрочной перспективе переход на чистую графическую библиотеку не вариант, просто потому, что я не успеть это сделать. - person dsimcha; 20.07.2010