Compare commits

...

607 Commits
4.2 ... 5.8.1

Author SHA1 Message Date
5c6545adf5 removing Sylvain's patch because it breaks more than it fixes unfortunately, re-issuing a bugfix release 5.8.1 2010-05-29 12:48:11 +01:00
a704b1ee34 Added tag 5.8 for changeset 60ea8fed13ab 2010-05-28 11:43:44 +01:00
f83d61dfe8 removed DEBUG code and added 2010 to the copyright list 2010-05-27 08:20:42 +01:00
c6180949a7 applied Sylvain Laurent's EWMH fullscreen state patch, simplified his patch a bit 2010-05-27 08:19:08 +01:00
1973ab0643 added the related bug reported by voltaic 2010-04-11 18:42:32 +01:00
427053f8d1 pretty printing bugs a bit 2010-04-01 22:34:46 +01:00
a88e0373ef selmon optimisation is needed 2010-04-01 19:39:24 +01:00
aa9f2be24e more debug output, experimental focus optimisation 2010-04-01 00:14:15 +01:00
c53b29e60b quick typo fix 2010-03-31 23:27:30 +01:00
d6bdd03d91 it's debug season for upcoming dwm 5.8, so only use this if you really want to run experimental code or debug code 2010-03-31 23:24:22 +01:00
1144e98394 another bug report 2009-11-25 13:56:17 +00:00
7671d03a90 removed misleading comment, thanks Romain Bertrand 2009-11-24 09:31:17 +00:00
bc554d45d8 added nsz's last bug corner case 2009-11-23 08:13:18 +00:00
ac4caea921 added BUGS, next version is 5.8 2009-10-31 11:45:56 +00:00
161f2d921b Added tag 5.7.2 for changeset 15761ac5e2f1 2009-09-27 20:20:14 +01:00
210378f198 applied Ryan Zheng's patch and re-releasing 5.7.2 2009-09-27 20:20:10 +01:00
7879616a75 Added tag 5.7.1 for changeset 48c3f87c335d 2009-09-27 10:31:20 +01:00
9e8dd3479d fixed the layout symbol bug reported by Nibble (but using a different approach as he suggested)
- optimised drawbar() and arrange() handling for multiple monitors, arrange only arranges the relevant monitors when applicable, same with drawbar
- need to release 5.7.1
2009-09-27 10:31:14 +01:00
0b72be924d Added tag 5.7 for changeset 257403d4cd96 2009-09-26 19:52:04 +01:00
91e902f7fe switching to release flags 2009-09-22 20:34:03 +01:00
30fed9a211 implemented nn < n case, k-zed please recheck 2009-09-22 20:33:42 +01:00
c45d46ad9a use buffer instead of pointer for mon->ltsymbol 2009-09-22 09:53:11 +01:00
6f55de8310 added missing scan 2009-09-22 09:16:48 +01:00
07ad298133 implemented different version of updategeom 2009-09-21 19:51:17 +01:00
f0a4845e7d added TODO to updategeom in order to implement a decent version of it soon 2009-09-19 11:52:16 +01:00
82ec7a7ed4 new experimental updategeom() additions that should avoid several problems with Xinerama, this is EXPERIMENTAL and might break something, the algorithms in use are quite complex and cumbersome, patches and comments welcome 2009-09-18 21:18:00 +01:00
e7300e0f6f implemented dynamic layout symbol stuff 2009-09-16 15:59:54 +01:00
c3feffa1e2 applied Tony Lainson's config.def.h patch 2009-09-15 13:50:41 +01:00
956a430054 update 2009-09-08 13:33:58 +01:00
01056b6636 hard-core destruction 2009-09-08 13:30:18 +01:00
eb260b1a41 renaming isdestroyed into destroyed 2009-09-08 13:18:05 +01:00
7fe81359d4 sync when a client is being killed 2009-09-08 13:16:54 +01:00
a3a859b4e9 added isdestroyed flag to unmanage 2009-09-08 13:13:03 +01:00
9c066c24b3 always updategeom when root is configured 2009-09-07 11:46:02 +02:00
0a668922a4 another small optimisation 2009-08-18 15:59:38 +01:00
5762964232 also update title if the client is on an unfocused monitor 2009-08-18 15:42:55 +01:00
cba6b211c2 applied nsz's dwm.1 patch, also added wmname 2009-08-16 21:39:24 +01:00
42750a621b applied Jukka's cosmetic patch 2009-08-16 08:18:54 +01:00
8ef465d592 applied Jukka's sigchld patch 2009-08-16 08:18:25 +01:00
33fe200b52 added merged patch of anydot and Neale 2009-08-13 10:45:59 +01:00
91fffb3f7d fixed nn declaration 2009-07-27 12:01:58 +01:00
1fa31efebf Added tag 5.6.1 for changeset e47a47bd3ed4 2009-07-26 14:02:28 +01:00
244addb3f4 applied nsz patch 2009-07-21 10:57:54 +01:00
c13be8d620 updategeom fix for same geom screens 2009-07-21 08:57:04 +01:00
dc39ae8568 applied nsz' man page comment, thanks! 2009-07-20 17:08:34 +01:00
966d76a428 merge 2009-07-20 16:40:32 +01:00
7151bf8329 removed Standard input hint 2009-07-20 16:39:42 +01:00
dfecd46190 merge 2009-07-18 11:28:31 +01:00
5bc4db0f76 applied nsz' dwm.1 fixes, thanks Szabolcs! 2009-07-18 11:28:03 +01:00
999d6e795f removed misleading comment 2009-07-17 15:28:07 +01:00
636075297c merge 2009-07-17 13:35:44 +01:00
6877a00033 it's all nsz's hard investigation effort, hail nsz! ;) 2009-07-17 13:35:17 +01:00
0927d635bc Added tag 5.6 for changeset 555070221577 2009-07-14 19:07:53 +01:00
450b08dde2 final style fixes 2009-07-14 16:26:04 +01:00
da80487c07 removed int cast in TAGMASK as suggested by nsz 2009-07-14 16:04:07 +01:00
d9779c06fc some stylistic changes 2009-07-14 16:01:14 +01:00
20996c6c5a removed obsolete BUG 2009-07-13 12:51:00 +01:00
8dc9fcf1b9 mark broken clients as broken 2009-07-12 22:49:06 +01:00
fc21dd4b7e fixing updatetitle 2009-07-12 22:34:29 +01:00
758b100d12 extended rule to apply monitors if set up accordingly 2009-07-09 21:52:17 +01:00
8420fb1ced reverting to optimised compiler options, current state seems stable 2009-07-09 20:49:48 +01:00
f6128a16f9 extended man page to mention number of visible windows 2009-07-09 20:11:33 +01:00
87526be6f0 added client number printing right of layout symbol 2009-07-09 19:58:58 +01:00
565050ac51 removed monsyms, useless 2009-07-09 11:29:01 +01:00
5e408d8ff6 restricting number of mons by length of monsyms 2009-07-09 11:21:06 +01:00
1724f7fa43 introducing const where it might make some sense 2009-07-08 18:59:20 +01:00
3e6fe6b541 no that's definately better 2009-07-08 17:24:39 +01:00
6620615ab9 some minor changes 2009-07-08 17:05:20 +01:00
61c3095f2f die if malloc sizeof(Monitor) fails 2009-07-08 16:05:36 +01:00
a72dc2fec2 applied Mate's patch, added Mate to LICENSE 2009-07-06 20:12:47 +01:00
8b17f5517b some cleanups 2009-07-02 20:56:23 +01:00
cd96232f7e hotfix 2009-07-02 20:38:56 +01:00
a9e145fe6d changed focusmon/tagmon to work on prev/next instead (-1/+1), changed shortcuts to Mod1-, Mod1-. and Mod1-Shift-, Mod1-Shift-. 2009-07-02 20:37:26 +01:00
5dd92c7655 removed some empty lines 2009-07-02 18:40:04 +01:00
52bd69c2a4 interactive resizals allow display dimensions again 2009-07-02 18:30:01 +01:00
ca376970db more sensible 2009-07-02 16:48:54 +01:00
8352f2b3a8 hmm, can't decide on the default monitor symbol set 2009-07-02 16:47:00 +01:00
d4bfde79f3 update 2009-07-02 16:44:57 +01:00
7ac8c1d4e1 introduced monitor symbols 2009-07-02 16:41:52 +01:00
16e1ef5d40 minor fix 2009-07-02 14:42:06 +01:00
1d729384d1 several bugfixes 2009-07-01 19:15:20 +01:00
25c1eb28f9 some minor fix if xinerama is disabled, still some odd behavior in there 2009-07-01 17:08:10 +01:00
d719cc9a0e updated year ranges 2009-06-30 20:20:33 +01:00
9cde6570cc fixed usage of sx, sy, sw, sh 2009-06-30 20:15:31 +01:00
e408ca97d8 don't draw monitor number, if there is just one monitor 2009-06-30 20:00:11 +01:00
183dc670a3 fixed order of transient monitor applicaion and rule application 2009-06-30 19:56:19 +01:00
25947bcfdb hotfix 2009-06-30 19:45:25 +01:00
1ddfc571ae several simplifications 2009-06-30 19:39:59 +01:00
21cd59a630 play safe 2009-06-30 15:56:32 +01:00
6cbe47d481 applied a collection of Christof Musik patches, and fixed an issue reported by waistcoats on IRC 2009-06-30 15:51:09 +01:00
029655bb22 some cleanup handling for index based mon search 2009-06-27 18:50:50 +01:00
27db9d4448 using mon in function names for consistency reasons 2009-06-27 18:42:10 +01:00
176408afa8 fixed several issues with focus handling via mouse, also added sending clients to the right monitor they belong to after mouse moves/resizals 2009-06-27 18:39:03 +01:00
64674c395b fixed focusmon brokeness 2009-06-27 17:38:18 +01:00
b9dee2c6f1 tag fix 2009-06-26 16:41:27 +01:00
a73ff905b0 typo fix 2009-06-25 11:17:42 +01:00
e3f0445df1 assign selected tags of target monitor to client when tagmon is performed (less obtrusive imho) 2009-06-25 11:10:19 +01:00
ab06f7444b added some TODOs, some other focus fixes 2009-06-24 20:04:18 +01:00
a2a3590979 disabled XINULATOR code for now 2009-06-24 19:52:09 +01:00
e8aafb8e91 made bar based monitor switching working 2009-06-24 19:51:41 +01:00
18b1312449 several other focus fixes, introduced unfocus() 2009-06-24 19:45:47 +01:00
80ee95473b some focus fixes 2009-06-24 15:37:32 +01:00
454a04acdf fixed title rendering on non-active screen 2009-06-24 13:51:45 +01:00
891831fe62 fixed getclient brokeness 2009-06-24 12:48:01 +01:00
cdb8e27453 some hotfix cleanup related to wild selmon-> destruction 2009-06-24 11:14:51 +01:00
5c4913e983 some restack fixes, still odd behavior if n>1 on unmanaging clients 2009-06-23 19:09:30 +01:00
fa5ae54bbb added some dual head simulator code 2009-06-23 19:00:32 +01:00
7de534192c simplified left over re-assignment 2009-06-23 17:39:42 +01:00
54dc0d542c fixed tagmon, re-using detach/detachstack and attach/attachstack 2009-06-23 17:34:20 +01:00
913333f518 simplified ISVISBLE and nexttiled 2009-06-23 17:20:33 +01:00
d702f39274 moved clients/stack/sel to Monitor, that's a per monitor structure from now on 2009-06-23 17:17:25 +01:00
0d8671a5ad declare buf only if XINERAMA support is used 2009-06-23 16:29:32 +01:00
38e9b67026 if compiled without XINERAMA support assume 1 monitor by default (n = 1) 2009-06-23 16:28:37 +01:00
a3bbdb1b7b some more refactoring, bar toggle fixes 2009-06-22 20:29:59 +01:00
d53ceee682 hotfixes 2009-06-22 18:13:05 +01:00
78f56672b5 changes monitor structure to be a list 2009-06-22 14:58:08 +01:00
c2fff604a7 we need a tagset per monitor, removed tagset declaration from config.h 2009-06-20 17:02:55 +01:00
6644a6aa2e some minor fixes regarding the new xinerama support 2009-06-20 16:18:02 +01:00
3da2453997 several fixes through ISVISIBLE change (takes Monitor into account) 2009-06-20 15:51:34 +01:00
2ce37bc69e experimental xinerama support, two new actions, Mod1-w/e and Mod1-Shift-w/e 2009-06-20 15:10:04 +01:00
f27ccc5c60 introduction of Monitor for better Xinerama support, work in progress 2009-06-19 20:15:15 +01:00
2dbfda72f0 removed MAXTAGLEN 2009-05-29 09:29:22 +01:00
7df39f3fc7 next version will be 5.6, shortened some very long lines 2009-04-20 11:03:33 +01:00
0b45199cec Added tag 5.5 for changeset deaa276abac1 2009-04-18 12:49:34 +01:00
3632d7132f applied Marc Andre Tanners showhide patch, the removal of ntiled 2009-03-19 13:06:15 +00:00
565697087b applied Gottox' patches, and also removed usegrab 2009-03-17 19:53:00 +00:00
ea0008cba2 applied the patch I missed from Gottox, thanks mate! 2009-03-03 11:22:16 +00:00
af508c2e82 applied Gottox' resizehints patch, thanks Gottox! 2009-03-02 10:43:48 +00:00
f0d1d5206f some NULL fixes 2009-02-21 19:20:11 +00:00
1c80c05587 override_redirect is Bool 2009-02-21 19:15:30 +00:00
1e350be229 applied Gottox' adjustborder removal patch (thanks!) 2009-02-21 19:12:46 +00:00
1a26389e2b applied nsz' remark 2009-02-14 11:21:24 +00:00
bf9da23f07 fix of typo, thx to Enno Gottox Boland 2009-02-12 17:26:12 +01:00
2373940215 Added tag 5.4.1 for changeset 85a78d8afa0f 2009-02-08 12:11:35 +00:00
90687482ad fixed an issue reported by Nibble, also fixed s/2008/2009/ 2009-02-08 12:11:22 +00:00
5ab627c06c Added tag 5.4 for changeset 8b7836a471f8 2009-02-08 09:47:02 +00:00
76d7e80fc4 avoid reverting the border if it's not necessary (avoids some flashing on view()) 2009-02-08 09:46:23 +00:00
af8049bce8 spotted missing spaces 2008-12-20 12:02:14 +00:00
2bb51b3246 reverting some border patches 2008-12-20 00:02:56 +00:00
b16d8282be changed adjustborder to be a macro 2008-12-19 23:56:00 +00:00
fef4614772 applied yiyus applyrules() patch 2008-12-19 23:41:31 +00:00
be39dddcc5 implemented noborder for 1 client in the view 2008-12-17 21:25:32 +00:00
6d209b9b29 made status script example of .xinitrc more useful 2008-12-13 20:20:26 +00:00
57a0788bd8 ok, using signal.h for portability reasons 2008-12-13 17:44:29 +00:00
3ad906eede removed unnecessary closure of stdin reported by Frederic Chardon, thx 2008-12-13 17:27:48 +00:00
0be9fb8797 added sys/signal.h inclusion for BSD compliance 2008-12-13 16:35:34 +00:00
62a491e36d re-applied Neale's spawn patch, credited Neale in LICENSE 2008-12-12 19:55:03 +00:00
0b5dcf229f applied Neale Pickett's xprop status reading patch, updated README and dwm.1 accordingly 2008-12-12 19:49:06 +00:00
fda92f46aa applied yiyus fix 2008-12-06 16:20:14 +00:00
a62ea4062f fix 2008-12-06 11:22:30 +00:00
7dc28d130f Added tag 5.3.1 for changeset 335301ed102f 2008-12-06 09:33:58 +00:00
fbce733532 integrated yiyus clearurgent refactoring 2008-12-06 09:32:32 +00:00
e7572804fa reverted spawn 2008-12-06 09:16:48 +00:00
ed1bef1241 Added tag 5.3 for changeset 4004d6116035 2008-12-04 20:23:08 +00:00
2b047e460b added Neale Pickett's spawn patch, thanks Neale 2008-12-04 20:15:00 +00:00
5f74dc5e78 applied Gottox' comment fix (thanks) 2008-11-16 13:22:24 +00:00
ea8a4ca46a several changes towards 5.3, XINERAMA is disabled by default, introduced usegrab Bool for grabbing the server during mouse-based resizals/movements (disabled by default), continued debugging tile() with resizehints == True and a lot of terminals supporting resizehints, still no optimal solution, I need to think about it, considering recursive algorithm for the space optimization 2008-10-19 12:59:18 +01:00
4883a06221 removed NOBORDER(broken and badly used), introduce WIDTH/HEIGHT macros for computing client size with border added, fixes bug announced by sergey_m 2008-10-15 18:08:24 +02:00
4dea5324c0 Added tag 5.2 for changeset e4bcaca8e6ef 2008-09-09 20:47:01 +01:00
53cac17692 using malloc() instead of calloc() and sticking to static initializer and struct assignment, not using *c = (Client){}; right now to avoid some ugly gcc warning, possibly a gcc bug since we are using -std=c99 2008-09-08 22:24:05 +01:00
83abfc05eb applied XGetWMNormalHints fix 2008-09-07 09:53:59 +01:00
862b0d541d I prefer doing the check in showhide 2008-09-06 09:34:49 +01:00
c1c6fdc5d8 applied Donald Chai's showhide patch in slightly modified ways 2008-09-06 09:21:32 +01:00
9a4d07d9de applied Martin Hurton's checkotherwm simplification 2008-09-06 08:59:51 +01:00
30410108eb applied Peter Hartlichs aspect revert fix 2008-09-02 22:36:06 +01:00
753e0e048e applied Gottox' grabkey patch 2008-09-02 18:47:01 +01:00
d15d4ba45a applied yiyus tagbar patch 2008-09-01 22:18:50 +01:00
815f9c054d merged merge 2008-09-01 08:22:11 +00:00
addc52c948 fixed 2008-08-29 11:29:42 +01:00
26f41c9055 checking result of XGetClassHint, removed some obsolete lines in initfont() 2008-08-29 10:13:47 +01:00
73ec124ae9 merged my changes 2008-08-27 15:03:35 +01:00
ec11a3470c introduced NOBORDER macro to hide the nasty - 2 * c->bw in various calculations, moved tagset to config.def.h 2008-08-27 12:52:44 +01:00
4b3b597da3 WM_NAME is builtin atom 2008-08-25 11:43:45 +02:00
288cf78b18 grabbuttons() and grabkeys() are now independent from prior numlockmask initialization 2008-08-25 09:44:23 +01:00
6411aa921b reverted some resize() changes, reverted setlocale removal 2008-08-25 09:37:39 +01:00
db5db8806f applied Peter Hartlich's patch regarding aspect calculation with slight modifications 2008-08-23 09:54:55 +01:00
258c338030 removed artifact from wmii 2008-08-23 09:33:05 +01:00
85da537856 changed grabkeys, removed initmodmap 2008-08-23 09:31:28 +01:00
2b4157eccd applied Peter Hartlich's initmodmap patch 2008-08-23 09:26:11 +01:00
0f26de991f applied fix of toggletag by Jan Kaliszewski 2008-08-22 15:26:30 +02:00
840f937a98 Martin Hurtons typo fix 2008-08-18 19:28:57 +01:00
6975a7e31a fixed error I did when applying Martin Hurton's drawtext patch 2008-08-18 19:23:03 +01:00
47f63dce55 applied Martin Hurtons resizemouse patch 2008-08-18 19:19:15 +01:00
02a8ca95cf applied Martin Hurton's movemouse() patch 2008-08-18 18:23:39 +01:00
2ce50a9cad using None instead of 0 for trans 2008-08-18 10:22:46 +01:00
bfa5869da1 abc... 2008-08-18 10:21:24 +01:00
087a55f8d3 removed the i = textnw... as remarked by Martin Hurton 2008-08-18 10:16:36 +01:00
6d7285fd6e applied Martin Hurton's scan() patch with slight modifications 2008-08-18 10:14:51 +01:00
69c7b4b0ba changed order of variables in drawtext 2008-08-18 10:00:10 +01:00
97699e5b1b applied Martin Hurton's drawtext() patch 2008-08-18 09:55:36 +01:00
2dc7f42fd7 applied Martin Hurton's view() simplification, not checking arg 2008-08-18 09:49:44 +01:00
9f3a5cb754 making a comment more explicit 2008-08-18 09:39:52 +01:00
b48fa3f101 removed setlocale() stuff, not necessary if Xmb in use 2008-08-18 09:31:55 +01:00
051a404b66 added a comment about FAQ regarding mfact meaning 2008-08-18 09:11:15 +01:00
d8d733c34f added some comments regarding FAQ about s{x,y,w,h}, w{x,y,w,h}, b{y,h,lw} 2008-08-18 09:10:21 +01:00
bb01e5a16f initialize trans with 0 2008-08-18 08:57:34 +01:00
06f7eed103 fix of XGetTransientForHint in manage() 2008-08-14 22:35:52 +02:00
0ffa6d1393 applied cleanup from M. Hurton and S. Nagy 2008-08-14 12:36:49 +02:00
15ce143620 fixes using arg->i instead of arg->ui 2008-08-12 21:24:40 +02:00
63d7190231 applied Johannes Hofmann's patch, please test 2008-08-04 17:39:36 +01:00
b279cef670 made readin a config.h variable 2008-08-02 19:12:15 +01:00
6254ef9dc7 Added tag 5.1 for changeset ce355cea9bb8 2008-07-29 19:19:00 +01:00
4a2902efe4 forcing fullscreen windows to bw=0, though most fullscreen apps are broken anyways 2008-07-29 11:32:22 +01:00
6fad4c49f1 potential crash fix if xinerama behaves broken, though I doubt it 2008-07-18 20:18:45 +01:00
78f0f8595f make hg tip compilable with default config 2008-07-18 10:57:32 +02:00
7ecadcee39 local use of xidx is useless, got rid of it, falling back to screen 0 if pointer query fails for whatever reason 2008-07-16 18:39:48 +01:00
c86ed46a1b got rid of compile time xidx configuration, querying mouse pointer instead 2008-07-16 18:33:51 +01:00
9086f98068 reverted uint redefinition 2008-07-16 18:17:42 +01:00
9aa4a9043d applied anydot's urgency hint patch, thanks! 2008-07-13 18:08:55 +01:00
d5893f55be renamed eprint die 2008-07-03 17:05:56 +01:00
f529d41ca1 simplified detach() 2008-07-03 10:58:35 +01:00
45768ee04b removed aux* stuff from Client 2008-07-02 11:54:36 +01:00
a6d23fb61c removed useless comment 2008-07-02 11:19:02 +01:00
bf76cefe47 minor fix to view() 2008-07-02 11:06:46 +01:00
9bb0f20515 applied Frederik Ternerot's grabbuttons patch with slight modifications 2008-07-01 19:26:17 +01:00
2431ae7df7 locale update 2008-06-30 09:57:45 +01:00
829b6b57e7 removed useless characters 2008-06-24 12:40:48 +01:00
7b4c512e62 applied James Turner's dwm.1 patch, thanks James! 2008-06-23 08:59:19 +01:00
7f7c3140a9 fix of monocle 2008-06-22 09:33:49 +01:00
277155cf77 another merge 2008-06-22 09:29:35 +01:00
0c38ec7cd6 does this fix anything? 2008-06-22 09:29:06 +01:00
deef4c9bfd fixed Gottox' buttonpress/ClkTagBar code 2008-06-21 13:49:43 +01:00
b86c818599 applied Gottox' ClkTagBar patch 2008-06-20 16:52:07 +01:00
c2a916bf30 made arrange again like it was once 2008-06-19 14:58:19 +01:00
2bd46d1ce6 fix 2008-06-19 14:13:07 +01:00
6e0ce46365 use sel instead of seeking the list 2008-06-19 14:07:55 +01:00
c853d5e9bb resize should apply if !banned 2008-06-19 14:01:40 +01:00
31da0b7525 applied Gottox patch 2008-06-19 12:28:56 +01:00
12ea925076 untested monocle 2008-06-19 11:38:53 +01:00
79ecbeca7e non-zero 2008-06-19 09:11:11 +01:00
cf98ea2a9c Added tag 5.0 for changeset 06eb9644e2da 2008-06-18 18:22:54 +01:00
d8fad9bf7a branch merge 2008-06-17 11:20:18 +01:00
f25cc5678f tiled layout resizehints should be respected by default 2008-06-17 11:19:17 +01:00
5a92420fce restored y-coordinate fixing of client windows 2008-06-17 09:57:13 +01:00
ae1d865ac0 s/tags ref/tags mask/ 2008-06-15 23:27:08 +02:00
1ce173402f updated man page regarding Mod1-m 2008-06-15 18:59:52 +01:00
a06b9193c7 minor fixes towards 5.0 2008-06-15 10:52:57 +01:00
43bb77a569 removed explicit warp in movemouse 2008-06-14 15:15:15 +01:00
e3da222c1e removed scroll-wheel based focussing on window title clicks 2008-06-14 11:25:42 +01:00
66608a60fe fix of swapped focusstack mouse buttons 2008-06-14 11:23:16 +01:00
b6aa84e51b removed the ButtonPressMask for root windows as well 2008-06-14 11:22:22 +01:00
9ff5143acb removed root window click handling 2008-06-14 11:21:50 +01:00
1edf6a7866 removed font and color definitions 2008-06-14 10:38:18 +01:00
4db2f44277 minor fix 2008-06-13 17:37:43 +01:00
1f1a132784 fixed tag click handling, however ClkRootWin doesn't work for me 2008-06-12 23:04:55 +01:00
512541bfbd update 2008-06-12 16:37:03 +01:00
709da0b858 some bugfixes of the patch application yesterday 2008-06-12 13:10:14 +01:00
5cd65f8cd8 integrated yiyus mouse.diff (though the bar click handling is slightly broken, I'm to tired to debug it now, yiyus could you please?) 2008-06-11 20:41:28 +01:00
e3838e8585 made Xinerama screen index customizable 2008-06-11 19:55:07 +01:00
016dca4f69 removed trailing spaces reported by Soleen 2008-06-11 19:47:20 +01:00
8f052596b2 crash fix 2008-06-11 19:42:24 +01:00
9463d5354b made lt visible again in config.def.h 2008-06-11 17:01:30 +01:00
d662f98d89 added nsz' patch 2008-06-11 14:10:18 +01:00
e5a965a274 added SHCMD support for pipe-based commands due the new spawn() versio 2008-06-11 13:20:17 +01:00
5d422bb1ce using foo layout during cleanup (suggested by Gottox), add Arg->v handling for togglelayout() suggested by anydot 2008-06-11 10:26:57 +01:00
38a43c2dcc lt will point to a foo-layout during cleanup now (Gottox' suggestion), and togglelayout respects Arg->v 2008-06-11 10:25:02 +01:00
c56533615f integrated Peter Hartlich's patch, removed const char *c from union, simplified togglelayout 2008-06-11 09:34:00 +01:00
a8e0772c4d applied anydot's patchset.diff 2008-06-11 09:12:06 +01:00
98e7950be8 final version -- Gottox verified it using the test driver 2008-06-09 11:24:33 +02:00
88e6eb4a3a revert of introduced problem 2008-06-09 11:05:20 +02:00
0840c1367c applied nsz' textnw patch thank you 2008-06-09 10:26:01 +02:00
077d3e435b updated the for-loop with Gottox' proposal 2008-06-09 10:05:40 +02:00
d26b60b43e minor change 2008-06-06 11:49:31 +02:00
32f36ab2d5 applied nsz's patches (many thanks!) 2008-06-04 11:49:46 +02:00
08bcf721b4 small change to drawtext 2008-06-02 12:19:02 +02:00
fc578c57e4 fixed the tile() issue with xpdf 2008-06-01 17:51:22 +01:00
c8eaab21b6 using anydot's memcpy-approach in drawtext, however it still looks awkward to me 2008-06-01 17:41:15 +01:00
c26e22ccee Gottox' drawtext simplification 2008-06-01 11:58:19 +01:00
c2784e4a38 applied noviewprev.diff, fix.diff and unusedflags.diff 2008-06-01 10:54:02 +01:00
6e9387793b fix 2008-05-31 17:37:13 +01:00
92f3c181c3 lt->arrange in mfact 2008-05-31 17:05:28 +01:00
d589f7679a isfixed implies isfloating 2008-05-30 23:03:03 +01:00
75690c808d applied nibbles fixes, slightly modified 2008-05-29 18:42:53 +01:00
fde58d5e63 applied yiyus tip patch from tue 2008-05-29 18:22:51 +01:00
e1002745fa core dump fix in cleanup 2008-05-28 10:45:18 +01:00
940a4cc6c6 updated the initial comment to reflect the use of bit arrays 2008-05-26 11:43:51 +01:00
64243ab05b slight changes 2008-05-26 11:42:02 +01:00
32c5046635 removed bx and bw, unnecessary 2008-05-26 10:28:18 +01:00
6c8618f502 renamed domax into ismax 2008-05-26 10:13:51 +01:00
9189f7a12d simplified tile() 2008-05-26 10:10:33 +01:00
2d4faae522 removed Layout->updategeom, unnecessary 2008-05-26 09:54:34 +01:00
5d2385b636 removed TEXTW 2008-05-26 09:45:34 +01:00
0fe2e783e9 applied yiyus domax patch with slight modifications 2008-05-26 09:39:57 +01:00
cd3d83f571 replaced isvisible with a macro 2008-05-22 14:15:30 +01:00
0a9ef560c0 removed emallocz 2008-05-22 14:10:00 +01:00
0528a37c79 s/int/uint/ in config.h 2008-05-22 14:02:31 +01:00
56b2fece9e removed debug output, sanitized tag limit check 2008-05-22 13:35:45 +01:00
9f569fac74 setmfact argument was wrong 2008-05-22 12:00:50 +01:00
48d0c56eac Key.mod is uint, Client.[old]bw is int 2008-05-22 11:50:18 +01:00
825d6cb93a s/unsigned long/ulong/ 2008-05-22 11:16:23 +01:00
f852504014 s/nextunfloating/nexttiled/, changed zoom() behavior 2008-05-22 11:12:22 +01:00
c3fa9e879f s/unsigned int/uint/ 2008-05-22 11:10:08 +01:00
8e05f6c592 s/void */const void */ 2008-05-22 11:08:07 +01:00
39d1ecd5b0 applied Gottox bitmask + void *arg patch 2008-05-22 11:04:19 +01:00
103fb58a44 some minor fixes 2008-05-19 20:29:57 +01:00
5f55af40ae simplification 2008-05-19 20:13:24 +01:00
f806a17692 reverted dist target in Makefile 2008-05-19 20:08:31 +01:00
822101dd5b merged tile.c again into dwm.c 2008-05-19 20:07:12 +01:00
6bdef73a4f take bar into account 2008-05-19 17:27:30 +01:00
234b12eb73 be more polite to clients which like to appear outside the window area, but still on the screen 2008-05-19 17:23:49 +01:00
bd4deaebfc fixed comment 2008-05-19 15:36:45 +01:00
499315c22c fix 2008-05-19 15:09:16 +01:00
f22d047d41 make it easier for the user, if Xinerama support is given, always use the screen 0 as window area/bar area, everything else can be used for floating clients 2008-05-19 15:05:46 +01:00
4a5c8d84db improving space usage if master is left of stack (default) 2008-05-19 14:44:53 +01:00
71365a524f only snap within window area 2008-05-19 13:41:58 +01:00
3afca3e6a1 s/DEFGEOM/CUSTOMGEOM/ 2008-05-19 13:37:46 +01:00
bdc80bdad6 update 2008-05-19 13:32:43 +01:00
64707da963 updatetilegeom should be fine for setmfact 2008-05-19 12:42:26 +01:00
549726869b recent changes, introduced togglebar, changed some defines into variable declarations where possible 2008-05-19 12:34:54 +01:00
42cb2bd3be new stuff 2008-05-17 14:51:12 +01:00
585294ce0f removed the <M> togglelayout call 2008-05-17 14:50:37 +01:00
a864a82b34 s/tilegeom/updatetilegeom/ 2008-05-17 14:48:04 +01:00
bd67a82fb5 removed monocle for now 2008-05-17 14:46:06 +01:00
14d8d828ab removed the exact focus mechanism of next/prev window 2008-05-17 14:41:41 +01:00
4246affc15 moved all tile()-related stuff into tile.c which is included from config.def.h, the default dwm is now nearly independent from the arrange() algorithm in use 2008-05-17 14:38:22 +01:00
42c4b31003 removed tileh, renamed tilev into tile again, removed counttiles, tilemaster 2008-05-17 14:23:05 +01:00
a785a0d712 removed Layout->isfloating 2008-05-17 14:17:18 +01:00
489ac07e83 removed reapply() -- unnecessary 2008-05-17 14:06:41 +01:00
349d768b57 renamed setlayout into togglelayout 2008-05-17 14:04:27 +01:00
6dfa7cac56 removed temporary wildcard handling 2008-05-15 10:51:37 +01:00
71681c21a5 added wild-card handling for tags 2008-05-15 10:47:26 +01:00
704781875c applied nsz's another style patch 2008-05-14 11:24:35 +01:00
d7cc0f6416 applied nsz's style.diff patch 2008-05-13 14:33:02 +01:00
6b79f3f326 just added a comment 2008-05-13 11:27:20 +01:00
446fa8c671 minor fixes 2008-05-11 20:27:01 +01:00
fa244aa7fb having monocle on Mod1-m 2008-05-11 20:25:24 +01:00
7ac4f8a4af hotfix 2008-05-11 20:22:20 +01:00
7eb26288fc removed Geom stuff, introduced updategeom() again, still view is somewhat broken? 2008-05-11 20:20:53 +01:00
93a4fe1052 cleaned up config.def.h 2008-05-11 14:54:45 +01:00
5602f44b29 implemented exact focus next, if arg != NULL to focus{next,prev} 2008-05-11 14:40:37 +01:00
b848f4bda8 applied the proposal by nsz 2008-05-06 15:52:44 +01:00
86c4797f2c applied JUCE patch 2008-05-06 15:13:36 +01:00
c094ed2473 simplification of view() as proposed by anydot 2008-04-27 18:36:11 +01:00
bfd6079a15 applied yiyus tagset patch 2008-04-27 18:33:31 +01:00
7f70d90219 applied yiyus fgeom patch 2008-04-27 18:22:52 +01:00
858251de46 applied dfenze drawtext simplifications 2008-04-27 18:00:45 +01:00
d26c28c1e7 this is the correct way 2008-04-20 19:09:30 +01:00
b6335776e4 copyright notice is in LICENSE 2008-04-20 19:09:00 +01:00
c059625128 applied Ph's seltags-simplification with some modifications 2008-04-20 18:35:11 +01:00
874837f653 applied Ph's MIN/MAX patch, nice work! 2008-04-20 18:28:21 +01:00
5fa559dbfc applied Ph's patch regarding geom and lt initialization 2008-04-20 18:23:59 +01:00
146ff227fe applied Gottox' applyrules() fix 2008-04-20 18:17:33 +01:00
bb0a328978 geometry fix proposed by Jukka 2008-04-08 11:49:35 +01:00
721b208478 applied applyrules-fix by Jukka, thank you Jukka! 2008-04-07 09:05:41 +01:00
6229ed20c2 fix 2008-04-05 19:04:53 +01:00
940240e5e6 applied the proposed monocle patch from the mailinglist 2008-04-05 18:23:31 +01:00
08c596ed10 next version is 5.0 2008-04-04 11:15:37 +01:00
9ce6abb95c Added tag 4.9 for changeset 22c669b2dd36 2008-04-03 21:57:32 +01:00
0e21794e02 yet another cleanup 2008-04-03 14:39:19 +01:00
d477fb6927 some cleanup changes 2008-04-03 14:38:58 +01:00
3d6630b7d2 uncommented dual layout in preparation of dwm 4.9 2008-04-02 22:18:09 +01:00
c982bb1389 applied Peter Hartlich's simplification patch of setmfact and his revival of MFACT, appliead Janness Hofmann's simplification of grabbuttons() -- thanks guys! 2008-04-02 22:10:55 +01:00
6cf73e706a aspects hints seem broken for fullscreen apps 2008-04-01 15:46:00 +01:00
a520ba3c0b removed uneccessary line 2008-03-31 10:09:48 +01:00
0c71b16b92 bugfix 2008-03-25 09:41:14 +00:00
00c28a7ef2 setmfact should not have any effect if in floating layout 2008-03-24 14:31:02 +00:00
5a3a2d6b63 minor fix 2008-03-24 14:24:57 +00:00
a355782a77 revival of mfact and setmfact 2008-03-24 14:23:28 +00:00
20cd336087 setlayout and setgeom are now togglable again 2008-03-24 13:49:19 +00:00
a6a216f28c geom indicator and layout indicator is only displayed if there are several geoms/layouts 2008-03-24 13:33:32 +00:00
2c2063bc75 hotfix of idxoftag 2008-03-22 16:53:37 +00:00
e6ede461a9 blw/bgw calculation bugfix 2008-03-22 12:47:12 +00:00
6877205e9d updated configurenotify 2008-03-19 09:27:17 +00:00
fb5f99d935 minor bugfix in applyrules 2008-03-17 23:45:46 +00:00
7ebab7533a added sample of {grow,shrink}master to config.def.h 2008-03-17 17:33:25 +00:00
9fa5ca3538 renamed c->border into c->bw, fixed monocle to subtract c->bw from each h/w value 2008-03-17 16:29:50 +00:00
fe6b0c0fc1 geoms are now drawed in the status bar 2008-03-17 16:26:06 +00:00
aa2395b6a8 removed the string-based setgeom approach, introduced a new Geom type instead and a helper macro 2008-03-17 14:56:11 +00:00
dba22848c7 made the string-based setgeom working 2008-03-15 14:17:42 +00:00
33b1960220 some experimental state DO NOT USE THIS, I plan to have a nicer interface to change geometries 2008-03-14 17:17:08 +00:00
e237b2a76f some changes towards 4.9 2008-03-14 14:35:45 +00:00
dd9ee6d248 Added tag 4.8 for changeset 607015ddb091 2008-03-13 16:56:11 +00:00
1380569133 removed the comment again 2008-03-13 16:30:29 +00:00
831428b00c some polishing in tileh/tilev 2008-03-13 13:59:40 +00:00
69439715c0 minor bugfix 2008-03-13 13:01:42 +00:00
f2e98f48fb added a new comment 2008-03-13 12:47:41 +00:00
c19d4b2930 some cleanup 2008-03-13 12:45:30 +00:00
f77a3d0a62 updated my geoms function 2008-03-13 10:25:50 +00:00
8aa1533879 update 2008-03-13 10:24:02 +00:00
2fc9cffdeb set layout already here 2008-03-13 10:22:10 +00:00
3c5b6f03ba well I use a different default tile 2008-03-13 10:21:03 +00:00
02673538bc added updatebarpos() 2008-03-13 10:19:05 +00:00
95eae7b9d2 removed all defines of geoms, implemented setgeoms() instead, added config.anselm.h to show how I'd like to see that people edit their geoms 2008-03-13 10:11:02 +00:00
59107755c8 some polishing 2008-03-12 16:04:06 +00:00
d05d09b205 updated dwm(1) 2008-03-12 15:34:36 +00:00
47b1974446 added bx, by, bw, wx, wy, ww, wh, mx, my, mw, mh, mox, moy, mow, moh, tx, ty, tw, th, wx, wy, ww, wh ad variables 2008-03-11 21:52:10 +00:00
247ba66c08 changed config.def.h 2008-03-06 19:22:00 +00:00
d7b074fcce new stuff 2008-03-06 19:20:14 +00:00
c9170189bf implemented setlayout in the way proposed on the ml, split tile() into two functions, a third will follow soon 2008-03-06 18:53:15 +00:00
f7a45ff28b allow for vstack 2008-03-06 11:56:43 +00:00
add7df6e9b added some comments what the TODOs are for 4.8 2008-03-06 11:56:00 +00:00
3a79b82721 changed config.def.h 2008-03-05 21:14:57 +00:00
b31b430592 integrated the new -x -y -w toggles of dmenu into my setup 2008-03-05 19:03:45 +00:00
88c8ead3e8 removed some more useless clunk 2008-03-05 18:48:33 +00:00
2e95837220 implemented the stuff as I discussed on dwm@ 2008-03-05 18:31:08 +00:00
5d9ae3f3b7 fixed urgent hint handling 2008-03-05 13:13:13 +00:00
2e38296edd renamed maximise to monocle again. 2008-03-05 10:31:37 +00:00
59aa02a075 fixed urgency hint, though Xinerama integration is still ongoing 2008-03-05 10:22:21 +00:00
e3c2d327f6 next on TODO 2008-03-05 00:11:44 +00:00
295ad21092 renamed MAXLEN into MAXTAGLEN (backward compliance) 2008-03-04 21:41:36 +00:00
39af3c2607 renamed monocle into maxmise, documented the keybindings in dwm(1) 2008-03-04 21:40:49 +00:00
96ee9d888c monocle goes mainstream 2008-03-04 18:58:23 +00:00
a82cba2759 fixed applyrules bug 2008-03-04 18:13:07 +00:00
f7c097e802 removed View cruft, now back to the roots 2008-03-03 21:40:37 +00:00
da1b3fa437 made tag names snappier 2008-02-29 11:59:28 +00:00
ad0a2fa042 fixed some issues nsz reported in IRC log 2008-02-28 21:44:52 +00:00
9804726c82 well, AIM_XINERAMA should not be enabled 2008-02-28 21:39:45 +00:00
7bc272a4e4 made the basics of the tagging concept working -- if people want dynamic tags, that's even possible with this concept, the vtags[] array needs to be modified during runtime for this -- the new code is quite experimental, ugly and needs polishing 2008-02-28 21:38:53 +00:00
f1719ac2de removed initags -- we autoselect the first tag in each view instead 2008-02-28 20:02:57 +00:00
d99ec61482 a small fix to buttonpress 2008-02-28 17:13:13 +00:00
2f70a14ee1 some more changes towards a better dwm 2008-02-28 17:07:30 +00:00
00ca643bd7 proceeded, though we still miss a real Tag struct 2008-02-27 21:50:50 +00:00
0271ac0ed7 disabled AIM_XINERAMA 2008-02-26 22:57:23 +00:00
d5178292ed simplified dwm 2008-02-26 22:51:23 +00:00
2bfd3fffbf certain fixes, though still a lot of the mutex stuff missing 2008-02-25 22:19:17 +00:00
a3d8c05a95 pushing my changes of tonight upstream (hg tip is NOW very UNSTABLE -- but those changes are necessary to get a decent multihead support) -- I renamed Monitor into View, to reflect in a better way the dwm terminology of the past 2008-02-23 23:11:27 +00:00
fd01413fae fixed Gottox' mail address 2008-02-22 19:32:53 +00:00
d6e24f7116 well typo fix 2008-02-22 15:27:50 +00:00
c43d7b7587 added Gottox to Copyright holders after all his contributions, applied his last patch 2008-02-22 15:26:27 +00:00
de5b294edc some other fixes, resize contains a minor bug 2008-02-22 10:34:12 +00:00
8e0f8ffcc6 crash fix 2008-02-22 10:15:59 +00:00
dd21823536 made arrange() Monitor-dependent as well, fixed the movemouse/resizemouse issues 2008-02-22 10:03:42 +00:00
9cb9c32ee7 minor 2008-02-21 19:19:46 +00:00
4076e2ff60 applied Gottox' monitor.diff patch (thanks btw) 2008-02-21 14:33:59 +00:00
55edd2d6ec made restack, drawbar also Monitor-related only 2008-02-21 10:31:06 +00:00
2e8e5509d9 changed arrange functions to contain the Monitor as first argument 2008-02-21 10:14:42 +00:00
4426032450 applied Jukka's zoom-patch 2008-02-20 13:48:52 +00:00
e0f0397896 resize handles offscreen issues 2008-02-20 08:13:41 +00:00
ca3e847e45 applied some necessary changes 2008-02-20 08:09:26 +00:00
c2737b7b93 removed Monitor->dc, unnecessary 2008-02-18 17:08:22 +00:00
191cb9ce28 removed Monitor->root, since we do not support classical multihead 2008-02-18 16:47:16 +00:00
6ab163c695 some drawbar() polishing, and certain related fixes 2008-02-15 16:00:02 +00:00
e8244395e4 urgency hook handling needs also to invert the square if present 2008-02-13 20:34:17 +00:00
954db46bac Chris pointed me to the fact, that the window geoms calculation can be done once for each monitor, so I applied this remark 2008-02-11 20:57:56 +00:00
508922b90d fixed missing else branch 2008-02-11 20:51:04 +00:00
4adfdc9d95 applied dme's patch to prevent changing prevtags if nothing actually changed 2008-02-11 20:48:22 +00:00
c619363d15 applied dwm-4.8-snaptileds.diff 2008-02-11 20:43:41 +00:00
012710a3ce implemented urgent hint handling (with multihead support) 2008-02-11 20:34:17 +00:00
c2c54cc0fa got initial Xinerama support working, though there is a lot work todo 2008-02-11 15:55:42 +00:00
a62630ae92 some more polishing/consistency changes 2007-12-22 14:40:44 +00:00
62b18fb9d4 proceeded with multihead/Xinerama support 2007-12-22 14:30:47 +00:00
e0d6451086 removed maximize, there will be monocle soon 2007-12-22 12:52:14 +00:00
7a496e9777 fixed wrong tagging stuff 2007-12-22 12:49:04 +00:00
308f95ae5a added dmenu_run to config.h 2007-12-22 12:26:24 +00:00
40a734bca9 root window and screen have to be in Monitor struct, we want side-by-side Xinerama and Multihead support (only Xinerama when enabled and present) 2007-12-21 20:45:46 +00:00
985e330524 merged Christof Musik's Xinerama support patches, though this needs some polishing! 2007-12-21 12:54:45 +00:00
5f19423c7b simplified Mod-m 2007-12-09 13:39:29 +01:00
d66ad1457e implemented reapply for re-applying the tagging rules during runtime, Mod-r 2007-12-08 20:11:56 +01:00
8497f9f781 next version will be 4.8 2007-12-08 19:59:51 +01:00
91bb749e97 Added tag 4.7 for changeset d6d3085307d8 2007-11-21 21:19:03 +01:00
68ff133857 fixed focus steeling bug done by clients like opera 2007-11-17 19:59:13 +01:00
4380db468a removed support for the NetSupportingWmCheck stuff, netbeans, argouml and others also don't work with compiz, so it is Suns problem to provide a fix 2007-11-17 18:59:51 +01:00
123a565bb9 yeah compiz didn't did the trick, but identifying dwm as LookingGlass (LG3D) 2007-11-15 20:38:25 +01:00
d0e0505301 foo 2007-11-15 19:26:44 +01:00
762b66ae7c hack that adds NET_SUPPORTING_WM_CHECK handling, dwm identifies itself as compiz, hence I believe this might workaround the JDK 1.6+ XToolkit bug 2007-11-15 18:57:31 +01:00
cb4951dd54 applied Ritesh's patch to stext handling with some minor modifications 2007-11-10 20:21:22 +01:00
667da18b31 initialize prevtags in setup, now users can setup which seltags should be selectedin config.h 2007-11-10 19:31:01 +01:00
e9a0733506 Using a new tags definition (const char [][MAXTAGLEN] - thanks go to Szabolcs! 2007-11-10 19:16:11 +01:00
198502f41d moved LENGTH to dwm.c, moved prevtags to dwm.c 2007-11-07 09:49:53 +01:00
35efafe8ac we check variable == value, and not the other way - the other way is for beginner programmers. 2007-11-04 17:49:56 +01:00
951d022dfc removed a misleading comment about client title windows, which don't exist anymore 2007-11-04 12:17:06 +01:00
54bde0f9d7 full names in -v output of dwm 2007-11-04 12:12:52 +01:00
260a55ef62 doing it in a shorter way 2007-11-03 21:14:04 +01:00
0e98090d65 removed fgets usage, increment offset until a line is read, dwm will drop all lines read in one call, except the first!!! one (previously it preferred the last) - but the current approach is simplier and works better for general purpose in conjunction with the offset handling 2007-11-03 20:43:12 +01:00
af4667a85a simplified 2007-11-02 17:07:14 +01:00
a98b5e5935 made error handling more proper 2007-11-02 17:04:40 +01:00
b8985dc7bb replaced low-level stext reading with an fgets call 2007-11-02 16:57:52 +01:00
6f60b2e1cd revival of RESIZEHINTS 2007-11-02 10:43:39 +01:00
3033d45d1c sanders patch for b2 toggle 2007-10-29 12:42:58 +01:00
34e7872c89 replaced Nmacros with LENGTH(x) macro 2007-10-28 12:52:16 +01:00
c36f7c3c5e replaced ISTILE with domwfact/dozoom bools, removed nrules, nlayouts and ltidx, added NRULES, NLAYOUTS and Layout *layout as alternatives, removed isarrange(), checking against layout->arrange instead. 2007-10-28 12:41:14 +01:00
3fd39feb41 some sanity changes 2007-10-27 18:21:02 +02:00
93eee247ca going toward 4.7 2007-10-27 18:12:54 +02:00
d5e8edcbcb Added tag 4.6 for changeset bcd7e18e196a 2007-10-25 20:24:59 +02:00
13577b15e5 fixed a comment 2007-10-25 10:42:55 +02:00
5473e763f6 also consider width for tile fallback enforcing 2007-10-24 20:34:08 +02:00
cdd6c3e820 removed RESIZEHINTS and enhanced tile for fixed or aspect-ratio'ed clients 2007-10-24 16:26:59 +02:00
29f2b15ddc some cleanup, removed ntags variable, defined NTAGS macro, simplified tag(), view() and idxoftag(), fixed some NULL comparisions 2007-10-24 16:07:43 +02:00
7b65b763bc parenthized use of ISTILE macro in dwm.c 2007-10-23 09:38:47 +02:00
e94774dd69 thx to Toni Lainson 2007-10-19 09:56:51 +02:00
af0034f3a5 fixed two comments 2007-10-18 17:02:19 +02:00
cd7ebaad25 removed dwm.h, just include C-files in config.h if you extend dwm, that's simplier and most flexible than all other possibilities 2007-10-18 10:28:41 +02:00
8dc03d6e6b small cosmetic fix 2007-10-17 14:35:21 +02:00
1dcb18c124 uncommented DEBUG CFLGAS/LDFLAGS 2007-10-17 12:28:34 +02:00
206eb344e2 just making dwm.h saner 2007-10-17 11:19:14 +02:00
04de5720e6 applied Eric Mertens patch to mainstream dwm, however this needs testing 2007-10-16 19:07:51 +02:00
5a04edecb1 cleaned up dwm.c/dwm.h somewhat that it allows easier integration of patches 2007-10-16 19:04:49 +02:00
24c125cc8a small comment 2007-10-11 20:50:01 +02:00
0453c1d180 recreated dwm.h 2007-10-11 20:47:34 +02:00
0b5c14cf59 added Mod1-Tab description to dwm.1 2007-10-10 18:51:03 +02:00
a73de0cff4 added antoszka's viewprev patch with some minor modifications, restored Client->tags as Bool *, however kept the static initialization of ntags and seltags (prevtags) - this seems to be the best compromise 2007-10-10 18:39:28 +02:00
eeea4ef583 applied Brandon MacDone's static initialization patch for seltags and Client->tags 2007-10-06 19:43:15 +02:00
883e09b2eb removing NULL-terminating **tags definition in config.h 2007-10-05 18:30:01 +02:00
7e25897f11 removed two spaces reported by Soleen 2007-10-03 16:25:25 +02:00
95091dcad4 reverted Peters patch to tile, I will discuss the reasons at dwm@ 2007-10-01 21:25:15 +02:00
57676994ea s/xterm/uxterm/ 2007-10-01 15:39:37 +02:00
60adbab726 added hint for downloading dextra 2007-10-01 14:40:53 +02:00
c3eca4d14f fixed font definition 2007-10-01 11:43:53 +02:00
d1f4fbb469 fixed man page 2007-09-30 19:20:05 +02:00
635b64384d fixed an issue in Peter's patch (it is no good idea to restack() all clients on enternotify() 2007-09-30 18:33:05 +02:00
bedbe59aaa applied Peter Hartlich's border collapse patch 2007-09-30 12:47:08 +02:00
3f3086f8b8 improved tile() for the RESIZEHINTS == True case, now more space is consumed by the clients (esp. if those clients use increment handling heavily) 2007-09-27 20:08:21 +02:00
f92a4e45c4 fixed colors 2007-09-27 18:59:47 +02:00
2fc8a13588 fixed inclusion order 2007-09-27 09:14:32 +02:00
63725004f5 updated with my favorite colorscheme 2007-09-26 19:14:22 +02:00
e9348dcaca applied colors depend from lavishs proposal 2007-09-25 20:43:29 +02:00
fa857b2896 switching to white normal bg, renaming tag 9 into www, for static use in conjunction with ff 2007-09-23 18:50:04 +02:00
c77663fcb4 btw 4.6 will be the next release 2007-09-23 11:24:42 +02:00
17d39ee014 renamed config.h into config.def.h, config.h will be created if not present, this seems less annoying after all 2007-09-23 11:24:12 +02:00
8d1810c85b introduced ISTILE, which can be easily extended with other layout functions to allow reuse of setmwfact() and zoom() 2007-09-22 21:55:19 +02:00
60444daa70 setmwfact and zoom check isarrange(floating) now, not !isarrange(tile) - this makes it easier to play well with bstack and nmtile patches 2007-09-22 21:34:06 +02:00
b0477c3017 Added tag 4.5 for changeset 2acc60d6dfe2 2007-09-22 09:13:03 +02:00
24dae7d7e3 cosmetic fix 2007-09-22 08:57:24 +02:00
fa1ce22bc4 fixed a comment 2007-09-20 21:45:27 +02:00
1fafcb1820 applied Peters patch, applied yiyus hint to initfont 2007-09-19 17:32:28 +02:00
08c2d92480 applied Peter Hartlich's togglemax patch to allow toggling tiled clients to maximum 2007-09-18 19:04:50 +02:00
fe2775a15b made all stuff non-static - so you can choose wether to use dwm the static or the extern way when extending it 2007-09-17 16:42:37 +02:00
01022b95d6 there might be envs which need Xlib.h 2007-09-16 20:02:42 +02:00
b2f276b0f9 Mod1-Button2 on a floating but not-fixed client will make it tiled again 2007-09-16 13:42:37 +02:00
d1ce3eac33 now tiled windows can be resized/moved, their floating state will be toggled implicitely 2007-09-16 13:27:33 +02:00
9449ea3e00 some more rearrangements 2007-09-16 12:34:08 +02:00
49197fe4bf ordered all functions alphabetically 2007-09-16 11:53:14 +02:00
11cfff2dae corrected a misleading comment 2007-09-16 10:24:35 +02:00
a026617c65 macros which have been defined in config.h can only be used at function level, however you can nest code into config.h now for implementing a different layout (just for example), eg. #include "supertile.c" 2007-09-16 10:23:53 +02:00
a6df995b5d ordered function forward definitions 2007-09-15 22:45:18 +02:00
e041ff70b0 backporting my intro-comment of old dwm.h 2007-09-15 22:33:46 +02:00
2d7bb8d7c9 removed grabkeys, not necessary 2007-09-15 22:31:24 +02:00
0235a84ef2 micromizing dwm step 1 2007-09-15 22:25:27 +02:00
2091200c95 new colorscheme (16-bit compliant) 2007-09-15 20:39:31 +02:00
7e476fb86b moved bar-related stuff to bar.c (merged draw.c into that) 2007-09-15 13:16:54 +02:00
9800518ae3 renamed drawstatus into drawbar 2007-09-15 12:36:42 +02:00
5d831eaa94 renamed config.default.h into config.h 2007-09-15 10:35:18 +02:00
e0a6dee30d dist target only needs to add config.default.h 2007-09-15 10:31:28 +02:00
73e2aba341 removed config.arg.h, only 1 config.h necessary 2007-09-15 10:30:45 +02:00
9f88fd093c small changes of the colors 2007-09-14 20:32:12 +02:00
0e515a06c8 other color 2007-09-11 21:30:27 +02:00
c4b3c0d979 using light colorscheme, preparing merge of config.arg.h with config.default.h 2007-09-11 20:16:16 +02:00
f3a5116248 I work with enabled RESIZEHINTS, simply because I force myself to continue the st development ;) 2007-09-09 18:31:19 +02:00
ae760f3f38 introduced new define RESIZEHINTS, which allows to enable/disable size hint handling in tiled resizals 2007-09-09 18:28:39 +02:00
169d96ae8f 14px fonts drives me nuts 2007-09-07 21:22:49 +02:00
f651435061 Added tag 4.4.1 for changeset 7c117df5d202 2007-08-26 12:54:20 +02:00
a92cf496c1 prepared 4.4.1 bugfix and minor feature enhancement release 2007-08-26 12:53:40 +02:00
cc7970010b Added tag 4.4 for changeset 408014d21261 2007-08-23 18:15:13 +02:00
67a1141f44 removed unnecessary include, prepared dwm-4.4 2007-08-23 18:11:24 +02:00
8be3f3ec9e setlayout should perform strcmp's if arg != NULL, because Layout is local to screen.o 2007-08-22 19:06:35 +02:00
5762e92994 reverted release CFLAGs 2007-08-22 19:02:17 +02:00
36672d0401 removed the _DWM_PROPERTIES handling, reverted ban/unban to XMoveWindow(), and changed argument of setlayout to layout[N].symbol check 2007-08-22 19:01:05 +02:00
b18e684015 renamed char prop[] into buf[] 2007-08-19 18:50:47 +02:00
fc109ea8f7 fixed misappearance of iconified windows on SIGKILL 2007-08-19 18:39:54 +02:00
b975c47280 moved updatebarpos to screen 2007-08-19 11:00:47 +02:00
47765f7286 added screen.c, removed layout.c and tag.c 2007-08-19 10:57:02 +02:00
96d7fe16ea prepared merging layout.c and tag.c into screen.c 2007-08-19 10:40:07 +02:00
78d1a22d4e small fix 2007-08-19 10:13:24 +02:00
0c60620410 hmm I doubt the usefulness of storing this information... 2007-08-18 14:20:56 +02:00
50be6c8b67 cleaned up settags-handling 2007-08-18 13:48:05 +02:00
7d156dee1e applied Gottox mwfact patch 2007-08-18 11:40:25 +02:00
55d8dda9f4 replaced static Layout *lt with static unsigned int sellayout... (will be adapted later when _DWM_CONFIG is serialized as root window property) 2007-08-17 21:19:07 +02:00
86953bd682 renamed seltag into seltags 2007-08-17 21:12:55 +02:00
a923298d35 applied Jukka Salmi's setmwfact patch 2007-08-17 21:10:50 +02:00
04dec4c943 made plural arrays 2007-08-16 18:41:22 +02:00
e40448fd63 fixed the issue observed by various people, that clients appeared on empty tags 2007-08-16 18:30:25 +02:00
10bc0ce912 made tag/view/toggle{tag,view} work on pointer to tags-array, there was the need to define Key key[] not static to do this. split focusclient into focusnext/prev, fixed config.*.h's 2007-08-16 17:55:55 +02:00
e8792d95a1 applied Jukka's patch 2007-08-16 08:05:30 +02:00
feec92df84 fixed _DWM_CONFIG persistation, fixed the client disapperance bug during restarts 2007-08-15 19:31:41 +02:00
10d13f01ff fififi 2007-08-15 19:27:32 +02:00
8fcc4ff0ae fix of resize (thanks Sander for the hint!) 2007-08-14 19:38:10 +02:00
f2512243f4 fixed a typo 2007-08-14 07:54:51 +02:00
b32cd4454b small bugfix 2007-08-13 20:10:44 +02:00
9e56e1ded6 tags should be persistent now during X server run 2007-08-13 20:06:00 +02:00
e4ad320599 small bugfix 2007-08-13 19:22:51 +02:00
a200c39635 made tile simplier 2007-08-13 19:19:38 +02:00
77044e8765 made Layout a static struct in layout.c, added some convenience getters in layout.c, now lt->arrange accesses are not possible anymore, arrange() is the super-arrange function which sets up all layouts 2007-08-13 19:13:54 +02:00
2feb3afe78 made resize more precise 2007-08-13 18:24:15 +02:00
0937cc78bf moved floating to layout.c, kept tile.c outside 2007-08-12 13:10:21 +02:00
f6e41b0bc3 renamed MASTER into MWFACT, master into mwfact, and incmaster into addtomwfact 2007-08-12 12:46:08 +02:00
2c6087e3d2 fixed a comment 2007-08-11 14:44:11 +02:00
2d81b78b85 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 2007-08-11 12:11:50 +02:00
b5eea45a31 let not overlap the borders 2007-08-10 18:27:25 +02:00
aa53e39ec0 removed VRATIO, NMASTER, inc*(), renamed HRATIO into MASTER, see mailinglist for details 2007-08-10 18:16:05 +02:00
4216bf801f slight change of my color scheme 2007-08-05 17:37:40 +02:00
2cd1609770 removed spow(x, 0); calls, I did them for consistency's sake, but it should be rather obvious how the scaling works anyways 2007-08-05 16:00:08 +02:00
85c9ebf2fc applied Jukka's dwm.1 patch 2007-08-05 15:58:07 +02:00
796925089c changed shortcuts as described on the mailinglist, added sanity checks for ratios during tile (fallback to wah if clients would get too small), documented that new stuff/shortcuts in dwm(1) 2007-08-05 12:47:52 +02:00
da91dfc948 small fix of static function order 2007-08-04 10:57:56 +02:00
4135e34dfa I introduced {H,V}RATIO and inc{h,v,}ratio() functions - the default behaves like in dwm-4.3, config.arg.h shows how I prefer the ratio being handled (for the future I plan to change const char *arg into ..., and renaming Client into Win.) 2007-08-04 10:51:39 +02:00
846128a498 removed a C++ style comment 2007-08-03 19:29:58 +02:00
e461e60997 implemented ratio tile as described on the mailinglist 2007-08-03 19:23:30 +02:00
28c10330bd changed the fix of yesterday, the resize should only be necessary at manage() time, not on any unban() 2007-07-31 18:22:13 +02:00
0d40590c2c foo 2007-07-30 21:03:08 +02:00
8fda28be35 set client state to iconic on maprequest 2007-07-28 17:25:44 +02:00
a54cf2ecef changed ban/unban implementation to not move the windows anymore, but map/unmap them instead - PLEASE TEST THIS 2007-07-28 17:18:45 +02:00
4b9337a01e removed shiftview(), if you scroll the views in the tag area, you can also use Button1 instead
removed focusclient([-]1) bound to scroll wheel - if you slightly move the mouse you will focus the first client anways which is in the way
2007-07-28 12:58:56 +02:00
154497541d applied Jeroen's {clean,spell}.diff patches, thanks Jeroen! 2007-07-26 20:15:02 +02:00
e0cfe07648 applied Jeroen Schot's shiftview patch 2007-07-24 18:29:29 +02:00
82be289985 applied dwm-windowscrolling patch 2007-07-24 18:25:01 +02:00
f2190c8fc2 Added tag 4.3 for changeset e0ec0d5d8b1e 2007-07-14 21:14:15 +02:00
c31648d15d restoring tip to be a working dwm again (switching FONT to terminus in config.arg.h) 2007-07-12 19:45:28 +02:00
52250e7c1e please recheck this patch with Mathematica from Wolfram Research - lemme know if it fixes the geyish blob window bug 2007-06-19 09:08:15 +02:00
51a94a2f14 removed crappy createnotify handler 2007-06-19 09:04:21 +02:00
c95bf3db9d applied restack patch of anydot, with slight changes 2007-06-06 11:43:14 +02:00
4bf3b01953 I change the style of init somewhat, init as early as possible. 2007-06-06 11:17:56 +02:00
ff957d1eac uncommented creatnotify 2007-06-04 14:38:24 +02:00
83aa110c6f added an creatnotify event handler 2007-06-04 11:50:48 +02:00
5a1a2edf0e applied anudots [un]ban repair patch 2007-06-04 11:37:33 +02:00
b3419f49a3 making variable declarations in dwm.h extern, this seems to be more ansi compliant 2007-06-01 12:11:25 +02:00
141beb2704 replaced BORDERPX with sel->border in togglemax(), in other places this is not possible. 2007-05-30 20:49:38 +02:00
4e49d5a0ad Added tag 4.2 for changeset c13cb8c6b7a5 2007-05-30 12:22:29 +02:00
19 changed files with 2365 additions and 2177 deletions

23
.hgtags
View File

@ -44,3 +44,26 @@ baee494346e520f8dee2cee9491b8350064770d2 3.7
55478328b2422c700c5404a774c85e77322f41a3 3.9
018c3846842291cb6c009dc087e7fe2f0ef53bea 4.0
00f4180df72b49aadb2933804fde4bfb33e5666d 4.1
c13cb8c6b7a56af74cc88346e71d2490470b546f 4.2
e0ec0d5d8b1ef3ee04a83c7c0fee5853aa2ac6a6 4.3
408014d2126153d2b0fce26a13ba707db222b7b9 4.4
7c117df5d202530e85066d8b1ab02cef605c79ad 4.4.1
2acc60d6dfe28c101a8cd44a8aa710a38ae3607c 4.5
bcd7e18e196a00cc2e97ff3a4a58f3cdaba13856 4.6
d6d3085307d8d98b8b012b669e858fd787befeb1 4.7
607015ddb091d49cbd3457af41713691aa69f4d6 4.8
22c669b2dd3673785c3476b9976da21e8783f745 4.9
06eb9644e2dad7667d97495eb7d7bc62aa0429e8 5.0
ce355cea9bb89e162f61913737a46908cdfa7e45 5.1
e4bcaca8e6ef13d2c3b81f1218ad15e5da4d68bd 5.2
4004d61160355d869a7d2672561caad440751ba0 5.3
335301ed102fec9b1a15d06bfa0184d53b38fa54 5.3.1
8b7836a471f8f9ee61bec980df00971888d76343 5.4
85a78d8afa0fe8b106a8223b5327e5bddb5dd5e3 5.4.1
deaa276abac17ca08fbeb936916e4c8292d293a4 5.5
5550702215773aad462f22a774dced9b87437c51 5.6
e47a47bd3ed42fd3cf023572147b75ebc2adef82 5.6.1
257403d4cd962cac03344a871ea56cc742bae38e 5.7
48c3f87c335d6606e55fbae97267fa6b39ca56e0 5.7.1
15761ac5e2f1e9010900f891616a24a22d82f128 5.7.2
60ea8fed13ab750c6717f2764cbf9c13bb6f0d0a 5.8

97
BUGS Normal file
View File

@ -0,0 +1,97 @@
---
18:17 < Biolunar> when i change my resolution in dwm (to a smaller one) and then back to the native, the top bar is not repainted. that's since 5.7.2, in 5.6 it worked fine
18:19 < Biolunar> is it just happening to me or a (known) bug?
18:24 < Biolunar> and in addition, mplayers fullscreen is limited to the small resolution after i changed it back to the native
reproducible with xrandr -s but not with --output and --mode, strange
---
> enternotify is handled even when the entered window is already focused
> (eg moving the mouse to the bar and back, scrolling on the border..)
>
> focusing might be expensive for some clients (eg dim/light up)
>
> a possible solution is to modify enternotify:
>
> + c = wintoclient(ev->window);
> if((m = wintomon(ev->window)) && m != selmon) {
> unfocus(selmon->sel);
> selmon = m;
> }
> + else if (c == selmon->sel || c == NULL)
> + return;
---
> another corner case:
a tiled client can be resized with mod+right click, but it only works
on the main monitor
---
dmenu appears on the monitor where the pointer is and not on selmon
---
yet another corner case:
open a terminal, focus another monitor, but without moving the mouse
pointer there
if there is no client on the other monitor to get the focus, then the
terminal will be unfocused but it will accept input
---
Donald Allen reported this:
starting emacs from dmenu in archlinux results in missing configure of emacs, but mod1-space or mod1-shift-space fix this problem. this problem is new and did not happen in 1.6 xorg servers
Starting emacs from xterm doesnt show this problem, he uses tag 8 for emacs
---
2009/12/7 Alexandr Krylovskiy <wing_AT_tversu.ru>:
> Fullscreen mode with flash applications (youtube, for example) doesn't
> work properly neither in tiled nor in floating mode.
> Fullscreen window closes immediately after opening.
This is a known bug (for some curiosity I received the same report via
privmail from 2 other people within one week, really strange).
The quick fix is commenting out the code in lines 817/818 in hg tip
dwm. I cannot confirm this has no side effects (I think it does) and I
will address this issue shortly with a real fix.
---
SDL seems to not like non-reparenting WMs:
> I would like to mention SDL problems, however SDL is not crucial to
> me anymore; people that really care about it should speak up and
> propose dwm / SDL patch or cooperation scheme in that matter.
Patching SDL, bugging them?
---
voltaic reports this:
When I use two monitors, one larger in resolution than the other, the
bar is drawn using the smaller x-dimension on both screens. I think
what's happening is that there are two bars drawn, but the short bar
is always on top of the long bar such that I can't see the information
under the short bar. If I switch to the small screen, hide the short
bar, and then switch to the large screen, the long bar is drawn
correctly.
A similar problem occurs when I have started dwm on a small resolution
monitor (laptop screen) and then I switch to a large external display.
When I do this, the bar itself is drawn for the original smaller
resolution, but the information to be printed on the bar is
right-aligned for a longer bar. So what I see is a bar that has the
right hand side of it cut-off. See attached screenshot.
I am using standard options for xrandr such as --output VGA1 --auto, etc.
---

32
LICENSE
View File

@ -1,25 +1,31 @@
MIT/X Consortium License
© 2006-2007 Anselm R. Garbe <garbeam at gmail dot com>
© 2006-2010 Anselm R Garbe <anselm@garbe.us>
© 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
© 2006-2007 Jukka Salmi <jukka at salmi dot ch>
© 2007 Premysl Hruby <dfenze at gmail dot com>
© 2007 Szabolcs Nagy <nszabolcs at gmail dot com>
© 2006-2009 Jukka Salmi <jukka at salmi dot ch>
© 2007-2009 Premysl Hruby <dfenze at gmail dot com>
© 2007-2009 Szabolcs Nagy <nszabolcs at gmail dot com>
© 2007-2009 Christof Musik <christof at sendfax dot de>
© 2007-2008 Enno Gottox Boland <gottox at s01 dot de>
© 2007-2008 Peter Hartlich <sgkkr at hartlich dot com>
© 2008 Martin Hurton <martin dot hurton at gmail dot com>
© 2008 Neale Pickett <neale dot woozle dot org>
© 2009 Mate Nagy <mnagy@port70.net>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

View File

@ -1,9 +1,9 @@
# dwm - dynamic window manager
# © 2006-2007 Anselm R. Garbe, Sander van Dijk
# See LICENSE file for copyright and license details.
include config.mk
SRC = client.c draw.c event.c layout.c main.c tag.c util.c
SRC = dwm.c
OBJ = ${SRC:.c=.o}
all: options dwm
@ -18,11 +18,11 @@ options:
@echo CC $<
@${CC} -c ${CFLAGS} $<
${OBJ}: dwm.h config.h config.mk
${OBJ}: config.h config.mk
config.h:
@echo creating $@ from config.default.h
@cp config.default.h $@
@echo creating $@ from config.def.h
@cp config.def.h $@
dwm: ${OBJ}
@echo CC -o $@
@ -35,8 +35,8 @@ clean:
dist: clean
@echo creating dist tarball
@mkdir -p dwm-${VERSION}
@cp -R LICENSE Makefile README config.*.h config.mk \
dwm.1 dwm.h ${SRC} dwm-${VERSION}
@cp -R LICENSE Makefile README config.def.h config.mk \
dwm.1 ${SRC} dwm-${VERSION}
@tar -cf dwm-${VERSION}.tar dwm-${VERSION}
@gzip dwm-${VERSION}.tar
@rm -rf dwm-${VERSION}

8
README
View File

@ -18,6 +18,9 @@ necessary as root):
make clean install
If you are going to use the default bluegray color scheme it is highly
recommended to also install the bluegray files shipped in the dextra package.
Running dwm
-----------
@ -37,9 +40,10 @@ like this in your .xinitrc:
while true
do
echo `date` `uptime | sed 's/.*,//'`
xsetroot -name "`date` `uptime | sed 's/.*,//'`"
sleep 1
done | dwm
done &
exec dwm
Configuration

402
client.c
View File

@ -1,402 +0,0 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
#include <stdlib.h>
#include <string.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
/* static */
static void
attachstack(Client *c) {
c->snext = stack;
stack = c;
}
static void
detachstack(Client *c) {
Client **tc;
for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext);
*tc = c->snext;
}
static void
grabbuttons(Client *c, Bool focused) {
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
if(focused) {
XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
}
else
XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
}
static Bool
isprotodel(Client *c) {
int i, n;
Atom *protocols;
Bool ret = False;
if(XGetWMProtocols(dpy, c->win, &protocols, &n)) {
for(i = 0; !ret && i < n; i++)
if(protocols[i] == wmatom[WMDelete])
ret = True;
XFree(protocols);
}
return ret;
}
static void
setclientstate(Client *c, long state) {
long data[] = {state, None};
XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32,
PropModeReplace, (unsigned char *)data, 2);
}
static int
xerrordummy(Display *dsply, XErrorEvent *ee) {
return 0;
}
/* extern */
void
attach(Client *c) {
if(clients)
clients->prev = c;
c->next = clients;
clients = c;
}
void
configure(Client *c) {
XConfigureEvent ce;
ce.type = ConfigureNotify;
ce.display = dpy;
ce.event = c->win;
ce.window = c->win;
ce.x = c->x;
ce.y = c->y;
ce.width = c->w;
ce.height = c->h;
ce.border_width = c->border;
ce.above = None;
ce.override_redirect = False;
XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce);
}
void
detach(Client *c) {
if(c->prev)
c->prev->next = c->next;
if(c->next)
c->next->prev = c->prev;
if(c == clients)
clients = c->next;
c->next = c->prev = NULL;
}
void
focus(Client *c) {
if((!c && selscreen)|| (c && !isvisible(c)))
for(c = stack; c && !isvisible(c); c = c->snext);
if(sel && sel != c) {
grabbuttons(sel, False);
XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]);
}
if(c) {
detachstack(c);
attachstack(c);
grabbuttons(c, True);
}
sel = c;
drawstatus();
if(!selscreen)
return;
if(c) {
XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
}
else
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
}
void
killclient(const char *arg) {
XEvent ev;
if(!sel)
return;
if(isprotodel(sel)) {
ev.type = ClientMessage;
ev.xclient.window = sel->win;
ev.xclient.message_type = wmatom[WMProtocols];
ev.xclient.format = 32;
ev.xclient.data.l[0] = wmatom[WMDelete];
ev.xclient.data.l[1] = CurrentTime;
XSendEvent(dpy, sel->win, False, NoEventMask, &ev);
}
else
XKillClient(dpy, sel->win);
}
void
manage(Window w, XWindowAttributes *wa) {
Client *c, *t = NULL;
Window trans;
Status rettrans;
XWindowChanges wc;
c = emallocz(sizeof(Client));
c->tags = emallocz(ntags * sizeof(Bool));
c->win = w;
c->x = wa->x;
c->y = wa->y;
c->w = wa->width;
c->h = wa->height;
c->oldborder = wa->border_width;
if(c->w == sw && c->h == sh) {
c->x = sx;
c->y = sy;
c->border = wa->border_width;
}
else {
if(c->x + c->w + 2 * c->border > wax + waw)
c->x = wax + waw - c->w - 2 * c->border;
if(c->y + c->h + 2 * c->border > way + wah)
c->y = way + wah - c->h - 2 * c->border;
if(c->x < wax)
c->x = wax;
if(c->y < way)
c->y = way;
c->border = BORDERPX;
}
wc.border_width = c->border;
XConfigureWindow(dpy, w, CWBorderWidth, &wc);
XSetWindowBorder(dpy, w, dc.norm[ColBorder]);
configure(c); /* propagates border_width, if size doesn't change */
updatesizehints(c);
XSelectInput(dpy, w,
StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
grabbuttons(c, False);
updatetitle(c);
if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success))
for(t = clients; t && t->win != trans; t = t->next);
settags(c, t);
if(!c->isfloating)
c->isfloating = (rettrans == Success) || c->isfixed;
attach(c);
attachstack(c);
c->isbanned = True;
XMoveWindow(dpy, w, c->x + 2 * sw, c->y);
XMapWindow(dpy, w);
setclientstate(c, NormalState);
focus(c);
lt->arrange();
}
void
resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
float dx, dy, max, min, ratio;
XWindowChanges wc;
if(w <= 0 || h <= 0)
return;
if(sizehints) {
if(c->minay > 0 && c->maxay > 0 && (h - c->baseh) > 0) {
dx = (float)(w - c->basew);
dy = (float)(h - c->baseh);
min = (float)(c->minax) / (float)(c->minay);
max = (float)(c->maxax) / (float)(c->maxay);
ratio = dx / dy;
if(max > 0 && min > 0 && ratio > 0) {
if(ratio < min) {
dy = (dx * min + dy) / (min * min + 1);
dx = dy * min;
w = (int)dx + c->basew;
h = (int)dy + c->baseh;
}
else if(ratio > max) {
dy = (dx * min + dy) / (max * max + 1);
dx = dy * min;
w = (int)dx + c->basew;
h = (int)dy + c->baseh;
}
}
}
if(c->minw && w < c->minw)
w = c->minw;
if(c->minh && h < c->minh)
h = c->minh;
if(c->maxw && w > c->maxw)
w = c->maxw;
if(c->maxh && h > c->maxh)
h = c->maxh;
if(c->incw)
w -= (w - c->basew) % c->incw;
if(c->inch)
h -= (h - c->baseh) % c->inch;
}
if(w <= 0 || h <= 0)
return;
/* offscreen appearance fixes */
if(x > sw)
x = sw - w - 2 * c->border;
if(y > sh)
y = sh - h - 2 * c->border;
if(x + w + 2 * c->border < sx)
x = sx;
if(y + h + 2 * c->border < sy)
y = sy;
if(c->x != x || c->y != y || c->w != w || c->h != h) {
c->x = wc.x = x;
c->y = wc.y = y;
c->w = wc.width = w;
c->h = wc.height = h;
wc.border_width = c->border;
XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc);
configure(c);
XSync(dpy, False);
}
}
void
togglefloating(const char *arg) {
if(!sel || lt->arrange == floating)
return;
sel->isfloating = !sel->isfloating;
if(sel->isfloating)
resize(sel, sel->x, sel->y, sel->w, sel->h, True);
lt->arrange();
}
void
updatesizehints(Client *c) {
long msize;
XSizeHints size;
if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags)
size.flags = PSize;
c->flags = size.flags;
if(c->flags & PBaseSize) {
c->basew = size.base_width;
c->baseh = size.base_height;
}
else if(c->flags & PMinSize) {
c->basew = size.min_width;
c->baseh = size.min_height;
}
else
c->basew = c->baseh = 0;
if(c->flags & PResizeInc) {
c->incw = size.width_inc;
c->inch = size.height_inc;
}
else
c->incw = c->inch = 0;
if(c->flags & PMaxSize) {
c->maxw = size.max_width;
c->maxh = size.max_height;
}
else
c->maxw = c->maxh = 0;
if(c->flags & PMinSize) {
c->minw = size.min_width;
c->minh = size.min_height;
}
else if(c->flags & PBaseSize) {
c->minw = size.base_width;
c->minh = size.base_height;
}
else
c->minw = c->minh = 0;
if(c->flags & PAspect) {
c->minax = size.min_aspect.x;
c->maxax = size.max_aspect.x;
c->minay = size.min_aspect.y;
c->maxay = size.max_aspect.y;
}
else
c->minax = c->maxax = c->minay = c->maxay = 0;
c->isfixed = (c->maxw && c->minw && c->maxh && c->minh
&& c->maxw == c->minw && c->maxh == c->minh);
}
void
updatetitle(Client *c) {
char **list = NULL;
int n;
XTextProperty name;
name.nitems = 0;
c->name[0] = 0;
XGetTextProperty(dpy, c->win, &name, netatom[NetWMName]);
if(!name.nitems)
XGetWMName(dpy, c->win, &name);
if(!name.nitems)
return;
if(name.encoding == XA_STRING)
strncpy(c->name, (char *)name.value, sizeof c->name - 1);
else {
if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
&& n > 0 && *list)
{
strncpy(c->name, *list, sizeof c->name - 1);
XFreeStringList(list);
}
}
c->name[sizeof c->name - 1] = '\0';
XFree(name.value);
}
void
unmanage(Client *c) {
XWindowChanges wc;
wc.border_width = c->oldborder;
/* The server grab construct avoids race conditions. */
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */
detach(c);
detachstack(c);
if(sel == c)
focus(NULL);
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
setclientstate(c, WithdrawnState);
free(c->tags);
free(c);
XSync(dpy, False);
XSetErrorHandler(xerror);
XUngrabServer(dpy);
lt->arrange();
}

