我正在设计一个具有X11窗口ID的应用程序来绘制矩形 我遇到的问题是我不能在窗口中画任何东西。
答案 0 :(得分: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;
}