选择特定窗口X11

时间:2015-03-01 12:43:08

标签: c x11

我正在设计一个具有X11窗口ID的应用程序来绘制矩形 我遇到的问题是我不能在窗口中画任何东西。

Code

1 个答案:

答案 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;
}