Xlib不会画任何东西

时间:2017-07-26 00:01:46

标签: x11 xlib

我非常依赖我做错的事情,我试图复制示例代码,我尝试过改变颜色。这是我的代码:

//Headers
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>

int main(int argc, char *argv[])
{
    //Vars to create a window
    Display *dis;
    int screen;
    Window win;
    XEvent event;

    //Graphics content
    XGCValues values;
    unsigned long valuemask = 0;
    GC gc;

    //To store mouse location
    int mouseX[2], mouseY[2];

    //Stores screen dimensions
    XWindowAttributes xwa;
    int screenHeight, screenWidth;

    //Colors
    Colormap colormap;
    XColor backgroundColor, white;

    //Checks for open display
    dis = XOpenDisplay(NULL);

    //Displays error
    if(dis == NULL)
    {
        fprintf(stderr, "Cannot open display\n");
        exit(1);
    }

    //Sets screen
    screen = DefaultScreen(dis);

    colormap = DefaultColormap(dis, screen);    

    //Background color
    XParseColor(dis, colormap, "#75677e", &backgroundColor);
    XAllocColor(dis, colormap, &backgroundColor);

    //White
    XParseColor(dis, colormap, "#ffffff", &white);
    XAllocColor(dis, colormap, &white);

    //Creates window
    win = XCreateSimpleWindow(dis, RootWindow(dis, screen), 100, 100, 500, 300, 1, BlackPixel(dis, screen), backgroundColor.pixel);

    //Changes window to be full screen
    //Atom atoms[2] = { XInternAtom(dis, "_NET_WM_STATE_FULLSCREEN", False), None };
    //XChangeProperty(dis, win, XInternAtom(dis, "_NET_WM_STATE", False), XA_ATOM, 32, PropModeReplace, (unsigned char *)atoms, 1);

    //Allocates graphics content
    gc = XCreateGC(dis, win, valuemask, &values);
    XSetLineAttributes(dis, gc, 2, LineSolid, CapButt, JoinBevel);
    XSetFillStyle(dis, gc, FillSolid);
    XSync(dis, False);

    //Stores screen dimensions

    //TODO: test
    XGetWindowAttributes(dis, win, &xwa);

    screenWidth = xwa.width;
    screenHeight = xwa.height;

    //Inner circle
    //XFillArc(dis, win)

    XSetForeground(dis, gc, BlackPixel(dis, screen));
    XFillRectangle(dis, win, gc, 0, 100, 50, 50);

    //Listens for input
    XSelectInput(dis, win, ExposureMask | KeyPressMask);

    //Maps window
    XMapWindow(dis, win);

    while(1)
    {
        XNextEvent(dis, &event);
    }

    XCloseDisplay(dis);
    return 0;
}

我在运行它时没有在控制台中出现任何错误,没有关于BadDrawable或其他任何内容的错误。它打开窗口很好,但屏幕上没有矩形。我也试过画一条线,一条点和一条弧。

1 个答案:

答案 0 :(得分:1)

这不是一个权威的答案,因为我对这个主题的知识充其量是粗略的,但你的事件循环看起来很空洞。收到Expose事件后,需要重新绘制窗口。

例如:

while(1)
{
    XNextEvent(dis, &event);

    switch(event.type) {
    case Expose:
        if (event.xexpose.count) break;

        XFillRectangle(dis, win, gc, 0, 100, 50, 50);
        break;

    default:
        break;
    }
}