Compare commits

...

510 Commits
1.9 ... 4.6

Author SHA1 Message Date
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
2c6be7239f referred to LICENSE file 2007-05-30 12:19:28 +02:00
d934296476 Jukka also belongs to Copyright holders after all he has contributed and done for dwm, updated -v as well 2007-05-30 12:10:01 +02:00
39ae286861 applied Jukkas patch 2007-05-30 08:57:44 +02:00
59e65d1709 changed -v output (now also anydot and nsz are contained in this output) 2007-05-29 13:53:08 +02:00
9fdd2cd1a9 added nsz to copyright holders as well, because he did a lot recently 2007-05-29 11:57:08 +02:00
e1deda9e04 added anydot to Copyright holders, because he contributed a lot recently 2007-05-29 11:47:55 +02:00
199a601611 applied anydot's 3 minor patches, thank you anydot 2007-05-29 11:35:20 +02:00
492c6f10fc applied Sanders patch 2007-05-28 15:05:47 +02:00
caa7ab5362 applied anydots proposal to let togglefloating restore fixed windows 2007-05-25 15:28:10 +02:00
f3e672efd8 fix if n < nmaster of remainer calculation for master windows 2007-05-24 16:25:09 +02:00
02d5dddc00 rev 900, cool 2007-05-24 15:55:28 +02:00
c789941bba fo 2007-05-24 15:53:48 +02:00
e45b3ced67 calculating the remainder for master and stack area correctly 2007-05-24 15:40:07 +02:00
5a9af492ae fixed issue reported by Christian Garbs 2007-05-24 11:35:32 +02:00
32563abe86 removed the only one and superfloues strncmp 2007-05-23 22:33:46 +02:00
70c7b432ea foo 2007-05-23 14:51:51 +02:00
69dfcaa317 reverted last change after Sander pointed out the original decision 2007-05-23 07:49:05 +02:00
6ee8e3e93b applied anydots remark of togglefloating() 2007-05-23 07:47:20 +02:00
8439369db9 applied Szabolcs proposal for zoom() as well 2007-05-22 11:29:59 +02:00
81658eaab3 applied Szabolcs proposal to simplify setlayout() 2007-05-22 11:29:04 +02:00
81aebf8cae Added tag 4.1 for changeset 00f4180df72b 2007-05-21 14:37:26 +02:00
fa32f02a43 no that change breaks fullscreen apps 2007-05-16 22:05:02 +02:00
598e22907e raise barwin in restack, that's the most elegant solution I think 2007-05-16 21:59:53 +02:00
1e826ddd3e simplification 2007-05-15 14:06:18 +02:00
a967d7f664 raising the barwin has no effect becasue of restack 2007-05-15 13:58:29 +02:00
ce450c5bf1 fix 2007-05-15 13:56:47 +02:00
8f5f7a5b5a barwindow raising 2007-05-15 13:56:06 +02:00
5ad2828c57 using BarTop as fallback if BARPOS is set to BarOff as default for toggling 2007-05-15 13:49:43 +02:00
b896b58d6d removed strip, added -s to LDFLAGS 2007-05-15 13:44:04 +02:00
fef6c5c66b added new Mod1-b functionality to dwm(1) 2007-05-15 13:42:07 +02:00
37e062b0ed another fix, call lt->arrange() in togglebar only 2007-05-15 13:36:04 +02:00
cf58091736 fixed bpos init 2007-05-15 13:23:51 +02:00
2aef8b9b4c made bar togglalble 2007-05-15 12:09:18 +02:00
d96307cbe4 thanks to Jukka 2007-05-14 16:24:01 +02:00
124866e269 added the GTK Save-As bug report to BUGS section of dwm(1) 2007-05-14 13:42:00 +02:00
ab3d6a7dfe applied dfenze cleanups, fixed some comments in dwm.h 2007-05-14 11:54:30 +02:00
c67dbb28e4 small fix of fix 2007-05-10 13:49:17 +02:00
b8bccb4ac5 fixed a potential security flaw 2007-05-10 13:47:44 +02:00
b6b2f584ec applied Maarten Maathuis recenter-patch for floating clients only requesting new width and height exceeding the screen space 2007-05-09 11:31:14 +02:00
f7bdb39d9e s/remain/remainder/ 2007-05-09 10:12:55 +02:00
ecd9c3e222 fixing remaining space calculation 2007-05-09 10:11:34 +02:00
216099d072 thanks to Juka to check -Wall ;) 2007-05-08 08:52:34 +02:00
fc2e3eae20 next version is 4.1 2007-05-07 13:14:55 +02:00
f9e7a33019 applied patch of Paul Liu to allow onthefly resizing due to xrandr changes 2007-05-07 13:12:41 +02:00
7c9fa2566f Added tag 4.0 for changeset 018c38468422 2007-04-19 09:26:44 +02:00
22399a3bc0 fixed the border issue for mplayer, ff is definately broken when using F11 (fullscreen mode) 2007-04-19 09:24:25 +02:00
ad2508f957 touch border 2007-04-19 08:53:40 +02:00
b078599833 set border at manage time 2007-04-18 21:11:46 +02:00
1e80207876 using pixelcarnage-monospace (proggyclean), because this is better to the eyes 2007-04-18 17:29:38 +02:00
464fc2cd18 changed border handling 2007-04-17 14:56:46 +02:00
be8d6d40f6 changing order of c->border restorage 2007-04-13 12:22:00 +02:00
f0c2353393 I used 2006 in other places as well 2007-04-13 11:41:39 +02:00
a730213c3b yet another fix of copyright compactisition 2007-04-13 11:40:09 +02:00
399993c6b5 making Copyright notices more compact 2007-04-13 11:32:38 +02:00
4d318060a2 next version will be 4.0, so don't expect it within the next days 2007-04-11 15:18:16 +02:00
540d5eed46 make also transients floating when we do not know the main window 2007-04-11 15:17:29 +02:00
7d071ce2bd Added tag 3.9 for changeset 55478328b242 2007-04-02 11:11:47 +02:00
93aeaa53c9 next version will be 3.9, but don't expect it this week 2007-03-29 15:18:30 +02:00
06f9f346e6 add an additional check in resize() to prevent a crash of dwm 2007-03-29 15:17:57 +02:00
5c48012ad2 Added tag 3.8 for changeset 2ea201354cf0 2007-03-05 11:54:59 +01:00
a686c9ccd2 we don't need to set the font all the time 2007-03-02 15:14:40 +01:00
9ca5c3b108 some changes to updatesizehints, I don't change the aspect ratio algorithm now - I can't think, it is a mess 2007-03-01 12:33:45 +01:00
bab5b1178d removed sendevent 2007-02-26 16:24:51 +01:00
ee8fb0c6e4 Escape -s in dwm.1 2007-02-26 10:47:11 +01:00
0d9d3e79e9 Added tag 3.7 for changeset baee494346e5 2007-02-24 15:41:05 +01:00
12280f0253 prepared 3.7, ready to rambo 2007-02-24 15:40:50 +01:00
a58731e835 removed an unnecessary newline 2007-02-24 14:08:27 +01:00
1df45593ed removed superfluous externs (except for tags, because tags is defined in the source) 2007-02-24 14:06:35 +01:00
2122e39ce1 replacing Mod1-i with Mod1-Shift-j, Mod1-d with Mod1-Shift-k 2007-02-23 13:37:55 +01:00
e70139428a oops, small bugfix in my config 2007-02-23 11:17:07 +01:00
3d1d75a224 default masterwidth should also be at 600 2007-02-23 11:13:57 +01:00
35f08f4231 changed order if h/l 2007-02-23 11:09:18 +01:00
0ea0343a63 well I agree to several people claiming h/j/k/l is the better default than Tab/S-Tab/g/s for focus and master resizing 2007-02-23 10:40:32 +01:00
338c083858 renamed untiled into floating, keeping tiled instead of tiling (afaik tiled sounds more correct) - English speakers convinced me 2007-02-22 22:10:16 +01:00
671442e89d hahaha, untiled and non-untiled sounded really cumbersome 2007-02-22 18:22:51 +01:00
8d111632f5 made Fnt an anonymous inner struct 2007-02-22 18:17:07 +01:00
fe5acb939a made Fnt an anonymous inner struct 2007-02-22 18:08:31 +01:00
cac492b0e9 nah, I don't want 640 as MASTERWIDTH 2007-02-22 17:58:45 +01:00
ef9b3e173c using MASTERWIDTH=640 and 32px steps by default (incmasterw()) 2007-02-22 17:52:45 +01:00
5a13632afb simplified focusclient() 2007-02-22 17:51:34 +01:00
587100873a renamed versatile into untiled 2007-02-22 17:43:41 +01:00
27b0595af7 merged focus{prev.next} into focusclient(1/-1) 2007-02-22 15:25:19 +01:00
12d5a26fd2 made dwm.h more tidy (thx Jukka for the zoom() hint) 2007-02-22 15:06:56 +01:00
89b7f1503e oops 2007-02-22 12:16:58 +01:00
5711609203 small bugfix 2007-02-22 12:15:48 +01:00
825b7c3eb1 fixed some issues due to the Arg->const char * transition 2007-02-22 12:00:02 +01:00
ba96131af0 restoring default keybindings as Sander complained 2007-02-22 11:45:03 +01:00
2c477cf661 replaced Arg union with const char *arg, seems cleaner to me, even if we need atoi() in some places 2007-02-22 11:42:08 +01:00
986ca73074 re-added xterm to config.default.h 2007-02-22 11:15:31 +01:00
288098893c removed button4/5-bindings for incnmaster on mode label - that is misleading 2007-02-22 11:09:44 +01:00
cb9607c284 fixed order of key bindings described in dwm.1 2007-02-22 11:06:37 +01:00
4bd4f421d3 status needs update even in togglemax() - since we got an indicator for this 2007-02-22 10:59:42 +01:00
84432e6b36 reusing drawsquare for client title, empty square before title means versatile window, filled square before title means versatile maximized window. 2007-02-22 10:57:19 +01:00
1a25414ace dwm draws a small caret before the client title if it's a versatile client 2007-02-22 10:52:57 +01:00
3171371498 nah grouped keybindings by context 2007-02-22 09:29:38 +01:00
92105e7862 fixed exit condition in togglemax() 2007-02-22 08:08:36 +01:00
6ee9f13457 fixing missing extern declars in dwm.h for {de,at}tach() 2007-02-22 08:02:04 +01:00
352cae4380 several changes, made togglemax extern and separated it from zoom() - moved zoom() and togglemax() into layout.c, changed void (*func)(Arg *) into void (*func)(Arg), changed default keybindings of focusnext/focusprev and incmasterw to h/j/k/l accordingly, made keys in config*h appear alphabetically (special keys first), renamed resizemaster into incmasterw, renamed MASTER into MASTERWIDTH 2007-02-22 07:59:13 +01:00
b3b58c08e4 just ignore the FD_ISSET check in main.c of xfd, just call XPending (which does the same afair) 2007-02-21 21:36:54 +01:00
204f0a340d optimizing background color of terminals 2007-02-21 17:00:06 +01:00
78666b99b8 using 333 as background, hey proggyclean is really good 2007-02-21 16:57:21 +01:00
0bdcf75e25 switching to 13pt proggyclean (this fits better my 1920x1200 resolution than 12pt terminus which is too small or 14pt terminus which is too fat) 2007-02-21 16:53:25 +01:00
f1009285d8 using smaller font 2007-02-21 16:47:53 +01:00
f76b3a4685 using a green selborder 2007-02-21 15:47:52 +01:00
84ae6e12eb reverting to bg 555 2007-02-21 13:31:04 +01:00
784659565a s/555/357/ for SELCOLOR 2007-02-21 13:29:02 +01:00
7ae0c198b3 switching to urxvtcd for the moment (the uxterm flicker makes me headaches, st is really highest prio now) 2007-02-21 13:24:37 +01:00
dc6623728d Added tag 3.6.1 for changeset 20ec6976cee1 2007-02-21 12:09:10 +01:00
7541f1ad49 creating 3.6.1 2007-02-21 12:08:18 +01:00
74cbbe5f35 reverted accidental removal of sx, sy 2007-02-21 11:49:06 +01:00
52f0b9e2e3 removed some global vars which should be static instead 2007-02-21 11:45:51 +01:00
29c26b88e7 moved focus{next,prev} and nexttiled from client.c to layout.c (because those are not client-specific), moved toggleversatile() from layout.c to client.c (because those are client-specific) 2007-02-21 11:39:57 +01:00
f196b71e4d cleaned up and commented the config.*.h 2007-02-21 11:30:52 +01:00
ab83872134 Added tag 3.6 for changeset 75b1b25fe0d7e29400baf30568153f668324928b 2007-02-21 11:05:27 +01:00
ad4962c7eb fixed quoting and a comment 2007-02-21 11:04:33 +01:00
d180ba418c renamed setfont to initfont, getcolor to initcolor 2007-02-20 13:56:21 +01:00
138b7fbd05 fixed order 2007-02-20 13:48:02 +01:00
e7508783e8 added draw.c again (except getcolor and setfont which are helpers in main.c) 2007-02-20 13:46:21 +01:00
f4d15b1fec separating drawsquare from drawtext, made drawtext extern 2007-02-20 13:40:31 +01:00
355beb53f0 rechecked with OpenBSD 2007-02-20 11:26:16 +01:00
8012fcf333 split screen.c into layout.c and tag.c (because the view is an implicit mixture of both) 2007-02-20 10:49:53 +01:00
6bc4556ebd using eprint instead of fputs 2007-02-19 21:17:54 +01:00
879241c05c replaced togglelayout with setlayout 2007-02-19 18:33:15 +01:00
3794c62945 changed some odering in config*.h 2007-02-19 18:19:43 +01:00
5a03daf47f renamed Client->versatile and Rule->versatile into Client->isversatile resp. Rule->isversatile 2007-02-19 17:18:24 +01:00
6d5f67a092 renames swim[ming] into versatile 2007-02-19 17:12:26 +01:00
cee56d3863 renamed floating into swimming (this does not clash with C naming conventions and fits better the fish symbol) - also in man page 2007-02-19 17:00:32 +01:00
7c4da24465 removed debug compile flags 2007-02-19 16:41:47 +01:00
cdbc84b9a8 introduced Layout struct 2007-02-19 16:40:36 +01:00
b2f895166a some more code polishing 2007-02-19 16:07:22 +01:00
ebe68f650a forgot an extern declaration 2007-02-19 16:04:38 +01:00
df9fd28f9a bugfix of transient handling 2007-02-19 15:57:08 +01:00
e9c49ddd7a removed procevent, more refactoring 2007-02-19 15:23:35 +01:00
f8415019d4 draw.c is useless (belongs to main.c now) 2007-02-19 15:17:31 +01:00
238dd5d2b1 renamed view.c into screen.c 2007-02-19 15:05:29 +01:00
64871a7045 renamed manage.c to view.c 2007-02-19 14:57:32 +01:00
2e95bc0413 renamed Rule members, renamed RReg into Regexps 2007-02-19 14:52:19 +01:00
4cdbd523e5 merged tag.c, view.c and tile.c to manage.c 2007-02-19 14:44:05 +01:00
b3d7e07f18 some more refactoring 2007-02-19 13:53:40 +01:00
30af19d442 added some new convenience functions 2007-02-19 13:42:39 +01:00
5d9146ff37 some more refactoring 2007-02-19 13:17:49 +01:00
5cc27f1b3c introduced tile.c, some refactoring of functions 2007-02-19 13:00:29 +01:00
39ed54a468 simplified configurerequest to a bare minimum, removed wrong ban() calls 2007-02-19 11:34:12 +01:00
b61f91361c fixed configurerequest according to Jukkas complains 2007-02-19 11:22:47 +01:00
3167373512 fixed configurerequest according to the problem Jukka reported 2007-02-19 11:03:27 +01:00
4cff744438 don't resize master if not in tiled mode 2007-02-19 10:51:11 +01:00
c3527bea57 removed useless space 2007-02-16 16:51:27 +01:00
de6695792a well, resize should be called in dofloat anyways ;) 2007-02-16 16:41:22 +01:00
6e22ccf7b1 removed ugly ban(), extended resize() that it only resets the size if necessary, added border_width commit to manage() 2007-02-16 16:38:40 +01:00
8a5f002c41 removed getnext/getprev, redundant 2007-02-16 10:20:34 +01:00
3ce8c9f338 added ban() which takes care than a banned window is not banned again... (this reduces the overall ConfigureNotify's to clients) 2007-02-14 14:01:12 +01:00
0d095ae2ff Added tag 3.5 for changeset 63ad05e7f9e1 2007-02-14 09:35:48 +01:00
2d7f59424c simplifying regexps in config samples 2007-02-14 09:31:23 +01:00
e256afe31e made for/if/else constructs more consistent, some code polishing 2007-02-14 09:09:18 +01:00
64cfebc5e7 made configurerequest more tidy 2007-02-14 08:14:41 +01:00
7a095d0ce2 I didn't knew of c->isfixed, that should fix Jukkas issue with gkrellm ;) 2007-02-13 22:53:58 +01:00
5052c538d9 making it more sure that transient checks will work in any case 2007-02-13 22:24:27 +01:00
22d8c6fd18 stupid me, one needs to set c->{x,y,w,h} in configurerequest obviously ;) 2007-02-13 14:59:58 +01:00
71857b87ee simplified configurerequest 2007-02-13 13:39:33 +01:00
6ba400ee0f yet another consistency fix of dwm 2007-02-12 17:20:51 +01:00
35e65ea640 I don't see any reason why we should select for input on override-redirect windows? 2007-02-12 16:41:46 +01:00
d0d986dd0e bugfix of bugfix (thx to Sander) 2007-02-12 14:20:47 +01:00
9685e7dbc2 fixed a bug 2007-02-12 13:04:29 +01:00
37f39afb8e during writing 2wm.1 I noticed some bugs in dwm.1 2007-02-12 11:42:32 +01:00
dc9f62f393 removing all EnterNotifys after resize 2007-02-12 10:21:26 +01:00
7055315725 added pointer warp on drop in resize 2007-02-12 10:19:52 +01:00
fd995dac78 pneubeck pointed out an obvious thing, that a second p = stext + strlen(stext) - 1 is unnecessary 2007-02-09 14:56:19 +01:00
e5765cdd84 treating acroread and mplayer floating by default 2007-02-09 11:58:37 +01:00
8d0e58f80b adapting John Grahor's patch to dwm-3.5 2007-02-09 09:54:08 +01:00
8fcd1bfda8 fixed copyright notice in Makefile 2007-02-08 14:09:52 +01:00
e39e697998 fixed order of Bool declarations 2007-02-08 13:39:33 +01:00
d2dd58eabd added TOPBAR option for making the bar appear what the user likes 2007-02-08 11:48:01 +01:00
c6fc6b173d next version is 3.5 2007-02-08 11:11:15 +01:00
4590d7877c making the bar appear at bottom 2007-02-08 11:08:40 +01:00
f577fe4e27 Added tag 3.4 for changeset 9ede7b2d2450 2007-02-07 12:42:35 +01:00
9ed5de00b6 removed debug flags 2007-02-07 12:37:21 +01:00
28ffff801b replaced getproto with a saner function, now old-school artifacts of WM times in the early 90s completely disappeared, no punned pointer warning anymore ;) 2007-02-07 12:37:06 +01:00
44ef3f5a07 yet another fix 2007-02-06 15:29:19 +01:00
dafbd0dcb0 simplification 2007-02-06 15:28:25 +01:00
2ddc78720a implemented aspect ratio support of windows 2007-02-06 15:22:13 +01:00
7ece30ebc0 made some changes more concistent 2007-02-05 11:19:46 +01:00
3d48f33025 got rid of LD (inspired by JGs patch to wmii) 2007-02-05 11:09:53 +01:00
19fd903d40 applied apm's patch proposal, getting rid of XDrawLines 2007-02-05 11:05:16 +01:00
5732e471ae Added tag 3.3 for changeset 0f91934037b0 2007-02-01 08:23:00 +01:00
042297b27b applied Sander's drop_bh patch 2007-01-31 20:08:55 +01:00
a5cb80b86c handling WM_STATE seems to make DnD in gtk/qt apps working, well let's handle this in dwm as well 2007-01-28 20:29:41 +01:00
7e98db251e regarding to http://plan9.bell-labs.com/sources/contrib/rsc/man.ps the BUGS section should appear after SEE ALSO section. 2007-01-26 12:41:15 +01:00
bced9077f9 renamed CAVEATS into BUGS 2007-01-26 12:31:57 +01:00
82fed986f9 Added tag 3.2.2 for changeset d3876aa79292 2007-01-25 10:05:02 +01:00
2c1db7ed35 prepared yet another hotfix release 2007-01-25 09:59:48 +01:00
ea4827a578 Added tag 3.2.1 for changeset f2cabc83a18f 2007-01-24 17:25:37 +01:00
55be4d6137 hotfix release 3.2.1 2007-01-24 17:25:30 +01:00
1f18466409 applied offscreen appearance hotfix 2007-01-24 17:24:55 +01:00
b65a1e3379 Added tag 3.2 for changeset 4ce65f61f01b 2007-01-24 12:12:29 +01:00
87836d79ef renamed activescreen into selscreen 2007-01-23 17:12:15 +01:00
c8a12a0852 implemented Sanders remarks 2007-01-23 13:10:35 +01:00
71b84c2114 small changes 2007-01-23 12:29:17 +01:00
edb2660a2e removed a blank line 2007-01-23 12:04:22 +01:00
17ec726b49 this version should also work with cornercases (like unmanage during !issel, etc.) 2007-01-23 12:00:49 +01:00
373b11de11 I think this is the best solution of multihead support 2007-01-23 11:49:16 +01:00
04a2b74529 darker border 2007-01-22 16:02:37 +01:00
fcd98308ba this variant is known to work, but focus() is ugly - we need in general a better way to handle multihead, this issel-stuff looks awkward (maybe it might be a good idea to set sel to NULL but to introduce a Client *revert which is set if a screen is unfocused, have to think about it further). 2007-01-22 10:35:58 +01:00
b233089815 applied Sanders all5.patch (thanks for your weekend session, Sander!) 2007-01-22 10:22:58 +01:00
201c56f6d3 leavenotify also don't needs the check 2007-01-19 15:05:07 +01:00
1e051d71f5 deciding for focus(NULL); 2007-01-19 15:01:51 +01:00
ddc79603f9 replaced XSetBorder.../focus() 2007-01-19 14:38:09 +01:00
dee5ea2335 yet another multihead fix by Christof Musik 2007-01-19 14:36:25 +01:00
b1c9f5f144 I prefer BORDERPX=1 2007-01-19 08:05:39 +01:00
a542bdf658 personally I prefer 2px borders 2007-01-18 11:46:39 +01:00
96e1b25c8c applied a modified version of Christof Musik's multihead patch (though this is not sure if it works in all cases, have to wait for an ACK by Christof) 2007-01-18 11:11:40 +01:00
caf5a16271 moved BORDERPX to config.*.h 2007-01-17 12:36:29 +01:00
936e11fd54 Added tag 3.1 for changeset e1c8bef05e6e 2007-01-16 11:41:56 +01:00
9715ba82aa removed erealloc (not used) 2007-01-16 11:35:56 +01:00
3c35b90dd3 removed unnecessary bx, by, bw variables 2007-01-16 11:33:42 +01:00
1d63030665 s/444/555/g - enlightened selected background 2007-01-16 11:28:17 +01:00
6a5b41203e removed firefox rule from default.h 2007-01-16 11:26:15 +01:00
fbd310972d applied new default colors 2007-01-16 11:25:10 +01:00
3059c9c507 applied sanders patch of my config 2007-01-16 11:12:34 +01:00
3b18f17d4d Jukka, thanks for being faster than me! 2007-01-15 19:01:57 +01:00
72faa1919e changed restack, to fix undrawed tag indicators 2007-01-15 12:07:18 +01:00
f8181f64e2 removed drawclient and drawall (they performed useless operations/consumed useless cpu cycles) 2007-01-15 12:04:25 +01:00
0045ad87df implemented new color scheme accordingly to Sanders proposal 2007-01-14 22:37:34 +01:00
ceea528eff removed mode label stuff 2007-01-14 22:32:26 +01:00
6c5dc7017c removed client title bar 2007-01-14 22:27:29 +01:00
ae0b4fdd92 added missing space 2007-01-12 21:56:01 +01:00
b3cea4d388 nah the last change feels bad 2007-01-12 13:06:15 +01:00
d296081321 changed incnmaster shortcuts in config.arg.h 2007-01-12 12:48:51 +01:00
177ed7e5de Added tag 3.0 for changeset 76b58d21ea98 2007-01-12 12:37:12 +01:00
f679125206 removing to allow nmaster=0 2007-01-12 12:15:06 +01:00
58beead14d this looks better now ;) 2007-01-11 16:38:45 +01:00
e1811c37ca switching to arabic tags 2007-01-11 16:03:06 +01:00
a24a6701c8 small fix of initial numlockmask value 2007-01-11 15:51:15 +01:00
d108cfa7fc allowing nmaster=0 (I think that's a straight idea) 2007-01-11 13:43:38 +01:00
92cb5ebb7c added Button{4,5} description to dwm.1 2007-01-10 12:56:49 +01:00
653826572d added comment to %u in config.default.h, added Button{4.5} support on mode label 2007-01-10 12:54:23 +01:00
5a5851bac2 reorganized 2007-01-08 17:36:56 +01:00
1d4a24dae0 implemented nmaster appearance in mode label (using %u) 2007-01-08 17:33:24 +01:00
a768ea93fd Added tag 2.9 for changeset 3a5910fac3cc 2007-01-08 13:01:37 +01:00
c95fe6e24b I received Sander's complain just in time ;) 2007-01-08 12:56:35 +01:00
c75168186b changed status fg 2007-01-08 12:43:10 +01:00
3a96c9a8d5 fofofo 2007-01-08 12:18:49 +01:00
1617b95598 extended default tags to 1-9 2007-01-08 12:12:02 +01:00
726ae5bf6d small grammar fix of dwm.1 2007-01-07 19:24:21 +01:00
3e11b38349 changed a term in dwm.1 2007-01-07 14:38:41 +01:00
16ed879524 using shorter tags, using mon instead of cert 2007-01-05 22:27:26 +01:00
20d7b5d058 roman numerals suck badly, reverting 2007-01-05 22:22:18 +01:00
11a08b9cfc switching to roman tags, I need more tags 2007-01-05 22:13:44 +01:00
c2b753d917 I inc/decrease on the fly, feels better 2007-01-05 22:03:09 +01:00
6c767072a3 allowing swap() for first master client 2007-01-05 22:00:15 +01:00
e9cfae7aba prevent pop() if first sel == nexttiled(clients) 2007-01-05 21:56:57 +01:00
7ac0de8350 removed swap(), implemented pop for everything 2007-01-05 21:55:43 +01:00
0b7c0f10ee preserving c1->snext and c2->snext in swap() as well. 2007-01-05 21:52:17 +01:00
51f6405b0d fixing some minor issues 2007-01-05 16:35:45 +01:00
6096f8a113 removed the term clients from dwm.1 2007-01-05 15:37:10 +01:00
d939f301fa adding some prevention that master clients get smaller than bh 2007-01-05 15:16:39 +01:00
8c4623da80 changed shortcuts to M-i and M-d 2007-01-05 15:11:01 +01:00
0faaba04a5 allowing zoom within master area as well 2007-01-05 15:08:25 +01:00
ec7a5ffff1 changed plus key to MODKEY-Shift-plus (US-layout restrictions ;) 2007-01-05 15:04:49 +01:00
98afb7b9d0 I prefer two master windows by default 2007-01-05 14:49:18 +01:00
06bae9dfb7 added MODKEY-{plus,minus} shortcuts (increasing/decreasing master clients) 2007-01-05 14:48:16 +01:00
0b80d1842d experimental version which allows master clients being increased/decreased 2007-01-05 12:50:39 +01:00
d7ec23a5db fixed comment of drawclient() 2007-01-04 16:45:28 +01:00
2cf8ef9520 switching bakc to my previous color favorit 2007-01-04 14:51:43 +01:00
184471b4bb renamed drawtitle into drawclient 2007-01-04 14:17:25 +01:00
21898c6049 using more thinkpad compliant colors 2007-01-02 16:29:01 +01:00
6a9300e815 changed arg's color scheme 2007-01-02 16:25:01 +01:00
ac24f132db corrections 2007-01-02 15:44:19 +01:00
cb4aa5bc35 next version will contain updated copyright notice 2007-01-02 15:37:58 +01:00
beac539f31 Added tag 2.8 for changeset 107719a9ce3bd0c79f9f1f626596eb338a276561 2007-01-02 14:53:02 +01:00
b5d297f02f fixed cleanup, using clients instead of sel 2007-01-02 14:40:18 +01:00
9056d7ea88 changed comment of updatesizehints 2007-01-02 12:28:02 +01:00
ebd17e4827 renamed updatesize into updatesizehints (thx to Sander for this hint) 2007-01-01 19:10:31 +01:00
7e59c89250 small simplification to dotile() (thx to Ross for this hint) 2006-12-20 12:07:05 +01:00
9e4e4d9022 migrated arg's config.h to new dmenu command line options 2006-12-19 11:38:08 +01:00
71fd06f843 added Solaris hints 2006-12-18 14:39:34 +01:00
58e6866d86 Added tag 2.7 for changeset 21951c0dfbae5af68ed77821a4d87253ee91803f 2006-12-14 08:50:49 +01:00
c7da124149 applied Sanders patch 2006-12-13 14:15:38 +01:00
21bd90d7d3 fixed man page, status bar displays EOF instead of "broken pipe" 2006-12-13 13:53:10 +01:00
c8f96b5b4c added the java odyssee to CAVEATS section 2006-12-13 13:42:17 +01:00
ded60365d4 removed Client->grav 2006-12-12 19:14:38 +01:00
629647dfee removed gravitate for the moment 2006-12-11 16:45:02 +01:00
4ca3d861f0 disabling configure() during resize 2006-12-11 09:42:16 +01:00
069e7a6e24 made gravitate effectless, waiting for complains ;) 2006-12-11 08:31:30 +01:00
ac6e34ea06 fixed diagnostic error message 2006-12-08 11:11:52 +01:00
a308b7507a removed the hardcoded fixed fallback, it is useless in non-Latin1 environments 2006-12-08 10:40:09 +01:00
630e7ff26f we don't use the term clients anymore, windows is the better term 2006-12-07 16:38:57 +01:00
3764ab471b Added tag 2.6 for changeset 5308dd22b6ee8e3218c81d9e7e4125f235bb5778 2006-12-07 14:55:29 +01:00
a3319c6f8e found compromise for fonts 2006-12-07 14:39:31 +01:00
66c699a701 nah, people should define 'fixed' to be compatible with their locale 2006-12-07 12:03:15 +01:00
aaf1e44da9 using a UTF-8 capable fixed font 2006-12-07 11:55:04 +01:00
1ef2307ec4 switching to uxterm again, I get kretze from this urxvt crap 2006-12-07 10:43:34 +01:00
d42c3ba2dc with this patch everything works fine for me 2006-12-07 10:02:46 +01:00
4b06155873 don't use Xlocale crap, let's use locale.h instead 2006-12-07 09:49:45 +01:00
857d825eeb using the portable Xmb+UTF-8 way of life, will see if this works well... 2006-12-07 09:47:55 +01:00
6b345353e3 improved the memory leak prevention 2006-12-06 11:19:06 +01:00
ab3b3a8f61 making terminus more explicit a regular font (otherwise olique font might be used in some setups like mine). 2006-12-05 14:21:18 +01:00
71b82fb1f6 also setting LC_CTYPE only 2006-12-05 13:31:29 +01:00
9bd9ea423e enforcing using fontsets even if they are incomplete for some encodings 2006-12-05 10:30:31 +01:00
99964398e7 Added tag 2.5.1 for changeset c7f84f23ec5aef29988dcdc4ec22a7352ee8f58e 2006-12-04 21:01:14 +01:00
7009ebfa69 hotfix of a serious crashing bug 2006-12-04 21:00:26 +01:00
760e23dd3a Added tag 2.5 for changeset dcbbfabc8ecc5f33a6cc950584de87da1a368045 2006-12-04 15:39:43 +01:00
c53d9d516a applied Manuel's regex patch 2006-12-03 11:21:25 +01:00
7739e6b466 made squares equally sized, and 1px bigger 2006-12-01 17:55:46 +01:00
4881857458 if client is focused, the emptysquare don't needs to be drawed 2006-12-01 17:51:05 +01:00
c73d5cb7b6 and the winner is 2006-12-01 17:45:27 +01:00
6458803d21 sander1 proposal 2006-12-01 17:36:37 +01:00
6e72d781f7 dood 2006-12-01 16:55:42 +01:00
4e926a9ef2 darkening the fg colors somewhat 2006-12-01 15:50:22 +01:00
4ba3cfaee9 less obtrusive indicator (only a top line) 2006-12-01 15:03:42 +01:00
e655e8a7d5 final2 indicator 2006-12-01 12:52:16 +01:00
c34e4e4b39 removing the -1 on final indicators, looks cleaner 2006-12-01 12:39:13 +01:00
a678ee6365 final indicators 2006-12-01 12:25:23 +01:00
49f0ee329d changed things like I described in last mail 2006-12-01 10:16:10 +01:00
0c9d9a3d94 improved tag indicator 2006-12-01 09:52:15 +01:00
89e1acb0bb removed viewall signature from dwm.h 2006-11-30 17:01:39 +01:00
c2ed26b711 next version will be 2.5 2006-11-30 15:51:26 +01:00
42fd392e05 removed viewall(), replaced with view(-1); added tag(-1) to tag a client with all tags (new key combo MODKEY-Shift-0) 2006-11-30 15:27:43 +01:00
e06447ee88 Added tag 2.4 for changeset 32b246925086910d63147483160281a91a47479f 2006-11-30 09:19:52 +01:00
683dabe5e6 extended dwm.1 with last change 2006-11-28 17:36:00 +01:00
3aff96177c togglefloat should only work in dotile mode (thanks to Sander for this hint) 2006-11-28 17:35:31 +01:00
0a915eba8f applied Alex Elide's tricky patch, thanks! 2006-11-27 17:51:50 +01:00
19dcbc5717 returning to old Key struct 2006-11-27 17:49:58 +01:00
d2a4952956 applied Szabolcs Nagy's patch (thank you!) 2006-11-27 17:46:02 +01:00
0c97b21b61 applied patch by Jukka 2006-11-27 17:30:06 +01:00
19390b1a91 changing Key.func into Key.func[NFUNCS], this allows sequences execution of functions per keypress (avoids implementing useless masterfunctions which call atomic ones) 2006-11-27 13:21:38 +01:00
8dc86051df added man page entry 2006-11-27 11:05:47 +01:00
46d5f9d1bf added togglefloat to hg tip (i consider this useful for some cases), using MODKEY-Shift-space as shortcut 2006-11-27 10:57:37 +01:00
35e96b8deb applied Jukka's patch preventing some cornercases and making the EOF error message correct 2006-11-27 10:29:47 +01:00
2210ea7e3b applied yet another proposal of Manuel 2006-11-26 15:43:16 +01:00
61a1910f91 applied Jukka's sizeof K&R compliance patch, applied Manuels' last-line printage proposal for stdin reading. 2006-11-26 14:26:53 +01:00
27ef73507b applied Jukka's stdinread patch 2006-11-26 13:31:36 +01:00
2b35fb643e next version will be 2.4 2006-11-25 19:26:31 +01:00
478f6f95f1 applied Manuels patch (thanks to Manuel!) 2006-11-25 19:26:16 +01:00
44411d2d48 small fix of man page 2006-11-24 17:02:41 +01:00
a2175cf71a Added tag 2.3 for changeset 719b37b37b0df829d7cf017ac70e353088fe5849 2006-11-24 15:46:32 +01:00
4606d218c3 using the term 'indicated' instead of 'higlighted' 2006-11-23 16:00:16 +01:00
d37d0f24e6 updated man page with the bottom right corner indicator 2006-11-23 15:59:16 +01:00
321e8d51ed fififif 2006-11-22 16:17:50 +01:00
78f4b51757 added a similiar patch to Daves solution to indicate if there are clients with a specific tag 2006-11-22 14:57:09 +01:00
7d168a2621 returning to old bar colorization behavior, like sander proposed for consistency reasons 2006-11-21 15:03:08 +01:00
931e712eac applied Gottox patches 2006-11-21 14:49:13 +01:00
4ec04209e0 using iso10646 explicitely in arg's config.h 2006-11-21 12:17:47 +01:00
82ddba88a2 Added tag 2.2 for changeset 7e92f58754ae6edb3225f26d754bd89c1ff458cf 2006-11-21 09:41:33 +01:00
52a8cc8d46 nah reverting to my prev style, that's really the best 2006-11-18 21:33:33 +01:00
d175df8aa3 applying aluminium style for arg's config.h 2006-11-18 21:26:53 +01:00
b003a35fde applied Gottox' windowarea patch 2006-11-16 14:40:57 +01:00
df1a0f9445 using a more blue-ish color... 2006-11-08 17:16:38 +01:00
5b07b85838 making the selected color more lightning 2006-11-08 17:10:51 +01:00
f320cd203b next release will be 2.2 2006-11-03 09:22:40 +01:00
f78c16f8c6 applied Jukkas patch 2006-11-03 08:29:39 +01:00
0c5f47e720 Added tag 2.1 for changeset a2c465098a3b972bbed00feda9804b6aae1e9531 2006-11-02 10:18:22 +01:00
4b5b3d90af renamed resizecol into resizemaster 2006-10-31 12:07:32 +01:00
2cce4b95cd applied Gottox patch to simplify the resizing of col, instead of resizing the current area, it only resizes the master area in the future (seems more predictable) 2006-10-31 12:06:38 +01:00
8e6eb52196 Added tag 2.0 for changeset 12deea36603da407e3f32640048846a3bd74a9ec 2006-10-31 09:02:42 +01:00
04b633ddf3 make sure that changing sx has no impact on snapping 2006-10-31 09:02:16 +01:00
b76561a212 in a 1920x1200 setup 40 pixels of snap value are much better than 20 2006-10-30 12:40:10 +01:00
51c7589c87 fixed stupid bug of snap-to-screen 2006-10-30 12:26:55 +01:00
99785382ae changing snap priority 2006-10-30 12:07:00 +01:00
dc1690ce0f removed useless abs() calls 2006-10-30 12:04:08 +01:00
b6614261ea added screen-border snapping in floating mode, feels quite well 2006-10-30 11:58:05 +01:00
91e569ca37 and another fix 2006-10-27 13:29:35 +02:00
0f395c1b11 applied sanders try2 patch 2006-10-27 13:28:26 +02:00
2b13e7466f applied sanders max size fix 2006-10-27 12:05:47 +02:00
0982e47408 stupid urxvt needs bg to highlight selections in a sane way, though that makes sense to some extend 2006-10-27 10:24:15 +02:00
b93ebcf42f reverting to original 2006-10-26 15:41:40 +02:00
a08d83ba62 applied sander's config.*h nitpick patch 2006-10-26 15:29:20 +02:00
2b7c275ce8 some other change 2006-10-26 15:26:17 +02:00
040d0f48a0 apply small fix to prevent apps like mplayer wandering when toggling fullscreen 2006-10-26 15:05:45 +02:00
724f35a664 forgot to use -tr, which actually prevents the ugly flicker (using xsetroot -solid black as root window pixmap to make this work nicely) 2006-10-26 12:22:26 +02:00
6f3872edbd using MASTER 600 again, it is definately better, and using urxvtc for the moment (it doesn't flickers on refreshes, but this is not because of Marc Lehmann, it is because of the original rxvt code) 2006-10-26 12:13:41 +02:00
87324e680c changing MASTER in config.arg.h from 600 to 550 per thousand 2006-10-26 11:21:45 +02:00
c2b908f603 my new 1920x1200 Z61p arrived, now I can use terminus in a sane way... 2006-10-26 10:21:27 +02:00
d7734f996f moved MOUSEMASK into event.c (not used in other places) 2006-10-16 16:50:03 +02:00
8b68890650 now being at v2.0 2006-10-14 18:21:39 +02:00
b60406cb9b using lsx instead of Jukka's shell construct 2006-10-13 18:47:24 +02:00
ce9a9934ec hotfix 2006-10-06 14:01:53 +02:00
720b2abe17 Added tag 1.9 for changeset a5567a0d30112822db2627a04a2e7aa3b6c38148 2006-10-06 13:43:59 +02:00
18 changed files with 2128 additions and 2135 deletions

32
.hgtags
View File

@ -17,3 +17,35 @@ ad3fa2d185426c51fd5deceae809770363f8d33c 1.6
4dbdb61c8b8ce21dee5c7050a6b103855964ed20 1.7
d5ad819f2a66a40fa75dd2e44429f3bfc884d07b 1.7.1
c71952fa3c7ca848ec38a6923b5c6d0e18fff431 1.8
a5567a0d30112822db2627a04a2e7aa3b6c38148 1.9
12deea36603da407e3f32640048846a3bd74a9ec 2.0
a2c465098a3b972bbed00feda9804b6aae1e9531 2.1
7e92f58754ae6edb3225f26d754bd89c1ff458cf 2.2
719b37b37b0df829d7cf017ac70e353088fe5849 2.3
32b246925086910d63147483160281a91a47479f 2.4
dcbbfabc8ecc5f33a6cc950584de87da1a368045 2.5
c7f84f23ec5aef29988dcdc4ec22a7352ee8f58e 2.5.1
5308dd22b6ee8e3218c81d9e7e4125f235bb5778 2.6
21951c0dfbae5af68ed77821a4d87253ee91803f 2.7
107719a9ce3bd0c79f9f1f626596eb338a276561 2.8
3a5910fac3ccb522a98aeeba7af7008530b25092 2.9
76b58d21ea98257c05565a3b9c850b9b26a32968 3.0
e1c8bef05e6e48df4f26471ea0712aa43ab9d949 3.1
4ce65f61f01b055fa6c2901c6d2527ef741aa4bf 3.2
f2cabc83a18f9b5b548159329ddd4dee904fa31f 3.2.1
d3876aa792923f9a95f7ad0c7f0134533404df35 3.2.2
0f91934037b04221ff5d1ba3a6c39c1ff26e3661 3.3
9ede7b2d2450537e750d5505789fbe63960e97e6 3.4
63ad05e7f9e1f4f1881fb02f529cb6c6ae81e693 3.5
75b1b25fe0d7e29400baf30568153f668324928b 3.6
20ec6976cee1fcfee0c2f354ae382ee3f9f68efa 3.6.1
baee494346e520f8dee2cee9491b8350064770d2 3.7
2ea201354cf016407ea93e1e390d1422940d29b0 3.8
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

View File

@ -1,7 +1,10 @@
MIT/X Consortium License
(C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
(C)opyright MMVI Sander van Dijk <a dot h dot vandijk at gmail dot com>
© 2006-2007 Anselm R. Garbe <garbeam at gmail dot com>
© 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>
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),

View File

@ -1,9 +1,9 @@
# dwm - dynamic window manager
# (C)opyright MMVI Anselm R. Garbe
# © 2006-2007 Anselm R. Garbe, Sander van Dijk
include config.mk
SRC = client.c draw.c event.c main.c tag.c util.c view.c
SRC = dwm.c
OBJ = ${SRC:.c=.o}
all: options dwm
@ -13,22 +13,20 @@ options:
@echo "CFLAGS = ${CFLAGS}"
@echo "LDFLAGS = ${LDFLAGS}"
@echo "CC = ${CC}"
@echo "LD = ${LD}"
.c.o:
@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 LD $@
@${LD} -o $@ ${OBJ} ${LDFLAGS}
@strip $@
@echo CC -o $@
@${CC} -o $@ ${OBJ} ${LDFLAGS}
clean:
@echo cleaning
@ -37,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}
@ -50,7 +48,7 @@ install: all
@chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
@mkdir -p ${DESTDIR}${MANPREFIX}/man1
@sed 's/VERSION/${VERSION}/g' < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
@sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
uninstall:

