tproceeded with cleaning up, sorting functions, etc - dwm - [fork] customized b… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit adaa28a6e600f636f5e86244ccef69e98419ba1a | |
parent dba23062bad40afb1a90f60b6897cf9e1ca5035b | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Sat, 15 Jul 2006 17:00:56 +0200 | |
proceeded with cleaning up, sorting functions, etc | |
Diffstat: | |
M client.c | 411 ++++++++++++++++-------------… | |
M draw.c | 146 ++++++++++++++++-------------… | |
M dwm.h | 39 +++++++++++++++--------------… | |
M event.c | 266 +++++++++++++++--------------… | |
M main.c | 71 +++++++++++++----------------… | |
M tag.c | 118 +++++++++++++++++------------… | |
M util.c | 24 +++++++++++++----------- | |
7 files changed, 532 insertions(+), 543 deletions(-) | |
--- | |
diff --git a/client.c b/client.c | |
t@@ -2,21 +2,14 @@ | |
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> | |
* See LICENSE file for license details. | |
*/ | |
+#include "dwm.h" | |
#include <stdlib.h> | |
-#include <stdio.h> | |
#include <string.h> | |
#include <X11/Xatom.h> | |
#include <X11/Xutil.h> | |
-#include "dwm.h" | |
- | |
-void | |
-ban(Client *c) | |
-{ | |
- XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | |
- XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); | |
-} | |
+/* static functions */ | |
static void | |
resizetitle(Client *c) | |
t@@ -35,70 +28,141 @@ resizetitle(Client *c) | |
XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); | |
} | |
+static int | |
+xerrordummy(Display *dsply, XErrorEvent *ee) | |
+{ | |
+ return 0; | |
+} | |
+ | |
+/* extern functions */ | |
+ | |
void | |
-settitle(Client *c) | |
+ban(Client *c) | |
{ | |
- XTextProperty name; | |
- int n; | |
- char **list = NULL; | |
+ XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | |
+ XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); | |
+} | |
- name.nitems = 0; | |
- c->name[0] = 0; | |
- XGetTextProperty(dpy, c->win, &name, net_atom[NetWMName]); | |
- if(!name.nitems) | |
- XGetWMName(dpy, c->win, &name); | |
- if(!name.nitems) | |
+void | |
+focus(Client *c) | |
+{ | |
+ Client *old = sel; | |
+ XEvent ev; | |
+ | |
+ XFlush(dpy); | |
+ sel = c; | |
+ if(old && old != c) | |
+ drawtitle(old); | |
+ drawtitle(c); | |
+ XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | |
+ XFlush(dpy); | |
+ while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
+} | |
+ | |
+void | |
+focusnext(Arg *arg) | |
+{ | |
+ Client *c; | |
+ | |
+ if(!sel) | |
return; | |
- if(name.encoding == XA_STRING) | |
- strncpy(c->name, (char *)name.value, sizeof(c->name)); | |
- else { | |
- if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success | |
- && n > 0 && *list) | |
- { | |
- strncpy(c->name, *list, sizeof(c->name)); | |
- XFreeStringList(list); | |
- } | |
+ | |
+ if(!(c = getnext(sel->next))) | |
+ c = getnext(clients); | |
+ if(c) { | |
+ higher(c); | |
+ c->revert = sel; | |
+ focus(c); | |
} | |
- XFree(name.value); | |
- resizetitle(c); | |
} | |
void | |
-setsize(Client *c) | |
+focusprev(Arg *arg) | |
{ | |
- XSizeHints size; | |
- long msize; | |
- if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags) | |
- size.flags = PSize; | |
- c->flags = size.flags; | |
- if(c->flags & PBaseSize) { | |
- c->basew = size.base_width; | |
- c->baseh = size.base_height; | |
+ Client *c; | |
+ | |
+ if(!sel) | |
+ return; | |
+ | |
+ if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) { | |
+ higher(c); | |
+ focus(c); | |
} | |
- else | |
- c->basew = c->baseh = 0; | |
- if(c->flags & PResizeInc) { | |
- c->incw = size.width_inc; | |
- c->inch = size.height_inc; | |
+} | |
+ | |
+Client * | |
+getclient(Window w) | |
+{ | |
+ Client *c; | |
+ for(c = clients; c; c = c->next) | |
+ if(c->win == w) | |
+ return c; | |
+ return NULL; | |
+} | |
+ | |
+Client * | |
+getctitle(Window w) | |
+{ | |
+ Client *c; | |
+ for(c = clients; c; c = c->next) | |
+ if(c->title == w) | |
+ return c; | |
+ return NULL; | |
+} | |
+ | |
+void | |
+gravitate(Client *c, Bool invert) | |
+{ | |
+ int dx = 0, dy = 0; | |
+ | |
+ switch(c->grav) { | |
+ case StaticGravity: | |
+ case NorthWestGravity: | |
+ case NorthGravity: | |
+ case NorthEastGravity: | |
+ dy = c->border; | |
+ break; | |
+ case EastGravity: | |
+ case CenterGravity: | |
+ case WestGravity: | |
+ dy = -(c->h / 2) + c->border; | |
+ break; | |
+ case SouthEastGravity: | |
+ case SouthGravity: | |
+ case SouthWestGravity: | |
+ dy = -c->h; | |
+ break; | |
+ default: | |
+ break; | |
} | |
- else | |
- c->incw = c->inch = 0; | |
- if(c->flags & PMaxSize) { | |
- c->maxw = size.max_width; | |
- c->maxh = size.max_height; | |
+ | |
+ switch (c->grav) { | |
+ case StaticGravity: | |
+ case NorthWestGravity: | |
+ case WestGravity: | |
+ case SouthWestGravity: | |
+ dx = c->border; | |
+ break; | |
+ case NorthGravity: | |
+ case CenterGravity: | |
+ case SouthGravity: | |
+ dx = -(c->w / 2) + c->border; | |
+ break; | |
+ case NorthEastGravity: | |
+ case EastGravity: | |
+ case SouthEastGravity: | |
+ dx = -(c->w + c->border); | |
+ break; | |
+ default: | |
+ break; | |
} | |
- else | |
- c->maxw = c->maxh = 0; | |
- if(c->flags & PMinSize) { | |
- c->minw = size.min_width; | |
- c->minh = size.min_height; | |
+ | |
+ if(invert) { | |
+ dx = -dx; | |
+ dy = -dy; | |
} | |
- else | |
- c->minw = c->minh = 0; | |
- if(c->flags & PWinGravity) | |
- c->grav = size.win_gravity; | |
- else | |
- c->grav = NorthWestGravity; | |
+ c->x += dx; | |
+ c->y += dy; | |
} | |
void | |
t@@ -109,26 +173,21 @@ higher(Client *c) | |
} | |
void | |
-lower(Client *c) | |
+killclient(Arg *arg) | |
{ | |
- XLowerWindow(dpy, c->title); | |
- XLowerWindow(dpy, c->win); | |
+ if(!sel) | |
+ return; | |
+ if(sel->proto & WM_PROTOCOL_DELWIN) | |
+ sendevent(sel->win, wm_atom[WMProtocols], wm_atom[WMDelete]); | |
+ else | |
+ XKillClient(dpy, sel->win); | |
} | |
void | |
-focus(Client *c) | |
+lower(Client *c) | |
{ | |
- Client *old = sel; | |
- XEvent ev; | |
- | |
- XFlush(dpy); | |
- sel = c; | |
- if(old && old != c) | |
- drawtitle(old); | |
- drawtitle(c); | |
- XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | |
- XFlush(dpy); | |
- while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | |
+ XLowerWindow(dpy, c->title); | |
+ XLowerWindow(dpy, c->win); | |
} | |
void | |
t@@ -195,61 +254,18 @@ manage(Window w, XWindowAttributes *wa) | |
} | |
void | |
-gravitate(Client *c, Bool invert) | |
+maximize(Arg *arg) | |
{ | |
- int dx = 0, dy = 0; | |
- | |
- switch(c->grav) { | |
- case StaticGravity: | |
- case NorthWestGravity: | |
- case NorthGravity: | |
- case NorthEastGravity: | |
- dy = c->border; | |
- break; | |
- case EastGravity: | |
- case CenterGravity: | |
- case WestGravity: | |
- dy = -(c->h / 2) + c->border; | |
- break; | |
- case SouthEastGravity: | |
- case SouthGravity: | |
- case SouthWestGravity: | |
- dy = -c->h; | |
- break; | |
- default: | |
- break; | |
- } | |
- | |
- switch (c->grav) { | |
- case StaticGravity: | |
- case NorthWestGravity: | |
- case WestGravity: | |
- case SouthWestGravity: | |
- dx = c->border; | |
- break; | |
- case NorthGravity: | |
- case CenterGravity: | |
- case SouthGravity: | |
- dx = -(c->w / 2) + c->border; | |
- break; | |
- case NorthEastGravity: | |
- case EastGravity: | |
- case SouthEastGravity: | |
- dx = -(c->w + c->border); | |
- break; | |
- default: | |
- break; | |
- } | |
- | |
- if(invert) { | |
- dx = -dx; | |
- dy = -dy; | |
- } | |
- c->x += dx; | |
- c->y += dy; | |
+ if(!sel) | |
+ return; | |
+ sel->x = sx; | |
+ sel->y = sy + bh; | |
+ sel->w = sw - 2 * sel->border; | |
+ sel->h = sh - 2 * sel->border - bh; | |
+ higher(sel); | |
+ resize(sel, False); | |
} | |
- | |
void | |
resize(Client *c, Bool inc) | |
{ | |
t@@ -290,10 +306,70 @@ resize(Client *c, Bool inc) | |
XFlush(dpy); | |
} | |
-static int | |
-xerrordummy(Display *dsply, XErrorEvent *ee) | |
+void | |
+setsize(Client *c) | |
{ | |
- return 0; | |
+ XSizeHints size; | |
+ long msize; | |
+ if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags) | |
+ size.flags = PSize; | |
+ c->flags = size.flags; | |
+ if(c->flags & PBaseSize) { | |
+ c->basew = size.base_width; | |
+ c->baseh = size.base_height; | |
+ } | |
+ else | |
+ c->basew = c->baseh = 0; | |
+ if(c->flags & PResizeInc) { | |
+ c->incw = size.width_inc; | |
+ c->inch = size.height_inc; | |
+ } | |
+ else | |
+ c->incw = c->inch = 0; | |
+ if(c->flags & PMaxSize) { | |
+ c->maxw = size.max_width; | |
+ c->maxh = size.max_height; | |
+ } | |
+ else | |
+ c->maxw = c->maxh = 0; | |
+ if(c->flags & PMinSize) { | |
+ c->minw = size.min_width; | |
+ c->minh = size.min_height; | |
+ } | |
+ else | |
+ c->minw = c->minh = 0; | |
+ if(c->flags & PWinGravity) | |
+ c->grav = size.win_gravity; | |
+ else | |
+ c->grav = NorthWestGravity; | |
+} | |
+ | |
+void | |
+settitle(Client *c) | |
+{ | |
+ XTextProperty name; | |
+ int n; | |
+ char **list = NULL; | |
+ | |
+ name.nitems = 0; | |
+ c->name[0] = 0; | |
+ XGetTextProperty(dpy, c->win, &name, net_atom[NetWMName]); | |
+ if(!name.nitems) | |
+ XGetWMName(dpy, c->win, &name); | |
+ if(!name.nitems) | |
+ return; | |
+ if(name.encoding == XA_STRING) | |
+ strncpy(c->name, (char *)name.value, sizeof(c->name)); | |
+ else { | |
+ if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success | |
+ && n > 0 && *list) | |
+ { | |
+ strncpy(c->name, *list, sizeof(c->name)); | |
+ XFreeStringList(list); | |
+ } | |
+ } | |
+ XFree(name.value); | |
+ resizetitle(c); | |
} | |
void | |
t@@ -325,26 +401,6 @@ unmanage(Client *c) | |
focus(sel); | |
} | |
-Client * | |
-getctitle(Window w) | |
-{ | |
- Client *c; | |
- for(c = clients; c; c = c->next) | |
- if(c->title == w) | |
- return c; | |
- return NULL; | |
-} | |
- | |
-Client * | |
-getclient(Window w) | |
-{ | |
- Client *c; | |
- for(c = clients; c; c = c->next) | |
- if(c->win == w) | |
- return c; | |
- return NULL; | |
-} | |
- | |
void | |
zoom(Arg *arg) | |
{ | |
t@@ -366,58 +422,3 @@ zoom(Arg *arg) | |
arrange(NULL); | |
focus(sel); | |
} | |
- | |
-void | |
-maximize(Arg *arg) | |
-{ | |
- if(!sel) | |
- return; | |
- sel->x = sx; | |
- sel->y = sy + bh; | |
- sel->w = sw - 2 * sel->border; | |
- sel->h = sh - 2 * sel->border - bh; | |
- higher(sel); | |
- resize(sel, False); | |
-} | |
- | |
-void | |
-focusprev(Arg *arg) | |
-{ | |
- Client *c; | |
- | |
- if(!sel) | |
- return; | |
- | |
- if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) { | |
- higher(c); | |
- focus(c); | |
- } | |
-} | |
- | |
-void | |
-focusnext(Arg *arg) | |
-{ | |
- Client *c; | |
- | |
- if(!sel) | |
- return; | |
- | |
- if(!(c = getnext(sel->next))) | |
- c = getnext(clients); | |
- if(c) { | |
- higher(c); | |
- c->revert = sel; | |
- focus(c); | |
- } | |
-} | |
- | |
-void | |
-killclient(Arg *arg) | |
-{ | |
- if(!sel) | |
- return; | |
- if(sel->proto & WM_PROTOCOL_DELWIN) | |
- sendevent(sel->win, wm_atom[WMProtocols], wm_atom[WMDelete]); | |
- else | |
- XKillClient(dpy, sel->win); | |
-} | |
diff --git a/draw.c b/draw.c | |
t@@ -2,13 +2,34 @@ | |
* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com> | |
* See LICENSE file for license details. | |
*/ | |
+#include "dwm.h" | |
#include <stdio.h> | |
#include <string.h> | |
- | |
#include <X11/Xlocale.h> | |
-#include "dwm.h" | |
+/* static functions */ | |
+ | |
+static void | |
+drawborder(void) | |
+{ | |
+ XPoint points[5]; | |
+ XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); | |
+ XSetForeground(dpy, dc.gc, dc.border); | |
+ points[0].x = dc.x; | |
+ points[0].y = dc.y; | |
+ points[1].x = dc.w - 1; | |
+ points[1].y = 0; | |
+ points[2].x = 0; | |
+ points[2].y = dc.h - 1; | |
+ points[3].x = -(dc.w - 1); | |
+ points[3].y = 0; | |
+ points[4].x = 0; | |
+ points[4].y = -(dc.h - 1); | |
+ XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); | |
+} | |
+ | |
+/* extern functions */ | |
void | |
drawall() | |
t@@ -53,59 +74,6 @@ drawstatus() | |
} | |
void | |
-drawtitle(Client *c) | |
-{ | |
- int i; | |
- Bool istile = arrange == dotile; | |
- | |
- if(c == sel) { | |
- drawstatus(); | |
- XUnmapWindow(dpy, c->title); | |
- XSetWindowBorder(dpy, c->win, dc.fg); | |
- return; | |
- } | |
- | |
- XSetWindowBorder(dpy, c->win, dc.bg); | |
- XMapWindow(dpy, c->title); | |
- | |
- dc.x = dc.y = 0; | |
- | |
- dc.w = 0; | |
- for(i = 0; i < TLast; i++) { | |
- if(c->tags[i]) { | |
- dc.x += dc.w; | |
- dc.w = textw(c->tags[i]); | |
- drawtext(c->tags[i], !istile, True); | |
- } | |
- } | |
- dc.x += dc.w; | |
- dc.w = textw(c->name); | |
- drawtext(c->name, !istile, True); | |
- XCopyArea(dpy, dc.drawable, c->title, dc.gc, | |
- 0, 0, c->tw, c->th, 0, 0); | |
- XFlush(dpy); | |
-} | |
- | |
-static void | |
-drawborder(void) | |
-{ | |
- XPoint points[5]; | |
- XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); | |
- XSetForeground(dpy, dc.gc, dc.border); | |
- points[0].x = dc.x; | |
- points[0].y = dc.y; | |
- points[1].x = dc.w - 1; | |
- points[1].y = 0; | |
- points[2].x = 0; | |
- points[2].y = dc.h - 1; | |
- points[3].x = -(dc.w - 1); | |
- points[3].y = 0; | |
- points[4].x = 0; | |
- points[4].y = -(dc.h - 1); | |
- XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious); | |
-} | |
- | |
-void | |
drawtext(const char *text, Bool invert, Bool border) | |
{ | |
int x, y, w, h; | |
t@@ -155,6 +123,40 @@ drawtext(const char *text, Bool invert, Bool border) | |
} | |
} | |
+void | |
+drawtitle(Client *c) | |
+{ | |
+ int i; | |
+ Bool istile = arrange == dotile; | |
+ | |
+ if(c == sel) { | |
+ drawstatus(); | |
+ XUnmapWindow(dpy, c->title); | |
+ XSetWindowBorder(dpy, c->win, dc.fg); | |
+ return; | |
+ } | |
+ | |
+ XSetWindowBorder(dpy, c->win, dc.bg); | |
+ XMapWindow(dpy, c->title); | |
+ | |
+ dc.x = dc.y = 0; | |
+ | |
+ dc.w = 0; | |
+ for(i = 0; i < TLast; i++) { | |
+ if(c->tags[i]) { | |
+ dc.x += dc.w; | |
+ dc.w = textw(c->tags[i]); | |
+ drawtext(c->tags[i], !istile, True); | |
+ } | |
+ } | |
+ dc.x += dc.w; | |
+ dc.w = textw(c->name); | |
+ drawtext(c->name, !istile, True); | |
+ XCopyArea(dpy, dc.drawable, c->title, dc.gc, | |
+ 0, 0, c->tw, c->th, 0, 0); | |
+ XFlush(dpy); | |
+} | |
+ | |
unsigned long | |
getcolor(const char *colstr) | |
{ | |
t@@ -165,23 +167,6 @@ getcolor(const char *colstr) | |
return color.pixel; | |
} | |
-unsigned int | |
-textnw(char *text, unsigned int len) | |
-{ | |
- XRectangle r; | |
- if(dc.font.set) { | |
- XmbTextExtents(dc.font.set, text, len, NULL, &r); | |
- return r.width; | |
- } | |
- return XTextWidth(dc.font.xfont, text, len); | |
-} | |
- | |
-unsigned int | |
-textw(char *text) | |
-{ | |
- return textnw(text, strlen(text)) + dc.font.height; | |
-} | |
- | |
void | |
setfont(const char *fontstr) | |
{ | |
t@@ -232,3 +217,20 @@ setfont(const char *fontstr) | |
} | |
dc.font.height = dc.font.ascent + dc.font.descent; | |
} | |
+ | |
+unsigned int | |
+textnw(char *text, unsigned int len) | |
+{ | |
+ XRectangle r; | |
+ if(dc.font.set) { | |
+ XmbTextExtents(dc.font.set, text, len, NULL, &r); | |
+ return r.width; | |
+ } | |
+ return XTextWidth(dc.font.xfont, text, len); | |
+} | |
+ | |
+unsigned int | |
+textw(char *text) | |
+{ | |
+ return textnw(text, strlen(text)) + dc.font.height; | |
+} | |
diff --git a/dwm.h b/dwm.h | |
t@@ -104,53 +104,52 @@ extern Client *clients, *sel; | |
/* client.c */ | |
extern void ban(Client *c); | |
-extern void manage(Window w, XWindowAttributes *wa); | |
-extern void unmanage(Client *c); | |
-extern Client *getclient(Window w); | |
extern void focus(Client *c); | |
-extern void settitle(Client *c); | |
-extern void resize(Client *c, Bool inc); | |
-extern void setsize(Client *c); | |
+extern void focusnext(Arg *arg); | |
+extern void focusprev(Arg *arg); | |
+extern Client *getclient(Window w); | |
extern Client *getctitle(Window w); | |
+extern void gravitate(Client *c, Bool invert); | |
extern void higher(Client *c); | |
+extern void killclient(Arg *arg); | |
extern void lower(Client *c); | |
-extern void gravitate(Client *c, Bool invert); | |
-extern void zoom(Arg *arg); | |
+extern void manage(Window w, XWindowAttributes *wa); | |
extern void maximize(Arg *arg); | |
-extern void focusprev(Arg *arg); | |
-extern void focusnext(Arg *arg); | |
-extern void killclient(Arg *arg); | |
+extern void resize(Client *c, Bool inc); | |
+extern void setsize(Client *c); | |
+extern void settitle(Client *c); | |
+extern void unmanage(Client *c); | |
+extern void zoom(Arg *arg); | |
/* draw.c */ | |
extern void drawall(); | |
extern void drawstatus(); | |
-extern void drawtitle(Client *c); | |
extern void drawtext(const char *text, Bool invert, Bool border); | |
+extern void drawtitle(Client *c); | |
extern unsigned long getcolor(const char *colstr); | |
extern void setfont(const char *fontstr); | |
extern unsigned int textnw(char *text, unsigned int len); | |
extern unsigned int textw(char *text); | |
-extern unsigned int texth(void); | |
/* event.c */ | |
extern void grabkeys(); | |
/* main.c */ | |
+extern int getproto(Window w); | |
extern void quit(Arg *arg); | |
-extern int xerror(Display *dsply, XErrorEvent *ee); | |
extern void sendevent(Window w, Atom a, long value); | |
-extern int getproto(Window w); | |
+extern int xerror(Display *dsply, XErrorEvent *ee); | |
/* tag.c */ | |
-extern Client *getnext(Client *c); | |
-extern void settags(Client *c); | |
+extern void appendtag(Arg *arg); | |
extern void dofloat(Arg *arg); | |
extern void dotile(Arg *arg); | |
-extern void view(Arg *arg); | |
-extern void appendtag(Arg *arg); | |
+extern Client *getnext(Client *c); | |
extern void replacetag(Arg *arg); | |
+extern void settags(Client *c); | |
+extern void view(Arg *arg); | |
/* util.c */ | |
-extern void eprint(const char *errstr, ...); | |
extern void *emallocz(unsigned int size); | |
+extern void eprint(const char *errstr, ...); | |
extern void spawn(Arg *arg); | |
diff --git a/event.c b/event.c | |
t@@ -2,17 +2,12 @@ | |
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> | |
* See LICENSE file for license details. | |
*/ | |
+#include "dwm.h" | |
-#include <fcntl.h> | |
-#include <stdio.h> | |
#include <stdlib.h> | |
-#include <string.h> | |
-#include <unistd.h> | |
#include <X11/keysym.h> | |
#include <X11/Xatom.h> | |
-#include "dwm.h" | |
- | |
#define ButtonMask (ButtonPressMask | ButtonReleaseMask) | |
#define MouseMask (ButtonMask | PointerMotionMask) | |
t@@ -54,130 +49,10 @@ Key key[] = { | |
/********** CUSTOMIZE **********/ | |
-/* local functions */ | |
-static void buttonpress(XEvent *e); | |
-static void configurerequest(XEvent *e); | |
-static void destroynotify(XEvent *e); | |
-static void enternotify(XEvent *e); | |
-static void leavenotify(XEvent *e); | |
-static void expose(XEvent *e); | |
-static void keypress(XEvent *e); | |
-static void maprequest(XEvent *e); | |
-static void propertynotify(XEvent *e); | |
-static void unmapnotify(XEvent *e); | |
- | |
-void (*handler[LASTEvent]) (XEvent *) = { | |
- [ButtonPress] = buttonpress, | |
- [ConfigureRequest] = configurerequest, | |
- [DestroyNotify] = destroynotify, | |
- [EnterNotify] = enternotify, | |
- [LeaveNotify] = leavenotify, | |
- [Expose] = expose, | |
- [KeyPress] = keypress, | |
- [MapRequest] = maprequest, | |
- [PropertyNotify] = propertynotify, | |
- [UnmapNotify] = unmapnotify | |
-}; | |
- | |
-void | |
-grabkeys() | |
-{ | |
- static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0; | |
- unsigned int i; | |
- KeyCode code; | |
- | |
- for(i = 0; i < len; i++) { | |
- code = XKeysymToKeycode(dpy, key[i].keysym); | |
- XUngrabKey(dpy, code, key[i].mod, root); | |
- XGrabKey(dpy, code, key[i].mod, root, True, | |
- GrabModeAsync, GrabModeAsync); | |
- } | |
-} | |
- | |
-static void | |
-keypress(XEvent *e) | |
-{ | |
- XKeyEvent *ev = &e->xkey; | |
- static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0; | |
- unsigned int i; | |
- KeySym keysym; | |
- | |
- keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); | |
- for(i = 0; i < len; i++) | |
- if((keysym == key[i].keysym) && (key[i].mod == ev->state)) { | |
- if(key[i].func) | |
- key[i].func(&key[i].arg); | |
- return; | |
- } | |
-} | |
- | |
-static void | |
-resizemouse(Client *c) | |
-{ | |
- XEvent ev; | |
- int ocx, ocy; | |
- | |
- ocx = c->x; | |
- ocy = c->y; | |
- if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAs… | |
- None, cursor[CurResize], CurrentTime) != GrabS… | |
- return; | |
- XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); | |
- for(;;) { | |
- XMaskEvent(dpy, MouseMask | ExposureMask, &ev); | |
- switch(ev.type) { | |
- default: break; | |
- case Expose: | |
- handler[Expose](&ev); | |
- break; | |
- case MotionNotify: | |
- XFlush(dpy); | |
- c->w = abs(ocx - ev.xmotion.x); | |
- c->h = abs(ocy - ev.xmotion.y); | |
- c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w; | |
- c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h; | |
- resize(c, True); | |
- break; | |
- case ButtonRelease: | |
- XUngrabPointer(dpy, CurrentTime); | |
- return; | |
- } | |
- } | |
-} | |
- | |
-static void | |
-movemouse(Client *c) | |
-{ | |
- XEvent ev; | |
- int x1, y1, ocx, ocy, di; | |
- unsigned int dui; | |
- Window dummy; | |
+/* static functions */ | |
- ocx = c->x; | |
- ocy = c->y; | |
- if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAs… | |
- None, cursor[CurMove], CurrentTime) != GrabSuc… | |
- return; | |
- XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); | |
- for(;;) { | |
- XMaskEvent(dpy, MouseMask | ExposureMask, &ev); | |
- switch (ev.type) { | |
- default: break; | |
- case Expose: | |
- handler[Expose](&ev); | |
- break; | |
- case MotionNotify: | |
- XFlush(dpy); | |
- c->x = ocx + (ev.xmotion.x - x1); | |
- c->y = ocy + (ev.xmotion.y - y1); | |
- resize(c, False); | |
- break; | |
- case ButtonRelease: | |
- XUngrabPointer(dpy, CurrentTime); | |
- return; | |
- } | |
- } | |
-} | |
+static void movemouse(Client *c); | |
+static void resizemouse(Client *c); | |
static void | |
buttonpress(XEvent *e) | |
t@@ -280,15 +155,6 @@ enternotify(XEvent *e) | |
} | |
static void | |
-leavenotify(XEvent *e) | |
-{ | |
- XCrossingEvent *ev = &e->xcrossing; | |
- | |
- if((ev->window == root) && !ev->same_screen) | |
- issel = True; | |
-} | |
- | |
-static void | |
expose(XEvent *e) | |
{ | |
XExposeEvent *ev = &e->xexpose; | |
t@@ -303,6 +169,32 @@ expose(XEvent *e) | |
} | |
static void | |
+keypress(XEvent *e) | |
+{ | |
+ XKeyEvent *ev = &e->xkey; | |
+ static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0; | |
+ unsigned int i; | |
+ KeySym keysym; | |
+ | |
+ keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); | |
+ for(i = 0; i < len; i++) | |
+ if((keysym == key[i].keysym) && (key[i].mod == ev->state)) { | |
+ if(key[i].func) | |
+ key[i].func(&key[i].arg); | |
+ return; | |
+ } | |
+} | |
+ | |
+static void | |
+leavenotify(XEvent *e) | |
+{ | |
+ XCrossingEvent *ev = &e->xcrossing; | |
+ | |
+ if((ev->window == root) && !ev->same_screen) | |
+ issel = True; | |
+} | |
+ | |
+static void | |
maprequest(XEvent *e) | |
{ | |
XMapRequestEvent *ev = &e->xmaprequest; | |
t@@ -322,6 +214,40 @@ maprequest(XEvent *e) | |
} | |
static void | |
+movemouse(Client *c) | |
+{ | |
+ XEvent ev; | |
+ int x1, y1, ocx, ocy, di; | |
+ unsigned int dui; | |
+ Window dummy; | |
+ | |
+ ocx = c->x; | |
+ ocy = c->y; | |
+ if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAs… | |
+ None, cursor[CurMove], CurrentTime) != GrabSuc… | |
+ return; | |
+ XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui); | |
+ for(;;) { | |
+ XMaskEvent(dpy, MouseMask | ExposureMask, &ev); | |
+ switch (ev.type) { | |
+ default: break; | |
+ case Expose: | |
+ handler[Expose](&ev); | |
+ break; | |
+ case MotionNotify: | |
+ XFlush(dpy); | |
+ c->x = ocx + (ev.xmotion.x - x1); | |
+ c->y = ocy + (ev.xmotion.y - y1); | |
+ resize(c, False); | |
+ break; | |
+ case ButtonRelease: | |
+ XUngrabPointer(dpy, CurrentTime); | |
+ return; | |
+ } | |
+ } | |
+} | |
+ | |
+static void | |
propertynotify(XEvent *e) | |
{ | |
XPropertyEvent *ev = &e->xproperty; | |
t@@ -355,6 +281,40 @@ propertynotify(XEvent *e) | |
} | |
static void | |
+resizemouse(Client *c) | |
+{ | |
+ XEvent ev; | |
+ int ocx, ocy; | |
+ | |
+ ocx = c->x; | |
+ ocy = c->y; | |
+ if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAs… | |
+ None, cursor[CurResize], CurrentTime) != GrabS… | |
+ return; | |
+ XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h); | |
+ for(;;) { | |
+ XMaskEvent(dpy, MouseMask | ExposureMask, &ev); | |
+ switch(ev.type) { | |
+ default: break; | |
+ case Expose: | |
+ handler[Expose](&ev); | |
+ break; | |
+ case MotionNotify: | |
+ XFlush(dpy); | |
+ c->w = abs(ocx - ev.xmotion.x); | |
+ c->h = abs(ocy - ev.xmotion.y); | |
+ c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w; | |
+ c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h; | |
+ resize(c, True); | |
+ break; | |
+ case ButtonRelease: | |
+ XUngrabPointer(dpy, CurrentTime); | |
+ return; | |
+ } | |
+ } | |
+} | |
+ | |
+static void | |
unmapnotify(XEvent *e) | |
{ | |
Client *c; | |
t@@ -363,3 +323,33 @@ unmapnotify(XEvent *e) | |
if((c = getclient(ev->window))) | |
unmanage(c); | |
} | |
+ | |
+/* extern functions */ | |
+ | |
+void (*handler[LASTEvent]) (XEvent *) = { | |
+ [ButtonPress] = buttonpress, | |
+ [ConfigureRequest] = configurerequest, | |
+ [DestroyNotify] = destroynotify, | |
+ [EnterNotify] = enternotify, | |
+ [LeaveNotify] = leavenotify, | |
+ [Expose] = expose, | |
+ [KeyPress] = keypress, | |
+ [MapRequest] = maprequest, | |
+ [PropertyNotify] = propertynotify, | |
+ [UnmapNotify] = unmapnotify | |
+}; | |
+ | |
+void | |
+grabkeys() | |
+{ | |
+ static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0; | |
+ unsigned int i; | |
+ KeyCode code; | |
+ | |
+ for(i = 0; i < len; i++) { | |
+ code = XKeysymToKeycode(dpy, key[i].keysym); | |
+ XUngrabKey(dpy, code, key[i].mod, root); | |
+ XGrabKey(dpy, code, key[i].mod, root, True, | |
+ GrabModeAsync, GrabModeAsync); | |
+ } | |
+} | |
diff --git a/main.c b/main.c | |
t@@ -3,31 +3,17 @@ | |
* See LICENSE file for license details. | |
*/ | |
+#include "dwm.h" | |
+ | |
#include <errno.h> | |
-#include <stdarg.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
- | |
#include <X11/cursorfont.h> | |
#include <X11/Xatom.h> | |
#include <X11/Xproto.h> | |
-#include "dwm.h" | |
- | |
-/********** CUSTOMIZE **********/ | |
- | |
-char *tags[TLast] = { | |
- [Tscratch] = "scratch", | |
- [Tdev] = "dev", | |
- [Twww] = "www", | |
- [Twork] = "work", | |
-}; | |
- | |
-/********** CUSTOMIZE **********/ | |
- | |
-/* X structs */ | |
Display *dpy; | |
Window root, barwin; | |
Atom wm_atom[WMLast], net_atom[NetLast]; | |
t@@ -48,8 +34,17 @@ static const char version[] = | |
"dwm-" VERSION ", (C)opyright MMVI Anselm R. Garbe\n"; | |
static int (*xerrorxlib)(Display *, XErrorEvent *); | |
+/* static functions */ | |
+ | |
static void | |
-usage() { eprint("usage: dwm [-v]\n"); } | |
+cleanup() | |
+{ | |
+ while(sel) { | |
+ resize(sel, True); | |
+ unmanage(sel); | |
+ } | |
+ XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); | |
+} | |
static void | |
scan() | |
t@@ -73,22 +68,6 @@ scan() | |
XFree(wins); | |
} | |
-static void | |
-cleanup() | |
-{ | |
- while(sel) { | |
- resize(sel, True); | |
- unmanage(sel); | |
- } | |
- XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); | |
-} | |
- | |
-void | |
-quit(Arg *arg) | |
-{ | |
- running = False; | |
-} | |
- | |
static int | |
win_property(Window w, Atom a, Atom t, long l, unsigned char **prop) | |
{ | |
t@@ -109,6 +88,19 @@ win_property(Window w, Atom a, Atom t, long l, unsigned ch… | |
return res; | |
} | |
+/* | |
+ * Startup Error handler to check if another window manager | |
+ * is already running. | |
+ */ | |
+static int | |
+xerrorstart(Display *dsply, XErrorEvent *ee) | |
+{ | |
+ otherwm = True; | |
+ return -1; | |
+} | |
+ | |
+/* extern functions */ | |
+ | |
int | |
getproto(Window w) | |
{ | |
t@@ -144,15 +136,10 @@ sendevent(Window w, Atom a, long value) | |
XFlush(dpy); | |
} | |
-/* | |
- * Startup Error handler to check if another window manager | |
- * is already running. | |
- */ | |
-static int | |
-xerrorstart(Display *dsply, XErrorEvent *ee) | |
+void | |
+quit(Arg *arg) | |
{ | |
- otherwm = True; | |
- return -1; | |
+ running = False; | |
} | |
/* | |
t@@ -201,7 +188,7 @@ main(int argc, char *argv[]) | |
exit(0); | |
break; | |
default: | |
- usage(); | |
+ eprint("usage: dwm [-v]\n"); | |
break; | |
} | |
} | |
diff --git a/tag.c b/tag.c | |
t@@ -2,71 +2,39 @@ | |
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> | |
* See LICENSE file for license details. | |
*/ | |
+#include "dwm.h" | |
-#include <stdlib.h> | |
-#include <stdio.h> | |
#include <string.h> | |
-#include <X11/Xatom.h> | |
#include <X11/Xutil.h> | |
-#include "dwm.h" | |
+/********** CUSTOMIZE **********/ | |
+ | |
+char *tags[TLast] = { | |
+ [Tscratch] = "scratch", | |
+ [Tdev] = "dev", | |
+ [Twww] = "www", | |
+ [Twork] = "work", | |
+}; | |
static Rule rule[] = { | |
/* class instance tags … | |
{ "Firefox-bin", "Gecko", { [Twww] = "www" }, … | |
}; | |
-void (*arrange)(Arg *) = dotile; | |
+/********** CUSTOMIZE **********/ | |
-Client * | |
-getnext(Client *c) | |
-{ | |
- for(; c && !c->tags[tsel]; c = c->next); | |
- return c; | |
-} | |
+/* extern functions */ | |
+ | |
+void (*arrange)(Arg *) = dotile; | |
void | |
-settags(Client *c) | |
+appendtag(Arg *arg) | |
{ | |
- XClassHint ch; | |
- static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; | |
- unsigned int i, j; | |
- Bool matched = False; | |
- | |
- if(!len) { | |
- c->tags[tsel] = tags[tsel]; | |
+ if(!sel) | |
return; | |
- } | |
- | |
- if(XGetClassHint(dpy, c->win, &ch)) { | |
- if(ch.res_class && ch.res_name) { | |
- for(i = 0; i < len; i++) | |
- if(!strncmp(rule[i].class, ch.res_class, sizeo… | |
- && !strncmp(rule[i].instance, ch.res_n… | |
- { | |
- for(j = 0; j < TLast; j++) | |
- c->tags[j] = rule[i].tags[j]; | |
- c->dofloat = rule[i].dofloat; | |
- matched = True; | |
- break; | |
- } | |
- } | |
- if(ch.res_class) | |
- XFree(ch.res_class); | |
- if(ch.res_name) | |
- XFree(ch.res_name); | |
- } | |
- if(!matched) | |
- c->tags[tsel] = tags[tsel]; | |
-} | |
- | |
-void | |
-view(Arg *arg) | |
-{ | |
- tsel = arg->i; | |
+ sel->tags[arg->i] = tags[arg->i]; | |
arrange(NULL); | |
- drawall(); | |
} | |
void | |
t@@ -147,14 +115,11 @@ dotile(Arg *arg) | |
drawall(); | |
} | |
-void | |
-appendtag(Arg *arg) | |
+Client * | |
+getnext(Client *c) | |
{ | |
- if(!sel) | |
- return; | |
- | |
- sel->tags[arg->i] = tags[arg->i]; | |
- arrange(NULL); | |
+ for(; c && !c->tags[tsel]; c = c->next); | |
+ return c; | |
} | |
void | |
t@@ -169,3 +134,46 @@ replacetag(Arg *arg) | |
appendtag(arg); | |
} | |
+void | |
+settags(Client *c) | |
+{ | |
+ XClassHint ch; | |
+ static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; | |
+ unsigned int i, j; | |
+ Bool matched = False; | |
+ | |
+ if(!len) { | |
+ c->tags[tsel] = tags[tsel]; | |
+ return; | |
+ } | |
+ | |
+ if(XGetClassHint(dpy, c->win, &ch)) { | |
+ if(ch.res_class && ch.res_name) { | |
+ for(i = 0; i < len; i++) | |
+ if(!strncmp(rule[i].class, ch.res_class, sizeo… | |
+ && !strncmp(rule[i].instance, ch.res_n… | |
+ { | |
+ for(j = 0; j < TLast; j++) | |
+ c->tags[j] = rule[i].tags[j]; | |
+ c->dofloat = rule[i].dofloat; | |
+ matched = True; | |
+ break; | |
+ } | |
+ } | |
+ if(ch.res_class) | |
+ XFree(ch.res_class); | |
+ if(ch.res_name) | |
+ XFree(ch.res_name); | |
+ } | |
+ | |
+ if(!matched) | |
+ c->tags[tsel] = tags[tsel]; | |
+} | |
+ | |
+void | |
+view(Arg *arg) | |
+{ | |
+ tsel = arg->i; | |
+ arrange(NULL); | |
+ drawall(); | |
+} | |
diff --git a/util.c b/util.c | |
t@@ -2,24 +2,15 @@ | |
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> | |
* See LICENSE file for license details. | |
*/ | |
+#include "dwm.h" | |
#include <stdarg.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
-#include <sys/types.h> | |
#include <sys/wait.h> | |
#include <unistd.h> | |
-#include "dwm.h" | |
- | |
-void | |
-eprint(const char *errstr, ...) { | |
- va_list ap; | |
- va_start(ap, errstr); | |
- vfprintf(stderr, errstr, ap); | |
- va_end(ap); | |
- exit(1); | |
-} | |
+/* static functions */ | |
static void | |
bad_malloc(unsigned int size) | |
t@@ -29,6 +20,8 @@ bad_malloc(unsigned int size) | |
exit(1); | |
} | |
+/* extern functions */ | |
+ | |
void * | |
emallocz(unsigned int size) | |
{ | |
t@@ -39,6 +32,15 @@ emallocz(unsigned int size) | |
} | |
void | |
+eprint(const char *errstr, ...) { | |
+ va_list ap; | |
+ va_start(ap, errstr); | |
+ vfprintf(stderr, errstr, ap); | |
+ va_end(ap); | |
+ exit(1); | |
+} | |
+ | |
+void | |
spawn(Arg *arg) | |
{ | |
char **argv = (char **)arg->argv; |