sowm

An itsy bitsy floating window manager (220~ sloc!).
git clone git://mfeller.io/sowm.git
Log | Files | Refs | README | LICENSE

commit 18b908fe342f41aaf63fcacf103fc1c0c6e257d3
parent 445d61a269e8ac774cfd99d4f4e136539419ad02
Author: Dylan Araps <dylan.araps@gmail.com>
Date:   Fri, 11 Oct 2019 18:52:07 +0300

catwm: spring cleaning

Diffstat:
Mcatwm.c | 252++++++++++++++++++++++++++++++++++---------------------------------------------
1 file changed, 109 insertions(+), 143 deletions(-)

diff --git a/catwm.c b/catwm.c @@ -4,29 +4,8 @@ * ( =^= ) * ( ) ... for cat! * ( ) - * ( ))))))________________ Cute And Tiny Window Manager - * ______________________________________________________________________________ - * - * Copyright (c) 2010, Rinaldini Julien, julien.rinaldini@heig-vd.ch - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * + * ( ))))))________________ + * __________________ */ #include <X11/Xlib.h> @@ -47,7 +26,6 @@ typedef union { const int i; } Arg; -// Structs struct key { unsigned int mod; KeySym keysym; @@ -70,7 +48,6 @@ struct desktop{ client *current; }; -// Functions static void add_window(Window w); static void buttonpress(XEvent *e); static void buttonrelease(XEvent *e); @@ -78,8 +55,8 @@ static void change_desktop(const Arg arg); static void client_to_desktop(const Arg arg); static void configurerequest(XEvent *e); static void destroynotify(XEvent *e); -static void die(const char* e); static void grabkeys(); +static void init(); static void keypress(XEvent *e); static void kill_client(); static void maprequest(XEvent *e); @@ -92,27 +69,24 @@ static void send_kill_signal(Window w); static void setup(); static void sigchld(int unused); static void spawn(const Arg arg); -static void init(); static void update_current(); -// Include configuration file (need struct key) #include "config.h" -// Variable -static Display *dis; static int bool_quit; -static int current_desktop; +static int curr_desk; static int mode; +static int screen; static int sh; static int sw; -static int screen; +static Display *dis; static Window root; -static client *head; -static client *current; -static XWindowAttributes attr; static XButtonEvent start; +static XWindowAttributes attr; +static client *current; +static client *head; +static desktop desktops[6]; -// Events array static void (*events[LASTEvent])(XEvent *e) = { [KeyPress] = keypress, [MapRequest] = maprequest, @@ -123,28 +97,25 @@ static void (*events[LASTEvent])(XEvent *e) = { [MotionNotify] = motionnotify }; -// Desktop array -static desktop desktops[10]; - void add_window(Window w) { - client *c,*t; + client *c, *t; - if(!(c = (client *)calloc(1,sizeof(client)))) - die("Error calloc!"); + if (!(c = (client *)calloc(1,sizeof(client)))) + exit(1); - if(head == NULL) { + if (head == NULL) { c->next = NULL; c->prev = NULL; - c->win = w; - head = c; + c->win = w; + head = c; } + else { for(t=head;t->next;t=t->next); c->next = NULL; c->prev = t; - c->win = w; - + c->win = w; t->next = c; } @@ -154,33 +125,26 @@ void add_window(Window w) { void change_desktop(const Arg arg) { client *c; - if(arg.i == current_desktop) + if (arg.i == curr_desk) return; - // Unmap all window - if(head != NULL) - for(c=head;c;c=c->next) - XUnmapWindow(dis,c->win); - - // Save current "properties" - save_desktop(current_desktop); + if (head != NULL) + for(c=head;c;c=c->next) XUnmapWindow(dis,c->win); - // Take "properties" from the new desktop + save_desktop(curr_desk); select_desktop(arg.i); - // Map all windows - if(head != NULL) - for(c=head;c;c=c->next) - XMapWindow(dis,c->win); + if (head != NULL) + for(c=head;c;c=c->next) XMapWindow(dis,c->win); update_current(); } void client_to_desktop(const Arg arg) { client *tmp = current; - int tmp2 = current_desktop; + int tmp2 = curr_desk; - if (arg.i == current_desktop || current == NULL) + if (arg.i == tmp2 || current == NULL) return; // Add client to desktop @@ -196,30 +160,29 @@ void client_to_desktop(const Arg arg) { } void configurerequest(XEvent *e) { - // Paste from DWM, thx again \o/ XConfigureRequestEvent *ev = &e->xconfigurerequest; XWindowChanges wc; - wc.x = ev->x; - wc.y = ev->y; - wc.width = ev->width; - wc.height = ev->height; + + wc.x = ev->x; + wc.y = ev->y; + wc.width = ev->width; + wc.height = ev->height; wc.border_width = ev->border_width; - wc.sibling = ev->above; - wc.stack_mode = ev->detail; + wc.sibling = ev->above; + wc.stack_mode = ev->detail; + XConfigureWindow(dis, ev->window, ev->value_mask, &wc); } void destroynotify(XEvent *e) { - int i=0; + int i = 0; client *c; + XDestroyWindowEvent *ev = &e->xdestroywindow; - // Uber (and ugly) hack ;) for(c=head;c;c=c->next) - if(ev->window == c->win) - i++; + if(ev->window == c->win) i++; - // End of the hack if(i == 0) return; @@ -231,27 +194,21 @@ void update_current() { client *c; for(c=head;c;c=c->next) - if(current == c) { - XSetWindowBorderWidth(dis,c->win,1); - XSetInputFocus(dis,c->win,RevertToParent,CurrentTime); - XRaiseWindow(dis,c->win); + if (current == c) { + XSetWindowBorderWidth(dis, c->win, 1); + XSetInputFocus(dis, c->win, RevertToParent, CurrentTime); + XRaiseWindow(dis, c->win); } } -void die(const char* e) { - fprintf(stdout,"catwm: %s\n",e); - exit(1); -} - void grabkeys() { int i; KeyCode code; - // For each shortcuts for(i=0;i<TABLENGTH(keys);++i) { - if((code = XKeysymToKeycode(dis,keys[i].keysym))) { - XGrabKey(dis,code,keys[i].mod,root,True,GrabModeAsync,GrabModeAsync); - } + if ((code = XKeysymToKeycode(dis, keys[i].keysym))) + XGrabKey(dis, code, keys[i].mod, root, + True, GrabModeAsync, GrabModeAsync); } } @@ -299,12 +256,14 @@ void kill_client() { if(current != NULL) { //send delete signal to window XEvent ke; - ke.type = ClientMessage; - ke.xclient.window = current->win; + + ke.type = ClientMessage; + ke.xclient.window = current->win; ke.xclient.message_type = XInternAtom(dis, "WM_PROTOCOLS", True); - ke.xclient.format = 32; - ke.xclient.data.l[0] = XInternAtom(dis, "WM_DELETE_WINDOW", True); - ke.xclient.data.l[1] = CurrentTime; + ke.xclient.format = 32; + ke.xclient.data.l[0] = XInternAtom(dis, "WM_DELETE_WINDOW", True); + ke.xclient.data.l[1] = CurrentTime; + XSendEvent(dis, current->win, False, NoEventMask, &ke); send_kill_signal(current->win); } @@ -312,9 +271,9 @@ void kill_client() { void maprequest(XEvent *e) { XMapRequestEvent *ev = &e->xmaprequest; + client *c; // For fullscreen mplayer (and maybe some other program) - client *c; for(c=head;c;c=c->next) if(ev->window == c->win) { XMapWindow(dis,ev->window); @@ -329,8 +288,8 @@ void maprequest(XEvent *e) { void next_win() { client *c; - if(current != NULL && head != NULL) { - if(current->next == NULL) + if (current != NULL && head != NULL) { + if (current->next == NULL) c = head; else c = current->next; @@ -343,63 +302,70 @@ void next_win() { void remove_window(Window w) { client *c; - // CHANGE THIS UGLY CODE for(c=head;c;c=c->next) { + if(c->win != w) + return; + + if (c->prev == NULL && c->next == NULL) { + free(head); + + head = NULL; + current = NULL; - if(c->win == w) { - if(c->prev == NULL && c->next == NULL) { - free(head); - head = NULL; - current = NULL; - return; - } - - if(c->prev == NULL) { - head = c->next; - c->next->prev = NULL; - current = c->next; - } - else if(c->next == NULL) { - c->prev->next = NULL; - current = c->prev; - } - else { - c->prev->next = c->next; - c->next->prev = c->prev; - current = c->prev; - } - - free(c); return; } + + if (c->prev == NULL) { + head = c->next; + c->next->prev = NULL; + current = c->next; + } + + else if (c->next == NULL) { + c->prev->next = NULL; + current = c->prev; + } + + else { + c->prev->next = c->next; + c->next->prev = c->prev; + current = c->prev; + } + + free(c); + return; } } void save_desktop(int i) { - desktops[i].mode = mode; - desktops[i].head = head; + desktops[i].mode = mode; + desktops[i].head = head; desktops[i].current = current; } void select_desktop(int i) { - head = desktops[i].head; - current = desktops[i].current; - mode = desktops[i].mode; - current_desktop = i; + head = desktops[i].head; + current = desktops[i].current; + mode = desktops[i].mode; + curr_desk = i; } void send_kill_signal(Window w) { XEvent ke; - ke.type = ClientMessage; - ke.xclient.window = w; + + ke.type = ClientMessage; + ke.xclient.window = w; ke.xclient.message_type = XInternAtom(dis, "WM_PROTOCOLS", True); - ke.xclient.format = 32; - ke.xclient.data.l[0] = XInternAtom(dis, "WM_DELETE_WINDOW", True); - ke.xclient.data.l[1] = CurrentTime; + ke.xclient.format = 32; + ke.xclient.data.l[0] = XInternAtom(dis, "WM_DELETE_WINDOW", True); + ke.xclient.data.l[1] = CurrentTime; + XSendEvent(dis, w, False, NoEventMask, &ke); } void setup() { + int i; + sigchld(0); screen = DefaultScreen(dis); @@ -414,35 +380,35 @@ void setup() { head = NULL; current = NULL; - int i; for(i=0;i<TABLENGTH(desktops);++i) { - desktops[i].mode = mode; - desktops[i].head = head; + desktops[i].mode = mode; + desktops[i].head = head; desktops[i].current = current; } const Arg arg = {.i = 1}; - current_desktop = arg.i; + curr_desk = arg.i; change_desktop(arg); - XSelectInput(dis,root,SubstructureNotifyMask|SubstructureRedirectMask); + XSelectInput(dis, root, SubstructureNotifyMask|SubstructureRedirectMask); } void sigchld(int unused) { - if(signal(SIGCHLD, sigchld) == SIG_ERR) - die("Can't install SIGCHLD handler"); + if (signal(SIGCHLD, sigchld) == SIG_ERR) + exit(1); while(0 < waitpid(-1, NULL, WNOHANG)); } void spawn(const Arg arg) { - if(fork() == 0) { - if(fork() == 0) { - if(dis) close(ConnectionNumber(dis)); + if (fork() == 0) { + if (fork() == 0) { + if (dis) close(ConnectionNumber(dis)); setsid(); execvp((char*)arg.com[0],(char**)arg.com); } + exit(0); } } @@ -466,8 +432,8 @@ void init() { } int main(int argc, char **argv) { - if(!(dis = XOpenDisplay(NULL))) - die("Cannot open display!"); + if (!(dis = XOpenDisplay(NULL))) + exit(1); setup(); init();