Nuova versione aggiustata ad un livello di fiqettosità adeguato per sfiqettare in giro
Il WM è strutturato per quadranti di schermo (tipo RatPoison per capirsi); tasto di funzione 'alt':
CODICE
/* TinyWM is written by Nick Welch <mack@incise.org>, 2005.
*
* This software is in the public domain
* and is provided AS IS, with NO WARRANTY.
*
* This Is vogy Version Implemented, 2014
* $ gcc thisfile.c -o filename -lX11
*
* PleaseRemember: The State Is An Unnecessary Evil
*/
#include <X11/Xlib.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int main()
{
Display * dpy;
Window root;
XWindowAttributes attr;
XButtonEvent start;
XEvent ev;
unsigned int keycode[8];
unsigned int MWidth, MHeight, QWidth, QHeight;
if(!(dpy = XOpenDisplay(0x0))) return 1;
root = DefaultRootWindow(dpy);
keycode[0] = XKeysymToKeycode(dpy, XStringToKeysym("Return"));
keycode[1] = XKeysymToKeycode(dpy, XStringToKeysym("BackSpace"));
keycode[2] = XKeysymToKeycode(dpy, XStringToKeysym("q"));
keycode[3] = XKeysymToKeycode(dpy, XStringToKeysym("m"));
keycode[4] = XKeysymToKeycode(dpy, XStringToKeysym("Left"));
keycode[5] = XKeysymToKeycode(dpy, XStringToKeysym("Up"));
keycode[6] = XKeysymToKeycode(dpy, XStringToKeysym("Right"));
keycode[7] = XKeysymToKeycode(dpy, XStringToKeysym("Down"));
MWidth = XDisplayWidth(dpy, 0x0);
MHeight = XDisplayHeight(dpy, 0x0);
QWidth = MWidth / 2;
QHeight = MHeight / 2;
XGrabKey(dpy, keycode[0], Mod1Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, keycode[1], Mod1Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, keycode[2], Mod1Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, keycode[3], Mod1Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, keycode[4], Mod1Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, keycode[5], Mod1Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, keycode[6], Mod1Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, keycode[7], Mod1Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabButton(dpy, 1, Mod1Mask, root, True, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
XGrabButton(dpy, 3, Mod1Mask, root, True, ButtonPressMask, GrabModeAsync, GrabModeAsync, None, None);
for(;;)
{
XNextEvent(dpy, &ev);
if(ev.type == KeyPress && ev.xkey.keycode == keycode[0]) {
XRaiseWindow(dpy, ev.xkey.subwindow);
}
else if(ev.type == KeyPress && ev.xbutton.subwindow != None && ev.xkey.keycode == keycode[1]) {
XLowerWindow(dpy, ev.xkey.subwindow);
}
else if(ev.type == KeyPress && ev.xbutton.subwindow != None && ev.xkey.keycode == keycode[2]) {
XDestroyWindow(dpy, ev.xkey.subwindow);
}
else if(ev.type == KeyPress && ev.xbutton.subwindow != None && ev.xkey.keycode == keycode[3]) {
XMoveResizeWindow(dpy, ev.xkey.subwindow, 0, 0, MWidth, MHeight);
}
else if(ev.type == KeyPress && ev.xbutton.subwindow != None && ev.xkey.keycode == keycode[4]) {
XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr);
if(attr.x == 0 && attr.width > QWidth) {
XMoveResizeWindow(dpy, ev.xkey.subwindow, 0, attr.y, QWidth, attr.height);
} else {
XMoveResizeWindow(dpy, ev.xkey.subwindow, 0, attr.y, attr.x + attr.width, attr.height);
}
}
else if(ev.type == KeyPress && ev.xbutton.subwindow != None && ev.xkey.keycode == keycode[6]) {
XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr);
if(attr.x + attr.width == MWidth && attr.width > QWidth) {
XMoveResizeWindow(dpy, ev.xkey.subwindow, QWidth, attr.y, QWidth, attr.height);
} else {
XMoveResizeWindow(dpy, ev.xkey.subwindow, attr.x, attr.y, MWidth - attr.x, attr.height);
}
}
else if(ev.type == KeyPress && ev.xbutton.subwindow != None && ev.xkey.keycode == keycode[5]) {
XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr);
if(attr.height > QHeight) {
XMoveResizeWindow(dpy, ev.xkey.subwindow, attr.x, 0, attr.width, QHeight);
} else {
XMoveResizeWindow(dpy, ev.xkey.subwindow, attr.x, 0, attr.width, attr.y + attr.height);
}
}
else if(ev.type == KeyPress && ev.xbutton.subwindow != None && ev.xkey.keycode == keycode[7]) {
XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr);
if(attr.height > QHeight) {
XMoveResizeWindow(dpy, ev.xkey.subwindow, attr.x, QHeight, attr.width, QHeight);
} else {
XMoveResizeWindow(dpy, ev.xkey.subwindow, attr.x, attr.y, attr.width, MHeight - attr.y);
}
}
else if(ev.type == ButtonPress && ev.xbutton.subwindow != None) {
XGrabPointer(dpy, ev.xbutton.subwindow, True, PointerMotionMask|ButtonReleaseMask,
GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
XGetWindowAttributes(dpy, ev.xbutton.subwindow, &attr);
start = ev.xbutton;
}
else if(ev.type == MotionNotify) {
int xdiff, ydiff;
while(XCheckTypedEvent(dpy, MotionNotify, &ev));
xdiff = ev.xbutton.x_root - start.x_root;
ydiff = ev.xbutton.y_root - start.y_root;
XMoveResizeWindow(dpy, ev.xmotion.window, attr.x + (start.button==1 ? xdiff : 0),
attr.y + (start.button==1 ? ydiff : 0),
MAX(1, attr.width + (start.button==3 ? xdiff : 0)),
MAX(1, attr.height + (start.button==3 ? ydiff : 0)));
}
else if(ev.type == ButtonRelease)
XUngrabPointer(dpy, CurrentTime);
}
}