3
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
-----------

397
client.c
View File

@ -1,397 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <stdlib.h>
#include <string.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
/* static functions */
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 int
xerrordummy(Display *dsply, XErrorEvent *ee) {
return 0;
}
/* extern functions */
void
ban(Client *c) {
XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
XMoveWindow(dpy, c->twin, c->tx + 2 * sw, c->ty);
}
void
configure(Client *c) {
XEvent synev;
synev.type = ConfigureNotify;
synev.xconfigure.display = dpy;
synev.xconfigure.event = c->win;
synev.xconfigure.window = c->win;
synev.xconfigure.x = c->x;
synev.xconfigure.y = c->y;
synev.xconfigure.width = c->w;
synev.xconfigure.height = c->h;
synev.xconfigure.border_width = c->border;
synev.xconfigure.above = None;
XSendEvent(dpy, c->win, True, NoEventMask, &synev);
}
void
focus(Client *c) {
Client *old;
if(!issel || (c && !isvisible(c)))
return;
if(!sel)
sel = c;
else if(sel != c) {
old = sel;
sel = c;
if(old) {
grabbuttons(old, False);
drawtitle(old);
}
}
if(c) {
detachstack(c);
c->snext = stack;
stack = c;
grabbuttons(c, True);
drawtitle(c);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
}
else
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
}
Client *
getclient(Window w) {
Client *c;
for(c = clients; c; c = c->next)
if(c->win == w)
return c;
return NULL;
}
Client *
getctitle(Window w) {
Client *c;
for(c = clients; c; c = c->next)
if(c->twin == w)
return c;
return NULL;
}
void
gravitate(Client *c, Bool invert) {
int dx = 0, dy = 0;
switch(c->grav) {
default:
break;
case StaticGravity:
case NorthWestGravity:
case NorthGravity:
case NorthEastGravity:
dy = c->border;
break;
case EastGravity:
case CenterGravity:
case WestGravity:
dy = -(c->h / 2) + c->border;
break;
case SouthEastGravity:
case SouthGravity:
case SouthWestGravity:
dy = -(c->h);
break;
}
switch (c->grav) {
default:
break;
case StaticGravity:
case NorthWestGravity:
case WestGravity:
case SouthWestGravity:
dx = c->border;
break;
case NorthGravity:
case CenterGravity:
case SouthGravity:
dx = -(c->w / 2) + c->border;
break;
case NorthEastGravity:
case EastGravity:
case SouthEastGravity:
dx = -(c->w + c->border);
break;
}
if(invert) {
dx = -dx;
dy = -dy;
}
c->x += dx;
c->y += dy;
}
void
killclient(Arg *arg) {
if(!sel)
return;
if(sel->proto & PROTODELWIN)
sendevent(sel->win, wmatom[WMProtocols], wmatom[WMDelete]);
else
XKillClient(dpy, sel->win);
}
void
manage(Window w, XWindowAttributes *wa) {
Client *c;
Window trans;
XSetWindowAttributes twa;
c = emallocz(sizeof(Client));
c->tags = emallocz(ntags * sizeof(Bool));
c->win = w;
c->x = c->tx = wa->x;
c->y = c->ty = wa->y;
c->w = c->tw = wa->width;
c->h = wa->height;
c->th = bh;
c->border = 0;
updatesize(c);
if(c->x + c->w + 2 * BORDERPX > sw)
c->x = sw - c->w - 2 * BORDERPX;
if(c->x < sx)
c->x = sx;
if(c->y + c->h + 2 * BORDERPX > sh)
c->y = sh - c->h - 2 * BORDERPX;
if(c->h != sh && c->y < bh)
c->y = bh;
c->proto = getproto(c->win);
XSelectInput(dpy, c->win,
StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
XGetTransientForHint(dpy, c->win, &trans);
twa.override_redirect = 1;
twa.background_pixmap = ParentRelative;
twa.event_mask = ExposureMask | EnterWindowMask;
c->twin = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
0, DefaultDepth(dpy, screen), CopyFromParent,
DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
grabbuttons(c, False);
updatetitle(c);
settags(c, getclient(trans));
if(!c->isfloat)
c->isfloat = trans
|| (c->maxw && c->minw &&
c->maxw == c->minw && c->maxh == c->minh);
resizetitle(c);
if(clients)
clients->prev = c;
c->next = clients;
c->snext = stack;
stack = clients = c;
ban(c);
XMapWindow(dpy, c->win);
XMapWindow(dpy, c->twin);
if(isvisible(c))
focus(c);
arrange();
}
void
resize(Client *c, Bool sizehints, Corner sticky) {
int bottom = c->y + c->h;
int right = c->x + c->w;
XWindowChanges wc;
if(sizehints) {
if(c->incw)
c->w -= (c->w - c->basew) % c->incw;
if(c->inch)
c->h -= (c->h - c->baseh) % c->inch;
if(c->minw && c->w < c->minw)
c->w = c->minw;
if(c->minh && c->h < c->minh)
c->h = c->minh;
if(c->maxw && c->w > c->maxw)
c->w = c->maxw;
if(c->maxh && c->h > c->maxh)
c->h = c->maxh;
}
if(sticky == TopRight || sticky == BotRight)
c->x = right - c->w;
if(sticky == BotLeft || sticky == BotRight)
c->y = bottom - c->h;
/* offscreen appearance fixes */
if(c->x + c->w < sx)
c->x = sx;
if(c->y + c->h < bh)
c->y = bh;
if(c->x > sw)
c->x = sw - c->w;
if(c->y > sh)
c->y = sh - c->h;
resizetitle(c);
wc.x = c->x;
wc.y = c->y;
wc.width = c->w;
wc.height = c->h;
if(c->w == sw && c->h == sh)
wc.border_width = 0;
else
wc.border_width = BORDERPX;
XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc);
configure(c);
XSync(dpy, False);
}
void
resizetitle(Client *c) {
c->tw = textw(c->name);
if(c->tw > c->w)
c->tw = c->w + 2 * BORDERPX;
c->tx = c->x + c->w - c->tw + 2 * BORDERPX;
c->ty = c->y;
if(isvisible(c))
XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th);
else
XMoveResizeWindow(dpy, c->twin, c->tx + 2 * sw, c->ty, c->tw, c->th);
}
void
updatesize(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
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
c->minw = c->minh = 0;
if(c->flags & PWinGravity)
c->grav = size.win_gravity;
else
c->grav = NorthWestGravity;
}
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));
else {
if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success
&& n > 0 && *list)
{
strncpy(c->name, *list, sizeof(c->name));
XFreeStringList(list);
}
}
XFree(name.value);
}
void
unmanage(Client *c) {
Client *nc;
/* The server grab construct avoids race conditions. */
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
detach(c);
detachstack(c);
if(sel == c) {
for(nc = stack; nc && !isvisible(nc); nc = nc->snext);
focus(nc);
}
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
XDestroyWindow(dpy, c->twin);
free(c->tags);
free(c);
XSync(dpy, False);
XSetErrorHandler(xerror);
XUngrabServer(dpy);
arrange();
}

