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_widget_draw (widget_ptr, cairo_ctx_ptr);
нарисовать виджет (или иерархию виджетов) в контексте Cario?
Ответ на оба ваших вопроса заключается в том, что вы не можете запускать приложения GTK + без какого-либо вывода. Вы используете gtk-x11, который требует XServer. Возможно, вам повезет с бэкэндом DirectFB, но я бы не стал задерживать дыхание, поскольку не знаю, поддерживается ли он вообще.
Поскольку Gtk не работает без XServer, полученное изображение пусто.