Getting the size of the screen: sizeofscreen.c

The previous module simplesquares has a clear drawback: it draws squares only in a part of the screen. This is because the coordinates of the squares are random numbers between 0 and 500-1, while the screen may be larger than that.

This section describes a module that is almost identical to the previous one, but uses a function that determine the screen size. This function can also be used to determine many other window attributes.

What is needed is a variable of type XWindowAttributes. The declaration section is now:

main ()
  Display *dpy;
  Window root;
  XWindowAttributes wa;
  GC g;
In order to determine the window attributes, we use the function XGetWindowAttributes. Since this function needs both a display and a window, it can be called only after dpy and root have been determined.
  /* get attributes of the root window */
  XGetWindowAttributes(dpy, root, &wa);
After this, the width of the screen is wa.width, while its height is wa.height. These two variables can be used for instance to choose a pair of coordinates such that the squares are never out of the screen. For example, we can replace the instruction of drawing with:
      /* draw a square */
      XFillRectangle (dpy, root, g, random()%(wa.width-50),
                      random()%(wa.height-40), 50, 40);
This way, the x and y coordinates of the left-upper corner of each square are between 0 and wa.width-50 and between wa.height-40, respectively. Since the squares have width 50 and height 40, they are all drawn inside the screen, and they may be drawn in any position of the screen.
The complete source code: sizeofscreen.c.

To compile, test, and install, see: testing and installing a new module

Next: using colors.