|
|
@ -63,21 +63,17 @@ enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
|
|
|
|
enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
|
|
|
|
enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
|
|
|
|
ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
|
|
|
|
ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
|
|
|
|
|
|
|
|
|
|
|
|
/* typedefs */
|
|
|
|
|
|
|
|
typedef unsigned int uint;
|
|
|
|
|
|
|
|
typedef unsigned long ulong;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef union {
|
|
|
|
typedef union {
|
|
|
|
int i;
|
|
|
|
int i;
|
|
|
|
uint ui;
|
|
|
|
unsigned int ui;
|
|
|
|
float f;
|
|
|
|
float f;
|
|
|
|
void *v;
|
|
|
|
void *v;
|
|
|
|
} Arg;
|
|
|
|
} Arg;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
typedef struct {
|
|
|
|
uint click;
|
|
|
|
unsigned int click;
|
|
|
|
uint mask;
|
|
|
|
unsigned int mask;
|
|
|
|
uint button;
|
|
|
|
unsigned int button;
|
|
|
|
void (*func)(const Arg *arg);
|
|
|
|
void (*func)(const Arg *arg);
|
|
|
|
const Arg arg;
|
|
|
|
const Arg arg;
|
|
|
|
} Button;
|
|
|
|
} Button;
|
|
|
@ -89,7 +85,7 @@ struct Client {
|
|
|
|
int x, y, w, h;
|
|
|
|
int x, y, w, h;
|
|
|
|
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
|
|
|
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
|
|
|
int bw, oldbw;
|
|
|
|
int bw, oldbw;
|
|
|
|
uint tags;
|
|
|
|
unsigned int tags;
|
|
|
|
Bool isfixed, isfloating, isurgent;
|
|
|
|
Bool isfixed, isfloating, isurgent;
|
|
|
|
Client *next;
|
|
|
|
Client *next;
|
|
|
|
Client *snext;
|
|
|
|
Client *snext;
|
|
|
@ -98,8 +94,8 @@ struct Client {
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
typedef struct {
|
|
|
|
int x, y, w, h;
|
|
|
|
int x, y, w, h;
|
|
|
|
ulong norm[ColLast];
|
|
|
|
unsigned long norm[ColLast];
|
|
|
|
ulong sel[ColLast];
|
|
|
|
unsigned long sel[ColLast];
|
|
|
|
Drawable drawable;
|
|
|
|
Drawable drawable;
|
|
|
|
GC gc;
|
|
|
|
GC gc;
|
|
|
|
struct {
|
|
|
|
struct {
|
|
|
@ -112,7 +108,7 @@ typedef struct {
|
|
|
|
} DC; /* draw context */
|
|
|
|
} DC; /* draw context */
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
typedef struct {
|
|
|
|
uint mod;
|
|
|
|
unsigned int mod;
|
|
|
|
KeySym keysym;
|
|
|
|
KeySym keysym;
|
|
|
|
void (*func)(const Arg *);
|
|
|
|
void (*func)(const Arg *);
|
|
|
|
const Arg arg;
|
|
|
|
const Arg arg;
|
|
|
@ -127,7 +123,7 @@ typedef struct {
|
|
|
|
const char *class;
|
|
|
|
const char *class;
|
|
|
|
const char *instance;
|
|
|
|
const char *instance;
|
|
|
|
const char *title;
|
|
|
|
const char *title;
|
|
|
|
uint tags;
|
|
|
|
unsigned int tags;
|
|
|
|
Bool isfloating;
|
|
|
|
Bool isfloating;
|
|
|
|
} Rule;
|
|
|
|
} Rule;
|
|
|
|
|
|
|
|
|
|
|
@ -148,23 +144,23 @@ static void detach(Client *c);
|
|
|
|
static void detachstack(Client *c);
|
|
|
|
static void detachstack(Client *c);
|
|
|
|
static void die(const char *errstr, ...);
|
|
|
|
static void die(const char *errstr, ...);
|
|
|
|
static void drawbar(void);
|
|
|
|
static void drawbar(void);
|
|
|
|
static void drawsquare(Bool filled, Bool empty, Bool invert, ulong col[ColLast]);
|
|
|
|
static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
|
|
|
|
static void drawtext(const char *text, ulong col[ColLast], Bool invert);
|
|
|
|
static void drawtext(const char *text, unsigned long col[ColLast], Bool invert);
|
|
|
|
static void enternotify(XEvent *e);
|
|
|
|
static void enternotify(XEvent *e);
|
|
|
|
static void expose(XEvent *e);
|
|
|
|
static void expose(XEvent *e);
|
|
|
|
static void focus(Client *c);
|
|
|
|
static void focus(Client *c);
|
|
|
|
static void focusin(XEvent *e);
|
|
|
|
static void focusin(XEvent *e);
|
|
|
|
static void focusstack(const Arg *arg);
|
|
|
|
static void focusstack(const Arg *arg);
|
|
|
|
static Client *getclient(Window w);
|
|
|
|
static Client *getclient(Window w);
|
|
|
|
static ulong getcolor(const char *colstr);
|
|
|
|
static unsigned long getcolor(const char *colstr);
|
|
|
|
static long getstate(Window w);
|
|
|
|
static long getstate(Window w);
|
|
|
|
static Bool gettextprop(Window w, Atom atom, char *text, uint size);
|
|
|
|
static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
|
|
|
|
static void grabbuttons(Client *c, Bool focused);
|
|
|
|
static void grabbuttons(Client *c, Bool focused);
|
|
|
|
static void grabkeys(void);
|
|
|
|
static void grabkeys(void);
|
|
|
|
static void initfont(const char *fontstr);
|
|
|
|
static void initfont(const char *fontstr);
|
|
|
|
static Bool isoccupied(uint t);
|
|
|
|
static Bool isoccupied(unsigned int t);
|
|
|
|
static Bool isprotodel(Client *c);
|
|
|
|
static Bool isprotodel(Client *c);
|
|
|
|
static Bool isurgent(uint t);
|
|
|
|
static Bool isurgent(unsigned int t);
|
|
|
|
static void keypress(XEvent *e);
|
|
|
|
static void keypress(XEvent *e);
|
|
|
|
static void killclient(const Arg *arg);
|
|
|
|
static void killclient(const Arg *arg);
|
|
|
|
static void manage(Window w, XWindowAttributes *wa);
|
|
|
|
static void manage(Window w, XWindowAttributes *wa);
|
|
|
@ -186,7 +182,7 @@ static void setmfact(const Arg *arg);
|
|
|
|
static void setup(void);
|
|
|
|
static void setup(void);
|
|
|
|
static void spawn(const Arg *arg);
|
|
|
|
static void spawn(const Arg *arg);
|
|
|
|
static void tag(const Arg *arg);
|
|
|
|
static void tag(const Arg *arg);
|
|
|
|
static int textnw(const char *text, uint len);
|
|
|
|
static int textnw(const char *text, unsigned int len);
|
|
|
|
static void tile(void);
|
|
|
|
static void tile(void);
|
|
|
|
static void togglebar(const Arg *arg);
|
|
|
|
static void togglebar(const Arg *arg);
|
|
|
|
static void togglefloating(const Arg *arg);
|
|
|
|
static void togglefloating(const Arg *arg);
|
|
|
@ -209,9 +205,9 @@ static void zoom(const Arg *arg);
|
|
|
|
static char stext[256];
|
|
|
|
static char stext[256];
|
|
|
|
static int screen, sx, sy, sw, sh;
|
|
|
|
static int screen, sx, sy, sw, sh;
|
|
|
|
static int by, bh, blw, wx, wy, ww, wh;
|
|
|
|
static int by, bh, blw, wx, wy, ww, wh;
|
|
|
|
static uint seltags = 0, sellt = 0;
|
|
|
|
static unsigned int seltags = 0, sellt = 0;
|
|
|
|
static int (*xerrorxlib)(Display *, XErrorEvent *);
|
|
|
|
static int (*xerrorxlib)(Display *, XErrorEvent *);
|
|
|
|
static uint numlockmask = 0;
|
|
|
|
static unsigned int numlockmask = 0;
|
|
|
|
static void (*handler[LASTEvent]) (XEvent *) = {
|
|
|
|
static void (*handler[LASTEvent]) (XEvent *) = {
|
|
|
|
[ButtonPress] = buttonpress,
|
|
|
|
[ButtonPress] = buttonpress,
|
|
|
|
[ConfigureRequest] = configurerequest,
|
|
|
|
[ConfigureRequest] = configurerequest,
|
|
|
@ -229,7 +225,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
|
|
|
|
static Atom wmatom[WMLast], netatom[NetLast];
|
|
|
|
static Atom wmatom[WMLast], netatom[NetLast];
|
|
|
|
static Bool otherwm, readin;
|
|
|
|
static Bool otherwm, readin;
|
|
|
|
static Bool running = True;
|
|
|
|
static Bool running = True;
|
|
|
|
static uint tagset[] = {1, 1}; /* after start, first tag is selected */
|
|
|
|
static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */
|
|
|
|
static Client *clients = NULL;
|
|
|
|
static Client *clients = NULL;
|
|
|
|
static Client *sel = NULL;
|
|
|
|
static Client *sel = NULL;
|
|
|
|
static Client *stack = NULL;
|
|
|
|
static Client *stack = NULL;
|
|
|
@ -241,13 +237,13 @@ static Window root, barwin;
|
|
|
|
/* configuration, allows nested code to access above variables */
|
|
|
|
/* configuration, allows nested code to access above variables */
|
|
|
|
#include "config.h"
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
|
|
|
|
/* compile-time check if all tags fit into an uint bit array. */
|
|
|
|
/* compile-time check if all tags fit into an unsigned int bit array. */
|
|
|
|
struct NumTags { char limitexceeded[sizeof(uint) * 8 < LENGTH(tags) ? -1 : 1]; };
|
|
|
|
struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; };
|
|
|
|
|
|
|
|
|
|
|
|
/* function implementations */
|
|
|
|
/* function implementations */
|
|
|
|
void
|
|
|
|
void
|
|
|
|
applyrules(Client *c) {
|
|
|
|
applyrules(Client *c) {
|
|
|
|
uint i;
|
|
|
|
unsigned int i;
|
|
|
|
Rule *r;
|
|
|
|
Rule *r;
|
|
|
|
XClassHint ch = { 0 };
|
|
|
|
XClassHint ch = { 0 };
|
|
|
|
|
|
|
|
|
|
|
@ -304,7 +300,7 @@ attachstack(Client *c) {
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
buttonpress(XEvent *e) {
|
|
|
|
buttonpress(XEvent *e) {
|
|
|
|
uint i, x, click;
|
|
|
|
unsigned int i, x, click;
|
|
|
|
Arg arg = {0};
|
|
|
|
Arg arg = {0};
|
|
|
|
Client *c;
|
|
|
|
Client *c;
|
|
|
|
XButtonPressedEvent *ev = &e->xbutton;
|
|
|
|
XButtonPressedEvent *ev = &e->xbutton;
|
|
|
@ -546,7 +542,7 @@ drawbar(void) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
drawsquare(Bool filled, Bool empty, Bool invert, ulong col[ColLast]) {
|
|
|
|
drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
|
|
|
|
int x;
|
|
|
|
int x;
|
|
|
|
XGCValues gcv;
|
|
|
|
XGCValues gcv;
|
|
|
|
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
|
|
|
|
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
|
|
|
@ -567,7 +563,7 @@ drawsquare(Bool filled, Bool empty, Bool invert, ulong col[ColLast]) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
drawtext(const char *text, ulong col[ColLast], Bool invert) {
|
|
|
|
drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
|
|
|
|
int i, x, y, h, len, olen;
|
|
|
|
int i, x, y, h, len, olen;
|
|
|
|
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
|
|
|
|
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
|
|
|
|
char buf[256];
|
|
|
|
char buf[256];
|
|
|
@ -679,7 +675,7 @@ getclient(Window w) {
|
|
|
|
return c;
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ulong
|
|
|
|
unsigned long
|
|
|
|
getcolor(const char *colstr) {
|
|
|
|
getcolor(const char *colstr) {
|
|
|
|
Colormap cmap = DefaultColormap(dpy, screen);
|
|
|
|
Colormap cmap = DefaultColormap(dpy, screen);
|
|
|
|
XColor color;
|
|
|
|
XColor color;
|
|
|
@ -694,7 +690,7 @@ getstate(Window w) {
|
|
|
|
int format, status;
|
|
|
|
int format, status;
|
|
|
|
long result = -1;
|
|
|
|
long result = -1;
|
|
|
|
unsigned char *p = NULL;
|
|
|
|
unsigned char *p = NULL;
|
|
|
|
ulong n, extra;
|
|
|
|
unsigned long n, extra;
|
|
|
|
Atom real;
|
|
|
|
Atom real;
|
|
|
|
|
|
|
|
|
|
|
|
status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
|
|
|
|
status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
|
|
|
@ -708,7 +704,7 @@ getstate(Window w) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Bool
|
|
|
|
Bool
|
|
|
|
gettextprop(Window w, Atom atom, char *text, uint size) {
|
|
|
|
gettextprop(Window w, Atom atom, char *text, unsigned int size) {
|
|
|
|
char **list = NULL;
|
|
|
|
char **list = NULL;
|
|
|
|
int n;
|
|
|
|
int n;
|
|
|
|
XTextProperty name;
|
|
|
|
XTextProperty name;
|
|
|
@ -735,8 +731,8 @@ gettextprop(Window w, Atom atom, char *text, uint size) {
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
grabbuttons(Client *c, Bool focused) {
|
|
|
|
grabbuttons(Client *c, Bool focused) {
|
|
|
|
uint i, j;
|
|
|
|
unsigned int i, j;
|
|
|
|
uint modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
|
|
|
|
unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
|
|
|
|
|
|
|
|
|
|
|
|
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
|
|
|
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
|
|
|
if(focused) {
|
|
|
|
if(focused) {
|
|
|
@ -751,7 +747,7 @@ grabbuttons(Client *c, Bool focused) {
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
grabkeys(void) {
|
|
|
|
grabkeys(void) {
|
|
|
|
uint i, j;
|
|
|
|
unsigned int i, j;
|
|
|
|
KeyCode code;
|
|
|
|
KeyCode code;
|
|
|
|
XModifierKeymap *modmap;
|
|
|
|
XModifierKeymap *modmap;
|
|
|
|
|
|
|
|
|
|
|
@ -819,7 +815,7 @@ initfont(const char *fontstr) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Bool
|
|
|
|
Bool
|
|
|
|
isoccupied(uint t) {
|
|
|
|
isoccupied(unsigned int t) {
|
|
|
|
Client *c;
|
|
|
|
Client *c;
|
|
|
|
|
|
|
|
|
|
|
|
for(c = clients; c; c = c->next)
|
|
|
|
for(c = clients; c; c = c->next)
|
|
|
@ -844,7 +840,7 @@ isprotodel(Client *c) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Bool
|
|
|
|
Bool
|
|
|
|
isurgent(uint t) {
|
|
|
|
isurgent(unsigned int t) {
|
|
|
|
Client *c;
|
|
|
|
Client *c;
|
|
|
|
|
|
|
|
|
|
|
|
for(c = clients; c; c = c->next)
|
|
|
|
for(c = clients; c; c = c->next)
|
|
|
@ -855,7 +851,7 @@ isurgent(uint t) {
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
keypress(XEvent *e) {
|
|
|
|
keypress(XEvent *e) {
|
|
|
|
uint i;
|
|
|
|
unsigned int i;
|
|
|
|
KeySym keysym;
|
|
|
|
KeySym keysym;
|
|
|
|
XKeyEvent *ev;
|
|
|
|
XKeyEvent *ev;
|
|
|
|
|
|
|
|
|
|
|
@ -979,7 +975,7 @@ monocle(void) {
|
|
|
|
void
|
|
|
|
void
|
|
|
|
movemouse(const Arg *arg) {
|
|
|
|
movemouse(const Arg *arg) {
|
|
|
|
int x1, y1, ocx, ocy, di, nx, ny;
|
|
|
|
int x1, y1, ocx, ocy, di, nx, ny;
|
|
|
|
uint dui;
|
|
|
|
unsigned int dui;
|
|
|
|
Client *c;
|
|
|
|
Client *c;
|
|
|
|
Window dummy;
|
|
|
|
Window dummy;
|
|
|
|
XEvent ev;
|
|
|
|
XEvent ev;
|
|
|
@ -1216,7 +1212,7 @@ run(void) {
|
|
|
|
char sbuf[sizeof stext];
|
|
|
|
char sbuf[sizeof stext];
|
|
|
|
fd_set rd;
|
|
|
|
fd_set rd;
|
|
|
|
int r, xfd;
|
|
|
|
int r, xfd;
|
|
|
|
uint len, offset;
|
|
|
|
unsigned int len, offset;
|
|
|
|
XEvent ev;
|
|
|
|
XEvent ev;
|
|
|
|
|
|
|
|
|
|
|
|
/* main event loop, also reads status text from stdin */
|
|
|
|
/* main event loop, also reads status text from stdin */
|
|
|
@ -1272,7 +1268,7 @@ run(void) {
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
scan(void) {
|
|
|
|
scan(void) {
|
|
|
|
uint i, num;
|
|
|
|
unsigned int i, num;
|
|
|
|
Window *wins, d1, d2;
|
|
|
|
Window *wins, d1, d2;
|
|
|
|
XWindowAttributes wa;
|
|
|
|
XWindowAttributes wa;
|
|
|
|
|
|
|
|
|
|
|
@ -1333,7 +1329,7 @@ setmfact(const Arg *arg) {
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
setup(void) {
|
|
|
|
setup(void) {
|
|
|
|
uint i;
|
|
|
|
unsigned int i;
|
|
|
|
int w;
|
|
|
|
int w;
|
|
|
|
XSetWindowAttributes wa;
|
|
|
|
XSetWindowAttributes wa;
|
|
|
|
|
|
|
|
|
|
|
@ -1436,7 +1432,7 @@ tag(const Arg *arg) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
int
|
|
|
|
textnw(const char *text, uint len) {
|
|
|
|
textnw(const char *text, unsigned int len) {
|
|
|
|
XRectangle r;
|
|
|
|
XRectangle r;
|
|
|
|
|
|
|
|
|
|
|
|
if(dc.font.set) {
|
|
|
|
if(dc.font.set) {
|
|
|
@ -1449,7 +1445,7 @@ textnw(const char *text, uint len) {
|
|
|
|
void
|
|
|
|
void
|
|
|
|
tile(void) {
|
|
|
|
tile(void) {
|
|
|
|
int x, y, h, w, mw;
|
|
|
|
int x, y, h, w, mw;
|
|
|
|
uint i, n;
|
|
|
|
unsigned int i, n;
|
|
|
|
Client *c;
|
|
|
|
Client *c;
|
|
|
|
|
|
|
|
|
|
|
|
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next), n++);
|
|
|
|
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next), n++);
|
|
|
@ -1500,7 +1496,7 @@ togglefloating(const Arg *arg) {
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
toggletag(const Arg *arg) {
|
|
|
|
toggletag(const Arg *arg) {
|
|
|
|
uint mask = sel->tags ^ (arg->ui & TAGMASK);
|
|
|
|
unsigned int mask = sel->tags ^ (arg->ui & TAGMASK);
|
|
|
|
|
|
|
|
|
|
|
|
if(sel && mask) {
|
|
|
|
if(sel && mask) {
|
|
|
|
sel->tags = mask;
|
|
|
|
sel->tags = mask;
|
|
|
@ -1510,7 +1506,7 @@ toggletag(const Arg *arg) {
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
toggleview(const Arg *arg) {
|
|
|
|
toggleview(const Arg *arg) {
|
|
|
|
uint mask = tagset[seltags] ^ (arg->ui & TAGMASK);
|
|
|
|
unsigned int mask = tagset[seltags] ^ (arg->ui & TAGMASK);
|
|
|
|
|
|
|
|
|
|
|
|
if(mask) {
|
|
|
|
if(mask) {
|
|
|
|
tagset[seltags] = mask;
|
|
|
|
tagset[seltags] = mask;
|
|
|
|