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