Каир х11 ничего не отображает - PullRequest
0 голосов
/ 14 декабря 2018

Я работал с Cairo и X11 раньше, и у меня был кусок кода, работающий отлично, и сейчас я разрабатываю новый проект (который должен быть караоке), и я взял кусок кода, который использовался для отображения чего-тона экране, который работал над старым проектом, но больше не работает.Я весь день искал ошибку и, должно быть, что-то упустил, потому что ничего не работает.Код следующий:

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

void display_line(cairo_surface_t *surface, lyrics_line l)
{
   cairo_t *cr;
   cr=cairo_create(surface);
   cairo_set_source_rgb(cr, 0, 0, 0); // Should paint the window black
   cairo_paint(cr);
   cairo_set_source_rgb(cr, 1., 1., 1.);
   cairo_select_font_face(cr, "Hacker", CAIRO_FONT_SLANT_NORMAL,CAIRO_FONT_WEIGHT_BOLD);
   cairo_set_font_size(cr, 13);
   cairo_move_to(cr, 620, 30);
   char text[255];
   strcpy(text, l.text);
   cairo_show_text(cr, text);  // Should print the text in white
   cairo_destroy(cr);
   printf("%s\n", text);
}

И основная функция, которая вызывает предыдущий,

void display(song s)
{
   // X11 display
   Display *dpy;
   Window rootwin;
   Window win;
   int scr;
   // init the display
   if(!(dpy=XOpenDisplay(NULL))) {
       fprintf(stderr, "ERROR: Could not open display\n");
       exit(1);
   }
   scr=DefaultScreen(dpy);
   rootwin=RootWindow(dpy, scr);
   win=XCreateSimpleWindow(dpy, rootwin, 1, 1, WINSIZEX, WINSIZEY, 0, BlackPixel(dpy, scr), BlackPixel(dpy, scr));
   XStoreName(dpy, win, "Karaoke");
   KeyPressMask|ButtonPressMask|ExposureMask);
   XMapWindow(dpy, win);
   // create cairo surface
   cairo_surface_t *cs;
   cs=cairo_xlib_surface_create(dpy, win, DefaultVisual(dpy, 0), WINSIZEX, WINSIZEY);
   cairo_t *cr;
   cr=cairo_create(cs);
   cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
   cairo_paint(cr);    // Should fill the window in blue
   cairo_destroy(cr);
   int i;
   printf("\n");
   lyrics_line l = {"That's a test", 200};
   display_line(cs, l);
   usleep(s.text[0].length*10000);
   for(i=0; i<s.length; i++)
     {
       display_line(cs, s.text[i]);
       usleep((s.text[i+1].length - s.text[i].length)*10000);
     }
   cairo_surface_destroy(cs); // destroy cairo surface
   XCloseDisplay(dpy); // close the display
 }

Я не знаю, вызывает ли display_line проблему, потому что, когда я просто пытаюсь закрасить окно синим цветом с display, оно даже не работает.Тем не менее, текст do отображается в консоли, поэтому алгоритм не является проблемой.

Чего мне не хватает?

Заранее спасибо.

...