Search code examples
x11xlib

Xlib won't draw anything


I'm pretty stuck on what I'm doing wrong, I've attempted to copy example code, I've tried changing the colors. Here's my code:

//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;
}

I get no errors in the console when I run it, nothing about a BadDrawable or anything. It opens the window just fine, but no rectangle appears on screen. I've also tried making it draw a line, a point, and an arc.


Solution

  • This is not an authoritative answer, as my knowledge on this subject is sketchy at best, but your event loop looks very empty. The window needs to be redrawn when the an Expose event is received.

    For example:

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