View File

@ -1,67 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#define TAGS \
const char *tags[] = { "dev", "work", "net", "fnord", NULL };
#define DEFMODE dotile /* dofloat */
#define FLOATSYMBOL "><>"
#define TILESYMBOL "[]="
#define FONT "-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*"
#define NORMBGCOLOR "#333333"
#define NORMFGCOLOR "#dddddd"
#define SELBGCOLOR "#333366"
#define SELFGCOLOR "#eeeeee"
#define STATUSBGCOLOR "#222222"
#define STATUSFGCOLOR "#9999cc"
#define MASTER 600 /* per thousand */
#define MODKEY Mod1Mask
#define KEYS \
static Key key[] = { \
/* modifier key function arguments */ \
{ MODKEY|ShiftMask, XK_Return, spawn, \
{ .cmd = "exec uxterm -bg '#111111' -fg '#eeeeee' -cr '#eeeeee' +sb -fn '"FONT"'" } }, \
{ MODKEY, XK_p, spawn, \
{ .cmd = "exe=\"$(IFS=:; for dir in $PATH; do " \
"for file in \"$dir\"/*; do [ -x \"$file\" ] && echo \"${file##*/}\"; done; done " \
"| sort -u | dmenu -font '"FONT"' -normbg '"NORMBGCOLOR"' -normfg '"NORMFGCOLOR"' " \
"-selbg '"SELBGCOLOR"' -selfg '"SELFGCOLOR"')\" && exec $exe" } }, \
{ MODKEY, XK_j, focusnext, { 0 } }, \
{ MODKEY, XK_k, focusprev, { 0 } }, \
{ MODKEY, XK_Return, zoom, { 0 } }, \
{ MODKEY, XK_g, resizecol, { .i = 15 } }, \
{ MODKEY, XK_s, resizecol, { .i = -15 } }, \
{ MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \
{ MODKEY|ShiftMask, XK_4, tag, { .i = 3 } }, \
{ MODKEY|ControlMask|ShiftMask, XK_1, toggletag, { .i = 0 } }, \
{ MODKEY|ControlMask|ShiftMask, XK_2, toggletag, { .i = 1 } }, \
{ MODKEY|ControlMask|ShiftMask, XK_3, toggletag, { .i = 2 } }, \
{ MODKEY|ControlMask|ShiftMask, XK_4, toggletag, { .i = 3 } }, \
{ MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \
{ MODKEY, XK_space, togglemode, { 0 } }, \
{ MODKEY, XK_0, viewall, { 0 } }, \
{ MODKEY, XK_1, view, { .i = 0 } }, \
{ MODKEY, XK_2, view, { .i = 1 } }, \
{ MODKEY, XK_3, view, { .i = 2 } }, \
{ MODKEY, XK_4, view, { .i = 3 } }, \
{ MODKEY|ControlMask, XK_1, toggleview, { .i = 0 } }, \
{ MODKEY|ControlMask, XK_2, toggleview, { .i = 1 } }, \
{ MODKEY|ControlMask, XK_3, toggleview, { .i = 2 } }, \
{ MODKEY|ControlMask, XK_4, toggleview, { .i = 3 } }, \
{ MODKEY|ShiftMask, XK_q, quit, { 0 } }, \
};
#define RULES \
static Rule rule[] = { \
/* class:instance:title regex tags regex isfloat */ \
{ "Firefox.*", "net", False}, \
{ "Gimp.*", NULL, True}, \
{ "MPlayer.*", NULL, True}, \
{ "Acroread.*", NULL, True}, \
};

93
config.def.h Normal file
View File

@ -0,0 +1,93 @@
/* See LICENSE file for copyright and license details. */
/* appearance */
#define BARPOS BarTop /* BarBot, BarOff */
#define BORDERPX 1
#define FONT "-*-terminus-medium-*-*-*-*-*-*-*-*-*-*-*"
#define NORMBORDERCOLOR "#cccccc"
#define NORMBGCOLOR "#cccccc"
#define NORMFGCOLOR "#000000"
#define SELBORDERCOLOR "#0066ff"
#define SELBGCOLOR "#0066ff"
#define SELFGCOLOR "#ffffff"
/* tagging */
const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "www" };
Rule rules[] = {
/* class:instance:title regex tags regex isfloating */
{ "Firefox", "www", False },
{ "Gimp", NULL, True },
{ "MPlayer", NULL, True },
{ "Acroread", NULL, True },
};
/* layout(s) */
#define ISTILE isarrange(tile) /* || isarrange(<custom>) */
#define MWFACT 0.6 /* master width factor [0.1 .. 0.9] */
#define SNAP 32 /* snap pixel */
Layout layouts[] = {
/* symbol function */
{ "[]=", tile }, /* first entry is default */
{ "><>", floating },
};
/* key definitions */
#define MODKEY Mod1Mask
#define KEYS \
Key keys[] = { \
/* 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 uxterm" }, \
{ MODKEY, XK_space, setlayout, NULL }, \
{ MODKEY, XK_b, togglebar, NULL }, \
{ MODKEY, XK_j, focusnext, NULL }, \
{ MODKEY, XK_k, focusprev, NULL }, \
{ MODKEY, XK_h, setmwfact, "-0.05" }, \
{ MODKEY, XK_l, setmwfact, "+0.05" }, \
{ MODKEY, XK_m, togglemax, NULL }, \
{ MODKEY, XK_Return, zoom, NULL }, \
{ MODKEY, XK_Tab, viewprevtag, NULL }, \
{ MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \
{ MODKEY|ShiftMask, XK_c, killclient, NULL }, \
{ MODKEY, XK_0, view, NULL }, \
{ MODKEY, XK_1, view, tags[0] }, \
{ MODKEY, XK_2, view, tags[1] }, \
{ MODKEY, XK_3, view, tags[2] }, \
{ MODKEY, XK_4, view, tags[3] }, \
{ MODKEY, XK_5, view, tags[4] }, \
{ MODKEY, XK_6, view, tags[5] }, \
{ MODKEY, XK_7, view, tags[6] }, \
{ MODKEY, XK_8, view, tags[7] }, \
{ MODKEY, XK_9, view, tags[8] }, \
{ MODKEY|ControlMask, XK_1, toggleview, tags[0] }, \
{ MODKEY|ControlMask, XK_2, toggleview, tags[1] }, \
{ MODKEY|ControlMask, XK_3, toggleview, tags[2] }, \
{ MODKEY|ControlMask, XK_4, toggleview, tags[3] }, \
{ MODKEY|ControlMask, XK_5, toggleview, tags[4] }, \
{ MODKEY|ControlMask, XK_6, toggleview, tags[5] }, \
{ MODKEY|ControlMask, XK_7, toggleview, tags[6] }, \
{ MODKEY|ControlMask, XK_8, toggleview, tags[7] }, \
{ MODKEY|ControlMask, XK_9, toggleview, tags[8] }, \
{ MODKEY|ShiftMask, XK_0, tag, NULL }, \
{ MODKEY|ShiftMask, XK_1, tag, tags[0] }, \
{ MODKEY|ShiftMask, XK_2, tag, tags[1] }, \
{ MODKEY|ShiftMask, XK_3, tag, tags[2] }, \
{ MODKEY|ShiftMask, XK_4, tag, tags[3] }, \
{ MODKEY|ShiftMask, XK_5, tag, tags[4] }, \
{ MODKEY|ShiftMask, XK_6, tag, tags[5] }, \
{ MODKEY|ShiftMask, XK_7, tag, tags[6] }, \
{ MODKEY|ShiftMask, XK_8, tag, tags[7] }, \
{ MODKEY|ShiftMask, XK_9, tag, tags[8] }, \
{ MODKEY|ControlMask|ShiftMask, XK_1, toggletag, tags[0] }, \
{ MODKEY|ControlMask|ShiftMask, XK_2, toggletag, tags[1] }, \
{ MODKEY|ControlMask|ShiftMask, XK_3, toggletag, tags[2] }, \
{ MODKEY|ControlMask|ShiftMask, XK_4, toggletag, tags[3] }, \
{ MODKEY|ControlMask|ShiftMask, XK_5, toggletag, tags[4] }, \
{ MODKEY|ControlMask|ShiftMask, XK_6, toggletag, tags[5] }, \
{ MODKEY|ControlMask|ShiftMask, XK_7, toggletag, tags[6] }, \
{ MODKEY|ControlMask|ShiftMask, XK_8, toggletag, tags[7] }, \
{ MODKEY|ControlMask|ShiftMask, XK_9, toggletag, tags[8] }, \
{ MODKEY|ShiftMask, XK_q, quit, NULL }, \
};

View File

@ -1,65 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#define TAGS \
const char *tags[] = { "1", "2", "3", "4", "5", NULL };
#define DEFMODE dotile /* dofloat */
#define FLOATSYMBOL "><>"
#define TILESYMBOL "[]="
#define FONT "fixed"
#define NORMBGCOLOR "#333366"
#define NORMFGCOLOR "#cccccc"
#define SELBGCOLOR "#666699"
#define SELFGCOLOR "#eeeeee"
#define STATUSBGCOLOR "#dddddd"
#define STATUSFGCOLOR "#222222"
#define MASTER 600 /* per thousand */
#define MODKEY Mod1Mask
#define KEYS \
static Key key[] = { \
/* modifier key function arguments */ \
{ MODKEY|ShiftMask, XK_Return, spawn, { .cmd = "exec xterm" } }, \
{ MODKEY, XK_Tab, focusnext, { 0 } }, \
{ MODKEY|ShiftMask, XK_Tab, focusprev, { 0 } }, \
{ MODKEY, XK_Return, zoom, { 0 } }, \
{ MODKEY, XK_g, resizecol, { .i = 15 } }, \
{ MODKEY, XK_s, resizecol, { .i = -15 } }, \
{ MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \
{ MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \
{ MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \
{ MODKEY|ShiftMask, XK_4, tag, { .i = 3 } }, \
{ MODKEY|ShiftMask, XK_5, tag, { .i = 4 } }, \
{ MODKEY|ControlMask|ShiftMask, XK_1, toggletag, { .i = 0 } }, \
{ MODKEY|ControlMask|ShiftMask, XK_2, toggletag, { .i = 1 } }, \
{ MODKEY|ControlMask|ShiftMask, XK_3, toggletag, { .i = 2 } }, \
{ MODKEY|ControlMask|ShiftMask, XK_4, toggletag, { .i = 3 } }, \
{ MODKEY|ControlMask|ShiftMask, XK_5, toggletag, { .i = 4 } }, \
{ MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \
{ MODKEY, XK_space, togglemode, { 0 } }, \
{ MODKEY, XK_0, viewall, { 0 } }, \
{ MODKEY, XK_1, view, { .i = 0 } }, \
{ MODKEY, XK_2, view, { .i = 1 } }, \
{ MODKEY, XK_3, view, { .i = 2 } }, \
{ MODKEY, XK_4, view, { .i = 3 } }, \
{ MODKEY, XK_5, view, { .i = 4 } }, \
{ MODKEY|ControlMask, XK_1, toggleview, { .i = 0 } }, \
{ MODKEY|ControlMask, XK_2, toggleview, { .i = 1 } }, \
{ MODKEY|ControlMask, XK_3, toggleview, { .i = 2 } }, \
{ MODKEY|ControlMask, XK_4, toggleview, { .i = 3 } }, \
{ MODKEY|ControlMask, XK_5, toggleview, { .i = 4 } }, \
{ MODKEY|ShiftMask, XK_q, quit, { 0 } }, \
};
/* 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 isfloat */ \
{ "Firefox.*", "2", False }, \
{ "Gimp.*", NULL, True}, \
};

View File

@ -1,5 +1,5 @@
# dwm version
VERSION = 1.9
VERSION = 4.6
# Customize below to fit your system
@ -16,10 +16,14 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11
# flags
CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\"
LDFLAGS = ${LIBS}
#CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
LDFLAGS = -s ${LIBS}
#CFLAGS = -g -std=c99 -pedantic -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = -g ${LIBS}
# Solaris
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
#LDFLAGS = ${LIBS}
#CFLAGS += -xtarget=ultra
# compiler and linker
CC = cc
LD = ${CC}

198
draw.c
View File

@ -1,198 +0,0 @@
/* (C)opyright MMIV-MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <stdio.h>
#include <string.h>
#include <X11/Xlocale.h>
/* static */
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);
}
static void
drawtext(const char *text, unsigned long col[ColLast], Bool highlight) {
int x, y, w, h;
static char buf[256];
unsigned int len, olen;
XGCValues gcv;
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 */
gcv.foreground = col[ColFG];
if(dc.font.set) {
XChangeGC(dpy, dc.gc, GCForeground, &gcv);
XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len);
}
else {
gcv.font = dc.font.xfont->fid;
XChangeGC(dpy, dc.gc, GCForeground | GCFont, &gcv);
XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len);
}
if(highlight) {
r.x = dc.x + 2;
r.y = dc.y + 2;
r.width = r.height = (h + 2) / 4;
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
}
}
/* extern */
void
drawall(void) {
Client *c;
for(c = clients; c; c = getnext(c->next))
drawtitle(c);
drawstatus();
}
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, sel && sel->tags[i]);
else
drawtext(tags[i], dc.norm, sel && sel->tags[i]);
dc.x += dc.w;
}
dc.w = bmw;
drawtext(arrange == dofloat ? FLOATSYMBOL : TILESYMBOL, dc.status, False);
x = dc.x + dc.w;
dc.w = textw(stext);
dc.x = bx + bw - dc.w;
if(dc.x < x) {
dc.x = x;
dc.w = bw - x;
}
drawtext(stext, dc.status, False);
if((dc.w = dc.x - x) > bh) {
dc.x = x;
if(sel)
drawtext(sel->name, dc.sel, False);
else
drawtext(NULL, dc.norm, False);
}
XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
XSync(dpy, False);
}
void
drawtitle(Client *c) {
if(c == sel && issel) {
drawstatus();
XUnmapWindow(dpy, c->twin);
XSetWindowBorder(dpy, c->win, dc.sel[ColBG]);
return;
}
XSetWindowBorder(dpy, c->win, dc.norm[ColBG]);
XMapWindow(dpy, c->twin);
dc.x = dc.y = 0;
dc.w = c->tw;
drawtext(c->name, dc.norm, False);
XCopyArea(dpy, dc.drawable, c->twin, dc.gc, 0, 0, c->tw, c->th, 0, 0);
XSync(dpy, False);
}
unsigned long
getcolor(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;
}
void
setfont(const char *fontstr) {
char **missing, *def;
int i, n;
missing = NULL;
setlocale(LC_ALL, "");
if(dc.font.set)
XFreeFontSet(dpy, dc.font.set);
dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def);
if(missing) {
while(n--)
fprintf(stderr, "missing fontset: %s\n", missing[n]);
XFreeStringList(missing);
if(dc.font.set) {
XFreeFontSet(dpy, dc.font.set);
dc.font.set = NULL;
}
}
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;
dc.font.xfont = XLoadQueryFont(dpy, fontstr);
if (!dc.font.xfont)
dc.font.xfont = XLoadQueryFont(dpy, "fixed");
if (!dc.font.xfont)
eprint("error, cannot init 'fixed' font\n");
dc.font.ascent = dc.font.xfont->ascent;
dc.font.descent = dc.font.xfont->descent;
}
dc.font.height = dc.font.ascent + dc.font.descent;
}
unsigned int
textw(const char *text) {
return textnw(text, strlen(text)) + dc.font.height;
}

