about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorarg@10ksloc.org <unknown>2006-07-20 15:07:35 +0200
committerarg@10ksloc.org <unknown>2006-07-20 15:07:35 +0200
commit4688ad181da14be36e034918580ec0ce5968ffdb (patch)
treee919b8e6e89400a8b5dac01fa611090f139d5b5f
parentdc5d967ee61046f899b3b49daeb9268c8161844a (diff)
downloaddwm-4688ad181da14be36e034918580ec0ce5968ffdb.tar.gz
made status bar drawing more robust, implemented togglemax and togglemode, works quite well
-rw-r--r--client.c53
-rw-r--r--draw.c13
-rw-r--r--dwm.h4
-rw-r--r--event.c11
-rw-r--r--tag.c11
5 files changed, 59 insertions, 33 deletions
diff --git a/client.c b/client.c
index 889daa5..1bdebd2 100644
--- a/client.c
+++ b/client.c
@@ -70,6 +70,9 @@ focusnext(Arg *arg)
 	if(!sel)
 		return;
 
+	if(sel->ismax)
+		togglemax(NULL);
+
 	if(!(c = getnext(sel->next, tsel)))
 		c = getnext(clients, tsel);
 	if(c) {
@@ -87,6 +90,9 @@ focusprev(Arg *arg)
 	if(!sel)
 		return;
 
+	if(sel->ismax)
+		togglemax(NULL);
+
 	if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) {
 		higher(c);
 		focus(c);
@@ -234,8 +240,6 @@ manage(Window w, XWindowAttributes *wa)
 	c->next = clients;
 	clients = c;
 
-	XGrabButton(dpy, Button1, ControlMask, c->win, False, ButtonPressMask,
-			GrabModeAsync, GrabModeSync, None, None);
 	XGrabButton(dpy, Button1, MODKEY, c->win, False, ButtonPressMask,
 			GrabModeAsync, GrabModeSync, None, None);
 	XGrabButton(dpy, Button2, MODKEY, c->win, False, ButtonPressMask,
@@ -264,19 +268,6 @@ manage(Window w, XWindowAttributes *wa)
 }
 
 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, TopLeft);
-}
-
-void
 pop(Client *c)
 {
 	Client **l;
@@ -405,6 +396,38 @@ settitle(Client *c)
 }
 
 void
+togglemax(Arg *arg)
+{
+	int ox, oy, ow, oh;
+	XEvent ev;
+
+	if(!sel)
+		return;
+
+	if((sel->ismax = !sel->ismax)) {
+		ox = sel->x;
+		oy = sel->y;
+		ow = sel->w;
+		oh = sel->h;
+		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, TopLeft);
+
+		sel->x = ox;
+		sel->y = oy;
+		sel->w = ow;
+		sel->h = oh;
+	}
+	else
+		resize(sel, False, TopLeft);
+	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
+}
+
+void
 unmanage(Client *c)
 {
 	Client **l;
diff --git a/draw.c b/draw.c
index b5d8bd2..0c920e5 100644
--- a/draw.c
+++ b/draw.c
@@ -107,7 +107,7 @@ drawall()
 void
 drawstatus()
 {
-	int i;
+	int i, x;
 	Bool istile = arrange == dotile;
 
 	dc.x = dc.y = 0;
@@ -123,15 +123,14 @@ drawstatus()
 		else
 			drawtext(tags[i], (i != tsel), True);
 	}
-	if(sel) {
-		dc.x += dc.w;
-		dc.w = textw(sel->name);
-		drawtext(sel->name, istile, True);
-	}
+	x = dc.x + dc.w;
 	dc.w = textw(stext);
 	dc.x = bx + bw - dc.w;
 	drawtext(stext, !istile, False);
-
+	if(sel && ((dc.w = dc.x - x) >= bh)) {
+		dc.x = x;
+		drawtext(sel->name, istile, True);
+	}
 	XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
 	XSync(dpy, False);
 }
