From 6d5f67a0922d40d52290c12f9c0d937f4121406e Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Mon, 19 Feb 2007 17:12:26 +0100 Subject: [PATCH 01/16] renames swim[ming] into versatile --- client.c | 8 +++--- config.arg.h | 6 ++-- config.default.h | 6 ++-- dwm.1 | 20 ++++++------- dwm.h | 6 ++-- event.c | 8 +++--- screen.c | 74 ++++++++++++++++++++++++------------------------ 7 files changed, 64 insertions(+), 64 deletions(-) diff --git a/client.c b/client.c index e312a9a..2aa1955 100644 --- a/client.c +++ b/client.c @@ -253,8 +253,8 @@ manage(Window w, XWindowAttributes *wa) { updatetitle(c); for(t = clients; t && t->win != trans; t = t->next); settags(c, t); - if(!c->swimming) - c->swimming = (t != NULL) || c->isfixed; + if(!c->versatile) + c->versatile = (t != NULL) || c->isfixed; attach(c); attachstack(c); c->isbanned = True; @@ -268,7 +268,7 @@ manage(Window w, XWindowAttributes *wa) { Client * nexttiled(Client *c) { - for(; c && (c->swimming || !isvisible(c)); c = c->next); + for(; c && (c->versatile || !isvisible(c)); c = c->next); return c; } @@ -440,7 +440,7 @@ zoom(Arg *arg) { if(!sel) return; - if(sel->swimming || (lt->arrange == swim)) { + if(sel->versatile || (lt->arrange == versatile)) { togglemax(sel); return; } diff --git a/config.arg.h b/config.arg.h index 7b54ca2..05bcd07 100644 --- a/config.arg.h +++ b/config.arg.h @@ -9,7 +9,7 @@ const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; static Layout layout[] = { \ /* symbol function */ \ { "[]=", tile }, /* first entry is default */ \ - { "><>", swim }, \ + { "><>", versatile }, \ }; #define BORDERPX 1 @@ -64,7 +64,7 @@ static Key key[] = { \ { MODKEY|ControlMask|ShiftMask, XK_9, toggletag, { .i = 8 } }, \ { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ { MODKEY, XK_space, togglelayout, { 0 } }, \ - { MODKEY|ShiftMask, XK_space, toggleswimming, { 0 } }, \ + { MODKEY|ShiftMask, XK_space, toggleversatile,{ 0 } }, \ { MODKEY, XK_0, view, { .i = -1 } }, \ { MODKEY, XK_1, view, { .i = 0 } }, \ { MODKEY, XK_2, view, { .i = 1 } }, \ @@ -89,7 +89,7 @@ static Key key[] = { \ #define RULES \ static Rule rule[] = { \ - /* class:instance:title regex tags regex swimming */ \ + /* class:instance:title regex tags regex versatile */ \ { "Firefox", "3", False }, \ { "Gimp", NULL, True }, \ { "MPlayer", NULL, True }, \ diff --git a/config.default.h b/config.default.h index 1b6b349..10000d9 100644 --- a/config.default.h +++ b/config.default.h @@ -9,7 +9,7 @@ const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; Layout layout[] = { \ /* symbol function */ \ { "[]=", tile }, /* first entry is default */ \ - { "><>", swim }, \ + { "><>", versatile }, \ }; #define BORDERPX 1 @@ -59,7 +59,7 @@ static Key key[] = { \ { MODKEY|ControlMask|ShiftMask, XK_9, toggletag, { .i = 8 } }, \ { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ { MODKEY, XK_space, togglelayout, { 0 } }, \ - { MODKEY|ShiftMask, XK_space, toggleswimming, { 0 } }, \ + { MODKEY|ShiftMask, XK_space, toggleversatile { 0 } }, \ { MODKEY, XK_0, view, { .i = -1 } }, \ { MODKEY, XK_1, view, { .i = 0 } }, \ { MODKEY, XK_2, view, { .i = 1 } }, \ @@ -86,7 +86,7 @@ static Key key[] = { \ * xprop | awk -F '"' '/^WM_CLASS/ { printf("%s:%s:",$4,$2) }; /^WM_NAME/ { printf("%s\n",$2) }' */ #define RULES \ static Rule rule[] = { \ - /* class:instance:title regex tags regex swimming */ \ + /* class:instance:title regex tags regex versatile */ \ { "Gimp", NULL, True }, \ { "MPlayer", NULL, True }, \ { "Acroread", NULL, True }, \ diff --git a/dwm.1 b/dwm.1 index c48e853..cac0858 100644 --- a/dwm.1 +++ b/dwm.1 @@ -6,13 +6,13 @@ dwm \- dynamic window manager .RB [ \-v ] .SH DESCRIPTION dwm is a dynamic window manager for X. It manages windows in tiling and -swimming layouts. Either layout can be applied dynamically, optimizing the +versatile layouts. Either layout can be applied dynamically, optimizing the environment for the application in use and the task performed. .P In tiling layout windows are managed in a master and stacking area. The master area contains the windows which currently need most attention, whereas the -stacking area contains all other windows. In swimming layout windows can be -resized and moved freely. Dialog windows are always managed swimming, +stacking area contains all other windows. In versatile layout windows can be +resized and moved freely. Dialog windows are always managed versatile, regardless of the layout applied. .P Windows are grouped by tags. Each window can be tagged with one or multiple @@ -38,7 +38,7 @@ is read and displayed in the status text area. .TP .B Button1 click on a tag label to display all windows with that tag, click on the layout -label toggles between tiling and swimming layout. +label toggles between tiling and versatile layout. .TP .B Button3 click on a tag label adds/removes all windows with that tag to/from the view. @@ -67,7 +67,7 @@ Focus next window. Focus previous window. .TP .B Mod1-Return -Zooms/cycles current window to/from master area (tiling layout), toggles maximization of current window (swimming layout). +Zooms/cycles current window to/from master area (tiling layout), toggles maximization of current window (versatile layout). .TP .B Mod1-g Grow master area (tiling layout only). @@ -98,10 +98,10 @@ tag to/from current window. Close focused window. .TP .B Mod1-space -Toggle between tiling and swimming layout (affects all windows). +Toggle between tiling and versatile layout (affects all windows). .TP .B Mod1-Shift-space -Toggle focused window between swimming and non-swimming state (tiling layout only). +Toggle focused window between versatile and non-versatile state (tiling layout only). .TP .B Mod1-[1..n] View all windows with @@ -121,13 +121,13 @@ Quit dwm. .SS Mouse commands .TP .B Mod1-Button1 -Move current window while dragging (swimming layout only). +Move current window while dragging (versatile layout only). .TP .B Mod1-Button2 -Zooms/cycles current window to/from master area (tiling layout), toggles maximization of current window (swimming layout). +Zooms/cycles current window to/from master area (tiling layout), toggles maximization of current window (versatile layout). .TP .B Mod1-Button3 -Resize current window while dragging (swimming layout only). +Resize current window while dragging (versatile layout only). .SH CUSTOMIZATION dwm is customized by creating a custom config.h and (re)compiling the source code. This keeps it fast, secure and simple. diff --git a/dwm.h b/dwm.h index 0d63341..8e68776 100644 --- a/dwm.h +++ b/dwm.h @@ -72,7 +72,7 @@ struct Client { int minax, minay, maxax, maxay; long flags; unsigned int border; - Bool isbanned, isfixed, ismax, swimming; + Bool isbanned, isfixed, ismax, versatile; Bool *tags; Client *next; Client *prev; @@ -135,12 +135,12 @@ extern Bool isvisible(Client *c); /* returns True if client is visible */ extern void resizemaster(Arg *arg); /* resizes the master percent with arg's index value */ extern void restack(void); /* restores z layers of all clients */ extern void settags(Client *c, Client *trans); /* sets tags of c */ -extern void swim(void); /* arranges all windows swimming */ extern void tag(Arg *arg); /* tags c with arg's index */ -extern void toggleswimming(Arg *arg); /* toggles focusesd client between swimming/and non-swimming state */ +extern void toggleversatile(Arg *arg); /* toggles focusesd client between versatile/and non-versatile state */ extern void togglelayout(Arg *arg); /* toggles layout */ extern void toggletag(Arg *arg); /* toggles c tags with arg's index */ extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */ +extern void versatile(void); /* arranges all windows versatile */ extern void view(Arg *arg); /* views the tag with arg's index */ /* util.c */ diff --git a/event.c b/event.c index b8036fc..00c53b6 100644 --- a/event.c +++ b/event.c @@ -156,14 +156,14 @@ buttonpress(XEvent *e) { focus(c); if(CLEANMASK(ev->state) != MODKEY) return; - if(ev->button == Button1 && (lt->arrange == swim || c->swimming)) { + if(ev->button == Button1 && (lt->arrange == versatile || c->versatile)) { restack(); movemouse(c); } else if(ev->button == Button2) zoom(NULL); else if(ev->button == Button3 - && (lt->arrange == swim || c->swimming) && !c->isfixed) + && (lt->arrange == versatile || c->versatile) && !c->isfixed) { restack(); resizemouse(c); @@ -181,7 +181,7 @@ configurerequest(XEvent *e) { c->ismax = False; if(ev->value_mask & CWBorderWidth) c->border = ev->border_width; - if(c->isfixed || c->swimming || (lt->arrange == swim)) { + if(c->isfixed || c->versatile || (lt->arrange == versatile)) { if(ev->value_mask & CWX) c->x = ev->x; if(ev->value_mask & CWY) @@ -309,7 +309,7 @@ propertynotify(XEvent *e) { default: break; case XA_WM_TRANSIENT_FOR: XGetTransientForHint(dpy, c->win, &trans); - if(!c->swimming && (c->swimming = (getclient(trans) != NULL))) + if(!c->versatile && (c->versatile = (getclient(trans) != NULL))) lt->arrange(); break; case XA_WM_NORMAL_HINTS: diff --git a/screen.c b/screen.c index 8086bd0..e0da2cf 100644 --- a/screen.c +++ b/screen.c @@ -19,7 +19,7 @@ Layout *lt = NULL; typedef struct { const char *prop; const char *tags; - Bool swimming; + Bool versatile; } Rule; typedef struct { @@ -52,7 +52,7 @@ tile(void) { if(c->isbanned) XMoveWindow(dpy, c->win, c->x, c->y); c->isbanned = False; - if(c->swimming) + if(c->versatile) continue; c->ismax = False; nx = wax; @@ -175,10 +175,10 @@ restack(void) { drawstatus(); if(!sel) return; - if(sel->swimming || lt->arrange == swim) + if(sel->versatile || lt->arrange == versatile) XRaiseWindow(dpy, sel->win); - if(lt->arrange != swim) { - if(!sel->swimming) + if(lt->arrange != versatile) { + if(!sel->versatile) XLowerWindow(dpy, sel->win); for(c = nexttiled(clients); c; c = nexttiled(c->next)) { if(c == sel) @@ -208,7 +208,7 @@ settags(Client *c, Client *trans) { ch.res_name ? ch.res_name : "", c->name); for(i = 0; i < nrules; i++) if(regs[i].propregex && !regexec(regs[i].propregex, prop, 1, &tmp, 0)) { - c->swimming = rule[i].swimming; + c->versatile = rule[i].versatile; for(j = 0; regs[i].tagregex && j < ntags; j++) { if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { matched = True; @@ -226,29 +226,6 @@ settags(Client *c, Client *trans) { c->tags[i] = seltag[i]; } -void -swim(void) { - Client *c; - - for(c = clients; c; c = c->next) { - if(isvisible(c)) { - if(c->isbanned) - XMoveWindow(dpy, c->win, c->x, c->y); - c->isbanned = False; - resize(c, c->x, c->y, c->w, c->h, True); - } - else { - c->isbanned = True; - XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); - } - } - if(!sel || !isvisible(sel)) { - for(c = stack; c && !isvisible(c); c = c->snext); - focus(c); - } - restack(); -} - void tag(Arg *arg) { unsigned int i; @@ -262,14 +239,6 @@ tag(Arg *arg) { lt->arrange(); } -void -toggleswimming(Arg *arg) { - if(!sel || lt->arrange == swim) - return; - sel->swimming = !sel->swimming; - lt->arrange(); -} - void toggletag(Arg *arg) { unsigned int i; @@ -298,6 +267,14 @@ togglelayout(Arg *arg) { drawstatus(); } +void +toggleversatile(Arg *arg) { + if(!sel || lt->arrange == versatile) + return; + sel->versatile = !sel->versatile; + lt->arrange(); +} + void toggleview(Arg *arg) { unsigned int i; @@ -309,6 +286,29 @@ toggleview(Arg *arg) { lt->arrange(); } +void +versatile(void) { + Client *c; + + for(c = clients; c; c = c->next) { + if(isvisible(c)) { + if(c->isbanned) + XMoveWindow(dpy, c->win, c->x, c->y); + c->isbanned = False; + resize(c, c->x, c->y, c->w, c->h, True); + } + else { + c->isbanned = True; + XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); + } + } + if(!sel || !isvisible(sel)) { + for(c = stack; c && !isvisible(c); c = c->snext); + focus(c); + } + restack(); +} + void view(Arg *arg) { unsigned int i; -- 2.20.1 From 5a03daf47f3383250652c15f38f976f6157b4641 Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Mon, 19 Feb 2007 17:18:24 +0100 Subject: [PATCH 02/16] renamed Client->versatile and Rule->versatile into Client->isversatile resp. Rule->isversatile --- client.c | 8 ++++---- config.arg.h | 2 +- dwm.h | 2 +- event.c | 8 ++++---- screen.c | 12 ++++++------ 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/client.c b/client.c index 2aa1955..fdb973c 100644 --- a/client.c +++ b/client.c @@ -253,8 +253,8 @@ manage(Window w, XWindowAttributes *wa) { updatetitle(c); for(t = clients; t && t->win != trans; t = t->next); settags(c, t); - if(!c->versatile) - c->versatile = (t != NULL) || c->isfixed; + if(!c->isversatile) + c->isversatile = (t != NULL) || c->isfixed; attach(c); attachstack(c); c->isbanned = True; @@ -268,7 +268,7 @@ manage(Window w, XWindowAttributes *wa) { Client * nexttiled(Client *c) { - for(; c && (c->versatile || !isvisible(c)); c = c->next); + for(; c && (c->isversatile || !isvisible(c)); c = c->next); return c; } @@ -440,7 +440,7 @@ zoom(Arg *arg) { if(!sel) return; - if(sel->versatile || (lt->arrange == versatile)) { + if(sel->isversatile || (lt->arrange == versatile)) { togglemax(sel); return; } diff --git a/config.arg.h b/config.arg.h index 05bcd07..fec7a12 100644 --- a/config.arg.h +++ b/config.arg.h @@ -89,7 +89,7 @@ static Key key[] = { \ #define RULES \ static Rule rule[] = { \ - /* class:instance:title regex tags regex versatile */ \ + /* class:instance:title regex tags regex isversatile */ \ { "Firefox", "3", False }, \ { "Gimp", NULL, True }, \ { "MPlayer", NULL, True }, \ diff --git a/dwm.h b/dwm.h index 8e68776..c8546d8 100644 --- a/dwm.h +++ b/dwm.h @@ -72,7 +72,7 @@ struct Client { int minax, minay, maxax, maxay; long flags; unsigned int border; - Bool isbanned, isfixed, ismax, versatile; + Bool isbanned, isfixed, ismax, isversatile; Bool *tags; Client *next; Client *prev; diff --git a/event.c b/event.c index 00c53b6..b6a77fd 100644 --- a/event.c +++ b/event.c @@ -156,14 +156,14 @@ buttonpress(XEvent *e) { focus(c); if(CLEANMASK(ev->state) != MODKEY) return; - if(ev->button == Button1 && (lt->arrange == versatile || c->versatile)) { + if(ev->button == Button1 && (lt->arrange == versatile || c->isversatile)) { restack(); movemouse(c); } else if(ev->button == Button2) zoom(NULL); else if(ev->button == Button3 - && (lt->arrange == versatile || c->versatile) && !c->isfixed) + && (lt->arrange == versatile || c->isversatile) && !c->isfixed) { restack(); resizemouse(c); @@ -181,7 +181,7 @@ configurerequest(XEvent *e) { c->ismax = False; if(ev->value_mask & CWBorderWidth) c->border = ev->border_width; - if(c->isfixed || c->versatile || (lt->arrange == versatile)) { + if(c->isfixed || c->isversatile || (lt->arrange == versatile)) { if(ev->value_mask & CWX) c->x = ev->x; if(ev->value_mask & CWY) @@ -309,7 +309,7 @@ propertynotify(XEvent *e) { default: break; case XA_WM_TRANSIENT_FOR: XGetTransientForHint(dpy, c->win, &trans); - if(!c->versatile && (c->versatile = (getclient(trans) != NULL))) + if(!c->isversatile && (c->isversatile = (getclient(trans) != NULL))) lt->arrange(); break; case XA_WM_NORMAL_HINTS: diff --git a/screen.c b/screen.c index e0da2cf..5907ba7 100644 --- a/screen.c +++ b/screen.c @@ -19,7 +19,7 @@ Layout *lt = NULL; typedef struct { const char *prop; const char *tags; - Bool versatile; + Bool isversatile; } Rule; typedef struct { @@ -52,7 +52,7 @@ tile(void) { if(c->isbanned) XMoveWindow(dpy, c->win, c->x, c->y); c->isbanned = False; - if(c->versatile) + if(c->isversatile) continue; c->ismax = False; nx = wax; @@ -175,10 +175,10 @@ restack(void) { drawstatus(); if(!sel) return; - if(sel->versatile || lt->arrange == versatile) + if(sel->isversatile || lt->arrange == versatile) XRaiseWindow(dpy, sel->win); if(lt->arrange != versatile) { - if(!sel->versatile) + if(!sel->isversatile) XLowerWindow(dpy, sel->win); for(c = nexttiled(clients); c; c = nexttiled(c->next)) { if(c == sel) @@ -208,7 +208,7 @@ settags(Client *c, Client *trans) { ch.res_name ? ch.res_name : "", c->name); for(i = 0; i < nrules; i++) if(regs[i].propregex && !regexec(regs[i].propregex, prop, 1, &tmp, 0)) { - c->versatile = rule[i].versatile; + c->isversatile = rule[i].isversatile; for(j = 0; regs[i].tagregex && j < ntags; j++) { if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { matched = True; @@ -271,7 +271,7 @@ void toggleversatile(Arg *arg) { if(!sel || lt->arrange == versatile) return; - sel->versatile = !sel->versatile; + sel->isversatile = !sel->isversatile; lt->arrange(); } -- 2.20.1 From 3794c6294535518fdcdf2ceb434875584189aa1e Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Mon, 19 Feb 2007 18:19:43 +0100 Subject: [PATCH 03/16] changed some odering in config*.h --- config.arg.h | 20 ++++++++++---------- config.default.h | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/config.arg.h b/config.arg.h index fec7a12..0e044bf 100644 --- a/config.arg.h +++ b/config.arg.h @@ -2,16 +2,6 @@ * See LICENSE file for license details. */ -#define TAGS \ -const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; - -#define LAYOUTS \ -static Layout layout[] = { \ - /* symbol function */ \ - { "[]=", tile }, /* first entry is default */ \ - { "><>", versatile }, \ -}; - #define BORDERPX 1 #define FONT "-*-terminus-medium-r-*-*-14-*-*-*-*-*-*-*" #define NORMBORDERCOLOR "#333" @@ -27,6 +17,16 @@ static Layout layout[] = { \ #define SNAP 40 /* pixel */ #define TOPBAR True /* False */ +#define TAGS \ +const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; + +#define LAYOUTS \ +static Layout layout[] = { \ + /* symbol function */ \ + { "[]=", tile }, /* first entry is default */ \ + { "><>", versatile }, \ +}; + #define KEYS \ static Key key[] = { \ /* modifier key function argument */ \ diff --git a/config.default.h b/config.default.h index 10000d9..8bf674f 100644 --- a/config.default.h +++ b/config.default.h @@ -2,16 +2,6 @@ * See LICENSE file for license details. */ -#define TAGS \ -const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; - -#define LAYOUTS \ -Layout layout[] = { \ - /* symbol function */ \ - { "[]=", tile }, /* first entry is default */ \ - { "><>", versatile }, \ -}; - #define BORDERPX 1 #define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*" #define NORMBORDERCOLOR "#dddddd" @@ -27,6 +17,16 @@ Layout layout[] = { \ #define SNAP 20 /* pixel */ #define TOPBAR True /* False */ +#define TAGS \ +const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; + +#define LAYOUTS \ +Layout layout[] = { \ + /* symbol function */ \ + { "[]=", tile }, /* first entry is default */ \ + { "><>", versatile }, \ +}; + #define KEYS \ static Key key[] = { \ /* modifier key function argument */ \ -- 2.20.1 From 879241c05cbf959304a2dc4f2fabcdcecaea5092 Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Mon, 19 Feb 2007 18:33:15 +0100 Subject: [PATCH 04/16] replaced togglelayout with setlayout --- config.arg.h | 2 +- config.default.h | 6 +++--- dwm.h | 2 +- event.c | 3 ++- screen.c | 37 ++++++++++++++++++++++--------------- 5 files changed, 29 insertions(+), 21 deletions(-) diff --git a/config.arg.h b/config.arg.h index 0e044bf..423e935 100644 --- a/config.arg.h +++ b/config.arg.h @@ -63,7 +63,7 @@ static Key key[] = { \ { MODKEY|ControlMask|ShiftMask, XK_8, toggletag, { .i = 7 } }, \ { MODKEY|ControlMask|ShiftMask, XK_9, toggletag, { .i = 8 } }, \ { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ - { MODKEY, XK_space, togglelayout, { 0 } }, \ + { MODKEY, XK_space, setlayout, { .i = -1 } }, \ { MODKEY|ShiftMask, XK_space, toggleversatile,{ 0 } }, \ { MODKEY, XK_0, view, { .i = -1 } }, \ { MODKEY, XK_1, view, { .i = 0 } }, \ diff --git a/config.default.h b/config.default.h index 8bf674f..b29d1a4 100644 --- a/config.default.h +++ b/config.default.h @@ -58,8 +58,8 @@ static Key key[] = { \ { MODKEY|ControlMask|ShiftMask, XK_8, toggletag, { .i = 7 } }, \ { MODKEY|ControlMask|ShiftMask, XK_9, toggletag, { .i = 8 } }, \ { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ - { MODKEY, XK_space, togglelayout, { 0 } }, \ - { MODKEY|ShiftMask, XK_space, toggleversatile { 0 } }, \ + { MODKEY, XK_space, setlayout, { .i = -1 } }, \ + { MODKEY|ShiftMask, XK_space, toggleversatile,{ 0 } }, \ { MODKEY, XK_0, view, { .i = -1 } }, \ { MODKEY, XK_1, view, { .i = 0 } }, \ { MODKEY, XK_2, view, { .i = 1 } }, \ @@ -86,7 +86,7 @@ static Key key[] = { \ * xprop | awk -F '"' '/^WM_CLASS/ { printf("%s:%s:",$4,$2) }; /^WM_NAME/ { printf("%s\n",$2) }' */ #define RULES \ static Rule rule[] = { \ - /* class:instance:title regex tags regex versatile */ \ + /* class:instance:title regex tags regex isversatile */ \ { "Gimp", NULL, True }, \ { "MPlayer", NULL, True }, \ { "Acroread", NULL, True }, \ diff --git a/dwm.h b/dwm.h index c8546d8..d4cc1fa 100644 --- a/dwm.h +++ b/dwm.h @@ -134,10 +134,10 @@ extern void initlayouts(void); /* initialize layout array */ extern Bool isvisible(Client *c); /* returns True if client is visible */ extern void resizemaster(Arg *arg); /* resizes the master percent with arg's index value */ extern void restack(void); /* restores z layers of all clients */ +extern void setlayout(Arg *arg); /* sets layout, -1 toggles */ extern void settags(Client *c, Client *trans); /* sets tags of c */ extern void tag(Arg *arg); /* tags c with arg's index */ extern void toggleversatile(Arg *arg); /* toggles focusesd client between versatile/and non-versatile state */ -extern void togglelayout(Arg *arg); /* toggles layout */ extern void toggletag(Arg *arg); /* toggles c tags with arg's index */ extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */ extern void versatile(void); /* arranges all windows versatile */ diff --git a/event.c b/event.c index b6a77fd..3086284 100644 --- a/event.c +++ b/event.c @@ -140,7 +140,8 @@ buttonpress(XEvent *e) { if(ev->x < x + blw) switch(ev->button) { case Button1: - togglelayout(NULL); + a.i = -1; + setlayout(&a); break; case Button4: a.i = 1; diff --git a/screen.c b/screen.c index 5907ba7..8abe3d7 100644 --- a/screen.c +++ b/screen.c @@ -190,6 +190,28 @@ restack(void) { while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); } +void +setlayout(Arg *arg) { + unsigned int i; + + if(arg->i == -1) { + for(i = 0; i < nlayouts && lt != &layout[i]; i++); + if(i == nlayouts - 1) + lt = &layout[0]; + else + lt = &layout[++i]; + } + else { + if(arg->i < 0 || arg->i >= nlayouts) + return; + lt = &layout[arg->i]; + } + if(sel) + lt->arrange(); + else + drawstatus(); +} + void settags(Client *c, Client *trans) { char prop[512]; @@ -252,21 +274,6 @@ toggletag(Arg *arg) { lt->arrange(); } -void -togglelayout(Arg *arg) { - unsigned int i; - - for(i = 0; i < nlayouts && lt != &layout[i]; i++); - if(i == nlayouts - 1) - lt = &layout[0]; - else - lt = &layout[++i]; - if(sel) - lt->arrange(); - else - drawstatus(); -} - void toggleversatile(Arg *arg) { if(!sel || lt->arrange == versatile) -- 2.20.1 From 6bc4556ebd7f48f52f9a446e53d1705d8fd79b27 Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Mon, 19 Feb 2007 21:17:54 +0100 Subject: [PATCH 05/16] using eprint instead of fputs --- main.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/main.c b/main.c index 8ecf9fa..6f8914c 100644 --- a/main.c +++ b/main.c @@ -381,15 +381,12 @@ main(int argc, char *argv[]) { fd_set rd; XEvent ev; - if(argc == 2 && !strncmp("-v", argv[1], 3)) { - fputs("dwm-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n", stdout); - exit(EXIT_SUCCESS); - } + if(argc == 2 && !strncmp("-v", argv[1], 3)) + eprint("dwm-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n"); else if(argc != 1) eprint("usage: dwm [-v]\n"); setlocale(LC_CTYPE, ""); - dpy = XOpenDisplay(0); - if(!dpy) + if(!(dpy = XOpenDisplay(0))) eprint("dwm: cannot open display\n"); xfd = ConnectionNumber(dpy); screen = DefaultScreen(dpy); -- 2.20.1 From 8012fcf3334148d2b39646fd372a7514cc74c250 Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Tue, 20 Feb 2007 10:49:53 +0100 Subject: [PATCH 06/16] split screen.c into layout.c and tag.c (because the view is an implicit mixture of both) --- Makefile | 2 +- dwm.h | 18 +++--- screen.c => layout.c | 143 ----------------------------------------- tag.c | 149 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+), 152 deletions(-) rename screen.c => layout.c (56%) create mode 100644 tag.c diff --git a/Makefile b/Makefile index 221efa4..4af6a3d 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ include config.mk -SRC = client.c event.c main.c screen.c util.c +SRC = client.c event.c layout.c main.c tag.c util.c OBJ = ${SRC:.c=.o} all: options dwm diff --git a/dwm.h b/dwm.h index d4cc1fa..822f959 100644 --- a/dwm.h +++ b/dwm.h @@ -120,6 +120,15 @@ extern void zoom(Arg *arg); /* zooms the focused client to master area, arg is /* event.c */ extern void grabkeys(void); /* grab all keys defined in config.h */ +/* layout.c */ +extern void incnmaster(Arg *arg); /* increments nmaster with arg's index value */ +extern void initlayouts(void); /* initialize layout array */ +extern void resizemaster(Arg *arg); /* resizes the master percent with arg's index value */ +extern void restack(void); /* restores z layers of all clients */ +extern void setlayout(Arg *arg); /* sets layout, -1 toggles */ +extern void toggleversatile(Arg *arg); /* toggles focusesd client between versatile/and non-versatile state */ +extern void versatile(void); /* arranges all windows versatile */ + /* main.c */ extern void drawstatus(void); /* draw the bar */ extern unsigned int textw(const char *text); /* return the width of text in px*/ @@ -127,20 +136,13 @@ extern void quit(Arg *arg); /* quit dwm nicely */ extern void sendevent(Window w, Atom a, long value); /* send synthetic event to w */ extern int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */ -/* screen.c */ +/* tag.c */ extern void compileregs(void); /* initialize regexps of rules defined in config.h */ -extern void incnmaster(Arg *arg); /* increments nmaster with arg's index value */ -extern void initlayouts(void); /* initialize layout array */ extern Bool isvisible(Client *c); /* returns True if client is visible */ -extern void resizemaster(Arg *arg); /* resizes the master percent with arg's index value */ -extern void restack(void); /* restores z layers of all clients */ -extern void setlayout(Arg *arg); /* sets layout, -1 toggles */ extern void settags(Client *c, Client *trans); /* sets tags of c */ extern void tag(Arg *arg); /* tags c with arg's index */ -extern void toggleversatile(Arg *arg); /* toggles focusesd client between versatile/and non-versatile state */ extern void toggletag(Arg *arg); /* toggles c tags with arg's index */ extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */ -extern void versatile(void); /* arranges all windows versatile */ extern void view(Arg *arg); /* views the tag with arg's index */ /* util.c */ diff --git a/screen.c b/layout.c similarity index 56% rename from screen.c rename to layout.c index 8abe3d7..d754afb 100644 --- a/screen.c +++ b/layout.c @@ -2,12 +2,6 @@ * See LICENSE file for license details. */ #include "dwm.h" -#include -#include -#include -#include -#include -#include unsigned int master = MASTER; unsigned int nmaster = NMASTER; @@ -16,22 +10,6 @@ Layout *lt = NULL; /* static */ -typedef struct { - const char *prop; - const char *tags; - Bool isversatile; -} Rule; - -typedef struct { - regex_t *propregex; - regex_t *tagregex; -} Regs; - -TAGS -RULES - -static Regs *regs = NULL; -static unsigned int nrules = 0; static unsigned int nlayouts = 0; static void @@ -90,33 +68,6 @@ LAYOUTS /* extern */ -void -compileregs(void) { - unsigned int i; - regex_t *reg; - - if(regs) - return; - nrules = sizeof rule / sizeof rule[0]; - regs = emallocz(nrules * sizeof(Regs)); - for(i = 0; i < nrules; i++) { - if(rule[i].prop) { - reg = emallocz(sizeof(regex_t)); - if(regcomp(reg, rule[i].prop, REG_EXTENDED)) - free(reg); - else - regs[i].propregex = reg; - } - if(rule[i].tags) { - reg = emallocz(sizeof(regex_t)); - if(regcomp(reg, rule[i].tags, REG_EXTENDED)) - free(reg); - else - regs[i].tagregex = reg; - } - } -} - void incnmaster(Arg *arg) { if((lt->arrange != tile) || (nmaster + arg->i < 1) @@ -142,16 +93,6 @@ initlayouts(void) { } } -Bool -isvisible(Client *c) { - unsigned int i; - - for(i = 0; i < ntags; i++) - if(c->tags[i] && seltag[i]) - return True; - return False; -} - void resizemaster(Arg *arg) { if(lt->arrange != tile) @@ -212,68 +153,6 @@ setlayout(Arg *arg) { drawstatus(); } -void -settags(Client *c, Client *trans) { - char prop[512]; - unsigned int i, j; - regmatch_t tmp; - Bool matched = trans != NULL; - XClassHint ch = { 0 }; - - if(matched) - for(i = 0; i < ntags; i++) - c->tags[i] = trans->tags[i]; - else { - 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, &tmp, 0)) { - c->isversatile = rule[i].isversatile; - for(j = 0; regs[i].tagregex && j < ntags; j++) { - if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { - 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] = seltag[i]; -} - -void -tag(Arg *arg) { - unsigned int i; - - if(!sel) - return; - for(i = 0; i < ntags; i++) - sel->tags[i] = (arg->i == -1) ? True : False; - if(arg->i >= 0 && arg->i < ntags) - sel->tags[arg->i] = True; - lt->arrange(); -} - -void -toggletag(Arg *arg) { - unsigned int i; - - if(!sel) - return; - sel->tags[arg->i] = !sel->tags[arg->i]; - for(i = 0; i < ntags && !sel->tags[i]; i++); - if(i == ntags) - sel->tags[arg->i] = True; - lt->arrange(); -} - void toggleversatile(Arg *arg) { if(!sel || lt->arrange == versatile) @@ -282,17 +161,6 @@ toggleversatile(Arg *arg) { lt->arrange(); } -void -toggleview(Arg *arg) { - unsigned int i; - - seltag[arg->i] = !seltag[arg->i]; - for(i = 0; i < ntags && !seltag[i]; i++); - if(i == ntags) - seltag[arg->i] = True; /* cannot toggle last view */ - lt->arrange(); -} - void versatile(void) { Client *c; @@ -315,14 +183,3 @@ versatile(void) { } restack(); } - -void -view(Arg *arg) { - unsigned int i; - - for(i = 0; i < ntags; i++) - seltag[i] = (arg->i == -1) ? True : False; - if(arg->i >= 0 && arg->i < ntags) - seltag[arg->i] = True; - lt->arrange(); -} diff --git a/tag.c b/tag.c new file mode 100644 index 0000000..f54ac3f --- /dev/null +++ b/tag.c @@ -0,0 +1,149 @@ +/* (C)opyright MMVI-MMVII Anselm R. Garbe + * See LICENSE file for license details. + */ +#include "dwm.h" +#include +#include +#include + +/* static */ + +typedef struct { + const char *prop; + const char *tags; + Bool isversatile; +} Rule; + +typedef struct { + regex_t *propregex; + regex_t *tagregex; +} Regs; + +TAGS +RULES + +static Regs *regs = NULL; +static unsigned int nrules = 0; + +/* extern */ + +void +compileregs(void) { + unsigned int i; + regex_t *reg; + + if(regs) + return; + nrules = sizeof rule / sizeof rule[0]; + regs = emallocz(nrules * sizeof(Regs)); + for(i = 0; i < nrules; i++) { + if(rule[i].prop) { + reg = emallocz(sizeof(regex_t)); + if(regcomp(reg, rule[i].prop, REG_EXTENDED)) + free(reg); + else + regs[i].propregex = reg; + } + if(rule[i].tags) { + reg = emallocz(sizeof(regex_t)); + if(regcomp(reg, rule[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] && seltag[i]) + return True; + return False; +} + +void +settags(Client *c, Client *trans) { + char prop[512]; + unsigned int i, j; + regmatch_t tmp; + Bool matched = trans != NULL; + XClassHint ch = { 0 }; + + if(matched) + for(i = 0; i < ntags; i++) + c->tags[i] = trans->tags[i]; + else { + 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, &tmp, 0)) { + c->isversatile = rule[i].isversatile; + for(j = 0; regs[i].tagregex && j < ntags; j++) { + if(!regexec(regs[i].tagregex, tags[j], 1, &tmp, 0)) { + 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] = seltag[i]; +} + +void +tag(Arg *arg) { + unsigned int i; + + if(!sel) + return; + for(i = 0; i < ntags; i++) + sel->tags[i] = (arg->i == -1) ? True : False; + if(arg->i >= 0 && arg->i < ntags) + sel->tags[arg->i] = True; + lt->arrange(); +} + +void +toggletag(Arg *arg) { + unsigned int i; + + if(!sel) + return; + sel->tags[arg->i] = !sel->tags[arg->i]; + for(i = 0; i < ntags && !sel->tags[i]; i++); + if(i == ntags) + sel->tags[arg->i] = True; + lt->arrange(); +} + +void +toggleview(Arg *arg) { + unsigned int i; + + seltag[arg->i] = !seltag[arg->i]; + for(i = 0; i < ntags && !seltag[i]; i++); + if(i == ntags) + seltag[arg->i] = True; /* cannot toggle last view */ + lt->arrange(); +} + +void +view(Arg *arg) { + unsigned int i; + + for(i = 0; i < ntags; i++) + seltag[i] = (arg->i == -1) ? True : False; + if(arg->i >= 0 && arg->i < ntags) + seltag[arg->i] = True; + lt->arrange(); +} -- 2.20.1 From 355beb53f085f51f49159bc9822922c11fbddd26 Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Tue, 20 Feb 2007 11:26:16 +0100 Subject: [PATCH 07/16] rechecked with OpenBSD --- tag.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tag.c b/tag.c index f54ac3f..c069dcc 100644 --- a/tag.c +++ b/tag.c @@ -4,6 +4,7 @@ #include "dwm.h" #include #include +#include #include /* static */ -- 2.20.1 From f4d15b1fec52bdd6d512577fd96490efaddb55eb Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Tue, 20 Feb 2007 13:40:31 +0100 Subject: [PATCH 08/16] separating drawsquare from drawtext, made drawtext extern --- dwm.h | 2 ++ main.c | 112 ++++++++++++++++++++++++++++++++------------------------- 2 files changed, 65 insertions(+), 49 deletions(-) diff --git a/dwm.h b/dwm.h index 822f959..36033fe 100644 --- a/dwm.h +++ b/dwm.h @@ -131,6 +131,8 @@ extern void versatile(void); /* arranges all windows versatile */ /* main.c */ extern void drawstatus(void); /* draw the bar */ +extern void drawtext(const char *text, + unsigned long col[ColLast]); /* draw text */ extern unsigned int textw(const char *text); /* return the width of text in px*/ extern void quit(Arg *arg); /* quit dwm nicely */ extern void sendevent(Window w, Atom a, long value); /* send synthetic event to w */ diff --git a/main.c b/main.c index 6f8914c..9e6f5e3 100644 --- a/main.c +++ b/main.c @@ -73,57 +73,21 @@ textnw(const char *text, unsigned int len) { } static void -drawtext(const char *text, unsigned long col[ColLast], Bool filledsquare, Bool emptysquare) { - int x, y, w, h; - static char buf[256]; - unsigned int len, olen; +drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) { + int x; XGCValues gcv; XRectangle r = { dc.x, dc.y, dc.w, dc.h }; - XSetForeground(dpy, dc.gc, col[ColBG]); - XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); - if(!text) - return; - w = 0; - olen = len = strlen(text); - if(len >= sizeof buf) - len = sizeof buf - 1; - memcpy(buf, text, len); - buf[len] = 0; - h = dc.font.ascent + dc.font.descent; - y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; - x = dc.x + (h / 2); - /* shorten text if necessary */ - while(len && (w = textnw(buf, len)) > dc.w - h) - buf[--len] = 0; - if(len < olen) { - if(len > 1) - buf[len - 1] = '.'; - if(len > 2) - buf[len - 2] = '.'; - if(len > 3) - buf[len - 3] = '.'; - } - if(w > dc.w) - return; /* too long */ gcv.foreground = col[ColFG]; - if(dc.font.set) { - XChangeGC(dpy, dc.gc, GCForeground, &gcv); - XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); - } - else { - gcv.font = dc.font.xfont->fid; - XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); - XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); - } - x = (h + 2) / 4; + XChangeGC(dpy, dc.gc, GCForeground, &gcv); + x = (dc.font.ascent + dc.font.descent + 2) / 4; r.x = dc.x + 1; r.y = dc.y + 1; - if(filledsquare) { + if(filled) { r.width = r.height = x + 1; XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); } - else if(emptysquare) { + else if(empty) { r.width = r.height = x; XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1); } @@ -306,14 +270,18 @@ drawstatus(void) { dc.x = dc.y = 0; for(i = 0; i < ntags; i++) { dc.w = textw(tags[i]); - if(seltag[i]) - drawtext(tags[i], dc.sel, sel && sel->tags[i], isoccupied(i)); - else - drawtext(tags[i], dc.norm, sel && sel->tags[i], isoccupied(i)); + if(seltag[i]) { + drawtext(tags[i], dc.sel); + drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel); + } + else { + drawtext(tags[i], dc.norm); + drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm); + } dc.x += dc.w; } dc.w = blw; - drawtext(lt->symbol, dc.norm, False, False); + drawtext(lt->symbol, dc.norm); x = dc.x + dc.w; dc.w = textw(stext); dc.x = sw - dc.w; @@ -321,15 +289,61 @@ drawstatus(void) { dc.x = x; dc.w = sw - x; } - drawtext(stext, dc.norm, False, False); + drawtext(stext, dc.norm); if((dc.w = dc.x - x) > bh) { dc.x = x; - drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm, False, False); + drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm); } XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); XSync(dpy, False); } +void +drawtext(const char *text, unsigned long col[ColLast]) { + int x, y, w, h; + static char buf[256]; + unsigned int len, olen; + XGCValues gcv; + XRectangle r = { dc.x, dc.y, dc.w, dc.h }; + + XSetForeground(dpy, dc.gc, col[ColBG]); + XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); + if(!text) + return; + w = 0; + olen = len = strlen(text); + if(len >= sizeof buf) + len = sizeof buf - 1; + memcpy(buf, text, len); + buf[len] = 0; + h = dc.font.ascent + dc.font.descent; + y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; + x = dc.x + (h / 2); + /* shorten text if necessary */ + while(len && (w = textnw(buf, len)) > dc.w - h) + buf[--len] = 0; + if(len < olen) { + if(len > 1) + buf[len - 1] = '.'; + if(len > 2) + buf[len - 2] = '.'; + if(len > 3) + buf[len - 3] = '.'; + } + if(w > dc.w) + return; /* too long */ + gcv.foreground = col[ColFG]; + if(dc.font.set) { + XChangeGC(dpy, dc.gc, GCForeground, &gcv); + XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); + } + else { + gcv.font = dc.font.xfont->fid; + XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); + XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); + } +} + void sendevent(Window w, Atom a, long value) { XEvent e; -- 2.20.1 From e7508783e85aba0ce4ab09b0dd76c40342113aed Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Tue, 20 Feb 2007 13:46:21 +0100 Subject: [PATCH 09/16] added draw.c again (except getcolor and setfont which are helpers in main.c) --- Makefile | 2 +- draw.c | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ dwm.h | 10 ++-- main.c | 128 --------------------------------------------------- 4 files changed, 144 insertions(+), 133 deletions(-) create mode 100644 draw.c diff --git a/Makefile b/Makefile index 4af6a3d..6127456 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ include config.mk -SRC = client.c event.c layout.c main.c tag.c util.c +SRC = client.c draw.c event.c layout.c main.c tag.c util.c OBJ = ${SRC:.c=.o} all: options dwm diff --git a/draw.c b/draw.c new file mode 100644 index 0000000..25b08c6 --- /dev/null +++ b/draw.c @@ -0,0 +1,137 @@ +/* (C)opyright MMVI-MMVII Anselm R. Garbe + * See LICENSE file for license details. + */ +#include "dwm.h" +#include + +/* static */ + +static unsigned int +textnw(const 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); +} + +static void +drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) { + int x; + XGCValues gcv; + XRectangle r = { dc.x, dc.y, dc.w, dc.h }; + + gcv.foreground = col[ColFG]; + XChangeGC(dpy, dc.gc, GCForeground, &gcv); + x = (dc.font.ascent + dc.font.descent + 2) / 4; + r.x = dc.x + 1; + r.y = dc.y + 1; + if(filled) { + r.width = r.height = x + 1; + XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); + } + else if(empty) { + r.width = r.height = x; + XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1); + } +} + +static Bool +isoccupied(unsigned int t) { + Client *c; + + for(c = clients; c; c = c->next) + if(c->tags[t]) + return True; + return False; +} + +/* extern */ + +void +drawstatus(void) { + int i, x; + + dc.x = dc.y = 0; + for(i = 0; i < ntags; i++) { + dc.w = textw(tags[i]); + if(seltag[i]) { + drawtext(tags[i], dc.sel); + drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel); + } + else { + drawtext(tags[i], dc.norm); + drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm); + } + dc.x += dc.w; + } + dc.w = blw; + drawtext(lt->symbol, dc.norm); + x = dc.x + dc.w; + dc.w = textw(stext); + dc.x = sw - dc.w; + if(dc.x < x) { + dc.x = x; + dc.w = sw - x; + } + drawtext(stext, dc.norm); + if((dc.w = dc.x - x) > bh) { + dc.x = x; + drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm); + } + XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); + XSync(dpy, False); +} + +void +drawtext(const char *text, unsigned long col[ColLast]) { + int x, y, w, h; + static char buf[256]; + unsigned int len, olen; + XGCValues gcv; + XRectangle r = { dc.x, dc.y, dc.w, dc.h }; + + XSetForeground(dpy, dc.gc, col[ColBG]); + XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); + if(!text) + return; + w = 0; + olen = len = strlen(text); + if(len >= sizeof buf) + len = sizeof buf - 1; + memcpy(buf, text, len); + buf[len] = 0; + h = dc.font.ascent + dc.font.descent; + y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; + x = dc.x + (h / 2); + /* shorten text if necessary */ + while(len && (w = textnw(buf, len)) > dc.w - h) + buf[--len] = 0; + if(len < olen) { + if(len > 1) + buf[len - 1] = '.'; + if(len > 2) + buf[len - 2] = '.'; + if(len > 3) + buf[len - 3] = '.'; + } + if(w > dc.w) + return; /* too long */ + gcv.foreground = col[ColFG]; + if(dc.font.set) { + XChangeGC(dpy, dc.gc, GCForeground, &gcv); + XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); + } + else { + gcv.font = dc.font.xfont->fid; + XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); + XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); + } +} + +unsigned int +textw(const char *text) { + return textnw(text, strlen(text)) + dc.font.height; +} diff --git a/dwm.h b/dwm.h index 36033fe..42f847b 100644 --- a/dwm.h +++ b/dwm.h @@ -117,6 +117,12 @@ extern void updatetitle(Client *c); /* update the name of c */ extern void unmanage(Client *c); /* destroy c */ extern void zoom(Arg *arg); /* zooms the focused client to master area, arg is ignored */ +/* draw.c */ +extern void drawstatus(void); /* draw the bar */ +extern void drawtext(const char *text, + unsigned long col[ColLast]); /* draw text */ +extern unsigned int textw(const char *text); /* return the width of text in px*/ + /* event.c */ extern void grabkeys(void); /* grab all keys defined in config.h */ @@ -130,10 +136,6 @@ extern void toggleversatile(Arg *arg); /* toggles focusesd client between versa extern void versatile(void); /* arranges all windows versatile */ /* main.c */ -extern void drawstatus(void); /* draw the bar */ -extern void drawtext(const char *text, - unsigned long col[ColLast]); /* draw text */ -extern unsigned int textw(const char *text); /* return the width of text in px*/ extern void quit(Arg *arg); /* quit dwm nicely */ extern void sendevent(Window w, Atom a, long value); /* send synthetic event to w */ extern int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */ diff --git a/main.c b/main.c index 9e6f5e3..1015017 100644 --- a/main.c +++ b/main.c @@ -61,38 +61,6 @@ cleanup(void) { free(seltag); } -static unsigned int -textnw(const 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); -} - -static void -drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) { - int x; - XGCValues gcv; - XRectangle r = { dc.x, dc.y, dc.w, dc.h }; - - gcv.foreground = col[ColFG]; - XChangeGC(dpy, dc.gc, GCForeground, &gcv); - x = (dc.font.ascent + dc.font.descent + 2) / 4; - r.x = dc.x + 1; - r.y = dc.y + 1; - if(filled) { - r.width = r.height = x + 1; - XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); - } - else if(empty) { - r.width = r.height = x; - XDrawRectangles(dpy, dc.drawable, dc.gc, &r, 1); - } -} - static unsigned long getcolor(const char *colstr) { Colormap cmap = DefaultColormap(dpy, screen); @@ -103,16 +71,6 @@ getcolor(const char *colstr) { return color.pixel; } -static Bool -isoccupied(unsigned int t) { - Client *c; - - for(c = clients; c; c = c->next) - if(c->tags[t]) - return True; - return False; -} - static void scan(void) { unsigned int i, num; @@ -263,87 +221,6 @@ xerrorstart(Display *dsply, XErrorEvent *ee) { /* extern */ -void -drawstatus(void) { - int i, x; - - dc.x = dc.y = 0; - for(i = 0; i < ntags; i++) { - dc.w = textw(tags[i]); - if(seltag[i]) { - drawtext(tags[i], dc.sel); - drawsquare(sel && sel->tags[i], isoccupied(i), dc.sel); - } - else { - drawtext(tags[i], dc.norm); - drawsquare(sel && sel->tags[i], isoccupied(i), dc.norm); - } - dc.x += dc.w; - } - dc.w = blw; - drawtext(lt->symbol, dc.norm); - x = dc.x + dc.w; - dc.w = textw(stext); - dc.x = sw - dc.w; - if(dc.x < x) { - dc.x = x; - dc.w = sw - x; - } - drawtext(stext, dc.norm); - if((dc.w = dc.x - x) > bh) { - dc.x = x; - drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm); - } - XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, sw, bh, 0, 0); - XSync(dpy, False); -} - -void -drawtext(const char *text, unsigned long col[ColLast]) { - int x, y, w, h; - static char buf[256]; - unsigned int len, olen; - XGCValues gcv; - XRectangle r = { dc.x, dc.y, dc.w, dc.h }; - - XSetForeground(dpy, dc.gc, col[ColBG]); - XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1); - if(!text) - return; - w = 0; - olen = len = strlen(text); - if(len >= sizeof buf) - len = sizeof buf - 1; - memcpy(buf, text, len); - buf[len] = 0; - h = dc.font.ascent + dc.font.descent; - y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; - x = dc.x + (h / 2); - /* shorten text if necessary */ - while(len && (w = textnw(buf, len)) > dc.w - h) - buf[--len] = 0; - if(len < olen) { - if(len > 1) - buf[len - 1] = '.'; - if(len > 2) - buf[len - 2] = '.'; - if(len > 3) - buf[len - 3] = '.'; - } - if(w > dc.w) - return; /* too long */ - gcv.foreground = col[ColFG]; - if(dc.font.set) { - XChangeGC(dpy, dc.gc, GCForeground, &gcv); - XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); - } - else { - gcv.font = dc.font.xfont->fid; - XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv); - XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); - } -} - void sendevent(Window w, Atom a, long value) { XEvent e; @@ -358,11 +235,6 @@ sendevent(Window w, Atom a, long value) { XSync(dpy, False); } -unsigned int -textw(const char *text) { - return textnw(text, strlen(text)) + dc.font.height; -} - void quit(Arg *arg) { readin = running = False; -- 2.20.1 From 138b7fbd0563e176e4f4dce8ac771263f74ff6cb Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Tue, 20 Feb 2007 13:48:02 +0100 Subject: [PATCH 10/16] fixed order --- draw.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/draw.c b/draw.c index 25b08c6..8369082 100644 --- a/draw.c +++ b/draw.c @@ -6,17 +6,6 @@ /* static */ -static unsigned int -textnw(const 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); -} - static void drawsquare(Bool filled, Bool empty, unsigned long col[ColLast]) { int x; @@ -48,6 +37,17 @@ isoccupied(unsigned int t) { return False; } +static unsigned int +textnw(const 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); +} + /* extern */ void -- 2.20.1 From d180ba418cd56f3a743d9a5863f86f7eae21602f Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Tue, 20 Feb 2007 13:56:21 +0100 Subject: [PATCH 11/16] renamed setfont to initfont, getcolor to initcolor --- main.c | 58 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/main.c b/main.c index 1015017..73b713f 100644 --- a/main.c +++ b/main.c @@ -62,7 +62,7 @@ cleanup(void) { } static unsigned long -getcolor(const char *colstr) { +initcolor(const char *colstr) { Colormap cmap = DefaultColormap(dpy, screen); XColor color; @@ -72,27 +72,7 @@ getcolor(const char *colstr) { } static void -scan(void) { - unsigned int i, num; - Window *wins, d1, d2; - XWindowAttributes wa; - - wins = NULL; - if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for(i = 0; i < num; i++) { - if(!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if(wa.map_state == IsViewable) - manage(wins[i], &wa); - } - } - if(wins) - XFree(wins); -} - -static void -setfont(const char *fontstr) { +initfont(const char *fontstr) { char *def, **missing; int i, n; @@ -132,6 +112,26 @@ setfont(const char *fontstr) { dc.font.height = dc.font.ascent + dc.font.descent; } +static void +scan(void) { + unsigned int i, num; + Window *wins, d1, d2; + XWindowAttributes wa; + + wins = NULL; + if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { + for(i = 0; i < num; i++) { + if(!XGetWindowAttributes(dpy, wins[i], &wa) + || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) + continue; + if(wa.map_state == IsViewable) + manage(wins[i], &wa); + } + } + if(wins) + XFree(wins); +} + static void setup(void) { int i, j; @@ -173,13 +173,13 @@ setup(void) { seltag = emallocz(sizeof(Bool) * ntags); seltag[0] = True; /* style */ - 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); - setfont(FONT); + 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); /* geometry */ sx = sy = 0; sw = DisplayWidth(dpy, screen); -- 2.20.1 From ad4962c7eb5f62400c762fea90d9be0e85f5c33d Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Wed, 21 Feb 2007 11:04:33 +0100 Subject: [PATCH 12/16] fixed quoting and a comment --- Makefile | 2 +- dwm.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 6127456..2c015b9 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ install: all @chmod 755 ${DESTDIR}${PREFIX}/bin/dwm @echo installing manual page to ${DESTDIR}${MANPREFIX}/man1 @mkdir -p ${DESTDIR}${MANPREFIX}/man1 - @sed 's/VERSION/${VERSION}/g' < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 + @sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1 @chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1 uninstall: diff --git a/dwm.h b/dwm.h index 42f847b..2ae48fa 100644 --- a/dwm.h +++ b/dwm.h @@ -152,5 +152,5 @@ extern void view(Arg *arg); /* views the tag with arg's index */ /* util.c */ extern void *emallocz(unsigned int size); /* allocates zero-initialized memory, exits on error */ extern void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */ -extern void spawn(Arg *arg); /* forks a new subprocess with to arg's cmd */ +extern void spawn(Arg *arg); /* forks a new subprocess with arg's cmd */ -- 2.20.1 From ab838721345532898419f1600a31a1b69a9c0c92 Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Wed, 21 Feb 2007 11:05:27 +0100 Subject: [PATCH 13/16] Added tag 3.6 for changeset 75b1b25fe0d7e29400baf30568153f668324928b --- .hgtags | 1 + 1 file changed, 1 insertion(+) diff --git a/.hgtags b/.hgtags index b54bacd..8923fa7 100644 --- a/.hgtags +++ b/.hgtags @@ -37,3 +37,4 @@ d3876aa792923f9a95f7ad0c7f0134533404df35 3.2.2 0f91934037b04221ff5d1ba3a6c39c1ff26e3661 3.3 9ede7b2d2450537e750d5505789fbe63960e97e6 3.4 63ad05e7f9e1f4f1881fb02f529cb6c6ae81e693 3.5 +75b1b25fe0d7e29400baf30568153f668324928b 3.6 -- 2.20.1 From f196b71e4d543e7d8c4fd6398cf1bedd3dafc024 Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Wed, 21 Feb 2007 11:30:52 +0100 Subject: [PATCH 14/16] cleaned up and commented the config.*.h --- config.arg.h | 30 ++++++++++++++++-------------- config.default.h | 34 ++++++++++++++++++---------------- config.mk | 2 +- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/config.arg.h b/config.arg.h index 423e935..11e7eee 100644 --- a/config.arg.h +++ b/config.arg.h @@ -2,6 +2,7 @@ * See LICENSE file for license details. */ +/* appearance */ #define BORDERPX 1 #define FONT "-*-terminus-medium-r-*-*-14-*-*-*-*-*-*-*" #define NORMBORDERCOLOR "#333" @@ -10,23 +11,33 @@ #define SELBORDERCOLOR "#69c" #define SELBGCOLOR "#555" #define SELFGCOLOR "#fff" - -#define MASTER 600 /* per thousand */ -#define MODKEY Mod1Mask -#define NMASTER 1 /* clients in master area */ -#define SNAP 40 /* pixel */ #define TOPBAR True /* False */ +/* behavior */ +#define SNAP 40 /* pixel */ #define TAGS \ const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; +#define RULES \ +static Rule rule[] = { \ + /* class:instance:title regex tags regex isversatile */ \ + { "Firefox", "3", False }, \ + { "Gimp", NULL, True }, \ + { "MPlayer", NULL, True }, \ + { "Acroread", NULL, True }, \ +}; +/* layout(s) */ #define LAYOUTS \ static Layout layout[] = { \ /* symbol function */ \ { "[]=", tile }, /* first entry is default */ \ { "><>", versatile }, \ }; +#define MASTER 600 /* per thousand */ +#define NMASTER 1 /* clients in master area */ +/* key definitions */ +#define MODKEY Mod1Mask #define KEYS \ static Key key[] = { \ /* modifier key function argument */ \ @@ -86,12 +97,3 @@ static Key key[] = { \ { MODKEY|ControlMask, XK_9, toggleview, { .i = 8 } }, \ { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ }; - -#define RULES \ -static Rule rule[] = { \ - /* class:instance:title regex tags regex isversatile */ \ - { "Firefox", "3", False }, \ - { "Gimp", NULL, True }, \ - { "MPlayer", NULL, True }, \ - { "Acroread", NULL, True }, \ -}; diff --git a/config.default.h b/config.default.h index b29d1a4..eb6933b 100644 --- a/config.default.h +++ b/config.default.h @@ -2,6 +2,7 @@ * See LICENSE file for license details. */ +/* appearance */ #define BORDERPX 1 #define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*" #define NORMBORDERCOLOR "#dddddd" @@ -10,23 +11,34 @@ #define SELBORDERCOLOR "#ff0000" #define SELBGCOLOR "#006699" #define SELFGCOLOR "#ffffff" - -#define MASTER 600 /* per thousand */ -#define MODKEY Mod1Mask -#define NMASTER 1 /* clients in master area */ -#define SNAP 20 /* pixel */ #define TOPBAR True /* False */ +/* behavior */ +#define SNAP 20 /* pixel */ #define TAGS \ const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", NULL }; +/* Query class:instance:title for regex matching info with following command: + * xprop | awk -F '"' '/^WM_CLASS/ { printf("%s:%s:",$4,$2) }; /^WM_NAME/ { printf("%s\n",$2) }' */ +#define RULES \ +static Rule rule[] = { \ + /* class:instance:title regex tags regex isversatile */ \ + { "Gimp", NULL, True }, \ + { "MPlayer", NULL, True }, \ + { "Acroread", NULL, True }, \ +}; +/* layout(s) */ #define LAYOUTS \ -Layout layout[] = { \ +static Layout layout[] = { \ /* symbol function */ \ { "[]=", tile }, /* first entry is default */ \ { "><>", versatile }, \ }; +#define MASTER 600 /* per thousand */ +#define NMASTER 1 /* clients in master area */ +/* key definitions */ +#define MODKEY Mod1Mask #define KEYS \ static Key key[] = { \ /* modifier key function argument */ \ @@ -81,13 +93,3 @@ static Key key[] = { \ { MODKEY|ControlMask, XK_9, toggleview, { .i = 8 } }, \ { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ }; - -/* Query class:instance:title for regex matching info with following command: - * xprop | awk -F '"' '/^WM_CLASS/ { printf("%s:%s:",$4,$2) }; /^WM_NAME/ { printf("%s\n",$2) }' */ -#define RULES \ -static Rule rule[] = { \ - /* class:instance:title regex tags regex isversatile */ \ - { "Gimp", NULL, True }, \ - { "MPlayer", NULL, True }, \ - { "Acroread", NULL, True }, \ -}; diff --git a/config.mk b/config.mk index d3a6ffd..a41fe8e 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ # dwm version -VERSION = 3.6 +VERSION = 3.7 # Customize below to fit your system -- 2.20.1 From 29c26b88e7333fb8ea022c4bb4277bc0394ab9e3 Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Wed, 21 Feb 2007 11:39:57 +0100 Subject: [PATCH 15/16] moved focus{next,prev} and nexttiled from client.c to layout.c (because those are not client-specific), moved toggleversatile() from layout.c to client.c (because those are client-specific) --- client.c | 46 ++++++++-------------------------------------- dwm.h | 8 ++++---- layout.c | 46 ++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/client.c b/client.c index fdb973c..c962c39 100644 --- a/client.c +++ b/client.c @@ -170,38 +170,6 @@ focus(Client *c) { XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); } -void -focusnext(Arg *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(Arg *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(); - } -} - void killclient(Arg *arg) { if(!sel) @@ -266,12 +234,6 @@ manage(Window w, XWindowAttributes *wa) { lt->arrange(); } -Client * -nexttiled(Client *c) { - for(; c && (c->isversatile || !isvisible(c)); c = c->next); - return c; -} - void resize(Client *c, int x, int y, int w, int h, Bool sizehints) { float actual, dx, dy, max, min; @@ -340,6 +302,14 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) { } } +void +toggleversatile(Arg *arg) { + if(!sel || lt->arrange == versatile) + return; + sel->isversatile = !sel->isversatile; + lt->arrange(); +} + void updatesizehints(Client *c) { long msize; diff --git a/dwm.h b/dwm.h index 2ae48fa..2751c9e 100644 --- a/dwm.h +++ b/dwm.h @@ -105,13 +105,11 @@ extern Window root, barwin; /* client.c */ extern void configure(Client *c); /* send synthetic configure event */ extern void focus(Client *c); /* focus c, c may be NULL */ -extern void focusnext(Arg *arg); /* focuses next visible client, arg is ignored */ -extern void focusprev(Arg *arg); /* focuses previous visible client, arg is ignored */ extern void killclient(Arg *arg); /* kill c nicely */ extern void manage(Window w, XWindowAttributes *wa); /* manage new client */ -extern Client *nexttiled(Client *c); /* returns tiled successor of c */ extern void resize(Client *c, int x, int y, int w, int h, Bool sizehints); /* resize with given coordinates c*/ +extern void toggleversatile(Arg *arg); /* toggles focused client between versatile/and non-versatile state */ extern void updatesizehints(Client *c); /* update the size hint variables of c */ extern void updatetitle(Client *c); /* update the name of c */ extern void unmanage(Client *c); /* destroy c */ @@ -127,12 +125,14 @@ extern unsigned int textw(const char *text); /* return the width of text in px*/ extern void grabkeys(void); /* grab all keys defined in config.h */ /* layout.c */ +extern void focusnext(Arg *arg); /* focuses next visible client, arg is ignored */ +extern void focusprev(Arg *arg); /* focuses previous visible client, arg is ignored */ extern void incnmaster(Arg *arg); /* increments nmaster with arg's index value */ extern void initlayouts(void); /* initialize layout array */ +extern Client *nexttiled(Client *c); /* returns tiled successor of c */ extern void resizemaster(Arg *arg); /* resizes the master percent with arg's index value */ extern void restack(void); /* restores z layers of all clients */ extern void setlayout(Arg *arg); /* sets layout, -1 toggles */ -extern void toggleversatile(Arg *arg); /* toggles focusesd client between versatile/and non-versatile state */ extern void versatile(void); /* arranges all windows versatile */ /* main.c */ diff --git a/layout.c b/layout.c index d754afb..e5f635c 100644 --- a/layout.c +++ b/layout.c @@ -68,6 +68,38 @@ LAYOUTS /* extern */ +void +focusnext(Arg *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(Arg *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(); + } +} + void incnmaster(Arg *arg) { if((lt->arrange != tile) || (nmaster + arg->i < 1) @@ -93,6 +125,12 @@ initlayouts(void) { } } +Client * +nexttiled(Client *c) { + for(; c && (c->isversatile || !isvisible(c)); c = c->next); + return c; +} + void resizemaster(Arg *arg) { if(lt->arrange != tile) @@ -153,14 +191,6 @@ setlayout(Arg *arg) { drawstatus(); } -void -toggleversatile(Arg *arg) { - if(!sel || lt->arrange == versatile) - return; - sel->isversatile = !sel->isversatile; - lt->arrange(); -} - void versatile(void) { Client *c; -- 2.20.1 From 52f0b9e2e3e7eba1e7d2b940863d9a72fa8112d6 Mon Sep 17 00:00:00 2001 From: "Anselm R. Garbe" Date: Wed, 21 Feb 2007 11:45:51 +0100 Subject: [PATCH 16/16] removed some global vars which should be static instead --- dwm.h | 4 ++-- main.c | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/dwm.h b/dwm.h index 2751c9e..4e7e551 100644 --- a/dwm.h +++ b/dwm.h @@ -87,14 +87,14 @@ typedef struct { extern const char *tags[]; /* all tags */ extern char stext[256]; /* status text */ -extern int screen, sx, sy, sw, sh; /* screen geometry */ +extern int screen, sw, sh; /* screen geometry */ extern int wax, way, wah, waw; /* windowarea geometry */ extern unsigned int bh, blw; /* bar height, bar layout label width */ extern unsigned int master, nmaster; /* master percent, number of master clients */ extern unsigned int ntags, numlockmask; /* number of tags, dynamic lock mask */ extern void (*handler[LASTEvent])(XEvent *); /* event handler */ extern Atom wmatom[WMLast], netatom[NetLast]; -extern Bool running, selscreen, *seltag; /* seltag is array of Bool */ +extern Bool selscreen, *seltag; /* seltag is array of Bool */ extern Client *clients, *sel, *stack; /* global client list and stack */ extern Cursor cursor[CurLast]; extern DC dc; /* global draw context */ diff --git a/main.c b/main.c index 73b713f..3470287 100644 --- a/main.c +++ b/main.c @@ -18,10 +18,9 @@ /* extern */ char stext[256]; -int screen, sx, sy, sw, sh, wax, way, waw, wah; +int screen, sw, sh, wax, way, waw, wah; unsigned int bh, ntags, numlockmask; Atom wmatom[WMLast], netatom[NetLast]; -Bool running = True; Bool *seltag; Bool selscreen = True; Client *clients = NULL; @@ -36,6 +35,7 @@ Window root, barwin; static int (*xerrorxlib)(Display *, XErrorEvent *); static Bool otherwm, readin; +static Bool running = True; static void cleanup(void) { @@ -181,7 +181,6 @@ setup(void) { dc.sel[ColFG] = initcolor(SELFGCOLOR); initfont(FONT); /* geometry */ - sx = sy = 0; sw = DisplayWidth(dpy, screen); sh = DisplayHeight(dpy, screen); initlayouts(); @@ -190,15 +189,15 @@ setup(void) { wa.override_redirect = 1; wa.background_pixmap = ParentRelative; wa.event_mask = ButtonPressMask | ExposureMask; - barwin = XCreateWindow(dpy, root, sx, sy + (TOPBAR ? 0 : sh - bh), sw, bh, 0, + barwin = XCreateWindow(dpy, root, 0, (TOPBAR ? 0 : sh - bh), sw, bh, 0, DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen), CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); XDefineCursor(dpy, barwin, cursor[CurNormal]); XMapRaised(dpy, barwin); strcpy(stext, "dwm-"VERSION); /* windowarea */ - wax = sx; - way = sy + (TOPBAR ? bh : 0); + wax = 0; + way = (TOPBAR ? bh : 0); wah = sh - bh; waw = sw; /* pixmap for everything */ -- 2.20.1