Попытка визуализировать GTK + окно для изображения

GTK использует Каир для рисования. Поэтому я пытаюсь создать приложение hello world, которое пишет в изображение (svg, png, …) вместо X11. Я сталкиваюсь с 2 проблемами:
— изображение пустое
— При запуске без запуска X11 (что является реальной целью) я получаю сообщение об ошибке «** (a.out: 9021): ПРЕДУПРЕЖДЕНИЕ **: Не удалось открыть дисплей X»

Кодекс черновик!

#include <string>
#include <iostream>
#include <thread>
#include <chrono>
#include <cmath>

#include <cairo.h>
#include <cairommconfig.h>
#include <cairomm/context.h>
#include <cairomm/surface.h>
#include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>

int main(int argc, char *argv[])
{

gtk_init(&argc, &argv);
GtkWidget *window;
GtkWidget *button;
//   GtkWidget *main_window = gtk_initialize();

window = gtk_offscreen_window_new();

button = gtk_button_new_with_label ("Hello World");
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show  (window);
GdkWindow *gdk_window = gtk_widget_get_window(GTK_WIDGET(window));
std::cout << "gdk window: " << gdk_window << std::endl;
cairo_surface_t * surfp =  gdk_offscreen_window_get_surface(gdk_window);
std::cout << "Created Window will now draw to png" << std::endl;

std::string filename = "image.svg";
double width = 600;
double height = 400;

Cairo::SvgSurface srfobj(surfp);

Cairo::RefPtr<Cairo::SvgSurface> refptr(&srfobj);

Cairo::RefPtr<Cairo::Context> cr = Cairo::Context::create(refptr);

cr->save(); // save the state of the context
cr->show_page();

std::cout << "Wrote SVG file \"" << filename << "\"" << std::endl;
std::chrono::milliseconds dura( 200 );
std::this_thread::sleep_for(dura);

return 0;
}
  • Почему этот код не работает?
  • Могу ли я запустить приложение GTK без запуска X11, или я должен просто игнорировать предупреждение?

1

Решение

Другие решения

Ответ на оба ваших вопроса заключается в том, что вы не можете запускать приложения GTK + без какого-либо вывода. Вы используете gtk-x11, который требует XServer. Возможно, вам повезет с бэкэндом DirectFB, но я бы не стал задерживать дыхание, поскольку не знаю, поддерживается ли он вообще.

Поскольку Gtk не работает без XServer, полученное изображение пусто.

1

По вопросам рекламы [email protected]