gpt4 book ai didi

c - 选择特定窗口 X11

转载 作者:太空宇宙 更新时间:2023-11-04 03:40:52 26 4
gpt4 key购买 nike

我正在设计一个具有 X11 窗口 ID 的应用程序来绘制一个矩形。
我遇到的问题是我无法在窗口中绘制任何内容。

Code

最佳答案

一个明显的错误是您在调用XSelectInput 时没有选择ExposureMask,因此您不会收到您正在等待的Expose 事件.

其他可能的问题是没有通过XSetForegroundColor 设置GC 的前景色,默认是黑色。如果窗口具有不同的颜色深度或不同的视觉效果,则使用默认的屏幕 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;
}

关于c - 选择特定窗口 X11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com