View File

@ -1,98 +0,0 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
#define BARPOS BarTop /* BarBot, BarOff */
#define BORDERPX 1
#define FONT "-*-pixelcarnage monospace-*-r-*-*-14-*-*-*-*-*-*-*"
#define NORMBORDERCOLOR "#333"
#define NORMBGCOLOR "#222"
#define NORMFGCOLOR "#ccc"
#define SELBORDERCOLOR "#8c8"
#define SELBGCOLOR "#555"
#define SELFGCOLOR "#fff"
/* tagging */
#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 isfloating */ \
{ "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 */ \
{ "><>", floating }, \
};
#define MASTERWIDTH 600 /* master width per thousand */
#define NMASTER 1 /* clients in master area */
#define SNAP 32 /* snap pixel */
/* key definitions */
#define MODKEY Mod1Mask
#define KEYS \
static Key key[] = { \
/* modifier key function argument */ \
{ MODKEY, XK_p, spawn, \
"exe=`dmenu_path | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"'" \
" -sb '"SELBGCOLOR"' -sf '"SELFGCOLOR"'` && exec $exe" }, \
{ MODKEY|ShiftMask, XK_Return, spawn, \
"exec urxvtcd -tr -bg '#222' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_b, togglebar, NULL }, \
{ MODKEY, XK_h, incmasterw, "-32" }, \
{ MODKEY, XK_l, incmasterw, "32" }, \
{ MODKEY|ShiftMask, XK_j, incnmaster, "1" }, \
{ MODKEY|ShiftMask, XK_k, incnmaster, "-1" }, \
{ MODKEY, XK_j, focusclient, "1" }, \
{ MODKEY, XK_k, focusclient, "-1" }, \
{ MODKEY, XK_m, togglemax, NULL }, \
{ MODKEY, XK_Return, zoom, NULL }, \
{ MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \
{ MODKEY|ShiftMask, XK_c, killclient, NULL }, \
{ MODKEY, XK_0, view, NULL }, \
{ MODKEY, XK_1, view, "0" }, \
{ MODKEY, XK_2, view, "1" }, \
{ MODKEY, XK_3, view, "2" }, \
{ MODKEY, XK_4, view, "3" }, \
{ MODKEY, XK_5, view, "4" }, \
{ MODKEY, XK_6, view, "5" }, \
{ MODKEY, XK_7, view, "6" }, \
{ MODKEY, XK_8, view, "7" }, \
{ MODKEY, XK_9, view, "8" }, \
{ MODKEY|ControlMask, XK_1, toggleview, "0" }, \
{ MODKEY|ControlMask, XK_2, toggleview, "1" }, \
{ MODKEY|ControlMask, XK_3, toggleview, "2" }, \
{ MODKEY|ControlMask, XK_4, toggleview, "3" }, \
{ MODKEY|ControlMask, XK_5, toggleview, "4" }, \
{ MODKEY|ControlMask, XK_6, toggleview, "5" }, \
{ MODKEY|ControlMask, XK_7, toggleview, "6" }, \
{ MODKEY|ControlMask, XK_8, toggleview, "7" }, \
{ MODKEY|ControlMask, XK_9, toggleview, "8" }, \
{ MODKEY|ShiftMask, XK_0, tag, NULL }, \
{ MODKEY|ShiftMask, XK_1, tag, "0" }, \
{ MODKEY|ShiftMask, XK_2, tag, "1" }, \
{ MODKEY|ShiftMask, XK_3, tag, "2" }, \
{ MODKEY|ShiftMask, XK_4, tag, "3" }, \
{ MODKEY|ShiftMask, XK_5, tag, "4" }, \
{ MODKEY|ShiftMask, XK_6, tag, "5" }, \
{ MODKEY|ShiftMask, XK_7, tag, "6" }, \
{ MODKEY|ShiftMask, XK_8, tag, "7" }, \
{ MODKEY|ShiftMask, XK_9, tag, "8" }, \
{ MODKEY|ControlMask|ShiftMask, XK_1, toggletag, "0" }, \
{ MODKEY|ControlMask|ShiftMask, XK_2, toggletag, "1" }, \
{ MODKEY|ControlMask|ShiftMask, XK_3, toggletag, "2" }, \
{ MODKEY|ControlMask|ShiftMask, XK_4, toggletag, "3" }, \
{ MODKEY|ControlMask|ShiftMask, XK_5, toggletag, "4" }, \
{ MODKEY|ControlMask|ShiftMask, XK_6, toggletag, "5" }, \
{ MODKEY|ControlMask|ShiftMask, XK_7, toggletag, "6" }, \
{ MODKEY|ControlMask|ShiftMask, XK_8, toggletag, "7" }, \
{ MODKEY|ControlMask|ShiftMask, XK_9, toggletag, "8" }, \
{ MODKEY|ShiftMask, XK_q, quit, NULL }, \
};

102
config.def.h Normal file
View File

@ -0,0 +1,102 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*";
static const char normbordercolor[] = "#cccccc";
static const char normbgcolor[] = "#cccccc";
static const char normfgcolor[] = "#000000";
static const char selbordercolor[] = "#0066ff";
static const char selbgcolor[] = "#0066ff";
static const char selfgcolor[] = "#ffffff";
static const unsigned int borderpx = 1; /* border pixel of windows */
static const unsigned int snap = 32; /* snap pixel */
static const Bool showbar = True; /* False means no bar */
static const Bool topbar = True; /* False means bottom bar */
/* tagging */
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
static const Rule rules[] = {
/* class instance title tags mask isfloating monitor */
{ "Gimp", NULL, NULL, 0, True, -1 },
{ "Firefox", NULL, NULL, 1 << 8, False, -1 },
};
/* layout(s) */
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
static const Bool resizehints = True; /* True means respect size hints in tiled resizals */
static const Layout layouts[] = {
/* symbol arrange function */
{ "[]=", tile }, /* first entry is default */
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
};
/* key definitions */
#define MODKEY Mod1Mask
#define TAGKEYS(KEY,TAG) \
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
/* commands */
static const char *dmenucmd[] = { "dmenu_run", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
static const char *termcmd[] = { "uxterm", NULL };
static Key keys[] = {
/* modifier key function argument */
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{ MODKEY, XK_b, togglebar, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } },
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} },
{ MODKEY, XK_Tab, view, {0} },
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
{ MODKEY, XK_space, setlayout, {0} },
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
{ MODKEY, XK_0, view, {.ui = ~0 } },
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
TAGKEYS( XK_1, 0)
TAGKEYS( XK_2, 1)
TAGKEYS( XK_3, 2)
TAGKEYS( XK_4, 3)
TAGKEYS( XK_5, 4)
TAGKEYS( XK_6, 5)
TAGKEYS( XK_7, 6)
TAGKEYS( XK_8, 7)
TAGKEYS( XK_9, 8)
{ MODKEY|ShiftMask, XK_q, quit, {0} },
};
/* button definitions */
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
static Button buttons[] = {
/* click event mask button function argument */
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
{ ClkWinTitle, 0, Button2, zoom, {0} },
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
{ ClkTagBar, 0, Button1, view, {0} },
{ ClkTagBar, 0, Button3, toggleview, {0} },
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
};

View File

@ -1,96 +0,0 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
#define BARPOS BarTop /* BarBot, BarOff */
#define BORDERPX 1
#define FONT "-*-fixed-medium-r-normal-*-13-*-*-*-*-*-*-*"
#define NORMBORDERCOLOR "#dddddd"
#define NORMBGCOLOR "#eeeeee"
#define NORMFGCOLOR "#222222"
#define SELBORDERCOLOR "#ff0000"
#define SELBGCOLOR "#006699"
#define SELFGCOLOR "#ffffff"
/* tagging */
#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 isfloating */ \
{ "Gimp", NULL, True }, \
{ "MPlayer", NULL, True }, \
{ "Acroread", NULL, True }, \
};
/* layout(s) */
#define LAYOUTS \
static Layout layout[] = { \
/* symbol function */ \
{ "[]=", tile }, /* first entry is default */ \
{ "><>", floating }, \
};
#define MASTERWIDTH 600 /* master width per thousand */
#define NMASTER 1 /* clients in master area */
#define SNAP 32 /* snap pixel */
/* key definitions */
#define MODKEY Mod1Mask
#define KEYS \
static Key key[] = { \
/* modifier key function argument */ \
{ MODKEY|ShiftMask, XK_Return, spawn, "exec xterm" }, \
{ MODKEY, XK_p, spawn, "exe=`dmenu_path | dmenu` && exec $exe" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_b, togglebar, NULL }, \
{ MODKEY, XK_h, incmasterw, "-32" }, \
{ MODKEY, XK_l, incmasterw, "32" }, \
{ MODKEY|ShiftMask, XK_j, incnmaster, "1" }, \
{ MODKEY|ShiftMask, XK_k, incnmaster, "-1" }, \
{ MODKEY, XK_j, focusclient, "1" }, \
{ MODKEY, XK_k, focusclient, "-1" }, \
{ MODKEY, XK_m, togglemax, NULL }, \
{ MODKEY, XK_Return, zoom, NULL }, \
{ MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \
{ MODKEY|ShiftMask, XK_c, killclient, NULL }, \
{ MODKEY, XK_0, view, NULL }, \
{ MODKEY, XK_1, view, "0" }, \
{ MODKEY, XK_2, view, "1" }, \
{ MODKEY, XK_3, view, "2" }, \
{ MODKEY, XK_4, view, "3" }, \
{ MODKEY, XK_5, view, "4" }, \
{ MODKEY, XK_6, view, "5" }, \
{ MODKEY, XK_7, view, "6" }, \
{ MODKEY, XK_8, view, "7" }, \
{ MODKEY, XK_9, view, "8" }, \
{ MODKEY|ControlMask, XK_1, toggleview, "0" }, \
{ MODKEY|ControlMask, XK_2, toggleview, "1" }, \
{ MODKEY|ControlMask, XK_3, toggleview, "2" }, \
{ MODKEY|ControlMask, XK_4, toggleview, "3" }, \
{ MODKEY|ControlMask, XK_5, toggleview, "4" }, \
{ MODKEY|ControlMask, XK_6, toggleview, "5" }, \
{ MODKEY|ControlMask, XK_7, toggleview, "6" }, \
{ MODKEY|ControlMask, XK_8, toggleview, "7" }, \
{ MODKEY|ControlMask, XK_9, toggleview, "8" }, \
{ MODKEY|ShiftMask, XK_0, tag, NULL }, \
{ MODKEY|ShiftMask, XK_1, tag, "0" }, \
{ MODKEY|ShiftMask, XK_2, tag, "1" }, \
{ MODKEY|ShiftMask, XK_3, tag, "2" }, \
{ MODKEY|ShiftMask, XK_4, tag, "3" }, \
{ MODKEY|ShiftMask, XK_5, tag, "4" }, \
{ MODKEY|ShiftMask, XK_6, tag, "5" }, \
{ MODKEY|ShiftMask, XK_7, tag, "6" }, \
{ MODKEY|ShiftMask, XK_8, tag, "7" }, \
{ MODKEY|ShiftMask, XK_9, tag, "8" }, \
{ MODKEY|ControlMask|ShiftMask, XK_1, toggletag, "0" }, \
{ MODKEY|ControlMask|ShiftMask, XK_2, toggletag, "1" }, \
{ MODKEY|ControlMask|ShiftMask, XK_3, toggletag, "2" }, \
{ MODKEY|ControlMask|ShiftMask, XK_4, toggletag, "3" }, \
{ MODKEY|ControlMask|ShiftMask, XK_5, toggletag, "4" }, \
{ MODKEY|ControlMask|ShiftMask, XK_6, toggletag, "5" }, \
{ MODKEY|ControlMask|ShiftMask, XK_7, toggletag, "6" }, \
{ MODKEY|ControlMask|ShiftMask, XK_8, toggletag, "7" }, \
{ MODKEY|ControlMask|ShiftMask, XK_9, toggletag, "8" }, \
{ MODKEY|ShiftMask, XK_q, quit, NULL }, \
};

View File

@ -1,5 +1,5 @@
# dwm version
VERSION = 4.2
VERSION = 5.8.1
# Customize below to fit your system
@ -10,20 +10,24 @@ MANPREFIX = ${PREFIX}/share/man
X11INC = /usr/X11R6/include
X11LIB = /usr/X11R6/lib
# Xinerama
XINERAMALIBS = -L${X11LIB} -lXinerama
XINERAMAFLAGS = -DXINERAMA
# includes and libs
INCS = -I. -I/usr/include -I${X11INC}
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS}
# flags
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
LDFLAGS = -s ${LIBS}
#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = -g ${LIBS}
CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
#CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS}
LDFLAGS = -g ${LIBS}
#LDFLAGS = -s ${LIBS}
# Solaris
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = ${LIBS}
#CFLAGS += -xtarget=ultra
# compiler and linker
CC = cc

