Browse Source

separated layout-specific stuff into separate .h and .c files which are included in config.h resp. config.mk - this allows writing layouts for dwm without any need to patch existing code

master
Anselm R. Garbe 18 years ago
parent
commit
2d81b78b85
13 changed files with 164 additions and 134 deletions
  1. +1
    -1
      Makefile
  2. +3
    -3
      client.c
  3. +4
    -3
      config.arg.h
  4. +4
    -3
      config.default.h
  5. +3
    -0
      config.mk
  6. +1
    -4
      dwm.h
  7. +2
    -2
      event.c
  8. +41
    -0
      float.c
  9. +5
    -0
      float.h
  10. +2
    -114
      layout.c
  11. +4
    -4
      tag.c
  12. +88
    -0
      tile.c
  13. +6
    -0
      tile.h

+ 1
- 1
Makefile View File

@ -3,7 +3,7 @@
include config.mk
SRC = client.c draw.c event.c layout.c main.c tag.c util.c
SRC += client.c draw.c event.c layout.c main.c tag.c util.c
OBJ = ${SRC:.c=.o}
all: options dwm


+ 3
- 3
client.c View File

@ -230,7 +230,7 @@ manage(Window w, XWindowAttributes *wa) {
setclientstate(c, IconicState);
c->isbanned = True;
focus(c);
lt->arrange(NULL);
lt->arrange();
}
void
@ -305,7 +305,7 @@ togglefloating(const char *arg) {
sel->isfloating = !sel->isfloating;
if(sel->isfloating)
resize(sel, sel->x, sel->y, sel->w, sel->h, True);
lt->arrange(NULL);
lt->arrange();
}
void
@ -337,7 +337,7 @@ unmanage(Client *c) {
XSync(dpy, False);
XSetErrorHandler(xerror);
XUngrabServer(dpy);
lt->arrange(NULL);
lt->arrange();
}
void


+ 4
- 3
config.arg.h View File