130
dwm.1
View File

@ -1,30 +1,33 @@
.TH DWM 1 dwm-VERSION
.TH DWM 1 dwm\-VERSION
.SH NAME
dwm \- dynamic window manager
.SH SYNOPSIS
.B dwm
.RB [ \-v ]
.SH DESCRIPTION
dwm is a dynamic window manager for X. It manages windows in tiling and
floating modes. Either mode can be applied dynamically, optimizing the
dwm is a dynamic window manager for X. It manages windows in tiled and
floating layouts. Either layout can be applied dynamically, optimizing the
environment for the application in use and the task performed.
.P
In tiling mode windows are managed in a master and stacking area. The master
In tiled layout 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 floating mode windows can be
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 mode selected.
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 mode,
the title of the focused window, and the text read from standard input. The
selected tags are highlighted with a different color, the tags of the focused
window are highlighted with a small point.
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.
.P
dwm draws a 1-pixel border around windows to indicate the focus state.
Unfocused windows contain a small bar in front of them displaying their title.
dwm draws a small border around windows to indicate the focus state.
.SH OPTIONS
.TP
.B \-v
@ -36,87 +39,118 @@ prints version information to standard output, then exits.
is read and displayed in the status text area.
.TP
.B Button1
click on a tag label to display all windows with that tag, click on the mode
label toggles between tiling and floating mode.
click on a tag label to display all windows with that tag, click on the layout
label toggles between tiled and floating layout.
.TP
.B Button3
click on a tag label adds/removes all windows with that tag to/from the view.
.TP
.B Mod1-Button1
.B Mod1\-Button1
click on a tag label applies that tag to the focused window.
.TP
.B Mod1-Button3
.B Mod1\-Button3
click on a tag label adds/removes that tag to/from the focused window.
.SS Keyboard commands
.TP
.B Mod1-Shift-Return
.B Mod1\-Shift\-Return
Start
.BR xterm (1).
.BR xterm.
.TP
.B Mod1-Tab
.B Mod1\-Return
Zooms/cycles current window to/from master area (tiled layout only).
.TP
.B Mod1\-Tab
Toggles to the previously selected tags.
.TP
.B Mod1\-b
Shows/hides the status bar.
.TP
.B Mod1\-h
Decreases the master area width about 5% (tiled layout only).
.TP
.B Mod1\-j
Focus next window.
.TP
.B Mod1-Shift-Tab
.B Mod1\-k
Focus previous window.
.TP
.B Mod1-Return
Zooms/cycles current window to/from master area (tiling mode), toggles maximization current window (floating mode).
.B Mod1\-l
Increases the master area width about 5% (tiled layout only).
.TP
.B Mod1-g
Grow current area (tiling mode only).
.B Mod1\-m
Toggles maximization of current window.
.TP
.B Mod1-s
Shrink current area (tiling mode only).
.TP
.B Mod1-Shift-[1..n]
.B Mod1\-Shift\-[1..n]
Apply
.RB nth
tag to current window.
.TP
.B Mod1-Control-Shift-[1..n]
.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.
.TP
.B Mod1-Shift-c
.B Mod1\-Shift\-c
Close focused window.
.TP
.B Mod1-space
Toggle between tiling and floating mode (affects all windows).
.B Mod1\-space
Toggle between tiled and floating layout (affects all windows).
.TP
.B Mod1-[1..n]
.B Mod1\-Shift\-space
Toggle focused window between tiled and floating state.
.TP
.B Mod1\-[1..n]
View all windows with
.BR nth
tag.
.TP
.B Mod1-0
.B Mod1\-0
View all windows with any tag.
.TP
.B Mod1-Control-[1..n]
.B Mod1\-Control\-[1..n]
Add/remove all windows with
.BR nth
tag to/from the view.
.TP
.B Mod1-Shift-q
.B Mod1\-Shift\-q
Quit dwm.
.SS Mouse commands
.TP
.B Mod1-Button1
Move current window while dragging (floating mode only).
.B Mod1\-Button1
Move current window while dragging. Tiled windows will be toggled to the floating state.
.TP
.B Mod1-Button2
Zoom current window to the master area (tiling mode only).
.B Mod1\-Button2
Zooms/cycles current window to/from master area. If it is floating (but not fixed) it will be toggled to the tiled state instead.
.TP
.B Mod1-Button3
Resize current window while dragging (floating mode only).
.B Mod1\-Button3
Resize current 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 CAVEATS
The status bar may display
.BR "broken pipe"
when dwm has been started by
.BR xdm (1),
because it closes standard output before executing dwm.
.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 .
.P
Recent 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
window is still respondable during this state, so you can simply ignore the flicker
until a new GTK version appears, which will fix this bug, approximately
GTK 2.10.12+ versions.