134
draw.c
View File

@ -1,134 +0,0 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
#include <string.h>
/* static */
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;
}
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
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;
if(sel) {
drawtext(sel->name, dc.sel);
drawsquare(sel->ismax, sel->isfloating, dc.sel);
}
else
drawtext(NULL, 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;
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 */
XSetForeground(dpy, dc.gc, col[ColFG]);
if(dc.font.set)
XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
else
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
}
unsigned int
textw(const char *text) {
return textnw(text, strlen(text)) + dc.font.height;
}

150
dwm.1
View File

@ -5,27 +5,28 @@ dwm \- dynamic window manager
.B dwm
.RB [ \-v ]
.SH DESCRIPTION
dwm is a dynamic window manager for X. It manages windows in tiled and
floating layouts. Either layout can be applied dynamically, optimizing the
dwm is a dynamic window manager for X. It manages windows in tiled, monocle
and floating layouts. Either layout can be applied dynamically, optimising the
environment for the application in use and the task performed.
.P
In tiled 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 floating layout windows can be
resized and moved freely. Dialog windows are always managed floating,
regardless of the layout applied.
In tiled layouts windows are managed in a master and stacking area. The master
area contains the window which currently needs most attention, whereas the
stacking area contains all other windows. In monocle layout all windows are
maximised to the screen size. In floating layout windows can be resized and
moved freely. Dialog windows are always managed floating, regardless of the
layout applied.
.P
Windows are grouped by tags. Each window can be tagged with one or multiple
tags. Selecting certain tags displays all windows with these tags.
.P
dwm contains a small status bar which displays all available tags, the layout,
the title of the focused window, and the text read from standard input. A
floating window is indicated with an empty square and a maximized
floating window is indicated with a filled square before the windows
title. The selected tags are indicated with a different color. The tags of
the focused window are indicated with a filled square in the top left
corner. The tags which are applied to one or more windows are indicated
with an empty square in the top left corner.
Each screen contains a small status bar which displays all available tags, the
layout, the title of the focused window, and the text read from the root window
name property, if the screen is focused. A floating window is indicated with an
empty square and a maximised floating window is indicated with a filled square
before the windows title. The selected tags are indicated with a different
color. The tags of the focused window are indicated with a filled square in the
top left corner. The tags which are applied to one or more windows are
indicated with an empty square in the top left corner.
.P
dwm draws a small border around windows to indicate the focus state.
.SH OPTIONS
@ -35,8 +36,10 @@ prints version information to standard output, then exits.
.SH USAGE
.SS Status bar
.TP
.B Standard input
is read and displayed in the status text area.
.B X root window name
is read and displayed in the status text area. It can be set with the
.BR xsetroot (1)
command.
.TP
.B Button1
click on a tag label to display all windows with that tag, click on the layout
@ -54,13 +57,34 @@ click on a tag label adds/removes that tag to/from the focused window.
.TP
.B Mod1\-Shift\-Return
Start
.BR xterm.
.BR uxterm (1).
.TP
.B Mod1\-Return
Zooms/cycles current window to/from master area (tiled layout only).
.B Mod1\-,
Focus previous screen, if any.
.TP
.B Mod1\-.
Focus next screen, if any.
.TP
.B Mod1\-Shift\-,
Send focused window to previous screen, if any.
.TP
.B Mod1\-Shift\-.
Send focused window to next screen, if any.
.TP
.B Mod1\-b
Shows/hides the status bar.
Toggles bar on and off.
.TP
.B Mod1\-t
Sets tiled layout.
.TP
.B Mod1\-f
Sets floating layout.
.TP
.B Mod1\-m
Sets monocle layout.
.TP
.B Mod1\-space
Toggles between current and previous layout.
.TP
.B Mod1\-j
Focus next window.
@ -68,89 +92,75 @@ Focus next window.
.B Mod1\-k
Focus previous window.
.TP
.B Mod1\-Shift\-j
Increase the number of windows in the master area (tiled layout only).
.TP
.B Mod1\-Shift\-k
Decrease the number of windows in the master area (tiled layout only).
.B Mod1\-h
Decrease master area size.
.TP
.B Mod1\-l
Increase master area width (tiled layout only).
Increase master area size.
.TP
.B Mod1\-h
Decrease master area width (tiled layout only).
.TP
.B Mod1\-m
Toggles maximization of current window (floating layout only).
.TP
.B Mod1\-Shift\-[1..n]
Apply
.RB nth
tag to current window.
.TP
.B Mod1\-Shift\-0
Apply all tags to current window.
.TP
.B Mod1\-Control\-Shift\-[1..n]
Add/remove
.B nth
tag to/from current window.
.B Mod1\-Return
Zooms/cycles focused window to/from master area (tiled layouts only).
.TP
.B Mod1\-Shift\-c
Close focused window.
.TP
.B Mod1\-space
Toggle between tiled and floating layout (affects all windows).
.TP
.B Mod1\-Shift\-space
Toggle focused window between tiled and floating state (tiled layout only).
Toggle focused window between tiled and floating state.
.TP
.B Mod1\-Tab
Toggles to the previously selected tags.
.TP
.B Mod1\-Shift\-[1..n]
Apply nth tag to focused window.
.TP
.B Mod1\-Shift\-0
Apply all tags to focused window.
.TP
.B Mod1\-Control\-Shift\-[1..n]
Add/remove nth tag to/from focused window.
.TP
.B Mod1\-[1..n]
View all windows with
.BR nth
tag.
View all windows with nth tag.
.TP
.B Mod1\-0
View all windows with any tag.
.TP
.B Mod1\-Control\-[1..n]
Add/remove all windows with
.BR nth
tag to/from the view.
Add/remove all windows with nth tag to/from the view.
.TP
.B Mod1\-Shift\-q
Quit dwm.
.SS Mouse commands
.TP
.B Mod1\-Button1
Move current window while dragging (floating layout only).
Move focused window while dragging. Tiled windows will be toggled to the floating state.
.TP
.B Mod1\-Button2
Zooms/cycles current window to/from master area (tiled layout only).
Toggles focused window between floating and tiled state.
.TP
.B Mod1\-Button3
Resize current window while dragging (floating layout only).
Resize focused window while dragging. Tiled windows will be toggled to the floating state.
.SH CUSTOMIZATION
dwm is customized by creating a custom config.h and (re)compiling the source
code. This keeps it fast, secure and simple.
.SH SEE ALSO
.BR dmenu (1)
.SH BUGS
The status bar may display
.BR "EOF"
when dwm has been started by an X session manager like
.BR xdm (1),
because those close standard output before executing dwm.
.P
Java applications which use the XToolkit/XAWT backend may draw grey windows
only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
JDK 1.6 versions, because it assumes a reparenting window manager. As a workaround
you can use JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or you
can set the following environment variable (to use the older Motif
backend instead):
.BR AWT_TOOLKIT=MToolkit .
JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
environment variable
.BR AWT_TOOLKIT=MToolkit
(to use the older Motif backend instead) or running
.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
or
.B wmname LG3D
(to pretend that a non-reparenting window manager is running that the
XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
.BR _JAVA_AWT_WM_NONREPARENTING=1 .
.P
Recent GTK 2.10.9+ versions contain a broken
GTK 2.10.9+ versions contain a broken
.BR Save\-As
file dialog implementation,
which requests to reconfigure its window size in an endless loop. However, its

2020
dwm.c Normal file

File diff suppressed because it is too large Load Diff

149
dwm.h
View File

@ -1,149 +0,0 @@
/* See LICENSE file for copyright and license details.
*
* dynamic window manager is designed like any other X client as well. It is
* driven through handling X events. In contrast to other X clients, a window
* manager selects for SubstructureRedirectMask on the root window, to receive
* events about window (dis-)appearance. Only one X connection at a time is
* allowed to select for this event mask.
*
* Calls to fetch an X event from the event queue are blocking. Due reading
* status text from standard input, a select()-driven main loop has been
* implemented which selects for reads on the X connection and STDIN_FILENO to
* handle all data smoothly. The event handlers of dwm are organized in an
* array which is accessed whenever a new event has been fetched. This allows
* event dispatching in O(1) time.
*
* Each child of the root window is called a client, except windows which have
* set the override_redirect flag. Clients are organized in a global
* doubly-linked client list, the focus history is remembered through a global
* stack list. Each client contains an array of Bools of the same size as the
* global tags array to indicate the tags of a client. For each client dwm
* creates a small title window, which is resized whenever the (_NET_)WM_NAME
* properties are updated or the client is moved/resized.
*
* Keys and tagging rules are organized as arrays and defined in the config.h
* file. These arrays are kept static in event.o and tag.o respectively,
* because no other part of dwm needs access to them. The current layout is
* represented by the lt pointer.
*
* To understand everything else, start reading main.c:main().
*/
#include "config.h"
#include <X11/Xlib.h>
/* mask shorthands, used in event.c and client.c */
#define BUTTONMASK (ButtonPressMask | ButtonReleaseMask)
enum { BarTop, BarBot, BarOff }; /* bar position */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { ColBorder, ColFG, ColBG, ColLast }; /* color */
enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */
enum { WMProtocols, WMDelete, WMState, WMLast }; /* default atoms */
typedef struct Client Client;
struct Client {
char name[256];
int x, y, w, h;
int rx, ry, rw, rh; /* revert geometry */
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int minax, maxax, minay, maxay;
long flags;
unsigned int border, oldborder;
Bool isbanned, isfixed, ismax, isfloating;
Bool *tags;
Client *next;
Client *prev;
Client *snext;
Window win;
};
typedef struct {
int x, y, w, h;
unsigned long norm[ColLast];
unsigned long sel[ColLast];
Drawable drawable;
GC gc;
struct {
int ascent;
int descent;
int height;
XFontSet set;
XFontStruct *xfont;
} font;
} DC; /* draw context */
typedef struct {
const char *symbol;
void (*arrange)(void);
} Layout;
extern const char *tags[]; /* all tags */
char stext[256]; /* status text */
int screen, sx, sy, sw, sh; /* screen geometry */
int wax, way, wah, waw; /* windowarea geometry */
unsigned int bh, blw, bpos; /* bar height, bar layout label width, bar position */
unsigned int ntags, numlockmask; /* number of tags, dynamic lock mask */
void (*handler[LASTEvent])(XEvent *); /* event handler */
Atom wmatom[WMLast], netatom[NetLast];
Bool selscreen, *seltag; /* seltag is array of Bool */
Client *clients, *sel, *stack; /* global client list and stack */
Cursor cursor[CurLast];
DC dc; /* global draw context */
Display *dpy;
Layout *lt;
Window root, barwin;
/* client.c */
void attach(Client *c); /* attaches c to global client list */
void configure(Client *c); /* send synthetic configure event */
void detach(Client *c); /* detaches c from global client list */
void focus(Client *c); /* focus c if visible && !NULL, or focus top visible */
void killclient(const char *arg); /* kill sel nicely */
void manage(Window w, XWindowAttributes *wa); /* manage new client */
void resize(Client *c, int x, int y,
int w, int h, Bool sizehints); /* resize with given coordinates c*/
void togglefloating(const char *arg); /* toggles sel between floating/tiled state */
void updatesizehints(Client *c); /* update the size hint variables of c */
void updatetitle(Client *c); /* update the name of c */
void unmanage(Client *c); /* destroy c */
/* draw.c */
void drawstatus(void); /* draw the bar */
void drawtext(const char *text, unsigned long col[ColLast]); /* draw text */
unsigned int textw(const char *text); /* return the width of text in px*/
/* event.c */
void grabkeys(void); /* grab all keys defined in config.h */
/* layout.c */
void floating(void); /* arranges all windows floating */
void focusclient(const char *arg); /* focuses next(1)/previous(-1) visible client */
void incmasterw(const char *arg); /* increments the master width with arg's index value */
void incnmaster(const char *arg); /* increments nmaster with arg's index value */
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 */
void quit(const char *arg); /* quit dwm nicely */
int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */
/* tag.c */
void compileregs(void); /* initialize regexps of rules defined in config.h */
Bool isvisible(Client *c); /* returns True if client is visible */
void settags(Client *c, Client *trans); /* sets tags of c */
void tag(const char *arg); /* tags sel with arg's index */
void toggletag(const char *arg); /* toggles sel tags with arg's index */
void toggleview(const char *arg); /* toggles the tag with arg's index (in)visible */
void view(const char *arg); /* views the tag with arg's index */
/* util.c */
void *emallocz(unsigned int size); /* allocates zero-initialized memory, exits on error */
void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */
void spawn(const char *arg); /* forks a new subprocess with arg's cmd */

382
event.c
View File

@ -1,382 +0,0 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
#include <stdio.h>
#include <stdlib.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
/* static */
typedef struct {
unsigned long mod;
KeySym keysym;
void (*func)(const char *arg);
const char *arg;
} Key;
KEYS
#define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
#define MOUSEMASK (BUTTONMASK | PointerMotionMask)
static Client *
getclient(Window w) {
Client *c;
for(c = clients; c && c->win != w; c = c->next);
return c;
}
static void
movemouse(Client *c) {
int x1, y1, ocx, ocy, di, nx, ny;
unsigned int dui;
Window dummy;
XEvent ev;
ocx = nx = c->x;
ocy = ny = c->y;
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurMove], CurrentTime) != GrabSuccess)
return;
c->ismax = False;
XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
for(;;) {
XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask, &ev);
switch (ev.type) {
case ButtonRelease:
XUngrabPointer(dpy, CurrentTime);
return;
case ConfigureRequest:
case Expose:
case MapRequest:
handler[ev.type](&ev);
break;
case MotionNotify:
XSync(dpy, False);
nx = ocx + (ev.xmotion.x - x1);
ny = ocy + (ev.xmotion.y - y1);
if(abs(wax + nx) < SNAP)
nx = wax;
else if(abs((wax + waw) - (nx + c->w + 2 * c->border)) < SNAP)
nx = wax + waw - c->w - 2 * c->border;
if(abs(way - ny) < SNAP)
ny = way;
else if(abs((way + wah) - (ny + c->h + 2 * c->border)) < SNAP)
ny = way + wah - c->h - 2 * c->border;
resize(c, nx, ny, c->w, c->h, False);
break;
}
}
}
static void
resizemouse(Client *c) {
int ocx, ocy;
int nw, nh;
XEvent ev;
ocx = c->x;
ocy = c->y;
if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync,
None, cursor[CurResize], CurrentTime) != GrabSuccess)
return;
c->ismax = False;
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->border - 1, c->h + c->border - 1);
for(;;) {
XMaskEvent(dpy, MOUSEMASK | ExposureMask | SubstructureRedirectMask , &ev);
switch(ev.type) {
case ButtonRelease:
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0,
c->w + c->border - 1, c->h + c->border - 1);
XUngrabPointer(dpy, CurrentTime);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
return;
case ConfigureRequest:
case Expose:
case MapRequest:
handler[ev.type](&ev);
break;
case MotionNotify:
XSync(dpy, False);
if((nw = ev.xmotion.x - ocx - 2 * c->border + 1) <= 0)
nw = 1;
if((nh = ev.xmotion.y - ocy - 2 * c->border + 1) <= 0)
nh = 1;
resize(c, c->x, c->y, nw, nh, True);
break;
}
}
}
static void
buttonpress(XEvent *e) {
static char buf[32];
unsigned int i, x;
Client *c;
XButtonPressedEvent *ev = &e->xbutton;
buf[0] = 0;
if(barwin == ev->window) {
x = 0;
for(i = 0; i < ntags; i++) {
x += textw(tags[i]);
if(ev->x < x) {
snprintf(buf, sizeof buf, "%d", i);
if(ev->button == Button1) {
if(ev->state & MODKEY)
tag(buf);
else
view(buf);
}
else if(ev->button == Button3) {
if(ev->state & MODKEY)
toggletag(buf);
else
toggleview(buf);
}
return;
}
}
if(ev->x < x + blw)
switch(ev->button) {
case Button1:
setlayout(NULL);
break;
}
}
else if((c = getclient(ev->window))) {
focus(c);
if(CLEANMASK(ev->state) != MODKEY)
return;
if(ev->button == Button1 && (lt->arrange == floating || c->isfloating)) {
restack();
movemouse(c);
}
else if(ev->button == Button2)
zoom(NULL);
else if(ev->button == Button3
&& (lt->arrange == floating || c->isfloating) && !c->isfixed)
{
restack();
resizemouse(c);
}
}
}
static void
configurerequest(XEvent *e) {
Client *c;
XConfigureRequestEvent *ev = &e->xconfigurerequest;
XWindowChanges wc;
if((c = getclient(ev->window))) {
c->ismax = False;
if(ev->value_mask & CWBorderWidth)
c->border = ev->border_width;
if(c->isfixed || c->isfloating || (lt->arrange == floating)) {
if(ev->value_mask & CWX)
c->x = ev->x;
if(ev->value_mask & CWY)
c->y = ev->y;
if(ev->value_mask & CWWidth)
c->w = ev->width;
if(ev->value_mask & CWHeight)
c->h = ev->height;
if((c->x + c->w) > sw && c->isfloating)
c->x = sw / 2 - c->w / 2; /* center in x direction */
if((c->y + c->h) > sh && c->isfloating)
c->y = sh / 2 - c->h / 2; /* center in y direction */
if((ev->value_mask & (CWX | CWY))
&& !(ev->value_mask & (CWWidth | CWHeight)))
configure(c);
if(isvisible(c))
XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
}
else
configure(c);
}
else {
wc.x = ev->x;
wc.y = ev->y;
wc.width = ev->width;
wc.height = ev->height;
wc.border_width = ev->border_width;
wc.sibling = ev->above;
wc.stack_mode = ev->detail;
XConfigureWindow(dpy, ev->window, ev->value_mask, &wc);
}
XSync(dpy, False);
}
static void
configurenotify(XEvent *e) {
XConfigureEvent *ev = &e->xconfigure;
if (ev->window == root && (ev->width != sw || ev->height != sh)) {
sw = ev->width;
sh = ev->height;
XFreePixmap(dpy, dc.drawable);
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
XResizeWindow(dpy, barwin, sw, bh);
updatebarpos();
lt->arrange();
}
}
static void
destroynotify(XEvent *e) {
Client *c;
XDestroyWindowEvent *ev = &e->xdestroywindow;
if((c = getclient(ev->window)))
unmanage(c);
}
static void
enternotify(XEvent *e) {
Client *c;
XCrossingEvent *ev = &e->xcrossing;
if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
return;
if((c = getclient(ev->window)))
focus(c);
else if(ev->window == root) {
selscreen = True;
focus(NULL);
}
}
static void
expose(XEvent *e) {
XExposeEvent *ev = &e->xexpose;
if(ev->count == 0) {
if(barwin == ev->window)
drawstatus();
}
}
static void
keypress(XEvent *e) {
static unsigned int len = sizeof key / sizeof key[0];
unsigned int i;
KeySym keysym;
XKeyEvent *ev = &e->xkey;
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
for(i = 0; i < len; i++)
if(keysym == key[i].keysym
&& CLEANMASK(key[i].mod) == CLEANMASK(ev->state))
{
if(key[i].func)
key[i].func(key[i].arg);
}
}
static void
leavenotify(XEvent *e) {
XCrossingEvent *ev = &e->xcrossing;
if((ev->window == root) && !ev->same_screen) {
selscreen = False;
focus(NULL);
}
}
static void
mappingnotify(XEvent *e) {
XMappingEvent *ev = &e->xmapping;
XRefreshKeyboardMapping(ev);
if(ev->request == MappingKeyboard)
grabkeys();
}
static void
maprequest(XEvent *e) {
static XWindowAttributes wa;
XMapRequestEvent *ev = &e->xmaprequest;
if(!XGetWindowAttributes(dpy, ev->window, &wa))
return;
if(wa.override_redirect)
return;
if(!getclient(ev->window))
manage(ev->window, &wa);
}
static void
propertynotify(XEvent *e) {
Client *c;
Window trans;
XPropertyEvent *ev = &e->xproperty;
if(ev->state == PropertyDelete)
return; /* ignore */
if((c = getclient(ev->window))) {
switch (ev->atom) {
default: break;
case XA_WM_TRANSIENT_FOR:
XGetTransientForHint(dpy, c->win, &trans);
if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL)))
lt->arrange();
break;
case XA_WM_NORMAL_HINTS:
updatesizehints(c);
break;
}
if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
updatetitle(c);
if(c == sel)
drawstatus();
}
}
}
static void
unmapnotify(XEvent *e) {
Client *c;
XUnmapEvent *ev = &e->xunmap;
if((c = getclient(ev->window)))
unmanage(c);
}
/* extern */
void (*handler[LASTEvent]) (XEvent *) = {
[ButtonPress] = buttonpress,
[ConfigureRequest] = configurerequest,
[ConfigureNotify] = configurenotify,
[DestroyNotify] = destroynotify,
[EnterNotify] = enternotify,
[LeaveNotify] = leavenotify,
[Expose] = expose,
[KeyPress] = keypress,
[MappingNotify] = mappingnotify,
[MapRequest] = maprequest,
[PropertyNotify] = propertynotify,
[UnmapNotify] = unmapnotify
};
void
grabkeys(void) {
static unsigned int len = sizeof key / sizeof key[0];
unsigned int i;
KeyCode code;
XUngrabKey(dpy, AnyKey, AnyModifier, root);
for(i = 0; i < len; i++) {
code = XKeysymToKeycode(dpy, key[i].keysym);
XGrabKey(dpy, code, key[i].mod, root, True,
GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, code, key[i].mod | LockMask, root, True,
GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, code, key[i].mod | numlockmask, root, True,
GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, code, key[i].mod | numlockmask | LockMask, root, True,
GrabModeAsync, GrabModeAsync);
}
}

