several additions in mouse handling ;)
Anselm R. Garbe garbeam@wmii.de
Sun, 16 Jul 2006 00:47:40 +0200
M
client.c
→
client.c
@@ -192,7 +192,7 @@
void manage(Window w, XWindowAttributes *wa) { - Client *c, **l; + Client *c; XSetWindowAttributes twa; Window trans;@@ -223,10 +223,11 @@
settitle(c); settags(c); - for(l = &clients; *l; l = &(*l)->next); - c->next = *l; /* *l == nil */ - *l = c; + c->next = clients; + clients = c; + XGrabButton(dpy, Button1, ControlMask, c->win, False, ButtonPressMask, + GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask, GrabModeAsync, GrabModeSync, None, None); XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask,@@ -234,8 +235,8 @@ GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask, GrabModeAsync, GrabModeSync, None, None); - if(!c->dofloat) - c->dofloat = trans + if(!c->isfloat) + c->isfloat = trans || ((c->maxw == c->minw) && (c->maxh == c->minh)); arrange(NULL);
M
dwm.1
→
dwm.1
@@ -5,63 +5,44 @@ .SH SYNOPSIS
.B dwm .RB [ \-v ] .SH DESCRIPTION -.SS Overview .B dwm -is a dynamic window manager for X11. It consists of a small status bar at the -top of the screen and arranges windows in either a tiled or floating mode. +is a dynamic window manager for X11. It consists of a small status bar and +arranges windows in either a tiled or floating mode. .P -If -.B dwm -is in tiled mode, it consists of two columns. The left master column -contains only one window per time, the right column contains all other windows -in a stack. In tiled mode +In tiled mode .B dwm -.B don't -handles incremental resizals, some terminal programs like -.B xterm -may not work correctly with this in tiled mode. +manages all windows in a left master column and a right stacking column. The +master column contains a single window, the left stacking column all other +windows. Dialog windows are treated floating. .P -If -.B dwm -is in floating mode, it arranges all windows with the reqyested geometry and -allows the user to move or resize them. Some windows, like -dialog windows, are treated floating even if -.B dwm -is in tiled mode. In floating mode +In floating mode .B dwm -handles incremental resizals. +manages all windows in a conventional way. They can be resized and moved freely +with the mouse. .P Windows are grouped by tags. You can view all windows with a specific tag per time. However, each window is allowed to contain more than one tag, which allows to make windows visible in all views. .P .B dwm -reads from -.I stdin -to display status text, if written. +reads from standard input to display status text, if written. .P .B dwm -draws 1-pixel borders around windows to indicate the focus state and save as +draws 1-pixel borders around windows to indicate the focus state and providing as much screen real estate as possible. Unfocused windows contain a small bar in front of the window indicating the tags and the window title. -.SS Options +.SH OPTIONS .TP .B \-v -prints version information to -.I stdout -, then exits. -.SS Customization +prints version information to standard output, then exits. +.SH CUSTOMIZATION .B dwm is customized through editing its source code. It is assumed that -dwm users are high experienced users who know how a window manager works -and who are able to patch .B dwm -for their needs. This keeps -.B dwm -fast, secure and simple, because it does not process any input data, except -window properties and the status text read from -.I stdin . -.SS Default Key Bindings +users know to patch it for their needs. This keeps it fast, secure and simple, +because it does not process any input data, except window properties and +the status text read from standard input. +.SS Keyboard Control .TP 16 .I Key .I Action@@ -71,7 +52,7 @@ Zoom
.B window to the .B master -track +column .TP .B Mod1-k Focus previous@@ -127,7 +108,7 @@ Append
.B nth tag to cureent .B window -.SS Default Mouse Bindings +.SS Mouse Control .TP .B Mod1-Button1 Moves current@@ -142,7 +123,3 @@ .B Mod1-Button3
Resizes current .B window while dragging -.SH BUGS -Some terminal programs do not behave correctly in tiled mode, because -incremental resizals are ignored to use maximum screen real estate. You can -patch the code to fix this.
M
dwm.h
→
dwm.h
@@ -71,7 +71,7 @@ int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int grav; unsigned int border; long flags; - Bool dofloat; + Bool isfloat; Window win; Window title; Client *next;@@ -82,7 +82,7 @@ struct Rule {
const char *class; const char *instance; char *tags[TLast]; - Bool dofloat; + Bool isfloat; }; struct Key {
M
event.c
→
event.c
@@ -14,8 +14,8 @@
/********** CUSTOMIZE **********/ const char *term[] = { - "urxvtc", "-tr", "+sb", "-bg", "black", "-fg", "white", "-fn", - "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*",NULL + "urxvtc", "-tr", "+sb", "-bg", "black", "-fg", "white", "-cr", "white", + "-fn", "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", NULL }; const char *browse[] = { "firefox", NULL }; const char *xlock[] = { "xlock", NULL };@@ -128,18 +128,34 @@ XButtonPressedEvent *ev = &e->xbutton;
Client *c; if(barwin == ev->window) { - x = 0; - for(a.i = 0; a.i < TLast; a.i++) { - x += textw(tags[a.i]); - if(ev->x < x) { - view(&a); - break; + switch(ev->button) { + default: + x = 0; + for(a.i = 0; a.i < TLast; a.i++) { + x += textw(tags[a.i]); + if(ev->x < x) { + view(&a); + break; + } } + break; + case Button4: + a.i = (tsel + 1 < TLast) ? tsel + 1 : 0; + view(&a); + break; + case Button5: + a.i = (tsel - 1 >= 0) ? tsel - 1 : TLast - 1; + view(&a); + break; } } else if((c = getclient(ev->window))) { - if(arrange == dotile && !c->dofloat) + if(arrange == dotile && !c->isfloat) { + if((ev->state & ControlMask) && (ev->button == Button1)) + zoom(NULL); return; + } + /* floating windows */ higher(c); switch(ev->button) { default:@@ -297,7 +313,7 @@ switch (ev->atom) {
default: break; case XA_WM_TRANSIENT_FOR: XGetTransientForHint(dpy, c->win, &trans); - if(!c->dofloat && (c->dofloat = (trans != 0))) + if(!c->isfloat && (c->isfloat = (trans != 0))) arrange(NULL); break; case XA_WM_NORMAL_HINTS:
M
tag.c
→
tag.c
@@ -17,7 +17,7 @@ [Twork] = "work",
}; static Rule rule[] = { - /* class instance tags dofloat */ + /* class instance tags isfloat */ { "Firefox-bin", "Gecko", { [Twww] = "www" }, False }, };@@ -67,7 +67,7 @@
w = sw - mw; arrange = dotile; for(n = 0, c = clients; c; c = c->next) - if(c->tags[tsel] && !c->dofloat) + if(c->tags[tsel] && !c->isfloat) n++; if(n > 1)@@ -77,7 +77,7 @@ h = sh - bh;
for(i = 0, c = clients; c; c = c->next) { if(c->tags[tsel]) { - if(c->dofloat) { + if(c->isfloat) { higher(c); resize(c, True); continue;@@ -155,7 +155,7 @@ && !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance)))
{ for(j = 0; j < TLast; j++) c->tags[j] = rule[i].tags[j]; - c->dofloat = rule[i].dofloat; + c->isfloat = rule[i].isfloat; matched = True; break; }