author | Anselm R. Garbe <garbeam@gmail.com> |
Sat, 11 Aug 2007 12:11:50 +0200 | |
changeset 941 | 8c93b982f22e |
parent 940 | 8241aba895d8 |
child 944 | bd5cf635c601 |
permissions | -rw-r--r-- |
910
c13cb8c6b7a5
referred to LICENSE file
Anselm R. Garbe <arg@suckless.org>
parents:
909
diff
changeset
|
1 |
/* See LICENSE file for copyright and license details. */ |
76
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
2 |
#include "dwm.h" |
825
bef1854ce739
fixed some issues due to the Arg->const char * transition
Anselm R. Garbe <arg@suckless.org>
parents:
823
diff
changeset
|
3 |
#include <stdlib.h> |
75 | 4 |
|
782
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
5 |
unsigned int blw = 0; |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
6 |
Layout *lt = NULL; |
773
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
7 |
|
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
8 |
/* static */ |
76
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
9 |
|
782
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
10 |
static unsigned int nlayouts = 0; |
773
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
11 |
|
784
74722317b171
renamed floating into swimming (this does not clash with C naming conventions and fits better the fish symbol) - also in man page
Anselm R. Garbe <arg@suckless.org>
parents:
782
diff
changeset
|
12 |
LAYOUTS |
74722317b171
renamed floating into swimming (this does not clash with C naming conventions and fits better the fish symbol) - also in man page
Anselm R. Garbe <arg@suckless.org>
parents:
782
diff
changeset
|
13 |
|
74722317b171
renamed floating into swimming (this does not clash with C naming conventions and fits better the fish symbol) - also in man page
Anselm R. Garbe <arg@suckless.org>
parents:
782
diff
changeset
|
14 |
/* extern */ |
74722317b171
renamed floating into swimming (this does not clash with C naming conventions and fits better the fish symbol) - also in man page
Anselm R. Garbe <arg@suckless.org>
parents:
782
diff
changeset
|
15 |
|
74722317b171
renamed floating into swimming (this does not clash with C naming conventions and fits better the fish symbol) - also in man page
Anselm R. Garbe <arg@suckless.org>
parents:
782
diff
changeset
|
16 |
void |
829
f1ec35606dbc
merged focus{prev.next} into focusclient(1/-1)
Anselm R. Garbe <arg@suckless.org>
parents:
826
diff
changeset
|
17 |
focusclient(const char *arg) { |
799
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
18 |
Client *c; |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
19 |
|
829
f1ec35606dbc
merged focus{prev.next} into focusclient(1/-1)
Anselm R. Garbe <arg@suckless.org>
parents:
826
diff
changeset
|
20 |
if(!sel || !arg) |
f1ec35606dbc
merged focus{prev.next} into focusclient(1/-1)
Anselm R. Garbe <arg@suckless.org>
parents:
826
diff
changeset
|
21 |
return; |
831
8b84189854dc
simplified focusclient()
Anselm R. Garbe <arg@suckless.org>
parents:
830
diff
changeset
|
22 |
if(atoi(arg) < 0) { |
829
f1ec35606dbc
merged focus{prev.next} into focusclient(1/-1)
Anselm R. Garbe <arg@suckless.org>
parents:
826
diff
changeset
|
23 |
for(c = sel->prev; c && !isvisible(c); c = c->prev); |
f1ec35606dbc
merged focus{prev.next} into focusclient(1/-1)
Anselm R. Garbe <arg@suckless.org>
parents:
826
diff
changeset
|
24 |
if(!c) { |
f1ec35606dbc
merged focus{prev.next} into focusclient(1/-1)
Anselm R. Garbe <arg@suckless.org>
parents:
826
diff
changeset
|
25 |
for(c = clients; c && c->next; c = c->next); |
f1ec35606dbc
merged focus{prev.next} into focusclient(1/-1)
Anselm R. Garbe <arg@suckless.org>
parents:
826
diff
changeset
|
26 |
for(; c && !isvisible(c); c = c->prev); |
f1ec35606dbc
merged focus{prev.next} into focusclient(1/-1)
Anselm R. Garbe <arg@suckless.org>
parents:
826
diff
changeset
|
27 |
} |
831
8b84189854dc
simplified focusclient()
Anselm R. Garbe <arg@suckless.org>
parents:
830
diff
changeset
|
28 |
} |
8b84189854dc
simplified focusclient()
Anselm R. Garbe <arg@suckless.org>
parents:
830
diff
changeset
|
29 |
else { |
8b84189854dc
simplified focusclient()
Anselm R. Garbe <arg@suckless.org>
parents:
830
diff
changeset
|
30 |
for(c = sel->next; c && !isvisible(c); c = c->next); |
8b84189854dc
simplified focusclient()
Anselm R. Garbe <arg@suckless.org>
parents:
830
diff
changeset
|
31 |
if(!c) |
8b84189854dc
simplified focusclient()
Anselm R. Garbe <arg@suckless.org>
parents:
830
diff
changeset
|
32 |
for(c = clients; c && !isvisible(c); c = c->next); |
799
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
33 |
} |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
34 |
if(c) { |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
35 |
focus(c); |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
36 |
restack(); |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
37 |
} |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
38 |
} |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
39 |
|
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
40 |
void |
782
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
41 |
initlayouts(void) { |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
42 |
unsigned int i, w; |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
43 |
|
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
44 |
lt = &layout[0]; |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
45 |
nlayouts = sizeof layout / sizeof layout[0]; |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
46 |
for(blw = i = 0; i < nlayouts; i++) { |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
47 |
w = textw(layout[i].symbol); |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
48 |
if(w > blw) |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
49 |
blw = w; |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
50 |
} |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
51 |
} |
92862ab407d5
introduced Layout struct
Anselm R. Garbe <arg@suckless.org>
parents:
780
diff
changeset
|
52 |
|
799
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
53 |
Client * |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
54 |
nexttiled(Client *c) { |
837
123231b9eb87
renamed untiled into floating, keeping tiled instead of tiling (afaik tiled sounds more correct) - English speakers convinced me
Anselm R. Garbe <arg@suckless.org>
parents:
831
diff
changeset
|
55 |
for(; c && (c->isfloating || !isvisible(c)); c = c->next); |
799
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
56 |
return c; |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
57 |
} |
30ec8b96a7f6
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)
Anselm R. Garbe <arg@suckless.org>
parents:
790
diff
changeset
|
58 |
|
773
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
59 |
void |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
60 |
restack(void) { |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
61 |
Client *c; |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
62 |
XEvent ev; |
918
7c556b28f1f6
applied restack patch of anydot, with slight changes
Anselm R. Garbe <arg@suckless.org>
parents:
915
diff
changeset
|
63 |
XWindowChanges wc; |
773
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
64 |
|
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
65 |
drawstatus(); |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
66 |
if(!sel) |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
67 |
return; |
837
123231b9eb87
renamed untiled into floating, keeping tiled instead of tiling (afaik tiled sounds more correct) - English speakers convinced me
Anselm R. Garbe <arg@suckless.org>
parents:
831
diff
changeset
|
68 |
if(sel->isfloating || lt->arrange == floating) |
773
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
69 |
XRaiseWindow(dpy, sel->win); |
837
123231b9eb87
renamed untiled into floating, keeping tiled instead of tiling (afaik tiled sounds more correct) - English speakers convinced me
Anselm R. Garbe <arg@suckless.org>
parents:
831
diff
changeset
|
70 |
if(lt->arrange != floating) { |
918
7c556b28f1f6
applied restack patch of anydot, with slight changes
Anselm R. Garbe <arg@suckless.org>
parents:
915
diff
changeset
|
71 |
wc.stack_mode = Below; |
7c556b28f1f6
applied restack patch of anydot, with slight changes
Anselm R. Garbe <arg@suckless.org>
parents:
915
diff
changeset
|
72 |
wc.sibling = barwin; |
7c556b28f1f6
applied restack patch of anydot, with slight changes
Anselm R. Garbe <arg@suckless.org>
parents:
915
diff
changeset
|
73 |
if(!sel->isfloating) { |
7c556b28f1f6
applied restack patch of anydot, with slight changes
Anselm R. Garbe <arg@suckless.org>
parents:
915
diff
changeset
|
74 |
XConfigureWindow(dpy, sel->win, CWSibling | CWStackMode, &wc); |
7c556b28f1f6
applied restack patch of anydot, with slight changes
Anselm R. Garbe <arg@suckless.org>
parents:
915
diff
changeset
|
75 |
wc.sibling = sel->win; |
7c556b28f1f6
applied restack patch of anydot, with slight changes
Anselm R. Garbe <arg@suckless.org>
parents:
915
diff
changeset
|
76 |
} |
776
be103ae46dbc
renamed view.c into screen.c
Anselm R. Garbe <arg@suckless.org>
parents:
775
diff
changeset
|
77 |
for(c = nexttiled(clients); c; c = nexttiled(c->next)) { |
773
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
78 |
if(c == sel) |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
79 |
continue; |
918
7c556b28f1f6
applied restack patch of anydot, with slight changes
Anselm R. Garbe <arg@suckless.org>
parents:
915
diff
changeset
|
80 |
XConfigureWindow(dpy, c->win, CWSibling | CWStackMode, &wc); |
7c556b28f1f6
applied restack patch of anydot, with slight changes
Anselm R. Garbe <arg@suckless.org>
parents:
915
diff
changeset
|
81 |
wc.sibling = c->win; |
773
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
82 |
} |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
83 |
} |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
84 |
XSync(dpy, False); |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
85 |
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
86 |
} |
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
87 |
|
81c5237a53b8
merged tag.c, view.c and tile.c to manage.c
Anselm R. Garbe <arg@suckless.org>
parents:
769
diff
changeset
|
88 |
void |
823
fb5cbf0bd923
replaced Arg union with const char *arg, seems cleaner to me, even if we need atoi() in some places
Anselm R. Garbe <arg@suckless.org>
parents:
819
diff
changeset
|
89 |
setlayout(const char *arg) { |
826 | 90 |
int i; |
788
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
91 |
|
823
fb5cbf0bd923
replaced Arg union with const char *arg, seems cleaner to me, even if we need atoi() in some places
Anselm R. Garbe <arg@suckless.org>
parents:
819
diff
changeset
|
92 |
if(!arg) { |
891
b940ac76c22f
applied Szabolcs proposal to simplify setlayout()
Anselm R. Garbe <arg@suckless.org>
parents:
889
diff
changeset
|
93 |
lt++; |
b940ac76c22f
applied Szabolcs proposal to simplify setlayout()
Anselm R. Garbe <arg@suckless.org>
parents:
889
diff
changeset
|
94 |
if(lt == layout + nlayouts) |
b940ac76c22f
applied Szabolcs proposal to simplify setlayout()
Anselm R. Garbe <arg@suckless.org>
parents:
889
diff
changeset
|
95 |
lt = layout; |
788
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
96 |
} |
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
97 |
else { |
823
fb5cbf0bd923
replaced Arg union with const char *arg, seems cleaner to me, even if we need atoi() in some places
Anselm R. Garbe <arg@suckless.org>
parents:
819
diff
changeset
|
98 |
i = atoi(arg); |
fb5cbf0bd923
replaced Arg union with const char *arg, seems cleaner to me, even if we need atoi() in some places
Anselm R. Garbe <arg@suckless.org>
parents:
819
diff
changeset
|
99 |
if(i < 0 || i >= nlayouts) |
788
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
100 |
return; |
823
fb5cbf0bd923
replaced Arg union with const char *arg, seems cleaner to me, even if we need atoi() in some places
Anselm R. Garbe <arg@suckless.org>
parents:
819
diff
changeset
|
101 |
lt = &layout[i]; |
788
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
102 |
} |
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
103 |
if(sel) |
941
8c93b982f22e
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
Anselm R. Garbe <garbeam@gmail.com>
parents:
940
diff
changeset
|
104 |
lt->arrange(); |
788
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
105 |
else |
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
106 |
drawstatus(); |
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
107 |
} |
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
108 |
|
a61fcdf7b4c1
replaced togglelayout with setlayout
Anselm R. Garbe <arg@suckless.org>
parents:
786
diff
changeset
|
109 |
void |
878 | 110 |
togglebar(const char *arg) { |
887 | 111 |
if(bpos == BarOff) |
112 |
bpos = (BARPOS == BarOff) ? BarTop : BARPOS; |
|
883
2cbf1010be11
using BarTop as fallback if BARPOS is set to BarOff as default for toggling
Anselm R. Garbe <arg@suckless.org>
parents:
880
diff
changeset
|
113 |
else |
2cbf1010be11
using BarTop as fallback if BARPOS is set to BarOff as default for toggling
Anselm R. Garbe <arg@suckless.org>
parents:
880
diff
changeset
|
114 |
bpos = BarOff; |
878 | 115 |
updatebarpos(); |
941
8c93b982f22e
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
Anselm R. Garbe <garbeam@gmail.com>
parents:
940
diff
changeset
|
116 |
lt->arrange(); |
878 | 117 |
} |