267
layout.c
View File

@ -1,267 +0,0 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
#include <stdlib.h>
unsigned int blw = 0;
Layout *lt = NULL;
/* static */
static unsigned int nlayouts = 0;
static unsigned int masterw = MASTERWIDTH;
static unsigned int nmaster = NMASTER;
static void
ban(Client *c) {
if (c->isbanned)
return;
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
c->isbanned = True;
}
static void
unban(Client *c) {
if (!c->isbanned)
return;
XMoveWindow(dpy, c->win, c->x, c->y);
c->isbanned = False;
}
static void
tile(void) {
unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;
Client *c;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
n++;
/* window geoms */
mh = (n > nmaster) ? wah / nmaster : wah / (n > 0 ? n : 1);
mw = (n > nmaster) ? (waw * masterw) / 1000 : waw;
th = (n > nmaster) ? wah / (n - nmaster) : 0;
tw = waw - mw;
for(i = 0, c = clients; c; c = c->next)
if(isvisible(c)) {
unban(c);
if(c->isfloating)
continue;
c->ismax = False;
nx = wax;
ny = way;
if(i < nmaster) {
ny += i * mh;
nw = mw - 2 * c->border;
nh = mh;
if(i + 1 == (n < nmaster ? n : nmaster)) /* remainder */
nh = wah - mh * i;
nh -= 2 * c->border;
}
else { /* tile window */
nx += mw;
nw = tw - 2 * c->border;
if(th > 2 * c->border) {
ny += (i - nmaster) * th;
nh = th;
if(i + 1 == n) /* remainder */
nh = wah - th * (i - nmaster);
nh -= 2 * c->border;
}
else /* fallback if th <= 2 * c->border */
nh = wah - 2 * c->border;
}
resize(c, nx, ny, nw, nh, False);
i++;
}
else
ban(c);
focus(NULL);
restack();
}
LAYOUTS
/* extern */
void
floating(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
ban(c);
focus(NULL);
restack();
}
void
focusclient(const char *arg) {
Client *c;
if(!sel || !arg)
return;
if(atoi(arg) < 0) {
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);
}
}
else {
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
incmasterw(const char *arg) {
int i;
if(lt->arrange != tile)
return;
if(!arg)
masterw = MASTERWIDTH;
else {
i = atoi(arg);
if(waw * (masterw + i) / 1000 >= waw - 2 * BORDERPX
|| waw * (masterw + i) / 1000 <= 2 * BORDERPX)
return;
masterw += i;
}
lt->arrange();
}
void
incnmaster(const char *arg) {
int i;
if(!arg)
nmaster = NMASTER;
else {
i = atoi(arg);
if((lt->arrange != tile) || (nmaster + i < 1)
|| (wah / (nmaster + i) <= 2 * BORDERPX))
return;
nmaster += i;
}
if(sel)
lt->arrange();
else
drawstatus();
}
void
initlayouts(void) {
unsigned int i, w;
lt = &layout[0];
nlayouts = sizeof layout / sizeof layout[0];
for(blw = i = 0; i < nlayouts; i++) {
w = textw(layout[i].symbol);
if(w > blw)
blw = w;
}
}
Client *
nexttiled(Client *c) {
for(; c && (c->isfloating || !isvisible(c)); c = c->next);
return c;
}
void
restack(void) {
Client *c;
XEvent ev;
drawstatus();
if(!sel)
return;
if(sel->isfloating || lt->arrange == floating)
XRaiseWindow(dpy, sel->win);
if(lt->arrange != floating) {
if(!sel->isfloating)
XLowerWindow(dpy, sel->win);
for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
if(c == sel)
continue;
XLowerWindow(dpy, c->win);
}
}
XSync(dpy, False);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
void
setlayout(const char *arg) {
int i;
if(!arg) {
lt++;
if(lt == layout + nlayouts)
lt = layout;
}
else {
i = atoi(arg);
if(i < 0 || i >= nlayouts)
return;
lt = &layout[i];
}
if(sel)
lt->arrange();
else
drawstatus();
}
void
togglebar(const char *arg) {
if(bpos == BarOff)
bpos = (BARPOS == BarOff) ? BarTop : BARPOS;
else
bpos = BarOff;
updatebarpos();
lt->arrange();
}
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 * BORDERPX, wah - 2 * BORDERPX, 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();
}