1895
dwm.c Normal file

File diff suppressed because it is too large Load Diff

171
dwm.h
View File

@ -1,171 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for 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 mode is
* represented by the arrange() function pointer, which wether points to
* dofloat() or dotile().
*
* 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)
#define MOUSEMASK (BUTTONMASK | PointerMotionMask)
/* other stuff used in different places */
#define BORDERPX 1
#define PROTODELWIN 1
enum { NetSupported, NetWMName, NetLast }; /* EWMH atoms */
enum { WMProtocols, WMDelete, WMLast }; /* default atoms */
enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
enum { ColFG, ColBG, ColLast }; /* color */
typedef enum {
TopLeft, TopRight, BotLeft, BotRight
} Corner; /* window corners */
typedef union {
const char *cmd;
int i;
} Arg; /* argument type */
typedef struct {
int ascent;
int descent;
int height;
XFontSet set;
XFontStruct *xfont;
} Fnt;
typedef struct {
int x, y, w, h;
unsigned long norm[ColLast];
unsigned long sel[ColLast];
unsigned long status[ColLast];
Drawable drawable;
Fnt font;
GC gc;
} DC; /* draw context */
typedef struct Client Client;
struct Client {
char name[256];
int proto;
int x, y, w, h;
int rx, ry, rw, rh; /* revert geometry */
int tx, ty, tw, th; /* title window geometry */
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int grav;
long flags;
unsigned int border, weight;
Bool isfloat, ismax;
Bool *tags;
Client *next;
Client *prev;
Client *snext;
Window win;
Window twin;
};
extern const char *tags[]; /* all tags */
extern char stext[1024]; /* status text */
extern int bx, by, bw, bh, bmw; /* bar geometry, bar mode label width */
extern int screen, sx, sy, sw, sh; /* screen geometry */
extern unsigned int master, ntags, numlockmask; /* master percent, number of tags, dynamic lock mask */
extern void (*handler[LASTEvent])(XEvent *); /* event handler */
extern void (*arrange)(void); /* arrange function, indicates mode */
extern Atom wmatom[WMLast], netatom[NetLast];
extern Bool running, issel, *seltag; /* seltag is array of Bool */
extern Client *clients, *sel, *stack; /* global client list and stack */
extern Cursor cursor[CurLast];
extern DC dc; /* global draw context */
extern Display *dpy;
extern Window root, barwin;
/* client.c */
extern void ban(Client *c); /* ban c from screen */
extern void configure(Client *c); /* send synthetic configure event */
extern void focus(Client *c); /* focus c, c may be NULL */
extern Client *getclient(Window w); /* return client of w */
extern Client *getctitle(Window w); /* return client of title window */
extern void gravitate(Client *c, Bool invert); /* gravitate c */
extern void killclient(Arg *arg); /* kill c nicely */
extern void manage(Window w, XWindowAttributes *wa); /* manage new client */
extern void resize(Client *c, Bool sizehints, Corner sticky); /* resize c*/
extern void resizetitle(Client *c); /* resizes c->twin correctly */
extern void updatesize(Client *c); /* update the size structs of c */
extern void updatetitle(Client *c); /* update the name of c */
extern void unmanage(Client *c); /* destroy c */
/* draw.c */
extern void drawall(void); /* draw all visible client titles and the bar */
extern void drawstatus(void); /* draw the bar */
extern void drawtitle(Client *c); /* draw title of c */
extern unsigned long getcolor(const char *colstr); /* return color of colstr */
extern void setfont(const char *fontstr); /* set the font for DC */
extern unsigned int textw(const char *text); /* return the width of text in px*/
/* event.c */
extern void grabkeys(void); /* grab all keys defined in config.h */
extern void procevent(void); /* process pending X events */
/* main.c */
extern int getproto(Window w); /* return protocol mask of WMProtocols property of w */
extern void quit(Arg *arg); /* quit dwm nicely */
extern void sendevent(Window w, Atom a, long value); /* send synthetic event to w */
extern int xerror(Display *dsply, XErrorEvent *ee); /* dwm's X error handler */
/* tag.c */
extern void initrregs(void); /* initialize regexps of rules defined in config.h */
extern Client *getnext(Client *c); /* returns next visible client */
extern Client *getprev(Client *c); /* returns previous visible client */
extern void settags(Client *c, Client *trans); /* sets tags of c */
extern void tag(Arg *arg); /* tags c with arg's index */
extern void toggletag(Arg *arg); /* toggles c tags with arg's index */
/* util.c */
extern void *emallocz(unsigned int size); /* allocates zero-initialized memory, exits on error */
extern void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */
extern void *erealloc(void *ptr, unsigned int size); /* reallocates memory, exits on error */
extern void spawn(Arg *arg); /* forks a new subprocess with to arg's cmd */
/* view.c */
extern void detach(Client *c); /* detaches c from global client list */
extern void dofloat(void); /* arranges all windows floating */
extern void dotile(void); /* arranges all windows tiled */
extern void focusnext(Arg *arg); /* focuses next visible client, arg is ignored */
extern void focusprev(Arg *arg); /* focuses previous visible client, arg is ignored */
extern Bool isvisible(Client *c); /* returns True if client is visible */
extern void resizecol(Arg *arg); /* resizes the master percent with arg's index value */
extern void restack(void); /* restores z layers of all clients */
extern void togglemode(Arg *arg); /* toggles global arrange function (dotile/dofloat) */
extern void toggleview(Arg *arg); /* toggles the tag with arg's index (in)visible */
extern void view(Arg *arg); /* views the tag with arg's index */
extern void viewall(Arg *arg); /* views all tags, arg is ignored */
extern void zoom(Arg *arg); /* zooms the focused client to master area, arg is ignored */

