Introduction
Introduction Statistics Contact Development Disclaimer Help
tsome more rearrangements - dwm - [fork] customized build of dwm, the dynamic w…
git clone git://src.adamsgaard.dk/dwm
Log
Files
Refs
README
LICENSE
---
commit 9449ea3e002990372383835b85ed18ceaf75e400
parent 49197fe4bf023478108c76c1bed74a7d1ef138de
Author: Anselm R. Garbe <[email protected]>
Date: Sun, 16 Sep 2007 12:34:08 +0200
some more rearrangements
Diffstat:
M dwm.c | 290 +++++++++++++++--------------…
1 file changed, 143 insertions(+), 147 deletions(-)
---
diff --git a/dwm.c b/dwm.c
t@@ -112,14 +112,14 @@ typedef struct {
regex_t *tagregex;
} Regs;
-/* functions */
-
+/* forward declarations */
static void applyrules(Client *c);
static void arrange(void);
static void attach(Client *c);
static void attachstack(Client *c);
static void ban(Client *c);
static void buttonpress(XEvent *e);
+static void checkotherwm(void);
static void cleanup(void);
static void compileregs(void);
static void configure(Client *c);
t@@ -140,17 +140,13 @@ static void focus(Client *c);
static void focusnext(const char *arg);
static void focusprev(const char *arg);
static Client *getclient(Window w);
+static unsigned long getcolor(const char *colstr);
static long getstate(Window w);
static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
static void grabbuttons(Client *c, Bool focused);
static unsigned int idxoftag(const char *tag);
-static void initbar(void);
-static unsigned long initcolor(const char *colstr);
static void initfont(const char *fontstr);
-static void initlayouts(void);
-static void initstyle(void);
static Bool isarrange(void (*func)());
-static Bool isfloating(void);
static Bool isoccupied(unsigned int t);
static Bool isprotodel(Client *c);
static Bool isvisible(Client *c);
t@@ -167,6 +163,7 @@ static void quit(const char *arg);
static void resize(Client *c, int x, int y, int w, int h, Bool sizehints);
static void resizemouse(Client *c);
static void restack(void);
+static void run(void);
static void scan(void);
static void setclientstate(Client *c, long state);
static void setlayout(const char *arg);
t@@ -236,7 +233,7 @@ static Regs *regs = NULL;
/* configuration, allows nested code to access above variables */
#include "config.h"
-/* implementation */
+/* functions*/
static void
applyrules(Client *c) {
static char buf[512];
t@@ -338,14 +335,14 @@ buttonpress(XEvent *e) {
focus(c);
if(CLEANMASK(ev->state) != MODKEY)
return;
- if(ev->button == Button1 && (isfloating() || c->isfloating)) {
+ if(ev->button == Button1 && (isarrange(floating) || c->isfloat…
restack();
movemouse(c);
}
else if(ev->button == Button2)
zoom(NULL);
else if(ev->button == Button3
- && (isfloating() || c->isfloating) && !c->isfixed)
+ && (isarrange(floating) || c->isfloating) && !c->isfixed)
{
restack();
resizemouse(c);
t@@ -354,6 +351,22 @@ buttonpress(XEvent *e) {
}
static void
+checkotherwm(void) {
+ otherwm = False;
+ XSetErrorHandler(xerrorstart);
+
+ /* this causes an error if some other window manager is running */
+ XSelectInput(dpy, root, SubstructureRedirectMask);
+ XSync(dpy, False);
+ if(otherwm)
+ eprint("dwm: another window manager is already running\n");
+ XSync(dpy, False);
+ XSetErrorHandler(NULL);
+ xerrorxlib = XSetErrorHandler(xerror);
+ XSync(dpy, False);
+}
+
+static void
cleanup(void) {
close(STDIN_FILENO);
while(stack) {
t@@ -446,7 +459,7 @@ configurerequest(XEvent *e) {
c->ismax = False;
if(ev->value_mask & CWBorderWidth)
c->border = ev->border_width;
- if(c->isfixed || c->isfloating || isfloating()) {
+ if(c->isfixed || c->isfloating || isarrange(floating)) {
if(ev->value_mask & CWX)
c->x = ev->x;
if(ev->value_mask & CWY)
t@@ -728,6 +741,16 @@ getclient(Window w) {
return c;
}
+static unsigned long
+getcolor(const char *colstr) {
+ Colormap cmap = DefaultColormap(dpy, screen);
+ XColor color;
+
+ if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
+ eprint("error, cannot allocate color '%s'\n", colstr);
+ return color.pixel;
+}
+
static long
getstate(Window w) {
int format, status;
t@@ -821,37 +844,6 @@ idxoftag(const char *tag) {
}
static void
-initbar(void) {
- XSetWindowAttributes wa;
-
- wa.override_redirect = 1;
- wa.background_pixmap = ParentRelative;
- wa.event_mask = ButtonPressMask | ExposureMask;
- barwin = XCreateWindow(dpy, root, sx, sy, sw, bh, 0,
- DefaultDepth(dpy, screen), CopyFromParent, DefaultVisu…
- CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
- XDefineCursor(dpy, barwin, cursor[CurNormal]);
- updatebarpos();
- XMapRaised(dpy, barwin);
- strcpy(stext, "dwm-"VERSION);
- dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, scree…
- dc.gc = XCreateGC(dpy, root, 0, 0);
- XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
- if(!dc.font.set)
- XSetFont(dpy, dc.gc, dc.font.xfont->fid);
-}
-
-static unsigned long
-initcolor(const char *colstr) {
- Colormap cmap = DefaultColormap(dpy, screen);
- XColor color;
-
- if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
- eprint("error, cannot allocate color '%s'\n", colstr);
- return color.pixel;
-}
-
-static void
initfont(const char *fontstr) {
char *def, **missing;
int i, n;
t@@ -893,30 +885,6 @@ initfont(const char *fontstr) {
dc.font.height = dc.font.ascent + dc.font.descent;
}
-static void
-initlayouts(void) {
- unsigned int i, w;
-
- nlayouts = sizeof layouts / sizeof layouts[0];
- for(blw = i = 0; i < nlayouts; i++) {
- w = textw(layouts[i].symbol);
- if(w > blw)
- blw = w;
- }
-}
-
-static void
-initstyle(void) {
- dc.norm[ColBorder] = initcolor(NORMBORDERCOLOR);
- dc.norm[ColBG] = initcolor(NORMBGCOLOR);
- dc.norm[ColFG] = initcolor(NORMFGCOLOR);
- dc.sel[ColBorder] = initcolor(SELBORDERCOLOR);
- dc.sel[ColBG] = initcolor(SELBGCOLOR);
- dc.sel[ColFG] = initcolor(SELFGCOLOR);
- initfont(FONT);
- dc.h = bh = dc.font.height + 2;
-}
-
static Bool
isarrange(void (*func)())
{
t@@ -924,11 +892,6 @@ isarrange(void (*func)())
}
static Bool
-isfloating(void) {
- return layouts[ltidx].arrange == floating;
-}
-
-static Bool
isoccupied(unsigned int t) {
Client *c;
t@@ -1300,9 +1263,9 @@ restack(void) {
drawbar();
if(!sel)
return;
- if(sel->isfloating || isfloating())
+ if(sel->isfloating || isarrange(floating))
XRaiseWindow(dpy, sel->win);
- if(!isfloating()) {
+ if(!isarrange(floating)) {
wc.stack_mode = Below;
wc.sibling = barwin;
if(!sel->isfloating) {
t@@ -1321,6 +1284,54 @@ restack(void) {
}
static void
+run(void) {
+ char *p;
+ int r, xfd;
+ fd_set rd;
+ XEvent ev;
+
+ /* main event loop, also reads status text from stdin */
+ XSync(dpy, False);
+ xfd = ConnectionNumber(dpy);
+ readin = True;
+ while(running) {
+ FD_ZERO(&rd);
+ if(readin)
+ FD_SET(STDIN_FILENO, &rd);
+ FD_SET(xfd, &rd);
+ if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) {
+ if(errno == EINTR)
+ continue;
+ eprint("select failed\n");
+ }
+ if(FD_ISSET(STDIN_FILENO, &rd)) {
+ switch(r = read(STDIN_FILENO, stext, sizeof stext - 1)…
+ case -1:
+ strncpy(stext, strerror(errno), sizeof stext -…
+ stext[sizeof stext - 1] = '\0';
+ readin = False;
+ break;
+ case 0:
+ strncpy(stext, "EOF", 4);
+ readin = False;
+ break;
+ default:
+ for(stext[r] = '\0', p = stext + strlen(stext)…
+ for(; p >= stext && *p != '\n'; --p);
+ if(p > stext)
+ strncpy(stext, p + 1, sizeof stext);
+ }
+ drawbar();
+ }
+ while(XPending(dpy)) {
+ XNextEvent(dpy, &ev);
+ if(handler[ev.type])
+ (handler[ev.type])(&ev); /* call handler */
+ }
+ }
+}
+
+static void
scan(void) {
unsigned int i, num;
Window *wins, d1, d2;
t@@ -1401,8 +1412,7 @@ setmwfact(const char *arg) {
static void
setup(void) {
- int i, j;
- unsigned int mask;
+ unsigned int i, j, mask;
Window w;
XModifierKeymap *modmap;
XSetWindowAttributes wa;
t@@ -1416,37 +1426,80 @@ setup(void) {
netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
PropModeReplace, (unsigned char *) netatom, NetLast);
+
/* init cursors */
cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
+
+ /* init geometry */
+ sx = sy = 0;
+ sw = DisplayWidth(dpy, screen);
+ sh = DisplayHeight(dpy, screen);
+
/* init modifier map */
modmap = XGetModifierMapping(dpy);
- for (i = 0; i < 8; i++)
- for (j = 0; j < modmap->max_keypermod; j++) {
+ for(i = 0; i < 8; i++)
+ for(j = 0; j < modmap->max_keypermod; j++) {
if(modmap->modifiermap[i * modmap->max_keypermod + j]
- == XKeysymToKeycode(dpy, XK_Num_Lock))
+ == XKeysymToKeycode(dpy, XK_Num_Lock))
numlockmask = (1 << i);
}
XFreeModifiermap(modmap);
+
/* select for events */
wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
| EnterWindowMask | LeaveWindowMask | StructureNotifyMask;
wa.cursor = cursor[CurNormal];
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
XSelectInput(dpy, root, wa.event_mask);
- keypress(NULL); /* grabkeys */
+
+ /* grab keys */
+ keypress(NULL);
+
+ /* init tags */
compileregs();
for(ntags = 0; tags[ntags]; ntags++);
seltags = emallocz(sizeof(Bool) * ntags);
seltags[0] = True;
- /* geometry */
- sx = sy = 0;
- sw = DisplayWidth(dpy, screen);
- sh = DisplayHeight(dpy, screen);
- initstyle();
- initlayouts();
- initbar();
+
+ /* init appearance */
+ dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR);
+ dc.norm[ColBG] = getcolor(NORMBGCOLOR);
+ dc.norm[ColFG] = getcolor(NORMFGCOLOR);
+ dc.sel[ColBorder] = getcolor(SELBORDERCOLOR);
+ dc.sel[ColBG] = getcolor(SELBGCOLOR);
+ dc.sel[ColFG] = getcolor(SELFGCOLOR);
+ initfont(FONT);
+ dc.h = bh = dc.font.height + 2;
+
+ /* init layouts */
+ mwfact = MWFACT;
+ nlayouts = sizeof layouts / sizeof layouts[0];
+ for(blw = i = 0; i < nlayouts; i++) {
+ j = textw(layouts[i].symbol);
+ if(j > blw)
+ blw = j;
+ }
+
+ /* init bar */
+ bpos = BARPOS;
+ wa.override_redirect = 1;
+ wa.background_pixmap = ParentRelative;
+ wa.event_mask = ButtonPressMask | ExposureMask;
+ barwin = XCreateWindow(dpy, root, sx, sy, sw, bh, 0,
+ DefaultDepth(dpy, screen), CopyFromParent, DefaultVisu…
+ CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
+ XDefineCursor(dpy, barwin, cursor[CurNormal]);
+ updatebarpos();
+ XMapRaised(dpy, barwin);
+ strcpy(stext, "dwm-"VERSION);
+ dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, scree…
+ dc.gc = XCreateGC(dpy, root, 0, 0);
+ XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+ if(!dc.font.set)
+ XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+
/* multihead support */
selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
}
t@@ -1568,7 +1621,7 @@ static void
togglemax(const char *arg) {
XEvent ev;
- if(!sel || (!isfloating() && !sel->isfloating) || sel->isfixed)
+ if(!sel || (!isarrange(floating) && !sel->isfloating) || sel->isfixed)
return;
if((sel->ismax = !sel->ismax)) {
sel->rx = sel->x;
t@@ -1794,81 +1847,24 @@ zoom(const char *arg) {
int
main(int argc, char *argv[]) {
- char *p;
- int r, xfd;
- fd_set rd;
- XEvent ev;
-
if(argc == 2 && !strcmp("-v", argv[1]))
eprint("dwm-"VERSION", © 2006-2007 A. R. Garbe, S. van Dijk, …
else if(argc != 1)
eprint("usage: dwm [-v]\n");
- /* macros from config.h can be used at function level only */
- mwfact = MWFACT;
- bpos = BARPOS;
-
setlocale(LC_CTYPE, "");
if(!(dpy = XOpenDisplay(0)))
eprint("dwm: cannot open display\n");
- xfd = ConnectionNumber(dpy);
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
- otherwm = False;
- XSetErrorHandler(xerrorstart);
- /* this causes an error if some other window manager is running */
- XSelectInput(dpy, root, SubstructureRedirectMask);
- XSync(dpy, False);
- if(otherwm)
- eprint("dwm: another window manager is already running\n");
- XSync(dpy, False);
- XSetErrorHandler(NULL);
- xerrorxlib = XSetErrorHandler(xerror);
- XSync(dpy, False);
+ checkotherwm();
setup();
drawbar();
scan();
-
- /* main event loop, also reads status text from stdin */
- XSync(dpy, False);
- readin = True;
- while(running) {
- FD_ZERO(&rd);
- if(readin)
- FD_SET(STDIN_FILENO, &rd);
- FD_SET(xfd, &rd);
- if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) {
- if(errno == EINTR)
- continue;
- eprint("select failed\n");
- }
- if(FD_ISSET(STDIN_FILENO, &rd)) {
- switch(r = read(STDIN_FILENO, stext, sizeof stext - 1)…
- case -1:
- strncpy(stext, strerror(errno), sizeof stext -…
- stext[sizeof stext - 1] = '\0';
- readin = False;
- break;
- case 0:
- strncpy(stext, "EOF", 4);
- readin = False;
- break;
- default:
- for(stext[r] = '\0', p = stext + strlen(stext)…
- for(; p >= stext && *p != '\n'; --p);
- if(p > stext)
- strncpy(stext, p + 1, sizeof stext);
- }
- drawbar();
- }
- while(XPending(dpy)) {
- XNextEvent(dpy, &ev);
- if(handler[ev.type])
- (handler[ev.type])(&ev); /* call handler */
- }
- }
+ run();
cleanup();
+
XCloseDisplay(dpy);
return 0;
}
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.