diff --git a/dwm.h b/dwm.h
index a410f4e..1529d17 100644
--- a/dwm.h
+++ b/dwm.h
@@ -74,6 +74,7 @@ struct Client {
 	unsigned int border;
 	long flags; 
 	Bool isfloat;
+	Bool ismax;
 	Client *next;
 	Client *revert;
 	Window win;
@@ -104,11 +105,11 @@ extern void higher(Client *c);
 extern void killclient(Arg *arg);
 extern void lower(Client *c);
 extern void manage(Window w, XWindowAttributes *wa);
-extern void maximize(Arg *arg);
 extern void pop(Client *c);
 extern void resize(Client *c, Bool inc, Corner sticky);
 extern void setsize(Client *c);
 extern void settitle(Client *c);
+extern void togglemax(Arg *arg);
 extern void unmanage(Client *c);
 extern void zoom(Arg *arg);
 
@@ -137,6 +138,7 @@ extern Client *getnext(Client *c, unsigned int t);
 extern void heretag(Arg *arg);
 extern void replacetag(Arg *arg);
 extern void settags(Client *c);
+extern void togglemode(Arg *arg);
 extern void view(Arg *arg);
 
 /* util.c */
diff --git a/event.c b/event.c
index 2736903..5d7c8a7 100644
--- a/event.c
+++ b/event.c
@@ -40,8 +40,8 @@ static Key key[] = {
 	{ MODKEY,		XK_3,		view,		{ .i = Twork } }, 
 	{ MODKEY,		XK_j,		focusnext,	{ 0 } }, 
 	{ MODKEY,		XK_k,		focusprev,	{ 0 } },
-	{ MODKEY,		XK_m,		maximize,	{ 0 } }, 
-	{ MODKEY,		XK_space,	dotile,		{ 0 } }, 
+	{ MODKEY,		XK_m,		togglemax,	{ 0 } }, 
+	{ MODKEY,		XK_space,	togglemode,	{ 0 } }, 
 	{ MODKEY,		XK_Return,	zoom,		{ 0 } },
 	{ ControlMask|ShiftMask,XK_0,		heretag,	{ .i = Tscratch } }, 
 	{ ControlMask|ShiftMask,XK_1,		heretag,	{ .i = Tdev } }, 
@@ -55,7 +55,6 @@ static Key key[] = {
 	{ MODKEY|ShiftMask,	XK_g,		spawn,		{ .argv = gimp } },
 	{ MODKEY|ShiftMask,	XK_l,		spawn,		{ .argv = xlock } },
 	{ MODKEY|ShiftMask,	XK_q,		quit,		{ 0 } },
-	{ MODKEY|ShiftMask,	XK_space,	dofloat,	{ 0 } }, 
 	{ MODKEY|ShiftMask,	XK_w,		spawn,		{ .argv = browse } },
 	{ MODKEY|ShiftMask,	XK_Return,	spawn,		{ .argv = term } },
 };
@@ -170,11 +169,7 @@ buttonpress(XEvent *e)
 		default:
 			break;
 		case Button1:
-			if(arrange == dotile && !c->isfloat) {
-				if((ev->state & ControlMask) && (ev->button == Button1))
-					zoom(NULL);
-			}
-			else {
+			if(arrange == dofloat || c->isfloat) {
 				higher(c);
 				movemouse(c);
 			}
diff --git a/tag.c b/tag.c
index 186a5ae..d6c349b 100644
--- a/tag.c
+++ b/tag.c
@@ -51,8 +51,8 @@ dofloat(Arg *arg)
 {
 	Client *c;
 
-	arrange = dofloat;
 	for(c = clients; c; c = c->next) {
+		c->ismax = False;
 		if(c->tags[tsel]) {
 			resize(c, True, TopLeft);
 		}
@@ -75,7 +75,6 @@ dotile(Arg *arg)
 	Client *c;
 
 	w = sw - mw;
-	arrange = dotile;
 	for(n = 0, c = clients; c; c = c->next)
 		if(c->tags[tsel] && !c->isfloat)
 			n++;
@@ -86,6 +85,7 @@ dotile(Arg *arg)
 		h = sh - bh;
 
 	for(i = 0, c = clients; c; c = c->next) {
+		c->ismax = False;
 		if(c->tags[tsel]) {
 			if(c->isfloat) {
 				higher(c);
@@ -213,6 +213,13 @@ settags(Client *c)
 }
 
 void
+togglemode(Arg *arg)
+{
+	arrange = arrange == dofloat ? dotile : dofloat;
+	arrange(NULL);
+}
+
+void
 view(Arg *arg)
 {
 	tsel = arg->i;
hlt&id=8c9ffa039f2f623cf61f263d487c1f4a919bea65'>^
51530916 ^


4ea9905f ^


36f616b5 ^
455f0338 ^
385ff136 ^
455f0338 ^



6573fe1f ^
ec99eb7a ^
51530916 ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136