C, Xlib, Xrandr on Linux/Xorg
This solution requires a C compiler, a working X server supporting RANDR and Xlib development files.
The code was compiled using GCC with the following commandline:
gcc -std=c99 -pedantic -Wall -Werror -O3 -o rectangle-fullscreen rectangle-fullscreen.c -lX11
It has been tested on GNU/Linux with GCC and the Xorg X server.
Known restriction: The program performs a fullscreen display by altering the display size to 640 pixels width and 480 pixels height if such a size is available (aborting otherwise), then creating a window, then sending a _NET_WM_STATE_FULLSCREEN message about the window to the window manager. Please note that not all window managers might adhere to this message correctly; this procedure has been successfully tested with the Xfce window manager.
/* rectangle.c - Draw a yellow rectangle using Xlib. */
/* Released into the Public Domain on Mar 11 2018 by Tilman Kranz . */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
#define WIDTH 640
#define HEIGHT 480
int main(int argc, char *argv[]) {
Display *display;
Window window;
Window root;
int screen;
XEvent event;
XColor yellow;
Colormap colormap;
Status rc;
GC gc;
XRRScreenSize *xrrs;
XRRScreenConfiguration *conf;
short possible_frequencies[64][64];
short original_rate;
Rotation original_rotation;
SizeID original_size_id;
int num_sizes;
int consider;
display = XOpenDisplay(NULL);
if (display == NULL) {
fprintf(stderr, "%s: cannot connect to X server\n", argv[0]);
exit(1);
}
screen = DefaultScreen(display);
root = RootWindow(display, screen);
xrrs = XRRSizes(display, 0, &num_sizes);
consider = -1;
for(int i = 0; i < num_sizes; i ++) {
short *rates;
int num_rates;
if(xrrs[i].width!=WIDTH || xrrs[i].height!=HEIGHT) {
continue;
}
consider = i;
rates = XRRRates(display, 0, i, &num_rates);
for(int j = 0; j < num_rates; j ++) {
possible_frequencies[i][j] = rates[j];
}
break;
}
if(consider==-1) {
fprintf(stderr, "no suitable mode for 640x480 found, aborting.");
exit(1);
}
conf = XRRGetScreenInfo(display, root);
original_rate = XRRConfigCurrentRate(conf);
original_size_id = XRRConfigCurrentConfiguration(conf, &original_rotation);
XRRSetScreenConfigAndRate(
display, conf, root, consider, RR_Rotate_0,
possible_frequencies[consider][0],
CurrentTime
);
colormap = DefaultColormap(display, screen);
gc = DefaultGC(display, screen);
window =
XCreateSimpleWindow(
display, root,
10, 10, WIDTH, HEIGHT, 1,
BlackPixel(display, screen), BlackPixel(display, screen)
);
XSelectInput(
display, window,
StructureNotifyMask | ExposureMask | KeyPressMask
);
XMapWindow(display, window);
XClientMessageEvent msg = {
.type = ClientMessage, .display = display, .window = window,
.message_type = XInternAtom(display, "_NET_WM_STATE", True),
.format = 32,
.data = { .l = {
1,
XInternAtom(display, "_NET_WM_STATE_FULLSCREEN", True),
None,
0,
1
}}
};
XSendEvent(
display, DefaultRootWindow(display), False,
SubstructureRedirectMask | SubstructureNotifyMask,
(XEvent*) &msg
);
rc = XAllocNamedColor(display, colormap, "yellow", &yellow, &yellow);
if(rc==0) {
fprintf(stderr, "%s: cannot allocate color \"yellow\".\n", argv[0]);
exit(1);
}
XSetForeground(display, gc, yellow.pixel);
while (1) {
XNextEvent(display, &event);
if (event.type == Expose) {
XFillRectangle(display, window, gc, 10, 20, 100, 75);
}
if (event.type == KeyPress) {
break;
}
}
XRRSetScreenConfigAndRate(
display, conf, root,
original_size_id, original_rotation, original_rate,
CurrentTime
);
XCloseDisplay(display);
return 0;
}