375
event.c
View File

@ -1,375 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <stdlib.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
/* static */
typedef struct {
unsigned long mod;
KeySym keysym;
void (*func)(Arg *arg);
Arg arg;
} Key;
KEYS
#define CLEANMASK(mask) (mask & ~(numlockmask | LockMask))
static void
movemouse(Client *c) {
int x1, y1, ocx, ocy, di;
unsigned int dui;
Window dummy;
XEvent ev;
ocx = c->x;
ocy = 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, &ev);
switch (ev.type) {
case ButtonRelease:
resize(c, True, TopLeft);
XUngrabPointer(dpy, CurrentTime);
return;
case Expose:
handler[Expose](&ev);
break;
case MotionNotify:
XSync(dpy, False);
c->x = ocx + (ev.xmotion.x - x1);
c->y = ocy + (ev.xmotion.y - y1);
resize(c, False, TopLeft);
break;
}
}
}
static void
resizemouse(Client *c) {
int ocx, ocy;
int nw, nh;
Corner sticky;
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->h);
for(;;) {
XMaskEvent(dpy, MOUSEMASK | ExposureMask, &ev);
switch(ev.type) {
case ButtonRelease:
resize(c, True, TopLeft);
XUngrabPointer(dpy, CurrentTime);
return;
case Expose:
handler[Expose](&ev);
break;
case MotionNotify:
XSync(dpy, False);
if((nw = abs(ocx - ev.xmotion.x)))
c->w = nw;
if((nh = abs(ocy - ev.xmotion.y)))
c->h = nh;
c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w;
c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h;
if(ocx <= ev.xmotion.x)
sticky = (ocy <= ev.xmotion.y) ? TopLeft : BotLeft;
else
sticky = (ocy <= ev.xmotion.y) ? TopRight : BotRight;
resize(c, True, sticky);
break;
}
}
}
static void
buttonpress(XEvent *e) {
int x;
Arg a;
Client *c;
XButtonPressedEvent *ev = &e->xbutton;
if(barwin == ev->window) {
x = 0;
for(a.i = 0; a.i < ntags; a.i++) {
x += textw(tags[a.i]);
if(ev->x < x) {
if(ev->button == Button1) {
if(ev->state & MODKEY)
tag(&a);
else
view(&a);
}
else if(ev->button == Button3) {
if(ev->state & MODKEY)
toggletag(&a);
else
toggleview(&a);
}
return;
}
}
if((ev->x < x + bmw) && (ev->button == Button1))
togglemode(NULL);
}
else if((c = getclient(ev->window))) {
focus(c);
if(CLEANMASK(ev->state) != MODKEY)
return;
if(ev->button == Button1 && (arrange == dofloat || c->isfloat)) {
restack();
movemouse(c);
}
else if(ev->button == Button2)
zoom(NULL);
else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) {
restack();
resizemouse(c);
}
}
}
static void
configurerequest(XEvent *e) {
unsigned long newmask;
Client *c;
XConfigureRequestEvent *ev = &e->xconfigurerequest;
XWindowChanges wc;
if((c = getclient(ev->window))) {
c->ismax = False;
gravitate(c, True);
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(ev->value_mask & CWBorderWidth)
c->border = ev->border_width;
gravitate(c, False);
wc.x = c->x;
wc.y = c->y;
wc.width = c->w;
wc.height = c->h;
newmask = ev->value_mask & (~(CWSibling | CWStackMode | CWBorderWidth));
if(newmask)
XConfigureWindow(dpy, c->win, newmask, &wc);
else
configure(c);
XSync(dpy, False);
if(c->isfloat) {
resize(c, False, TopLeft);
if(!isvisible(c))
ban(c);
}
else
arrange();
}
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
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)) || (c = getctitle(ev->window))) && isvisible(c))
focus(c);
else if(ev->window == root) {
issel = True;
XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
drawall();
}
}
static void
expose(XEvent *e) {
Client *c;
XExposeEvent *ev = &e->xexpose;
if(ev->count == 0) {
if(barwin == ev->window)
drawstatus();
else if((c = getctitle(ev->window)))
drawtitle(c);
}
}
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);
return;
}
}
}
static void
leavenotify(XEvent *e) {
XCrossingEvent *ev = &e->xcrossing;
if((ev->window == root) && !ev->same_screen) {
issel = False;
drawall();
}
}
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) {
XSelectInput(dpy, ev->window,
(StructureNotifyMask | PropertyChangeMask));
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))) {
if(ev->atom == wmatom[WMProtocols]) {
c->proto = getproto(c->win);
return;
}
switch (ev->atom) {
default: break;
case XA_WM_TRANSIENT_FOR:
XGetTransientForHint(dpy, c->win, &trans);
if(!c->isfloat && (c->isfloat = (trans != 0)))
arrange();
break;
case XA_WM_NORMAL_HINTS:
updatesize(c);
break;
}
if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
updatetitle(c);
resizetitle(c);
drawtitle(c);
}
}
}
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,
[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);
}
}
void
procevent(void) {
XEvent ev;
while(XPending(dpy)) {
XNextEvent(dpy, &ev);
if(handler[ev.type])
(handler[ev.type])(&ev); /* call handler */
}
}

