Compare commits
1557 Commits
Author | SHA1 | Date | |
---|---|---|---|
5ed9c48196 | |||
3c91283ede | |||
e941181f46 | |||
43e82adf0d | |||
42cf1c7d8f | |||
dce4fb3737 | |||
646b351cc7 | |||
e3b7e1d620 | |||
04db03a4e6 | |||
4a4817b3aa | |||
7e1182ce55 | |||
40529e1469 | |||
14343e69cc | |||
35db6d8afc | |||
3d1090ba89 | |||
18248ebf4b | |||
b468873b2b | |||
cdec9782a1 | |||
6af273771c | |||
4fb31e0896 | |||
b800a1d136 | |||
33a74489f0 | |||
5364697914 | |||
7edc596311 | |||
68b400e95d | |||
656882d76f | |||
1479e76f01 | |||
f2544a3318 | |||
aafeaf7317 | |||
f21d46ea7d | |||
c0ba635c50 | |||
0a673ad7a3 | |||
3aabc08ede | |||
d456617f0e | |||
61fe833a06 | |||
917e281634 | |||
31451c3ad3 | |||
344f35f9f5 | |||
87adcd263b | |||
fd3c19bd55 | |||
1bdb393f81 | |||
940feed314 | |||
606b44179d | |||
20f6917910 | |||
820cbb3545 | |||
90f3238301 | |||
3bfc43c3d0 | |||
c1128417a9 | |||
1b62f8fa58 | |||
54c3044dec | |||
51336aa4a3 | |||
c4b6ac812e | |||
873bcb97a9 | |||
907db0a851 | |||
4e7c469862 | |||
26445a0dc9 | |||
b5068e32e9 | |||
f099d2d5b5 | |||
80a9da555e | |||
d21026f0a1 | |||
e5a1e77351 | |||
8262d9e663 | |||
90af1ced3c | |||
5ccd42f807 | |||
1586b7a02d | |||
2420071f4c | |||
04c26574b8 | |||
b1a28ae1da | |||
f68a01cd76 | |||
2b625eb73e | |||
0f1f30daca | |||
dec4850d05 | |||
0de4197cc5 | |||
a372248b80 | |||
69e7d7dfd3 | |||
c99fe7dd7d | |||
d6670a800d | |||
6288c44697 | |||
d5c5c52b30 | |||
d0b4575bf4 | |||
03518ce49e | |||
cd8bb06af5 | |||
3150a8a1be | |||
b3c5f5435a | |||
a692bdcf2b | |||
d83454f6b7 | |||
27b0142203 | |||
867ba36030 | |||
e83f36db10 | |||
212f417e44 | |||
3a392b8558 | |||
92fe06b501 | |||
6cf29bff33 | |||
60c06a7cb4 | |||
1147546122 | |||
d384cee751 | |||
5c710cf89c | |||
8a111c181e | |||
2255bf46a0 | |||
04797343db | |||
e7d41cc188 | |||
22d8818850 | |||
6784429c3c | |||
37fea84de8 | |||
c14d293e51 | |||
79b1657a19 | |||
d24837f1ad | |||
3c2d303c0e | |||
1e20a0f78a | |||
96f9855248 | |||
3c48858ffa | |||
dd46d5b588 | |||
0bc4e41ebd | |||
703c4dd253 | |||
b68528d85d | |||
a644baf674 | |||
c1f8688bfa | |||
bea4dd2490 | |||
83d10be1c1 | |||
1529058f27 | |||
36311d88af | |||
f1a2a3c850 | |||
ee734fae6b | |||
62d3caa999 | |||
4c9b397ff9 | |||
5c6545adf5 | |||
a704b1ee34 | |||
f83d61dfe8 | |||
c6180949a7 | |||
1973ab0643 | |||
427053f8d1 | |||
a88e0373ef | |||
aa9f2be24e | |||
c53b29e60b | |||
d6bdd03d91 | |||
1144e98394 | |||
7671d03a90 | |||
bc554d45d8 | |||
ac4caea921 | |||
161f2d921b | |||
210378f198 | |||
7879616a75 | |||
9e8dd3479d | |||
0b72be924d | |||
91e902f7fe | |||
30fed9a211 | |||
c45d46ad9a | |||
6f55de8310 | |||
07ad298133 | |||
f0a4845e7d | |||
82ec7a7ed4 | |||
e7300e0f6f | |||
c3feffa1e2 | |||
956a430054 | |||
01056b6636 | |||
eb260b1a41 | |||
7fe81359d4 | |||
a3a859b4e9 | |||
9c066c24b3 | |||
0a668922a4 | |||
5762964232 | |||
cba6b211c2 | |||
42750a621b | |||
8ef465d592 | |||
33fe200b52 | |||
91fffb3f7d | |||
1fa31efebf | |||
244addb3f4 | |||
c13be8d620 | |||
dc39ae8568 | |||
966d76a428 | |||
7151bf8329 | |||
dfecd46190 | |||
5bc4db0f76 | |||
999d6e795f | |||
636075297c | |||
6877a00033 | |||
0927d635bc | |||
450b08dde2 | |||
da80487c07 | |||
d9779c06fc | |||
20996c6c5a | |||
8dc9fcf1b9 | |||
fc21dd4b7e | |||
758b100d12 | |||
8420fb1ced | |||
f6128a16f9 | |||
87526be6f0 | |||
565050ac51 | |||
5e408d8ff6 | |||
1724f7fa43 | |||
3e6fe6b541 | |||
6620615ab9 | |||
61c3095f2f | |||
a72dc2fec2 | |||
8b17f5517b | |||
cd96232f7e | |||
a9e145fe6d | |||
5dd92c7655 | |||
52bd69c2a4 | |||
ca376970db | |||
8352f2b3a8 | |||
d4bfde79f3 | |||
7ac8c1d4e1 | |||
16e1ef5d40 | |||
1d729384d1 | |||
25c1eb28f9 | |||
d719cc9a0e | |||
9cde6570cc | |||
e408ca97d8 | |||
183dc670a3 | |||
25947bcfdb | |||
1ddfc571ae | |||
21cd59a630 | |||
6cbe47d481 | |||
029655bb22 | |||
27db9d4448 | |||
176408afa8 | |||
64674c395b | |||
b9dee2c6f1 | |||
a73ff905b0 | |||
e3f0445df1 | |||
ab06f7444b | |||
a2a3590979 | |||
e8aafb8e91 | |||
18b1312449 | |||
80ee95473b | |||
454a04acdf | |||
891831fe62 | |||
cdb8e27453 | |||
5c4913e983 | |||
fa5ae54bbb | |||
7de534192c | |||
54dc0d542c | |||
913333f518 | |||
d702f39274 | |||
0d8671a5ad | |||
38e9b67026 | |||
a3bbdb1b7b | |||
d53ceee682 | |||
78f56672b5 | |||
c2fff604a7 | |||
6644a6aa2e | |||
3da2453997 | |||
2ce37bc69e | |||
f27ccc5c60 | |||
2dbfda72f0 | |||
7df39f3fc7 | |||
0b45199cec | |||
3632d7132f | |||
565697087b | |||
ea0008cba2 | |||
af508c2e82 | |||
f0d1d5206f | |||
1c80c05587 | |||
1e350be229 | |||
1a26389e2b | |||
bf9da23f07 | |||
2373940215 | |||
90687482ad | |||
5ab627c06c | |||
76d7e80fc4 | |||
af8049bce8 | |||
2bb51b3246 | |||
b16d8282be | |||
fef4614772 | |||
be39dddcc5 | |||
6d209b9b29 | |||
57a0788bd8 | |||
3ad906eede | |||
0be9fb8797 | |||
62a491e36d | |||
0b5dcf229f | |||
fda92f46aa | |||
a62ea4062f | |||
7dc28d130f | |||
fbce733532 | |||
e7572804fa | |||
ed1bef1241 | |||
2b047e460b | |||
5f74dc5e78 | |||
ea8a4ca46a | |||
4883a06221 | |||
4dea5324c0 | |||
53cac17692 | |||
83abfc05eb | |||
862b0d541d | |||
c1c6fdc5d8 | |||
9a4d07d9de | |||
30410108eb | |||
753e0e048e | |||
d15d4ba45a | |||
815f9c054d | |||
addc52c948 | |||
26f41c9055 | |||
73ec124ae9 | |||
ec11a3470c | |||
4b3b597da3 | |||
288cf78b18 | |||
6411aa921b | |||
db5db8806f | |||
258c338030 | |||
85da537856 | |||
2b4157eccd | |||
0f26de991f | |||
840f937a98 | |||
6975a7e31a | |||
47f63dce55 | |||
02a8ca95cf | |||
2ce50a9cad | |||
bfa5869da1 | |||
087a55f8d3 | |||
6d7285fd6e | |||
69c7b4b0ba | |||
97699e5b1b | |||
2dc7f42fd7 | |||
9f3a5cb754 | |||
b48fa3f101 | |||
051a404b66 | |||
d8d733c34f | |||
bb01e5a16f | |||
06f7eed103 | |||
0ffa6d1393 | |||
15ce143620 | |||
63d7190231 | |||
b279cef670 | |||
6254ef9dc7 | |||
4a2902efe4 | |||
6fad4c49f1 | |||
78f0f8595f | |||
7ecadcee39 | |||
c86ed46a1b | |||
9086f98068 | |||
9aa4a9043d | |||
d5893f55be | |||
f529d41ca1 | |||
45768ee04b | |||
a6d23fb61c | |||
bf76cefe47 | |||
9bb0f20515 | |||
2431ae7df7 | |||
829b6b57e7 | |||
7b4c512e62 | |||
7f7c3140a9 | |||
277155cf77 | |||
0c38ec7cd6 | |||
deef4c9bfd | |||
b86c818599 | |||
c2a916bf30 | |||
2bd46d1ce6 | |||
6e0ce46365 | |||
c853d5e9bb | |||
31da0b7525 | |||
12ea925076 | |||
79ecbeca7e | |||
cf98ea2a9c | |||
d8fad9bf7a | |||
f25cc5678f | |||
5a92420fce | |||
ae1d865ac0 | |||
1ce173402f | |||
a06b9193c7 | |||
43bb77a569 | |||
e3da222c1e | |||
66608a60fe | |||
b6aa84e51b | |||
9ff5143acb | |||
1edf6a7866 | |||
4db2f44277 | |||
1f1a132784 | |||
512541bfbd | |||
709da0b858 | |||
5cd65f8cd8 | |||
e3838e8585 | |||
016dca4f69 | |||
8f052596b2 | |||
9463d5354b | |||
d662f98d89 | |||
e5a965a274 | |||
5d422bb1ce | |||
38a43c2dcc | |||
c56533615f | |||
a8e0772c4d | |||
98e7950be8 | |||
88e6eb4a3a | |||
0840c1367c | |||
077d3e435b | |||
d26b60b43e | |||
32f36ab2d5 | |||
08bcf721b4 | |||
fc578c57e4 | |||
c8eaab21b6 | |||
c26e22ccee | |||
c2784e4a38 | |||
6e9387793b | |||
92f3c181c3 | |||
d589f7679a | |||
75690c808d | |||
fde58d5e63 | |||
e1002745fa | |||
940a4cc6c6 | |||
64243ab05b | |||
32c5046635 | |||
6c8618f502 | |||
9189f7a12d | |||
2d4faae522 | |||
5d2385b636 | |||
0fe2e783e9 | |||
cd3d83f571 | |||
0a9ef560c0 | |||
0528a37c79 | |||
56b2fece9e | |||
9f569fac74 | |||
48d0c56eac | |||
825d6cb93a | |||
f852504014 | |||
c3fa9e879f | |||
8e05f6c592 | |||
39d1ecd5b0 | |||
103fb58a44 | |||
5f55af40ae | |||
f806a17692 | |||
822101dd5b | |||
6bdef73a4f | |||
234b12eb73 | |||
bd4deaebfc | |||
499315c22c | |||
f22d047d41 | |||
4a5c8d84db | |||
71365a524f | |||
3afca3e6a1 | |||
bdc80bdad6 | |||
64707da963 | |||
549726869b | |||
42cb2bd3be | |||
585294ce0f | |||
a864a82b34 | |||
bd67a82fb5 | |||
14d8d828ab | |||
4246affc15 | |||
42c4b31003 | |||
a785a0d712 | |||
489ac07e83 | |||
349d768b57 | |||
6dfa7cac56 | |||
71681c21a5 | |||
704781875c | |||
d7cc0f6416 | |||
6b79f3f326 | |||
446fa8c671 | |||
fa244aa7fb | |||
7ac4f8a4af | |||
7eb26288fc | |||
93a4fe1052 | |||
5602f44b29 | |||
b848f4bda8 | |||
86c4797f2c | |||
c094ed2473 | |||
bfd6079a15 | |||
7f70d90219 | |||
858251de46 | |||
d26c28c1e7 | |||
b6335776e4 | |||
c059625128 | |||
874837f653 | |||
5fa559dbfc | |||
146ff227fe | |||
bb0a328978 | |||
721b208478 | |||
6229ed20c2 | |||
940240e5e6 | |||
08c596ed10 | |||
9ce6abb95c | |||
0e21794e02 | |||
d477fb6927 | |||
3d6630b7d2 | |||
c982bb1389 | |||
6cf73e706a | |||
a520ba3c0b | |||
0c71b16b92 | |||
00c28a7ef2 | |||
5a3a2d6b63 | |||
a355782a77 | |||
20cd336087 | |||
a6a216f28c | |||
2c2063bc75 | |||
e6ede461a9 | |||
6877205e9d | |||
fb5f99d935 | |||
7ebab7533a | |||
9fa5ca3538 | |||
fe6b0c0fc1 | |||
aa2395b6a8 | |||
dba22848c7 | |||
33b1960220 | |||
e237b2a76f | |||
dd9ee6d248 | |||
1380569133 | |||
831428b00c | |||
69439715c0 | |||
f2e98f48fb | |||
c19d4b2930 | |||
f77a3d0a62 | |||
8aa1533879 | |||
2fc9cffdeb | |||
3c5b6f03ba | |||
02673538bc | |||
95eae7b9d2 | |||
59107755c8 | |||
d05d09b205 | |||
47b1974446 | |||
247ba66c08 | |||
d7b074fcce | |||
c9170189bf | |||
f7a45ff28b | |||
add7df6e9b | |||
3a79b82721 | |||
b31b430592 | |||
88c8ead3e8 | |||
2e95837220 | |||
5d9ae3f3b7 | |||
2e38296edd | |||
59aa02a075 | |||
e3c2d327f6 | |||
295ad21092 | |||
39af3c2607 | |||
96ee9d888c | |||
a82cba2759 | |||
f7c097e802 | |||
da1b3fa437 | |||
ad0a2fa042 | |||
9804726c82 | |||
7bc272a4e4 | |||
f1719ac2de | |||
d99ec61482 | |||
2f70a14ee1 | |||
00ca643bd7 | |||
0271ac0ed7 | |||
d5178292ed | |||
2bfd3fffbf | |||
a3d8c05a95 | |||
fd01413fae | |||
d6e24f7116 | |||
c43d7b7587 | |||
de5b294edc | |||
8e0f8ffcc6 | |||
dd21823536 | |||
9cb9c32ee7 | |||
4076e2ff60 | |||
55edd2d6ec | |||
2e8e5509d9 | |||
4426032450 | |||
e0f0397896 | |||
ca3e847e45 | |||
c2737b7b93 | |||
191cb9ce28 | |||
6ab163c695 | |||
e8244395e4 | |||
954db46bac | |||
508922b90d | |||
4adfdc9d95 | |||
c619363d15 | |||
012710a3ce | |||
c2c54cc0fa | |||
a62630ae92 | |||
62b18fb9d4 | |||
e0d6451086 | |||
7a496e9777 | |||
308f95ae5a | |||
40a734bca9 | |||
985e330524 | |||
5f19423c7b | |||
d66ad1457e | |||
8497f9f781 | |||
91bb749e97 | |||
68ff133857 | |||
4380db468a | |||
123a565bb9 | |||
d0e0505301 | |||
762b66ae7c | |||
cb4951dd54 | |||
667da18b31 | |||
e9a0733506 | |||
198502f41d | |||
35efafe8ac | |||
951d022dfc | |||
54bde0f9d7 | |||
260a55ef62 | |||
0e98090d65 | |||
af4667a85a | |||
a98b5e5935 | |||
b8985dc7bb | |||
6f60b2e1cd | |||
3033d45d1c | |||
34e7872c89 | |||
c36f7c3c5e | |||
3fd39feb41 | |||
93eee247ca | |||
d5e8edcbcb | |||
13577b15e5 | |||
5473e763f6 | |||
cdd6c3e820 | |||
29f2b15ddc | |||
7b65b763bc | |||
e94774dd69 | |||
af0034f3a5 | |||
cd7ebaad25 | |||
8dc03d6e6b | |||
1dcb18c124 | |||
206eb344e2 | |||
04de5720e6 | |||
5a04edecb1 | |||
24c125cc8a | |||
0453c1d180 | |||
0b5c14cf59 | |||
a73de0cff4 | |||
eeea4ef583 | |||
883e09b2eb | |||
7e25897f11 | |||
95091dcad4 | |||
57676994ea | |||
60adbab726 | |||
c3eca4d14f | |||
d1f4fbb469 | |||
635b64384d | |||
bedbe59aaa | |||
3f3086f8b8 | |||
f92a4e45c4 | |||
2fc8a13588 | |||
63725004f5 | |||
e9348dcaca | |||
fa857b2896 | |||
c77663fcb4 | |||
17d39ee014 | |||
8d1810c85b | |||
60444daa70 | |||
b0477c3017 | |||
24dae7d7e3 | |||
fa1ce22bc4 | |||
1fafcb1820 | |||
08c2d92480 | |||
fe2775a15b | |||
01022b95d6 | |||
b2f276b0f9 | |||
d1ce3eac33 | |||
9449ea3e00 | |||
49197fe4bf | |||
11cfff2dae | |||
a026617c65 | |||
a6df995b5d | |||
e041ff70b0 | |||
2d7bb8d7c9 | |||
0235a84ef2 | |||
2091200c95 | |||
7e476fb86b | |||
9800518ae3 | |||
5d831eaa94 | |||
e0a6dee30d | |||
73e2aba341 | |||
9f88fd093c | |||
0e515a06c8 | |||
c4b3c0d979 | |||
f3a5116248 | |||
ae760f3f38 | |||
169d96ae8f | |||
f651435061 | |||
a92cf496c1 | |||
cc7970010b | |||
67a1141f44 | |||
8be3f3ec9e | |||
5762e92994 | |||
36672d0401 | |||
b18e684015 | |||
fc109ea8f7 | |||
b975c47280 | |||
47765f7286 | |||
96d7fe16ea | |||
78d1a22d4e | |||
0c60620410 | |||
50be6c8b67 | |||
7d156dee1e | |||
55d8dda9f4 | |||
86953bd682 | |||
a923298d35 | |||
04dec4c943 | |||
e40448fd63 | |||
10bc0ce912 | |||
e8792d95a1 | |||
feec92df84 | |||
10d13f01ff | |||
8fcc4ff0ae | |||
f2512243f4 | |||
b32cd4454b | |||
9e56e1ded6 | |||
e4ad320599 | |||
a200c39635 | |||
77044e8765 | |||
2feb3afe78 | |||
0937cc78bf | |||
f6e41b0bc3 | |||
2c6087e3d2 | |||
2d81b78b85 | |||
b5eea45a31 | |||
aa53e39ec0 | |||
4216bf801f | |||
2cd1609770 | |||
85c9ebf2fc | |||
796925089c | |||
da91dfc948 | |||
4135e34dfa | |||
846128a498 | |||
e461e60997 | |||
28c10330bd | |||
0d40590c2c | |||
8fda28be35 | |||
a54cf2ecef | |||
4b9337a01e | |||
154497541d | |||
e0cfe07648 | |||
82be289985 | |||
f2190c8fc2 | |||
c31648d15d | |||
52250e7c1e | |||
51a94a2f14 | |||
c95bf3db9d | |||
4bf3b01953 | |||
ff957d1eac | |||
83aa110c6f | |||
5a1a2edf0e | |||
b3419f49a3 | |||
141beb2704 | |||
4e49d5a0ad | |||
2c6be7239f | |||
d934296476 | |||
39ae286861 | |||
59e65d1709 | |||
9fdd2cd1a9 | |||
e1deda9e04 | |||
199a601611 | |||
492c6f10fc | |||
caa7ab5362 | |||
f3e672efd8 | |||
02d5dddc00 | |||
c789941bba | |||
e45b3ced67 | |||
5a9af492ae | |||
32563abe86 | |||
70c7b432ea | |||
69dfcaa317 | |||
6ee8e3e93b | |||
8439369db9 | |||
81658eaab3 | |||
81aebf8cae | |||
fa32f02a43 | |||
598e22907e | |||
1e826ddd3e | |||
a967d7f664 | |||
ce450c5bf1 | |||
8f5f7a5b5a | |||
5ad2828c57 | |||
b896b58d6d | |||
fef6c5c66b | |||
37e062b0ed | |||
cf58091736 | |||
2aef8b9b4c | |||
d96307cbe4 | |||
124866e269 | |||
ab3d6a7dfe | |||
c67dbb28e4 | |||
b8bccb4ac5 | |||
b6b2f584ec | |||
f7bdb39d9e | |||
ecd9c3e222 | |||
216099d072 | |||
fc2e3eae20 | |||
f9e7a33019 | |||
7c9fa2566f | |||
22399a3bc0 | |||
ad2508f957 | |||
b078599833 | |||
1e80207876 | |||
464fc2cd18 | |||
be8d6d40f6 | |||
f0c2353393 | |||
a730213c3b | |||
399993c6b5 | |||
4d318060a2 | |||
540d5eed46 | |||
7d071ce2bd | |||
93aeaa53c9 | |||
06f9f346e6 | |||
5c48012ad2 | |||
a686c9ccd2 | |||
9ca5c3b108 | |||
bab5b1178d | |||
ee8fb0c6e4 | |||
0d9d3e79e9 | |||
12280f0253 | |||
a58731e835 | |||
1df45593ed | |||
2122e39ce1 | |||
e70139428a | |||
3d1d75a224 | |||
35f08f4231 | |||
0ea0343a63 | |||
338c083858 | |||
671442e89d | |||
8d111632f5 | |||
fe5acb939a | |||
cac492b0e9 | |||
ef9b3e173c | |||
5a13632afb | |||
587100873a | |||
27b0595af7 | |||
12d5a26fd2 | |||
89b7f1503e | |||
5711609203 | |||
825b7c3eb1 | |||
ba96131af0 | |||
2c477cf661 | |||
986ca73074 | |||
288098893c | |||
cb9607c284 | |||
4bd4f421d3 | |||
84432e6b36 | |||
1a25414ace | |||
3171371498 | |||
92105e7862 | |||
6ee9f13457 | |||
352cae4380 | |||
b3b58c08e4 | |||
204f0a340d | |||
78666b99b8 | |||
0bdcf75e25 | |||
f1009285d8 | |||
f76b3a4685 | |||
84ae6e12eb | |||
784659565a | |||
7ae0c198b3 | |||
dc6623728d | |||
7541f1ad49 | |||
74cbbe5f35 | |||
52f0b9e2e3 | |||
29c26b88e7 | |||
f196b71e4d | |||
ab83872134 | |||
ad4962c7eb | |||
d180ba418c | |||
138b7fbd05 | |||
e7508783e8 | |||
f4d15b1fec | |||
355beb53f0 | |||
8012fcf333 | |||
6bc4556ebd | |||
879241c05c | |||
3794c62945 | |||
5a03daf47f | |||
6d5f67a092 | |||
cee56d3863 | |||
7c4da24465 | |||
cdbc84b9a8 | |||
b2f895166a | |||
ebe68f650a | |||
df9fd28f9a | |||
e9c49ddd7a | |||
f8415019d4 | |||
238dd5d2b1 | |||
64871a7045 | |||
2e95bc0413 | |||
4cdbd523e5 | |||
b3d7e07f18 | |||
30af19d442 | |||
5d9146ff37 | |||
5cc27f1b3c | |||
39ed54a468 | |||
b61f91361c | |||
3167373512 | |||
4cff744438 | |||
c3527bea57 | |||
de6695792a | |||
6e22ccf7b1 | |||
8a5f002c41 | |||
3ce8c9f338 | |||
0d095ae2ff | |||
2d7f59424c | |||
e256afe31e | |||
64cfebc5e7 | |||
7a095d0ce2 | |||
5052c538d9 | |||
22d8c6fd18 | |||
71857b87ee | |||
6ba400ee0f | |||
35e65ea640 | |||
d0d986dd0e | |||
9685e7dbc2 | |||
37f39afb8e | |||
dc9f62f393 | |||
7055315725 | |||
fd995dac78 | |||
e5765cdd84 | |||
8d0e58f80b | |||
8fcd1bfda8 | |||
e39e697998 | |||
d2dd58eabd | |||
c6fc6b173d | |||
4590d7877c | |||
f577fe4e27 | |||
9ed5de00b6 | |||
28ffff801b | |||
44ef3f5a07 | |||
dafbd0dcb0 | |||
2ddc78720a | |||
7ece30ebc0 | |||
3d48f33025 | |||
19fd903d40 | |||
5732e471ae | |||
042297b27b | |||
a5cb80b86c | |||
7e98db251e | |||
bced9077f9 | |||
82fed986f9 | |||
2c1db7ed35 | |||
ea4827a578 | |||
55be4d6137 | |||
1f18466409 | |||
b65a1e3379 | |||
87836d79ef | |||
c8a12a0852 | |||
71b84c2114 | |||
edb2660a2e | |||
17ec726b49 | |||
373b11de11 | |||
04a2b74529 | |||
fcd98308ba | |||
b233089815 | |||
201c56f6d3 | |||
1e051d71f5 | |||
ddc79603f9 | |||
dee5ea2335 | |||
b1c9f5f144 | |||
a542bdf658 | |||
96e1b25c8c | |||
caf5a16271 | |||
936e11fd54 | |||
9715ba82aa | |||
3c35b90dd3 | |||
1d63030665 | |||
6a5b41203e | |||
fbd310972d | |||
3059c9c507 | |||
3b18f17d4d | |||
72faa1919e | |||
f8181f64e2 | |||
0045ad87df | |||
ceea528eff | |||
6c5dc7017c | |||
ae0b4fdd92 | |||
b3cea4d388 | |||
d296081321 | |||
177ed7e5de | |||
f679125206 | |||
58beead14d | |||
e1811c37ca | |||
a24a6701c8 | |||
d108cfa7fc | |||
92cb5ebb7c | |||
653826572d | |||
5a5851bac2 | |||
1d4a24dae0 | |||
a768ea93fd | |||
c95fe6e24b | |||
c75168186b | |||
3a96c9a8d5 | |||
1617b95598 | |||
726ae5bf6d | |||
3e11b38349 | |||
16ed879524 | |||
20d7b5d058 | |||
11a08b9cfc | |||
c2b753d917 | |||
6c767072a3 | |||
e9cfae7aba | |||
7ac0de8350 | |||
0b7c0f10ee | |||
51f6405b0d | |||
6096f8a113 | |||
d939f301fa | |||
8c4623da80 | |||
0faaba04a5 | |||
ec7a5ffff1 | |||
98afb7b9d0 | |||
06bae9dfb7 | |||
0b80d1842d | |||
d7ec23a5db | |||
2cf8ef9520 | |||
184471b4bb | |||
21898c6049 | |||
6a9300e815 | |||
ac24f132db | |||
cb4aa5bc35 | |||
beac539f31 | |||
b5d297f02f | |||
9056d7ea88 | |||
ebd17e4827 | |||
7e59c89250 | |||
9e4e4d9022 | |||
71fd06f843 | |||
58e6866d86 | |||
c7da124149 | |||
21bd90d7d3 | |||
c8f96b5b4c | |||
ded60365d4 | |||
629647dfee | |||
4ca3d861f0 | |||
069e7a6e24 | |||
ac6e34ea06 | |||
a308b7507a | |||
630e7ff26f | |||
3764ab471b | |||
a3319c6f8e | |||
66c699a701 | |||
aaf1e44da9 | |||
1ef2307ec4 | |||
d42c3ba2dc | |||
4b06155873 | |||
857d825eeb | |||
6b345353e3 | |||
ab3b3a8f61 | |||
71b82fb1f6 | |||
9bd9ea423e | |||
99964398e7 | |||
7009ebfa69 | |||
760e23dd3a | |||
c53d9d516a | |||
7739e6b466 | |||
4881857458 | |||
c73d5cb7b6 | |||
6458803d21 | |||
6e72d781f7 | |||
4e926a9ef2 | |||
4ba3cfaee9 | |||
e655e8a7d5 | |||
c34e4e4b39 | |||
a678ee6365 | |||
49f0ee329d | |||
0c9d9a3d94 | |||
89e1acb0bb | |||
c2ed26b711 | |||
42fd392e05 | |||
e06447ee88 | |||
683dabe5e6 | |||
3aff96177c | |||
0a915eba8f | |||
19dcbc5717 | |||
d2a4952956 | |||
0c97b21b61 | |||
19390b1a91 | |||
8dc86051df | |||
46d5f9d1bf | |||
35e96b8deb | |||
2210ea7e3b | |||
61a1910f91 | |||
27ef73507b | |||
2b35fb643e | |||
478f6f95f1 | |||
44411d2d48 | |||
a2175cf71a | |||
4606d218c3 | |||
d37d0f24e6 | |||
321e8d51ed | |||
78f4b51757 | |||
7d168a2621 | |||
931e712eac | |||
4ec04209e0 | |||
82ddba88a2 | |||
52a8cc8d46 | |||
d175df8aa3 | |||
b003a35fde | |||
df1a0f9445 | |||
5b07b85838 | |||
f320cd203b | |||
f78c16f8c6 | |||
0c5f47e720 | |||
4b5b3d90af | |||
2cce4b95cd | |||
8e6eb52196 | |||
04b633ddf3 | |||
b76561a212 | |||
51c7589c87 | |||
99785382ae | |||
dc1690ce0f | |||
b6614261ea | |||
91e569ca37 | |||
0f395c1b11 | |||
2b13e7466f | |||
0982e47408 | |||
b93ebcf42f | |||
a08d83ba62 | |||
2b7c275ce8 | |||
040d0f48a0 | |||
724f35a664 | |||
6f3872edbd | |||
87324e680c | |||
c2b908f603 | |||
d7734f996f | |||
8b68890650 | |||
b60406cb9b | |||
ce9a9934ec | |||
720b2abe17 | |||
5983c00b95 | |||
6651dd7fd9 | |||
acdea31916 | |||
10885d349a | |||
1c1d09f3e9 | |||
0384faeee5 | |||
6cca3999c8 | |||
69408d384d | |||
4aea423f06 | |||
6fc8a63041 | |||
2583a7c0d1 | |||
0ef6e3103c | |||
7c052b37c8 | |||
d9c475d7f4 | |||
c8e57332d1 | |||
c045459917 | |||
e0f64e63db | |||
dddd58a8cd | |||
010fd21b20 | |||
1802fad2f9 | |||
f833d109d1 | |||
7225c99903 | |||
36178933ed | |||
ad0da9a571 | |||
6646468125 | |||
fee8df6ccf | |||
8fa47ac679 | |||
b427a2c6cb | |||
14d05e7c72 | |||
a118a57fe3 | |||
02cea3b47e | |||
1c2d673ded | |||
c34df2c1b6 | |||
6092aa977e | |||
c9cc2b385a | |||
b39d0c521a | |||
e87bed6df2 | |||
4ee05b3294 | |||
e81eb46a78 | |||
f315832f75 | |||
97ced11e53 | |||
4d6c4d36ce | |||
b4d53bf194 | |||
67bc08d1b9 | |||
bcb07de750 | |||
7d7cde0fd6 | |||
6b25d06d7d | |||
cff951c650 | |||
114cc3ec02 | |||
3c4b7672a8 | |||
6de149eb22 | |||
da909dd1e8 | |||
67986e81ee | |||
346bdea946 | |||
05c10c5776 | |||
b2cb925d99 | |||
9fb6502b3b | |||
9eb226ff78 | |||
e34c4eaf61 | |||
9e75bcfc75 | |||
d800ec05ff | |||
bda53ac6ad | |||
4230932563 | |||
f17e898bd1 | |||
886b2088f1 | |||
551d6bb23d | |||
d504005e91 | |||
2511b5c675 | |||
28aba061ec | |||
8e37c78ce3 | |||
ca68975ff8 | |||
529be52fea | |||
ca65478c89 | |||
a1e9362d38 | |||
cbfc69e310 | |||
1d7674bb22 | |||
e6cc22396a | |||
868159fd0a | |||
b597fa4637 | |||
d2d394eccf | |||
438beeabde | |||
281f0981a6 | |||
6ff346bed9 | |||
0925dd588c | |||
6f20315dff | |||
2e68f22118 | |||
8aa860d270 | |||
15abade272 | |||
7ab8c87281 | |||
4ff8f71643 | |||
d22abeee86 | |||
a33150eb4b | |||
fd00b3a186 | |||
e8389a4cc0 | |||
6078d756bc | |||
57c49fe867 | |||
c60de1acd4 | |||
69b738c097 | |||
da0b2a2f31 | |||
2378a558a2 | |||
f18ed615ae | |||
f6656fffb4 | |||
aaad7bfd15 | |||
0915da8842 | |||
0d0e8bde13 | |||
838a1ff950 | |||
e1315fd40c | |||
52a3ab1042 | |||
a82e7b765e | |||
0ed0fa4d5b | |||
ec85fddb9a | |||
3a1343a245 | |||
9066ee2eb4 | |||
40bd21ce63 | |||
4633fbec61 | |||
25060031a5 | |||
c7ae6334b7 | |||
eac04882b4 | |||
6499fc4f93 | |||
04f27a5438 | |||
1b3903d6e9 | |||
cc05093b0d | |||
6436dd4438 | |||
26c50c780e | |||
01d13b0c49 | |||
f15f45a9f8 | |||
1b2e149cb4 | |||
6136640ec9 | |||
95d8423823 | |||
de6411c338 | |||
e316cf53f6 | |||
c107db57db | |||
d39d00057c | |||
26157e6973 | |||
6d22782e8f | |||
1836b6740d | |||
924a088812 | |||
bab575c868 | |||
daae3bba50 | |||
05fbbbd8dc | |||
4c368bcd24 | |||
9927b9e642 | |||
1b492dffc8 | |||
140be1b4b3 | |||
79259acc12 | |||
5a3bea2d69 | |||
30d928591d | |||
70a3e62257 | |||
6828fba7a0 | |||
aa1bda8164 | |||
157ea539a2 | |||
c3c94c0e0a | |||
9d73909075 | |||
016c54196e | |||
5056bb952d | |||
8a6679b3b4 | |||
7b6d5ff298 | |||
846850914d | |||
4e6c513ac2 | |||
db9cda6a7d | |||
a50b15a9e9 | |||
0a25fe9188 | |||
2dd5212a79 | |||
00e95e1f38 | |||
0a0759132c | |||
5cf362c7d0 | |||
413be1112a | |||
8233dc8568 | |||
afa8b3bcd9 | |||
c518345f40 | |||
afe6ac9923 | |||
e995c1b532 | |||
e36929292e | |||
03128f78df | |||
7d4a5e654c | |||
41ba7a7984 | |||
aa471f2d65 | |||
d37dfa1bed | |||
9f35cc52fe | |||
f1fe19bc2b | |||
b55bd709ee | |||
9833610356 | |||
de7fc0011e | |||
2e0c767d74 | |||
a5379e901c | |||
a039d51d5f | |||
60b3dceccf | |||
c2ac851b90 | |||
c976bc6c2c | |||
2e834e941f | |||
77e5f3167c | |||
7e597ae204 | |||
c39df91ab9 | |||
af1158d105 | |||
b739721d9e | |||
7711ab6707 | |||
d370c32f69 | |||
d6a6eca71d | |||
39ffc18635 | |||
3e972ec84d | |||
b5159dfd2f | |||
07c2659806 | |||
dc83b9e988 | |||
8b4bc8270a | |||
0ff80653d3 | |||
352e1b4c81 | |||
aa13727067 | |||
595028614b | |||
6a3ae5e26a | |||
8c334ee078 | |||
f60fe2a4f9 | |||
b112257bf2 | |||
eb88adcd8a | |||
950a1ab5af | |||
1b9fe55025 | |||
2272df9d31 | |||
08d85d6d66 | |||
b43989207a | |||
2eebebf262 | |||
8c1fffe106 | |||
5e9acbc952 | |||
a420ceab50 | |||
0e1c649dca | |||
67c2124fa9 | |||
a635743c6d | |||
b5c2412d84 | |||
ad2e77d635 | |||
a20b10d01f | |||
4cc0551948 | |||
56130c3689 | |||
14f7380308 | |||
727449d1e7 | |||
80bf2aa559 | |||
b9cd0c4331 | |||
f77a87137c | |||
65dfe8fdce | |||
e3bb595d77 | |||
a1682b8927 | |||
24d91e3b8a | |||
ce04a66528 | |||
df74b26e5d | |||
b6ad663f87 | |||
ee31e38dc7 | |||
442334641e | |||
dfa5ea6360 | |||
3e06edeb5d | |||
78b050c13c | |||
4ad20ffc2c | |||
57e6e3bb80 | |||
19da197f58 | |||
666fae97e6 | |||
823fb1118a | |||
db1d62e184 | |||
d26ffc7fa3 | |||
0f3acce042 | |||
9eef9f7b02 | |||
aff4c787f4 | |||
fe3dfbbe90 | |||
2ffdc1936c | |||
0fe52c63ea | |||
28a52197c4 | |||
2c0d1cc87b | |||
375a251d16 | |||
d4b7a9a373 | |||
4d67199a4b | |||
95766d6241 | |||
4cb78a170c | |||
2c66b422e7 | |||
e571de83e9 | |||
4bb89e2cb1 | |||
349cadacf6 | |||
292ccc4c43 | |||
d7413ffd2d | |||
50729a2e73 | |||
a3e3f0b9ed | |||
45aea23355 | |||
975b459c17 | |||
2b35faee06 | |||
84818bdbb5 | |||
895902b57a | |||
7d4184dc5c | |||
8278f0a6be | |||
d3969634ac | |||
735ca9ccd6 | |||
4ee661d908 | |||
9fce8215b7 | |||
6521c2dd41 | |||
9ee9ce7e14 | |||
9d39da6452 | |||
0228dcd58f | |||
3d35ea99bb | |||
0680c76a6f | |||
c3e5f5cc9a | |||
1c620d27d8 | |||
fde45ebed8 | |||
4bd0d33f57 | |||
00255728aa | |||
4b0328f209 | |||
30561a0161 | |||
a4c4998c8b | |||
8e053b6476 | |||
b79b5facb1 | |||
c53f0fca91 | |||
c225e1afc2 | |||
92e55c7c53 | |||
c86f131681 | |||
e943234d09 | |||
9fc24e371b | |||
cac467d52c | |||
04f17d2669 | |||
dff15a02f7 | |||
42277b1110 | |||
095f9e143e | |||
9fbb2ebb90 | |||
dbcf87ce76 | |||
4250c26e9b | |||
e48de30516 | |||
1f0060caa3 | |||
c732cc90ab | |||
4e2c5b5f25 | |||
d9386a0c07 | |||
66e16c92d3 | |||
6a8e176df1 | |||
632c7f3410 | |||
045f1840e0 | |||
45d16d090b | |||
525c5ff4d8 | |||
5952157c3b | |||
f777d21899 | |||
82064af2d7 | |||
d54444cfd7 | |||
525ef3c178 | |||
5ef6ef1bac | |||
f4208e7cac | |||
ecc95c903b | |||
a207949b65 | |||
86d12249dd | |||
b098c94ed4 | |||
6a39a496d0 | |||
3d73084b5e | |||
12b1d439e4 | |||
1076161bf3 | |||
e21d93b7bd | |||
f504aea132 | |||
9955ddc978 | |||
0dfe729f90 | |||
8f698bd4cc | |||
99b126d0af | |||
a2d56f6dce | |||
db876f9fb0 | |||
05a618b06e | |||
72608f0d5a | |||
bba044de4f | |||
4d55eee754 | |||
d41b232b52 | |||
b35575574b | |||
666b4563a0 | |||
7315bb08ad | |||
f80688f1c7 | |||
dc5c070c44 | |||
8cc7f3bace | |||
5d3fd3707b | |||
1bf0c4a8e7 | |||
863656d2bc | |||
f1a34ae1e4 | |||
3000cad507 | |||
0f8249f262 | |||
b515765216 | |||
85e6d59956 | |||
95e8d12b71 | |||
a55f0e12fe | |||
0cf3ba0eab | |||
1d85225952 | |||
3af6434085 | |||
57871415c1 | |||
52021851d1 | |||
080a38d62d | |||
ab7a11c0c7 | |||
d8675f6f30 | |||
eff4478c2d | |||
81683351f0 | |||
b38905b004 | |||
d9a6a3b5d2 | |||
7c2e3bb67d | |||
b01a51a844 | |||
77f8c075c4 | |||
33b4821cd6 | |||
a73a882806 | |||
57416beefe | |||
1b63f832c5 | |||
7b5638f61d | |||
937cabfa0a | |||
deba5069e5 | |||
956113b295 | |||
db98a7d60f | |||
0464e42231 | |||
4970ef938e | |||
f85b163899 | |||
2b66f7afb1 | |||
67b3083dfd | |||
0c7bcc24cb | |||
98c6a92eb5 | |||
ba59bc8b9f | |||
cd8d8e1208 | |||
04eb016e78 | |||
0a4342098b | |||
72707c2fae | |||
06dc514bc7 | |||
2b5553b1eb | |||
4688ad181d | |||
dc5d967ee6 | |||
fe3756c8e1 | |||
01b151f5f8 | |||
8bb4a93f2b | |||
5ec04b7726 | |||
3657eaedf3 | |||
9291283a18 | |||
eccd02def2 | |||
11737233a7 | |||
bcaf6a7a0f | |||
f95eed34b4 | |||
1eaffa372f | |||
b1697e8d5f | |||
801d11c7e7 | |||
1b855fccd7 | |||
d34b4c7b9a | |||
1f9614f82e | |||
4491bdda69 | |||
8af1d97332 | |||
79cd408844 | |||
18be893b66 | |||
0fb1842fd0 | |||
f522930a99 | |||
aebd745f72 | |||
c53980cddc | |||
95e56ffc0d | |||
f1294353f2 | |||
6649dcce6d | |||
58f2fe3f6a | |||
0aaa9a21f3 | |||
4f8b08d330 | |||
849e631510 | |||
789717d109 | |||
605630c145 | |||
1e7e57dad3 | |||
eb184e02ea | |||
ed41473634 | |||
ee5ba14431 |
44
BUGS
Normal file
44
BUGS
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
18:17 < Biolunar> when i change my resolution in dwm (to a smaller one) and then back to the native, the top bar is not repainted. that's since 5.7.2, in 5.6 it worked fine
|
||||||
|
18:19 < Biolunar> is it just happening to me or a (known) bug?
|
||||||
|
18:24 < Biolunar> and in addition, mplayers fullscreen is limited to the small resolution after i changed it back to the native
|
||||||
|
|
||||||
|
reproducible with xrandr -s but not with --output and --mode, strange
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
yet another corner case:
|
||||||
|
open a terminal, focus another monitor, but without moving the mouse
|
||||||
|
pointer there
|
||||||
|
if there is no client on the other monitor to get the focus, then the
|
||||||
|
terminal will be unfocused but it will accept input
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Donald Allen reported this:
|
||||||
|
|
||||||
|
starting emacs from dmenu in archlinux results in missing configure of emacs, but mod1-space or mod1-shift-space fix this problem. this problem is new and did not happen in 1.6 xorg servers
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
voltaic reports this:
|
||||||
|
|
||||||
|
When I use two monitors, one larger in resolution than the other, the
|
||||||
|
bar is drawn using the smaller x-dimension on both screens. I think
|
||||||
|
what's happening is that there are two bars drawn, but the short bar
|
||||||
|
is always on top of the long bar such that I can't see the information
|
||||||
|
under the short bar. If I switch to the small screen, hide the short
|
||||||
|
bar, and then switch to the large screen, the long bar is drawn
|
||||||
|
correctly.
|
||||||
|
|
||||||
|
A similar problem occurs when I have started dwm on a small resolution
|
||||||
|
monitor (laptop screen) and then I switch to a large external display.
|
||||||
|
When I do this, the bar itself is drawn for the original smaller
|
||||||
|
resolution, but the information to be printed on the bar is
|
||||||
|
right-aligned for a longer bar. So what I see is a bar that has the
|
||||||
|
right hand side of it cut-off. See attached screenshot.
|
||||||
|
|
||||||
|
I am using standard options for xrandr such as --output VGA1 --auto, etc.
|
||||||
|
|
||||||
|
---
|
14
LICENSE
14
LICENSE
@ -1,6 +1,18 @@
|
|||||||
MIT/X Consortium License
|
MIT/X Consortium License
|
||||||
|
|
||||||
(C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
|
© 2006-2014 Anselm R Garbe <anselm@garbe.us>
|
||||||
|
© 2010-2014 Hiltjo Posthuma <hiltjo@codemadness.org>
|
||||||
|
© 2007-2011 Peter Hartlich <sgkkr at hartlich dot com>
|
||||||
|
© 2010-2011 Connor Lane Smith <cls@lubutu.com>
|
||||||
|
© 2006-2009 Jukka Salmi <jukka at salmi dot ch>
|
||||||
|
© 2007-2009 Premysl Hruby <dfenze at gmail dot com>
|
||||||
|
© 2007-2009 Szabolcs Nagy <nszabolcs at gmail dot com>
|
||||||
|
© 2007-2009 Christof Musik <christof at sendfax dot de>
|
||||||
|
© 2009 Mate Nagy <mnagy at port70 dot net>
|
||||||
|
© 2007-2008 Enno Gottox Boland <gottox at s01 dot de>
|
||||||
|
© 2008 Martin Hurton <martin dot hurton at gmail dot com>
|
||||||
|
© 2008 Neale Pickett <neale dot woozle dot org>
|
||||||
|
© 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
copy of this software and associated documentation files (the "Software"),
|
copy of this software and associated documentation files (the "Software"),
|
||||||
|
57
Makefile
57
Makefile
@ -1,19 +1,15 @@
|
|||||||
# dwm - dynamic window manager
|
# dwm - dynamic window manager
|
||||||
# (C)opyright MMVI Anselm R. Garbe
|
# See LICENSE file for copyright and license details.
|
||||||
|
|
||||||
include config.mk
|
include config.mk
|
||||||
|
|
||||||
SRC = client.c draw.c event.c main.c tag.c util.c
|
SRC = drw.c dwm.c util.c
|
||||||
OBJ = ${SRC:.c=.o}
|
OBJ = ${SRC:.c=.o}
|
||||||
MAN1 = dwm.1
|
|
||||||
BIN = dwm
|
|
||||||
|
|
||||||
all: config dwm
|
all: options dwm
|
||||||
@echo finished
|
|
||||||
|
|
||||||
config:
|
options:
|
||||||
@echo dwm build options:
|
@echo dwm build options:
|
||||||
@echo "LIBS = ${LIBS}"
|
|
||||||
@echo "CFLAGS = ${CFLAGS}"
|
@echo "CFLAGS = ${CFLAGS}"
|
||||||
@echo "LDFLAGS = ${LDFLAGS}"
|
@echo "LDFLAGS = ${LDFLAGS}"
|
||||||
@echo "CC = ${CC}"
|
@echo "CC = ${CC}"
|
||||||
@ -22,34 +18,43 @@ config:
|
|||||||
@echo CC $<
|
@echo CC $<
|
||||||
@${CC} -c ${CFLAGS} $<
|
@${CC} -c ${CFLAGS} $<
|
||||||
|
|
||||||
${OBJ}: dwm.h
|
${OBJ}: config.h config.mk
|
||||||
|
|
||||||
|
config.h:
|
||||||
|
@echo creating $@ from config.def.h
|
||||||
|
@cp config.def.h $@
|
||||||
|
|
||||||
dwm: ${OBJ}
|
dwm: ${OBJ}
|
||||||
@echo LD $@
|
@echo CC -o $@
|
||||||
@${CC} -o $@ ${OBJ} ${LDFLAGS}
|
@${CC} -o $@ ${OBJ} ${LDFLAGS}
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f dwm *.o core dwm-${VERSION}.tar.gz
|
@echo cleaning
|
||||||
|
@rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz
|
||||||
|
|
||||||
dist: clean
|
dist: clean
|
||||||
mkdir -p dwm-${VERSION}
|
@echo creating dist tarball
|
||||||
cp -R Makefile README LICENSE config.mk *.h *.c ${MAN1} dwm-${VERSION}
|
@mkdir -p dwm-${VERSION}
|
||||||
tar -cf dwm-${VERSION}.tar dwm-${VERSION}
|
@cp -R LICENSE TODO BUGS Makefile README config.def.h config.mk \
|
||||||
gzip dwm-${VERSION}.tar
|
dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION}
|
||||||
rm -rf dwm-${VERSION}
|
@tar -cf dwm-${VERSION}.tar dwm-${VERSION}
|
||||||
|
@gzip dwm-${VERSION}.tar
|
||||||
|
@rm -rf dwm-${VERSION}
|
||||||
|
|
||||||
install: all
|
install: all
|
||||||
|
@echo installing executable file to ${DESTDIR}${PREFIX}/bin
|
||||||
@mkdir -p ${DESTDIR}${PREFIX}/bin
|
@mkdir -p ${DESTDIR}${PREFIX}/bin
|
||||||
@cp -f ${BIN} ${DESTDIR}${PREFIX}/bin
|
@cp -f dwm ${DESTDIR}${PREFIX}/bin
|
||||||
@echo installed executable files to ${DESTDIR}${PREFIX}/bin
|
@chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
|
||||||
|
@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
|
||||||
@mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
@mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
||||||
@cp -f ${MAN1} ${DESTDIR}${MANPREFIX}/man1
|
@sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||||
@echo installed manual pages to ${DESTDIR}${MANPREFIX}/man1
|
@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||||
|
|
||||||
uninstall:
|
uninstall:
|
||||||
for i in ${BIN}; do \
|
@echo removing executable file from ${DESTDIR}${PREFIX}/bin
|
||||||
rm -f ${DESTDIR}${PREFIX}/bin/`basename $$i`; \
|
@rm -f ${DESTDIR}${PREFIX}/bin/dwm
|
||||||
done
|
@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
|
||||||
for i in ${MAN1}; do \
|
@rm -f ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||||
rm -f ${DESTDIR}${MANPREFIX}/man1/`basename $$i`; \
|
|
||||||
done
|
.PHONY: all options clean dist install uninstall
|
||||||
|
27
README
27
README
@ -1,7 +1,6 @@
|
|||||||
dwm - dynamic window manager
|
dwm - dynamic window manager
|
||||||
----------------------------
|
============================
|
||||||
|
dwm is an extremely fast, small, and dynamic window manager for X.
|
||||||
dwm is an extremly fast, small, and dynamic X11 window manager.
|
|
||||||
|
|
||||||
|
|
||||||
Requirements
|
Requirements
|
||||||
@ -11,14 +10,17 @@ In order to build dwm you need the Xlib header files.
|
|||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
Edit config.mk to match your local setup. dwm is installed into
|
Edit config.mk to match your local setup (dwm is installed into
|
||||||
the /usr/local namespace by default.
|
the /usr/local namespace by default).
|
||||||
|
|
||||||
Afterwards enter the following command to build and install dwm (if
|
Afterwards enter the following command to build and install dwm (if
|
||||||
necessary as root):
|
necessary as root):
|
||||||
|
|
||||||
make clean install
|
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
|
Running dwm
|
||||||
-----------
|
-----------
|
||||||
@ -31,10 +33,19 @@ the DISPLAY environment variable is set correctly, e.g.:
|
|||||||
|
|
||||||
DISPLAY=foo.bar:1 exec dwm
|
DISPLAY=foo.bar:1 exec dwm
|
||||||
|
|
||||||
This will start dwm on display :1 of the host foo.bar.
|
(This will start dwm on display :1 of the host foo.bar.)
|
||||||
|
|
||||||
|
In order to display status info in the bar, you can do something
|
||||||
|
like this in your .xinitrc:
|
||||||
|
|
||||||
|
while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
|
||||||
|
do
|
||||||
|
sleep 1
|
||||||
|
done &
|
||||||
|
exec dwm
|
||||||
|
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
-------------
|
-------------
|
||||||
The configuration of dwm is done by customizing the wm.h source file. To
|
The configuration of dwm is done by creating a custom config.h
|
||||||
customize the key bindings edit dev.c.
|
and (re)compiling the source code.
|
||||||
|
5
TODO
5
TODO
@ -1 +1,4 @@
|
|||||||
- improve mouse based resizals with quadrant approach (then I think we have feature completeness already)
|
- add a flag to Key to execute the command on release (needed for commands
|
||||||
|
affecting the keyboard grab, see scrot -s for example)
|
||||||
|
- add updategeom() hook for external tools like dzen
|
||||||
|
- consider onscreenkeyboard hooks for tablet deployment
|
||||||
|
425
client.c
425
client.c
@ -1,425 +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
|
|
||||||
resizetitle(Client *c)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
c->tw = 0;
|
|
||||||
for(i = 0; i < TLast; i++)
|
|
||||||
if(c->tags[i])
|
|
||||||
c->tw += textw(c->tags[i]);
|
|
||||||
c->tw += textw(c->name);
|
|
||||||
if(c->tw > c->w)
|
|
||||||
c->tw = c->w + 2;
|
|
||||||
c->tx = c->x + c->w - c->tw + 2;
|
|
||||||
c->ty = c->y;
|
|
||||||
XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
|
|
||||||
}
|
|
||||||
|
|
||||||
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->title, c->tx + 2 * sw, c->ty);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
focus(Client *c)
|
|
||||||
{
|
|
||||||
Client *old = sel;
|
|
||||||
XEvent ev;
|
|
||||||
|
|
||||||
sel = c;
|
|
||||||
if(old && old != c)
|
|
||||||
drawtitle(old);
|
|
||||||
drawtitle(c);
|
|
||||||
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
|
|
||||||
XSync(dpy, False);
|
|
||||||
while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
focusnext(Arg *arg)
|
|
||||||
{
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
if(!sel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(!(c = getnext(sel->next)))
|
|
||||||
c = getnext(clients);
|
|
||||||
if(c) {
|
|
||||||
higher(c);
|
|
||||||
c->revert = sel;
|
|
||||||
focus(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
focusprev(Arg *arg)
|
|
||||||
{
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
if(!sel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) {
|
|
||||||
higher(c);
|
|
||||||
focus(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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->title == w)
|
|
||||||
return c;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gravitate(Client *c, Bool invert)
|
|
||||||
{
|
|
||||||
int dx = 0, dy = 0;
|
|
||||||
|
|
||||||
switch(c->grav) {
|
|
||||||
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;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (c->grav) {
|
|
||||||
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;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(invert) {
|
|
||||||
dx = -dx;
|
|
||||||
dy = -dy;
|
|
||||||
}
|
|
||||||
c->x += dx;
|
|
||||||
c->y += dy;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
higher(Client *c)
|
|
||||||
{
|
|
||||||
XRaiseWindow(dpy, c->win);
|
|
||||||
XRaiseWindow(dpy, c->title);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
killclient(Arg *arg)
|
|
||||||
{
|
|
||||||
if(!sel)
|
|
||||||
return;
|
|
||||||
if(sel->proto & WM_PROTOCOL_DELWIN)
|
|
||||||
sendevent(sel->win, wmatom[WMProtocols], wmatom[WMDelete]);
|
|
||||||
else
|
|
||||||
XKillClient(dpy, sel->win);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
lower(Client *c)
|
|
||||||
{
|
|
||||||
XLowerWindow(dpy, c->title);
|
|
||||||
XLowerWindow(dpy, c->win);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
manage(Window w, XWindowAttributes *wa)
|
|
||||||
{
|
|
||||||
Client *c;
|
|
||||||
XSetWindowAttributes twa;
|
|
||||||
Window trans;
|
|
||||||
|
|
||||||
c = emallocz(sizeof(Client));
|
|
||||||
c->win = w;
|
|
||||||
c->tx = c->x = wa->x;
|
|
||||||
c->ty = c->y = wa->y;
|
|
||||||
if(c->y < bh)
|
|
||||||
c->ty = c->y += bh;
|
|
||||||
c->tw = c->w = wa->width;
|
|
||||||
c->h = wa->height;
|
|
||||||
c->th = bh;
|
|
||||||
c->border = 1;
|
|
||||||
c->proto = getproto(c->win);
|
|
||||||
setsize(c);
|
|
||||||
XSelectInput(dpy, c->win,
|
|
||||||
StructureNotifyMask | PropertyChangeMask | EnterWindowMask);
|
|
||||||
XGetTransientForHint(dpy, c->win, &trans);
|
|
||||||
twa.override_redirect = 1;
|
|
||||||
twa.background_pixmap = ParentRelative;
|
|
||||||
twa.event_mask = ExposureMask;
|
|
||||||
|
|
||||||
c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
|
|
||||||
0, DefaultDepth(dpy, screen), CopyFromParent,
|
|
||||||
DefaultVisual(dpy, screen),
|
|
||||||
CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
|
|
||||||
|
|
||||||
settitle(c);
|
|
||||||
settags(c);
|
|
||||||
|
|
||||||
c->next = clients;
|
|
||||||
clients = c;
|
|
||||||
|
|
||||||
XGrabButton(dpy, Button1, ControlMask, c->win, False, ButtonPressMask,
|
|
||||||
GrabModeAsync, GrabModeSync, None, None);
|
|
||||||
XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask,
|
|
||||||
GrabModeAsync, GrabModeSync, None, None);
|
|
||||||
XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask,
|
|
||||||
GrabModeAsync, GrabModeSync, None, None);
|
|
||||||
XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask,
|
|
||||||
GrabModeAsync, GrabModeSync, None, None);
|
|
||||||
|
|
||||||
if(!c->isfloat)
|
|
||||||
c->isfloat = trans
|
|
||||||
|| ((c->maxw == c->minw) && (c->maxh == c->minh));
|
|
||||||
|
|
||||||
arrange(NULL);
|
|
||||||
/* mapping the window now prevents flicker */
|
|
||||||
if(c->tags[tsel]) {
|
|
||||||
XMapRaised(dpy, c->win);
|
|
||||||
XMapRaised(dpy, c->title);
|
|
||||||
focus(c);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ban(c);
|
|
||||||
XMapRaised(dpy, c->win);
|
|
||||||
XMapRaised(dpy, c->title);
|
|
||||||
XSync(dpy, False);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
maximize(Arg *arg)
|
|
||||||
{
|
|
||||||
if(!sel)
|
|
||||||
return;
|
|
||||||
sel->x = sx;
|
|
||||||
sel->y = sy + bh;
|
|
||||||
sel->w = sw - 2 * sel->border;
|
|
||||||
sel->h = sh - 2 * sel->border - bh;
|
|
||||||
higher(sel);
|
|
||||||
resize(sel, False);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
resize(Client *c, Bool inc)
|
|
||||||
{
|
|
||||||
XConfigureEvent e;
|
|
||||||
|
|
||||||
if(inc) {
|
|
||||||
if(c->incw)
|
|
||||||
c->w -= (c->w - c->basew) % c->incw;
|
|
||||||
if(c->inch)
|
|
||||||
c->h -= (c->h - c->baseh) % c->inch;
|
|
||||||
}
|
|
||||||
if(c->x > sw) /* might happen on restart */
|
|
||||||
c->x = sw - c->w;
|
|
||||||
if(c->y > sh)
|
|
||||||
c->ty = c->y = sh - c->h;
|
|
||||||
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;
|
|
||||||
resizetitle(c);
|
|
||||||
XSetWindowBorderWidth(dpy, c->win, 1);
|
|
||||||
XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
|
|
||||||
e.type = ConfigureNotify;
|
|
||||||
e.event = c->win;
|
|
||||||
e.window = c->win;
|
|
||||||
e.x = c->x;
|
|
||||||
e.y = c->y;
|
|
||||||
e.width = c->w;
|
|
||||||
e.height = c->h;
|
|
||||||
e.border_width = c->border;
|
|
||||||
e.above = None;
|
|
||||||
e.override_redirect = False;
|
|
||||||
XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
|
|
||||||
XSync(dpy, False);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
setsize(Client *c)
|
|
||||||
{
|
|
||||||
XSizeHints size;
|
|
||||||
long msize;
|
|
||||||
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
|
|
||||||
settitle(Client *c)
|
|
||||||
{
|
|
||||||
XTextProperty name;
|
|
||||||
int n;
|
|
||||||
char **list = NULL;
|
|
||||||
|
|
||||||
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);
|
|
||||||
resizetitle(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
unmanage(Client *c)
|
|
||||||
{
|
|
||||||
Client **l;
|
|
||||||
|
|
||||||
XGrabServer(dpy);
|
|
||||||
XSetErrorHandler(xerrordummy);
|
|
||||||
|
|
||||||
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
|
|
||||||
XDestroyWindow(dpy, c->title);
|
|
||||||
|
|
||||||
for(l = &clients; *l && *l != c; l = &(*l)->next);
|
|
||||||
*l = c->next;
|
|
||||||
for(l = &clients; *l; l = &(*l)->next)
|
|
||||||
if((*l)->revert == c)
|
|
||||||
(*l)->revert = NULL;
|
|
||||||
if(sel == c)
|
|
||||||
sel = sel->revert ? sel->revert : clients;
|
|
||||||
|
|
||||||
free(c);
|
|
||||||
|
|
||||||
XSync(dpy, False);
|
|
||||||
XSetErrorHandler(xerror);
|
|
||||||
XUngrabServer(dpy);
|
|
||||||
arrange(NULL);
|
|
||||||
if(sel)
|
|
||||||
focus(sel);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
zoom(Arg *arg)
|
|
||||||
{
|
|
||||||
Client **l, *c;
|
|
||||||
|
|
||||||
if(!sel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(sel == getnext(clients) && sel->next) {
|
|
||||||
if((c = getnext(sel->next)))
|
|
||||||
sel = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(l = &clients; *l && *l != sel; l = &(*l)->next);
|
|
||||||
*l = sel->next;
|
|
||||||
|
|
||||||
sel->next = clients; /* pop */
|
|
||||||
clients = sel;
|
|
||||||
arrange(NULL);
|
|
||||||
focus(sel);
|
|
||||||
}
|
|
113
config.def.h
Normal file
113
config.def.h
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
|
||||||
|
/* appearance */
|
||||||
|
static const char *fonts[] = {
|
||||||
|
"monospace:size=10"
|
||||||
|
};
|
||||||
|
static const char dmenufont[] = "monospace:size=10";
|
||||||
|
static const char normbordercolor[] = "#444444";
|
||||||
|
static const char normbgcolor[] = "#222222";
|
||||||
|
static const char normfgcolor[] = "#bbbbbb";
|
||||||
|
static const char selbordercolor[] = "#005577";
|
||||||
|
static const char selbgcolor[] = "#005577";
|
||||||
|
static const char selfgcolor[] = "#eeeeee";
|
||||||
|
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||||
|
static const unsigned int snap = 32; /* snap pixel */
|
||||||
|
static const int showbar = 1; /* 0 means no bar */
|
||||||
|
static const int topbar = 1; /* 0 means bottom bar */
|
||||||
|
|
||||||
|
/* tagging */
|
||||||
|
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||||
|
|
||||||
|
static const Rule rules[] = {
|
||||||
|
/* xprop(1):
|
||||||
|
* WM_CLASS(STRING) = instance, class
|
||||||
|
* WM_NAME(STRING) = title
|
||||||
|
*/
|
||||||
|
/* class instance title tags mask isfloating monitor */
|
||||||
|
{ "Gimp", NULL, NULL, 0, 1, -1 },
|
||||||
|
{ "Firefox", NULL, NULL, 1 << 8, 0, -1 },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* layout(s) */
|
||||||
|
static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
|
||||||
|
static const int nmaster = 1; /* number of clients in master area */
|
||||||
|
static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
|
||||||
|
|
||||||
|
static const Layout layouts[] = {
|
||||||
|
/* symbol arrange function */
|
||||||
|
{ "[]=", tile }, /* first entry is default */
|
||||||
|
{ "><>", NULL }, /* no layout function means floating behavior */
|
||||||
|
{ "[M]", monocle },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* key definitions */
|
||||||
|
#define MODKEY Mod1Mask
|
||||||
|
#define TAGKEYS(KEY,TAG) \
|
||||||
|
{ MODKEY, KEY, view, {.ui = 1 << TAG} }, \
|
||||||
|
{ MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \
|
||||||
|
{ MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \
|
||||||
|
{ MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} },
|
||||||
|
|
||||||
|
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
|
||||||
|
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
|
||||||
|
|
||||||
|
/* commands */
|
||||||
|
static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
|
||||||
|
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
|
||||||
|
static const char *termcmd[] = { "st", NULL };
|
||||||
|
|
||||||
|
static Key keys[] = {
|
||||||
|
/* modifier key function argument */
|
||||||
|
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
||||||
|
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
|
||||||
|
{ MODKEY, XK_b, togglebar, {0} },
|
||||||
|
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
||||||
|
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
||||||
|
{ MODKEY, XK_i, incnmaster, {.i = +1 } },
|
||||||
|
{ MODKEY, XK_d, incnmaster, {.i = -1 } },
|
||||||
|
{ MODKEY, XK_h, setmfact, {.f = -0.05} },
|
||||||
|
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
|
||||||
|
{ MODKEY, XK_Return, zoom, {0} },
|
||||||
|
{ MODKEY, XK_Tab, view, {0} },
|
||||||
|
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
|
||||||
|
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
|
||||||
|
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
|
||||||
|
{ MODKEY, XK_m, setlayout, {.v = &layouts[2]} },
|
||||||
|
{ MODKEY, XK_space, setlayout, {0} },
|
||||||
|
{ MODKEY|ShiftMask, XK_space, togglefloating, {0} },
|
||||||
|
{ MODKEY, XK_0, view, {.ui = ~0 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } },
|
||||||
|
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
|
||||||
|
{ MODKEY, XK_period, focusmon, {.i = +1 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
|
||||||
|
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
|
||||||
|
TAGKEYS( XK_1, 0)
|
||||||
|
TAGKEYS( XK_2, 1)
|
||||||
|
TAGKEYS( XK_3, 2)
|
||||||
|
TAGKEYS( XK_4, 3)
|
||||||
|
TAGKEYS( XK_5, 4)
|
||||||
|
TAGKEYS( XK_6, 5)
|
||||||
|
TAGKEYS( XK_7, 6)
|
||||||
|
TAGKEYS( XK_8, 7)
|
||||||
|
TAGKEYS( XK_9, 8)
|
||||||
|
{ MODKEY|ShiftMask, XK_q, quit, {0} },
|
||||||
|
};
|
||||||
|
|
||||||
|
/* button definitions */
|
||||||
|
/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */
|
||||||
|
static Button buttons[] = {
|
||||||
|
/* click event mask button function argument */
|
||||||
|
{ ClkLtSymbol, 0, Button1, setlayout, {0} },
|
||||||
|
{ ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} },
|
||||||
|
{ ClkWinTitle, 0, Button2, zoom, {0} },
|
||||||
|
{ ClkStatusText, 0, Button2, spawn, {.v = termcmd } },
|
||||||
|
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
|
||||||
|
{ ClkClientWin, MODKEY, Button2, togglefloating, {0} },
|
||||||
|
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
|
||||||
|
{ ClkTagBar, 0, Button1, view, {0} },
|
||||||
|
{ ClkTagBar, 0, Button3, toggleview, {0} },
|
||||||
|
{ ClkTagBar, MODKEY, Button1, tag, {0} },
|
||||||
|
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
|
||||||
|
};
|
||||||
|
|
39
config.mk
39
config.mk
@ -1,31 +1,38 @@
|
|||||||
# Customize to fit your system
|
# dwm version
|
||||||
|
VERSION = 6.1
|
||||||
|
|
||||||
|
# Customize below to fit your system
|
||||||
|
|
||||||
# paths
|
# paths
|
||||||
PREFIX = /usr/local
|
PREFIX = /usr/local
|
||||||
CONFPREFIX = ${PREFIX}/etc
|
|
||||||
MANPREFIX = ${PREFIX}/share/man
|
MANPREFIX = ${PREFIX}/share/man
|
||||||
|
|
||||||
X11INC = /usr/X11R6/include
|
X11INC = /usr/X11R6/include
|
||||||
X11LIB = /usr/X11R6/lib
|
X11LIB = /usr/X11R6/lib
|
||||||
|
|
||||||
VERSION = 0.2
|
# Xinerama, comment if you don't want it
|
||||||
|
XINERAMALIBS = -lXinerama
|
||||||
|
XINERAMAFLAGS = -DXINERAMA
|
||||||
|
|
||||||
|
# freetype
|
||||||
|
FREETYPELIBS = -lfontconfig -lXft
|
||||||
|
FREETYPEINC = /usr/include/freetype2
|
||||||
|
# OpenBSD (uncomment)
|
||||||
|
#FREETYPEINC = ${X11INC}/freetype2
|
||||||
|
|
||||||
# includes and libs
|
# includes and libs
|
||||||
LIBS = -L${PREFIX}/lib -L/usr/lib -lc -L${X11LIB} -lX11
|
INCS = -I${X11INC} -I${FREETYPEINC}
|
||||||
|
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
|
||||||
# Linux/BSD
|
|
||||||
#CFLAGS = -Os -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
|
|
||||||
# -DVERSION=\"${VERSION}\"
|
|
||||||
#LDFLAGS = ${LIBS}
|
|
||||||
CFLAGS = -g -Wall -O2 -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
|
|
||||||
-DVERSION=\"${VERSION}\"
|
|
||||||
LDFLAGS = -g ${LIBS}
|
|
||||||
|
|
||||||
|
# flags
|
||||||
|
CPPFLAGS = -D_BSD_SOURCE -D_POSIX_C_SOURCE=2 -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
||||||
|
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
||||||
|
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
|
||||||
|
LDFLAGS = -s ${LIBS}
|
||||||
|
|
||||||
# Solaris
|
# Solaris
|
||||||
#CFLAGS = -fast -xtarget=ultra ${INCLUDES} -DVERSION=\"${VERSION}\"
|
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
|
||||||
#LIBS += -lnsl -lsocket
|
#LDFLAGS = ${LIBS}
|
||||||
|
|
||||||
AR = ar cr
|
# compiler and linker
|
||||||
CC = cc
|
CC = cc
|
||||||
RANLIB = ranlib
|
|
||||||
|
235
draw.c
235
draw.c
@ -1,235 +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 void
|
|
||||||
drawborder(void)
|
|
||||||
{
|
|
||||||
XPoint points[5];
|
|
||||||
XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
|
|
||||||
XSetForeground(dpy, dc.gc, dc.border);
|
|
||||||
points[0].x = dc.x;
|
|
||||||
points[0].y = dc.y;
|
|
||||||
points[1].x = dc.w - 1;
|
|
||||||
points[1].y = 0;
|
|
||||||
points[2].x = 0;
|
|
||||||
points[2].y = dc.h - 1;
|
|
||||||
points[3].x = -(dc.w - 1);
|
|
||||||
points[3].y = 0;
|
|
||||||
points[4].x = 0;
|
|
||||||
points[4].y = -(dc.h - 1);
|
|
||||||
XDrawLines(dpy, dc.drawable, dc.gc, points, 5, CoordModePrevious);
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int
|
|
||||||
textnw(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, Bool invert, Bool border)
|
|
||||||
{
|
|
||||||
int x, y, w, h;
|
|
||||||
unsigned int len;
|
|
||||||
static char buf[256];
|
|
||||||
XGCValues gcv;
|
|
||||||
XRectangle r = { dc.x, dc.y, dc.w, dc.h };
|
|
||||||
|
|
||||||
XSetForeground(dpy, dc.gc, invert ? dc.fg : dc.bg);
|
|
||||||
XFillRectangles(dpy, dc.drawable, dc.gc, &r, 1);
|
|
||||||
|
|
||||||
w = 0;
|
|
||||||
if(border)
|
|
||||||
drawborder();
|
|
||||||
|
|
||||||
if(!text)
|
|
||||||
return;
|
|
||||||
|
|
||||||
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(w > dc.w)
|
|
||||||
return; /* too long */
|
|
||||||
|
|
||||||
gcv.foreground = invert ? dc.bg : dc.fg;
|
|
||||||
gcv.background = invert ? dc.fg : dc.bg;
|
|
||||||
if(dc.font.set) {
|
|
||||||
XChangeGC(dpy, dc.gc, GCForeground | GCBackground, &gcv);
|
|
||||||
XmbDrawImageString(dpy, dc.drawable, dc.font.set, dc.gc,
|
|
||||||
x, y, buf, len);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
gcv.font = dc.font.xfont->fid;
|
|
||||||
XChangeGC(dpy, dc.gc, GCForeground | GCBackground | GCFont, &gcv);
|
|
||||||
XDrawImageString(dpy, dc.drawable, dc.gc, x, y, buf, len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* extern */
|
|
||||||
|
|
||||||
void
|
|
||||||
drawall()
|
|
||||||
{
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
for(c = clients; c; c = getnext(c->next))
|
|
||||||
drawtitle(c);
|
|
||||||
drawstatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
drawstatus()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
Bool istile = arrange == dotile;
|
|
||||||
|
|
||||||
dc.x = dc.y = 0;
|
|
||||||
dc.w = bw;
|
|
||||||
drawtext(NULL, !istile, False);
|
|
||||||
|
|
||||||
dc.w = 0;
|
|
||||||
for(i = 0; i < TLast; i++) {
|
|
||||||
dc.x += dc.w;
|
|
||||||
dc.w = textw(tags[i]);
|
|
||||||
if(istile)
|
|
||||||
drawtext(tags[i], (i == tsel), True);
|
|
||||||
else
|
|
||||||
drawtext(tags[i], (i != tsel), True);
|
|
||||||
}
|
|
||||||
if(sel) {
|
|
||||||
dc.x += dc.w;
|
|
||||||
dc.w = textw(sel->name);
|
|
||||||
drawtext(sel->name, istile, True);
|
|
||||||
}
|
|
||||||
dc.w = textw(stext);
|
|
||||||
dc.x = bx + bw - dc.w;
|
|
||||||
drawtext(stext, !istile, False);
|
|
||||||
|
|
||||||
XCopyArea(dpy, dc.drawable, barwin, dc.gc, 0, 0, bw, bh, 0, 0);
|
|
||||||
XSync(dpy, False);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
drawtitle(Client *c)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
Bool istile = arrange == dotile;
|
|
||||||
|
|
||||||
if(c == sel) {
|
|
||||||
drawstatus();
|
|
||||||
XUnmapWindow(dpy, c->title);
|
|
||||||
XSetWindowBorder(dpy, c->win, dc.fg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
XSetWindowBorder(dpy, c->win, dc.bg);
|
|
||||||
XMapWindow(dpy, c->title);
|
|
||||||
|
|
||||||
dc.x = dc.y = 0;
|
|
||||||
|
|
||||||
dc.w = 0;
|
|
||||||
for(i = 0; i < TLast; i++) {
|
|
||||||
if(c->tags[i]) {
|
|
||||||
dc.x += dc.w;
|
|
||||||
dc.w = textw(c->tags[i]);
|
|
||||||
drawtext(c->tags[i], !istile, True);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dc.x += dc.w;
|
|
||||||
dc.w = textw(c->name);
|
|
||||||
drawtext(c->name, !istile, True);
|
|
||||||
XCopyArea(dpy, dc.drawable, c->title, dc.gc, 0, 0, c->tw, c->th, 0, 0);
|
|
||||||
XSync(dpy, False);
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long
|
|
||||||
getcolor(const char *colstr)
|
|
||||||
{
|
|
||||||
XColor color;
|
|
||||||
Colormap cmap = DefaultColormap(dpy, screen);
|
|
||||||
|
|
||||||
XAllocNamedColor(dpy, cmap, colstr, &color, &color);
|
|
||||||
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(char *text)
|
|
||||||
{
|
|
||||||
return textnw(text, strlen(text)) + dc.font.height;
|
|
||||||
}
|
|
398
drw.c
Normal file
398
drw.c
Normal file
@ -0,0 +1,398 @@
|
|||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xft/Xft.h>
|
||||||
|
|
||||||
|
#include "drw.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
#define UTF_INVALID 0xFFFD
|
||||||
|
#define UTF_SIZ 4
|
||||||
|
|
||||||
|
static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
|
||||||
|
static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
|
||||||
|
static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
|
||||||
|
static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
|
||||||
|
|
||||||
|
static long
|
||||||
|
utf8decodebyte(const char c, size_t *i)
|
||||||
|
{
|
||||||
|
for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
|
||||||
|
if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
|
||||||
|
return (unsigned char)c & ~utfmask[*i];
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
utf8validate(long *u, size_t i)
|
||||||
|
{
|
||||||
|
if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
|
||||||
|
*u = UTF_INVALID;
|
||||||
|
for (i = 1; *u > utfmax[i]; ++i)
|
||||||
|
;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
utf8decode(const char *c, long *u, size_t clen)
|
||||||
|
{
|
||||||
|
size_t i, j, len, type;
|
||||||
|
long udecoded;
|
||||||
|
|
||||||
|
*u = UTF_INVALID;
|
||||||
|
if (!clen)
|
||||||
|
return 0;
|
||||||
|
udecoded = utf8decodebyte(c[0], &len);
|
||||||
|
if (!BETWEEN(len, 1, UTF_SIZ))
|
||||||
|
return 1;
|
||||||
|
for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
|
||||||
|
udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
|
||||||
|
if (type)
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
if (j < len)
|
||||||
|
return 0;
|
||||||
|
*u = udecoded;
|
||||||
|
utf8validate(u, len);
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
Drw *
|
||||||
|
drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
|
||||||
|
{
|
||||||
|
Drw *drw;
|
||||||
|
|
||||||
|
drw = ecalloc(1, sizeof(Drw));
|
||||||
|
drw->dpy = dpy;
|
||||||
|
drw->screen = screen;
|
||||||
|
drw->root = root;
|
||||||
|
drw->w = w;
|
||||||
|
drw->h = h;
|
||||||
|
drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
|
||||||
|
drw->gc = XCreateGC(dpy, root, 0, NULL);
|
||||||
|
drw->fontcount = 0;
|
||||||
|
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
|
||||||
|
|
||||||
|
return drw;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_resize(Drw *drw, unsigned int w, unsigned int h)
|
||||||
|
{
|
||||||
|
drw->w = w;
|
||||||
|
drw->h = h;
|
||||||
|
if (drw->drawable)
|
||||||
|
XFreePixmap(drw->dpy, drw->drawable);
|
||||||
|
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_free(Drw *drw)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < drw->fontcount; i++)
|
||||||
|
drw_font_free(drw->fonts[i]);
|
||||||
|
XFreePixmap(drw->dpy, drw->drawable);
|
||||||
|
XFreeGC(drw->dpy, drw->gc);
|
||||||
|
free(drw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function is an implementation detail. Library users should use
|
||||||
|
* drw_font_create instead.
|
||||||
|
*/
|
||||||
|
static Fnt *
|
||||||
|
drw_font_xcreate(Drw *drw, const char *fontname, FcPattern *fontpattern)
|
||||||
|
{
|
||||||
|
Fnt *font;
|
||||||
|
XftFont *xfont = NULL;
|
||||||
|
FcPattern *pattern = NULL;
|
||||||
|
|
||||||
|
if (fontname) {
|
||||||
|
/* Using the pattern found at font->xfont->pattern does not yield same
|
||||||
|
* the same substitution results as using the pattern returned by
|
||||||
|
* FcNameParse; using the latter results in the desired fallback
|
||||||
|
* behaviour whereas the former just results in
|
||||||
|
* missing-character-rectangles being drawn, at least with some fonts.
|
||||||
|
*/
|
||||||
|
if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
|
||||||
|
fprintf(stderr, "error, cannot load font: '%s'\n", fontname);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
|
||||||
|
fprintf(stderr, "error, cannot load font: '%s'\n", fontname);
|
||||||
|
XftFontClose(drw->dpy, xfont);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else if (fontpattern) {
|
||||||
|
if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
|
||||||
|
fprintf(stderr, "error, cannot load font pattern.\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
die("no font specified.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
font = ecalloc(1, sizeof(Fnt));
|
||||||
|
font->xfont = xfont;
|
||||||
|
font->pattern = pattern;
|
||||||
|
font->ascent = xfont->ascent;
|
||||||
|
font->descent = xfont->descent;
|
||||||
|
font->h = font->ascent + font->descent;
|
||||||
|
font->dpy = drw->dpy;
|
||||||
|
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
Fnt*
|
||||||
|
drw_font_create(Drw *drw, const char *fontname)
|
||||||
|
{
|
||||||
|
return drw_font_xcreate(drw, fontname, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_load_fonts(Drw* drw, const char *fonts[], size_t fontcount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
Fnt *font;
|
||||||
|
|
||||||
|
for (i = 0; i < fontcount; i++) {
|
||||||
|
if (drw->fontcount >= DRW_FONT_CACHE_SIZE) {
|
||||||
|
die("font cache exhausted.\n");
|
||||||
|
} else if ((font = drw_font_xcreate(drw, fonts[i], NULL))) {
|
||||||
|
drw->fonts[drw->fontcount++] = font;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_font_free(Fnt *font)
|
||||||
|
{
|
||||||
|
if (!font)
|
||||||
|
return;
|
||||||
|
if (font->pattern)
|
||||||
|
FcPatternDestroy(font->pattern);
|
||||||
|
XftFontClose(font->dpy, font->xfont);
|
||||||
|
free(font);
|
||||||
|
}
|
||||||
|
|
||||||
|
Clr *
|
||||||
|
drw_clr_create(Drw *drw, const char *clrname)
|
||||||
|
{
|
||||||
|
Clr *clr;
|
||||||
|
|
||||||
|
clr = ecalloc(1, sizeof(Clr));
|
||||||
|
if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
|
||||||
|
DefaultColormap(drw->dpy, drw->screen),
|
||||||
|
clrname, &clr->rgb))
|
||||||
|
die("error, cannot allocate color '%s'\n", clrname);
|
||||||
|
clr->pix = clr->rgb.pixel;
|
||||||
|
|
||||||
|
return clr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_clr_free(Clr *clr)
|
||||||
|
{
|
||||||
|
free(clr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_setscheme(Drw *drw, ClrScheme *scheme)
|
||||||
|
{
|
||||||
|
drw->scheme = scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int empty, int invert)
|
||||||
|
{
|
||||||
|
if (!drw->scheme)
|
||||||
|
return;
|
||||||
|
XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme->bg->pix : drw->scheme->fg->pix);
|
||||||
|
if (filled)
|
||||||
|
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w + 1, h + 1);
|
||||||
|
else if (empty)
|
||||||
|
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, const char *text, int invert)
|
||||||
|
{
|
||||||
|
char buf[1024];
|
||||||
|
int tx, ty, th;
|
||||||
|
Extnts tex;
|
||||||
|
XftDraw *d = NULL;
|
||||||
|
Fnt *curfont, *nextfont;
|
||||||
|
size_t i, len;
|
||||||
|
int utf8strlen, utf8charlen, render;
|
||||||
|
long utf8codepoint = 0;
|
||||||
|
const char *utf8str;
|
||||||
|
FcCharSet *fccharset;
|
||||||
|
FcPattern *fcpattern;
|
||||||
|
FcPattern *match;
|
||||||
|
XftResult result;
|
||||||
|
int charexists = 0;
|
||||||
|
|
||||||
|
if (!drw->scheme || !drw->fontcount)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (!(render = x || y || w || h)) {
|
||||||
|
w = ~w;
|
||||||
|
} else {
|
||||||
|
XSetForeground(drw->dpy, drw->gc, invert ?
|
||||||
|
drw->scheme->fg->pix : drw->scheme->bg->pix);
|
||||||
|
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
||||||
|
d = XftDrawCreate(drw->dpy, drw->drawable,
|
||||||
|
DefaultVisual(drw->dpy, drw->screen),
|
||||||
|
DefaultColormap(drw->dpy, drw->screen));
|
||||||
|
}
|
||||||
|
|
||||||
|
curfont = drw->fonts[0];
|
||||||
|
while (1) {
|
||||||
|
utf8strlen = 0;
|
||||||
|
utf8str = text;
|
||||||
|
nextfont = NULL;
|
||||||
|
while (*text) {
|
||||||
|
utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
|
||||||
|
for (i = 0; i < drw->fontcount; i++) {
|
||||||
|
charexists = charexists || XftCharExists(drw->dpy, drw->fonts[i]->xfont, utf8codepoint);
|
||||||
|
if (charexists) {
|
||||||
|
if (drw->fonts[i] == curfont) {
|
||||||
|
utf8strlen += utf8charlen;
|
||||||
|
text += utf8charlen;
|
||||||
|
} else {
|
||||||
|
nextfont = drw->fonts[i];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!charexists || (nextfont && nextfont != curfont))
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
charexists = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (utf8strlen) {
|
||||||
|
drw_font_getexts(curfont, utf8str, utf8strlen, &tex);
|
||||||
|
/* shorten text if necessary */
|
||||||
|
for (len = MIN(utf8strlen, (sizeof buf) - 1); len && (tex.w > w - drw->fonts[0]->h || w < drw->fonts[0]->h); len--)
|
||||||
|
drw_font_getexts(curfont, utf8str, len, &tex);
|
||||||
|
|
||||||
|
if (len) {
|
||||||
|
memcpy(buf, utf8str, len);
|
||||||
|
buf[len] = '\0';
|
||||||
|
if (len < utf8strlen)
|
||||||
|
for (i = len; i && i > len - 3; buf[--i] = '.');
|
||||||
|
|
||||||
|
if (render) {
|
||||||
|
th = curfont->ascent + curfont->descent;
|
||||||
|
ty = y + (h / 2) - (th / 2) + curfont->ascent;
|
||||||
|
tx = x + (h / 2);
|
||||||
|
XftDrawStringUtf8(d, invert ? &drw->scheme->bg->rgb : &drw->scheme->fg->rgb, curfont->xfont, tx, ty, (XftChar8 *)buf, len);
|
||||||
|
}
|
||||||
|
x += tex.w;
|
||||||
|
w -= tex.w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*text) {
|
||||||
|
break;
|
||||||
|
} else if (nextfont) {
|
||||||
|
charexists = 0;
|
||||||
|
curfont = nextfont;
|
||||||
|
} else {
|
||||||
|
/* Regardless of whether or not a fallback font is found, the
|
||||||
|
* character must be drawn.
|
||||||
|
*/
|
||||||
|
charexists = 1;
|
||||||
|
|
||||||
|
if (drw->fontcount >= DRW_FONT_CACHE_SIZE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
fccharset = FcCharSetCreate();
|
||||||
|
FcCharSetAddChar(fccharset, utf8codepoint);
|
||||||
|
|
||||||
|
if (!drw->fonts[0]->pattern) {
|
||||||
|
/* Refer to the comment in drw_font_xcreate for more
|
||||||
|
* information. */
|
||||||
|
die("the first font in the cache must be loaded from a font string.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fcpattern = FcPatternDuplicate(drw->fonts[0]->pattern);
|
||||||
|
FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
|
||||||
|
FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
|
||||||
|
|
||||||
|
FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
|
||||||
|
FcDefaultSubstitute(fcpattern);
|
||||||
|
match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
|
||||||
|
|
||||||
|
FcCharSetDestroy(fccharset);
|
||||||
|
FcPatternDestroy(fcpattern);
|
||||||
|
|
||||||
|
if (match) {
|
||||||
|
curfont = drw_font_xcreate(drw, NULL, match);
|
||||||
|
if (curfont && XftCharExists(drw->dpy, curfont->xfont, utf8codepoint)) {
|
||||||
|
drw->fonts[drw->fontcount++] = curfont;
|
||||||
|
} else {
|
||||||
|
drw_font_free(curfont);
|
||||||
|
curfont = drw->fonts[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (d)
|
||||||
|
XftDrawDestroy(d);
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
|
||||||
|
{
|
||||||
|
XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y);
|
||||||
|
XSync(drw->dpy, False);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_font_getexts(Fnt *font, const char *text, unsigned int len, Extnts *tex)
|
||||||
|
{
|
||||||
|
XGlyphInfo ext;
|
||||||
|
|
||||||
|
XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
|
||||||
|
tex->h = font->h;
|
||||||
|
tex->w = ext.xOff;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
drw_font_getexts_width(Fnt *font, const char *text, unsigned int len)
|
||||||
|
{
|
||||||
|
Extnts tex;
|
||||||
|
|
||||||
|
drw_font_getexts(font, text, len, &tex);
|
||||||
|
|
||||||
|
return tex.w;
|
||||||
|
}
|
||||||
|
|
||||||
|
Cur *
|
||||||
|
drw_cur_create(Drw *drw, int shape)
|
||||||
|
{
|
||||||
|
Cur *cur;
|
||||||
|
|
||||||
|
cur = ecalloc(1, sizeof(Cur));
|
||||||
|
cur->cursor = XCreateFontCursor(drw->dpy, shape);
|
||||||
|
|
||||||
|
return cur;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
drw_cur_free(Drw *drw, Cur *cursor)
|
||||||
|
{
|
||||||
|
if (!cursor)
|
||||||
|
return;
|
||||||
|
XFreeCursor(drw->dpy, cursor->cursor);
|
||||||
|
free(cursor);
|
||||||
|
}
|
74
drw.h
Normal file
74
drw.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
#define DRW_FONT_CACHE_SIZE 32
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned long pix;
|
||||||
|
XftColor rgb;
|
||||||
|
} Clr;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Cursor cursor;
|
||||||
|
} Cur;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Display *dpy;
|
||||||
|
int ascent;
|
||||||
|
int descent;
|
||||||
|
unsigned int h;
|
||||||
|
XftFont *xfont;
|
||||||
|
FcPattern *pattern;
|
||||||
|
} Fnt;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
Clr *fg;
|
||||||
|
Clr *bg;
|
||||||
|
Clr *border;
|
||||||
|
} ClrScheme;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int w, h;
|
||||||
|
Display *dpy;
|
||||||
|
int screen;
|
||||||
|
Window root;
|
||||||
|
Drawable drawable;
|
||||||
|
GC gc;
|
||||||
|
ClrScheme *scheme;
|
||||||
|
size_t fontcount;
|
||||||
|
Fnt *fonts[DRW_FONT_CACHE_SIZE];
|
||||||
|
} Drw;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int w;
|
||||||
|
unsigned int h;
|
||||||
|
} Extnts;
|
||||||
|
|
||||||
|
/* Drawable abstraction */
|
||||||
|
Drw *drw_create(Display *, int, Window, unsigned int, unsigned int);
|
||||||
|
void drw_resize(Drw *, unsigned int, unsigned int);
|
||||||
|
void drw_free(Drw *);
|
||||||
|
|
||||||
|
/* Fnt abstraction */
|
||||||
|
Fnt *drw_font_create(Drw *, const char *);
|
||||||
|
void drw_load_fonts(Drw *, const char *[], size_t);
|
||||||
|
void drw_font_free(Fnt *);
|
||||||
|
void drw_font_getexts(Fnt *, const char *, unsigned int, Extnts *);
|
||||||
|
unsigned int drw_font_getexts_width(Fnt *, const char *, unsigned int);
|
||||||
|
|
||||||
|
/* Colour abstraction */
|
||||||
|
Clr *drw_clr_create(Drw *, const char *);
|
||||||
|
void drw_clr_free(Clr *);
|
||||||
|
|
||||||
|
/* Cursor abstraction */
|
||||||
|
Cur *drw_cur_create(Drw *, int);
|
||||||
|
void drw_cur_free(Drw *, Cur *);
|
||||||
|
|
||||||
|
/* Drawing context manipulation */
|
||||||
|
void drw_setfont(Drw *, Fnt *);
|
||||||
|
void drw_setscheme(Drw *, ClrScheme *);
|
||||||
|
|
||||||
|
/* Drawing functions */
|
||||||
|
void drw_rect(Drw *, int, int, unsigned int, unsigned int, int, int, int);
|
||||||
|
int drw_text(Drw *, int, int, unsigned int, unsigned int, const char *, int);
|
||||||
|
|
||||||
|
/* Map functions */
|
||||||
|
void drw_map(Drw *, Window, int, int, unsigned int, unsigned int);
|
237
dwm.1
237
dwm.1
@ -1,119 +1,176 @@
|
|||||||
.TH DWM 1 dwm-0.2
|
.TH DWM 1 dwm\-VERSION
|
||||||
.SH NAME
|
.SH NAME
|
||||||
dwm \- dynamic window manager
|
dwm \- dynamic window manager
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B dwm
|
.B dwm
|
||||||
.RB [ \-v ]
|
.RB [ \-v ]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.B dwm
|
dwm is a dynamic window manager for X. It manages windows in tiled, monocle
|
||||||
is a dynamic window manager for X11. It manages windows in tiling and floating
|
and floating layouts. Either layout can be applied dynamically, optimising the
|
||||||
modes. Either mode can be applied dynamically, depending on the application in
|
environment for the application in use and the task performed.
|
||||||
use and the task performed.
|
|
||||||
.P
|
.P
|
||||||
In tiling mode windows are managed in a master and stacking column. The master
|
In tiled layouts windows are managed in a master and stacking area. The master
|
||||||
column contains the window which needs most attention at a time, whereas the
|
area contains the window which currently needs most attention, whereas the
|
||||||
stacking column contains all other windows in a stack. Dialog windows are
|
stacking area contains all other windows. In monocle layout all windows are
|
||||||
managed floating, however. In floating mode windows can be resized and moved
|
maximised to the screen size. In floating layout windows can be resized and
|
||||||
freely.
|
moved freely. Dialog windows are always managed floating, regardless of the
|
||||||
|
layout applied.
|
||||||
.P
|
.P
|
||||||
Windows are grouped by tags. All windows with a specific tag can be viewed at a
|
Windows are grouped by tags. Each window can be tagged with one or multiple
|
||||||
time. But each window may contain more than one tag, which makes it visible in
|
tags. Selecting certain tags displays all windows with these tags.
|
||||||
several views.
|
|
||||||
.P
|
.P
|
||||||
.B dwm
|
Each screen contains a small status bar which displays all available tags, the
|
||||||
consists of a small status bar which reads the text displayed from standard
|
layout, the title of the focused window, and the text read from the root window
|
||||||
input, if written. It draws 1-pixel borders around windows to indicate the
|
name property, if the screen is focused. A floating window is indicated with an
|
||||||
focus state. Unfocused windows contain a small bar in front of the window
|
empty square and a maximised floating window is indicated with a filled square
|
||||||
displaying the tags and the window title.
|
before the windows title. The selected tags are indicated with a different
|
||||||
|
color. The tags of the focused window are indicated with a filled square in the
|
||||||
|
top left corner. The tags which are applied to one or more windows are
|
||||||
|
indicated with an empty square in the top left corner.
|
||||||
|
.P
|
||||||
|
dwm draws a small border around windows to indicate the focus state.
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
.B \-v
|
.B \-v
|
||||||
prints version information to standard output, then exits.
|
prints version information to standard output, then exits.
|
||||||
.SH USAGE
|
.SH USAGE
|
||||||
|
.SS Status bar
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-Return
|
.B X root window name
|
||||||
Zoom
|
is read and displayed in the status text area. It can be set with the
|
||||||
.B window
|
.BR xsetroot (1)
|
||||||
to the
|
command.
|
||||||
.B master
|
|
||||||
column
|
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-k
|
.B Button1
|
||||||
Focus previous
|
click on a tag label to display all windows with that tag, click on the layout
|
||||||
.B window
|
label toggles between tiled and floating layout.
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-j
|
.B Button3
|
||||||
Focus next
|
click on a tag label adds/removes all windows with that tag to/from the view.
|
||||||
.B window
|
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-m
|
.B Mod1\-Button1
|
||||||
Maximize current
|
click on a tag label applies that tag to the focused window.
|
||||||
.B window
|
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-[0..n]
|
.B Mod1\-Button3
|
||||||
Focus
|
click on a tag label adds/removes that tag to/from the focused window.
|
||||||
.B nth
|
.SS Keyboard commands
|
||||||
tag
|
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-space
|
.B Mod1\-Shift\-Return
|
||||||
(Re-)arrange
|
|
||||||
.B all
|
|
||||||
windows tiled
|
|
||||||
.TP
|
|
||||||
.B Mod1-Shift-space
|
|
||||||
(Re-)arrange
|
|
||||||
.B all
|
|
||||||
windows floating
|
|
||||||
.TP
|
|
||||||
.B Mod1-Shift-[0..n]
|
|
||||||
Apply
|
|
||||||
.B nth
|
|
||||||
tag to current
|
|
||||||
.B window
|
|
||||||
.TP
|
|
||||||
.B Mod1-Shift-q
|
|
||||||
Quit
|
|
||||||
.B dwm
|
|
||||||
.TP
|
|
||||||
.B Mod1-Shift-Return
|
|
||||||
Start
|
Start
|
||||||
.B terminal
|
.BR st(1).
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-Shift-w
|
.B Mod1\-,
|
||||||
Start
|
Focus previous screen, if any.
|
||||||
.B web browser
|
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-Shift-l
|
.B Mod1\-.
|
||||||
Lock
|
Focus next screen, if any.
|
||||||
.B screen
|
|
||||||
.TP
|
.TP
|
||||||
.B Control-[0..n]
|
.B Mod1\-Shift\-,
|
||||||
Append
|
Send focused window to previous screen, if any.
|
||||||
.B nth
|
|
||||||
tag to cureent
|
|
||||||
.B window
|
|
||||||
.TP
|
.TP
|
||||||
.B Control-Button1
|
.B Mod1\-Shift\-.
|
||||||
Zooms the clicked
|
Send focused window to next screen, if any.
|
||||||
.B window
|
|
||||||
to master column
|
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-Button1
|
.B Mod1\-b
|
||||||
Moves current
|
Toggles bar on and off.
|
||||||
.B window
|
|
||||||
while dragging
|
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-Button2
|
.B Mod1\-t
|
||||||
Lowers current
|
Sets tiled layout.
|
||||||
.B window
|
|
||||||
.TP
|
.TP
|
||||||
.B Mod1-Button3
|
.B Mod1\-f
|
||||||
Resizes current
|
Sets floating layout.
|
||||||
.B window
|
.TP
|
||||||
while dragging
|
.B Mod1\-m
|
||||||
|
Sets monocle layout.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-space
|
||||||
|
Toggles between current and previous layout.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-j
|
||||||
|
Focus next window.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-k
|
||||||
|
Focus previous window.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-i
|
||||||
|
Increase clients in master area.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-d
|
||||||
|
Decrease clients in master area.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-l
|
||||||
|
Increase master area size.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-h
|
||||||
|
Decrease master area size.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Return
|
||||||
|
Zooms/cycles focused window to/from master area (tiled layouts only).
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Shift\-c
|
||||||
|
Close focused window.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Shift\-space
|
||||||
|
Toggle focused window between tiled and floating state.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Tab
|
||||||
|
Toggles to the previously selected tags.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Shift\-[1..n]
|
||||||
|
Apply nth tag to focused window.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Shift\-0
|
||||||
|
Apply all tags to focused window.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Control\-Shift\-[1..n]
|
||||||
|
Add/remove nth tag to/from focused window.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-[1..n]
|
||||||
|
View all windows with nth tag.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-0
|
||||||
|
View all windows with any tag.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Control\-[1..n]
|
||||||
|
Add/remove all windows with nth tag to/from the view.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Shift\-q
|
||||||
|
Quit dwm.
|
||||||
|
.SS Mouse commands
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Button1
|
||||||
|
Move focused window while dragging. Tiled windows will be toggled to the floating state.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Button2
|
||||||
|
Toggles focused window between floating and tiled state.
|
||||||
|
.TP
|
||||||
|
.B Mod1\-Button3
|
||||||
|
Resize focused window while dragging. Tiled windows will be toggled to the floating state.
|
||||||
.SH CUSTOMIZATION
|
.SH CUSTOMIZATION
|
||||||
.B dwm
|
dwm is customized by creating a custom config.h and (re)compiling the source
|
||||||
is customized through editing its source code. This keeps it fast, secure and
|
code. This keeps it fast, secure and simple.
|
||||||
simple. The source code contains the
|
.SH SEE ALSO
|
||||||
.I CUSTOMIZE
|
.BR dmenu (1),
|
||||||
keyword to highlight relevant portions for customization.
|
.BR st (1)
|
||||||
|
.SH BUGS
|
||||||
|
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. Possible workarounds
|
||||||
|
are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
|
||||||
|
environment variable
|
||||||
|
.BR AWT_TOOLKIT=MToolkit
|
||||||
|
(to use the older Motif backend instead) or running
|
||||||
|
.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
|
||||||
|
or
|
||||||
|
.B wmname LG3D
|
||||||
|
(to pretend that a non-reparenting window manager is running that the
|
||||||
|
XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
|
||||||
|
.BR _JAVA_AWT_WM_NONREPARENTING=1 .
|
||||||
|
.P
|
||||||
|
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.
|
||||||
|
156
dwm.h
156
dwm.h
@ -1,156 +0,0 @@
|
|||||||
/*
|
|
||||||
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
|
|
||||||
* See LICENSE file for license details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
|
||||||
|
|
||||||
/********** CUSTOMIZE **********/
|
|
||||||
|
|
||||||
#define FONT "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*"
|
|
||||||
#define BGCOLOR "#0a2c2d"
|
|
||||||
#define FGCOLOR "#ddeeee"
|
|
||||||
#define BORDERCOLOR "#176164"
|
|
||||||
/*
|
|
||||||
#define BGCOLOR "#666699"
|
|
||||||
#define FGCOLOR "#eeeeee"
|
|
||||||
#define BORDERCOLOR "#9999CC"
|
|
||||||
*/
|
|
||||||
#define MASTERW 52 /* percent */
|
|
||||||
#define WM_PROTOCOL_DELWIN 1
|
|
||||||
|
|
||||||
/* tags */
|
|
||||||
enum { Tscratch, Tdev, Twww, Twork, TLast };
|
|
||||||
|
|
||||||
/********** CUSTOMIZE **********/
|
|
||||||
|
|
||||||
typedef union Arg Arg;
|
|
||||||
typedef struct DC DC;
|
|
||||||
typedef struct Client Client;
|
|
||||||
typedef struct Fnt Fnt;
|
|
||||||
typedef struct Key Key;
|
|
||||||
typedef struct Rule Rule;
|
|
||||||
|
|
||||||
union Arg {
|
|
||||||
const char **argv;
|
|
||||||
int i;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* atoms */
|
|
||||||
enum { NetSupported, NetWMName, NetLast };
|
|
||||||
enum { WMProtocols, WMDelete, WMLast };
|
|
||||||
|
|
||||||
/* cursor */
|
|
||||||
enum { CurNormal, CurResize, CurMove, CurLast };
|
|
||||||
|
|
||||||
struct Fnt {
|
|
||||||
int ascent;
|
|
||||||
int descent;
|
|
||||||
int height;
|
|
||||||
XFontSet set;
|
|
||||||
XFontStruct *xfont;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DC { /* draw context */
|
|
||||||
int x, y, w, h;
|
|
||||||
unsigned long bg;
|
|
||||||
unsigned long fg;
|
|
||||||
unsigned long border;
|
|
||||||
Drawable drawable;
|
|
||||||
Fnt font;
|
|
||||||
GC gc;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Client {
|
|
||||||
char name[256];
|
|
||||||
char *tags[TLast];
|
|
||||||
int proto;
|
|
||||||
int x, y, w, h;
|
|
||||||
int tx, ty, tw, th;
|
|
||||||
int basew, baseh, incw, inch, maxw, maxh, minw, minh;
|
|
||||||
int grav;
|
|
||||||
unsigned int border;
|
|
||||||
long flags;
|
|
||||||
Bool isfloat;
|
|
||||||
Client *next;
|
|
||||||
Client *revert;
|
|
||||||
Window win;
|
|
||||||
Window title;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Rule {
|
|
||||||
const char *class;
|
|
||||||
const char *instance;
|
|
||||||
char *tags[TLast];
|
|
||||||
Bool isfloat;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Key {
|
|
||||||
unsigned long mod;
|
|
||||||
KeySym keysym;
|
|
||||||
void (*func)(Arg *arg);
|
|
||||||
Arg arg;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern char *tags[TLast], stext[1024];
|
|
||||||
extern int tsel, screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
|
|
||||||
extern void (*handler[LASTEvent])(XEvent *);
|
|
||||||
extern void (*arrange)(Arg *);
|
|
||||||
extern Atom wmatom[WMLast], netatom[NetLast];
|
|
||||||
extern Bool running, issel;
|
|
||||||
extern Client *clients, *sel;
|
|
||||||
extern Cursor cursor[CurLast];
|
|
||||||
extern DC dc;
|
|
||||||
extern Display *dpy;
|
|
||||||
extern Key key[];
|
|
||||||
extern Window root, barwin;
|
|
||||||
|
|
||||||
/* client.c */
|
|
||||||
extern void ban(Client *c);
|
|
||||||
extern void focus(Client *c);
|
|
||||||
extern void focusnext(Arg *arg);
|
|
||||||
extern void focusprev(Arg *arg);
|
|
||||||
extern Client *getclient(Window w);
|
|
||||||
extern Client *getctitle(Window w);
|
|
||||||
extern void gravitate(Client *c, Bool invert);
|
|
||||||
extern void higher(Client *c);
|
|
||||||
extern void killclient(Arg *arg);
|
|
||||||
extern void lower(Client *c);
|
|
||||||
extern void manage(Window w, XWindowAttributes *wa);
|
|
||||||
extern void maximize(Arg *arg);
|
|
||||||
extern void resize(Client *c, Bool inc);
|
|
||||||
extern void setsize(Client *c);
|
|
||||||
extern void settitle(Client *c);
|
|
||||||
extern void unmanage(Client *c);
|
|
||||||
extern void zoom(Arg *arg);
|
|
||||||
|
|
||||||
/* draw.c */
|
|
||||||
extern void drawall();
|
|
||||||
extern void drawstatus();
|
|
||||||
extern void drawtitle(Client *c);
|
|
||||||
extern unsigned long getcolor(const char *colstr);
|
|
||||||
extern void setfont(const char *fontstr);
|
|
||||||
extern unsigned int textw(char *text);
|
|
||||||
|
|
||||||
/* event.c */
|
|
||||||
extern void grabkeys();
|
|
||||||
|
|
||||||
/* main.c */
|
|
||||||
extern int getproto(Window w);
|
|
||||||
extern void quit(Arg *arg);
|
|
||||||
extern void sendevent(Window w, Atom a, long value);
|
|
||||||
extern int xerror(Display *dsply, XErrorEvent *ee);
|
|
||||||
|
|
||||||
/* tag.c */
|
|
||||||
extern void appendtag(Arg *arg);
|
|
||||||
extern void dofloat(Arg *arg);
|
|
||||||
extern void dotile(Arg *arg);
|
|
||||||
extern Client *getnext(Client *c);
|
|
||||||
extern void replacetag(Arg *arg);
|
|
||||||
extern void settags(Client *c);
|
|
||||||
extern void view(Arg *arg);
|
|
||||||
|
|
||||||
/* util.c */
|
|
||||||
extern void *emallocz(unsigned int size);
|
|
||||||
extern void eprint(const char *errstr, ...);
|
|
||||||
extern void spawn(Arg *arg);
|
|
105
dwm.html
105
dwm.html
@ -1,105 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>dwm - dynamic window manager</title>
|
|
||||||
<meta name="author" content="Anselm R. Garbe">
|
|
||||||
<meta name="generator" content="ed">
|
|
||||||
<meta name="copyright" content="(C)opyright 2006 by Anselm R. Garbe">
|
|
||||||
<style type="text/css">
|
|
||||||
body {
|
|
||||||
color: #000000;
|
|
||||||
font-family: sans-serif;
|
|
||||||
margin: 20px 20px 20px 20px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<center>
|
|
||||||
<img src="dwm.png"/><br />
|
|
||||||
<h3>dynamic window manager</h3>
|
|
||||||
</center>
|
|
||||||
<h3>Description</h3>
|
|
||||||
<p>
|
|
||||||
dwm is a dynamic window manager for X11.
|
|
||||||
</p>
|
|
||||||
<h3>Philosophy</h3>
|
|
||||||
<p>
|
|
||||||
As founder and main developer of wmii I came to the conclusion that
|
|
||||||
wmii is too clunky for my needs. I don't need so many funky features
|
|
||||||
and all this hype about remote control through a 9P service, I only
|
|
||||||
want to manage my windows in a simple, but dynamic way. wmii never got
|
|
||||||
finished because I listened to users, who proposed arbitrary ideas I
|
|
||||||
considered useful. This resulted in an extreme <a href="http://www.jwz.org/doc/cadt.html">CADT</a>
|
|
||||||
development model, which was a mistake. Thus the philosophy of
|
|
||||||
dwm is simply <i>to fit my needs</i> (maybe yours as well). That's it.
|
|
||||||
</p>
|
|
||||||
<h3>Differences to wmii</h3
|
|
||||||
<p>
|
|
||||||
In contrast to wmii, dwm is only a window manager, and nothing else.
|
|
||||||
Hence, it is much smaller, faster and simpler.
|
|
||||||
</p>
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
dwm has no 9P support, no editable tagbars, no shell-based
|
|
||||||
configuration and remote control and comes without any additional
|
|
||||||
tools like printing the selection or warping the mouse.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
dwm is only a single binary, it's source code is intended to never
|
|
||||||
exceed 2000 SLOC.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
dwm is customized through editing its source code, that makes it
|
|
||||||
extremely fast and secure - it does not process any input data which
|
|
||||||
hasn't been known at compile time, except window title names.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
dwm is based on tagging and dynamic window management (however simpler
|
|
||||||
than wmii or larswm).
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
dwm don't distinguishes between layers, there is no floating or
|
|
||||||
managed layer. Wether the clients of currently selected tag are
|
|
||||||
managed or not, you can re-arrange all clients on the fly. Popup-
|
|
||||||
and fixed-size windows are treated unmanaged.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
dwm uses 1-pixel borders to provide the maximum of screen real
|
|
||||||
estate to clients. Small titlebars are only drawn in front of unfocused
|
|
||||||
clients.
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
dwm reads from <b>stdin</b> to print arbitrary status text (like the
|
|
||||||
date, load, battery charge). That's much simpler than larsremote,
|
|
||||||
wmiir and what not...
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
Anselm <b>does not</b> want any feedback to dwm. If you ask for support,
|
|
||||||
feature requests, or if you report bugs, they will be <b>ignored</b>
|
|
||||||
with a high chance. dwm is only intended to fit Anselms needs.
|
|
||||||
However you are free to download and distribute/relicense it, with the
|
|
||||||
conditions of the <a href="http://wmii.de/cgi-bin/hgwebdir.cgi/dwm?f=f10eb1139362;file=LICENSE;style=raw">MIT/X Consortium license</a>.
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<h3>Screenshot</h3>
|
|
||||||
<p>
|
|
||||||
<a href="http://wmii.de/shots/dwm-20060714.png">Click here for a screenshot</a> (20060714)
|
|
||||||
</p>
|
|
||||||
<h3>Development</h3>
|
|
||||||
<p>
|
|
||||||
dwm is actively developed in parallel to wmii. You can <a href="http://wmii.de/cgi-bin/hgwebdir.cgi/dwm">browse</a> its source code repository or get a copy using <a href="http://www.selenic.com/mercurial/">Mercurial</a> with following command:
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<code>hg clone http://wmii.de/cgi-bin/hgwebdir.cgi/dwm</code>
|
|
||||||
</p>
|
|
||||||
<h3>Download</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="http://wmii.de/download/dwm-0.2.tar.gz">dwm 0.2</a> (13kb) (20060717)</li>
|
|
||||||
</ul>
|
|
||||||
<h3>Miscellaneous</h3>
|
|
||||||
<p>
|
|
||||||
You can purchase this <a href="https://www.spreadshirt.net/shop.php?op=article&article_id=3298632&view=403">tricot</a>
|
|
||||||
if you like dwm and the dwm logo, which has been designed by Anselm.
|
|
||||||
</p>
|
|
||||||
<p><small>--Anselm (20060714)</small></p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
BIN
dwm.png
BIN
dwm.png
Binary file not shown.
Before Width: | Height: | Size: 387 B After Width: | Height: | Size: 373 B |
367
event.c
367
event.c
@ -1,367 +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>
|
|
||||||
|
|
||||||
#define ButtonMask (ButtonPressMask | ButtonReleaseMask)
|
|
||||||
#define MouseMask (ButtonMask | PointerMotionMask)
|
|
||||||
|
|
||||||
/* CUSTOMIZE */
|
|
||||||
const char *browse[] = { "firefox", NULL };
|
|
||||||
const char *gimp[] = { "gimp", NULL };
|
|
||||||
const char *term[] = {
|
|
||||||
"urxvtc", "-tr", "+sb", "-bg", "black", "-fg", "white", "-cr", "white",
|
|
||||||
"-fn", "-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", NULL
|
|
||||||
};
|
|
||||||
const char *xlock[] = { "xlock", NULL };
|
|
||||||
|
|
||||||
Key key[] = {
|
|
||||||
/* modifier key function arguments */
|
|
||||||
{ ControlMask, XK_0, appendtag, { .i = Tscratch } },
|
|
||||||
{ ControlMask, XK_1, appendtag, { .i = Tdev } },
|
|
||||||
{ ControlMask, XK_2, appendtag, { .i = Twww } },
|
|
||||||
{ ControlMask, XK_3, appendtag, { .i = Twork } },
|
|
||||||
{ Mod1Mask, XK_0, view, { .i = Tscratch } },
|
|
||||||
{ Mod1Mask, XK_1, view, { .i = Tdev } },
|
|
||||||
{ Mod1Mask, XK_2, view, { .i = Twww } },
|
|
||||||
{ Mod1Mask, XK_3, view, { .i = Twork } },
|
|
||||||
{ Mod1Mask, XK_j, focusnext, { 0 } },
|
|
||||||
{ Mod1Mask, XK_k, focusprev, { 0 } },
|
|
||||||
{ Mod1Mask, XK_m, maximize, { 0 } },
|
|
||||||
{ Mod1Mask, XK_space, dotile, { 0 } },
|
|
||||||
{ Mod1Mask, XK_Return, zoom, { 0 } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_0, replacetag, { .i = Tscratch } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_1, replacetag, { .i = Tdev } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_2, replacetag, { .i = Twww } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_3, replacetag, { .i = Twork } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_c, killclient, { 0 } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_g, spawn, { .argv = gimp } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_l, spawn, { .argv = xlock } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_q, quit, { 0 } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_space, dofloat, { 0 } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_w, spawn, { .argv = browse } },
|
|
||||||
{ Mod1Mask|ShiftMask, XK_Return, spawn, { .argv = term } },
|
|
||||||
};
|
|
||||||
|
|
||||||
/* static */
|
|
||||||
|
|
||||||
static void
|
|
||||||
movemouse(Client *c)
|
|
||||||
{
|
|
||||||
XEvent ev;
|
|
||||||
int x1, y1, ocx, ocy, di;
|
|
||||||
unsigned int dui;
|
|
||||||
Window dummy;
|
|
||||||
|
|
||||||
ocx = c->x;
|
|
||||||
ocy = c->y;
|
|
||||||
if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
|
|
||||||
None, cursor[CurMove], CurrentTime) != GrabSuccess)
|
|
||||||
return;
|
|
||||||
XQueryPointer(dpy, root, &dummy, &dummy, &x1, &y1, &di, &di, &dui);
|
|
||||||
for(;;) {
|
|
||||||
XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
|
|
||||||
switch (ev.type) {
|
|
||||||
default: break;
|
|
||||||
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);
|
|
||||||
break;
|
|
||||||
case ButtonRelease:
|
|
||||||
XUngrabPointer(dpy, CurrentTime);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
resizemouse(Client *c)
|
|
||||||
{
|
|
||||||
XEvent ev;
|
|
||||||
int ocx, ocy;
|
|
||||||
|
|
||||||
ocx = c->x;
|
|
||||||
ocy = c->y;
|
|
||||||
if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
|
|
||||||
None, cursor[CurResize], CurrentTime) != GrabSuccess)
|
|
||||||
return;
|
|
||||||
XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
|
|
||||||
for(;;) {
|
|
||||||
XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
|
|
||||||
switch(ev.type) {
|
|
||||||
default: break;
|
|
||||||
case Expose:
|
|
||||||
handler[Expose](&ev);
|
|
||||||
break;
|
|
||||||
case MotionNotify:
|
|
||||||
XSync(dpy, False);
|
|
||||||
c->w = abs(ocx - ev.xmotion.x);
|
|
||||||
c->h = abs(ocy - ev.xmotion.y);
|
|
||||||
c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w;
|
|
||||||
c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h;
|
|
||||||
resize(c, True);
|
|
||||||
break;
|
|
||||||
case ButtonRelease:
|
|
||||||
XUngrabPointer(dpy, CurrentTime);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
buttonpress(XEvent *e)
|
|
||||||
{
|
|
||||||
int x;
|
|
||||||
Arg a;
|
|
||||||
XButtonPressedEvent *ev = &e->xbutton;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
if(barwin == ev->window) {
|
|
||||||
switch(ev->button) {
|
|
||||||
default:
|
|
||||||
x = 0;
|
|
||||||
for(a.i = 0; a.i < TLast; a.i++) {
|
|
||||||
x += textw(tags[a.i]);
|
|
||||||
if(ev->x < x) {
|
|
||||||
view(&a);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Button4:
|
|
||||||
a.i = (tsel + 1 < TLast) ? tsel + 1 : 0;
|
|
||||||
view(&a);
|
|
||||||
break;
|
|
||||||
case Button5:
|
|
||||||
a.i = (tsel - 1 >= 0) ? tsel - 1 : TLast - 1;
|
|
||||||
view(&a);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if((c = getclient(ev->window))) {
|
|
||||||
if(arrange == dotile && !c->isfloat) {
|
|
||||||
if((ev->state & ControlMask) && (ev->button == Button1))
|
|
||||||
zoom(NULL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* floating windows */
|
|
||||||
higher(c);
|
|
||||||
switch(ev->button) {
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
case Button1:
|
|
||||||
movemouse(c);
|
|
||||||
break;
|
|
||||||
case Button2:
|
|
||||||
lower(c);
|
|
||||||
break;
|
|
||||||
case Button3:
|
|
||||||
resizemouse(c);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
configurerequest(XEvent *e)
|
|
||||||
{
|
|
||||||
XConfigureRequestEvent *ev = &e->xconfigurerequest;
|
|
||||||
XWindowChanges wc;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
ev->value_mask &= ~CWSibling;
|
|
||||||
if((c = getclient(ev->window))) {
|
|
||||||
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 = 1;
|
|
||||||
gravitate(c, False);
|
|
||||||
resize(c, True);
|
|
||||||
}
|
|
||||||
|
|
||||||
wc.x = ev->x;
|
|
||||||
wc.y = ev->y;
|
|
||||||
wc.width = ev->width;
|
|
||||||
wc.height = ev->height;
|
|
||||||
wc.border_width = 1;
|
|
||||||
wc.sibling = None;
|
|
||||||
wc.stack_mode = Above;
|
|
||||||
ev->value_mask &= ~CWStackMode;
|
|
||||||
ev->value_mask |= CWBorderWidth;
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
XCrossingEvent *ev = &e->xcrossing;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if((c = getclient(ev->window)))
|
|
||||||
focus(c);
|
|
||||||
else if(ev->window == root)
|
|
||||||
issel = True;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
expose(XEvent *e)
|
|
||||||
{
|
|
||||||
XExposeEvent *ev = &e->xexpose;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
if(ev->count == 0) {
|
|
||||||
if(barwin == ev->window)
|
|
||||||
drawstatus();
|
|
||||||
else if((c = getctitle(ev->window)))
|
|
||||||
drawtitle(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
keypress(XEvent *e)
|
|
||||||
{
|
|
||||||
XKeyEvent *ev = &e->xkey;
|
|
||||||
static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
|
|
||||||
unsigned int i;
|
|
||||||
KeySym keysym;
|
|
||||||
|
|
||||||
keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0);
|
|
||||||
for(i = 0; i < len; i++)
|
|
||||||
if((keysym == key[i].keysym) && (key[i].mod == 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 = True;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
maprequest(XEvent *e)
|
|
||||||
{
|
|
||||||
XMapRequestEvent *ev = &e->xmaprequest;
|
|
||||||
static XWindowAttributes wa;
|
|
||||||
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
XPropertyEvent *ev = &e->xproperty;
|
|
||||||
Window trans;
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
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(NULL);
|
|
||||||
break;
|
|
||||||
case XA_WM_NORMAL_HINTS:
|
|
||||||
setsize(c);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) {
|
|
||||||
settitle(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,
|
|
||||||
[MapRequest] = maprequest,
|
|
||||||
[PropertyNotify] = propertynotify,
|
|
||||||
[UnmapNotify] = unmapnotify
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
grabkeys()
|
|
||||||
{
|
|
||||||
static unsigned int len = key ? sizeof(key) / sizeof(key[0]) : 0;
|
|
||||||
unsigned int i;
|
|
||||||
KeyCode code;
|
|
||||||
|
|
||||||
for(i = 0; i < len; i++) {
|
|
||||||
code = XKeysymToKeycode(dpy, key[i].keysym);
|
|
||||||
XUngrabKey(dpy, code, key[i].mod, root);
|
|
||||||
XGrabKey(dpy, code, key[i].mod, root, True,
|
|
||||||
GrabModeAsync, GrabModeAsync);
|
|
||||||
}
|
|
||||||
}
|
|
311
main.c
311
main.c
@ -1,311 +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 <X11/cursorfont.h>
|
|
||||||
#include <X11/Xatom.h>
|
|
||||||
#include <X11/Xproto.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* static */
|
|
||||||
|
|
||||||
static Bool otherwm;
|
|
||||||
static int (*xerrorxlib)(Display *, XErrorEvent *);
|
|
||||||
|
|
||||||
static void
|
|
||||||
cleanup()
|
|
||||||
{
|
|
||||||
while(sel) {
|
|
||||||
resize(sel, True);
|
|
||||||
unmanage(sel);
|
|
||||||
}
|
|
||||||
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
scan()
|
|
||||||
{
|
|
||||||
unsigned int i, num;
|
|
||||||
Window *wins;
|
|
||||||
XWindowAttributes wa;
|
|
||||||
Window d1, d2;
|
|
||||||
|
|
||||||
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 int
|
|
||||||
win_property(Window w, Atom a, Atom t, long l, unsigned char **prop)
|
|
||||||
{
|
|
||||||
Atom real;
|
|
||||||
int format;
|
|
||||||
unsigned long res, extra;
|
|
||||||
int status;
|
|
||||||
|
|
||||||
status = XGetWindowProperty(dpy, w, a, 0L, l, False, t, &real, &format,
|
|
||||||
&res, &extra, prop);
|
|
||||||
|
|
||||||
if(status != Success || *prop == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(res == 0) {
|
|
||||||
free((void *) *prop);
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Startup Error handler to check if another window manager
|
|
||||||
* is already running.
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
xerrorstart(Display *dsply, XErrorEvent *ee)
|
|
||||||
{
|
|
||||||
otherwm = True;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* extern */
|
|
||||||
|
|
||||||
char stext[1024];
|
|
||||||
int tsel = Tdev; /* default tag */
|
|
||||||
int screen, sx, sy, sw, sh, bx, by, bw, bh, mw;
|
|
||||||
Atom wmatom[WMLast], netatom[NetLast];
|
|
||||||
Bool running = True;
|
|
||||||
Bool issel = True;
|
|
||||||
Client *clients = NULL;
|
|
||||||
Client *sel = NULL;
|
|
||||||
Cursor cursor[CurLast];
|
|
||||||
Display *dpy;
|
|
||||||
DC dc = {0};
|
|
||||||
Window root, barwin;
|
|
||||||
|
|
||||||
int
|
|
||||||
getproto(Window w)
|
|
||||||
{
|
|
||||||
unsigned char *protocols;
|
|
||||||
long res;
|
|
||||||
int protos = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
res = win_property(w, wmatom[WMProtocols], XA_ATOM, 20L, &protocols);
|
|
||||||
if(res <= 0) {
|
|
||||||
return protos;
|
|
||||||
}
|
|
||||||
for(i = 0; i < res; i++) {
|
|
||||||
if(protocols[i] == wmatom[WMDelete])
|
|
||||||
protos |= WM_PROTOCOL_DELWIN;
|
|
||||||
}
|
|
||||||
free((char *) 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)
|
|
||||||
{
|
|
||||||
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 calls 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))
|
|
||||||
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 i, n;
|
|
||||||
fd_set rd;
|
|
||||||
XSetWindowAttributes wa;
|
|
||||||
unsigned int mask;
|
|
||||||
Bool readstdin = True;
|
|
||||||
Window w;
|
|
||||||
XEvent ev;
|
|
||||||
|
|
||||||
for(i = 1; (i < argc) && (argv[i][0] == '-'); i++) {
|
|
||||||
switch (argv[i][1]) {
|
|
||||||
case 'v':
|
|
||||||
fprintf(stdout, "%s",
|
|
||||||
"dwm-"VERSION", (C)opyright MMVI Anselm R. Garbe\n");
|
|
||||||
exit(0);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
eprint("usage: dwm [-v]\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dpy = XOpenDisplay(0);
|
|
||||||
if(!dpy)
|
|
||||||
eprint("dwm: cannot connect X server\n");
|
|
||||||
|
|
||||||
screen = DefaultScreen(dpy);
|
|
||||||
root = RootWindow(dpy, screen);
|
|
||||||
|
|
||||||
/* check if another WM is already running */
|
|
||||||
otherwm = False;
|
|
||||||
XSetErrorHandler(xerrorstart);
|
|
||||||
/* this causes an error if some other WM is running */
|
|
||||||
XSelectInput(dpy, root, SubstructureRedirectMask);
|
|
||||||
XSync(dpy, False);
|
|
||||||
|
|
||||||
if(otherwm)
|
|
||||||
eprint("dwm: another window manager is already running\n");
|
|
||||||
|
|
||||||
XSetErrorHandler(NULL);
|
|
||||||
xerrorxlib = XSetErrorHandler(xerror);
|
|
||||||
|
|
||||||
/* 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);
|
|
||||||
|
|
||||||
grabkeys();
|
|
||||||
|
|
||||||
/* style */
|
|
||||||
dc.bg = getcolor(BGCOLOR);
|
|
||||||
dc.fg = getcolor(FGCOLOR);
|
|
||||||
dc.border = getcolor(BORDERCOLOR);
|
|
||||||
setfont(FONT);
|
|
||||||
|
|
||||||
sx = sy = 0;
|
|
||||||
sw = DisplayWidth(dpy, screen);
|
|
||||||
sh = DisplayHeight(dpy, screen);
|
|
||||||
mw = (sw * MASTERW) / 100;
|
|
||||||
|
|
||||||
wa.override_redirect = 1;
|
|
||||||
wa.background_pixmap = ParentRelative;
|
|
||||||
wa.event_mask = ButtonPressMask | ExposureMask;
|
|
||||||
|
|
||||||
bx = by = 0;
|
|
||||||
bw = sw;
|
|
||||||
dc.h = bh = dc.font.height + 4;
|
|
||||||
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);
|
|
||||||
|
|
||||||
dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
|
|
||||||
dc.gc = XCreateGC(dpy, root, 0, 0);
|
|
||||||
drawstatus();
|
|
||||||
|
|
||||||
issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
|
|
||||||
|
|
||||||
wa.event_mask = SubstructureRedirectMask | EnterWindowMask \
|
|
||||||
| LeaveWindowMask;
|
|
||||||
wa.cursor = cursor[CurNormal];
|
|
||||||
|
|
||||||
XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
|
|
||||||
|
|
||||||
strcpy(stext, "dwm-"VERSION);
|
|
||||||
scan();
|
|
||||||
|
|
||||||
/* main event loop, reads status text from stdin as well */
|
|
||||||
Mainloop:
|
|
||||||
while(running) {
|
|
||||||
FD_ZERO(&rd);
|
|
||||||
if(readstdin)
|
|
||||||
FD_SET(STDIN_FILENO, &rd);
|
|
||||||
FD_SET(ConnectionNumber(dpy), &rd);
|
|
||||||
|
|
||||||
i = select(ConnectionNumber(dpy) + 1, &rd, 0, 0, 0);
|
|
||||||
if(i == -1 && errno == EINTR)
|
|
||||||
continue;
|
|
||||||
if(i < 0)
|
|
||||||
eprint("select failed\n");
|
|
||||||
else if(i > 0) {
|
|
||||||
if(FD_ISSET(ConnectionNumber(dpy), &rd)) {
|
|
||||||
while(XPending(dpy)) {
|
|
||||||
XNextEvent(dpy, &ev);
|
|
||||||
if(handler[ev.type])
|
|
||||||
(handler[ev.type])(&ev); /* call handler */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(readstdin && FD_ISSET(STDIN_FILENO, &rd)) {
|
|
||||||
i = n = 0;
|
|
||||||
for(;;) {
|
|
||||||
if((i = getchar()) == EOF) {
|
|
||||||
/* broken pipe/end of producer */
|
|
||||||
readstdin = False;
|
|
||||||
strcpy(stext, "broken pipe");
|
|
||||||
goto Mainloop;
|
|
||||||
}
|
|
||||||
if(i == '\n' || n >= sizeof(stext) - 1)
|
|
||||||
break;
|
|
||||||
stext[n++] = i;
|
|
||||||
}
|
|
||||||
stext[n] = 0;
|
|
||||||
drawstatus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup();
|
|
||||||
XCloseDisplay(dpy);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
178
tag.c
178
tag.c
@ -1,178 +0,0 @@
|
|||||||
/*
|
|
||||||
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
|
|
||||||
* See LICENSE file for license details.
|
|
||||||
*/
|
|
||||||
#include "dwm.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <X11/Xutil.h>
|
|
||||||
|
|
||||||
/* static */
|
|
||||||
|
|
||||||
/* CUSTOMIZE */
|
|
||||||
static Rule rule[] = {
|
|
||||||
/* class instance tags isfloat */
|
|
||||||
{ "Firefox-bin", "Gecko", { [Twww] = "www" }, False },
|
|
||||||
};
|
|
||||||
|
|
||||||
/* extern */
|
|
||||||
|
|
||||||
/* CUSTOMIZE */
|
|
||||||
char *tags[TLast] = {
|
|
||||||
[Tscratch] = "scratch",
|
|
||||||
[Tdev] = "dev",
|
|
||||||
[Twww] = "www",
|
|
||||||
[Twork] = "work",
|
|
||||||
};
|
|
||||||
void (*arrange)(Arg *) = dotile;
|
|
||||||
|
|
||||||
void
|
|
||||||
appendtag(Arg *arg)
|
|
||||||
{
|
|
||||||
if(!sel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
sel->tags[arg->i] = tags[arg->i];
|
|
||||||
arrange(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
dofloat(Arg *arg)
|
|
||||||
{
|
|
||||||
Client *c;
|
|
||||||
|
|
||||||
arrange = dofloat;
|
|
||||||
for(c = clients; c; c = c->next) {
|
|
||||||
if(c->tags[tsel])
|
|
||||||
resize(c, True);
|
|
||||||
else
|
|
||||||
ban(c);
|
|
||||||
}
|
|
||||||
if(sel && !sel->tags[tsel]) {
|
|
||||||
if((sel = getnext(clients))) {
|
|
||||||
higher(sel);
|
|
||||||
focus(sel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
drawall();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
dotile(Arg *arg)
|
|
||||||
{
|
|
||||||
Client *c;
|
|
||||||
int n, i, w, h;
|
|
||||||
|
|
||||||
w = sw - mw;
|
|
||||||
arrange = dotile;
|
|
||||||
for(n = 0, c = clients; c; c = c->next)
|
|
||||||
if(c->tags[tsel] && !c->isfloat)
|
|
||||||
n++;
|
|
||||||
|
|
||||||
if(n > 1)
|
|
||||||
h = (sh - bh) / (n - 1);
|
|
||||||
else
|
|
||||||
h = sh - bh;
|
|
||||||
|
|
||||||
for(i = 0, c = clients; c; c = c->next) {
|
|
||||||
if(c->tags[tsel]) {
|
|
||||||
if(c->isfloat) {
|
|
||||||
higher(c);
|
|
||||||
resize(c, True);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(n == 1) {
|
|
||||||
c->x = sx;
|
|
||||||
c->y = sy + bh;
|
|
||||||
c->w = sw - 2 * c->border;
|
|
||||||
c->h = sh - 2 * c->border - bh;
|
|
||||||
}
|
|
||||||
else if(i == 0) {
|
|
||||||
c->x = sx;
|
|
||||||
c->y = sy + bh;
|
|
||||||
c->w = mw - 2 * c->border;
|
|
||||||
c->h = sh - 2 * c->border - bh;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
c->x = sx + mw;
|
|
||||||
c->y = sy + (i - 1) * h + bh;
|
|
||||||
c->w = w - 2 * c->border;
|
|
||||||
c->h = h - 2 * c->border;
|
|
||||||
}
|
|
||||||
resize(c, False);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ban(c);
|
|
||||||
}
|
|
||||||
if(!sel || (sel && !sel->tags[tsel])) {
|
|
||||||
if((sel = getnext(clients))) {
|
|
||||||
higher(sel);
|
|
||||||
focus(sel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
drawall();
|
|
||||||
}
|
|
||||||
|
|
||||||
Client *
|
|
||||||
getnext(Client *c)
|
|
||||||
{
|
|
||||||
for(; c && !c->tags[tsel]; c = c->next);
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
replacetag(Arg *arg)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
if(!sel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for(i = 0; i < TLast; i++)
|
|
||||||
sel->tags[i] = NULL;
|
|
||||||
appendtag(arg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
settags(Client *c)
|
|
||||||
{
|
|
||||||
XClassHint ch;
|
|
||||||
static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0;
|
|
||||||
unsigned int i, j;
|
|
||||||
Bool matched = False;
|
|
||||||
|
|
||||||
if(!len) {
|
|
||||||
c->tags[tsel] = tags[tsel];
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(XGetClassHint(dpy, c->win, &ch)) {
|
|
||||||
if(ch.res_class && ch.res_name) {
|
|
||||||
for(i = 0; i < len; i++)
|
|
||||||
if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class))
|
|
||||||
&& !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance)))
|
|
||||||
{
|
|
||||||
for(j = 0; j < TLast; j++)
|
|
||||||
c->tags[j] = rule[i].tags[j];
|
|
||||||
c->isfloat = rule[i].isfloat;
|
|
||||||
matched = True;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(ch.res_class)
|
|
||||||
XFree(ch.res_class);
|
|
||||||
if(ch.res_name)
|
|
||||||
XFree(ch.res_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!matched)
|
|
||||||
c->tags[tsel] = tags[tsel];
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
view(Arg *arg)
|
|
||||||
{
|
|
||||||
tsel = arg->i;
|
|
||||||
arrange(NULL);
|
|
||||||
drawall();
|
|
||||||
}
|
|
42
transient.c
Normal file
42
transient.c
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/* cc transient.c -o transient -lX11 */
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xutil.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
Display *d;
|
||||||
|
Window r, f, t = None;
|
||||||
|
XSizeHints h;
|
||||||
|
XEvent e;
|
||||||
|
|
||||||
|
d = XOpenDisplay(NULL);
|
||||||
|
if (!d)
|
||||||
|
exit(1);
|
||||||
|
r = DefaultRootWindow(d);
|
||||||
|
|
||||||
|
f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0);
|
||||||
|
h.min_width = h.max_width = h.min_height = h.max_height = 400;
|
||||||
|
h.flags = PMinSize | PMaxSize;
|
||||||
|
XSetWMNormalHints(d, f, &h);
|
||||||
|
XStoreName(d, f, "floating");
|
||||||
|
XMapWindow(d, f);
|
||||||
|
|
||||||
|
XSelectInput(d, f, ExposureMask);
|
||||||
|
while (1) {
|
||||||
|
XNextEvent(d, &e);
|
||||||
|
|
||||||
|
if (t == None) {
|
||||||
|
sleep(5);
|
||||||
|
t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0);
|
||||||
|
XSetTransientForHint(d, t, f);
|
||||||
|
XStoreName(d, t, "transient");
|
||||||
|
XMapWindow(d, t);
|
||||||
|
XSelectInput(d, t, ExposureMask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
XCloseDisplay(d);
|
||||||
|
exit(0);
|
||||||
|
}
|
66
util.c
66
util.c
@ -1,61 +1,33 @@
|
|||||||
/*
|
/* See LICENSE file for copyright and license details. */
|
||||||
* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
|
|
||||||
* See LICENSE file for license details.
|
|
||||||
*/
|
|
||||||
#include "dwm.h"
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/wait.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
/* static */
|
#include "util.h"
|
||||||
|
|
||||||
static void
|
|
||||||
bad_malloc(unsigned int size)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "fatal: could not malloc() %d bytes\n",
|
|
||||||
(int) size);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* extern */
|
|
||||||
|
|
||||||
void *
|
void *
|
||||||
emallocz(unsigned int size)
|
ecalloc(size_t nmemb, size_t size)
|
||||||
{
|
{
|
||||||
void *res = calloc(1, size);
|
void *p;
|
||||||
if(!res)
|
|
||||||
bad_malloc(size);
|
if (!(p = calloc(nmemb, size)))
|
||||||
return res;
|
perror(NULL);
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
eprint(const char *errstr, ...) {
|
die(const char *fmt, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap, errstr);
|
|
||||||
vfprintf(stderr, errstr, ap);
|
va_start(ap, fmt);
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
|
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
|
||||||
|
fputc(' ', stderr);
|
||||||
|
perror(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
spawn(Arg *arg)
|
|
||||||
{
|
|
||||||
char **argv = (char **)arg->argv;
|
|
||||||
if(!argv || !argv[0])
|
|
||||||
return;
|
|
||||||
if(fork() == 0) {
|
|
||||||
if(fork() == 0) {
|
|
||||||
if(dpy)
|
|
||||||
close(ConnectionNumber(dpy));
|
|
||||||
setsid();
|
|
||||||
execvp(argv[0], argv);
|
|
||||||
fprintf(stderr, "dwm: execvp %s", argv[0]);
|
|
||||||
perror(" failed");
|
|
||||||
}
|
|
||||||
exit (0);
|
|
||||||
}
|
|
||||||
wait(0);
|
|
||||||
}
|
|
||||||
|
8
util.h
Normal file
8
util.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/* See LICENSE file for copyright and license details. */
|
||||||
|
|
||||||
|
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
||||||
|
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
||||||
|
#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
|
||||||
|
|
||||||
|
void die(const char *errstr, ...);
|
||||||
|
void *ecalloc(size_t, size_t);
|
Reference in New Issue
Block a user