@ -24,7 +24,8 @@ static Rule rule[] = { \
};
/* layout(s) */
void tile(const char *arg); /* arranges all windows tiled */
#include "tile.h"
#include "float.h"
#define LAYOUTS \
static Layout layout[] = { \
/* symbol function */ \
@ -46,10 +47,10 @@ static Key key[] = { \
"exec urxvtcd -tr -bg '#111' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_b, togglebar, NULL }, \
{ MODKEY, XK_h, tile, "-0.05" }, \
{ MODKEY, XK_j, focusclient, "1" }, \
{ MODKEY, XK_k, focusclient, "-1" }, \
{ MODKEY, XK_l, tile, "0.05" }, \
{ MODKEY, XK_h, incmaster, "-0.05" }, \
{ MODKEY, XK_l, incmaster, "0.05" }, \
{ MODKEY, XK_m, togglemax, NULL }, \
{ MODKEY, XK_Return, zoom, NULL }, \
{ MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \


+ 4
- 3
config.default.h View File

@ -25,7 +25,8 @@ static Rule rule[] = { \
};
/* layout(s) */
void tile(const char *arg); /* arranges all windows tiled */
#include "tile.h"
#include "float.h"
#define LAYOUTS \
static Layout layout[] = { \
/* symbol function */ \
@ -44,10 +45,10 @@ static Key key[] = { \
{ MODKEY, XK_p, spawn, "exe=`dmenu_path | dmenu` && exec $exe" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_b, togglebar, NULL }, \
{ MODKEY, XK_h, tile, "-0.05" }, \
{ MODKEY, XK_j, focusclient, "1" }, \
{ MODKEY, XK_k, focusclient, "-1" }, \
{ MODKEY, XK_l, tile, "0.05" }, \
{ MODKEY, XK_h, incmaster, "-0.05" }, \
{ MODKEY, XK_l, incmaster, "0.05" }, \
{ MODKEY, XK_m, togglemax, NULL }, \
{ MODKEY, XK_Return, zoom, NULL }, \
{ MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \


+ 3
- 0
config.mk View File

@ -3,6 +3,9 @@ VERSION = 4.4
# Customize below to fit your system
# layouts
SRC = float.c tile.c
# paths
PREFIX = /usr/local
MANPREFIX = ${PREFIX}/share/man


+ 1
- 4
dwm.h View File

@ -76,7 +76,7 @@ typedef struct {
typedef struct {
const char *symbol;
void (*arrange)(const char *);
void (*arrange)(void);
} Layout;
extern const char *tags[]; /* all tags */
@ -120,15 +120,12 @@ unsigned int textw(const char *text); /* return the width of text in px*/
void grabkeys(void); /* grab all keys defined in config.h */
/* layout.c */
void floating(const char *arg); /* arranges all windows floating */
void focusclient(const char *arg); /* focuses next(1)/previous(-1) visible client */
void initlayouts(void); /* initialize layout array */
Client *nexttiled(Client *c); /* returns tiled successor of c */
void restack(void); /* restores z layers of all clients */
void setlayout(const char *arg); /* sets layout, NULL means next layout */
void togglebar(const char *arg); /* shows/hides the bar */
void togglemax(const char *arg); /* toggles maximization of floating client */
void zoom(const char *arg); /* zooms the focused client to master area, arg is ignored */
/* main.c */
void updatebarpos(void); /* updates the bar position */


+ 2
- 2
event.c View File

@ -216,7 +216,7 @@ configurenotify(XEvent *e) {
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
XResizeWindow(dpy, barwin, sw, bh);
updatebarpos();
lt->arrange(NULL);
lt->arrange();
}
}
@ -317,7 +317,7 @@ propertynotify(XEvent *e) {
case XA_WM_TRANSIENT_FOR:
XGetTransientForHint(dpy, c->win, &trans);
if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL)))
lt->arrange(NULL);
lt->arrange();
break;
case XA_WM_NORMAL_HINTS:
updatesizehints(c);


+ 41
- 0
float.c View File

@ -0,0 +1,41 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
/* extern */
void
floating(void) {
Client *c;
if(lt->arrange != floating)
return;
for(c = clients; c; c = c->next)
if(isvisible(c)) {
unban(c);
resize(c, c->x, c->y, c->w, c->h, True);
}
else
ban(c);
focus(NULL);
restack();
}
void
togglemax(const char *arg) {
XEvent ev;
if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed)
return;
if((sel->ismax = !sel->ismax)) {
sel->rx = sel->x;
sel->ry = sel->y;
sel->rw = sel->w;
sel->rh = sel->h;
resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->border, True);
}
else
resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
drawstatus();
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}

+ 5
- 0
float.h View File

@ -0,0 +1,5 @@
/* See LICENSE file for copyright and license details. */
/* float.c */
void floating(void); /* arranges all windows floating */
void togglemax(const char *arg); /* toggles maximization of floating client */

+ 2
- 114
layout.c View File

@ -1,6 +1,5 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
#include <stdio.h>
#include <stdlib.h>
unsigned int blw = 0;
@ -14,24 +13,6 @@ LAYOUTS
/* extern */
void
floating(const char *arg) {
Client *c;
if(lt->arrange != floating)
return;
for(c = clients; c; c = c->next)
if(isvisible(c)) {
unban(c);
resize(c, c->x, c->y, c->w, c->h, True);
}
else
ban(c);
focus(NULL);
restack();
}
void
focusclient(const char *arg) {
Client *c;
@ -120,70 +101,11 @@ setlayout(const char *arg) {
lt = &layout[i];
}
if(sel)
lt->arrange(NULL);
lt->arrange();
else
drawstatus();
}
void
tile(const char *arg) {
static double master = MASTER;
double delta;
unsigned int i, n, nx, ny, nw, nh, mw, th;
Client *c;
if(lt->arrange != tile)
return;
/* arg handling, manipulate master */
if(arg && (1 == sscanf(arg, "%lf", &delta))) {
if(delta + master > 0.1 && delta + master < 0.9)
master += delta;
}
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
n++;
/* window geoms */
mw = (n == 1) ? waw : master * waw;
th = (n > 1) ? wah / (n - 1) : 0;
if(n > 1 && th < bh)
th = wah;
nx = wax;
ny = way;
for(i = 0, c = clients; c; c = c->next)
if(isvisible(c)) {
unban(c);
if(c->isfloating)
continue;
c->ismax = False;
if(i == 0) { /* master */
nw = mw - 2 * c->border;
nh = wah - 2 * c->border;
}
else { /* tile window */
if(i == 1) {
ny = way;
nx += mw;
}
nw = waw - mw - 2 * c->border;
if(i + 1 == n) /* remainder */
nh = (way + wah) - ny - 2 * c->border;
else
nh = th - 2 * c->border;
}
resize(c, nx, ny, nw, nh, False);
if(n > 1 && th != wah)
ny += nh + 2 * c->border;
i++;
}
else
ban(c);
focus(NULL);
restack();
}
void
togglebar(const char *arg) {
if(bpos == BarOff)
@ -191,39 +113,5 @@ togglebar(const char *arg) {
else
bpos = BarOff;
updatebarpos();
lt->arrange(NULL);
}
void
togglemax(const char *arg) {
XEvent ev;
if(!sel || (lt->arrange != floating && !sel->isfloating) || sel->isfixed)
return;
if((sel->ismax = !sel->ismax)) {
sel->rx = sel->x;
sel->ry = sel->y;
sel->rw = sel->w;
sel->rh = sel->h;
resize(sel, wax, way, waw - 2 * sel->border, wah - 2 * sel->border, True);
}
else
resize(sel, sel->rx, sel->ry, sel->rw, sel->rh, True);
drawstatus();
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
void
zoom(const char *arg) {
Client *c;
if(!sel || lt->arrange == floating || sel->isfloating)
return;
if((c = sel) == nexttiled(clients))
if(!(c = nexttiled(c->next)))
return;
detach(c);
attach(c);
focus(c);
lt->arrange(NULL);
lt->arrange();
}

+ 4
- 4
tag.c View File

@ -110,7 +110,7 @@ tag(const char *arg) {
i = arg ? atoi(arg) : 0;
if(i >= 0 && i < ntags)
sel->tags[i] = True;
lt->arrange(NULL);
lt->arrange();
}
void
@ -124,7 +124,7 @@ toggletag(const char *arg) {
for(j = 0; j < ntags && !sel->tags[j]; j++);
if(j == ntags)
sel->tags[i] = True;
lt->arrange(NULL);
lt->arrange();
}
void
@ -136,7 +136,7 @@ toggleview(const char *arg) {
for(j = 0; j < ntags && !seltag[j]; j++);
if(j == ntags)
seltag[i] = True; /* cannot toggle last view */
lt->arrange(NULL);
lt->arrange();
}
void
@ -148,5 +148,5 @@ view(const char *arg) {
i = arg ? atoi(arg) : 0;
if(i >= 0 && i < ntags)
seltag[i] = True;
lt->arrange(NULL);
lt->arrange();
}

+ 88
- 0
tile.c View File

@ -0,0 +1,88 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
#include <stdio.h>
/* static */
static double master = MASTER;
/* extern */
void
incmaster(const char *arg) {
double delta;
if(lt->arrange != tile)
return;
/* arg handling, manipulate master */
if(arg && (1 == sscanf(arg, "%lf", &delta))) {
if(delta + master > 0.1 && delta + master < 0.9)
master += delta;
}
lt->arrange();
}
void
tile(void) {
unsigned int i, n, nx, ny, nw, nh, mw, th;
Client *c;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
n++;
/* window geoms */
mw = (n == 1) ? waw : master * waw;
th = (n > 1) ? wah / (n - 1) : 0;
if(n > 1 && th < bh)
th = wah;
nx = wax;
ny = way;
for(i = 0, c = clients; c; c = c->next)
if(isvisible(c)) {
unban(c);
if(c->isfloating)
continue;
c->ismax = False;
if(i == 0) { /* master */
nw = mw - 2 * c->border;
nh = wah - 2 * c->border;
}
else { /* tile window */
if(i == 1) {
ny = way;
nx += mw;
}
nw = waw - mw - 2 * c->border;
if(i + 1 == n) /* remainder */
nh = (way + wah) - ny - 2 * c->border;
else
nh = th - 2 * c->border;
}
resize(c, nx, ny, nw, nh, False);
if(n > 1 && th != wah)
ny += nh + 2 * c->border;
i++;
}
else
ban(c);
focus(NULL);
restack();
}
void
zoom(const char *arg) {
Client *c;
if(!sel || lt->arrange == floating || sel->isfloating)
return;
if((c = sel) == nexttiled(clients))
if(!(c = nexttiled(c->next)))
return;
detach(c);
attach(c);
focus(c);
lt->arrange();
}

+ 6
- 0
tile.h View File

@ -0,0 +1,6 @@
/* See LICENSE file for copyright and license details. */
/* tile.c */
void incmaster(const char *arg); /* arranges all windows tiled */
void tile(void); /* arranges all windows tiled */
void zoom(const char *arg); /* zooms the focused client to master area, arg is ignored */

Loading…
Cancel
Save