346
main.c
View File

@ -1,346 +0,0 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <X11/cursorfont.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
#include <X11/Xproto.h>
/* extern */
char stext[256];
int screen, sx, sy, sw, sh, wax, way, waw, wah;
unsigned int bh, bpos, ntags, numlockmask;
Atom wmatom[WMLast], netatom[NetLast];
Bool *seltag;
Bool selscreen = True;
Client *clients = NULL;
Client *sel = NULL;
Client *stack = NULL;
Cursor cursor[CurLast];
Display *dpy;
DC dc = {0};
Window root, barwin;
/* static */
static int (*xerrorxlib)(Display *, XErrorEvent *);
static Bool otherwm, readin;
static Bool running = True;
static void
cleanup(void) {
close(STDIN_FILENO);
while(stack) {
if(stack->isbanned)
XMoveWindow(dpy, stack->win, stack->x, stack->y);
unmanage(stack);
}
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
else
XFreeFont(dpy, dc.font.xfont);
XUngrabKey(dpy, AnyKey, AnyModifier, root);
XFreePixmap(dpy, dc.drawable);
XFreeGC(dpy, dc.gc);
XDestroyWindow(dpy, barwin);
XFreeCursor(dpy, cursor[CurNormal]);
XFreeCursor(dpy, cursor[CurResize]);
XFreeCursor(dpy, cursor[CurMove]);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
XSync(dpy, False);
free(seltag);
}
static unsigned long
initcolor(const char *colstr) {
Colormap cmap = DefaultColormap(dpy, screen);
XColor color;
if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color))
eprint("error, cannot allocate color '%s'\n", colstr);
return color.pixel;
}
static void
initfont(const char *fontstr) {
char *def, **missing;
int i, n;
missing = NULL;
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
if(missing) {
while(n--)
fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]);
XFreeStringList(missing);
}
if(dc.font.set) {
XFontSetExtents *font_extents;
XFontStruct **xfonts;
char **font_names;
dc.font.ascent = dc.font.descent = 0;
font_extents = XExtentsOfFontSet(dc.font.set);
n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names);
for(i = 0, dc.font.ascent = 0, dc.font.descent = 0; i < n; i++) {
if(dc.font.ascent < (*xfonts)->ascent)
dc.font.ascent = (*xfonts)->ascent;
if(dc.font.descent < (*xfonts)->descent)
dc.font.descent = (*xfonts)->descent;
xfonts++;
}
}
else {
if(dc.font.xfont)
XFreeFont(dpy, dc.font.xfont);
dc.font.xfont = NULL;
if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)))
eprint("error, cannot load font: '%s'\n", fontstr);
dc.font.ascent = dc.font.xfont->ascent;
dc.font.descent = dc.font.xfont->descent;
}
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;
unsigned int mask;
Window w;
XModifierKeymap *modmap;
XSetWindowAttributes wa;
/* init atoms */
wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
PropModeReplace, (unsigned char *) netatom, NetLast);
/* init cursors */
cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
/* init modifier map */
numlockmask = 0;
modmap = XGetModifierMapping(dpy);
for (i = 0; i < 8; i++)
for (j = 0; j < modmap->max_keypermod; j++) {
if(modmap->modifiermap[i * modmap->max_keypermod + j]
== XKeysymToKeycode(dpy, XK_Num_Lock))
numlockmask = (1 << i);
}
XFreeModifiermap(modmap);
/* select for events */
wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
| EnterWindowMask | LeaveWindowMask | StructureNotifyMask;
wa.cursor = cursor[CurNormal];
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
XSelectInput(dpy, root, wa.event_mask);
grabkeys();
compileregs();
for(ntags = 0; tags[ntags]; ntags++);
seltag = emallocz(sizeof(Bool) * ntags);
seltag[0] = True;
/* style */
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);
sh = DisplayHeight(dpy, screen);
initlayouts();
/* bar */
dc.h = bh = dc.font.height + 2;
wa.override_redirect = 1;
wa.background_pixmap = ParentRelative;
wa.event_mask = ButtonPressMask | ExposureMask;
barwin = XCreateWindow(dpy, root, sx, sy, sw, bh, 0,
DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
XDefineCursor(dpy, barwin, cursor[CurNormal]);
bpos = BARPOS;
updatebarpos();
XMapRaised(dpy, barwin);
strcpy(stext, "dwm-"VERSION);
/* pixmap for everything */
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
dc.gc = XCreateGC(dpy, root, 0, 0);
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
if(!dc.font.set)
XSetFont(dpy, dc.gc, dc.font.xfont->fid);
/* multihead support */
selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
}
/*
* Startup Error handler to check if another window manager
* is already running.
*/
static int
xerrorstart(Display *dsply, XErrorEvent *ee) {
otherwm = True;
return -1;
}
/* extern */
void
quit(const char *arg) {
readin = running = False;
}
void
updatebarpos(void) {
XEvent ev;
wax = sx;
way = sy;
wah = sh;
waw = sw;
switch(bpos) {
default:
wah -= bh;
way += bh;
XMoveWindow(dpy, barwin, sx, sy);
break;
case BarBot:
wah -= bh;
XMoveWindow(dpy, barwin, sx, sy + wah);
break;
case BarOff:
XMoveWindow(dpy, barwin, sx, sy - bh);
break;
}
XSync(dpy, False);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
/* There's no way to check accesses to destroyed windows, thus those cases are
* ignored (especially on UnmapNotify's). Other types of errors call Xlibs
* default error handler, which may call exit.
*/
int
xerror(Display *dpy, XErrorEvent *ee) {
if(ee->error_code == BadWindow
|| (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch)
|| (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable)
|| (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable)
|| (ee->request_code == X_PolySegment && ee->error_code == BadDrawable)
|| (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch)
|| (ee->request_code == X_GrabKey && ee->error_code == BadAccess)
|| (ee->request_code == X_CopyArea && ee->error_code == BadDrawable))
return 0;
fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n",
ee->request_code, ee->error_code);
return xerrorxlib(dpy, ee); /* may call exit */
}
int
main(int argc, char *argv[]) {
char *p;
int r, xfd;
fd_set rd;
XEvent ev;
if(argc == 2 && !strcmp("-v", argv[1]))
eprint("dwm-"VERSION", © 2006-2007 A. R. Garbe, S. van Dijk, J. Salmi, P. Hruby, S. Nagy\n");
else if(argc != 1)
eprint("usage: dwm [-v]\n");
setlocale(LC_CTYPE, "");
if(!(dpy = XOpenDisplay(0)))
eprint("dwm: cannot open display\n");
xfd = ConnectionNumber(dpy);
screen = DefaultScreen(dpy);
root = RootWindow(dpy, screen);
otherwm = False;
XSetErrorHandler(xerrorstart);
/* this causes an error if some other window manager is running */
XSelectInput(dpy, root, SubstructureRedirectMask);
XSync(dpy, False);
if(otherwm)
eprint("dwm: another window manager is already running\n");
XSync(dpy, False);
XSetErrorHandler(NULL);
xerrorxlib = XSetErrorHandler(xerror);
XSync(dpy, False);
setup();
drawstatus();
scan();
/* main event loop, also reads status text from stdin */
XSync(dpy, False);
readin = True;
while(running) {
FD_ZERO(&rd);
if(readin)
FD_SET(STDIN_FILENO, &rd);
FD_SET(xfd, &rd);
if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) {
if(errno == EINTR)
continue;
eprint("select failed\n");
}
if(FD_ISSET(STDIN_FILENO, &rd)) {
switch(r = read(STDIN_FILENO, stext, sizeof stext - 1)) {
case -1:
strncpy(stext, strerror(errno), sizeof stext - 1);
stext[sizeof stext - 1] = '\0';
readin = False;
break;
case 0:
strncpy(stext, "EOF", 4);
readin = False;
break;
default:
for(stext[r] = '\0', p = stext + strlen(stext) - 1; p >= stext && *p == '\n'; *p-- = '\0');
for(; p >= stext && *p != '\n'; --p);
if(p > stext)
strncpy(stext, p + 1, sizeof stext);
}
drawstatus();
}
while(XPending(dpy)) {
XNextEvent(dpy, &ev);
if(handler[ev.type])
(handler[ev.type])(&ev); /* call handler */
}
}
cleanup();
XCloseDisplay(dpy);
return 0;
}

