UNCLASSIFIED

Skip to content
Snippets Groups Projects

xbanner

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    The snippet can be accessed without any authentication.
    Authored by Jakob Kaivo

    a system classification type banner for the X Window System

    Edited
    xbanner.c 1.81 KiB
    #define _POSIX_C_SOURCE 200809
    #include <string.h>
    #include <stdio.h>
    #include <unistd.h>
    
    #include <X11/Xlib.h>
    
    int main(int argc, char *argv[])
    {
    	char *bannermsg = "UNCLASSIFIED";
    	char *background = "darkgreen";
    	char *foreground = "white";
    	int c;
    
    	while ((c = getopt(argc, argv, "b:f:")) != -1) {
    		switch (c) {
    		case 'b':
    			background = optarg;
    			break;
    		case 'f':
    			foreground = optarg;
    			break;
    		default:
    			return 1;
    		}
    	}
    
    	if (optind < argc) {
    		bannermsg = argv[optind];
    	}
    
    	Display *dpy = XOpenDisplay(NULL);
    	Window root = XDefaultRootWindow(dpy);
    
    	XColor bg, fg;
    	Colormap cmap = XDefaultColormap(dpy, 0);
    	if (XParseColor(dpy, cmap, background, &bg) == 0) {
    		fprintf(stderr, "couldn't find color %s\n", background);
    		bg.pixel = WhitePixel(dpy, 0);
    	} else if (XAllocColor(dpy, DefaultColormap(dpy, 0), &bg) == 0) {
    		fprintf(stderr, "couldn't allocate color %s\n", background);
    		bg.pixel = WhitePixel(dpy, 0);
    	}
    
    	if (XParseColor(dpy, cmap, foreground, &fg) == 0) {
    		fprintf(stderr, "couldn't find color %s\n", foreground);
    		fg.pixel = BlackPixel(dpy, 0);
    	} else if (XAllocColor(dpy, DefaultColormap(dpy, 0), &fg) == 0) {
    		fprintf(stderr, "couldn't allocate color %s\n", foreground);
    		fg.pixel = BlackPixel(dpy, 0);
    	}
    
    	int textheight = 10;
    	int width = XDisplayWidth(dpy, 0) / 2;
    
    	/* FIXME: use actual font metrics */
    	int textwidth = 6 * strlen(bannermsg);
    
    	Window w = XCreateSimpleWindow(dpy, root, 0, 0, XDisplayWidth(dpy, 0) / 2, textheight + 2, 0, 0, bg.pixel);
    	XStoreName(dpy, w, "banner");
    	XSelectInput(dpy, w, ExposureMask);
    	XMapRaised(dpy, w);
    
    	XSetForeground(dpy, DefaultGC(dpy, 0), fg.pixel);
    
    	for (;;) {
    		XEvent ev;
    		XNextEvent(dpy, &ev);
    		if (ev.type == Expose) {
    			XDrawString(dpy, w, DefaultGC(dpy, 0), (width - textwidth) / 2, textheight, bannermsg, strlen(bannermsg));
    		}
    	}
    
    	return 0;
    }
    • Jakob Kaivo @jakob.k.kaivo ·

      This would be a project, but apparently this GitLab instance doesn't allow me to create new projects.

    0% or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment