Select 一个特定的 window X11
Select a specific window X11
我正在设计一个具有 X11 window ID 的应用程序来绘制一个矩形。
我遇到的问题是我无法在 window.
中绘制任何内容
一个明显的错误是您没有 select ExposureMask
调用 XSelectInput
,因此您不会收到您正在等待的 Expose
事件。
其他可能的问题是 GC
的前景色未被 XSetForegroundColor
设置,默认为黑色。如果 window 具有不同的颜色深度或不同的视觉效果,使用默认的屏幕 gc 可能会失败。其他重要的 GC 属性是 subwindow_mode
(是否绘制 child windows)。
不过,在我做了这些更改之后,该程序只对我有效(绘制一个矩形)在根 window 和 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;
}
我正在设计一个具有 X11 window ID 的应用程序来绘制一个矩形。
我遇到的问题是我无法在 window.
一个明显的错误是您没有 select ExposureMask
调用 XSelectInput
,因此您不会收到您正在等待的 Expose
事件。
其他可能的问题是 GC
的前景色未被 XSetForegroundColor
设置,默认为黑色。如果 window 具有不同的颜色深度或不同的视觉效果,使用默认的屏幕 gc 可能会失败。其他重要的 GC 属性是 subwindow_mode
(是否绘制 child windows)。
不过,在我做了这些更改之后,该程序只对我有效(绘制一个矩形)在根 window 和 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;
}