152
tag.c
View File

@ -1,152 +0,0 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xutil.h>
/* static */
typedef struct {
const char *prop;
const char *tags;
Bool isfloating;
} 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->isfloating = rule[i].isfloating;
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(const char *arg) {
int i;
if(!sel)
return;
for(i = 0; i < ntags; i++)
sel->tags[i] = arg == NULL;
i = arg ? atoi(arg) : 0;
if(i >= 0 && i < ntags)
sel->tags[i] = True;
lt->arrange();
}
void
toggletag(const char *arg) {
int i, j;
if(!sel)
return;
i = arg ? atoi(arg) : 0;
sel->tags[i] = !sel->tags[i];
for(j = 0; j < ntags && !sel->tags[j]; j++);
if(j == ntags)
sel->tags[i] = True;
lt->arrange();
}
void
toggleview(const char *arg) {
int i, j;
i = arg ? atoi(arg) : 0;
seltag[i] = !seltag[i];
for(j = 0; j < ntags && !seltag[j]; j++);
if(j == ntags)
seltag[i] = True; /* cannot toggle last view */
lt->arrange();
}
void
view(const char *arg) {
int i;
for(i = 0; i < ntags; i++)
seltag[i] = arg == NULL;
i = arg ? atoi(arg) : 0;
if(i >= 0 && i < ntags)
seltag[i] = True;
lt->arrange();
}

52
util.c
View File

@ -1,52 +0,0 @@
/* See LICENSE file for copyright and license details. */
#include "dwm.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
/* extern */
void *
emallocz(unsigned int size) {
void *res = calloc(1, size);
if(!res)
eprint("fatal: could not malloc() %u bytes\n", size);
return res;
}
void
eprint(const char *errstr, ...) {
va_list ap;
va_start(ap, errstr);
vfprintf(stderr, errstr, ap);
va_end(ap);
exit(EXIT_FAILURE);
}
void
spawn(const char *arg) {
static char *shell = NULL;
if(!shell && !(shell = getenv("SHELL")))
shell = "/bin/sh";
if(!arg)
return;
/* The double-fork construct avoids zombie processes and keeps the code
* clean from stupid signal handlers. */
if(fork() == 0) {
if(fork() == 0) {
if(dpy)
close(ConnectionNumber(dpy));
setsid();
execl(shell, shell, "-c", arg, (char *)NULL);
fprintf(stderr, "dwm: execl '%s -c %s'", shell, arg);
perror(" failed");
}
exit(0);
}
wait(0);
}