我想在C語言的Linux上使用Cairo圖形庫來製作一個非常輕量級的x11 GUI。開羅C程序不會畫到x11窗口
拼命跟隨woefully incomplete guide開羅給出了X11之後,這是我已經得到了最好:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <cairo.h>
#include <cairo-xlib.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
#include <X11/extensions/renderproto.h>
//This function should give us a new x11 surface to draw on.
cairo_surface_t* create_x11_surface(int x, int y)
{
Display* d;
Drawable da;
int screen;
cairo_surface_t* sfc;
if((d = XOpenDisplay(NULL)) == NULL)
{
printf("failed to open display\n");
exit(1);
}
screen = DefaultScreen(d);
da = XCreateSimpleWindow(d, DefaultRootWindow(d), 0, 0, x, y, 0, 0, 0);
XSelectInput(d, da, ButtonPressMask | KeyPressMask);
XMapWindow(d, da);
sfc = cairo_xlib_surface_create(d, da, DefaultVisual(d, screen), x, y);
cairo_xlib_surface_set_size(sfc, x, y);
return sfc;
}
int main(int argc, char** argv)
{
//create a new cairo surface in an x11 window as well as a cairo_t* to draw
//on the x11 window with.
cairo_surface_t* surface = create_x11_surface(300, 200);
cairo_t* cr = cairo_create(surface);
while(1)
{
//save the empty drawing for the next time through the loop.
cairo_push_group(cr);
//draw some text
cairo_select_font_face(cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
cairo_set_font_size(cr, 32.0);
cairo_set_source_rgb(cr, 0, 0, 1.0);
cairo_move_to(cr, 10.0, 25.0);
if((argc == 2) && (strnlen(argv[1], 100) < 50))
cairo_show_text(cr, argv[1]);
else
cairo_show_text(cr, "usage: ./p1 <string>");
//put the drawn text onto the screen(?)
cairo_pop_group_to_source(cr);
cairo_paint(cr);
cairo_surface_flush(surface);
//pause for a little bit.
int c = getchar();
//change the text around so we can see the screen update.
for(int i = 0; i < strnlen(argv[1], 100); i++)
{
argv[1][i] = argv[1][i + 1];
}
if(c == 'q')
{
break;
}
}
cairo_surface_destroy(surface);
return 0;
}
在已經安裝了開羅Linux系統,它可以與
編譯gcc -o myprog $(pkg-config --cflags --libs cairo x11) -std=gnu99 main.c
它應該用一個參數運行。
的原因,我不明白,在所有的,插入線
cairo_pop_group_to_source(cr);
cairo_paint(cr);
cairo_surface_write_to_png (surface, "hello.png"); //<--------- inserted
cairo_surface_flush(surface);
它將在屏幕上的東西,但也有2個問題:
- 文字,我用這種方法得出的持久,造成塗抹效應。
- 我不想在我的程序和x11窗口之間調解一些.png文件。數據應該直接發送!
你的問題在於你選擇開羅的後端。你可以選擇png,pdf,svg,或者你可以直接寫入gtk窗口(它看起來是你想要做的)。請參閱[**開羅教程 - zetcode **](http://zetcode.com/gfx/cairo/cairobackends/)中的示例以獲取每個示例。 –
對不起,我在這裏;我通常是嵌入式系統開發人員,我很少編寫Linux代碼。 gtk和x11有什麼區別? gtk聽起來比我讀過的更復雜。我不能直接寫入x11窗口:而不是「直接到gtk窗口」嗎? –
不用擔心,只需稍微放慢一點,然後完成教程並慢慢開始消化不同的功能。你在C學習的東西,記住它不是一場比賽,你急着飛過的細節 - 真的很重要,所以盡情享受騎行吧(不是比賽) –