summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--client.c70
-rw-r--r--cmd.c52
-rw-r--r--config.mk2
-rw-r--r--kb.c12
-rw-r--r--wm.c12
-rw-r--r--wm.h13
7 files changed, 97 insertions, 66 deletions
diff --git a/Makefile b/Makefile
index 223f6f73..ccb9af76 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
include config.mk
-WMSRC = bar.c client.c cmd.c draw.c event.c kb.c mouse.c util.c wm.c
+WMSRC = bar.c client.c draw.c event.c kb.c mouse.c util.c wm.c
WMOBJ = ${WMSRC:.c=.o}
MENSRC = menu.c draw.c util.c
MENOBJ = ${MENSRC:.c=.o}
diff --git a/client.c b/client.c
index 84fbce50..b961d867 100644
--- a/client.c
+++ b/client.c
@@ -3,6 +3,7 @@
* See LICENSE file for license details.
*/
+#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xatom.h>
@@ -10,6 +11,73 @@
#include "util.h"
#include "wm.h"
+void
+arrange(void *aux)
+{
+ Client *c;
+ int n, cols, rows, gw, gh, i, j;
+ float rt, fd;
+
+ if(!clients)
+ return;
+ for(n = 0, c = clients; c; c = c->next, n++);
+ rt = sqrt(n);
+ if(modff(rt, &fd) < 0.5)
+ rows = floor(rt);
+ else
+ rows = ceil(rt);
+ if(rows * rows < n)
+ cols = rows + 1;
+ else
+ cols = rows;
+
+ gw = (sw - 1) / cols;
+ gh = (sh - bh - 1) / rows;
+
+ for(i = j = 0, c = clients; c; c = c->next) {
+ c->x = i * gw;
+ c->y = j * gh + bh;
+ c->w = gw;
+ c->h = gh;
+ resize(c);
+ if(++i == cols) {
+ j++;
+ i = 0;
+ }
+ }
+}
+
+void
+sel(void *aux)
+{
+ const char *arg = aux;
+ Client *c = NULL;
+
+ if(!arg || !stack)
+ return;
+ if(!strncmp(arg, "next", 5))
+ c = stack->snext ? stack->snext : stack;
+ else if(!strncmp(arg, "prev", 5))
+ for(c = stack; c && c->snext; c = c->snext);
+ if(!c)
+ c = stack;
+ raise(c);
+ focus(c);
+}
+
+void
+kill(void *aux)
+{
+ Client *c = stack;
+
+ if(!c)
+ return;
+ if(c->proto & WM_PROTOCOL_DELWIN)
+ send_message(c->win, wm_atom[WMProtocols], wm_atom[WMDelete]);
+ else
+ XKillClient(dpy, c->win);
+}
+
static void
resize_title(Client *c)
{
@@ -113,7 +181,7 @@ focus(Client *c)
draw_client(old);
}
XUnmapWindow(dpy, c->title);
- draw_client(old);
+ draw_client(c);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
XFlush(dpy);
}
diff --git a/cmd.c b/cmd.c
deleted file mode 100644
index baa3ae94..00000000
--- a/cmd.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
- * See LICENSE file for license details.
- */
-
-#include "wm.h"
-#include <stdio.h>
-#include <string.h>
-
-void
-run(void *aux)
-{
- spawn(dpy, aux);
-}
-
-void
-quit(void *aux)
-{
- running = False;
-}
-
-void
-sel(void *aux)
-{
- const char *arg = aux;
- Client *c = NULL;
-
- if(!arg || !stack)
- return;
- if(!strncmp(arg, "next", 5))
- c = stack->snext ? stack->snext : stack;
- else if(!strncmp(arg, "prev", 5))
- for(c = stack; c && c->snext; c = c->snext);
- if(!c)
- c = stack;
- raise(c);
- focus(c);
-}
-
-void
-kill(void *aux)
-{
- Client *c = stack;
-
- if(!c)
- return;
- if(c->proto & WM_PROTOCOL_DELWIN)
- send_message(c->win, wm_atom[WMProtocols], wm_atom[WMDelete]);
- else
- XKillClient(dpy, c->win);
-}
-
diff --git a/config.mk b/config.mk
index 4fa9e86d..0e5d372c 100644
--- a/config.mk
+++ b/config.mk
@@ -11,7 +11,7 @@ X11LIB = /usr/X11R6/lib
VERSION = 0.0
# includes and libs
-LIBS = -L${PREFIX}/lib -L/usr/lib -lc -L${X11LIB} -lX11
+LIBS = -L${PREFIX}/lib -L/usr/lib -lc -lm -L${X11LIB} -lX11
# Linux/BSD
CFLAGS = -g -Wall -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
diff --git a/kb.c b/kb.c
index 7eb788a3..76dc29ef 100644
--- a/kb.c
+++ b/kb.c
@@ -13,16 +13,18 @@ static const char *term[] = {
};
static const char *proglist[] = {
- "sh", "-c", "exec `ls -lL /bin /sbin /usr/bin /usr/local/bin 2>/dev/null | awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | gridmenu`", 0
+ "sh", "-c", "exec `ls -lL /bin /sbin /usr/bin /usr/local/bin 2>/dev/null "
+ "| awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | gridmenu`", 0
};
static Key key[] = {
{ Mod1Mask, XK_Return, run, term },
{ Mod1Mask, XK_p, run, proglist },
- { Mod1Mask, XK_k, sel, "prev"},
- { Mod1Mask, XK_j, sel, "next"},
- { Mod1Mask | ShiftMask, XK_c, kill, NULL},
- { Mod1Mask | ShiftMask, XK_q, quit, NULL},
+ { Mod1Mask, XK_k, sel, "prev" },
+ { Mod1Mask, XK_j, sel, "next" },
+ { Mod1Mask, XK_g, arrange, NULL },
+ { Mod1Mask | ShiftMask, XK_c, kill, NULL },
+ { Mod1Mask | ShiftMask, XK_q, quit, NULL },
};
void
diff --git a/wm.c b/wm.c
index f0069d24..02b9a68a 100644
--- a/wm.c
+++ b/wm.c
@@ -175,6 +175,18 @@ cleanup()
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
}
+void
+run(void *aux)
+{
+ spawn(dpy, aux);
+}
+
+void
+quit(void *aux)
+{
+ running = False;
+}
+
int
main(int argc, char *argv[])
{
diff --git a/wm.h b/wm.h
index b5b07b59..1e6f2149 100644
--- a/wm.h
+++ b/wm.h
@@ -58,12 +58,6 @@ extern Client *clients, *stack;
/* bar.c */
extern void draw_bar();
-/* cmd.c */
-extern void run(void *aux);
-extern void quit(void *aux);
-extern void kill(void *aux);
-extern void sel(void *aux);
-
/* client.c */
extern void manage(Window w, XWindowAttributes *wa);
extern void unmanage(Client *c);
@@ -76,10 +70,15 @@ extern void update_size(Client *c);
extern Client *gettitle(Window w);
extern void raise(Client *c);
extern void lower(Client *c);
+extern void kill(void *aux);
+extern void sel(void *aux);
/* event.c */
extern void discard_events(long even_mask);
+/* grid.c */
+extern void arrange();
+
/* key.c */
extern void update_keys();
extern void keypress(XEvent *e);
@@ -92,3 +91,5 @@ extern void mmove(Client *c);
extern int error_handler(Display *dpy, XErrorEvent *error);
extern void send_message(Window w, Atom a, long value);
extern int win_proto(Window w);
+extern void run(void *aux);
+extern void quit(void *aux);