tadded screen.c, removed layout.c and tag.c - dwm - [fork] customized build of … | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 47765f728614c348aa7dfc2eed6f754efc376922 | |
parent 96d7fe16eaf6b656800f08da3156bacd75ca3b08 | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Sun, 19 Aug 2007 10:57:02 +0200 | |
added screen.c, removed layout.c and tag.c | |
Diffstat: | |
M Makefile | 2 +- | |
M client.c | 8 ++++---- | |
M config.mk | 4 ++-- | |
M dwm.h | 35 ++++++++++++++---------------… | |
D layout.c | 219 -----------------------------… | |
M main.c | 2 +- | |
A screen.c | 383 +++++++++++++++++++++++++++++… | |
D tag.c | 174 -----------------------------… | |
8 files changed, 407 insertions(+), 420 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
t@@ -3,7 +3,7 @@ | |
include config.mk | |
-SRC += client.c draw.c event.c layout.c main.c tag.c util.c | |
+SRC += client.c draw.c event.c main.c screen.c util.c | |
OBJ = ${SRC:.c=.o} | |
all: options dwm | |
diff --git a/client.c b/client.c | |
t@@ -182,7 +182,7 @@ killclient(const char *arg) { | |
} | |
Bool | |
-loadprops(Client *c) { | |
+getprops(Client *c) { | |
unsigned int i; | |
Bool result = False; | |
t@@ -242,11 +242,11 @@ manage(Window w, XWindowAttributes *wa) { | |
if(t) | |
for(i = 0; i < ntags; i++) | |
c->tags[i] = t->tags[i]; | |
- if(!loadprops(c)) | |
+ if(!getprops(c)) | |
applyrules(c); | |
if(!c->isfloating) | |
c->isfloating = (rettrans == Success) || c->isfixed; | |
- saveprops(c); | |
+ setprops(c); | |
attach(c); | |
attachstack(c); | |
XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); /* some window… | |
t@@ -318,7 +318,7 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehin… | |
} | |
void | |
-saveprops(Client *c) { | |
+setprops(Client *c) { | |
unsigned int i; | |
for(i = 0; i < ntags && i < sizeof prop - 1; i++) | |
diff --git a/config.mk b/config.mk | |
t@@ -20,8 +20,8 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 | |
# flags | |
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" | |
LDFLAGS = -s ${LIBS} | |
-CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" | |
-LDFLAGS = -g ${LIBS} | |
+#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" | |
+#LDFLAGS = -g ${LIBS} | |
# Solaris | |
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" | |
diff --git a/dwm.h b/dwm.h | |
t@@ -96,11 +96,11 @@ void configure(Client *c); /* send syntheti… | |
void detach(Client *c); /* detaches c from global clien… | |
void focus(Client *c); /* focus c if visible && !NULL, … | |
void killclient(const char *arg); /* kill sel nicely */ | |
-Bool loadprops(Client *c); /* loads client properties */ | |
+Bool getprops(Client *c); /* gets client properties */ | |
void manage(Window w, XWindowAttributes *wa); /* manage new client */ | |
void resize(Client *c, int x, int y, | |
int w, int h, Bool sizehints); /* resize with given coo… | |
-void saveprops(Client *c); /* saves client properties */ | |
+void setprops(Client *c); /* sets client properties */ | |
void unban(Client *c); /* unbans c */ | |
void unmanage(Client *c, long state); /* unmanage c */ | |
void updatesizehints(Client *c); /* update the size hint variables of c… | |
t@@ -114,22 +114,6 @@ unsigned int textw(const char *text); /* return th… | |
/* event.c */ | |
void grabkeys(void); /* grab all keys defined in config… | |
-/* layout.c */ | |
-void arrange(void); /* arranges all windows depending o… | |
-void focusnext(const char *arg); /* focuses next visible client */ | |
-void focusprev(const char *arg); /* focuses prev visible client */ | |
-const char *getsymbol(void); /* returns symbol of enabled layou… | |
-Bool isfloating(void); /* returns True if floating layo… | |
-Bool isarrange(void (*func)()); /* returns True if func is the … | |
-void initlayouts(void); /* initialize layout array */ | |
-void loaddwmprops(void); /* loads dwm properties */ | |
-Client *nexttiled(Client *c); /* returns tiled successor of c */ | |
-void restack(void); /* restores z layers of all clients… | |
-void savedwmprops(void); /* saves dwm properties */ | |
-void setlayout(const char *arg); /* sets layout, NULL means next layout… | |
-void togglebar(const char *arg); /* shows/hides the bar */ | |
-void togglemax(const char *arg); /* toggles maximization of floating cl… | |
- | |
/* main.c */ | |
Bool gettextprop(Window w, Atom atom, | |
char *text, unsigned int size); /* return text property, UTF-8… | |
t@@ -137,12 +121,25 @@ void updatebarpos(void); /* updates the b… | |
void quit(const char *arg); /* quit dwm nicely */ | |
int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */ | |
-/* tag.c */ | |
+/* screen.c */ | |
void applyrules(Client *c); /* applies rules to c */ | |
+void arrange(void); /* arranges all windows depending o… | |
void compileregs(void); /* initialize regexps of rules … | |
+void focusnext(const char *arg); /* focuses next visible client */ | |
+void focusprev(const char *arg); /* focuses prev visible client */ | |
+const char *getsymbol(void); /* returns symbol of enabled layou… | |
+void initlayouts(void); /* initialize layout array */ | |
+Bool isarrange(void (*func)()); /* returns True if func is the … | |
+Bool isfloating(void); /* returns True if floating layo… | |
Bool isvisible(Client *c); /* returns True if client is visible… | |
+void getdwmprops(void); /* gets dwm properties */ | |
+Client *nexttiled(Client *c); /* returns tiled successor of c */ | |
+void restack(void); /* restores z layers of all clients… | |
+void setlayout(const char *arg); /* sets layout, NULL means next layout… | |
void tag(const char *arg); /* tags sel with arg's index */ | |
+void togglebar(const char *arg); /* shows/hides the bar */ | |
void togglefloating(const char *arg); /* toggles sel between floating/t… | |
+void togglemax(const char *arg); /* toggles maximization of floating cl… | |
void toggletag(const char *arg); /* toggles sel tags with arg's index */ | |
void toggleview(const char *arg); /* toggles the tag with arg's index (… | |
void view(const char *arg); /* views the tag with arg's index */ | |
diff --git a/layout.c b/layout.c | |
t@@ -1,219 +0,0 @@ | |
-/* See LICENSE file for copyright and license details. */ | |
-#include "dwm.h" | |
-#include <stdlib.h> | |
-#include <string.h> | |
-#include <X11/Xatom.h> | |
-#include <X11/Xutil.h> | |
- | |
-/* static */ | |
- | |
-typedef struct { | |
- const char *symbol; | |
- void (*arrange)(void); | |
-} Layout; | |
- | |
-unsigned int blw = 0; | |
-static char prop[128]; | |
-static unsigned int ltidx = 0; /* default */ | |
- | |
-static void | |
-floating(void) { /* default floating layout */ | |
- Client *c; | |
- | |
- for(c = clients; c; c = c->next) | |
- if(isvisible(c)) | |
- resize(c, c->x, c->y, c->w, c->h, True); | |
-} | |
- | |
-static unsigned int nlayouts = 0; | |
- | |
-LAYOUTS | |
- | |
-/* extern */ | |
- | |
-void | |
-arrange(void) { | |
- Client *c; | |
- | |
- for(c = clients; c; c = c->next) | |
- if(isvisible(c)) | |
- unban(c); | |
- else | |
- ban(c); | |
- layouts[ltidx].arrange(); | |
- focus(NULL); | |
- restack(); | |
-} | |
- | |
-void | |
-focusnext(const char *arg) { | |
- Client *c; | |
- | |
- if(!sel) | |
- return; | |
- for(c = sel->next; c && !isvisible(c); c = c->next); | |
- if(!c) | |
- for(c = clients; c && !isvisible(c); c = c->next); | |
- if(c) { | |
- focus(c); | |
- restack(); | |
- } | |
-} | |
- | |
-void | |
-focusprev(const char *arg) { | |
- Client *c; | |
- | |
- if(!sel) | |
- return; | |
- for(c = sel->prev; c && !isvisible(c); c = c->prev); | |
- if(!c) { | |
- for(c = clients; c && c->next; c = c->next); | |
- for(; c && !isvisible(c); c = c->prev); | |
- } | |
- if(c) { | |
- focus(c); | |
- restack(); | |
- } | |
-} | |
- | |
-const char * | |
-getsymbol(void) | |
-{ | |
- return layouts[ltidx].symbol; | |
-} | |
- | |
-Bool | |
-isfloating(void) { | |
- return layouts[ltidx].arrange == floating; | |
-} | |
- | |
-Bool | |
-isarrange(void (*func)()) | |
-{ | |
- return func == layouts[ltidx].arrange; | |
-} | |
- | |
-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; | |
- } | |
-} | |
- | |
-void | |
-loaddwmprops(void) { | |
- unsigned int i; | |
- | |
- if(gettextprop(root, dwmprops, prop, sizeof prop)) { | |
- for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'… | |
- seltags[i] = prop[i] == '1'; | |
- if(i < sizeof prop - 1 && prop[i] != '\0') { | |
- if(prop[i] < nlayouts) | |
- ltidx = prop[i]; | |
- } | |
- } | |
-} | |
- | |
-Client * | |
-nexttiled(Client *c) { | |
- for(; c && (c->isfloating || !isvisible(c)); c = c->next); | |
- return c; | |
-} | |
- | |
-void | |
-restack(void) { | |
- Client *c; | |
- XEvent ev; | |
- XWindowChanges wc; | |
- | |
- drawstatus(); | |
- if(!sel) | |
- return; | |
- if(sel->isfloating || isfloating()) | |
- XRaiseWindow(dpy, sel->win); | |
- if(!isfloating()) { | |
- wc.stack_mode = Below; | |
- wc.sibling = barwin; | |
- if(!sel->isfloating) { | |
- XConfigureWindow(dpy, sel->win, CWSibling | CWStackMod… | |
- wc.sibling = sel->win; | |
- } | |
- for(c = nexttiled(clients); c; c = nexttiled(c->next)) { | |
- if(c == sel) | |
- continue; | |
- XConfigureWindow(dpy, c->win, CWSibling | CWStackMode,… | |
- wc.sibling = c->win; | |
- } | |
- } | |
- XSync(dpy, False); | |
- while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
-} | |
- | |
-void | |
-savedwmprops(void) { | |
- unsigned int i; | |
- | |
- for(i = 0; i < ntags && i < sizeof prop - 1; i++) | |
- prop[i] = seltags[i] ? '1' : '0'; | |
- if(i < sizeof prop - 1) | |
- prop[i++] = (char)ltidx; | |
- prop[i] = '\0'; | |
- XChangeProperty(dpy, root, dwmprops, XA_STRING, 8, | |
- PropModeReplace, (unsigned char *)prop, i); | |
-} | |
- | |
-void | |
-setlayout(const char *arg) { | |
- int i; | |
- | |
- if(!arg) { | |
- if(++ltidx == nlayouts) | |
- ltidx = 0;; | |
- } | |
- else { | |
- i = atoi(arg); | |
- if(i < 0 || i >= nlayouts) | |
- return; | |
- ltidx = i; | |
- } | |
- if(sel) | |
- arrange(); | |
- else | |
- drawstatus(); | |
- savedwmprops(); | |
-} | |
- | |
-void | |
-togglebar(const char *arg) { | |
- if(bpos == BarOff) | |
- bpos = (BARPOS == BarOff) ? BarTop : BARPOS; | |
- else | |
- bpos = BarOff; | |
- updatebarpos(); | |
- arrange(); | |
-} | |
- | |
-void | |
-togglemax(const char *arg) { | |
- XEvent ev; | |
- | |
- if(!sel || (!isfloating() && !sel->isfloating) || sel->isfixed) | |
- return; | |
- if((sel->ismax = !sel->ismax)) { | |
- sel->rx = sel->x; | |
- sel->ry = sel->y; | |
- sel->rw = sel->w; | |
- sel->rh = sel->h; | |
- resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->bo… | |
- } | |
- else | |
- resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True); | |
- drawstatus(); | |
- while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
-} | |
diff --git a/main.c b/main.c | |
t@@ -206,7 +206,7 @@ setup(void) { | |
XSetFont(dpy, dc.gc, dc.font.xfont->fid); | |
/* multihead support */ | |
selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); | |
- loaddwmprops(); | |
+ getdwmprops(); | |
} | |
/* | |
diff --git a/screen.c b/screen.c | |
t@@ -0,0 +1,383 @@ | |
+/* See LICENSE file for copyright and license details. */ | |
+#include "dwm.h" | |
+#include <regex.h> | |
+#include <stdio.h> | |
+#include <stdlib.h> | |
+#include <string.h> | |
+#include <X11/Xatom.h> | |
+#include <X11/Xutil.h> | |
+ | |
+/* static */ | |
+ | |
+typedef struct { | |
+ const char *symbol; | |
+ void (*arrange)(void); | |
+} Layout; | |
+ | |
+typedef struct { | |
+ const char *prop; | |
+ const char *tags; | |
+ Bool isfloating; | |
+} Rule; | |
+ | |
+typedef struct { | |
+ regex_t *propregex; | |
+ regex_t *tagregex; | |
+} Regs; | |
+ | |
+TAGS | |
+RULES | |
+ | |
+static char prop[512]; | |
+static unsigned int nrules = 0; | |
+static unsigned int nlayouts = 0; | |
+static unsigned int ltidx = 0; /* default */ | |
+static Regs *regs = NULL; | |
+ | |
+static unsigned int | |
+idxoftag(const char *tag) { | |
+ unsigned int i; | |
+ | |
+ for(i = 0; i < ntags; i++) | |
+ if(tags[i] == tag) | |
+ return i; | |
+ return 0; | |
+} | |
+ | |
+static void | |
+floating(void) { /* default floating layout */ | |
+ Client *c; | |
+ | |
+ for(c = clients; c; c = c->next) | |
+ if(isvisible(c)) | |
+ resize(c, c->x, c->y, c->w, c->h, True); | |
+} | |
+ | |
+static void | |
+setdwmprops(void) { | |
+ unsigned int i; | |
+ | |
+ for(i = 0; i < ntags && i < sizeof prop - 1; i++) | |
+ prop[i] = seltags[i] ? '1' : '0'; | |
+ if(i < sizeof prop - 1) | |
+ prop[i++] = (char)ltidx; | |
+ prop[i] = '\0'; | |
+ XChangeProperty(dpy, root, dwmprops, XA_STRING, 8, | |
+ PropModeReplace, (unsigned char *)prop, i); | |
+} | |
+ | |
+LAYOUTS | |
+ | |
+/* extern */ | |
+ | |
+unsigned int blw = 0; | |
+ | |
+void | |
+applyrules(Client *c) { | |
+ unsigned int i, j; | |
+ regmatch_t tmp; | |
+ Bool matched = False; | |
+ XClassHint ch = { 0 }; | |
+ | |
+ /* rule matching */ | |
+ XGetClassHint(dpy, c->win, &ch); | |
+ snprintf(prop, sizeof prop, "%s:%s:%s", | |
+ ch.res_class ? ch.res_class : "", | |
+ ch.res_name ? ch.res_name : "", c->name); | |
+ for(i = 0; i < nrules; i++) | |
+ if(regs[i].propregex && !regexec(regs[i].propregex, prop, 1, &… | |
+ c->isfloating = rules[i].isfloating; | |
+ for(j = 0; regs[i].tagregex && j < ntags; j++) { | |
+ if(!regexec(regs[i].tagregex, tags[j], 1, &tmp… | |
+ matched = True; | |
+ c->tags[j] = True; | |
+ } | |
+ } | |
+ } | |
+ if(ch.res_class) | |
+ XFree(ch.res_class); | |
+ if(ch.res_name) | |
+ XFree(ch.res_name); | |
+ if(!matched) | |
+ for(i = 0; i < ntags; i++) | |
+ c->tags[i] = seltags[i]; | |
+} | |
+ | |
+void | |
+arrange(void) { | |
+ Client *c; | |
+ | |
+ for(c = clients; c; c = c->next) | |
+ if(isvisible(c)) | |
+ unban(c); | |
+ else | |
+ ban(c); | |
+ layouts[ltidx].arrange(); | |
+ focus(NULL); | |
+ restack(); | |
+} | |
+ | |
+void | |
+compileregs(void) { | |
+ unsigned int i; | |
+ regex_t *reg; | |
+ | |
+ if(regs) | |
+ return; | |
+ nrules = sizeof rules / sizeof rules[0]; | |
+ regs = emallocz(nrules * sizeof(Regs)); | |
+ for(i = 0; i < nrules; i++) { | |
+ if(rules[i].prop) { | |
+ reg = emallocz(sizeof(regex_t)); | |
+ if(regcomp(reg, rules[i].prop, REG_EXTENDED)) | |
+ free(reg); | |
+ else | |
+ regs[i].propregex = reg; | |
+ } | |
+ if(rules[i].tags) { | |
+ reg = emallocz(sizeof(regex_t)); | |
+ if(regcomp(reg, rules[i].tags, REG_EXTENDED)) | |
+ free(reg); | |
+ else | |
+ regs[i].tagregex = reg; | |
+ } | |
+ } | |
+} | |
+ | |
+void | |
+focusnext(const char *arg) { | |
+ Client *c; | |
+ | |
+ if(!sel) | |
+ return; | |
+ for(c = sel->next; c && !isvisible(c); c = c->next); | |
+ if(!c) | |
+ for(c = clients; c && !isvisible(c); c = c->next); | |
+ if(c) { | |
+ focus(c); | |
+ restack(); | |
+ } | |
+} | |
+ | |
+void | |
+focusprev(const char *arg) { | |
+ Client *c; | |
+ | |
+ if(!sel) | |
+ return; | |
+ for(c = sel->prev; c && !isvisible(c); c = c->prev); | |
+ if(!c) { | |
+ for(c = clients; c && c->next; c = c->next); | |
+ for(; c && !isvisible(c); c = c->prev); | |
+ } | |
+ if(c) { | |
+ focus(c); | |
+ restack(); | |
+ } | |
+} | |
+ | |
+const char * | |
+getsymbol(void) | |
+{ | |
+ return layouts[ltidx].symbol; | |
+} | |
+ | |
+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; | |
+ } | |
+} | |
+ | |
+Bool | |
+isfloating(void) { | |
+ return layouts[ltidx].arrange == floating; | |
+} | |
+ | |
+Bool | |
+isarrange(void (*func)()) | |
+{ | |
+ return func == layouts[ltidx].arrange; | |
+} | |
+ | |
+Bool | |
+isvisible(Client *c) { | |
+ unsigned int i; | |
+ | |
+ for(i = 0; i < ntags; i++) | |
+ if(c->tags[i] && seltags[i]) | |
+ return True; | |
+ return False; | |
+} | |
+ | |
+void | |
+getdwmprops(void) { | |
+ unsigned int i; | |
+ | |
+ if(gettextprop(root, dwmprops, prop, sizeof prop)) { | |
+ for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'… | |
+ seltags[i] = prop[i] == '1'; | |
+ if(i < sizeof prop - 1 && prop[i] != '\0') { | |
+ if(prop[i] < nlayouts) | |
+ ltidx = prop[i]; | |
+ } | |
+ } | |
+} | |
+ | |
+Client * | |
+nexttiled(Client *c) { | |
+ for(; c && (c->isfloating || !isvisible(c)); c = c->next); | |
+ return c; | |
+} | |
+ | |
+void | |
+restack(void) { | |
+ Client *c; | |
+ XEvent ev; | |
+ XWindowChanges wc; | |
+ | |
+ drawstatus(); | |
+ if(!sel) | |
+ return; | |
+ if(sel->isfloating || isfloating()) | |
+ XRaiseWindow(dpy, sel->win); | |
+ if(!isfloating()) { | |
+ wc.stack_mode = Below; | |
+ wc.sibling = barwin; | |
+ if(!sel->isfloating) { | |
+ XConfigureWindow(dpy, sel->win, CWSibling | CWStackMod… | |
+ wc.sibling = sel->win; | |
+ } | |
+ for(c = nexttiled(clients); c; c = nexttiled(c->next)) { | |
+ if(c == sel) | |
+ continue; | |
+ XConfigureWindow(dpy, c->win, CWSibling | CWStackMode,… | |
+ wc.sibling = c->win; | |
+ } | |
+ } | |
+ XSync(dpy, False); | |
+ while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
+} | |
+ | |
+void | |
+setlayout(const char *arg) { | |
+ int i; | |
+ | |
+ if(!arg) { | |
+ if(++ltidx == nlayouts) | |
+ ltidx = 0;; | |
+ } | |
+ else { | |
+ i = atoi(arg); | |
+ if(i < 0 || i >= nlayouts) | |
+ return; | |
+ ltidx = i; | |
+ } | |
+ if(sel) | |
+ arrange(); | |
+ else | |
+ drawstatus(); | |
+ setdwmprops(); | |
+} | |
+ | |
+void | |
+tag(const char *arg) { | |
+ unsigned int i; | |
+ | |
+ if(!sel) | |
+ return; | |
+ for(i = 0; i < ntags; i++) | |
+ sel->tags[i] = arg == NULL; | |
+ i = idxoftag(arg); | |
+ if(i >= 0 && i < ntags) | |
+ sel->tags[i] = True; | |
+ setprops(sel); | |
+ arrange(); | |
+} | |
+ | |
+void | |
+togglebar(const char *arg) { | |
+ if(bpos == BarOff) | |
+ bpos = (BARPOS == BarOff) ? BarTop : BARPOS; | |
+ else | |
+ bpos = BarOff; | |
+ updatebarpos(); | |
+ arrange(); | |
+} | |
+ | |
+void | |
+togglefloating(const char *arg) { | |
+ if(!sel || isfloating()) | |
+ return; | |
+ sel->isfloating = !sel->isfloating; | |
+ if(sel->isfloating) { | |
+ resize(sel, sel->x, sel->y, sel->w, sel->h, True); | |
+ setprops(sel); | |
+ } | |
+ arrange(); | |
+} | |
+ | |
+void | |
+togglemax(const char *arg) { | |
+ XEvent ev; | |
+ | |
+ if(!sel || (!isfloating() && !sel->isfloating) || sel->isfixed) | |
+ return; | |
+ if((sel->ismax = !sel->ismax)) { | |
+ sel->rx = sel->x; | |
+ sel->ry = sel->y; | |
+ sel->rw = sel->w; | |
+ sel->rh = sel->h; | |
+ resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->bo… | |
+ } | |
+ else | |
+ resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True); | |
+ drawstatus(); | |
+ while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
+} | |
+ | |
+void | |
+toggletag(const char *arg) { | |
+ unsigned int i, j; | |
+ | |
+ if(!sel) | |
+ return; | |
+ i = idxoftag(arg); | |
+ sel->tags[i] = !sel->tags[i]; | |
+ for(j = 0; j < ntags && !sel->tags[j]; j++); | |
+ if(j == ntags) | |
+ sel->tags[i] = True; | |
+ setprops(sel); | |
+ arrange(); | |
+} | |
+ | |
+void | |
+toggleview(const char *arg) { | |
+ unsigned int i, j; | |
+ | |
+ i = idxoftag(arg); | |
+ seltags[i] = !seltags[i]; | |
+ for(j = 0; j < ntags && !seltags[j]; j++); | |
+ if(j == ntags) | |
+ seltags[i] = True; /* cannot toggle last view */ | |
+ setdwmprops(); | |
+ arrange(); | |
+} | |
+ | |
+void | |
+view(const char *arg) { | |
+ unsigned int i; | |
+ | |
+ for(i = 0; i < ntags; i++) | |
+ seltags[i] = arg == NULL; | |
+ i = idxoftag(arg); | |
+ if(i >= 0 && i < ntags) | |
+ seltags[i] = True; | |
+ setdwmprops(); | |
+ arrange(); | |
+} | |
diff --git a/tag.c b/tag.c | |
t@@ -1,174 +0,0 @@ | |
-/* See LICENSE file for copyright and license details. */ | |
-#include "dwm.h" | |
-#include <regex.h> | |
-#include <stdio.h> | |
-#include <stdlib.h> | |
-#include <X11/Xutil.h> | |
- | |
-/* static */ | |
- | |
-typedef struct { | |
- const char *prop; | |
- const char *tags; | |
- Bool isfloating; | |
-} Rule; | |
- | |
-typedef struct { | |
- regex_t *propregex; | |
- regex_t *tagregex; | |
-} Regs; | |
- | |
-TAGS | |
-RULES | |
- | |
-static Regs *regs = NULL; | |
-static unsigned int nrules = 0; | |
-static char prop[512]; | |
- | |
-static unsigned int | |
-idxoftag(const char *tag) { | |
- unsigned int i; | |
- | |
- for(i = 0; i < ntags; i++) | |
- if(tags[i] == tag) | |
- return i; | |
- return 0; | |
-} | |
- | |
-/* extern */ | |
- | |
-void | |
-applyrules(Client *c) { | |
- unsigned int i, j; | |
- regmatch_t tmp; | |
- Bool matched = False; | |
- XClassHint ch = { 0 }; | |
- | |
- /* rule matching */ | |
- XGetClassHint(dpy, c->win, &ch); | |
- snprintf(prop, sizeof prop, "%s:%s:%s", | |
- ch.res_class ? ch.res_class : "", | |
- ch.res_name ? ch.res_name : "", c->name); | |
- for(i = 0; i < nrules; i++) | |
- if(regs[i].propregex && !regexec(regs[i].propregex, prop, 1, &… | |
- c->isfloating = rules[i].isfloating; | |
- for(j = 0; regs[i].tagregex && j < ntags; j++) { | |
- if(!regexec(regs[i].tagregex, tags[j], 1, &tmp… | |
- matched = True; | |
- c->tags[j] = True; | |
- } | |
- } | |
- } | |
- if(ch.res_class) | |
- XFree(ch.res_class); | |
- if(ch.res_name) | |
- XFree(ch.res_name); | |
- if(!matched) | |
- for(i = 0; i < ntags; i++) | |
- c->tags[i] = seltags[i]; | |
-} | |
- | |
-void | |
-compileregs(void) { | |
- unsigned int i; | |
- regex_t *reg; | |
- | |
- if(regs) | |
- return; | |
- nrules = sizeof rules / sizeof rules[0]; | |
- regs = emallocz(nrules * sizeof(Regs)); | |
- for(i = 0; i < nrules; i++) { | |
- if(rules[i].prop) { | |
- reg = emallocz(sizeof(regex_t)); | |
- if(regcomp(reg, rules[i].prop, REG_EXTENDED)) | |
- free(reg); | |
- else | |
- regs[i].propregex = reg; | |
- } | |
- if(rules[i].tags) { | |
- reg = emallocz(sizeof(regex_t)); | |
- if(regcomp(reg, rules[i].tags, REG_EXTENDED)) | |
- free(reg); | |
- else | |
- regs[i].tagregex = reg; | |
- } | |
- } | |
-} | |
- | |
-Bool | |
-isvisible(Client *c) { | |
- unsigned int i; | |
- | |
- for(i = 0; i < ntags; i++) | |
- if(c->tags[i] && seltags[i]) | |
- return True; | |
- return False; | |
-} | |
- | |
-void | |
-tag(const char *arg) { | |
- unsigned int i; | |
- | |
- if(!sel) | |
- return; | |
- for(i = 0; i < ntags; i++) | |
- sel->tags[i] = arg == NULL; | |
- i = idxoftag(arg); | |
- if(i >= 0 && i < ntags) | |
- sel->tags[i] = True; | |
- saveprops(sel); | |
- arrange(); | |
-} | |
- | |
-void | |
-togglefloating(const char *arg) { | |
- if(!sel || isfloating()) | |
- return; | |
- sel->isfloating = !sel->isfloating; | |
- if(sel->isfloating) { | |
- resize(sel, sel->x, sel->y, sel->w, sel->h, True); | |
- saveprops(sel); | |
- } | |
- arrange(); | |
-} | |
- | |
-void | |
-toggletag(const char *arg) { | |
- unsigned int i, j; | |
- | |
- if(!sel) | |
- return; | |
- i = idxoftag(arg); | |
- sel->tags[i] = !sel->tags[i]; | |
- for(j = 0; j < ntags && !sel->tags[j]; j++); | |
- if(j == ntags) | |
- sel->tags[i] = True; | |
- saveprops(sel); | |
- arrange(); | |
-} | |
- | |
-void | |
-toggleview(const char *arg) { | |
- unsigned int i, j; | |
- | |
- i = idxoftag(arg); | |
- seltags[i] = !seltags[i]; | |
- for(j = 0; j < ntags && !seltags[j]; j++); | |
- if(j == ntags) | |
- seltags[i] = True; /* cannot toggle last view */ | |
- savedwmprops(); | |
- arrange(); | |
-} | |
- | |
-void | |
-view(const char *arg) { | |
- unsigned int i; | |
- | |
- for(i = 0; i < ntags; i++) | |
- seltags[i] = arg == NULL; | |
- i = idxoftag(arg); | |
- if(i >= 0 && i < ntags) | |
- seltags[i] = True; | |
- savedwmprops(); | |
- arrange(); | |
-} |