284
main.c
View File

@ -1,284 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <errno.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[1024];
Bool *seltag;
int bx, by, bw, bh, bmw, masterd, screen, sx, sy, sw, sh;
unsigned int master, ntags, numlockmask;
Atom wmatom[WMLast], netatom[NetLast];
Bool running = True;
Bool issel = 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 void
cleanup(void) {
close(STDIN_FILENO);
while(sel) {
resize(sel, True, TopLeft);
unmanage(sel);
}
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);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
XSync(dpy, False);
free(seltag);
}
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))
continue;
if(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);
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 */
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);
}
}
XFree(modmap);
/* select for events */
wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
| EnterWindowMask | LeaveWindowMask;
wa.cursor = cursor[CurNormal];
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
grabkeys();
initrregs();
for(ntags = 0; tags[ntags]; ntags++);
seltag = emallocz(sizeof(Bool) * ntags);
seltag[0] = True;
/* style */
dc.norm[ColBG] = getcolor(NORMBGCOLOR);
dc.norm[ColFG] = getcolor(NORMFGCOLOR);
dc.sel[ColBG] = getcolor(SELBGCOLOR);
dc.sel[ColFG] = getcolor(SELFGCOLOR);
dc.status[ColBG] = getcolor(STATUSBGCOLOR);
dc.status[ColFG] = getcolor(STATUSFGCOLOR);
setfont(FONT);
/* geometry */
bmw = textw(TILESYMBOL) > textw(FLOATSYMBOL) ? textw(TILESYMBOL) : textw(FLOATSYMBOL);
sx = sy = 0;
sw = DisplayWidth(dpy, screen);
sh = DisplayHeight(dpy, screen);
master = MASTER;
/* bar */
bx = by = 0;
bw = sw;
dc.h = bh = dc.font.height + 2;
wa.override_redirect = 1;
wa.background_pixmap = ParentRelative;
wa.event_mask = ButtonPressMask | ExposureMask;
barwin = XCreateWindow(dpy, root, bx, by, bw, bh, 0, DefaultDepth(dpy, screen),
CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
XDefineCursor(dpy, barwin, cursor[CurNormal]);
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);
/* multihead support */
issel = 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 */
int
getproto(Window w) {
int i, format, protos, status;
unsigned long extra, res;
Atom *protocols, real;
protos = 0;
status = XGetWindowProperty(dpy, w, wmatom[WMProtocols], 0L, 20L, False,
XA_ATOM, &real, &format, &res, &extra, (unsigned char **)&protocols);
if(status != Success || protocols == 0)
return protos;
for(i = 0; i < res; i++)
if(protocols[i] == wmatom[WMDelete])
protos |= PROTODELWIN;
free(protocols);
return protos;
}
void
sendevent(Window w, Atom a, long value) {
XEvent e;
e.type = ClientMessage;
e.xclient.window = w;
e.xclient.message_type = a;
e.xclient.format = 32;
e.xclient.data.l[0] = value;
e.xclient.data.l[1] = CurrentTime;
XSendEvent(dpy, w, False, NoEventMask, &e);
XSync(dpy, False);
}
void
quit(Arg *arg) {
readin = running = False;
}
/* 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[]) {
int r, xfd;
fd_set rd;
if(argc == 2 && !strncmp("-v", argv[1], 3)) {
fputs("dwm-"VERSION", (C)opyright MMVI Anselm R. Garbe\n", stdout);
exit(EXIT_SUCCESS);
}
else if(argc != 1)
eprint("usage: dwm [-v]\n");
dpy = XOpenDisplay(0);
if(!dpy)
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);
procevent();
readin = True;
while(running) {
FD_ZERO(&rd);
if(readin)
FD_SET(STDIN_FILENO, &rd);
FD_SET(xfd, &rd);
r = select(xfd + 1, &rd, NULL, NULL, NULL);
if((r == -1) && (errno == EINTR))
continue;
if(r > 0) {
if(readin && FD_ISSET(STDIN_FILENO, &rd)) {
readin = NULL != fgets(stext, sizeof(stext), stdin);
if(readin)
stext[strlen(stext) - 1] = 0;
else
strcpy(stext, "broken pipe");
drawstatus();
}
}
else if(r < 0)
eprint("select failed\n");
procevent();
}
cleanup();
XCloseDisplay(dpy);
return 0;
}

135
tag.c
View File

@ -1,135 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <X11/Xutil.h>
typedef struct {
const char *clpattern;
const char *tpattern;
Bool isfloat;
} Rule;
typedef struct {
regex_t *clregex;
regex_t *tregex;
} RReg;
/* static */
TAGS
RULES
static RReg *rreg = NULL;
static unsigned int len = 0;
/* extern */
Client *
getnext(Client *c) {
for(; c && !isvisible(c); c = c->next);
return c;
}
Client *
getprev(Client *c) {
for(; c && !isvisible(c); c = c->prev);
return c;
}
void
initrregs(void) {
unsigned int i;
regex_t *reg;
if(rreg)
return;
len = sizeof(rule) / sizeof(rule[0]);
rreg = emallocz(len * sizeof(RReg));
for(i = 0; i < len; i++) {
if(rule[i].clpattern) {
reg = emallocz(sizeof(regex_t));
if(regcomp(reg, rule[i].clpattern, 0))
free(reg);
else
rreg[i].clregex = reg;
}
if(rule[i].tpattern) {
reg = emallocz(sizeof(regex_t));
if(regcomp(reg, rule[i].tpattern, 0))
free(reg);
else
rreg[i].tregex = reg;
}
}
}
void
settags(Client *c, Client *trans) {
char prop[512];
unsigned int i, j;
regmatch_t tmp;
Bool matched = trans != NULL;
XClassHint ch;
if(matched) {
for(i = 0; i < ntags; i++)
c->tags[i] = trans->tags[i];
}
else if(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; !matched && i < len; i++)
if(rreg[i].clregex && !regexec(rreg[i].clregex, prop, 1, &tmp, 0)) {
c->isfloat = rule[i].isfloat;
for(j = 0; rreg[i].tregex && j < ntags; j++) {
if(!regexec(rreg[i].tregex, 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];
for(c->weight = 0; c->weight < ntags && !c->tags[c->weight]; c->weight++);
}
void
tag(Arg *arg) {
unsigned int i;
if(!sel)
return;
for(i = 0; i < ntags; i++)
sel->tags[i] = False;
sel->tags[arg->i] = True;
sel->weight = arg->i;
arrange();
}
void
toggletag(Arg *arg) {
unsigned int i;
if(!sel)
return;
sel->tags[arg->i] = !sel->tags[arg->i];
for(i = 0; i < ntags && !sel->tags[i]; i++);
if(i == ntags)
sel->tags[arg->i] = True;
sel->weight = (i == ntags) ? arg->i : i;
arrange();
}

63
util.c
View File

@ -1,63 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for 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 *
erealloc(void *ptr, unsigned int size) {
void *res = realloc(ptr, size);
if(!res)
eprint("fatal: could not malloc() %u bytes\n", size);
return res;
}
void
spawn(Arg *arg) {
static char *shell = NULL;
if(!shell && !(shell = getenv("SHELL")))
shell = "/bin/sh";
if(!arg->cmd)
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->cmd, (char *)NULL);
fprintf(stderr, "dwm: execl '%s -c %s'", shell, arg->cmd);
perror(" failed");
}
exit(0);
}
wait(0);
}

