2015-03-01 4 views

ответ

1

Одна очевидная ошибка в том, что вы не выбрали ExposureMask в вызове XSelectInput, так что вы не будете получать Expose события вы ждали.

Другой возможной проблемой является не задание цвета чертежа переднего плана GC по XSetForegroundColor, по умолчанию черный. И использование по умолчанию gc экрана может завершиться неудачно, если окно имеет разную глубину цвета или различную визуальную. Другими важными атрибутами GC являются subwindow_mode (нужно ли рисовать дочерние окна).

По-прежнему, после выполнения этих изменений программа работает только для меня (рисует прямоугольник) в корневом окне и xev, но не для xterm, не выставляет события.

Это моя неподвижная версия:

#include <X11/Xlib.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
int main (int argc, char *argv[]){ 

     Window win; 
     Display *display; 
     XEvent e; 
     display = XOpenDisplay(NULL); 
if(display==NULL){ 
     fprintf(stderr,"Cannot open Display\n"); 
exit(1); 
} 
     int s = DefaultScreen(display); 
     //unsigned long *id = (unsigned long*)(argv[1]); 
     sscanf(argv[1], "0x%x", &win); 
     if(!XSelectInput(display,win,StructureNotifyMask | ExposureMask)){ 
       fprintf(stderr,"Cannot select Display\n"); 
     return -1; 
     } 
     if(!XMapWindow(display,win)){ 
       fprintf(stderr,"Cannot map Display\n"); 
     return -1; 
     } 

     XGCValues gcv; 
     gcv.subwindow_mode = IncludeInferiors; 
     GC gc = XCreateGC(display, win, GCSubwindowMode, 
      &gcv); 
     XSetForeground(display, gc, 0xff00ff00); 
     XSetPlaneMask(display, gc, 0xffffffff); 

     while (1) { 
      puts("waiting for event\n"); 
      XNextEvent(display, &e); 
      puts("got event\n"); 
      if (e.type == Expose) { 
      printf("drawing\n"); 
      XFillRectangle(display, win, gc, 20, 20, 100, 100); 
      } 
      if (e.type == KeyPress) 
      break; 
     } 
    return 0; 
} 
Смежные вопросы