Every object in X11 is considered a window. The background/Desktop in X11 is a Window itself - it's called the Root Window. Every GUI application on your desktop is a child of the Root Window.
In a reparenting window manager, all application windows are children of a container window, which holds other elements like the title bar and buttons. In our program the frame windows and their children are stored in a linked list of structs called WMClients:
// groups frame windows and the actual app windows
typedef struct WMClient
{
Window frame; // the border/container window
Window titleBar; // the title bar to click/drag
Window minWin; // minimize, maximize, and close subwindows
Window maxWin;
Window closeWin;
Window child; // the actual application content window
Window task_icon;
unsigned int x; // the x and y position before maximizing the window
unsigned int y;
unsigned int w; // the width and height before maximizing the window
unsigned int h;
Bool maximized; // true if the window is fullscreen
Bool minimized; // true if the window is minimized
char title[50]; // title of the window
struct WMClient *next;
} WMClient;
The window inside the frame that you click and drag on to move and contains the application title. It's size is equal to frameWidth - (buttonSize*numberOfButtons), so there's room for the maximize, minimze, and close buttons.
These are (shocker) also just windows, whose mouse press (called button presses in Xlib) are mapped to the minimize, maximize, and close functions for the window:
/* test if any special windows were pressed */
if(e.window == temp->minWin)
{
hMinimize(e, temp);
return True;
}
else if(e.window == temp->maxWin)
{
hMaximize(e, temp);
return True;
}
else if(e.window == temp->closeWin)
{
hClose(e, temp);
return True;
}
...
Bool hMinimize(const XButtonEvent e, WMClient *c)
{
printf("Minimize area!\n");
...
}
Bool hMaximize(const XButtonEvent e, WMClient *c)
{
printf("Maximize Button Clicked!\n");
...
}
Bool hClose(const XButtonEvent e, WMClient *c)
{
printf("Close button pressed!\n");
...
}
This where the actual program contents are contained. When the program is first started it sends MapRequest event to the X server. This is when we reparent the window into a frame and give it a titlebar/ buttons:
Bool hMapRequest(const XMapRequestEvent e)
{
printf("Map Request Event!\n");
reparentWindow(e.window, False);
XMapWindow(d, e.window);
return True;
}
...
Bool reparentWindow(Window child, Bool before_wm)
{
...
XReparentWindow(
d,
child,
c->frame,
0, TITLE_HEIGHT
);
...
}
Source: https://github.com/williamblair/capstone-wm-github
References: Chuan Ji