314
view.c
View File

@ -1,314 +0,0 @@
/* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
* See LICENSE file for license details.
*/
#include "dwm.h"
/* static */
static Client *
minclient(void) {
Client *c, *min;
if((clients && clients->isfloat) || arrange == dofloat)
return clients; /* don't touch floating order */
for(min = c = clients; c; c = c->next)
if(c->weight < min->weight)
min = c;
return min;
}
static Client *
nexttiled(Client *c) {
for(c = getnext(c); c && c->isfloat; c = getnext(c->next));
return c;
}
static void
reorder(void) {
Client *c, *newclients, *tail;
newclients = tail = NULL;
while((c = minclient())) {
detach(c);
if(tail) {
c->prev = tail;
tail->next = c;
tail = c;
}
else
tail = newclients = c;
}
clients = newclients;
}
static void
togglemax(Client *c) {
XEvent ev;
if((c->ismax = !c->ismax)) {
c->rx = c->x; c->x = sx;
c->ry = c->y; c->y = bh;
c->rw = c->w; c->w = sw - 2 * BORDERPX;
c->rh = c->h; c->h = sh - bh - 2 * BORDERPX;
}
else {
c->x = c->rx;
c->y = c->ry;
c->w = c->rw;
c->h = c->rh;
}
resize(c, True, TopLeft);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
/* extern */
void (*arrange)(void) = DEFMODE;
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
dofloat(void) {
Client *c;
for(c = clients; c; c = c->next) {
if(isvisible(c)) {
resize(c, True, TopLeft);
}
else
ban(c);
}
if(!sel || !isvisible(sel)) {
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
restack();
}
void
dotile(void) {
unsigned int i, n, mpx, stackw, stackh, th;
Client *c;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
n++;
mpx = (sw * master) / 1000;
stackw = sw - mpx;
stackh = sh - bh;
th = stackh;
if(n > 1)
th /= (n - 1);
for(i = 0, c = clients; c; c = c->next, i++)
if(isvisible(c)) {
if(c->isfloat) {
resize(c, True, TopLeft);
continue;
}
c->ismax = False;
c->x = sx;
c->y = sy + bh;
if(n == 1) { /* only 1 window */
c->w = sw - 2 * BORDERPX;
c->h = sh - 2 * BORDERPX - bh;
}
else if(i == 0) { /* master window */
c->w = mpx - 2 * BORDERPX;
c->h = sh - bh - 2 * BORDERPX;
}
else { /* tile window */
c->x += mpx;
c->w = stackw - 2 * BORDERPX;
if(th > bh) {
c->y = sy + (i - 1) * th + bh;
if(i + 1 == n)
c->h = sh - c->y - 2 * BORDERPX;
else
c->h = th - 2 * BORDERPX;
}
else /* fallback if th < bh */
c->h = stackh - 2 * BORDERPX;
}
resize(c, False, TopLeft);
}
else
ban(c);
if(!sel || !isvisible(sel)) {
for(c = stack; c && !isvisible(c); c = c->snext);
focus(c);
}
restack();
}
void
focusnext(Arg *arg) {
Client *c;
if(!sel)
return;
if(!(c = getnext(sel->next)))
c = getnext(clients);
if(c) {
focus(c);
restack();
}
}
void
focusprev(Arg *arg) {
Client *c;
if(!sel)
return;
if(!(c = getprev(sel->prev))) {
for(c = clients; c && c->next; c = c->next);
c = getprev(c);
}
if(c) {
focus(c);
restack();
}
}
Bool
isvisible(Client *c) {
unsigned int i;
for(i = 0; i < ntags; i++)
if(c->tags[i] && seltag[i])
return True;
return False;
}
void
resizecol(Arg *arg) {
unsigned int n;
Client *c;
for(n = 0, c = clients; c; c = c->next)
if(isvisible(c) && !c->isfloat)
n++;
if(!sel || sel->isfloat || n < 2 || (arrange == dofloat))
return;
if(sel == getnext(clients)) {
if(master + arg->i > 950 || master + arg->i < 50)
return;
master += arg->i;
}
else {
if(master - arg->i > 950 || master - arg->i < 50)
return;
master -= arg->i;
}
arrange();
}
void
restack(void) {
Client *c;
XEvent ev;
if(!sel) {
drawstatus();
return;
}
if(sel->isfloat || arrange == dofloat) {
XRaiseWindow(dpy, sel->win);
XRaiseWindow(dpy, sel->twin);
}
if(arrange != dofloat) {
if(!sel->isfloat) {
XLowerWindow(dpy, sel->twin);
XLowerWindow(dpy, sel->win);
}
for(c = nexttiled(clients); c; c = nexttiled(c->next)) {
if(c == sel)
continue;
XLowerWindow(dpy, c->twin);
XLowerWindow(dpy, c->win);
}
}
drawall();
XSync(dpy, False);
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
}
void
togglemode(Arg *arg) {
arrange = (arrange == dofloat) ? dotile : dofloat;
if(sel)
arrange();
else
drawstatus();
}
void
toggleview(Arg *arg) {
unsigned int i;
seltag[arg->i] = !seltag[arg->i];
for(i = 0; i < ntags && !seltag[i]; i++);
if(i == ntags)
seltag[arg->i] = True; /* cannot toggle last view */
reorder();
arrange();
}
void
view(Arg *arg) {
unsigned int i;
for(i = 0; i < ntags; i++)
seltag[i] = False;
seltag[arg->i] = True;
reorder();
arrange();
}
void
viewall(Arg *arg) {
unsigned int i;
for(i = 0; i < ntags; i++)
seltag[i] = True;
reorder();
arrange();
}
void
zoom(Arg *arg) {
unsigned int n;
Client *c;
if(!sel)
return;
if(sel->isfloat || (arrange == dofloat)) {
togglemax(sel);
return;
}
for(n = 0, c = clients; c; c = c->next)
if(isvisible(c) && !c->isfloat)
n++;
if(n < 2 || (arrange == dofloat))
return;
if((c = sel) == nexttiled(clients))
if(!(c = nexttiled(c->next)))
return;
detach(c);
if(clients)
clients->prev = c;
c->next = clients;
clients = c;
focus(c);
arrange();
}