mirror of
https://github.com/gryf/wmaker.git
synced 2026-03-12 04:25:47 +01:00
Compare commits
1530 Commits
release-0.
...
wmaker-0.9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d0a48d9914 | ||
|
|
625e762f9a | ||
|
|
8bc9a1dd19 | ||
|
|
93687024ce | ||
|
|
9fa427bc7f | ||
|
|
d435ea7468 | ||
|
|
f43aa47d68 | ||
|
|
b949a1c464 | ||
|
|
c2975ab510 | ||
|
|
9777b14fb7 | ||
|
|
8ba6118c2e | ||
|
|
25c67fc7cc | ||
|
|
a06b0673d8 | ||
|
|
d9296ff9a4 | ||
|
|
e01d14abe4 | ||
|
|
e499f31a4e | ||
|
|
8fe18de926 | ||
|
|
e95f886e06 | ||
|
|
6c2a5f19f1 | ||
|
|
c126f1d08f | ||
|
|
dce16306bc | ||
|
|
f6fefbd9b6 | ||
|
|
5fa8b979b9 | ||
|
|
af857e8b95 | ||
|
|
cbbc1fc9ac | ||
|
|
18de6b8c96 | ||
|
|
7490b14bf0 | ||
|
|
a750fe03f4 | ||
|
|
8fd4821155 | ||
|
|
f65b99e615 | ||
|
|
43c7abe79f | ||
|
|
7feb59251e | ||
|
|
c82138eab9 | ||
|
|
077a2eaa71 | ||
|
|
751b6e7938 | ||
|
|
bbaa42240f | ||
|
|
7036890288 | ||
|
|
7c14c0b14a | ||
|
|
85f31104cd | ||
|
|
1b2745fad8 | ||
|
|
5ff0272508 | ||
|
|
1060f49366 | ||
|
|
614eb4c9e8 | ||
|
|
76eab97209 | ||
|
|
b5ed9841bc | ||
|
|
3f8bba8064 | ||
|
|
4f853ce3b6 | ||
|
|
a23b72c32a | ||
|
|
5377ec8fba | ||
|
|
0451160f7d | ||
|
|
a396f3bd66 | ||
|
|
125cba8f82 | ||
|
|
ee1f13da45 | ||
|
|
7aff3b6e44 | ||
|
|
5eebb8bc3c | ||
|
|
51134d2438 | ||
|
|
ba5fceb21c | ||
|
|
3c408fa179 | ||
|
|
8b68042b30 | ||
|
|
210bcec4de | ||
|
|
9a2732a4c3 | ||
|
|
668cac00f6 | ||
|
|
7cc64627cc | ||
|
|
b16181143c | ||
|
|
4b894021d9 | ||
|
|
cdf457d2d5 | ||
|
|
3490c8bd30 | ||
|
|
70abda81d0 | ||
|
|
c37046e6a9 | ||
|
|
09e6fd1526 | ||
|
|
060ba6a9cd | ||
|
|
f6080ffd56 | ||
|
|
ffda48bd61 | ||
|
|
7859e2d59f | ||
|
|
14863cd3b1 | ||
|
|
300d02bf54 | ||
|
|
1420e44bb1 | ||
|
|
de9fcef214 | ||
|
|
843dc889f4 | ||
|
|
b4cb488241 | ||
|
|
d8eea6a155 | ||
|
|
b305eb84fb | ||
|
|
88c6a51547 | ||
|
|
d59dacbccd | ||
|
|
f4890b17e6 | ||
|
|
660b61a182 | ||
|
|
752d084609 | ||
|
|
94a0c7b42f | ||
|
|
8594c39a0b | ||
|
|
34293e072a | ||
|
|
1f21919809 | ||
|
|
c5f5e0b9c0 | ||
|
|
24d7457ec6 | ||
|
|
4de3d69934 | ||
|
|
be8a5d4a45 | ||
|
|
ff6a6ebbaa | ||
|
|
219e7fcafa | ||
|
|
f38aa69e40 | ||
|
|
8ca05fd4be | ||
|
|
f206c15fea | ||
|
|
4478f21b7f | ||
|
|
d2853c8584 | ||
|
|
51236308d2 | ||
|
|
02de600ecd | ||
|
|
a8813b2eae | ||
|
|
0d32a6d3b7 | ||
|
|
553464d965 | ||
|
|
a71a604ab1 | ||
|
|
cf2301a048 | ||
|
|
ce9b375b8d | ||
|
|
b8f118e9a5 | ||
|
|
ae8937e152 | ||
|
|
091c9c366d | ||
|
|
3c847aa52b | ||
|
|
758f4c80d1 | ||
|
|
b4b07c2cac | ||
|
|
4a9d561ce4 | ||
|
|
2bc0c1124a | ||
|
|
6483b198d3 | ||
|
|
b042d2be8e | ||
|
|
80814b7dba | ||
|
|
e7f3e62d69 | ||
|
|
e10e7d08fa | ||
|
|
844bf1b4e3 | ||
|
|
7374fe5984 | ||
|
|
e18eba6ae7 | ||
|
|
35ed80648b | ||
|
|
09c56140a2 | ||
|
|
ece6d213aa | ||
|
|
5b24997446 | ||
|
|
8f63bdafcd | ||
|
|
8e0ef4766d | ||
|
|
1194889c95 | ||
|
|
ee69b6207a | ||
|
|
5afe745c01 | ||
|
|
9318a7f428 | ||
|
|
2ba8d2eec9 | ||
|
|
790917a8e7 | ||
|
|
8d4819c7ea | ||
|
|
392ab2607d | ||
|
|
a257e16593 | ||
|
|
17cc7c3c77 | ||
|
|
cc629f342c | ||
|
|
afebdb50fa | ||
|
|
f41db5b5be | ||
|
|
ca1c29cd98 | ||
|
|
e9d42e5121 | ||
|
|
aeb4cb8a79 | ||
|
|
bfd1abd32b | ||
|
|
7e5b8e412f | ||
|
|
44edeea804 | ||
|
|
d872b73881 | ||
|
|
27dcdd3798 | ||
|
|
ce04eabec6 | ||
|
|
368e7e3e8f | ||
|
|
5c8eb580b3 | ||
|
|
48044feb29 | ||
|
|
2031a25869 | ||
|
|
be05b0f01e | ||
|
|
b17077ede0 | ||
|
|
be065e3bf4 | ||
|
|
894bf4e292 | ||
|
|
c201e1612c | ||
|
|
f6b7178542 | ||
|
|
ce32e2b5e0 | ||
|
|
6269d3a66f | ||
|
|
3289b6c772 | ||
|
|
0baac21e95 | ||
|
|
5423e8318e | ||
|
|
c68597b6e8 | ||
|
|
a78cff4e7f | ||
|
|
3b289c4a8c | ||
|
|
eae99ee833 | ||
|
|
baef1646ac | ||
|
|
df8649cf54 | ||
|
|
492206fe6c | ||
|
|
8dc7c5f554 | ||
|
|
15f74cfb10 | ||
|
|
3751b587eb | ||
|
|
a1867f2473 | ||
|
|
014ced4794 | ||
|
|
d7fd103528 | ||
|
|
493a263a7d | ||
|
|
7f59c4dfa3 | ||
|
|
ac8da4a8f0 | ||
|
|
1150f741ec | ||
|
|
fef3ee5742 | ||
|
|
dcbfb467de | ||
|
|
c8c613074e | ||
|
|
c20bfe9737 | ||
|
|
7b74111259 | ||
|
|
de48a9b1f5 | ||
|
|
dadb78b835 | ||
|
|
ef2349bc69 | ||
|
|
930a3922d5 | ||
|
|
6300d3462b | ||
|
|
9215d2d9dd | ||
|
|
879d84d883 | ||
|
|
c238d8417f | ||
|
|
3f27b998a7 | ||
|
|
abb8c62fe0 | ||
|
|
c396e8ca4f | ||
|
|
ffb803a0ba | ||
|
|
e75b1b6d70 | ||
|
|
68bd644b0d | ||
|
|
4ddc2a5a0a | ||
|
|
12d16d92e7 | ||
|
|
b575955263 | ||
|
|
f7dc986ed1 | ||
|
|
0350b8445a | ||
|
|
4041278f48 | ||
|
|
62f4eff7ae | ||
|
|
4247ac9f82 | ||
|
|
6002ce0cbc | ||
|
|
22978af5a6 | ||
|
|
37829a7c60 | ||
|
|
518b3b4480 | ||
|
|
554f9dea25 | ||
|
|
7a38ea85b9 | ||
|
|
bbe55ba242 | ||
|
|
39426bde35 | ||
|
|
c960ae622e | ||
|
|
607beee479 | ||
|
|
abda319c16 | ||
|
|
65aa3ae9c8 | ||
|
|
ec7506e5e5 | ||
|
|
12de2f319e | ||
|
|
bbf3635590 | ||
|
|
3be81b0243 | ||
|
|
35bcfa6a02 | ||
|
|
6082f2d243 | ||
|
|
6b5cfc887a | ||
|
|
e4fedca2bb | ||
|
|
c183d9107e | ||
|
|
fb91e5d67a | ||
|
|
08f990a946 | ||
|
|
241e66ff0a | ||
|
|
79e1bb53d3 | ||
|
|
c90484324c | ||
|
|
1b666f53e4 | ||
|
|
b59575e709 | ||
|
|
3f8248f534 | ||
|
|
68a55be998 | ||
|
|
68f70da310 | ||
|
|
c165beeb4b | ||
|
|
daad5ed828 | ||
|
|
2e91634921 | ||
|
|
81aaed2bf8 | ||
|
|
e7a46d5cdf | ||
|
|
7dc767ae78 | ||
|
|
859338fd83 | ||
|
|
1bc042c172 | ||
|
|
6bf7994520 | ||
|
|
444de5e6b6 | ||
|
|
4078af654b | ||
|
|
7b9b7de172 | ||
|
|
0c2d2c69b9 | ||
|
|
13ba5d5f5b | ||
|
|
828cb7a147 | ||
|
|
71aa4f2884 | ||
|
|
ea4645bc09 | ||
|
|
28cbda550a | ||
|
|
7d905787d2 | ||
|
|
0e12a076aa | ||
|
|
0f5c36a67e | ||
|
|
1f2b9999b9 | ||
|
|
55959b4f7e | ||
|
|
67a8a82670 | ||
|
|
83774951b7 | ||
|
|
298338c111 | ||
|
|
ab9c85a11d | ||
|
|
294ea56d84 | ||
|
|
eee6551aff | ||
|
|
1a0c8afa80 | ||
|
|
61a96e79c4 | ||
|
|
ef7c45df53 | ||
|
|
c7868fa405 | ||
|
|
118a93808a | ||
|
|
9dadfe7a68 | ||
|
|
d51bbe6626 | ||
|
|
5f02b1b5f4 | ||
|
|
9f7aaa8aed | ||
|
|
66bd06b5d5 | ||
|
|
43b1914f37 | ||
|
|
2a52ce3544 | ||
|
|
2ad40e0734 | ||
|
|
5178465bb6 | ||
|
|
cef4fbb422 | ||
|
|
9911ecd985 | ||
|
|
109e504262 | ||
|
|
63e4338284 | ||
|
|
8018da8149 | ||
|
|
034339320f | ||
|
|
de881d9c03 | ||
|
|
e1d5ce7a51 | ||
|
|
b4b25fdf6a | ||
|
|
badecc244b | ||
|
|
833128385f | ||
|
|
9a2dbc5a5f | ||
|
|
939f46b870 | ||
|
|
ee569220df | ||
|
|
baac5ead1e | ||
|
|
8d0020cf9a | ||
|
|
4688e1b568 | ||
|
|
484b19ba89 | ||
|
|
0db4d7885b | ||
|
|
744ccb85d2 | ||
|
|
e37db24efe | ||
|
|
3473a11787 | ||
|
|
6d6d53a350 | ||
|
|
51885365a6 | ||
|
|
0049b5bc8c | ||
|
|
2901a153ce | ||
|
|
6b791d8a89 | ||
|
|
1f3adb0ea5 | ||
|
|
ad853b386e | ||
|
|
1861880239 | ||
|
|
6367bf5234 | ||
|
|
708cf2d2a2 | ||
|
|
6723aa55aa | ||
|
|
e54f763f14 | ||
|
|
914d984422 | ||
|
|
ba4c4bd61a | ||
|
|
585307ba39 | ||
|
|
f1980ce1f1 | ||
|
|
23a790da1d | ||
|
|
7793bb9d67 | ||
|
|
366cb8367b | ||
|
|
422fedbc4b | ||
|
|
c89cb142ba | ||
|
|
72dfe4aa89 | ||
|
|
4e90a87b14 | ||
|
|
f55eef413f | ||
|
|
643e49f190 | ||
|
|
8a2a0b6adc | ||
|
|
0deb198b10 | ||
|
|
b6689a0108 | ||
|
|
7ef8178d2a | ||
|
|
b3e817305d | ||
|
|
a2133e8e2f | ||
|
|
efa31f30b2 | ||
|
|
024e2f5299 | ||
|
|
629b118767 | ||
|
|
d8ef209c9a | ||
|
|
2ba803ad98 | ||
|
|
33c9e87692 | ||
|
|
0a5febcada | ||
|
|
41fdb79e28 | ||
|
|
d74a90d1bf | ||
|
|
fe8ab024af | ||
|
|
6c6e832c52 | ||
|
|
13c2d523e2 | ||
|
|
e7cc15df71 | ||
|
|
3db3f179d1 | ||
|
|
5fa41941fe | ||
|
|
4c4d50c813 | ||
|
|
8c5a7b287a | ||
|
|
347fbcc87a | ||
|
|
a2cb317f11 | ||
|
|
391d5de79e | ||
|
|
ad4358c605 | ||
|
|
2203b229b0 | ||
|
|
4932433b95 | ||
|
|
f9792a042a | ||
|
|
96b9b22cb2 | ||
|
|
1f1eb393f8 | ||
|
|
bf88570a5f | ||
|
|
a3246cfe3b | ||
|
|
c5f027d811 | ||
|
|
af8cec15e3 | ||
|
|
15e37ff942 | ||
|
|
347e804bb6 | ||
|
|
a063338175 | ||
|
|
781b663341 | ||
|
|
09140a82b9 | ||
|
|
87161c5e0c | ||
|
|
cda27758bc | ||
|
|
b014ef2770 | ||
|
|
e9309e1e39 | ||
|
|
06d3360224 | ||
|
|
9d6728d3e7 | ||
|
|
2765bec3e4 | ||
|
|
7df49cce14 | ||
|
|
21eb8456ba | ||
|
|
bc3995bf6b | ||
|
|
7f457fa275 | ||
|
|
484bdbe7d4 | ||
|
|
ef2f5a6f29 | ||
|
|
12b6be768e | ||
|
|
6a0120f014 | ||
|
|
0a0c2391de | ||
|
|
7a86f48f73 | ||
|
|
3953f53680 | ||
|
|
92eff967a7 | ||
|
|
eaca92db50 | ||
|
|
1a85719971 | ||
|
|
5979162878 | ||
|
|
306165775e | ||
|
|
c7f2a189c4 | ||
|
|
ca2c1f900d | ||
|
|
18408fff93 | ||
|
|
5c46f48898 | ||
|
|
567279b962 | ||
|
|
1a27b34160 | ||
|
|
9789cf3154 | ||
|
|
513a509096 | ||
|
|
f6645ac564 | ||
|
|
cf0f7d68d5 | ||
|
|
3106292f4b | ||
|
|
e42586c712 | ||
|
|
0a47a19b3e | ||
|
|
e4fcd515fe | ||
|
|
4bce3e3805 | ||
|
|
cbd13dd95f | ||
|
|
18c7a20136 | ||
|
|
816fee1b68 | ||
|
|
5b93254d0f | ||
|
|
62bf6d17b5 | ||
|
|
8efc490361 | ||
|
|
5f5b1df7d2 | ||
|
|
88ab8b74b4 | ||
|
|
2ccc8e4a79 | ||
|
|
8490e31fde | ||
|
|
05720d9707 | ||
|
|
f8dd3dc49e | ||
|
|
c04a2caeab | ||
|
|
cf62d1591f | ||
|
|
7857f297ea | ||
|
|
b37e065252 | ||
|
|
d7183d33b4 | ||
|
|
2ed9c12ee5 | ||
|
|
229b6984de | ||
|
|
a1f35d7f5b | ||
|
|
34be9d7816 | ||
|
|
9af6316d1d | ||
|
|
6924454836 | ||
|
|
328251c68a | ||
|
|
2f87d01a41 | ||
|
|
22730876e4 | ||
|
|
be08535ab4 | ||
|
|
108127f0b5 | ||
|
|
6d75291e1d | ||
|
|
ca60620f50 | ||
|
|
a9aeefbe70 | ||
|
|
d6c134f420 | ||
|
|
442e3876c6 | ||
|
|
19f110d26e | ||
|
|
3f6ae395ce | ||
|
|
ba027149bd | ||
|
|
f893728d2d | ||
|
|
01dddf00c8 | ||
|
|
fe736e849c | ||
|
|
874b0fadf5 | ||
|
|
31f16389f6 | ||
|
|
2706f7217c | ||
|
|
e522ca734d | ||
|
|
3a0eb643d9 | ||
|
|
f79379c090 | ||
|
|
001bc28037 | ||
|
|
203eba8937 | ||
|
|
d27e43e6b5 | ||
|
|
1db15a3543 | ||
|
|
c970c94f82 | ||
|
|
570df8316d | ||
|
|
21b5df494b | ||
|
|
e113ec10c9 | ||
|
|
95a576bd62 | ||
|
|
3f7110b120 | ||
|
|
f9bb2a428a | ||
|
|
333dbf5418 | ||
|
|
a9238c99b9 | ||
|
|
4a041b6f0a | ||
|
|
688a56e8ab | ||
|
|
59fc927dc9 | ||
|
|
066af13b5c | ||
|
|
e2d8cbe238 | ||
|
|
cb31fd374c | ||
|
|
f4fd88b8a9 | ||
|
|
f36ab39680 | ||
|
|
0a32ecf1fe | ||
|
|
9baff1363c | ||
|
|
f18567db9a | ||
|
|
be0d694dc2 | ||
|
|
6310e40d47 | ||
|
|
7a84127a27 | ||
|
|
288853e44f | ||
|
|
09a8911b6f | ||
|
|
ceeca912cd | ||
|
|
7a3b139dcb | ||
|
|
e2b6a85e80 | ||
|
|
38074e7bd5 | ||
|
|
f516213bf3 | ||
|
|
bbc52564d0 | ||
|
|
3e9aae7a91 | ||
|
|
9fa4fbef91 | ||
|
|
f21ce5768b | ||
|
|
b487d56452 | ||
|
|
d316260395 | ||
|
|
6b08fc9e78 | ||
|
|
0c469de04f | ||
|
|
d680e6e580 | ||
|
|
3c323e1e9a | ||
|
|
06f59b9928 | ||
|
|
4339e446e4 | ||
|
|
72689513a3 | ||
|
|
56d8568787 | ||
|
|
c91bb1ba13 | ||
|
|
e4800e84d0 | ||
|
|
ee28b0257a | ||
|
|
722c82c8ab | ||
|
|
2061c30758 | ||
|
|
4e8423d18a | ||
|
|
a5aa8573c9 | ||
|
|
ecd5217633 | ||
|
|
577b3ee949 | ||
|
|
bc4de88d8b | ||
|
|
4688c9839b | ||
|
|
90c0e656f1 | ||
|
|
42191340fd | ||
|
|
d873d09fa5 | ||
|
|
2e114bcc1e | ||
|
|
1a73c71d56 | ||
|
|
240586edc5 | ||
|
|
eae4c45cf5 | ||
|
|
c2c58734b8 | ||
|
|
085e9d6254 | ||
|
|
f683b99405 | ||
|
|
bacf8229b0 | ||
|
|
fa7a5db4bd | ||
|
|
e534138417 | ||
|
|
73d94f7bdc | ||
|
|
054f954390 | ||
|
|
c0317ddae5 | ||
|
|
91f5abc955 | ||
|
|
d26f18505a | ||
|
|
f3a960d9d8 | ||
|
|
5f0a357b1f | ||
|
|
20d5925d08 | ||
|
|
b655a5fa5f | ||
|
|
ad0ae4887f | ||
|
|
eca635cb5d | ||
|
|
ad641c1992 | ||
|
|
69730273b1 | ||
|
|
f8b3a774be | ||
|
|
2ea40ff2c5 | ||
|
|
33f7b63d11 | ||
|
|
880880162b | ||
|
|
2f56373cc2 | ||
|
|
24519b6292 | ||
|
|
24e349afe7 | ||
|
|
5cfc565bbd | ||
|
|
c8406b640c | ||
|
|
53db5fc4a5 | ||
|
|
9bd4abb288 | ||
|
|
25c37b7637 | ||
|
|
3301b57d4b | ||
|
|
fe381eca77 | ||
|
|
e3df52ca51 | ||
|
|
b2e87b76f9 | ||
|
|
5811c3d89c | ||
|
|
140c48f1cc | ||
|
|
b62e379299 | ||
|
|
71f1d7f101 | ||
|
|
bde572f673 | ||
|
|
684621ecd4 | ||
|
|
9f89695c48 | ||
|
|
acc868d91d | ||
|
|
d7d3003e06 | ||
|
|
d292143af1 | ||
|
|
3b46cf38cd | ||
|
|
e53ddd046f | ||
|
|
e9e1186f1d | ||
|
|
558615a853 | ||
|
|
ca61675597 | ||
|
|
79864ba94c | ||
|
|
d63a0b4859 | ||
|
|
ac87ca5596 | ||
|
|
2ea68b8d2b | ||
|
|
9234fb72b2 | ||
|
|
92a84fe050 | ||
|
|
c95b464680 | ||
|
|
59609280a2 | ||
|
|
bb0c0dafae | ||
|
|
5f3c54af13 | ||
|
|
d8862b0bdf | ||
|
|
bbd1e5dada | ||
|
|
087a16400f | ||
|
|
b89f3e6df5 | ||
|
|
4bc0bcfbc2 | ||
|
|
9ff9fcda48 | ||
|
|
ac6b5afd32 | ||
|
|
0d9b73cd74 | ||
|
|
12b8b8ba58 | ||
|
|
f274afdd1d | ||
|
|
e3c67d55de | ||
|
|
8bf6071c48 | ||
|
|
897e75d554 | ||
|
|
363b6032f5 | ||
|
|
4638216209 | ||
|
|
67a9ea74a3 | ||
|
|
f89cf06299 | ||
|
|
cb7f34e237 | ||
|
|
7401a1329f | ||
|
|
df1228f387 | ||
|
|
9ead135f51 | ||
|
|
193a63511d | ||
|
|
b00076b32a | ||
|
|
51c2edf868 | ||
|
|
11b464a002 | ||
|
|
c3cff33f99 | ||
|
|
663df7b4cb | ||
|
|
b79524ce6f | ||
|
|
65a113f9a3 | ||
|
|
45c55a3e76 | ||
|
|
e93e16de06 | ||
|
|
620a280d64 | ||
|
|
4bda625076 | ||
|
|
b034bb077f | ||
|
|
d08691d5a5 | ||
|
|
08e811aae7 | ||
|
|
6de693a24d | ||
|
|
3a7749b0fc | ||
|
|
f555ccb9b9 | ||
|
|
f6682a9ade | ||
|
|
1166a58ec7 | ||
|
|
59d2a5cbe5 | ||
|
|
85f72d6576 | ||
|
|
435aee107e | ||
|
|
6cd91272a6 | ||
|
|
7908c9a66b | ||
|
|
f6fb9fbb3e | ||
|
|
9de3560d9f | ||
|
|
88e207f9e0 | ||
|
|
66ec682107 | ||
|
|
1076645853 | ||
|
|
30247c5886 | ||
|
|
1e3a40370d | ||
|
|
27b9e27ae0 | ||
|
|
28050dab72 | ||
|
|
bc6aeab722 | ||
|
|
737328566f | ||
|
|
6cfad0b10f | ||
|
|
19c7a99197 | ||
|
|
7929d55f3f | ||
|
|
1f12617065 | ||
|
|
944737dde7 | ||
|
|
a91a34732c | ||
|
|
744c0726a1 | ||
|
|
7055530895 | ||
|
|
9402724e40 | ||
|
|
cd36d73886 | ||
|
|
0c09179f01 | ||
|
|
884a3f1647 | ||
|
|
2e572717c5 | ||
|
|
8502709884 | ||
|
|
5f4a3f6777 | ||
|
|
067fc41354 | ||
|
|
36b55dc1e6 | ||
|
|
3a97c33072 | ||
|
|
62590be0db | ||
|
|
440f2abe6f | ||
|
|
f54f0856c1 | ||
|
|
62994167c5 | ||
|
|
00e709cec4 | ||
|
|
2b51c21ee5 | ||
|
|
3ed1d3e25c | ||
|
|
3088277b1e | ||
|
|
879b00a57b | ||
|
|
6830b05716 | ||
|
|
5912898b06 | ||
|
|
f614cb8341 | ||
|
|
9ff85407b7 | ||
|
|
d211420261 | ||
|
|
1ef52e0aec | ||
|
|
9aca0d5f6e | ||
|
|
c7c68c6fe7 | ||
|
|
95897acc30 | ||
|
|
57869b667b | ||
|
|
2c8a70b743 | ||
|
|
0445dd5c18 | ||
|
|
b6e06d4beb | ||
|
|
b75b7cbc01 | ||
|
|
eb646a6682 | ||
|
|
7b88cd8afd | ||
|
|
f5a6724142 | ||
|
|
afbab71401 | ||
|
|
20fe42df2b | ||
|
|
d0c5bedab6 | ||
|
|
ef31cd1323 | ||
|
|
427a42ab58 | ||
|
|
474c4caf94 | ||
|
|
109bb540ec | ||
|
|
9b7b9f6815 | ||
|
|
32973f6e15 | ||
|
|
5b26a68910 | ||
|
|
59014546aa | ||
|
|
e4483de406 | ||
|
|
90d830837a | ||
|
|
752163dfc6 | ||
|
|
6d02fe98f2 | ||
|
|
500d569c79 | ||
|
|
f54b0de7b4 | ||
|
|
b8193865f6 | ||
|
|
e7d0c5d9e9 | ||
|
|
791bb6a444 | ||
|
|
a018eff89d | ||
|
|
1096cfa991 | ||
|
|
5d9354f362 | ||
|
|
0b42849a3e | ||
|
|
df75c86ef0 | ||
|
|
20975c4918 | ||
|
|
1dfaec332e | ||
|
|
3d6d775f08 | ||
|
|
1f393ac4f7 | ||
|
|
847479b886 | ||
|
|
6aed0cd713 | ||
|
|
39b9edfdcd | ||
|
|
090cc27f00 | ||
|
|
08225948bc | ||
|
|
18d07e04a6 | ||
|
|
74ba4f8eef | ||
|
|
0852957ea1 | ||
|
|
7efcf57c18 | ||
|
|
44f636e91e | ||
|
|
8457611316 | ||
|
|
bd7943d9a7 | ||
|
|
b0d72a3db2 | ||
|
|
396b011610 | ||
|
|
c131f14d3e | ||
|
|
a4c986fa1b | ||
|
|
64468fcf63 | ||
|
|
8904783aee | ||
|
|
40c89b3399 | ||
|
|
27a396d7ed | ||
|
|
2cf5931890 | ||
|
|
d159da8671 | ||
|
|
ed0d234d7f | ||
|
|
4d701d8306 | ||
|
|
5dbb770aa4 | ||
|
|
479ccbda82 | ||
|
|
001cb65271 | ||
|
|
bc3ab27364 | ||
|
|
669d542408 | ||
|
|
3dcab96180 | ||
|
|
7f1d621f43 | ||
|
|
b0063c83c7 | ||
|
|
f06c9a1953 | ||
|
|
e1958b22c5 | ||
|
|
528243bb98 | ||
|
|
f058fdf72c | ||
|
|
5f79f1bcde | ||
|
|
18ed046356 | ||
|
|
277d0055fd | ||
|
|
e727cbadb6 | ||
|
|
fdeb749da7 | ||
|
|
dee8c6e770 | ||
|
|
fe4cd695af | ||
|
|
1902325087 | ||
|
|
5b28616212 | ||
|
|
ad05cc3b44 | ||
|
|
56f73aa4b9 | ||
|
|
40111188ec | ||
|
|
80c09f1075 | ||
|
|
b5ef388711 | ||
|
|
7a8bde44fa | ||
|
|
b381674375 | ||
|
|
e54a0954e6 | ||
|
|
c0965cd48b | ||
|
|
4153e2fde4 | ||
|
|
f3487c1ea2 | ||
|
|
0898a3d475 | ||
|
|
064f79ebae | ||
|
|
55d37178a0 | ||
|
|
90e8cfc5b8 | ||
|
|
ab511aca5e | ||
|
|
39d250888e | ||
|
|
00638fa5d3 | ||
|
|
ca43aba088 | ||
|
|
96c64e15ef | ||
|
|
dd1ccd2fd6 | ||
|
|
c0442b1c59 | ||
|
|
bde9b8a21a | ||
|
|
83d3625e1a | ||
|
|
5ad557c6c8 | ||
|
|
1fa3937001 | ||
|
|
a10214a502 | ||
|
|
0fe70d2b4e | ||
|
|
18b3753227 | ||
|
|
0bfa12a1fc | ||
|
|
4d6cd7f326 | ||
|
|
2fe1b0e3f8 | ||
|
|
3929660f39 | ||
|
|
c2ec1cfe8a | ||
|
|
d597c61cb7 | ||
|
|
5e18eadf22 | ||
|
|
19f7fbc949 | ||
|
|
55f3cb9577 | ||
|
|
811e508c84 | ||
|
|
60ee69979f | ||
|
|
4f80ec9178 | ||
|
|
5e37991b6c | ||
|
|
a4bc7f6a07 | ||
|
|
6724ec5a6d | ||
|
|
879d13ef45 | ||
|
|
a1d78d102a | ||
|
|
3af4aa7846 | ||
|
|
0f0afc48ab | ||
|
|
55efa1f268 | ||
|
|
ffa1a610c0 | ||
|
|
0bb76c0a76 | ||
|
|
7be0a97998 | ||
|
|
5230a57599 | ||
|
|
3bed15d673 | ||
|
|
1e92274495 | ||
|
|
2b2fecac12 | ||
|
|
17f26077b0 | ||
|
|
a2b404b5b3 | ||
|
|
e98da5a628 | ||
|
|
b9e7a1d3ca | ||
|
|
1941aaf34a | ||
|
|
11c466ec26 | ||
|
|
feaa80addc | ||
|
|
92b012e800 | ||
|
|
3fc803c0d8 | ||
|
|
a07b262a87 | ||
|
|
851835c7a5 | ||
|
|
d4de3d0a45 | ||
|
|
048b43aea4 | ||
|
|
579eb01c6c | ||
|
|
ca212985df | ||
|
|
c32806ae14 | ||
|
|
ee5b28b0af | ||
|
|
750917986e | ||
|
|
6e72c20248 | ||
|
|
ad0ad5af22 | ||
|
|
e4a53ba71e | ||
|
|
208ee16849 | ||
|
|
f9acc9313e | ||
|
|
92fb96eb69 | ||
|
|
18d347ecd5 | ||
|
|
97e20d94de | ||
|
|
65e65c4e9d | ||
|
|
84fa789cd6 | ||
|
|
efcf27f854 | ||
|
|
5fe90167a3 | ||
|
|
f857012f7a | ||
|
|
efb0090f8c | ||
|
|
1cd1f16c3c | ||
|
|
0c1881e224 | ||
|
|
5bb35d94a5 | ||
|
|
321bb04586 | ||
|
|
77b8fe05ac | ||
|
|
9466c00f2b | ||
|
|
a8950af8ac | ||
|
|
58e719654f | ||
|
|
ad58481487 | ||
|
|
5402fccd1e | ||
|
|
cf7859d145 | ||
|
|
5db8b5660f | ||
|
|
5873385d32 | ||
|
|
a26b723c5a | ||
|
|
bc3d012e7c | ||
|
|
c08b3c5f32 | ||
|
|
f37b4cf5d0 | ||
|
|
06f1bf91a9 | ||
|
|
8b5f31ad8b | ||
|
|
2cc90e649a | ||
|
|
9d41f432b9 | ||
|
|
b4f540ddd6 | ||
|
|
03f534c0bf | ||
|
|
9078b1a5a7 | ||
|
|
da02e76051 | ||
|
|
9c19d14d1a | ||
|
|
bc88390918 | ||
|
|
a1b9bf23a9 | ||
|
|
511a06628b | ||
|
|
8a25fdc672 | ||
|
|
a1a7ba7689 | ||
|
|
4f84c48ccb | ||
|
|
9b63a77d6a | ||
|
|
89a32e3663 | ||
|
|
501c3f48b8 | ||
|
|
cab71ba6a1 | ||
|
|
96f8ab167f | ||
|
|
a8c7375623 | ||
|
|
365556b676 | ||
|
|
7b00d9ec12 | ||
|
|
89cb6559cc | ||
|
|
372da5ca39 | ||
|
|
514258fd35 | ||
|
|
0b0002f75a | ||
|
|
cf2322ee03 | ||
|
|
c9dfd7f3a4 | ||
|
|
7eb705472f | ||
|
|
d35dd84ae5 | ||
|
|
0613a758f4 | ||
|
|
9e615bcff9 | ||
|
|
9031641ba6 | ||
|
|
9bfa0b6efb | ||
|
|
60409e290d | ||
|
|
03befcf729 | ||
|
|
beb83f52fe | ||
|
|
99a5f0da0f | ||
|
|
520a6cd0e4 | ||
|
|
f968d88070 | ||
|
|
e1ed96951b | ||
|
|
41996df786 | ||
|
|
932fcd1f37 | ||
|
|
cefdc204ba | ||
|
|
6f28d987a8 | ||
|
|
c8b3933c19 | ||
|
|
4140e6051f | ||
|
|
f0664d1344 | ||
|
|
f4ef34b814 | ||
|
|
90c77b1a45 | ||
|
|
672c42cc48 | ||
|
|
739fd1a567 | ||
|
|
363290d919 | ||
|
|
235b4c6d25 | ||
|
|
bbc87bded6 | ||
|
|
81a1f98ca5 | ||
|
|
06b48596f5 | ||
|
|
0c4dc1c24a | ||
|
|
af287fb8eb | ||
|
|
7688a9f626 | ||
|
|
9f62c660d7 | ||
|
|
cc9abd6e7e | ||
|
|
72150b1da7 | ||
|
|
b1565d01c4 | ||
|
|
3b1961d40d | ||
|
|
d7ffd46d89 | ||
|
|
8cb297a671 | ||
|
|
4be9abcdbc | ||
|
|
75f790160b | ||
|
|
4350cf540c | ||
|
|
dc9b99fe47 | ||
|
|
1dcb477fde | ||
|
|
7213271249 | ||
|
|
727f3e0529 | ||
|
|
0321fad531 | ||
|
|
33cc542e85 | ||
|
|
8bb50a6320 | ||
|
|
558d0fbd14 | ||
|
|
2d6f757114 | ||
|
|
0bf92703da | ||
|
|
0c365cfb9b | ||
|
|
aedbe70f63 | ||
|
|
e0f7284142 | ||
|
|
abc09951e1 | ||
|
|
e9ce423d8c | ||
|
|
aae7c8b73a | ||
|
|
1cd42480bf | ||
|
|
e848fb0d74 | ||
|
|
680b9d7731 | ||
|
|
49e59ab367 | ||
|
|
5ef342d905 | ||
|
|
86f3e2fdb1 | ||
|
|
e44cc81a03 | ||
|
|
2d5a062064 | ||
|
|
44363ce805 | ||
|
|
acdc0e3d6b | ||
|
|
dd9e7d6816 | ||
|
|
5e6b9009a0 | ||
|
|
761f193b0a | ||
|
|
80fefd29e4 | ||
|
|
eecf75029f | ||
|
|
f3e53e8a67 | ||
|
|
9bfdc31051 | ||
|
|
554f2a6842 | ||
|
|
4a2ed2f09f | ||
|
|
0ee6312164 | ||
|
|
717392246a | ||
|
|
6b75506e52 | ||
|
|
92232f3a78 | ||
|
|
64b168083f | ||
|
|
fa994f627e | ||
|
|
0e2ac9dd16 | ||
|
|
0ee684f718 | ||
|
|
e825f57f20 | ||
|
|
a5f92da05c | ||
|
|
41d939e32f | ||
|
|
c1f19bc9f7 | ||
|
|
d052b5a90c | ||
|
|
5908962cac | ||
|
|
a1a6e2531d | ||
|
|
86c059db3b | ||
|
|
46e12bffb6 | ||
|
|
6c494f1a2e | ||
|
|
c28d3d3ff9 | ||
|
|
882b9a8e1c | ||
|
|
0931e14a5a | ||
|
|
c687b42960 | ||
|
|
d4097e11c9 | ||
|
|
8a6afcdcf6 | ||
|
|
3b00e8acaa | ||
|
|
271de3c9de | ||
|
|
d6feaa1c75 | ||
|
|
eb0e33e0f5 | ||
|
|
7e1f0e1e48 | ||
|
|
adfe32ea1f | ||
|
|
058079bb19 | ||
|
|
0156c6f92e | ||
|
|
3ab16b3e40 | ||
|
|
f955b4b61d | ||
|
|
3fcfc9bc16 | ||
|
|
128403b487 | ||
|
|
60611fbd47 | ||
|
|
7d64e19f5a | ||
|
|
a4486f0cd9 | ||
|
|
22ae4f5a3c | ||
|
|
bcf7358072 | ||
|
|
b444894d88 | ||
|
|
205b3f35b9 | ||
|
|
ab61c599f9 | ||
|
|
430c12e2b2 | ||
|
|
3208e193d7 | ||
|
|
7848a2d03f | ||
|
|
962d9407c1 | ||
|
|
cf9975125d | ||
|
|
28793346ab | ||
|
|
19b49b3fc1 | ||
|
|
ff5680d010 | ||
|
|
309a9163bd | ||
|
|
ddde229665 | ||
|
|
19ad865f49 | ||
|
|
41c0e64eac | ||
|
|
e826a4122e | ||
|
|
0616167b0f | ||
|
|
3bde6495a3 | ||
|
|
649a7ac82c | ||
|
|
86154ba01d | ||
|
|
2eb1f26644 | ||
|
|
4fb6cd1b1e | ||
|
|
36e46831e0 | ||
|
|
eb11184ef0 | ||
|
|
656a1c17e4 | ||
|
|
b061bf9832 | ||
|
|
ee49804d93 | ||
|
|
6a1c354d3f | ||
|
|
1ca5543ecb | ||
|
|
79def3b196 | ||
|
|
1e5ca9ae9f | ||
|
|
c03f50530d | ||
|
|
010ce93e92 | ||
|
|
6df4a38a50 | ||
|
|
fd4937cd97 | ||
|
|
648d75c299 | ||
|
|
03824d5324 | ||
|
|
829e9d30fe | ||
|
|
4341224f6e | ||
|
|
c3d2a890d7 | ||
|
|
10e7985961 | ||
|
|
9d1306bf01 | ||
|
|
5c37df521e | ||
|
|
79b17caa73 | ||
|
|
3300f79501 | ||
|
|
046403dbbb | ||
|
|
a41b8993e5 | ||
|
|
09f4b0d409 | ||
|
|
81ccbdc743 | ||
|
|
e0235bb61b | ||
|
|
9035122c5f | ||
|
|
6bbe6f2b9d | ||
|
|
7e8bff904f | ||
|
|
1a3fd2f795 | ||
|
|
80fb289fc9 | ||
|
|
5045cdbe60 | ||
|
|
726ba653cf | ||
|
|
1cdc0e4c06 | ||
|
|
8564f5e409 | ||
|
|
a719eb98f1 | ||
|
|
a8da38c431 | ||
|
|
bc3b44acaa | ||
|
|
f5dcab0663 | ||
|
|
dd9fd9f12a | ||
|
|
f91e2693f9 | ||
|
|
7f8d51555b | ||
|
|
c1840e943d | ||
|
|
3b7b2ef6b7 | ||
|
|
eab5ea31ea | ||
|
|
51b1bf34b9 | ||
|
|
b85df20ba2 | ||
|
|
ab641e7320 | ||
|
|
e3decb34cb | ||
|
|
f8e94406df | ||
|
|
77e1b7038b | ||
|
|
6dafb928fe | ||
|
|
34c2bb0f0e | ||
|
|
a00fb1b2cf | ||
|
|
607bbb7e3a | ||
|
|
012d995ab1 | ||
|
|
99defe80a5 | ||
|
|
1a1775bae0 | ||
|
|
c720860ed3 | ||
|
|
64defd4d22 | ||
|
|
054d7cc006 | ||
|
|
c7f5318a41 | ||
|
|
fc38d1ca16 | ||
|
|
9451aae632 | ||
|
|
ae9e955f10 | ||
|
|
f6a889910a | ||
|
|
ae52b2a437 | ||
|
|
d5ebb27e2d | ||
|
|
10972f2666 | ||
|
|
affcc3babd | ||
|
|
4521852297 | ||
|
|
58ed9abf8d | ||
|
|
6684492033 | ||
|
|
26799953c9 | ||
|
|
36ebcf1949 | ||
|
|
8d988e5eae | ||
|
|
e926227b3e | ||
|
|
315136991d | ||
|
|
57bc9c54f3 | ||
|
|
b04c4ea500 | ||
|
|
50e85f57f2 | ||
|
|
d9249dd99a | ||
|
|
870252297a | ||
|
|
07c9bb7d8d | ||
|
|
2172a4478e | ||
|
|
8f0d2f9e4b | ||
|
|
bc7d29d46e | ||
|
|
d06532cb3e | ||
|
|
61933ceaa4 | ||
|
|
7a491db6c1 | ||
|
|
0fae7d3e77 | ||
|
|
0667b39554 | ||
|
|
de7f00d474 | ||
|
|
14f2db1eb2 | ||
|
|
e4ce88e7f1 | ||
|
|
21ab029532 | ||
|
|
543a46659b | ||
|
|
05f2a74ef5 | ||
|
|
4d8e691608 | ||
|
|
40386e1d40 | ||
|
|
a1fb870fe8 | ||
|
|
9d88b14f59 | ||
|
|
f91f2eb173 | ||
|
|
15b720046b | ||
|
|
0502a80dc7 | ||
|
|
17ae285f37 | ||
|
|
4637c09d19 | ||
|
|
8b7930f6c9 | ||
|
|
25b82b5b8c | ||
|
|
2cf8c125a5 | ||
|
|
ff5afa20f2 | ||
|
|
617525a573 | ||
|
|
c4f147ef01 | ||
|
|
14e5cc8357 | ||
|
|
b21ad7ad2d | ||
|
|
8493be9734 | ||
|
|
070645e329 | ||
|
|
0bbbdcb92f | ||
|
|
714db5cb3a | ||
|
|
e0fbdaa15e | ||
|
|
f9778df784 | ||
|
|
a20aebdef2 | ||
|
|
6a3b06e609 | ||
|
|
bb886be82e | ||
|
|
1b587b01ee | ||
|
|
b4851afbb7 | ||
|
|
fea4c4c84e | ||
|
|
5c62197542 | ||
|
|
017f3e5e4f | ||
|
|
7d88519c75 | ||
|
|
a7ec9dab95 | ||
|
|
9a43af3d83 | ||
|
|
b6f543df77 | ||
|
|
61675a7e19 | ||
|
|
1b41d56ad0 | ||
|
|
bc25a31733 | ||
|
|
22eb14c9d5 | ||
|
|
35c5908565 | ||
|
|
8ed773a437 | ||
|
|
efb4aa5b74 | ||
|
|
85e601eabc | ||
|
|
2b9ffb0bdb | ||
|
|
2a67a96d86 | ||
|
|
7ab70f692f | ||
|
|
c6199adc29 | ||
|
|
e314838447 | ||
|
|
bb7314ddac | ||
|
|
ddf5fe3abe | ||
|
|
8fb5a4c7fe | ||
|
|
142db0ae2a | ||
|
|
2954c53d67 | ||
|
|
5475530205 | ||
|
|
a7d22c48b4 | ||
|
|
c6c0954767 | ||
|
|
8f1781cd4e | ||
|
|
0b9cfd7c8e | ||
|
|
1ac8c2a6ce | ||
|
|
3874f848c1 | ||
|
|
d9540f37bf | ||
|
|
f8c8382b1e | ||
|
|
068c5a94b1 | ||
|
|
83979b5f4c | ||
|
|
b08e5b1006 | ||
|
|
f1e5fdcf69 | ||
|
|
0d7b4d633b | ||
|
|
e99511b08c | ||
|
|
e3577222a7 | ||
|
|
abc1ef4ed9 | ||
|
|
9093cde817 | ||
|
|
a8ab51747d | ||
|
|
1876b4683a | ||
|
|
e78741ee4c | ||
|
|
c8da381337 | ||
|
|
f81d0f30de | ||
|
|
45869c37e0 | ||
|
|
ad4fd02247 | ||
|
|
4c60cd5ba4 | ||
|
|
f912d9f38d | ||
|
|
5e1e94efd6 | ||
|
|
37f811de3e | ||
|
|
210ff264b9 | ||
|
|
163e70bdae | ||
|
|
e541b9433b | ||
|
|
bc494d2c7b | ||
|
|
ecefdc6171 | ||
|
|
c11653f438 | ||
|
|
327d58346f | ||
|
|
14f471815d | ||
|
|
8ca4a67a24 | ||
|
|
2d063d279e | ||
|
|
57d9e81c2d | ||
|
|
0e34a7ae28 | ||
|
|
6ff939eb6e | ||
|
|
2574e2e56a | ||
|
|
f47f148f10 | ||
|
|
4e4f6f44e1 | ||
|
|
e186e99789 | ||
|
|
d8d9cc4b0f | ||
|
|
518fcb7cb9 | ||
|
|
aa280f3925 | ||
|
|
756ab2c019 | ||
|
|
83824dbcc3 | ||
|
|
5d0157cf7b | ||
|
|
762d37f1fb | ||
|
|
eac0eff3ba | ||
|
|
3a52326385 | ||
|
|
3fdb6a6f27 | ||
|
|
edcfd4a321 | ||
|
|
5e5730389f | ||
|
|
fa5af19285 | ||
|
|
d361ee2cc0 | ||
|
|
7aadc1ef00 | ||
|
|
932cfc1bd4 | ||
|
|
9b2ca26ce8 | ||
|
|
de969c0b5e | ||
|
|
1752587a4a | ||
|
|
867ed95485 | ||
|
|
331e85fd85 | ||
|
|
211ccf79f4 | ||
|
|
bb6182f4f7 | ||
|
|
1a754844bb | ||
|
|
4ec9827c4e | ||
|
|
1f22c07051 | ||
|
|
4eb26a0bd3 | ||
|
|
ad95610321 | ||
|
|
a9b75e03e2 | ||
|
|
80d5d196c1 | ||
|
|
9d44d6c177 | ||
|
|
527bbcf271 | ||
|
|
9a4037ebf1 | ||
|
|
6aafaaa63c | ||
|
|
8055698df0 | ||
|
|
9d98d884ae | ||
|
|
972620c7cd | ||
|
|
b0506c3737 | ||
|
|
9bd00e5cd2 | ||
|
|
816ce22875 | ||
|
|
899226207d | ||
|
|
2d20abd00e | ||
|
|
e4dbd1fe0d | ||
|
|
d7f924c5e7 | ||
|
|
2c5809c383 | ||
|
|
fad7c5d3ec | ||
|
|
b74fad4bd6 | ||
|
|
dc67e81437 | ||
|
|
29ceeb870d | ||
|
|
52308a0abc | ||
|
|
4d41658e1a | ||
|
|
bb9a2e7445 | ||
|
|
cd57646835 | ||
|
|
7d463ca48d | ||
|
|
b0dbbb3536 | ||
|
|
336e2c3678 | ||
|
|
d9d5a52200 | ||
|
|
1863d60e3a | ||
|
|
6bb9c58de1 | ||
|
|
47e4e31ba0 | ||
|
|
19160e8dfd | ||
|
|
366bf50d3c | ||
|
|
debd7ef5e8 | ||
|
|
77670119a1 | ||
|
|
e7ce6468fc | ||
|
|
f7b4e85525 | ||
|
|
d2decce5e7 | ||
|
|
a1dc24bab1 | ||
|
|
d00e72bc45 | ||
|
|
731656cbed | ||
|
|
857b56c502 | ||
|
|
902e985a53 | ||
|
|
fae5a42f65 | ||
|
|
3ad4bf5ad8 | ||
|
|
54a46fa513 | ||
|
|
decf2571a8 | ||
|
|
5f746a3efa | ||
|
|
a81a0685ef | ||
|
|
2bd2b72af9 | ||
|
|
1a8c578a1c | ||
|
|
d40425c388 | ||
|
|
84ba62ba6b | ||
|
|
a20c49b80f | ||
|
|
497e34b6b8 | ||
|
|
581ab58f70 | ||
|
|
9903bf9ca8 | ||
|
|
af5e3da105 | ||
|
|
b1baf21532 | ||
|
|
99ce8b2d85 | ||
|
|
e215328d81 | ||
|
|
172da48a60 | ||
|
|
9b0e0c6c54 | ||
|
|
2bc40c47eb | ||
|
|
275a2a3782 | ||
|
|
bdaacb6daa | ||
|
|
88ed406e08 | ||
|
|
6fd8101b73 | ||
|
|
bba6dd1670 | ||
|
|
ed39c92de0 | ||
|
|
b24b51b514 | ||
|
|
eeda795db1 | ||
|
|
c7a0cd924e | ||
|
|
399439d338 | ||
|
|
7cf93ae49d | ||
|
|
de99155948 | ||
|
|
b2478b634f | ||
|
|
6de1c41865 | ||
|
|
e4d59476c7 | ||
|
|
56ff625a5c | ||
|
|
dae28629bb | ||
|
|
8ae0b5cc1d | ||
|
|
7350f7826d | ||
|
|
d892cd0ea1 | ||
|
|
1d0a374bd4 | ||
|
|
dde0b00fe5 | ||
|
|
4fd5e0cad1 | ||
|
|
cd6639ccc7 | ||
|
|
e3fa161340 | ||
|
|
12c26a1cc5 | ||
|
|
94b17e2d15 | ||
|
|
81f5124cec | ||
|
|
770c3507ed | ||
|
|
67642b7c20 | ||
|
|
358e3346c3 | ||
|
|
aee58cbd36 | ||
|
|
539fb32795 | ||
|
|
60a01b0f58 | ||
|
|
bb8065ebc9 | ||
|
|
44fd05f1c3 | ||
|
|
8382063736 | ||
|
|
6973f07f30 | ||
|
|
df357ae1de | ||
|
|
3de3009cee | ||
|
|
ce8b816c5d | ||
|
|
4193d2265d | ||
|
|
7b3c10b07d | ||
|
|
edc57cf7a1 | ||
|
|
8cbe55ade1 | ||
|
|
4acd090c54 | ||
|
|
9c9f7e6c0c | ||
|
|
53a65d5bf8 | ||
|
|
82168fcc3b | ||
|
|
065d86f9c5 | ||
|
|
7f74ea8081 | ||
|
|
23ac6cc088 | ||
|
|
3b9b020c5c | ||
|
|
ccbb6e8e15 | ||
|
|
41ff127444 | ||
|
|
18b7dcc2b0 | ||
|
|
6760c39881 | ||
|
|
7e3f885aa4 | ||
|
|
40e67dfce0 | ||
|
|
ac4997e739 | ||
|
|
a3cd52ba05 | ||
|
|
c1a77f233f | ||
|
|
468f578345 | ||
|
|
85702115f3 | ||
|
|
3be86a5778 | ||
|
|
9f98db6791 | ||
|
|
e01ef57d4b | ||
|
|
595d2b060b | ||
|
|
446e260186 | ||
|
|
275aacc237 | ||
|
|
7832b2a4cf | ||
|
|
4ad4480c55 | ||
|
|
01332a48c6 | ||
|
|
d412240200 | ||
|
|
cc3bbcaf4c | ||
|
|
f813ff12d4 | ||
|
|
d157320dfb | ||
|
|
8c35d57144 | ||
|
|
5652f7b7cd | ||
|
|
07a7632a96 | ||
|
|
c79c8aa74d | ||
|
|
70f8f029b1 | ||
|
|
ab7c77b07d | ||
|
|
dbbddf95e2 | ||
|
|
ec6dce9c42 | ||
|
|
6ec980095a | ||
|
|
1a7c397d57 | ||
|
|
ca837d793f | ||
|
|
c08d8df66e | ||
|
|
ce7db48e25 | ||
|
|
ee0fa6ec7d | ||
|
|
802493b7e6 | ||
|
|
2f68b51290 | ||
|
|
6f0d835bdb | ||
|
|
9a89e6cc18 | ||
|
|
dcd44b17b1 | ||
|
|
2dd7218dfa | ||
|
|
b3dee733bb | ||
|
|
bb6acdad3c | ||
|
|
6d5f1817d3 | ||
|
|
12f03e5ac4 | ||
|
|
d3d0304107 | ||
|
|
1027573bd7 | ||
|
|
e958044d00 | ||
|
|
e29fce43b1 | ||
|
|
4cb5649545 | ||
|
|
fcab535c38 | ||
|
|
b50d6e566c | ||
|
|
19a92de3e6 | ||
|
|
72538ed380 | ||
|
|
f0921472a8 | ||
|
|
165b96f30f | ||
|
|
9d4dae947b | ||
|
|
c87c53fbe5 | ||
|
|
4f3c453c12 | ||
|
|
6de30498da | ||
|
|
6f912eded3 | ||
|
|
738c72324b | ||
|
|
ab801f3141 | ||
|
|
4905ab1986 | ||
|
|
c49ad9cac8 | ||
|
|
e410e1862b | ||
|
|
4b2b2bcac3 | ||
|
|
61b169f497 | ||
|
|
ebf002b8d5 | ||
|
|
983e154118 | ||
|
|
15f9713a84 | ||
|
|
d869445950 | ||
|
|
9e7242abe5 | ||
|
|
56cacb9336 | ||
|
|
3e0c6920a9 | ||
|
|
d4c23fba79 | ||
|
|
05339d0d63 | ||
|
|
e44130b51a | ||
|
|
58b36ec1b3 | ||
|
|
79ae37a35c | ||
|
|
6947fd7b64 | ||
|
|
1e351cb59b | ||
|
|
71f735069a | ||
|
|
e7771be157 | ||
|
|
16949246ee | ||
|
|
cdb148df48 | ||
|
|
0ae1ecc05f | ||
|
|
139b34c7af | ||
|
|
27838589a5 | ||
|
|
886e65f83e | ||
|
|
1e519308d3 | ||
|
|
5852c7506f | ||
|
|
f3ed042f0c | ||
|
|
3b28027dce | ||
|
|
badfd68aef | ||
|
|
cf3bb1fd0e | ||
|
|
74bbc24da2 | ||
|
|
a6e19eed31 | ||
|
|
fbc2c75c8a | ||
|
|
5c76167098 | ||
|
|
b188d55bbe | ||
|
|
e222ba21bc | ||
|
|
c5f05b2815 | ||
|
|
51a638e821 | ||
|
|
ccd419500f | ||
|
|
5d855a167a | ||
|
|
b5c565d21b | ||
|
|
9aa1d138a6 | ||
|
|
c08022a088 | ||
|
|
779cdb0dd4 | ||
|
|
27e161cea4 | ||
|
|
b37b0fd9f1 | ||
|
|
0fd531df43 | ||
|
|
b8ca9e2b64 | ||
|
|
0b87b7fab9 | ||
|
|
bdd5d5342b | ||
|
|
3e7eb14a22 | ||
|
|
fa9bfc9794 | ||
|
|
caa86529a9 | ||
|
|
6b93946309 | ||
|
|
af3f33ecb9 | ||
|
|
11bf9c8038 | ||
|
|
8ccb875468 | ||
|
|
760c552584 | ||
|
|
2c0fdba09e | ||
|
|
2905590520 | ||
|
|
d912ddd743 | ||
|
|
567e53c67c | ||
|
|
60a247f271 | ||
|
|
a5f7e65111 | ||
|
|
cc22ef1f20 | ||
|
|
97afbce72e | ||
|
|
47e33ab485 | ||
|
|
2c16005643 | ||
|
|
ee21c5bea6 | ||
|
|
fc2a87c645 | ||
|
|
379df781b2 | ||
|
|
449a5fde76 | ||
|
|
ead4f5d3e1 | ||
|
|
8c69765725 | ||
|
|
0c010ba778 | ||
|
|
32160ff66f | ||
|
|
e7f7030e1b | ||
|
|
5b05c9607c | ||
|
|
036086daa4 | ||
|
|
7ab059a165 | ||
|
|
e3b9e3917a | ||
|
|
58e0b92fe2 | ||
|
|
cf65d791ab |
@@ -1,6 +0,0 @@
|
||||
Makefile Makefile.in
|
||||
aclocal.m4
|
||||
configure config.log config.cache config.guess config.status config.sub
|
||||
libtool ltconfig ltmain.sh
|
||||
.psrc .inslog2 tca.map tca.log
|
||||
*.rpt
|
||||
77
.gitignore
vendored
Normal file
77
.gitignore
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
*.lo
|
||||
*.o
|
||||
*Makefile
|
||||
*Makefile.in
|
||||
.deps/
|
||||
.libs/
|
||||
INSTALL
|
||||
aclocal.m4
|
||||
autom4te.cache*
|
||||
config-paths.h
|
||||
config.guess
|
||||
config.h
|
||||
config.h.in
|
||||
config.h.in~
|
||||
config.log
|
||||
config.status
|
||||
config.sub
|
||||
configure
|
||||
depcomp
|
||||
install-sh
|
||||
libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
mkinstalldirs
|
||||
stamp-h1
|
||||
contrib/WindowMaker.spec
|
||||
m4/
|
||||
src/wconfig.h
|
||||
src/wmaker
|
||||
test/wtest
|
||||
util/convertfonts
|
||||
util/geticonset
|
||||
util/getstyle
|
||||
util/seticons
|
||||
util/setstyle
|
||||
util/wdread
|
||||
util/wdwrite
|
||||
util/wmagnify
|
||||
util/wmaker.inst
|
||||
util/wmgenmenu
|
||||
util/wmmenugen
|
||||
util/wmsetbg
|
||||
util/wmsetup
|
||||
util/wxcopy
|
||||
util/wxpaste
|
||||
wrlib/get-wraster-flags
|
||||
wrlib/libwraster.la
|
||||
wrlib/tests/testdraw
|
||||
wrlib/tests/testgrad
|
||||
wrlib/tests/testrot
|
||||
wrlib/tests/view
|
||||
wrlib/wrlib.pc
|
||||
WINGs/Examples/colorpick
|
||||
WINGs/Examples/connect
|
||||
WINGs/Examples/fontl
|
||||
WINGs/Examples/puzzle
|
||||
WINGs/Examples/server
|
||||
WINGs/Extras/libExtraWINGs.a
|
||||
WINGs/Extras/libExtraWINGs.la
|
||||
WINGs/Extras/test
|
||||
WINGs/Tests/testmywidget
|
||||
WINGs/Tests/wmfile
|
||||
WINGs/Tests/wmquery
|
||||
WINGs/Tests/wtest
|
||||
WINGs/WINGs.pc
|
||||
WINGs/get-wings-flags
|
||||
WINGs/get-wutil-flags
|
||||
WINGs/libWINGs.a
|
||||
WINGs/libWINGs.la
|
||||
WINGs/libWUtil.a
|
||||
WINGs/libWUtil.la
|
||||
WPrefs.app/WPrefs
|
||||
WindowMaker/Defaults/WMRootMenu
|
||||
WindowMaker/Defaults/WMState
|
||||
WindowMaker/Defaults/WMWindowAttributes
|
||||
WindowMaker/Defaults/WindowMaker
|
||||
WindowMaker/IconSets/Default.iconset
|
||||
14
AUTHORS
14
AUTHORS
@@ -68,6 +68,9 @@ Various bugfixes
|
||||
Ullrich Hafner <hafner@bigfoot.de>
|
||||
Better detection of gfx libraries, added IconTitleColor/IconTitleBack
|
||||
|
||||
Matthew Hawkins <matt@mh.dropbear.id.au>
|
||||
former temporary project maintainer
|
||||
|
||||
Greg Hayes <sdc@choice.net>
|
||||
Twisted miniaturization animation
|
||||
|
||||
@@ -102,11 +105,14 @@ EMACS/keypad like cursor movement for WINGs textfield
|
||||
Jim Knoble <jmknoble@pobox.com>
|
||||
made autoarrange icons a runtime option, SHADOW_RESIZEBAR c-time option,
|
||||
no workspace switch to the same workspace, dashed icon selection,
|
||||
misclellaneous bug fixes, definable cursors..
|
||||
misclellaneous bug fixes, definable cursors, --no-polling command line option.
|
||||
|
||||
Alfredo K. Kojima <kojima@windowmaker.org>
|
||||
The JED Text Editor <xjed@windowmaker.info>
|
||||
Project maintainer
|
||||
|
||||
Alfredo K. Kojima <kojima@windowmaker.info>
|
||||
The guy who types random keys to feed JED with the necessary entropy
|
||||
|
||||
Jay Kominek <jkominek@xtn.net>
|
||||
smart and random placement
|
||||
|
||||
@@ -143,7 +149,7 @@ Fix for unassociated alpha tiff
|
||||
Craig Nellist <crn@ozemail.com.au>
|
||||
selection in textfield
|
||||
|
||||
Dan Pascu <dan@windowmaker.org>
|
||||
Dan Pascu <dan@windowmaker.info>
|
||||
dock ghost (superfluous mode) fix, enhancement for scrollable menus,
|
||||
clip, numerous other stuff, project maintainer
|
||||
|
||||
@@ -211,7 +217,7 @@ FRBall <frb@umr.edu>
|
||||
dgradient fix
|
||||
|
||||
|
||||
"]d" <id@maliwan.org>
|
||||
"]d" <id@windowmaker.info>
|
||||
Window list menu miniaturized/hidden hints, XDE support, XKB lock
|
||||
language status, WINGs enhancements, bug fixes, window commands menu
|
||||
enhancement, window move/resize by keyboard. GNUstepGlow.tiff icon,
|
||||
|
||||
9
BUGFORM
9
BUGFORM
@@ -4,11 +4,11 @@
|
||||
|
||||
|
||||
If you find a bug please fill this form and send it to
|
||||
developers@windowmaker.org Please, USE THIS FORM!!!
|
||||
wmaker-dev@lists.windowmaker.org Please, USE THIS FORM!!!
|
||||
|
||||
You can also report a bug in the WWW bug tracker at
|
||||
http://windowmaker.org/cgi-bin/bugs or by sending this report
|
||||
to bugs@windowmaker.org
|
||||
http://bugs.windowmaker.org/projects/wmaker/issues or by sending this report to
|
||||
bugs@windowmaker.org
|
||||
|
||||
|
||||
0. Before reporting this bug I already:
|
||||
@@ -35,9 +35,6 @@ to bugs@windowmaker.org
|
||||
[ ] --enable-kanji
|
||||
[ ] --disable-shape
|
||||
[ ] --enable-single-icon
|
||||
[ ] --enable-kde
|
||||
[ ] --enable-gnome
|
||||
[ ] --enable-openlook
|
||||
[ ] --enable-modelock
|
||||
[ ] Others: .......................
|
||||
|
||||
|
||||
8
BUGS
8
BUGS
@@ -1,8 +1,12 @@
|
||||
Newly added
|
||||
- after a crash, wmaker will forget the hidden state of the apps and just
|
||||
show their windows minimized. normal restart is unaffected
|
||||
- after a crash, wmaker will completely mess the window's saved geometries
|
||||
and maximizing will have weird results. restart is unaffected
|
||||
|
||||
- wmaker will not stop managing a screen even if another window manager
|
||||
requests that, through the ICCCM 2.0 manager selection stuff
|
||||
- stacking code is buggy (or XFree is buggy)
|
||||
- after restart focus is losed or switched to another window. May be related
|
||||
to the one above.
|
||||
- save session doesnt work on some platforms (Alpha and Sparc)
|
||||
- texture pixmaps are being incorrectly freed somewhere. Either
|
||||
fix bug (to support broken MetroX servers) or remove all useless references
|
||||
|
||||
31
COPYING
31
COPYING
@@ -1,9 +1,8 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
@@ -16,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
@@ -56,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
@@ -111,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
@@ -169,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
@@ -226,7 +225,7 @@ impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
@@ -279,8 +278,8 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
Appendix: How to Apply These Terms to Your New Programs
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
@@ -292,7 +291,7 @@ convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@@ -304,16 +303,16 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
|
||||
91
COPYING.OPL
91
COPYING.OPL
@@ -1,91 +0,0 @@
|
||||
|
||||
OpenContent License (OPL)
|
||||
Version 1.0, July 14, 1998.
|
||||
|
||||
This document outlines the principles underlying the OpenContent
|
||||
(OC) movement and may be redistributed provided it remains
|
||||
unaltered. For legal purposes, this document is the license under
|
||||
which OpenContent is made available for use.
|
||||
|
||||
The original version of this document may be found at
|
||||
http://www.opencontent.org/opl.shtml
|
||||
|
||||
LICENSE
|
||||
|
||||
Terms and Conditions for Copying, Distributing, and Modifying
|
||||
|
||||
Items other than copying, distributing, and modifying the Content
|
||||
with which this license was distributed (such as using, etc.) are
|
||||
outside the scope of this license.
|
||||
|
||||
1. You may copy and distribute exact replicas of the OpenContent
|
||||
(OC) as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any
|
||||
warranty; and give any other recipients of the OC a copy of this
|
||||
License along with the OC. You may at your option charge a fee for
|
||||
the media and/or handling involved in creating a unique copy of the
|
||||
OC for use offline, you may at your option offer instructional
|
||||
support for the OC in exchange for a fee, or you may at your option
|
||||
offer warranty in exchange for a fee. You may not charge a fee for
|
||||
the OC itself. You may not charge a fee for the sole service of
|
||||
providing access to and/or use of the OC via a network (e.g. the
|
||||
Internet), whether it be via the world wide web, FTP, or any other
|
||||
method.
|
||||
|
||||
2. You may modify your copy or copies of the OpenContent or any
|
||||
portion of it, thus forming works based on the Content, and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified content to carry prominent notices
|
||||
stating that you changed it, the exact nature and content of the
|
||||
changes, and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the OC or any part
|
||||
thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License, unless otherwise permitted
|
||||
under applicable Fair Use law.
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the OC, and
|
||||
can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work
|
||||
based on the OC, the distribution of the whole must be on the terms
|
||||
of this License, whose permissions for other licensees extend to
|
||||
the entire whole, and thus to each and every part regardless of who
|
||||
wrote it. Exceptions are made to this requirement to release
|
||||
modified works free of charge under this license only in compliance
|
||||
with Fair Use law where applicable.
|
||||
|
||||
3. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to copy,
|
||||
distribute or modify the OC. These actions are prohibited by law if
|
||||
you do not accept this License. Therefore, by distributing or
|
||||
translating the OC, or by deriving works herefrom, you indicate
|
||||
your acceptance of this License to do so, and all its terms and
|
||||
conditions for copying, distributing or translating the OC.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
4. BECAUSE THE OPENCONTENT (OC) IS LICENSED FREE OF CHARGE, THERE
|
||||
IS NO WARRANTY FOR THE OC, TO THE EXTENT PERMITTED BY APPLICABLE
|
||||
LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS
|
||||
AND/OR OTHER PARTIES PROVIDE THE OC "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE. THE ENTIRE RISK OF USE OF THE OC IS WITH YOU.
|
||||
SHOULD THE OC PROVE FAULTY, INACCURATE, OR OTHERWISE UNACCEPTABLE
|
||||
YOU ASSUME THE COST OF ALL NECESSARY REPAIR OR CORRECTION.
|
||||
|
||||
5. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
|
||||
MIRROR AND/OR REDISTRIBUTE THE OC AS PERMITTED ABOVE, BE LIABLE TO
|
||||
YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
|
||||
THE OC, EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
@@ -29,7 +29,16 @@ xpm/textr.xpm
|
||||
xpm/tnew.xpm
|
||||
inside Resources/Images.tiff "the little house", "the trash can",
|
||||
"the folder", "the floppies"
|
||||
|
||||
Ear.png
|
||||
Ftp.png
|
||||
ICQ.png
|
||||
Jabber.png
|
||||
Mozilla.png
|
||||
Pen.png
|
||||
Pencil.png
|
||||
Shell.png
|
||||
Speaker.png
|
||||
XChat.png
|
||||
|
||||
do What The Fuck you want to Public License
|
||||
|
||||
|
||||
607
ChangeLog
607
ChangeLog
@@ -1,3 +1,600 @@
|
||||
Changes since version 0.92.0:
|
||||
.............................
|
||||
|
||||
- added check for --with-gnustepdir option to configure to verify that its
|
||||
argument is an absolute path
|
||||
- updated german translations (Torsten Marek <shlomme@gmx.net>)
|
||||
- fixed WPrefs.app to find its icons when not installed under GNUstep paths
|
||||
- fixed gcc-4 compilation issues (Vladimir Nadvornik <nadvornik@suse.cz>)
|
||||
- fixed amd64 compilation issues (Vladimir Nadvornik <nadvornik@suse.cz>)
|
||||
- eliminated gcc-4 compilation warnings
|
||||
- small fix for compilation in a different directory than the source
|
||||
(Balaton Zoltan <balaton@eik.bme.hu>)
|
||||
- fixed some warnings on 64bit platforms (Balaton Zoltan <balaton@eik.bme.hu>)
|
||||
- fixed issue with invisible modal windows from Qt and Gtk applications
|
||||
on 64bit platforms (Max Loparyev <max@city.veganet.ru>)
|
||||
- fixed issue with icon colors on big endian platforms
|
||||
(Max Loparyev <max@city.veganet.ru>)
|
||||
- release colors to avoid issues with the reference count overflowing a
|
||||
small integer and causing unexpected color releases that can crash
|
||||
Window Maker (Martin Frydl <martin.frydl@systinet.com>)
|
||||
- fixed a small memory leak in WINGs/wview.c caused by not releasing the
|
||||
background color of a view (Martin Frydl <martin.frydl@systinet.com>)
|
||||
- updated estonian translation (Ivar Smolin <okul@linux.ee>)
|
||||
- updated the XDND code in WINGs to work with GDK based applications.
|
||||
WINGs based applications should now work with both KDE and GNOME
|
||||
applications (Sylvain Reynal <sreynal@nerim.net>)
|
||||
- better check for the XDND protocol version when interoperating with other
|
||||
applications. As it seems xdnd version 3 (which WINGs supports) and newer
|
||||
are not backward compatible with xdnd version 1 and 2. This is why WINGs
|
||||
applications cannot interoperate with GNUstep applications (which uses
|
||||
xdnd version 2). Xdnd version 4 and 5 are backwards compatible with
|
||||
version 3 though. (Sylvain Reynal <sreynal@nerim.net>)
|
||||
- Improved Info panel layout and fonts.
|
||||
- Fixed missing library paths when linking some binaries on certain
|
||||
platforms with a recent pkg-config (debian unstable/sid for one)
|
||||
- Fixed buggy handling of UTF8 characters in textfields in WINGs.
|
||||
(Stanislav Maslovski <stanislav.maslovski@gmail.com>)
|
||||
- Fixed segfault in WPrefs when some font description is missing from the
|
||||
configuration file (Stanislav Maslovski <stanislav.maslovski@gmail.com>)
|
||||
- Removed WINGs' dependency on rgb.txt (from X11) and issues with locating it
|
||||
on the filesystem for different systems/distributions.
|
||||
- Fixed segfault when unhiding an application in certain conditions (seen
|
||||
with KDE applications with transient windows)
|
||||
|
||||
|
||||
Changes since version 0.91.0:
|
||||
.............................
|
||||
|
||||
- fixed crash with info panel and alt-tabbing
|
||||
- updated Japanese translations (Takeo Hashimoto <HashimotoTakeo@mac.com>)
|
||||
- allow disable of switch panel when SwitchPanelImages=None
|
||||
- added X Input Methods support in WINGs
|
||||
- fixed issues with compiling on Solaris with openwin
|
||||
- reduced minimum required version number for the Xft library to 2.1.0
|
||||
- fixed some compilation issues with gcc-2.9x
|
||||
- removed --with-appsdir option and replaced it with --with-gnustepdir. Also,
|
||||
default installation path (for non GNUstep users) is now $(prefix)/bin
|
||||
- fixed bug with infinite loop in some circumstances in fitText() in WINGs
|
||||
- fixed to allow parallel builds on SMP systems using make -j
|
||||
- updated Italian translation (Marco Colombo <m.colombo@ed.ac.uk>)
|
||||
- applied .AppInfo --> Library path rename patch (Alex Perez <aperez@student.santarosa.edu>)
|
||||
- added code to automatically update the icon paths from the old .AppInfo
|
||||
style to the new Library/WindowMaker style in WMWindowAttributes when
|
||||
Window Maker starts to make transition transparent for users.
|
||||
- fixed issue with window being moved by 1 pixel up and left when the window
|
||||
move was initiated by the client
|
||||
- improved hide/unhide animation for applications with multiple windows
|
||||
(only animate the active window hiding/unhiding, which makes Window Maker
|
||||
faster and more responsive for such applications). This also makes the
|
||||
restart operation much faster.
|
||||
- fixed bug with windows shrinking to very small sizes when Unmaximize was
|
||||
used on them, after they were closed in a maximized state.
|
||||
- fixed bug with restoring maximized state from NetWM atoms.
|
||||
- fixed issue with GNUstep applications losing focus when all their windows
|
||||
are closed and there remains only their menu (Matt Rice <ratmice@yahoo.com>)
|
||||
- try fixed font for the technical drawing font if helvetica-12 is not
|
||||
available to avoid crashing (Timo Juhani Lindfors <timo.lindfors@iki.fi>)
|
||||
- new algorithm for placing miniwindows after unhiding the application they
|
||||
belong to, that works without auto-arranging the icons, while still avoiding
|
||||
multiple icons in the same spot by moving the miniwindows to a new slot if
|
||||
their old slot was occupied in the meantime.
|
||||
- double clicking an appicon will also raise the miniwindows that belong to
|
||||
that application to the front (along with the normal windows).
|
||||
|
||||
|
||||
Changes since version 0.90.0:
|
||||
.............................
|
||||
|
||||
- added _NET_WM_NAME, _NET_WM_ICON_NAME and _NET_WM_ICON to WINGs
|
||||
- new WPrefs icon (thanks to Largo)
|
||||
- replaced VirtualEdgeThickness option, with EnableVirtualDesktop (boolean)
|
||||
- enhanced alt-tab panel, added theming ability
|
||||
- fixed issues with broken crash dialog
|
||||
- removed obsoleted options from wconfig.h
|
||||
- changed animation delay constants to fix issues with 2.6.x linux kernels
|
||||
(patch provided by Eric Piel <Eric.Piel@lifl.fr>)
|
||||
- fixed several broken po files
|
||||
- increased libwraster version number to 3.1.0 (added a RCopyArea function)
|
||||
|
||||
|
||||
Changes since version 0.80.2:
|
||||
.............................
|
||||
|
||||
- Some updates to WINGs WMConnection. See WINGs/ChangeLog for details.
|
||||
- Fixed empty window list menu, if the window list menu was launched through
|
||||
the root menu (sent by "Marc-Christian Petersen" <m.c.p@wolk-project.de>)
|
||||
- Fixed dock's menu mapping position when dock is on the right side.
|
||||
- Map clip's menu so that it never gets out of screen on the left or the right.
|
||||
- Patch to add binary mode on opening files (needed for Windows with Cygwin)
|
||||
(sent by luke <luke@posh.optushome.com.au>)
|
||||
- Updated French translations (Antoine Hulin <antoine@origan.fdn.org>)
|
||||
- Removed Hermes lib dependency in wrlib
|
||||
- Put back asm/MMX code in wrlib
|
||||
- Updated Russian locale files ("Andrew W. Nosenko" <awn@bcs.zp.ua>)
|
||||
- API change in WINGs for WMDraw*String(). Details in WINGs/Changelog
|
||||
- Removed obsoleted acconfig.h and implemented its functionality using
|
||||
AC_DEFINE and AC_DEFINE_UNQUOTED as autoconf 2.5x recommends.
|
||||
This will definitely enforce the need to use autoconf 2.5x
|
||||
- Added Xft2 support to WINGs, for rendering antialiased fonts with
|
||||
transparency. Details in WINGs/ChangeLog.
|
||||
- Fixed problem with long, preset workspace names (Wanderlei Antonio Cavassin
|
||||
<cavassin@conectiva.com.br>)
|
||||
- Added kinput2 bug workaround to stock WMWindowAttributes (Seiichi SATO
|
||||
<sato@cvs-net.co.jp>)
|
||||
- Added Belarusian translation (Ihar Viarheichyk <iverg@mail.ru>)
|
||||
- Fixed wrlib not to load braindead images with 0 sized width or height
|
||||
- Removed double no-position-display when cycling position display types
|
||||
with Shift key while moving windows.
|
||||
- Changed the default position display while moving a window to 'Center'.
|
||||
- Better outline when drawing balloons.
|
||||
- Fixed wrlib to not accept too large images (fixes buffer overflow)
|
||||
- Patched FAQ (David Coe <davidc@debian.org>)
|
||||
- Fixed bug with resizebars appearing out of nothing when reloading configs
|
||||
- Fixed sloppy focus bug (Pawel S. Veselov <Pawel.Veselov@Sun.COM>)
|
||||
- Applied Xinerama patch (after fixes) from (Peter Zijlstra
|
||||
<a.p.zijlstra@chello.nl>)
|
||||
- Added switch to enable/disable antialiased fonts in WPrefs's Expert Settings
|
||||
panel. (Temporary until the Font Settings panel in WPrefs is finished).
|
||||
- Added a check that only %d is used in a font specification in WMGLOBAL and at
|
||||
most once for each font in a fontset (eliminates a possible security exploit)
|
||||
- Added fontpanel callback
|
||||
- Fixed focus handling for windows that set WM_HINTS.take_focus = False.
|
||||
- Fixed a problem in the stacking code which could lead to segmentation faults
|
||||
(Jeff Teunissen <deek@d2dc.net>)
|
||||
- Fixed a crashing bug in the menu code with modal panels involved.
|
||||
- Fixed incorrect focusing of application's windows after an unhide (sometimes
|
||||
the incorrect window got focus instead of the apps's last focused window)
|
||||
- Unshade application's shaded windows when Dbl-MiddleClick-ing its appicon.
|
||||
(this is to be consistent with deminiaturizing application's miniwindows
|
||||
which also happens in this case, since shading is a form of miniaturization)
|
||||
- Fixed bug with tpixmap from previous xinerama patch (reported by g0sh)
|
||||
- Fixed edge resistance and move/resize frame drawing for borderless windows
|
||||
- Fixed wrong display position for the move/resize widgets after xinerama
|
||||
patch (Peter Zijlstra <a.p.zijlstra@chello.nl>)
|
||||
- Fixed bug with cursor locked in drag mode after Alt-dragging a window
|
||||
- Added Catalan translation (Ernest Adrogué <eadrogue@gmx.net>)
|
||||
- Fixed a bug with deminiaturizing windows when the application is hidden and
|
||||
the miniaturized window is selected from the window list menu
|
||||
- Fixed a bug with not showing shaded window frames when the application is
|
||||
hidden and another window belonging to the app is selected in the window
|
||||
list menu
|
||||
- Autoarrange icons after unhiding an application that has miniaturized
|
||||
windows, else they may cover other icons which are now in the positions
|
||||
they have occupied before hiding
|
||||
- Fixed Clip's workspace menu mapping to be consistent with the others
|
||||
- Fixed bug in wmsetbg that caused scale and maxscale to both do maxscale
|
||||
(Alexey Voinov <voins@voins.program.ru>)
|
||||
- Fixed bug with scrolling menus introduced by the xinerama patch.
|
||||
- Fixed bug that could cause SIGSEGV by accessing beyond the end of text in
|
||||
a WINGs textfield widget.
|
||||
- Fixed small memory leak in WINGs' font panel code.
|
||||
- Fixed memory leak in WINGs' file panel code.
|
||||
- Updated Bulgarian translations (Anton Zinoviev <zinoviev@debian.org>)
|
||||
- Fixed a bug in WINGs' hashtable which free'd the wrong memory in the
|
||||
WMResetHashTable() function (possible source of SIGSEGVs)
|
||||
- Fixed 2 syntax errors in plmenu.zh_TW.Big5 (Mike FABIAN <mfabian@suse.de>)
|
||||
- Some .po file fixes (Mike FABIAN <mfabian@suse.de>)
|
||||
- Fixed the problem with the root menu code changing the locale setting as
|
||||
a side effect of loading a localized menu
|
||||
- Fixed e memory leak in the code that reads a localized root menu
|
||||
- Added support for generating pkgconfig files for WINGS, wmlib and wrlib.
|
||||
("Marcelo E. Magallon" <mmagallo@debian.org>)
|
||||
- Support for multiline balloons (Vitaly Ovtchinnikov <ov@rbcmail.ru>)
|
||||
- Improved wsetfont (Mike FABIAN <mfabian@suse.de>)
|
||||
- Updated single-click contrib patch (steve lion <steve.lion@verizon.net>
|
||||
and vlaad)
|
||||
- Updated French translations (Antoine Hulin <antoine@origan.fdn.org>)
|
||||
- Xinerama support for Solaris
|
||||
- Added global menu support (see NEWS)
|
||||
- Fixed sloppy focus bug
|
||||
- Made maximize behave differently with keyboard/mouse for xinerama
|
||||
(Peter Zijlstra <a.p.zijlstra@chello.nl>)
|
||||
- A few leftover xinerama fixes (Peter Zijlstra <a.p.zijlstra@chello.nl>)
|
||||
- Extended the 'strut' to multiple heads
|
||||
(Peter Zijlstra <a.p.zijlstra@chello.nl>)
|
||||
- Icon placement now takes into account the new xinerama extended 'strut'
|
||||
(Peter Zijlstra <a.p.zijlstra@chello.nl>)
|
||||
- Icon arrangement that takes the new extended xinerama 'strut' into account
|
||||
(Peter Zijlstra <a.p.zijlstra@chello.nl>)
|
||||
- Fixed the 'KDE omnipresent' bug.
|
||||
- Fixed bug with focusing a deminiaturized window with sloppy focus mode
|
||||
- Fixed aspect of window list menu (window name was too close to workspace
|
||||
indicator)
|
||||
- Fixed menu panel in WPrefs.app. Explanatory text did not fit into the label
|
||||
- Implemented a better logic to preserve the window's old geometry when
|
||||
maximizing to support succesive maximizations in different directions
|
||||
without the need to do an intermediary un-maximize step (eliminates flicker)
|
||||
- Made keyboard/mouse maximization behavior consinstent relative to each other
|
||||
- Enhanced wmsetbg's man page with description for -b | --back-color
|
||||
(Marcelo E. Magallon <marcelo.magallon@bigfoot.com>)
|
||||
- Do not use the disabled clip color for the clip's workspace navigation arrows
|
||||
when the clip is collapsed (it made them look like disabled)
|
||||
- Fixed bug with incorrect un-escaping if there is a dot in wm_class.
|
||||
- Updated Catalan translations (Ernest Adrogue <eadrogue@gmx.net>)
|
||||
- Updated Spanish translation of WPrefs (Alberto Gimenez <algibe@teleline.es>)
|
||||
- Fixed synchronization problem between hair cursor and mouse cursor in
|
||||
wmagnify with mouse cursor at the screen edge (Jon Diercks <jon@diercks.net>)
|
||||
- Fixed 2 focus switching related bugs (Allan Peramaki <aperamak@cc.hut.fi>)
|
||||
- Fixed a bug that made the crash panel to be shown again and again when the
|
||||
'Restart Window Maker' option was selected, under some circumstances.
|
||||
- Added workaround in global WMWindowAttributes, to avoid creating a second
|
||||
appicon when a KDE3 application opens a config panel.
|
||||
- Updated slovak translation (Jan Tomka <judas@linux.sk>)
|
||||
- Added xdnd v3 support in WINGs (Sylvain Reynal <sreynal@nerim.net>)
|
||||
- Check whether libXft is at least version 2.1.2 else refuse to compile.
|
||||
- Fixed bug in icon chooser dialog that could cause a segmentation fault
|
||||
in some cases (Pascal Hofstee <caelian@gmail.com>)
|
||||
- Fixed crash in asm code in wrlib, with new versions of gcc.
|
||||
- Fixed bug in the x86_PseudoColor_32_to_8() function which incorrectly
|
||||
used the r, g, b fields in the conversion.
|
||||
- Fixed x86 ASM code in wrlib to work on 64 bit architectures.
|
||||
- Fixed the focus flicker seen with some apps (notably gtk2)
|
||||
(Alexey Spiridonov <snarkmaster@gmail.com>)
|
||||
- Fixed all crashing bugs that were generated by wmaker starting with the
|
||||
WMState file missing.
|
||||
- Added NetWM support (a modified version of the patch originaly written
|
||||
by Peter Zijlstra <a.p.zijlstra@chello.nl>)
|
||||
- Applied patch to enhance the Virtual Desktop behaviour, and to integrate
|
||||
it with the NetWM code (Peter Zijlstra <a.p.zijlstra@chello.nl>)
|
||||
- Applied a few xinerama and placement fixes (Peter Zijlstra
|
||||
<a.p.zijlstra@chello.nl>)
|
||||
- Fixed memory leak in dock code.
|
||||
- Fixed and enhanced the text wrapping in WINGs.
|
||||
- Fixed the layout of some elements in WPrefs.app
|
||||
- Added workaround for aplications that don't set the required hints on the
|
||||
client leader window, but they set them on normal windows (observer with
|
||||
KDE 3.3.0 mainly). This will allow these apps to get an appicon again.
|
||||
(they should be fixed still)
|
||||
- Added workaround for applications that do not set a command with
|
||||
XSetCommand(), but instead they set the _NET_WM_PID property. This works
|
||||
with operating systems that offer a /proc interface similar to what linux
|
||||
has. (This also is to fix problems with KDE 3.3.0 apps, but not only them).
|
||||
- Fixed bug with autostart and exit scripts not being executed if user
|
||||
GNUstep path was different from ~/GNUstep (when setting GNUSTEP_USER_ROOT)
|
||||
- Removed legacy OFFIX_DND support code
|
||||
- Fixed the signal handler for crashes (ie, removed it) and made wmaker
|
||||
restarting be made automatically by a monitoring process.
|
||||
- Made NetWM support be enabled by default
|
||||
- Removed old code to store/restore workspace state (now relies on netwm)
|
||||
- Added a (simple) Font Configuration for fontconfig fonts
|
||||
- MacOS X style window switching panel (navigate through windows with Alt-Tab
|
||||
or arrow keys)
|
||||
- Added support for NET_WM_NAME/NET_WM_ICON_NAME
|
||||
- Moved out font name conversion code from getstyle/setstyle/convertfonts and
|
||||
made it support fontsets
|
||||
- Converted all menu and po files to UTF-8
|
||||
- Updated de.po (Thomas Otto <3.1415926535897932384626433832@gmx.net>)
|
||||
- Fixed a crash bug when switching workspaces
|
||||
- Removed obsoleted scripts from util: wsetfont, wmchlocale, wcopy, wpaste
|
||||
|
||||
|
||||
Changes since version 0.80.1:
|
||||
.............................
|
||||
|
||||
- Fixed a buffer overflow when allocating a RImage struct.
|
||||
|
||||
|
||||
Changes since version 0.80.0:
|
||||
.............................
|
||||
|
||||
- Fixed a bug that crashed wmaker when closing a window if multiple screens
|
||||
were managed by wmaker (Valery Kotchiev <aggregator@nospam.dk>)
|
||||
- Fixed a problem that crashed wmaker when trying to read an unexisting
|
||||
WMState.<number> file on multihead system.
|
||||
- Fixed problem with keyboard shortcuts executed an every screen for
|
||||
multihead systems.
|
||||
- Updated traditional chinese translations
|
||||
- Fixed buglet in non-caching rootmenu option
|
||||
("John H. Robinson, IV" <jhriv@ucsd.edu>)
|
||||
- Added Malay translation
|
||||
- Fixed problem with kcalc not having a miniaturize button.
|
||||
- Added "Hide Others" to the window menu.
|
||||
- Fixed text in info panel for multibyte (Seiichi SATO <ssato@sh.rim.or.jp>)
|
||||
- Separated the font caches for normal fonts and fontsets in WINGs (they can
|
||||
have the same names and collide in the cache giving unwanted results)
|
||||
- Fixed Legal Panel not to display rectangles in place of new lines.
|
||||
- Fixed problem with losing focus when changing to an empty workspace and back.
|
||||
- Fixed another focus related problem when changing workspaces.
|
||||
- Fixed problem with saving session when shared appicon is enabled (not
|
||||
all instances were saved in the session, only one per shared appicon)
|
||||
- Added support for the ukrainian language in wsetfont
|
||||
(Bohdan Vlasyuk <bohdan@bodq.vstu.vinnica.ua>)
|
||||
- Fixed a bug that crashed Window Maker when setting the "Emulate AppIcon"
|
||||
option for a window using the window Inspector.
|
||||
- Let XRender transparent window be see-through to desktop
|
||||
- Added Greek (el) language pixmap (Michalis Kabrianis <Michalis@bigfoot.com>)
|
||||
- Fixes icons being reduced twice when icon size != 64x64
|
||||
Eduardo Pereira Habkost <ehabkost@conectiva.com.br>
|
||||
- Fixed a bug that crashed wmaker when selecting the "Start alternate window
|
||||
manager" option in the crashing dialog panel.
|
||||
- Window Maker will now use the WINDOWMAKER_ALT_WM environment variable (if
|
||||
it is defined) to overwrite the default hardcoded fallback window manager.
|
||||
- Fixed marks for menu entries to be grayed as the text for disabled entries.
|
||||
- Fixed Clip's "Autoraise" option to be marked as disabled when the
|
||||
"Keep on Top" option is active.
|
||||
- Added ability to browse for files/directories in the WPrefs menu editor.
|
||||
- Added Czech translations of documentation (Jiri Hnidek <Jiri.Hnidek@vslib.cz>)
|
||||
- Fixed segfault with incomplete WM_CLASS specifications.
|
||||
- Fixed a bug about arranging subviews in a WMBox after removing a subview
|
||||
and a memleak occuring in the same situation.
|
||||
- Fixed a bug in wdread
|
||||
- Fixed bug with windows that have WM_HINTS.take_focus = False. These windows
|
||||
will not receive focus at all.
|
||||
- Fixed a buffer overflow in winmenu.c
|
||||
|
||||
|
||||
Changes since version 0.70.0:
|
||||
.............................
|
||||
|
||||
- Disabled window birth animation by default (while it was ok with normal
|
||||
windows, it was very annoying with menus editing in WPrefs.app)
|
||||
- Added ability to shade/unshade a window using the mouse wheel.
|
||||
- Fixed compilation for systems that required -lintl for WINGs
|
||||
(Jim Knoble <jmknoble@pobox.com>)
|
||||
- Removed redundant include/lib paths from the get-*-flags scripts
|
||||
- Updated slovak .po files (Jan Tomka <judas@linux.sk>)
|
||||
- Added "Save workspace state" switch button on the exit confirmation panel
|
||||
(based on a patch sent by Jan Tomka <judas@linux.sk>)
|
||||
- Fixed WPrefs crash when clicking on the menu editor to keep the current menu
|
||||
(Alexey Voinov <voins@voins.program.ru>)
|
||||
- Added patch to fix some gnome issues (Les Schaffer <schaffer@optonline.net>)
|
||||
- SIGTERM is now handled and saves the internal state before exiting (like
|
||||
SIGHUP and SIGINT already do). Now a "kill wmaker_pid" will exit cleanly
|
||||
saving dock/clip/session information on exit.
|
||||
- Added an internal strcasecmp() to WINGs (only on systems where's not present)
|
||||
- Deminiaturizing a window that is also shaded, will perform an unshade too.
|
||||
(Note that this only applies to deminiaturizing shaded windows. Unhiding
|
||||
an application will keep the shaded/unshaded state of windows.)
|
||||
- Removed compile time option for definable cursors and made them available by
|
||||
default.
|
||||
- Mapping a new window that belongs to a running application that is hidden,
|
||||
will unhide the application.
|
||||
- Added || pipe menu for generating non-cached menus
|
||||
- Removed the collapse appicons thing.
|
||||
- Added real appicon sharing (apps of the same kind will have a single shared
|
||||
appicon).
|
||||
- Fixed user and global defaults domain merging to preserve values present in
|
||||
global but not in user, in sub-dictionaries.
|
||||
- Made dock/clip steal appicons of applications that were started from a
|
||||
shell/xterm or from the main menu, if there is a docked appicon of that
|
||||
class that is not running at the time the app is launched.
|
||||
- Added animation to show that the appicon was stolen by the dock (the way
|
||||
NEXTSTEP did - map an appicon as it normally would have been, then slide it
|
||||
to the position the docked appicon is).
|
||||
- Updated the animation constants for scrolling/sliding/shading to better
|
||||
adapt to newer/faster machines. Also used wusleep(10) when the delay was 0
|
||||
to get rid of the jerky animation when there was no delay.
|
||||
- Fixed bug with Unhide mapping windows from other workspaces.
|
||||
- keyboard shortcuts are active during mouse window drag
|
||||
- Saving a domain file will first strip all entries that are also present in
|
||||
the global domain as well and are exactly the same. This fixes a bug where
|
||||
settings from the global domain file were merged in the user domain file
|
||||
and further changes in the global domain file for those merged values was
|
||||
ignored making a system admin unable to set global defaults for all users
|
||||
using the global domains.
|
||||
- Fixed bug with improper setting of root/titlebar cursor (definable cursors).
|
||||
|
||||
Changes since version 0.65.1:
|
||||
.............................
|
||||
|
||||
- fixed crash when saving empty menu item in WPrefs
|
||||
- Fixed some more bash specific constructs in wsetfont.
|
||||
(Marcelo E. Magallon <marcelo.magallon@bigfoot.com>)
|
||||
- fixed crash with broken apps that set null WM_CLASS
|
||||
- fixed crash when with gnome panel and multi-screens, some menu
|
||||
updates and applied various other patches from
|
||||
(Crutcher Dunnavant <crutcher@redhat.com>)
|
||||
- po file fixes (Crutcher Dunnavant <crutcher@redhat.com>)
|
||||
- replaced I18N_MB with I18N in one place in src/wconfig.h.in
|
||||
- fixed default clip title font in WindowMaker.in
|
||||
- fixed some locale related problems (Yukihiro Nakai <ynakai@redhat.com>)
|
||||
- fixed a bug in RCombineAreaWithOpaqueness() (Brad <lists@anomie.yi.org>)
|
||||
- added spanish INSTALL file (Efrain Maximiliano Palermo <max_drake2001@yahoo.com.ar>)
|
||||
- updated Finnish pots (Tomi Kajala <tomi@iki.fi>)
|
||||
- copy/paste launching in Dock
|
||||
- fixed switch to wrong workspace bug (Masashi Shimbo <shimbo@cis.ibaraki.ac.jp>)
|
||||
- added snprintf and removed XConvertCase usage for portability
|
||||
- added wcopy/wpaste scripts from (<luke@research.canon.com.au>)
|
||||
- added Xinerama support: see details in NEWS
|
||||
- fixed artifact pattern left in TrueColor dithering code (visible with
|
||||
tiled gradients)
|
||||
- fixed bug in positioning of window list menu when opened by kbd
|
||||
- internal code clean-up with notifications for window state change and other
|
||||
stuff
|
||||
- removed the libPropList dependancy by adding property list handling
|
||||
code to WINGs. This code is not only better integrated with the other
|
||||
WINGs data structures, but it's also more robust. Also a backward
|
||||
compatibility header file is provided which maps old libPropList
|
||||
function names to the new WINGs based proplist names allowing old code
|
||||
to be linked to WINGs with minimal changes. For details on how to use
|
||||
the compat mode, read the comments on top of WINGs/WINGs/proplist-compat.h
|
||||
More details about this can be found in WINGs/ChangeLog and WINGs/NEWS.
|
||||
Say bye, bye libPropList =)
|
||||
- rewrote all Window Maker code to use the new WINGs based proplist functions.
|
||||
- fixed a few compilation warnings and a problem caused by an uninitialized
|
||||
variable.
|
||||
|
||||
|
||||
Changes since version 0.65.0:
|
||||
.............................
|
||||
|
||||
- removed FocusFollowMouse from wmaker and WPrefs
|
||||
- fixed problem with alpha images showing a blue tint on big endian machines
|
||||
- fixed problem with WINGs based apps exiting with a "X_RotateProperties"
|
||||
related error when text was selected in a textfiled (including WPrefs.app
|
||||
and Window Maker itself).
|
||||
- fixed bug with maximization of windows with fixed resize increments
|
||||
- added None geometry display type
|
||||
- fixed window enumeration bug
|
||||
- removed GNUisms from wsetfont (Marcelo E. Magallon <marcelo.magallon@bigfoot.com>, Masahide -mac- NODA <mac@clave.gr.jp>)
|
||||
- added slovakian translations from (tomka@oalevice.sk)
|
||||
- added WINGs i18n patch from tomka@oalevice.sk
|
||||
- fixed wmsetbg.c to work in servers capable of multiple depths (overlay)
|
||||
- added HMaximizeKey (Ruda Moura <ruda@conectiva.com.br>)
|
||||
- fixed bad SIGPIPE handling setup across forks (Philippe Troin <phil@fifi.org>)
|
||||
- added workaround for bug in locale handling on font set creation (Seiichi SATO <sato@cvs-net.co.jp>)
|
||||
- Fixed some non-portable shell constructs used in installed scripts
|
||||
(Johnny C. Lam <lamj@stat.cmu.edu>)
|
||||
- Fixed crash with long titles in the window list menu (buffer overflow)
|
||||
(Alban Hertroys <dalroi@wit401310.student.utwente.nl>, reported by
|
||||
Robert Marshall <robert@chezmarshall.freeserve.co.uk>)
|
||||
- Replaced almost all sprintf() calls with snprintf()
|
||||
- fixed crash when removing menu entry for Window List or Workspace submenu
|
||||
- added WINDOW_BIRTH_ZOOM2 (Éric Tremblay <delt@razorback.yi.org>)
|
||||
|
||||
Changes since version 0.64.0:
|
||||
.............................
|
||||
- fix with gnome hints stuff, related to tasklist/bar
|
||||
- ripped off single appicon stuff
|
||||
- added better appicon handling of apps of the same type
|
||||
- applied patch for wkdemenu (Malcolm Cowe <malk@bruhaha.co.uk>)
|
||||
- added WINDOWS_MENU submenu type for root menu (Bastien Nocera <hadess@hadess.net>)
|
||||
- added kbd shortcuts for icon chooser
|
||||
- use Hermes in wrlib
|
||||
- removed MOUSE_WS_WHEEL #defines
|
||||
- fixed bug with multibyte text on libc5 systems (Osamu Ajiki <osam-a@astroarts.co.jp>)
|
||||
- fixed race conditions on signal handlers
|
||||
- SIGINT will gently exit, SIGTERM will not be handled
|
||||
- When Window Maker calls wmsetbg to set the background, it will consider the
|
||||
value of the DisableDithering option and pass the right switch to wmsetbg.
|
||||
- fixed a memleak in the dialog panels.
|
||||
- made "Keep on Top" in the dock/clip menu a checked menu entry. It's _much_
|
||||
easier to work with it this way.
|
||||
- Fixed problem with GNOME apps that have windows which need to stay on the
|
||||
desktop level.
|
||||
- Fixed incorrect parsing of display and screen number from $DISPLAY.
|
||||
- Organized the inspector panel a bit better.
|
||||
- Replaced bags with arrays wherever appropriate. This will improve
|
||||
performance a bit.
|
||||
- Made the Gnome tasklist skip the windows with the "Skip window list" flag
|
||||
enabled. (Bastien Nocera <hadess@hadess.net>)
|
||||
- Fixed crashing bug when name and class were empty for a docked app.
|
||||
- Removed MIN() and MAX() macros and replaced them with WMIN() and WMAX() from
|
||||
WINGs.
|
||||
- Added a hint that Window Maker crashed, to allow windows to be placed
|
||||
correctly after a crash situation.
|
||||
- Added a hint that Window Maker crashed, to allow windows to be placed
|
||||
in their correct previous positions after a crash situation and also to
|
||||
preserve their state before the crash (minimized, shaded, hidden, ...)
|
||||
- Fixed wrong mapping position of the "Docked Applications Panel" for some
|
||||
icons.
|
||||
- Smoother animation for the smiley =)
|
||||
- Added retain/release mechanism for RImages. RDestroyImage() has become
|
||||
obsolete. More about this can be found in wrlib/Changelog and wrlib/NEWS.
|
||||
- Small API change in WINGs to allow images with alpha blending set as the
|
||||
application icons be shown correctly. More about this in WINGs/Changelog
|
||||
and WINGs/NEWS.
|
||||
- Made images with alpha blending be shown correctly in the panels and the
|
||||
icon chooser.
|
||||
- The icon image set to be shown in panels ("Logo.WMPanel") will be
|
||||
automatically updated if its entry in WMWindowAttributes changes (without
|
||||
a need to restart as until now).
|
||||
- Fixed a bug in the icon chooser dialog that made the selected icon look
|
||||
wrong if it had alpha blending.
|
||||
- Removed the following 3 options from configuration: SelectWindowsMouseButton,
|
||||
WindowListMouseButton and ApplicationMenuMouseButton.
|
||||
- Added 4 options to the configuration file for binding workspace actions to
|
||||
mouse buttons: MouseLeftButtonAction, MouseMiddleButtonAction,
|
||||
MouseRightButtonAction and MouseWheelAction. They replace the above 3
|
||||
removed options, but use a different semantic. More in NEWS.
|
||||
- client supplied icons that were saved by Window Maker in the directory
|
||||
~/GNUstep/.AppInfo/WindowMaker/ will be recreated if missing when the
|
||||
application starts.
|
||||
- fixed a small memleak when the client supplied icon was extracted and saved.
|
||||
|
||||
|
||||
Changes since version 0.63.1:
|
||||
.............................
|
||||
- fixed messup in get-{wings,wutil,wraster}-flags
|
||||
- fixed #wmdatadir# substitution in wmaker.inst
|
||||
(Seiichi SATO <sato@cvs-net.co.jp>)
|
||||
- Removed spurious focus disabling for GNUstep applications - but retain
|
||||
code that lets GNUstep apps control their window titlebar.
|
||||
(Richard Frith-Macdonald <rfm@gnu.org>)
|
||||
- Fixed broken panels.
|
||||
- Renamed se.po to sv.po
|
||||
- New version of wkdemenu.pl (from Malcolm Cowe <malk@bruhaha.co.uk>)
|
||||
- new updated Slovak translations (Jan Tomka/judas@hell <tomka@oalevice.sk>)
|
||||
- integrated the 'no polling' patch from Jim Knoble <jmknoble@jmknoble.cx>.
|
||||
- new wsetfont script (Anton Zinoviev <zinoviev@debian.org>)
|
||||
- lots of i18n fixes (Jan Tomka/judas@hell <tomka@oalevice.sk>)
|
||||
- window levels changed to match GNUstep <rfm@gnu.org> ... src/GNUstep.h
|
||||
src/WindowMaker.h src/window.c wmlib/WMaker.h WINGs/WINGs/WINGs.h
|
||||
|
||||
|
||||
Changes since version 0.63.0:
|
||||
.............................
|
||||
- fixed compile prob with SGI compiler
|
||||
- decreased nice() value in wmsetbg
|
||||
- applied gnome panel not-covering patch from (Bastien Nocera <hadess@hadess.net>)
|
||||
- added item copy to WPrefs menu editor
|
||||
- added locale selection code for menu in wmaker.inst (Eliphas Levy Theodoro <eliphas@conectiva.com.br>)
|
||||
- fixed bug in built-in xpm support (Alessandro Strada <a.strada@libero.it>)
|
||||
- removed plugin support
|
||||
- fixed a crash bug in WPrefs menu editor
|
||||
- added es and pt potfiles from conectiva/eliphas
|
||||
- added updated galician potfile (Jesus Bravo Alvarez <jba@pobox.com>)
|
||||
- added update hungarian potfiles (HORVATH Szabolcs <horvaths@inf.elte.hu>)
|
||||
- added updated single-click patch from John Morrissey <jwm@horde.net>
|
||||
- added updated danish translations (Birger Langkjer <birger.langkjer@image.dk>)
|
||||
- fixed WindozeCycling config in WPrefs
|
||||
- fixed circulate raise withour WindozeCycling
|
||||
|
||||
|
||||
Changes since version 0.62.1:
|
||||
.............................
|
||||
- added blackbox style igradient (interwoven)
|
||||
- added wmagnify utility
|
||||
- changed behaviour of control/shift double click on titlebar for maximize
|
||||
- updated getstyle to account for extendspace options
|
||||
- fixed weird color bug in jpeg loader
|
||||
(Alban Hertroys <dalroi@wit401310.student.utwente.nl>)
|
||||
- improved and simplified fonts configuration for multibyte languages
|
||||
(Tomohiro KUBOTA <kubota@debian.or.jp>)
|
||||
- cleaned ParseCommand() and renamed to TokenizeString()
|
||||
- rewrote menu editor in WPrefs
|
||||
- added definable workspace border (0..5 pixels). See NEWS.
|
||||
- fixed circulateraise on non-windoze cycling mode
|
||||
- fixed bug in RCombineAreaWithOpaqueness (Tim Malone <tmalone3@uswest.net>)
|
||||
- fixed bug with hangling of WM_COMMAND update in client.c (Andrew M. Langmead <aml@world.std.com>)
|
||||
- fixed bug with incorrect reading of ppm files (Adam Fedor <fedor@gnu.org>)
|
||||
- fixed bug with incorrect window placement using automatic placement, while
|
||||
there were shaded windows on other workspaces
|
||||
- fixed some buffer overflow issues in WINGs
|
||||
- fixed bug with WPrefs.app not selecting the menu appearance options after
|
||||
startup.
|
||||
- replaced free() with wfree() wherever appropriate
|
||||
- fixed some memory leaks generated by wstrappend()
|
||||
- fixed code that was dependant on the order of evaluation in wrlib. This
|
||||
fixed a number of problems, like greyscale jpegs that showed up in red
|
||||
and possibly the problems with pseudocolor displays.
|
||||
- made clicks on unfocused windows be effective on focus follow mouse/sloppy
|
||||
|
||||
|
||||
Changes since version 0.62.0:
|
||||
.............................
|
||||
- made shortcuts available during alt+tab
|
||||
- save lowered state of menus
|
||||
- fixed portability bugs for old X servers
|
||||
- added check for XInternAtoms in configure and replacement code
|
||||
- fixed window cycling with single key shortcut
|
||||
- fixed WPrefs crash on menu editor
|
||||
- install only needed icons for WPrefs.app
|
||||
- updated Finnish translations
|
||||
- fixed user-whining-windoze-cycling bug
|
||||
- added option for f'n windoze cycling..
|
||||
- added --create-stdcmap and made std colormap creation off by default
|
||||
- updated get/setstyle to account for new options
|
||||
- fixed crash on restart bug
|
||||
- made GNOME wm hints take precedence over KDE.. KDE hint will only be read
|
||||
if GNOME hints dont exist
|
||||
- updated kwm hint support (maximize hint)
|
||||
- added memory usage in info panel
|
||||
- fixed sticky hint handling in GNOME
|
||||
- fixed saving of maximized state for restart
|
||||
|
||||
|
||||
Changes since version 0.61.1:
|
||||
.............................
|
||||
|
||||
@@ -233,9 +830,9 @@ Changes since version 0.51.2:
|
||||
- fixed focus problem with unfocusable windows
|
||||
- fixed bug in WPrefs that changed EXIT to SHUTDOWN
|
||||
- fixed menu title messup bug in WPrefs
|
||||
- added a dot to mark hidden applications (compile time) (id@windowmaker.org)
|
||||
- enhancements to the modelock patch (id@windowmaker.org)
|
||||
- show kbd mode for modelock (id@windowmaker.org)
|
||||
- added a dot to mark hidden applications (compile time) (id@windowmaker.info)
|
||||
- enhancements to the modelock patch (id@windowmaker.info)
|
||||
- show kbd mode for modelock (id@windowmaker.info)
|
||||
- enhanced positioning of transient windows
|
||||
- added dynamically loadable texture renderer code
|
||||
from Tobias Gloth <gloth@online.de>
|
||||
@@ -1076,7 +1673,7 @@ Changes since version 0.14.1:
|
||||
They are icons for dock, clip, defaultAppIcon, sound server and for xterm.
|
||||
All the rest needed for apps that can be started from menu, and have entries
|
||||
in WMWindowAttributes, are in WindowMaker-data.tar.gz which can be found on
|
||||
http://windowmaker.org/ or ftp://ftp.windowmaker.org/pub/contrib/icons
|
||||
http://windowmaker.info/ or ftp://ftp.windowmaker.info/pub/contrib/icons
|
||||
- Changed the SlideWindow() function to better adapt to slow machines. Also
|
||||
the animation constants are now run time. They are IconSlideDelay = 0;
|
||||
IconSlideStep = 5; and IconSlideSlowDown = 50; See NEWS for a more in depth
|
||||
@@ -1144,7 +1741,7 @@ Changes since version 0.14.0:
|
||||
or exiting, while an Attribute Editor panel is open.
|
||||
- Put clip.tif, clip.png, clip.xpm, clip2.tif, clip2.xpm, Cone.xpm and
|
||||
Penguin.xpm in WindowMaker-data_tar.gz. These are icons intended for fiend.
|
||||
It can be found on ftp://ftp.windowmaker.org/pub/wmaker/contrib/icons
|
||||
It can be found on ftp://ftp.windowmaker.info/pub/wmaker/contrib/icons
|
||||
|
||||
|
||||
|
||||
|
||||
128
FAQ
128
FAQ
@@ -143,10 +143,9 @@ here for example screenshots.
|
||||
1.2 Where can I get Window Maker?
|
||||
----------------------------------
|
||||
The official site to get new developmental versions from is
|
||||
ftp://ftp.windowmaker.org/pub/beta/srcs/.
|
||||
http://windowmaker.org/pub/source/beta/
|
||||
|
||||
NOTE: Also see http://wm.current.nu/downloads.html for the latest
|
||||
Stable and Development versions.
|
||||
The mercurial repository is available at https://hg.windowmaker.org/wmaker
|
||||
|
||||
The development versions are usually very stable themselves, so if you
|
||||
want to have all the newest features, you can rather safetly go with the
|
||||
@@ -158,23 +157,15 @@ crash.
|
||||
|
||||
1.3 Where are the mailing list archives?
|
||||
----------------------------------------
|
||||
Phillip Smith from Netplex, our wonderful provider of windowmaker.org, has set
|
||||
up some new lists from the domain. Please read the information on the web
|
||||
pages at http://www.windowmaker.org/lists.html for information on how to
|
||||
subscribe, the posting guidelines, and how to access the web archives.
|
||||
|
||||
Many thanks to Ed Orcutt who hosted the original lists from his own machine
|
||||
for many years and Caldera who graciously allowed Ed to continue hosting
|
||||
from them when he moved to his new position with them. Ed provided a very
|
||||
valuable service for many years and we are sad to see him go.
|
||||
Please read the information on the web pages at http://lists.windowmaker.org/
|
||||
for information on how to subscribe, the posting guidelines, and how to access
|
||||
the web archives.
|
||||
|
||||
|
||||
1.4 Where is more documentation on configuring Window Maker?
|
||||
----------------------------------
|
||||
Besides the mailing list archives, there are nice documents in
|
||||
ftp://ftp.windowmaker.org/pub/docs/, at
|
||||
http://wm.current.nu/downloads.html on my download page and at
|
||||
http://wm.current.nu/user-guide/index.htm in the online user-guide.
|
||||
http://windowmaker.org/documentation.php
|
||||
|
||||
|
||||
1.5 What is an appicon?
|
||||
@@ -182,51 +173,33 @@ http://wm.current.nu/user-guide/index.htm in the online user-guide.
|
||||
An appicon is the icon (without the tiny titlebar a minimized application icon
|
||||
has) produced by most applications that initially is in the bottom left corner
|
||||
of the screen while an application is running. For an example, run xterm and
|
||||
notice the icon in the corner. (Make sure that you use xterm and not a
|
||||
default older rxvt because older versions of rxvt do not properly set their
|
||||
window attributes.)
|
||||
notice the icon in the corner.
|
||||
|
||||
|
||||
1.6. How can I get a question added to the FAQ?
|
||||
----------------------------------
|
||||
Right now, the only method is to mail Chris Green <sprout@dok.org> or
|
||||
myself <largo@current.nu> the question or post it on the Window Maker
|
||||
Mailing list, and see if enough people have the same problem.
|
||||
Ask on the mailing list, or send your request to faqs@windowmaker.org
|
||||
|
||||
If you are a developer and would like to be able to edit the official FAQ on
|
||||
Chris's site, let him know at <sprout@dok.org>
|
||||
|
||||
He is currently pondering writing a front end that allows everyone to add
|
||||
entries and only require a moderator approval before being posted.
|
||||
Other avenues are the Window Maker wiki
|
||||
http://bugs.windowmaker.org/projects/wmaker/wiki
|
||||
and the forums
|
||||
http://bugs.windowmaker.org/projects/wmaker/boards
|
||||
|
||||
|
||||
1.7. How do I report bugs?
|
||||
----------------------------------
|
||||
You can look at the BUGFORM file in your tarball of Window Maker.
|
||||
Alternatively, you can use the Window Maker Bugtracker at
|
||||
http://windowmaker.org/cgi-bin/bugs.
|
||||
http://bugs.windowmaker.org/projects/wmaker/issues
|
||||
|
||||
|
||||
1.8. Is there an anomymous cvs server?
|
||||
1.8. Is there a public source code repository?
|
||||
----------------------------------
|
||||
Yes there is. To check out from cvs, first
|
||||
|
||||
export CVSROOT=":pserver:anoncvs@cvs.net-community.com:/gnustep"
|
||||
cvs login
|
||||
|
||||
'anoncvs' is the password.
|
||||
|
||||
Then issue the command. "wm" is the name of the module.
|
||||
|
||||
cvs -z3 checkout -d WindowMaker wm
|
||||
|
||||
|
||||
To update your source tree, cd to the WindowMaker directory and type
|
||||
|
||||
cvs -z3 update
|
||||
|
||||
inside the WindowMaker directory.
|
||||
Yes there is. To check out from mercurial use:
|
||||
hg clone http://hg.windowmaker.org/wmaker wmaker
|
||||
|
||||
To update your source tree, cd to the wmaker directory and type
|
||||
hg pull
|
||||
|
||||
|
||||
|
||||
@@ -234,14 +207,11 @@ inside the WindowMaker directory.
|
||||
Installation:
|
||||
-=-=-=-=-=-=-
|
||||
|
||||
2.1 Where can I get proplist.h?
|
||||
-------------------------------
|
||||
You didn't read the INSTALL file, did you? Please read that now.
|
||||
libPropList is downloaded seperately and you need to install it _before_
|
||||
attempting to configure Window Maker.
|
||||
2.1 Where can I get libPropList/proplist.h?
|
||||
-------------------------------------------
|
||||
starting with Window Maker 0.70.0, libPropList is no longer needed.
|
||||
It was obsoleted by adding property list handling code to the WINGs library.
|
||||
|
||||
You can find a gzipped tar archive of libPropList at
|
||||
ftp://ftp.windowmaker.org/pub/libs/
|
||||
|
||||
|
||||
2.2 Why do no icons show up after installing Window Maker >= 0.15.x
|
||||
@@ -368,8 +338,8 @@ for your convenience.
|
||||
|
||||
|
||||
2.8 Can I use WindowMaker with KDE or GNOME or CDE?
|
||||
----------------------------------
|
||||
Contrary to a lot of people thinks, KDE is NOT a window manager. KDE is
|
||||
---------------------------------------------------
|
||||
Contrary to what a lot of people think, KDE is NOT a window manager. KDE is
|
||||
a suite of various applications that includes a custom window manager (kwm).
|
||||
The same is true for CDE.
|
||||
|
||||
@@ -389,7 +359,7 @@ mouse.
|
||||
|
||||
|
||||
2.9 How do I get Window Maker working with xdm in Redhat 5.[01]?
|
||||
----------------------------------
|
||||
----------------------------------------------------------------
|
||||
After running wmaker.inst and letting it write to .xinitrc,
|
||||
cp .xinitrc .xsession
|
||||
and make sure that /usr/local/bin is in your $PATH for the Xserver. You can
|
||||
@@ -1077,22 +1047,35 @@ to force the modification time into the future.
|
||||
4.16 How can I set dock/clip to use single click to launch
|
||||
applications, instead of double click?
|
||||
----------------------------------
|
||||
You cannot do this. This is because single click is used to select app-icons,
|
||||
or to raise/lower the app-icon or the dock/clip.
|
||||
If this is impelmented then you will be unable to select or raise/lower
|
||||
dock/clip or app-icons, without also launching the application it represents.
|
||||
This question was officially answered as follows:
|
||||
|
||||
So don't ask for this to be implemented, because it will not be. Double
|
||||
click is used for a reason, is not just some weird idea we got in a morning
|
||||
when we wake up too early.
|
||||
You cannot do this. This is because single click is used to select
|
||||
app-icons, or to raise/lower the app-icon or the dock/clip. If
|
||||
this is impelmented then you will be unable to select or
|
||||
raise/lower dock/clip or app-icons, without also launching the
|
||||
application it represents.
|
||||
|
||||
So don't ask for this to be implemented, because it will not
|
||||
be. Double click is used for a reason, is not just some weird idea
|
||||
we got in a morning when we wake up too early.
|
||||
|
||||
Regardless of that, there is now an option in WPrefs, under "Expert
|
||||
User Preferences," which allows you to set "Launch applications and
|
||||
restore windows with a single click." (See the files contrib/README
|
||||
and contrib/single_click.diff in the source package for details.)
|
||||
|
||||
If you set that option, a left button single click will launch or
|
||||
restore, rather than select, the app-icon. You can use other methods
|
||||
(or temporarily turn the option off again) to select app-icons or
|
||||
raise/lower the dock/clip. You can toggle the selected state of any
|
||||
app-icon via its right button menu, and there are auto-raise and
|
||||
keep-on-top options for the dock and clip.
|
||||
|
||||
|
||||
4.18 How do I restore the configuration app to the dock?
|
||||
----------------------------------]
|
||||
You should start it from a terminal using its full path name, which is
|
||||
/usr/local/GNUstep/Apps/WPrefs.app/WPrefs
|
||||
/usr/local/GNUstep/Applications/WPrefs.app/WPrefs
|
||||
by default.
|
||||
|
||||
|
||||
@@ -1182,10 +1165,10 @@ Several Nice applications are available:
|
||||
http://www.geocities.com/SiliconValley/Vista/2471/linux.htm#xapps
|
||||
|
||||
ascd,WMRack,asmixer,asmodem, and others
|
||||
ftp://ftp.windowmaker.org/pub/wmaker/contrib/srcs/apps/
|
||||
ftp://ftp.windowmaker.info/pub/wmaker/contrib/srcs/apps/
|
||||
|
||||
wmavgload, wmmount, and wmload
|
||||
ftp://ftp.windowmaker.org/pub/wmaker/contrib/srcs/utils/
|
||||
ftp://ftp.windowmaker.info/pub/wmaker/contrib/srcs/utils/
|
||||
|
||||
wmppp-wmifs, wmtime, wmmon and other nifty apps
|
||||
http://windowmaker.mezaway.org/
|
||||
@@ -1301,14 +1284,8 @@ in routines/xsci/jpc_SGraph.c
|
||||
5.12 Netscape shows black and white icons
|
||||
----------------------------------
|
||||
|
||||
This is because Netscape uses monochrome icons when running under olwm
|
||||
and you are using the OPEN LOOK emulation option. If you do not use any XView
|
||||
apps anyway, recompile Window Maker without the --enable-openlook option.
|
||||
If you need OPEN LOOK emulation, you will have to get used to the monochrome
|
||||
icons or change then manually in the Attributes panel for each window.
|
||||
I have also seen this happen on some systems if you run Netscape in a high
|
||||
colour depth (32bpp) regardless of whether you're using openlook or not.
|
||||
That is a Netscape bug. Therefore, bug Netscape.
|
||||
I have seen this happen on some systems if you run Netscape in a high
|
||||
colour depth (32bpp). That is a Netscape bug. Therefore, bug Netscape.
|
||||
|
||||
|
||||
5.13 Snow flakes from xsnow don't acumulate on titlebars!
|
||||
@@ -1460,11 +1437,14 @@ the files manually. Or download the whole distribution.
|
||||
|
||||
|
||||
7.5 Will you add GNOME or KDE support?
|
||||
----------------------------------
|
||||
--------------------------------------
|
||||
|
||||
Support for GNOME (and KDE) hints is included since 0.50.0. You have to
|
||||
enable them at compile-time using the appropriate arguments to ./configure.
|
||||
Please read the INSTALL file for more details.
|
||||
Note: starting with version 0.90.0, support for legacy Gnome-1.x and KDE-2.x
|
||||
was dropped in favor of NETWM support (used by both Gnome-2.x and KDE-3.x)
|
||||
|
||||
|
||||
-=-=-=-=-
|
||||
Themes:
|
||||
|
||||
33
FAQ.I18N
33
FAQ.I18N
@@ -32,24 +32,35 @@ If I18N support does not work for you, check these:
|
||||
here:
|
||||
ftp://ftp.linux.or.jp/pub/RPM/glibc
|
||||
|
||||
- if you'd like to display multibyte characters, set the
|
||||
MultiByteText option to YES in ~/GNUstep/Defaults/WindowMaker
|
||||
and ~/GNUstep/Defaults/WMGLOBAL
|
||||
|
||||
- the fonts you're using support your locale. if your font
|
||||
setting on $HOME/GNUstep/Defaults/WindowMaker is like..
|
||||
|
||||
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
|
||||
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
|
||||
WindowTitleFont = "Trebuchet MS:bold:pixelsize=12";
|
||||
MenuTitleFont = "Trebuchet MS:bold:pixelsize=12";
|
||||
......................................................
|
||||
|
||||
then you can't display non iso8859-x charcters by helvetica.
|
||||
so quick way to display various languages' font is to change
|
||||
all the font settings into:
|
||||
then you can't display asian language (ja,ko,ch) characters using
|
||||
Trebuchet MS. A font that is guaranteed to work for any language is
|
||||
sans (or sans-serif). sans is not a font itself, but an alias which
|
||||
points to multiple fonts and will load the first in that list that
|
||||
has the ability to show glyphs in your language. If you don't know
|
||||
a font that is suited for you language you can always set all your
|
||||
fonts to something like:
|
||||
|
||||
"-*-*-medium-r-normal-*-14-*-*-*-*-*-*-*"
|
||||
"sans:pixelsize=12"
|
||||
|
||||
and also you need to change font settings in style files in
|
||||
However, please note that if your font is something like:
|
||||
|
||||
"Trebuchet MS,sans serif:pixelsize=12"
|
||||
|
||||
this will not be able to display asian languages if any of the
|
||||
previous fonts before sans are installed. This is because unlike
|
||||
the proper font pickup that sans guarantees for your language,
|
||||
this construct only allows a font fallback mechanism, which tries
|
||||
all the fonts in the list in order, until it finds one that is
|
||||
available, even if it doesn't support your language.
|
||||
|
||||
Also you need to change font settings in style files in
|
||||
the "$HOME/Library/WindowMaker/Style" directory.
|
||||
|
||||
- the LC_CTYPE environment variable is unset or it has the correct
|
||||
|
||||
@@ -1,45 +1,19 @@
|
||||
|
||||
Installation Instructions for Window Maker
|
||||
|
||||
The latest version of Window Maker (-crm) can be found in the
|
||||
git repository at
|
||||
|
||||
http://repo.or.cz/w/wmaker-crm.git
|
||||
|
||||
|
||||
SUPPORTED PLATFORMS
|
||||
===================
|
||||
(ie: I've heard someone has compiled it on...)
|
||||
|
||||
- Intel GNU/Linux Slackware 3.5 (primary platform)
|
||||
- Intel GNU/Linux other distributions
|
||||
- Sparc GNU/Linux RedHat 5.1
|
||||
- PowerPC GNU/MkLinux
|
||||
- Alpha GNU/Linux RedHat 5.1
|
||||
- FreeBSD
|
||||
- NetBSD
|
||||
- OpenBSD
|
||||
- BSDI 4.0
|
||||
- Solaris 2.5.1, 2.5.2
|
||||
- Solaris 2.6.0
|
||||
- Solaris 2.7beta
|
||||
- SCO Unix
|
||||
- SGI Irix 5.x, 6.5
|
||||
- OSF/1
|
||||
- HP-UX
|
||||
- AIX 3.2.5
|
||||
- AIX 4.1.4 / IBM PowerPC
|
||||
- AIX 4.3.1 / IBM CC compiler
|
||||
- AIX 4.3.2 / IBM PowerPC
|
||||
- AIX 5.3
|
||||
- DEC Alpha/Digital UNIX 4.x
|
||||
- XFree86 / OS/2
|
||||
- Corel NetWinder
|
||||
- SunOS 4.x
|
||||
- PowerMac / Power MachTen 4.1.1 over MacOS
|
||||
- Amiga 3000 running RedHat Linux 5.1 (Rawhide)
|
||||
- Intel GNU/Linux Systems in general
|
||||
|
||||
Patches to make it work on other platforms are welcome.
|
||||
|
||||
If the latest version doesn't work for you, try 0.19.3,
|
||||
which is known to be pretty stable on many platforms.
|
||||
|
||||
|
||||
REQUIREMENTS:
|
||||
=============
|
||||
@@ -56,34 +30,18 @@ The following software is required to use Window Maker:
|
||||
The following is required to build Window Maker:
|
||||
|
||||
- Basic obvious stuff
|
||||
If you will build Window Maker, make sure you have gcc (or some
|
||||
other ANSI C compiler) and the X header files installed. Specially
|
||||
for newbie Linux users: you must install all X development packages
|
||||
and the gcc suite. Otherwise you won't be able to build any X
|
||||
program, including Window Maker.
|
||||
|
||||
- libPropList
|
||||
This library can be found in ftp://ftp.windowmaker.org/pub/libs
|
||||
or in ftp://ftp.gnome.org/pub/libPropList
|
||||
Install it before building Window Maker.
|
||||
gcc (or some other ANSI C compiler)
|
||||
glibc development files (usually glibc-devel in Linux distributions)
|
||||
X development files (XFree86-devel or something similar)
|
||||
|
||||
- autoconf, automake and libtool
|
||||
These tools are NOT needed, but IF you have one or
|
||||
more of them installed, make sure you have ALL of the following
|
||||
with exactly these versions:
|
||||
autoconf 2.13
|
||||
autoconf 2.54
|
||||
automake 1.4
|
||||
libtool 1.3
|
||||
If you have a different version, disable them by temporarily
|
||||
renaming them to something else or uninstalling them from your
|
||||
system. If you don't develop software you don't need them,
|
||||
so you can safely uninstall.
|
||||
libtool 1.4.2
|
||||
|
||||
- lex (or flex) and yacc (or bison)
|
||||
These are used by libPropList. lex is actually not needed since
|
||||
it's output file is included, but either me or automake is stupid,
|
||||
causing the configure script for libPropList to simply abort for no
|
||||
convincent reason if lex is not found.
|
||||
- Xft2
|
||||
and its dependencies (such as freetype2 and fontconfig)
|
||||
You will also need the development files for it (xft2-devel)
|
||||
|
||||
|
||||
OPTIONAL:
|
||||
@@ -128,13 +86,19 @@ might work too.
|
||||
CONFIGURE OPTIONS:
|
||||
==================
|
||||
|
||||
If you downloaded the cvs or git versions, type
|
||||
|
||||
./autogen.sh
|
||||
|
||||
to generate the config files.
|
||||
|
||||
These options can be passed to the configure script to enable/disable
|
||||
some Window Maker features. Example:
|
||||
|
||||
./configure --enable-kde --enable-gnome
|
||||
|
||||
will configure Window Maker with KDE and GNOME supported compiled in.
|
||||
./configure --enable-modelock --disable-gif
|
||||
|
||||
will configure Window Maker with modelock supported and disable gif support.
|
||||
Normally, you won't need any of them.
|
||||
|
||||
To get a list of other options, run ./configure --help
|
||||
|
||||
@@ -148,12 +112,6 @@ To get a list of other options, run ./configure --help
|
||||
The -I flag must precede each paths, like:
|
||||
--with-incs-from="-I/opt/headers -I/usr/local/include"
|
||||
|
||||
--enable-single-icon
|
||||
enables the collapsing of all appicons of the WM_CLASS+WM_INSTANCE
|
||||
into a single one. This feature is not supported at all by the
|
||||
developers. If you have some trouble with it, contact it's author:
|
||||
Christopher Seawood <cls@seawood.org>
|
||||
|
||||
--disable-shm
|
||||
disable use of the MIT shared memory extension. This will slow down
|
||||
texture generation a little bit, but in some cases it seems to be
|
||||
@@ -162,30 +120,10 @@ To get a list of other options, run ./configure --help
|
||||
--disable-motif
|
||||
disable support for mwm window manager hints
|
||||
|
||||
--enable-openlook
|
||||
enable support for OPEN LOOK(tm) window manager hints
|
||||
|
||||
--enable-gnome
|
||||
enable support for GNOME window manager hints
|
||||
|
||||
--enable-kde
|
||||
enable support for kde/kwm window manager hints
|
||||
|
||||
--enable-lite
|
||||
remove things that are already supported in desktop environments,
|
||||
like KDE and GNOME. Disabled things are: window list, root
|
||||
applications menu, multiple window selection. Note that you will not
|
||||
be able to exit Window Maker from itself anymore; you will have to
|
||||
use kill with the SIGTERM signal or exit it from KDE. It is not
|
||||
advisable to enable it.
|
||||
|
||||
--enable-modelock
|
||||
XKB language status lock support. If you don't know what it is you
|
||||
probably don't need it.
|
||||
|
||||
--enable-sound
|
||||
enable support of sound effects module
|
||||
|
||||
--disable-xpm
|
||||
disables use of the XPM library even if it is available on your
|
||||
system.
|
||||
@@ -205,35 +143,10 @@ To get a list of other options, run ./configure --help
|
||||
--disable-shape
|
||||
disables shaped windows (for oclock, xeyes etc.)
|
||||
|
||||
--enable-debug
|
||||
Do not use it unless you know what you're doing.
|
||||
|
||||
|
||||
PLATFORM SPECIFIC NOTES:
|
||||
========================
|
||||
|
||||
- DEC/Alpha machines
|
||||
You might need to pass the --disable-shm flag to configure, like
|
||||
./configure --disable-shm
|
||||
|
||||
- SCO Unix - run configure like
|
||||
CFLAGS="-belf -DANSICPP" ./configure
|
||||
|
||||
- SunOS, Solaris
|
||||
If you have gcc installed, run configure as:
|
||||
CPP_PATH="gcc -E -x c" ./configure
|
||||
Sun's cpp lacks some features needed by Window Maker and it can
|
||||
cause problems when parsing the config files.
|
||||
You also might need to use the --with-libs-from and --with-incs-from
|
||||
to supply the directory where libtiff is located.
|
||||
Someone mailed me that you also must make /usr/local/lib be the
|
||||
first path in LD_LIBRARY_PATH to make it work.
|
||||
|
||||
If you have a Ultra Creator 3D or some other machine with high-end
|
||||
graphics, be sure to start the X server with the default visual
|
||||
set to 24bpp or you might experience problems with mangled colors.
|
||||
This is a wmaker bug and will be fixed.
|
||||
|
||||
- GNU/Linux in general
|
||||
Make sure you have /usr/local/lib in /etc/ld.so.conf and that you
|
||||
run ldconfig after installing.
|
||||
@@ -256,27 +169,6 @@ PLATFORM SPECIFIC NOTES:
|
||||
* make sure you have /usr/local/lib in /etc/ld.so.conf before running
|
||||
ldconfig;
|
||||
|
||||
* if you have problems that mention an error message with --no-reexec
|
||||
uninstall libtool-1.2b and install libtool-1.3 instead. libtool-1.3
|
||||
can be found in ftp.gnu.org Also read the TROUBLESHOOTING section;
|
||||
|
||||
* if you installed the Window Maker package from RedHat and are
|
||||
installing a new version of it by hand (compiling yourself), uninstall
|
||||
the package from RedHat before.
|
||||
|
||||
* make sure you have a symbolic link from /usr/include/X11 to
|
||||
/usr/X11R6/include/X11 (if not, type ln -s /usr/X11R6/include/X11
|
||||
/usr/include/X11 )
|
||||
|
||||
* make sure you have /lib/cpp pointing to the cpp program
|
||||
|
||||
If you have any doubts in doing any of the stuff above, please
|
||||
don't hesitate to contact the RedHat user support. They will
|
||||
kindly answer to all your questions regarding their system.
|
||||
They also know much more about their own system than us
|
||||
(we don't use RedHat).
|
||||
|
||||
|
||||
- PowerPC MkLinux
|
||||
You will need to have the latest version of Xpmac. Older versions
|
||||
seem to have bugs that cause the system to hang.
|
||||
@@ -299,15 +191,6 @@ PLATFORM SPECIFIC NOTES:
|
||||
INSTALLATION:
|
||||
=============
|
||||
|
||||
Unpack WindowMaker-extra-<version-number>.tar.gz in /usr/local/share
|
||||
|
||||
You can get the file at ftp://ftp.windowmaker.org. This file is optional
|
||||
and only have a few icons, and themes. Look for the latest <version-number>
|
||||
available.
|
||||
Also there is a WindowMaker-extra.readme to instruct you where that package
|
||||
should go.
|
||||
|
||||
|
||||
Build Window Maker
|
||||
------------------
|
||||
For a quick start, type the following in your shell prompt:
|
||||
@@ -339,9 +222,9 @@ following.
|
||||
to get a complete listing of other options that are available.
|
||||
|
||||
2. Run configure with the options you want. For example, if you
|
||||
want to use the --enable-kde option, type:
|
||||
want to use the --enable-modelock option, type:
|
||||
|
||||
./configure --enable-kde
|
||||
./configure --enable-modelock
|
||||
|
||||
3. (optional) Edit src/wconfig.h with your favorite text editor
|
||||
and browse through it for some options you might want to change.
|
||||
@@ -382,16 +265,29 @@ Read the User Guide for a more in-depth explanation of Window Maker.
|
||||
You might want to take a look at the FAQ too.
|
||||
|
||||
|
||||
|
||||
Installing the extras package
|
||||
-----------------------------
|
||||
|
||||
Unpack WindowMaker-extra-<version-number>.tar.gz in /usr/local/share
|
||||
|
||||
You can get the file at http://windowmaker.org/pub/source/release/. This file
|
||||
is optional and only have a few icons, and themes. Look for the latest
|
||||
<version-number> available. Also there is a WindowMaker-extra.readme to
|
||||
instruct you where that package should go.
|
||||
|
||||
|
||||
|
||||
I don't have the root password :(
|
||||
---------------------------------
|
||||
|
||||
If you can't get superuser privileges (can't be root) you can install
|
||||
wmaker in your own home directory. For that, supply the --prefix option
|
||||
when running configure in step 2 of building Window Maker. You will
|
||||
also need to supply the --with-appspath option, to specify the path for
|
||||
also need to supply the --with-gnustepdir option, to specify the path for
|
||||
WPrefs.app Example:
|
||||
|
||||
./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Apps
|
||||
./configure --prefix=/home/jshmoe --with-gnustepdir=/home/jshmoe/GNUstep/Applications
|
||||
|
||||
|
||||
Then make /home/jshmoe/bin be included in your search PATH, add
|
||||
@@ -410,8 +306,8 @@ If you are upgrading from an older version of Window Maker:
|
||||
|
||||
1. Configure and build Window Maker as always
|
||||
2. Install Window Maker (but do not run wmaker.inst)
|
||||
3. Read the NEWS file and update your configuration files,
|
||||
if necessary.
|
||||
3. Read the NEWS file and update your configuration files if necessary.
|
||||
|
||||
|
||||
TROUBLESHOOTING
|
||||
===============
|
||||
@@ -431,8 +327,7 @@ ltconfig: unrecognized option `--no-reexec'
|
||||
Try `ltconfig --help' for more information.
|
||||
configure: error: libtool configure failed
|
||||
|
||||
remove the --no-reexec option from aclocal.m4 and libPropList/aclocal.m4
|
||||
and reconfigure
|
||||
remove the --no-reexec option from aclocal.m4 and reconfigure
|
||||
Also make sure the autoconf and automake versions you have installed are:
|
||||
autoconf 2.13
|
||||
automake 1.4
|
||||
@@ -441,12 +336,6 @@ libtool 1.3
|
||||
Note that it must not be libtool 1.2b, it must be libtool 1.3,
|
||||
from the GNU sites.
|
||||
|
||||
== Cant find proplist.h or libPropList.something
|
||||
|
||||
Download and install libPropList from the places pointed to
|
||||
somewhere else in this file.
|
||||
|
||||
|
||||
== configure doesn't detect libtiff, or other graphic libraries.
|
||||
|
||||
Delete config.cache, then rerun configure adding the following options to
|
||||
@@ -480,7 +369,7 @@ If you're not sure, try renaming ~/GNUstep to ~/GNUtmp and then run wmaker.inst
|
||||
== The root menu contains only 2 entries. ("XTerm" and "Exit...")
|
||||
|
||||
* Window Maker is not finding cpp (the C preprocessor). If your cpp is
|
||||
not located in /lib/cpp, edit src/config.h and correct the path in
|
||||
not located in /lib/cpp, edit config.h and correct the path in
|
||||
CPP_PATH.
|
||||
|
||||
== checking lex output file root... configure: error: cannot find output from true; giving up
|
||||
@@ -520,7 +409,7 @@ for other languages.
|
||||
|
||||
2 - Additionally, if your language uses multi-byte characters, such
|
||||
as Japanese or Korean, you must set the MultiByteText option to YES
|
||||
in ~/GNUstep/Defaults/WMGLOBAL and ~/GNUstep/Defaults/WindowMaker
|
||||
in ~/GNUstep/Defaults/WMGLOBAL
|
||||
|
||||
3 - Configure, build and install Window Maker normally.
|
||||
|
||||
@@ -545,32 +434,3 @@ following order (for brazilian portuguese, in this case):
|
||||
menu.pt_BR
|
||||
menu.pt
|
||||
menu
|
||||
|
||||
|
||||
5 - If you chose a language that uses multi-byte characters, you must
|
||||
configure the fonts appropriately. Read the manual page for XCreateFontSet
|
||||
to have more details about it. You must change the ~/G/D/WindowMaker file
|
||||
for fonts used in titlebars, menus and other things. For fonts used in
|
||||
dialog windows, change ~/G/D/WMGLOBAL. The %d in the font names must not be
|
||||
removed. You can also use the supplied wsetfont script for the task.
|
||||
Read the script itself for instructions.
|
||||
|
||||
For example, you can specify the following in ~/G/D/WindowMaker:
|
||||
|
||||
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
|
||||
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
|
||||
MenuTextFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
|
||||
IconTitleFont = "-*-helvetica-medium-r-normal-*-8-*,-*-*-medium-r-normal-*-12-*";
|
||||
ClipTitleFont = "-*-helvetica-bold-r-normal-*-10-*,-*-*-medium-r-normal-*-12-*";
|
||||
DisplayFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-12-*";
|
||||
|
||||
and in ~/G/D/WMGLOBAL:
|
||||
|
||||
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
|
||||
The above 2 fonts are only used by applications that use WINGs (WindowMaker
|
||||
and WPrefs.app)
|
||||
|
||||
The wsetfont script that's supplied will allow you to change the font
|
||||
settings in a easier way. Take a look in the script for details on usage.
|
||||
566
INSTALL.pt
566
INSTALL.pt
@@ -1,566 +0,0 @@
|
||||
Instruções de Instalação do Window Maker
|
||||
|
||||
|
||||
PLATAFORMAS SUPORTADAS
|
||||
======================
|
||||
(obs: fiquei sabendo que conseguiram compilar nesses sistemas...)
|
||||
|
||||
- Intel GNU/Linux Slackware 3.5 (plataforma primária)
|
||||
- outras distribuições do Intel GNU/Linux
|
||||
- Sparc GNU/Linux RedHat 5.1
|
||||
- PowerPC GNU/MkLinux
|
||||
- Alpha GNU/Linux RedHat 5.1
|
||||
- FreeBSD
|
||||
- NetBSD
|
||||
- OpenBSD
|
||||
- BSDI 4.0
|
||||
- Solaris 2.5.1, 2.5.2
|
||||
- Solaris 2.6.0
|
||||
- Solaris 2.7beta
|
||||
- SCO Unix
|
||||
- SGI Irix 5.x, 6.5
|
||||
- OSF/1
|
||||
- HP-UX
|
||||
- AIX 3.2.5
|
||||
- AIX 4.1.4 / IBM PowerPC
|
||||
- AIX 4.3.1 / IBM CC compiler
|
||||
- AIX 4.3.2 / IBM PowerPC
|
||||
- AIX 5.3
|
||||
- DEC Alpha/Digital UNIX 4.x
|
||||
- XFree86 / OS/2
|
||||
- Corel NetWinder
|
||||
- SunOS 4.x
|
||||
- PowerMac / Power MachTen 4.1.1 em MacOS
|
||||
- Amiga 3000 rodando RedHat Linux 5.1 (Rawhide)
|
||||
|
||||
Patches que possibilitem a execução em outras plataformas serão bem-vindos.
|
||||
|
||||
Se a última versão não funcionou para você, tente a 0.53.0,
|
||||
que é conhecida por ser bastante estável em várias plataformas.
|
||||
|
||||
|
||||
REQUERIMENTOS
|
||||
=============
|
||||
|
||||
Os softwares a seguir são necessários para o uso do Window Maker:
|
||||
|
||||
- X11R6.x
|
||||
O Window Maker pode ser compilado em versões mais antigas do X, como X11R5
|
||||
(Solaris) ou X11R4 (OpenWindows) mas não funcionará 100% corretamente. Em
|
||||
tais servidores não existirão ícones de aplicações e você terá problemas
|
||||
usando o dock. Fazer upgrades das bibliotecas (Xlib Xt etc) ajudará se você
|
||||
não pode fazer upgrade do servidor.
|
||||
|
||||
Para compilar o Window Maker você precisará do seguinte:
|
||||
|
||||
- Requerimentos básicos e óbvios
|
||||
Se você vai compilar o Window Maker, tenha certeza de que você possui o gcc
|
||||
(ou outro compilador ANSI) e os arquivos headers do X. Especialmente para
|
||||
os iniciantes em Linux: você deve instalar todos os pacotes de desenvolvimento
|
||||
do X e a suite gcc. Do contrário você não será capaz de compilar nenhum
|
||||
programa X, incluindo o Window Maker.
|
||||
|
||||
- libPropList
|
||||
Você pode achar esta biblioteca em ftp://ftp.windowmaker.org/pub/libs ou
|
||||
ftp://ftp.gnome.org/pub/libPropList. Você deve instalar corretamente
|
||||
esta biblioteca antes de instalar o Window Maker.
|
||||
|
||||
- autoconf, automake and libtool
|
||||
Estes pacotes não são necessários, mas se você tiver um ou mais deles instalados,
|
||||
verifique se todos eles são das seguintes versões:
|
||||
autoconf 2.13
|
||||
automake 1.4
|
||||
libtool 1.3
|
||||
Se você possui uma versão diferente, desative-os mudando os nomes dos arquivos
|
||||
para outra coisa ou removendo-os do seu sistema. Se você não desenvolve
|
||||
software você não precisa deles, logo, você pode desinstalá-los com segurança.
|
||||
|
||||
- lex (ou flex) e yacc (ou bison)
|
||||
São usados pelo libPropList. O lex não seria necessário, já que o seu
|
||||
arquivo de saída é incluído, mas como ou eu ou o automake é um pouco
|
||||
burro, o script de configuração para o libPropList simplesmente
|
||||
abortará sem motivo caso o lex não seja achado.
|
||||
|
||||
|
||||
OPCIONAL:
|
||||
=========
|
||||
Estas bibliotecas não são necessárias para que o Window Maker funcione, mas elas
|
||||
são suportadas caso você deseje usá-las. Os números das versões são os que eu
|
||||
possuo (e portanto quase certamente funcionarão), mas outras versões devem funcionar
|
||||
também.
|
||||
|
||||
|
||||
- libXPM 4.7 ou mais atual
|
||||
Versões antigas podem não funcionar.
|
||||
Disponível em ftp://sunsite.unc.edu/pub/Linux/libs/X/
|
||||
Há suporte nativo para arquivos XPM, mas ele não carregará imagens em
|
||||
algumas formatos incomuns.
|
||||
|
||||
- libpng 0.96 ou mais atual e zlib
|
||||
Para suporte a imagens PNG.
|
||||
|
||||
- libtiff 3.4 ou mais atual
|
||||
Para suporte a imagens TIFF. Você pode baixar o libtiff em
|
||||
ftp://ftp.sgi.com/graphics/tiff.
|
||||
|
||||
- libjpeg 6.0.1 ou mais atual
|
||||
Para suporte a imagens JPEG.
|
||||
|
||||
- libgif 2.2 ou libungif
|
||||
Para suporte a imagens tipo GIF.
|
||||
|
||||
- GNU xgettext
|
||||
Se você deseja usar mensagens traduzidas, será necessário o GNU gettext. Outras
|
||||
versões do gettext não são compatíveis e não funcionarão. Baixe a versão
|
||||
GNU através do site ftp://ftp.gnu.org
|
||||
|
||||
A maioria dos pacotes citados pode ser encontrado em ftp.uu.net/pub/graphics
|
||||
|
||||
|
||||
|
||||
OPÇÕES DE CONFIGURAÇÃO
|
||||
======================
|
||||
|
||||
Estas opções podem ser passadas ao script de configuração para ativar/desativar algumas
|
||||
opções do Window Maker. Exemplo:
|
||||
|
||||
./configure --enable-kde --enable-gnome
|
||||
|
||||
irá configurar o Window Maker para que seja compilado com suporte ao KDE e GNOME.
|
||||
|
||||
|
||||
Para obter uma lista com outras opcoes, execute ./configure --help:
|
||||
|
||||
--with-libs-from
|
||||
Especifica diretórios (paths) adicionais onde se deve achar as bibliotecas.
|
||||
A flag -L deve preceder cada caminho, tal como:
|
||||
--with-libs-from="-L/opt/libs -L/usr/local/lib"
|
||||
|
||||
--with-incs-from
|
||||
Especifica diretórios adicionais para os arquivos de cabeçalho (header files)
|
||||
que serão procurados. A flag -l deve preceder cada caminho descrito, tal como:
|
||||
--with-incs-from="-I/opt/headers -I/usr/local/include"
|
||||
|
||||
--enable-single-icon
|
||||
Permite o agrupamento de todas as aplicações com a mesma WM_CLASS+WM_INSTANCE em
|
||||
uma só. Esta opção não é suportada por todos os desenvolvedores. Se você tiver algum
|
||||
problema com essa opção, escreva para o seu autor: Christopher Seawood
|
||||
<cls@seawood.org>
|
||||
|
||||
--disable-shm
|
||||
Desativa o uso da extensão de memória compartilhada do MIT. Isto reduzirá
|
||||
um pouco a geração de texturas, mas em alguns casos se mostrará necessário
|
||||
em virtude de um bug que se manifesta quando manipulam-se ícones e texturas.
|
||||
|
||||
--disable-motif
|
||||
Desativa compatibilidade com gerenciador de janelas mwm.
|
||||
|
||||
--enable-openlook
|
||||
Ativa compatibilidade com gerenciador de janelas OPEN LOOK(tm).
|
||||
|
||||
--enable-gnome
|
||||
Ativa compatibilidade com gerenciador de janelas GNOME.
|
||||
|
||||
--enable-kde
|
||||
Ativa compatibilidade com gerenciador de janelas kde/kwm.
|
||||
|
||||
--enable-lite
|
||||
Remove coisas que já são suportadas em ambientes desktops como o KDE
|
||||
e o GNOME. As opções desativadas são: lista de janelas (window list), menu de
|
||||
aplicações root (root applications menu), seleção múltipla de janelas
|
||||
(multiple window selection). Note que não será mais possível sair do Window
|
||||
Maker de dentro; você terá que usar o kill com o sinal SIGTERM ou sair do KDE.
|
||||
Não é aconselhado ativar essa opção.
|
||||
|
||||
--enable-modelock
|
||||
Suporte ao bloqueio de status de linguagem do XKB. Se você não sabe o que
|
||||
é isto, você provavelmente não precisa.
|
||||
|
||||
--enable-sound
|
||||
Ativa o suporte ao módulo de efeitos sonoros.
|
||||
|
||||
--disable-xpm
|
||||
Desativa o uso da biblioteca XPM mesmo se esta estiver disponível no seu sistema.
|
||||
|
||||
--disable-png
|
||||
Desativa o uso da biblioteca PNG
|
||||
|
||||
--disable-tiff
|
||||
Desativa o uso da biblioteca TIFF
|
||||
|
||||
--disable-gif
|
||||
Desativa o uso da biblioteca GIF
|
||||
|
||||
--disable-jpeg
|
||||
Desativa o uso da biblioteca JPEG
|
||||
|
||||
--disable-shape
|
||||
Desativa o uso das shaped windows (para oclock, xeyes etc.).
|
||||
|
||||
--enable-debug
|
||||
Não use esta opção a não ser que saiba realmente o que está fazendo
|
||||
|
||||
|
||||
|
||||
NOTAS ESPECÍFICAS PARA AS PLATAFORMAS
|
||||
=====================================
|
||||
|
||||
- máquinas DEC/Alpha
|
||||
Você provavelmente precisará usar a flag --disable-shm para configurar,
|
||||
como ./configure --disable-shm
|
||||
|
||||
- SCO Unix - execute o configure tal como
|
||||
CFLAGS="-belf -DANSICPP" ./configure
|
||||
|
||||
- SunOS, Solaris
|
||||
Se você possui o gcc instalado, execute o configure como abaixo:
|
||||
CPP_PATH="gcc -E -x c" ./configure
|
||||
O cpp da Sun não possui agumas funções necessárias ao Window Maker e pode
|
||||
causar problemas quando analisados os arquivos de configuração.
|
||||
Você pode ainda precisar usar --with-libs-from e --with-incs-from
|
||||
para fornecer o diretório onde a libtiff está localizada.
|
||||
Alguem me mandou um email dizendo que você precisará deixar o /usr/local/lib
|
||||
como primeiro caminho (path) no LD_LIBRARY_PATH para que funcione.
|
||||
|
||||
Se você tem uma Ultra Creator 3D ou outra máquina com gráficos high-end,
|
||||
certifique-se de iniciar o servidor X com o visual padrão definido em 24bpp
|
||||
ou você poderá ter problemas com cores desfiguaradas. Isto é um bug do
|
||||
wmaker e será consertado.
|
||||
|
||||
- GNU/Linux em geral
|
||||
Confira se você possui /etc/local/lib no /etc/ld.so.conf e rode ldconfig
|
||||
após a instalação.
|
||||
Remova qualquer versão em pacote do Window Maker antes de instalar uma versão
|
||||
mais atual.
|
||||
|
||||
- RedHat GNU/Linux
|
||||
Os sistemas RedHat apresentam vários incômodos. Se você usa, certifique-se
|
||||
de seguir os passos abaixo ou o Window Maker não funcionará:
|
||||
|
||||
* se você instalou o Window Maker que vem junto com o Red Hat, desinstale-o
|
||||
antes de instalar uma versão mais atual.
|
||||
|
||||
* certifique-se de que você não possui as variáveis de ambiente LANG e LINGUAS
|
||||
configuradas como en_RN;
|
||||
|
||||
* certifique-se de que você possui /usr/local/bin na variável PATH;
|
||||
|
||||
* certifique-se de que você tem /usr/local/lib no /etc/ld.conf.so antes de
|
||||
executar o ldconfig;
|
||||
|
||||
* se você tiver problemas que mencionem uma mensagem de erro com o
|
||||
--no-reexec, remova a libtool-1.2b e instale a libtool-1.3. A libtool-1.3
|
||||
pode ser encontrada em ftp.gnu.org. Também leia a seção TROUBLESHOOTING;
|
||||
|
||||
* se você instalou o pacote Window Maker do RedHat e está instalando uma
|
||||
nova versão na mão (você mesmo está compilando), remova o pacote Window
|
||||
Maker do seu sistema RedHat antes.
|
||||
|
||||
* certifique-se de que você possua o vínculo simbólico do /usr/include/X11
|
||||
ao /usr/X11R6/include/X11 (se não, digite ln -s /usr/X11R6/include/X11
|
||||
/usr/include/X11)
|
||||
|
||||
* certifique-se de que você tem o /lib/cpp apontando para o programa cpp.
|
||||
|
||||
Se você possui alguma dúvida quanto a realizar qualquer uma das tarefas acima,
|
||||
por favor não hesite em contatar o suporte ao usuário RedHat. Eles gentilmente
|
||||
irão responder a todas as suas dúvidas relacionadas ao sistema. Eles sabem
|
||||
muito mais sobre o sistema deles do que nós (nós não usamos RedHat).
|
||||
|
||||
- PowerPC MkLinux
|
||||
Você terá que possuir a última versão do Xpmac. Versões mais antigas
|
||||
parecem ter bugs que fazem com que o sistema trave.
|
||||
|
||||
- Debian GNU/Linux
|
||||
Se você deseja suporte a JPEG e TIFF, certifique-se que no seu sistema estão
|
||||
instaladas as bibliotecas libtiff-dev e libjpeg-dev.
|
||||
|
||||
- SuSE GNU/Linux
|
||||
Se você instalou o pacote Window Maker do SuSE, certifique-se de
|
||||
removê-lo do seu sistema antes de compilar o wmaker ou você poderá
|
||||
ter problemas.
|
||||
|
||||
- MetroX (versão desconhecida)
|
||||
O MetroX possui uma falha que corrompe os pixmaps que são definidos
|
||||
como backgrounds de janelas. Se você usa MetroX e está tendo problemas
|
||||
estranhos com texturas, não use texturas nas titlebars. Ou use
|
||||
um servidor X diferente.
|
||||
|
||||
INSTALAÇÃO:
|
||||
===========
|
||||
|
||||
Desempacote o WindowMaker-extra-<numero-da-versao>.tar.gz no /usr/local/share.
|
||||
|
||||
Você pode pegar o arquivo no site ftp://ftp.windowmaker.org. Este arquivo
|
||||
é opcional e possui alguns ícones e temas. Procure pelo último <número-da-versão>
|
||||
disponível.
|
||||
Ainda há o WindowMaker-extra.readme para instruí-lo sobre onde o pacote deve ir.
|
||||
|
||||
|
||||
Compilando o Window Maker
|
||||
-------------------------
|
||||
Se você quer fazer de modo rápido e simples, digite o seguinte no seu prompt:
|
||||
|
||||
./configure
|
||||
make
|
||||
|
||||
depois entre como root e digite:
|
||||
|
||||
make install
|
||||
ldconfig
|
||||
|
||||
ou se você quiser remover os símbolos de depuração dos seus binários para
|
||||
que eles se tornem menores, você pode digitar:
|
||||
|
||||
make install-strip
|
||||
ldconfig
|
||||
|
||||
Estes comandos irão compilar e instalar o Window Maker com parâmetros padrões.
|
||||
|
||||
Se você deseja configurar algumas opções de compilação, você pode fazer o seguinte:
|
||||
|
||||
1.(opcional) Olhe na seção OPÇÕES DE CONFIGURAÇÃO acima para ver as
|
||||
opções disponíveis. Execute também:
|
||||
|
||||
./configure --help
|
||||
|
||||
para obter uma lista completa das outras opções.
|
||||
|
||||
2. Rode o configure com as opções que você deseja. Por exemplo, se
|
||||
deseja usar a opção --enable-kde, você deve digitar:
|
||||
|
||||
./configure --enable-kde
|
||||
|
||||
3. (opcional) Edite o arquivo src/wconfig.h com seu editor de texto
|
||||
preferido e procure por alguma opção que deseja mudar
|
||||
|
||||
4. Compile. Só digite:
|
||||
|
||||
make
|
||||
|
||||
5. Entre como root (se você não pode fazer isso, leia a seção "Eu não tenho a
|
||||
senha de root") e instale o Window Maker no seu sistema:
|
||||
|
||||
su root
|
||||
make install
|
||||
|
||||
|
||||
Configurações Específicas
|
||||
-------------------------
|
||||
|
||||
Estas instruções não precisam ser seguidas quando for feito o upgrade do
|
||||
Window Maker em cima de uma versão antiga, a menos que o arquivo NEWS diga
|
||||
algo diferente.
|
||||
|
||||
Todo usuário no seu sistema que desejar rodar o Window Maker deverá fazer o seguinte:
|
||||
|
||||
1. Instalar os arquivos de configuração do Window Maker no diretório home.
|
||||
Digite:
|
||||
wmaker.inst
|
||||
|
||||
wmaker.inst vai instalar os arquivos de configuração do Window Maker e fazer
|
||||
com que o X rode o Window Maker quando executado.
|
||||
|
||||
É isso!
|
||||
|
||||
Você pode digitar "man wmaker" para ver uma ajuda geral sobre configuração
|
||||
e outras coisas.
|
||||
|
||||
Leia o Manual do Usuário para explicações mais profundas sobre o Window Maker.
|
||||
|
||||
Você deve dar uma olhada no FAQ também.
|
||||
|
||||
|
||||
|
||||
Eu não tenho a senha de root
|
||||
----------------------------
|
||||
|
||||
Se você não pode obter privilégios de super-usuário (não pode ser root) você
|
||||
pode instalar o wmaker no seu diretório home. Para isso, forneça a opção
|
||||
--prefix quando for rodar o configure, como explicado no passo 2 da seção
|
||||
Compilando o Window Maker.
|
||||
Você ainda precisará fornecer a opção --with-appspath, para especificar o
|
||||
caminho do WPrefs.app. Exemplo:
|
||||
|
||||
./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Apps
|
||||
|
||||
Depois faça com que /home/jshome/bin seja incluído na variável PATH, adicione
|
||||
/home/jshome/lib na variável de ambiente LD_LIBRARY_PATH e rode bin/wmaker.inst
|
||||
|
||||
É claro, substitua /home/jshome com o seu diretório home.
|
||||
|
||||
|
||||
UPGRADE
|
||||
=======
|
||||
|
||||
Se você está fazendo um upgrade de uma versão antiga do Window maker:
|
||||
|
||||
1. Configure e compile o Window Maker como sempre
|
||||
2. Instale o Window Maker (mas não rode o wmaker.inst)
|
||||
3. Leia o arquivo NEWS e atualize seus arquivos de configuração,
|
||||
se necessário.
|
||||
|
||||
TROUBLESHOOTING
|
||||
===============
|
||||
|
||||
Quando você tiver problemas na configuração (enquanto roda o configure),
|
||||
tal como não conseguir usar uma biblioteca de gráficos que você acha que tem
|
||||
instalada, olhe no arquivo config.log para obter dicas sobre o que pode estar
|
||||
errado.
|
||||
|
||||
== Erro ao carregar as fontes, mesmo quando elas existem
|
||||
|
||||
Tente reconstruir sem suporte NLS.
|
||||
|
||||
== Erro ao configurar
|
||||
|
||||
ltconfig: unrecognized option `--no-reexec'
|
||||
Try `ltconfig --help' for more information.
|
||||
configure: error: libtool configure failed
|
||||
|
||||
remova a opção --no-reexec do aclocal.m4 e da libPropList/aclocal.m4
|
||||
e reconfigure.
|
||||
Também verifique se as versões do autoconf e do automake que você tem
|
||||
instaladas são:
|
||||
autoconf 2.13
|
||||
automake 1.4
|
||||
libtool 1.3
|
||||
|
||||
Note que não deve ser libtool 1.2b, deve ser libtool 1.3.
|
||||
|
||||
== Não acha a proplist.h ou libPropList.algumacoisa
|
||||
|
||||
Baixe e instale a libPropList dos sites já citados neste arquivo.
|
||||
|
||||
== o configure não detecta a libtiff, ou outras bibliotecas gráficas.
|
||||
|
||||
Delete o config.cache, depois rode de novo o configure adicionando as
|
||||
seguintes opções ao configure (e as outras opções que você usa):
|
||||
--with-libs-from="-L/usr/local/lib"
|
||||
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
|
||||
Substitua o caminho para onde estão localizadas as suas bibliotecas gráficas
|
||||
e os correspondentes arquivos de cabeçalho. Você pode colocar caminhos múltiplos
|
||||
em qualquer uma dessas opções, como no exemplo do --with-incs-from. Só ponha um
|
||||
espaço entre eles.
|
||||
|
||||
== o configure não detecta libXpm.
|
||||
|
||||
* Confira se você possui um vínculo simbólico da libXpm.so.4.9 para libXpm.so
|
||||
|
||||
|
||||
== Segmentation fault na inicialização
|
||||
|
||||
* Confira se a versão da libXPM é a 4.7 ou mais atual
|
||||
|
||||
* Confira se você tem uma versão atualizada do ~/GNUstep/Defaults/WindowMaker
|
||||
|
||||
Se você não tem certeza, tente renomear ~/GNUstep para ~/GNUtmp e depois rode
|
||||
o wmaker.inst
|
||||
|
||||
== "...: your machine is misconfigured. gethostname() returned (none)"
|
||||
|
||||
* o hostname da sua máquina está definido incorretamente. Execute um man hostname
|
||||
para obter informações de como resolver isto.
|
||||
|
||||
== O menu do root possui só 2 entradas. ("XTerm" e "Exit...")
|
||||
|
||||
* O Window Maker não está achando o cpp (o pré-processador C). Se o seu cpp
|
||||
não está localizado em /lib/cpp, edite src/config.h e corrija o caminho
|
||||
no CPP_PATH.
|
||||
|
||||
== checking lex output file root... configure: error: cannot find output from
|
||||
true; giving up
|
||||
|
||||
* Leia a seção REQUERIMENTOS deste arquivo.
|
||||
|
||||
|
||||
LOCALES/INTERNACIONALIZAÇÃO
|
||||
===========================
|
||||
|
||||
o Window Maker tem suporte a linguagem nacional. Para ativar esse suporte,
|
||||
você precisa compilar o Window Maker com parâmetros adicionais.
|
||||
|
||||
0 - Você deve Ter o pacote do GNU gettext instalado. Este pode ser obtido
|
||||
pelo ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
|
||||
|
||||
Os passos 1,2 e 3 podem ser pulados se você usa o script Install.
|
||||
|
||||
1 - Você deve selecionar as linguagens que deseja suportar. Defina a LINGUAS
|
||||
para a lista dos locales que você deseja. O Inglês é sempre suportado. Exemplo:
|
||||
|
||||
setenv LINGUAS "pt ja de"
|
||||
na csh
|
||||
|
||||
ou
|
||||
|
||||
export LINGUAS;LINGUAS="pt ja de"
|
||||
na sh
|
||||
|
||||
A lista dos locales suportados pode ser achado no arquivo po/README.
|
||||
O inglês é a língua oficial.
|
||||
|
||||
Leia o arquivo po/README se você deseja traduzir e manter os arquivos
|
||||
locales para outras linguagens.
|
||||
|
||||
2 - Adicionalmente, se a sua linguagem usa caracteres multi-bytes, tais
|
||||
como as línguas japonesas e koreanas, você deve definir a opção MultiByteText
|
||||
para YES nos arquivos ~/GNUstep/Defaults/WMGLOBAL e ~/GNUstep/Defaults/WindowMaker
|
||||
|
||||
3 - Configure, compile e instale o Window Maker normalmente.
|
||||
|
||||
4 - Para selecionar um locale particular você deve definir a variável de
|
||||
ambiente LANG para o locale que você quer. Por exemplo, se você quer definir o
|
||||
locale português, você deve rodar
|
||||
|
||||
setenv LANG pt
|
||||
|
||||
na csh ou
|
||||
|
||||
export LANG; LANG=pt
|
||||
|
||||
nas Bourne sh e similares
|
||||
|
||||
Nota: Se você tem a variável de ambiente LC_CTYPE definida, você deve
|
||||
indefiní-la antes de rodar o wmaker.
|
||||
|
||||
O Window Maker procura os arquivos de definições de menu na seguinte
|
||||
ordem (para o português brasileiro, neste caso):
|
||||
|
||||
menu.pt_BR
|
||||
menu.pt
|
||||
menu
|
||||
|
||||
|
||||
5 - Se você escolheu uma linguagem que usa caracteres multi-bytes, você
|
||||
deve configurar as fontes adequadamente. Leia a página de manual para o
|
||||
XcreateFontSet para obter mais detalhes sobre isto. Você deve mudar o arquivo
|
||||
~/G/D/WindowMaker para as fontes usadas nas barras de título, menus e
|
||||
outras coisas. Para as fontes usadas nas janelas de diálogo, mude o arquivo
|
||||
~/G/D/WMGLOBAL. O %d no font names não deve ser removido. Você pode ainda usar
|
||||
o wsetfont script para esta tarefa. Leia o próprio script para maiores instruções.
|
||||
|
||||
Por exemplo, você pode especificar o seguinte no ~/G/D/WindowMaker:
|
||||
|
||||
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
|
||||
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
|
||||
MenuTextFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-14-*";
|
||||
IconTitleFont = "-*-helvetica-medium-r-normal-*-8-*,-*-*-medium-r-normal-*-12-*";
|
||||
ClipTitleFont = "-*-helvetica-bold-r-normal-*-10-*,-*-*-medium-r-normal-*-12-*";
|
||||
DisplayFont = "-*-helvetica-medium-r-normal-*-12-*,-*-*-medium-r-normal-*-12-*";
|
||||
|
||||
e no ~/G/D/WMGLOBAL:
|
||||
|
||||
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
|
||||
|
||||
As duas fontes acima são usadas somente por aplicações que
|
||||
usem WINGs (o Window Maker e WPrefs.app)
|
||||
|
||||
O script wsetfont que é fornecido vai permitir com que você mude as
|
||||
definições de fonte do modo mais fácil. Dê uma olhada no script para maiores
|
||||
detalhes sobre o uso.
|
||||
|
||||
|
||||
|
||||
Traduzido por Ricardo Sartori <sartori@inf.ufsc.br>
|
||||
270
Install
270
Install
@@ -1,270 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# WindowMaker configuration and compilation script.
|
||||
#
|
||||
# Copyright (c) 1997, 1998, 1999 Alfredo K. Kojima
|
||||
#
|
||||
|
||||
export LINGUAS;LINGUAS=""
|
||||
if test "$NLSDIR" = ""; then
|
||||
export NLSDIR;NLSDIR="/usr/lib/locale"
|
||||
fi
|
||||
|
||||
|
||||
OPTIONS=""
|
||||
PREFIX="/usr/local"
|
||||
|
||||
perai() {
|
||||
echo "Type <Return> to continue"
|
||||
read nada
|
||||
}
|
||||
|
||||
|
||||
perform() {
|
||||
if ! $* ; then
|
||||
echo
|
||||
echo "Window Maker installation failed or aborted by user."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
trap "echo Window Maker installation aborted. ; exit 1" 2 3
|
||||
|
||||
echo
|
||||
echo "========================="
|
||||
echo "Window Maker Installation"
|
||||
echo "========================="
|
||||
echo
|
||||
echo "NOTE: If this script fails, read the INSTALL file and"
|
||||
echo "install by hand."
|
||||
echo
|
||||
echo "Please read the README, INSTALL and FAQ files before e-mailing "
|
||||
echo "questions. We will IGNORE any questions that are already"
|
||||
echo "answered in the documentation."
|
||||
echo
|
||||
perai
|
||||
echo
|
||||
echo "Did you install libPropList? If not, please install it now."
|
||||
echo
|
||||
perai
|
||||
echo "Did you read the INSTALL file?"
|
||||
echo -n "<y/n> "
|
||||
read rtfm
|
||||
if [ "$rtfm" != y ]; then
|
||||
echo "Please read the INSTALL file before installing"
|
||||
exit
|
||||
fi
|
||||
echo "Are you sure?"
|
||||
echo -n "<y/n> "
|
||||
read rtfm
|
||||
if [ "$rtfm" != y ]; then
|
||||
echo "Please read the INSTALL file before installing"
|
||||
exit
|
||||
fi
|
||||
echo "Are you lying?"
|
||||
echo -n "<y/n> "
|
||||
read rtfm
|
||||
if [ "$rtfm" != n ]; then
|
||||
echo "What a shame!"
|
||||
echo "Please read the INSTALL file before installing"
|
||||
exit
|
||||
fi
|
||||
echo "Do you *swear* that you really read the INSTALL file?"
|
||||
echo -n "<y/n> "
|
||||
read rtfm
|
||||
if [ "$rtfm" != y ]; then
|
||||
echo "Please read the INSTALL file before installing"
|
||||
exit
|
||||
fi
|
||||
echo "Last chance. You will not get help if you have some problem"
|
||||
echo "because you didn't read that file. Even if your computer explodes."
|
||||
echo "Do you *really* read it?"
|
||||
echo -n "<y/n> "
|
||||
read rtfm
|
||||
if [ "$rtfm" != y ]; then
|
||||
echo "Please read the INSTALL file before installing"
|
||||
exit
|
||||
fi
|
||||
echo
|
||||
echo "Ok, you have been warned."
|
||||
echo
|
||||
perai
|
||||
|
||||
|
||||
if test "$USER" != "root"; then
|
||||
echo
|
||||
echo "Warning: you must run this script as root to install"
|
||||
echo "Window Maker. Hit <Control>-<C> to quit this script."
|
||||
perai
|
||||
echo
|
||||
fi
|
||||
|
||||
|
||||
echo
|
||||
echo "Option Selection"
|
||||
echo "================"
|
||||
|
||||
######################## KDE
|
||||
echo
|
||||
echo "Do you want KDE support?"
|
||||
echo -n "<y/n> [n] "
|
||||
read kde
|
||||
if [ "$kde" = y -o "$kde" = Y ]; then
|
||||
OPTIONS="$OPTIONS --enable-kde"
|
||||
fi
|
||||
|
||||
######################## GNOME
|
||||
echo
|
||||
echo "Do you want GNOME support?"
|
||||
echo -n "<y/n> [n] "
|
||||
read gnome
|
||||
if [ "$gnome" = y -o "$gnome" = Y ]; then
|
||||
OPTIONS="$OPTIONS --enable-gnome"
|
||||
fi
|
||||
|
||||
######################## OLWM
|
||||
echo
|
||||
echo "Do you want OPEN LOOK(tm)/olwm support?"
|
||||
echo -n "<y/n> [n] "
|
||||
read olwm
|
||||
if [ "$olwm" = y -o "$olwm" = Y ]; then
|
||||
OPTIONS="$OPTIONS --enable-openlook"
|
||||
fi
|
||||
|
||||
######################## NLS
|
||||
echo
|
||||
echo "Do you want National Language Support?"
|
||||
echo -n "<y/n> [n] "
|
||||
read NLS
|
||||
|
||||
if [ "$NLS" = "y" -o "$NLS" = "Y" ]; then
|
||||
NLS="Y"
|
||||
echo "The supported locales are:"
|
||||
ling=` (cd po; /bin/ls *.po) `
|
||||
ALL_LINGUAS=""
|
||||
for l in $ling; do
|
||||
lname=`(cd po; grep Language-Team $l|cut -f 2 -d: |cut -f 2 -d\ )`
|
||||
lname=`echo $lname`
|
||||
lcode=`basename $l .po`
|
||||
ALL_LINGUAS="$ALL_LINGUAS $lcode"
|
||||
echo "$lcode $lname"
|
||||
done
|
||||
echo "Type in the locales you want (all will install everything) [none]"
|
||||
read foo
|
||||
if test "$foo" = "all"; then
|
||||
LINGUAS="$ALL_LINGUAS"
|
||||
else
|
||||
LINGUAS="$foo"
|
||||
fi
|
||||
echo "Selected locales are: $LINGUAS"
|
||||
|
||||
MB=""
|
||||
for i in $LINGUAS; do
|
||||
ok=0
|
||||
for b in $ALL_LINGUAS; do
|
||||
if test "$b" = "$i"; then
|
||||
ok=1
|
||||
break
|
||||
fi
|
||||
done
|
||||
if test "$ok" = "0"; then
|
||||
echo
|
||||
echo "$i is not a supported locale"
|
||||
perai
|
||||
continue
|
||||
fi
|
||||
|
||||
done
|
||||
echo
|
||||
echo "Where do you want to put the message files? [$NLSDIR]"
|
||||
echo -n "? "
|
||||
read foo
|
||||
if test "x$foo" != "x"; then
|
||||
NLSDIR=$foo
|
||||
fi
|
||||
fi
|
||||
##################### Installation path
|
||||
|
||||
done=0
|
||||
while [ $done = 0 ]; do
|
||||
echo
|
||||
echo "Where do you want to install Window Maker? [$PREFIX]"
|
||||
echo "Don't change it if you don't know what you're doing."
|
||||
if test "$USER" != "root"; then
|
||||
echo "Make sure to specify a path where you have write permission."
|
||||
fi
|
||||
echo "(The default will put Window Maker in $PREFIX/bin, $PREFIX/lib etc.)"
|
||||
echo -n "? "
|
||||
read foo
|
||||
if test "x$foo" != "x"; then
|
||||
if [ "$foo" = "y" -o "$foo" = "n" ]; then
|
||||
echo
|
||||
echo "Hmm... I don't think you really want to install Window Maker into \"$foo\""
|
||||
echo
|
||||
else
|
||||
done=1
|
||||
PREFIX=$foo
|
||||
fi
|
||||
else
|
||||
done=1
|
||||
fi
|
||||
echo
|
||||
echo " $PREFIX/bin must be in the PATH environment variable"
|
||||
echo "of all users who will use Window Maker"
|
||||
perai
|
||||
done
|
||||
|
||||
OPTIONS="$OPTIONS --prefix=$PREFIX"
|
||||
|
||||
|
||||
|
||||
##################### Configure
|
||||
echo "--------------------------"
|
||||
echo "Configuring Window Maker..."
|
||||
echo "--------------------------"
|
||||
if [ `uname -s` = "SCO_SV" ]; then
|
||||
echo "CFLAGS=\"$CFLAGS -belf -DANSICPP\" ./configure $OPTIONS"
|
||||
|
||||
CFLAGS="$CFLAGS -belf -DANSICPP"
|
||||
|
||||
perform ./configure $OPTIONS
|
||||
else
|
||||
echo "CFLAGS=\"$CFLAGS $GCCFLAGS\" ./configure $OPTIONS"
|
||||
|
||||
CFLAGS="$CFLAGS $GCCFLAGS"
|
||||
|
||||
perform ./configure $OPTIONS
|
||||
fi
|
||||
|
||||
|
||||
#################### Compile
|
||||
echo "-------------------------"
|
||||
echo "Compiling Window Maker..."
|
||||
echo "-------------------------"
|
||||
(cd src; perform make clean)
|
||||
perform make
|
||||
|
||||
echo "--------------------------"
|
||||
echo "Installing Window Maker..."
|
||||
echo "--------------------------"
|
||||
|
||||
perform make install
|
||||
|
||||
if [ `uname -s` = "Linux" ]; then
|
||||
echo
|
||||
echo " Make sure $PREFIX/lib is in the /etc/ld.so.conf file"
|
||||
/sbin/ldconfig
|
||||
fi
|
||||
|
||||
echo
|
||||
echo "Installation Finished!"
|
||||
echo
|
||||
echo "Now, each user that wishes to use WindowMaker must run the wmaker.inst"
|
||||
echo "script that was just installed."
|
||||
|
||||
|
||||
if test "$NLS" = "Y"; then
|
||||
echo "Don't forget to set the LANG environment variable to your locale"
|
||||
fi
|
||||
|
||||
90
MIRRORS
90
MIRRORS
@@ -1,90 +0,0 @@
|
||||
|
||||
Window Maker FTP Mirror Sites
|
||||
=======-=====================
|
||||
|
||||
Official Site (USA):
|
||||
--------------------
|
||||
ftp://ftp.windowmaker.org/
|
||||
|
||||
|
||||
Australia:
|
||||
----------
|
||||
ftp://ftp.goldweb.com.au/pub/WindowMaker/
|
||||
Contact: Matthew Hawkins <matt@goldweb.com.au>
|
||||
|
||||
|
||||
France:
|
||||
-------
|
||||
ftp://ftp.ensm-ales.fr/pub/mirrors/ftp.windowmaker.org
|
||||
Contact: Laurent PELLISSIER <Laurent.Pellissier@ensm-ales.fr>
|
||||
|
||||
|
||||
Germany:
|
||||
--------
|
||||
ftp://ftp.freenews.de/pub/windowmaker/
|
||||
Contact: Jonas Luster <jonas@cabal.arnooo.de>
|
||||
|
||||
|
||||
United States of America:
|
||||
-------------------------
|
||||
ftp://ftp.io.com/pub/mirror/windowmaker/
|
||||
Contact: Bobby <bobby@mezaway.org>
|
||||
|
||||
http://jgo.local.net/cool_downloads/wm/
|
||||
Contact: Joshua Go <joshuago@usa.net>
|
||||
|
||||
ftp://ftp.cybertrails.com/pub/windowmaker/
|
||||
Contact: Adam Jacob <adam@cybertrails.com>
|
||||
|
||||
|
||||
Provider: Ameth Technologies
|
||||
http://www.ameth.org/windowmaker/
|
||||
ftp://ftp.ameth.org/pub/mirrors/ftp.windowmaker.org/
|
||||
Contact: Chase Phillips <shepard@ameth.org>
|
||||
|
||||
|
||||
Third Party Window Maker Distribution Packages
|
||||
==============================================
|
||||
|
||||
Debian GNU/Linux (deb)
|
||||
----------------------
|
||||
|
||||
Contact: Marcelo Magallon <mmagallo@efis.ucr.ac.cr>
|
||||
Sites:
|
||||
http://master.debian.org/~mmagallo/packages/wmaker/
|
||||
|
||||
|
||||
RedHat GNU/Linux (RPM)
|
||||
----------------------
|
||||
|
||||
For Intel:
|
||||
|
||||
Contact: Jim Knoble <jmknoble@pobox.com>
|
||||
Sites:
|
||||
ftp://ftp.windowmaker.org/pub/beta/compiled/linux/rpms/
|
||||
ftp://ftp.redhat.com/pub/contrib/SRPMS/
|
||||
ftp://ftp.redhat.com/pub/contrib/i386/
|
||||
|
||||
For Alpha:
|
||||
|
||||
Contact: Peter Petrakis <peterpan@wn.net>
|
||||
Site:
|
||||
http://math.stcc.mass.edu/petrakis/downloads/X11
|
||||
|
||||
|
||||
HP-UX
|
||||
-----
|
||||
|
||||
Sites:
|
||||
UK: http://hpux.csc.liv.ac.uk/
|
||||
Germany: http://hpux.ask.uni-karlsruhe.de/
|
||||
US (WI): http://hpux.cae.wisc.edu/
|
||||
France: http://hpux.cict.fr/
|
||||
Netherlands: http://hpux.tn.tudelft.nl/
|
||||
Canada: http://hpux.ee.ualberta.ca/
|
||||
Italy: http://hpux.dsi.unimi.it/
|
||||
South Africa: http://hpux.petech.ac.za/
|
||||
Japan: http://hpux.u-aizu.ac.jp/
|
||||
US (UT): http://hpux.cs.utah.edu/
|
||||
|
||||
|
||||
67
Makefile.am
67
Makefile.am
@@ -1,26 +1,53 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc\
|
||||
contrib
|
||||
AUTOMAKE_OPTIONS =
|
||||
|
||||
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N MIRRORS COPYING.WTFPL \
|
||||
Install acconfig.h INSTALL.pt README.pt\
|
||||
mkpatch README.KDE README.GNOME WindowMaker.lsm.in\
|
||||
README.definable-cursor \
|
||||
libwmfun-0.0.2.tar.gz
|
||||
BUILT_SOURCES = config-paths.h
|
||||
|
||||
WindowMaker.lsm: WindowMaker.lsm.in
|
||||
size=`wc -c $(distdir).tar.gz|cut -d\ -f1`;\
|
||||
size=`echo scale=2\;$$size/1048576|bc`;\
|
||||
sed -e "s/VERSION/"$(VERSION)"/" \
|
||||
-e "s/DATE/`date +%d%b%Y|tr a-z A-Z`/"\
|
||||
-e "s/SIZE/$$size M/"\
|
||||
WindowMaker.lsm.in > WindowMaker-$(VERSION).lsm
|
||||
DISTCLEANFILES = config-paths.h
|
||||
|
||||
#dist-hook:
|
||||
# touch `find -name configure.in -print`
|
||||
# touch `find -name aclocal.m4 -print`
|
||||
# touch `find -name Makefile.am -print`
|
||||
# touch `find -name Makefile.in -print`
|
||||
# touch `find -name configure -print`
|
||||
config.h: config-paths.h
|
||||
|
||||
config-paths.h: Makefile
|
||||
@echo "Generating $@"
|
||||
@echo '/* define to the path to cpp */' > $@
|
||||
@echo '#define CPP_PATH "$(CPP_PATH)"' >> $@
|
||||
@echo '' >> $@
|
||||
@echo '/* gettext domain used for menu translations */' >> $@
|
||||
@if test -z "$(menutextdomain)"; then \
|
||||
echo '/* #undef MENU_TEXTDOMAIN "$(menutextdomain)" */' >> $@; \
|
||||
else \
|
||||
echo '#define MENU_TEXTDOMAIN "$(menutextdomain)"' >> $@; \
|
||||
fi
|
||||
@echo '' >> $@
|
||||
@echo '/* define an extra path for pixmaps */' >> $@
|
||||
@echo '#define PIXMAPDIR "$(pixmapdir)"' >> $@
|
||||
@echo '' >> $@
|
||||
@echo '/* where shared data is stored */' >> $@
|
||||
@echo '#define PKGDATADIR "$(datadir)/WindowMaker"' >> $@
|
||||
@echo '' >> $@
|
||||
@echo '/* where the configuration is stored */' >> $@
|
||||
@echo '#define SYSCONFDIR "$(sysconfdir)"' >> $@
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
SUBDIRS = wrlib WINGs src util po WindowMaker WPrefs.app doc
|
||||
|
||||
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N INSTALL \
|
||||
INSTALL-WMAKER README.definable-cursor \
|
||||
The-perfect-Window-Maker-patch.txt \
|
||||
README COPYING.WTFPL autogen.sh
|
||||
|
||||
if USE_LCOV
|
||||
coverage-reset:
|
||||
find . -type f -name '*.gcda' -exec rm -f '{}' ';'
|
||||
lcov --directory . --zerocounters
|
||||
|
||||
coverage:
|
||||
rm -rf coverage @lcov_output_directory@
|
||||
-mkdir -p coverage @lcov_output_directory@
|
||||
lcov --compat-libtool --capture --directory . --output-file coverage/coverage.info
|
||||
genhtml --output-directory @lcov_output_directory@ coverage/coverage.info
|
||||
|
||||
.PHONY: coverage-reset coverage
|
||||
endif
|
||||
|
||||
374
Makefile.in
374
Makefile.in
@@ -1,374 +0,0 @@
|
||||
# Makefile.in generated automatically by automake 1.4 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
|
||||
SHELL = @SHELL@
|
||||
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
VPATH = @srcdir@
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
|
||||
bindir = @bindir@
|
||||
sbindir = @sbindir@
|
||||
libexecdir = @libexecdir@
|
||||
datadir = @datadir@
|
||||
sysconfdir = @sysconfdir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
localstatedir = @localstatedir@
|
||||
libdir = @libdir@
|
||||
infodir = @infodir@
|
||||
mandir = @mandir@
|
||||
includedir = @includedir@
|
||||
oldincludedir = /usr/include
|
||||
|
||||
DESTDIR =
|
||||
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
|
||||
top_builddir = .
|
||||
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
transform = @program_transform_name@
|
||||
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
host_alias = @host_alias@
|
||||
host_triplet = @host@
|
||||
AS = @AS@
|
||||
CC = @CC@
|
||||
CPP_PATH = @CPP_PATH@
|
||||
DFLAGS = @DFLAGS@
|
||||
DLLIBS = @DLLIBS@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
GFXLIBS = @GFXLIBS@
|
||||
HEADER_SEARCH_PATH = @HEADER_SEARCH_PATH@
|
||||
ICONEXT = @ICONEXT@
|
||||
INTLIBS = @INTLIBS@
|
||||
LD = @LD@
|
||||
LIBPL = @LIBPL@
|
||||
LIBRARY_SEARCH_PATH = @LIBRARY_SEARCH_PATH@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LITE = @LITE@
|
||||
LN_S = @LN_S@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MOFILES = @MOFILES@
|
||||
NETLIBS = @NETLIBS@
|
||||
NLSDIR = @NLSDIR@
|
||||
NM = @NM@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
PACKAGE = @PACKAGE@
|
||||
RANLIB = @RANLIB@
|
||||
VERSION = @VERSION@
|
||||
WPMOFILES = @WPMOFILES@
|
||||
XCFLAGS = @XCFLAGS@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
XLFLAGS = @XLFLAGS@
|
||||
XLIBS = @XLIBS@
|
||||
X_EXTRA_LIBS = @X_EXTRA_LIBS@
|
||||
X_LIBRARY_PATH = @X_LIBRARY_PATH@
|
||||
supported_locales = @supported_locales@
|
||||
wprefsdir = @wprefsdir@
|
||||
|
||||
SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc contrib
|
||||
|
||||
|
||||
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N MIRRORS COPYING.WTFPL Install acconfig.h INSTALL.pt README.pt mkpatch README.KDE README.GNOME WindowMaker.lsm.in README.definable-cursor docklib-0.2.tar.gz libwmfun-0.0.2.tar.gz
|
||||
|
||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||
CONFIG_HEADER = ./src/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
|
||||
Makefile.in NEWS TODO acinclude.m4 aclocal.m4 config.guess config.sub \
|
||||
configure configure.in install-sh ltconfig ltmain.sh missing \
|
||||
mkinstalldirs
|
||||
|
||||
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
||||
TAR = gtar
|
||||
GZIP_ENV = --best
|
||||
all: all-redirect
|
||||
.SUFFIXES:
|
||||
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||
cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
|
||||
$(ACLOCAL_M4): configure.in acinclude.m4
|
||||
cd $(srcdir) && $(ACLOCAL)
|
||||
|
||||
config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
||||
$(SHELL) ./config.status --recheck
|
||||
$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
|
||||
cd $(srcdir) && $(AUTOCONF)
|
||||
|
||||
# This directory's subdirectories are mostly independent; you can cd
|
||||
# into them and run `make' without going through this Makefile.
|
||||
# To change the values of `make' variables: instead of editing Makefiles,
|
||||
# (1) if the variable is set in `config.status', edit `config.status'
|
||||
# (which will cause the Makefiles to be regenerated when you run `make');
|
||||
# (2) otherwise, pass the desired values on the `make' command line.
|
||||
|
||||
@SET_MAKE@
|
||||
|
||||
all-recursive install-data-recursive install-exec-recursive \
|
||||
installdirs-recursive install-recursive uninstall-recursive \
|
||||
check-recursive installcheck-recursive info-recursive dvi-recursive:
|
||||
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||
dot_seen=no; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
if test "$$subdir" = "."; then \
|
||||
dot_seen=yes; \
|
||||
local_target="$$target-am"; \
|
||||
else \
|
||||
local_target="$$target"; \
|
||||
fi; \
|
||||
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||
done; \
|
||||
if test "$$dot_seen" = "no"; then \
|
||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
||||
fi; test -z "$$fail"
|
||||
|
||||
mostlyclean-recursive clean-recursive distclean-recursive \
|
||||
maintainer-clean-recursive:
|
||||
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||
dot_seen=no; \
|
||||
rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
rev="$$subdir $$rev"; \
|
||||
test "$$subdir" = "." && dot_seen=yes; \
|
||||
done; \
|
||||
test "$$dot_seen" = "no" && rev=". $$rev"; \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
for subdir in $$rev; do \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
if test "$$subdir" = "."; then \
|
||||
local_target="$$target-am"; \
|
||||
else \
|
||||
local_target="$$target"; \
|
||||
fi; \
|
||||
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
||||
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||
done && test -z "$$fail"
|
||||
tags-recursive:
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
|
||||
done
|
||||
|
||||
tags: TAGS
|
||||
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP)
|
||||
list='$(SOURCES) $(HEADERS)'; \
|
||||
unique=`for i in $$list; do echo $$i; done | \
|
||||
awk ' { files[$$0] = 1; } \
|
||||
END { for (i in files) print i; }'`; \
|
||||
here=`pwd` && cd $(srcdir) \
|
||||
&& mkid -f$$here/ID $$unique $(LISP)
|
||||
|
||||
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
|
||||
tags=; \
|
||||
here=`pwd`; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
|
||||
fi; \
|
||||
done; \
|
||||
list='$(SOURCES) $(HEADERS)'; \
|
||||
unique=`for i in $$list; do echo $$i; done | \
|
||||
awk ' { files[$$0] = 1; } \
|
||||
END { for (i in files) print i; }'`; \
|
||||
test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
|
||||
|| (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
|
||||
|
||||
mostlyclean-tags:
|
||||
|
||||
clean-tags:
|
||||
|
||||
distclean-tags:
|
||||
-rm -f TAGS ID
|
||||
|
||||
maintainer-clean-tags:
|
||||
|
||||
distdir = $(PACKAGE)-$(VERSION)
|
||||
top_distdir = $(distdir)
|
||||
|
||||
# This target untars the dist file and tries a VPATH configuration. Then
|
||||
# it guarantees that the distribution is self-contained by making another
|
||||
# tarfile.
|
||||
distcheck: dist
|
||||
-rm -rf $(distdir)
|
||||
GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
|
||||
mkdir $(distdir)/=build
|
||||
mkdir $(distdir)/=inst
|
||||
dc_install_base=`cd $(distdir)/=inst && pwd`; \
|
||||
cd $(distdir)/=build \
|
||||
&& ../configure --srcdir=.. --prefix=$$dc_install_base \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) install \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
|
||||
&& $(MAKE) $(AM_MAKEFLAGS) dist
|
||||
-rm -rf $(distdir)
|
||||
@banner="$(distdir).tar.gz is ready for distribution"; \
|
||||
dashes=`echo "$$banner" | sed s/./=/g`; \
|
||||
echo "$$dashes"; \
|
||||
echo "$$banner"; \
|
||||
echo "$$dashes"
|
||||
dist: distdir
|
||||
-chmod -R a+r $(distdir)
|
||||
GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
|
||||
-rm -rf $(distdir)
|
||||
dist-all: distdir
|
||||
-chmod -R a+r $(distdir)
|
||||
GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
|
||||
-rm -rf $(distdir)
|
||||
distdir: $(DISTFILES)
|
||||
-rm -rf $(distdir)
|
||||
mkdir $(distdir)
|
||||
-chmod 777 $(distdir)
|
||||
here=`cd $(top_builddir) && pwd`; \
|
||||
top_distdir=`cd $(distdir) && pwd`; \
|
||||
distdir=`cd $(distdir) && pwd`; \
|
||||
cd $(top_srcdir) \
|
||||
&& $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile
|
||||
@for file in $(DISTFILES); do \
|
||||
d=$(srcdir); \
|
||||
if test -d $$d/$$file; then \
|
||||
cp -pr $$/$$file $(distdir)/$$file; \
|
||||
else \
|
||||
test -f $(distdir)/$$file \
|
||||
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file || :; \
|
||||
fi; \
|
||||
done
|
||||
for subdir in $(SUBDIRS); do \
|
||||
if test "$$subdir" = .; then :; else \
|
||||
test -d $(distdir)/$$subdir \
|
||||
|| mkdir $(distdir)/$$subdir \
|
||||
|| exit 1; \
|
||||
chmod 777 $(distdir)/$$subdir; \
|
||||
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
|
||||
|| exit 1; \
|
||||
fi; \
|
||||
done
|
||||
info-am:
|
||||
info: info-recursive
|
||||
dvi-am:
|
||||
dvi: dvi-recursive
|
||||
check-am: all-am
|
||||
check: check-recursive
|
||||
installcheck-am:
|
||||
installcheck: installcheck-recursive
|
||||
install-exec-am:
|
||||
install-exec: install-exec-recursive
|
||||
|
||||
install-data-am:
|
||||
install-data: install-data-recursive
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
install: install-recursive
|
||||
uninstall-am:
|
||||
uninstall: uninstall-recursive
|
||||
all-am: Makefile
|
||||
all-redirect: all-recursive
|
||||
install-strip:
|
||||
$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
|
||||
installdirs: installdirs-recursive
|
||||
installdirs-am:
|
||||
|
||||
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-rm -f Makefile $(CONFIG_CLEAN_FILES)
|
||||
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||
|
||||
maintainer-clean-generic:
|
||||
mostlyclean-am: mostlyclean-tags mostlyclean-generic
|
||||
|
||||
mostlyclean: mostlyclean-recursive
|
||||
|
||||
clean-am: clean-tags clean-generic mostlyclean-am
|
||||
|
||||
clean: clean-recursive
|
||||
|
||||
distclean-am: distclean-tags distclean-generic clean-am
|
||||
-rm -f libtool
|
||||
|
||||
distclean: distclean-recursive
|
||||
-rm -f config.status
|
||||
|
||||
maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
|
||||
distclean-am
|
||||
@echo "This command is intended for maintainers to use;"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
|
||||
maintainer-clean: maintainer-clean-recursive
|
||||
-rm -f config.status
|
||||
|
||||
.PHONY: install-data-recursive uninstall-data-recursive \
|
||||
install-exec-recursive uninstall-exec-recursive installdirs-recursive \
|
||||
uninstalldirs-recursive all-recursive check-recursive \
|
||||
installcheck-recursive info-recursive dvi-recursive \
|
||||
mostlyclean-recursive distclean-recursive clean-recursive \
|
||||
maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
|
||||
distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
|
||||
dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
|
||||
install-exec install-data-am install-data install-am install \
|
||||
uninstall-am uninstall all-redirect all-am all installdirs-am \
|
||||
installdirs mostlyclean-generic distclean-generic clean-generic \
|
||||
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
|
||||
|
||||
|
||||
WindowMaker.lsm: WindowMaker.lsm.in
|
||||
size=`wc -c $(distdir).tar.gz|cut -d\ -f1`;\
|
||||
size=`echo scale=2\;$$size/1048576|bc`;\
|
||||
sed -e "s/VERSION/"$(VERSION)"/" \
|
||||
-e "s/DATE/`date +%d%b%Y|tr a-z A-Z`/"\
|
||||
-e "s/SIZE/$$size M/"\
|
||||
WindowMaker.lsm.in > WindowMaker-$(VERSION).lsm
|
||||
|
||||
#dist-hook:
|
||||
# touch `find -name configure.in -print`
|
||||
# touch `find -name aclocal.m4 -print`
|
||||
# touch `find -name Makefile.am -print`
|
||||
# touch `find -name Makefile.in -print`
|
||||
# touch `find -name configure -print`
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
527
NEWS
527
NEWS
@@ -2,6 +2,527 @@
|
||||
NEWS for veteran Window Maker users
|
||||
-----------------------------------
|
||||
|
||||
--- 0.94.0-crm
|
||||
|
||||
New Resizing functionality
|
||||
--------------------------
|
||||
|
||||
You can now use the mouse wheel and modifier keys to resize windows.
|
||||
MOD+Wheel will resize windows vertically and CTRL+Wheel will resize
|
||||
windows horizontally. MOD+CTRL+Wheel will resize both at the same time.
|
||||
The resize step, or increment can be set in WPrefs in the "Window Handling"
|
||||
page, or in the config file with "ResizeIncrement". If this intrudes into
|
||||
a specific application's functionality, you can disable it on an application-
|
||||
by-application basis by setting the "Do not bind mouse clicks" attribute in
|
||||
"Advanced Options".
|
||||
|
||||
New Maximize functionality
|
||||
--------------------------
|
||||
|
||||
Maximus/Maximumize. A new tiled maximization, configured with a keyboard
|
||||
shortcut. Using it will maximize the window to the greatest area such that it
|
||||
will not overlap any other window of the same workspace. This can be configured
|
||||
in WPrefs in the "Keyboard Shortcuts" page, or in the config file with
|
||||
"MaximusKey".
|
||||
|
||||
Left/right maximization. Now wmaker supports maximizing a window to the
|
||||
left or right half of the screen, making it occupy 50% of the area. This is
|
||||
useful on widescreen displays where you want to bring up two windows side-by-
|
||||
side. The shortcut keys for this can be configured in WPrefs in the "Keyboard
|
||||
Shortcuts" page, or in the config file with "LHMaximizeKey" and "RHMaximizeKey"
|
||||
|
||||
History and AutoComplete in the run dialog
|
||||
------------------------------------------
|
||||
|
||||
The "Run..." dialog now autocompletes executables in your path (triggered by
|
||||
the TAB key) and records the history of past commands (last 500 by default).
|
||||
It can also complete folder names if you start the complete with a "/"
|
||||
To use it replace %a with %A in the "Run..." entry in your WMRootMenu file.
|
||||
See commit 05720d97076ffc1569e5 for more details.
|
||||
|
||||
Automatic menu generator (wmgenmenu)
|
||||
-----------------------------------
|
||||
|
||||
There is now a new utility to generate the Window Maker menu automatically,
|
||||
called wmgenmenu. It searches from a list of pre-defined applications the
|
||||
ones which exist in your $PATH and adds them to the corresponding submenus
|
||||
("Internet", "Terminals", "Editors" etc) of your WM menu. It also supports
|
||||
localization (currently English and German). You can use it like:
|
||||
|
||||
$ wmgenmenu > WMRootMenu-new
|
||||
$ cp WMRootMenu-new $HOME/GNUstep/Defaults/WMRootMenu
|
||||
|
||||
and WM will automatically detect the new menu file and use it without
|
||||
restarting wmaker (made possible by the 'inotify' mechanism)
|
||||
|
||||
Automatic detection of menu changes (via inotify)
|
||||
-------------------------------------------------
|
||||
|
||||
Window Maker now uses the 'inotify' mechanism from the linux kernel
|
||||
to automatically detect changes in the WMRootMenu file. So the
|
||||
--no-polling option is now gone and Window Maker does not wake up
|
||||
your CPU unnecessarily (0 wakeups when idle, instead of 4).
|
||||
So if you edit the WMRootMenu file by hand (or by using 'wmgenmenu'),
|
||||
there is no need to restart wmaker for the changes to take effect.
|
||||
|
||||
DockApp recognition
|
||||
-------------------
|
||||
|
||||
In addition to applications with only Withdrawn windows, Window Maker
|
||||
will now treat any application with its WM_CLASS res_class set as
|
||||
"DockApp". This provides an easy workaround for toolkits like gtk+ that
|
||||
do not allow creation of windows with the initial_state member of
|
||||
XWMHints set to WithdrawnState.
|
||||
|
||||
|
||||
--- 0.92.0
|
||||
|
||||
GNUstep Installation Directory
|
||||
------------------------------
|
||||
|
||||
WPrefs is now installed in /usr/local/bin and /usr/local/share by default.
|
||||
If you use GNUstep and want it to install in /usr/GNUstep/Applications,
|
||||
you may specify --with-gnustepdir=/usr/GNUstep
|
||||
If the GNUSTEP_LOCAL_ROOT environment variable is defined when configure is
|
||||
executed, it will be used (and you don't need to use --with-gnustepdir)
|
||||
|
||||
Cached Pixmaps Directory
|
||||
------------------------
|
||||
|
||||
The directory where Window Maker stores the cached application pixmaps for
|
||||
its later use has changed from ~/GNUstep/.AppInfo/WindowMaker to
|
||||
~/GNUstep/Library/WindowMaker/CachedPixmaps for better compatibility with
|
||||
the GNUstep path structure.
|
||||
Also WPrefs now stores internal data in ~/GNUstep/Library/WindowMaker/WPrefs
|
||||
(it was ~/GNUstep/.AppInfo/WPrefs before)
|
||||
|
||||
X Input Methods support in WINGs
|
||||
--------------------------------
|
||||
|
||||
Preliminary support for X Input Methods was added to textfield and text
|
||||
widgets in WINGs. Input for text in other languages than English should
|
||||
work now (except for kanji which will most likely not work, even though
|
||||
it wasn't tested).
|
||||
|
||||
|
||||
Disabling the switch panel
|
||||
--------------------------
|
||||
|
||||
To disable the panel shown during Alt-tabbing, you may put the following in
|
||||
~/GNUstep/Defaults/WindowMaker
|
||||
|
||||
SwitchPanelImages= None;
|
||||
|
||||
|
||||
|
||||
--- 0.91.0
|
||||
|
||||
Alt-Tab Window Switching
|
||||
------------------------
|
||||
|
||||
You can change the appearance of the panel shown during Alt-Tab window switching
|
||||
with the SwitchPanelImages option:
|
||||
|
||||
(selected_icon_tile_image, background_image, width, height)
|
||||
|
||||
selected_icon_tile_image is the image used to highlight the currently selected
|
||||
window icon. It must be 64x64 pixels.
|
||||
|
||||
background_image is the image used in the background of the panel. It must
|
||||
be at least 64x80.
|
||||
|
||||
width and height are the width and size of the central part of the image.
|
||||
When drawing the panel, the image will be split as:
|
||||
|W |
|
||||
+--+--+--+
|
||||
| | | |
|
||||
+--+--+--+ -
|
||||
| | | | H
|
||||
+--+--+--+ -
|
||||
| | | |
|
||||
+--+--+--+
|
||||
|
||||
The 4 corner images will be copied in their original sizes and the rest will
|
||||
be scaled to the final panel size.
|
||||
|
||||
background_image, width and height are optional. If you leave them out,
|
||||
a gray panel will be used. If your machine is not very fast, you may want
|
||||
to use it.
|
||||
|
||||
|
||||
--- 0.90.0
|
||||
|
||||
|
||||
NetWM / EWMH Support
|
||||
--------------------
|
||||
|
||||
Support for the EWMH standard has been added. Applications from GNOME 2.x and
|
||||
KDE 3.x should now interoperate better with Window Maker.
|
||||
|
||||
Support for the obsolete/legacy GNOME 1.x, KDE 1.x and OpenLook(!) hints was
|
||||
wiped out for the sake of sanity.
|
||||
|
||||
|
||||
Antialiased font support
|
||||
------------------------
|
||||
|
||||
With the addition of Xft2 support in the WINGs library, now
|
||||
Window Maker can display antialiased text with TrueType or any scalable fonts.
|
||||
|
||||
You can pick fonts for Window Maker in the Font configuration section of
|
||||
WPrefs.
|
||||
|
||||
Antialiased text is enabled by default, but can be disabled by adding
|
||||
|
||||
AntialiasedText = NO; in ~/GNUstep/Defaults/WMGLOBAL
|
||||
|
||||
This will disable antialiased text for any WINGs based application. If you
|
||||
only want to disable them for a specific application only, like WindowMaker
|
||||
for example, then add the same option in the applications configuration file,
|
||||
in this case ~/GNUstep/Defaults/WindowMaker
|
||||
For WindowMaker, this can also be achieved from the Expert panel in WPrefs.
|
||||
|
||||
Note that bitmapped fonts look much better than TrueType when antialiasing is
|
||||
disabled.
|
||||
|
||||
Global Submenus
|
||||
---------------
|
||||
|
||||
Global menus allow for system wide menus that are added to every users
|
||||
application menus. They are located in /usr/etc/WindowMaker/,
|
||||
/usr/local/etc/WindowMaker or whatever is your sysconf directory
|
||||
for WindowMaker. There are 2 files:
|
||||
|
||||
GlobalMenu.pre, which is added to the beginning of the menu and
|
||||
GlobalMenu.post, which is added to the end of the menu.
|
||||
|
||||
These are to be proplist format menus, for example:
|
||||
|
||||
(("Foobar", EXEC, foobar),
|
||||
("Blabla", EXEC, blabla))
|
||||
|
||||
or, in case you want a submenu:
|
||||
|
||||
(("Submenu",
|
||||
("Foobar", EXEC, foobar),
|
||||
("Blabla", EXEC, blabla)))
|
||||
|
||||
|
||||
UTF-8 Support
|
||||
-------------
|
||||
|
||||
Window Maker now uses UTF-8 internally (and thus can display UTF-8 text
|
||||
in window titles and other places). Menus and po files must now be
|
||||
encoded in UTF-8. If your menus contain non ASCII characters, you can convert
|
||||
them to UTF-8 with the following command:
|
||||
|
||||
iconv -f <current-file-encoding> -t utf-8 <filename> > <filename>.utf8
|
||||
|
||||
For example:
|
||||
|
||||
iconv -f iso-8859-1 -t utf-8 menu > menu.utf
|
||||
mv menu.utf menu
|
||||
|
||||
|
||||
Icon Panel for Alt-Tabbing
|
||||
--------------------------
|
||||
|
||||
A panel with icons for the windows that you can switch to will appear
|
||||
when you press Alt-Tab. You can navigate through the windows with Alt-Tab
|
||||
(Alt-Shift-Tab) or with the left/right keys once the panel is shown.
|
||||
|
||||
|
||||
|
||||
--- 0.80.0
|
||||
|
||||
Shading/Unshading windows using mouse wheel on their titlebar
|
||||
-------------------------------------------------------------
|
||||
|
||||
In addition to the known methods of shading/unshading a window, one can now
|
||||
do this by using the mouse wheel on the window's titlebar. The mouse events
|
||||
are interpreted via a mapping in the global WINGs configuration file,
|
||||
WMGLOBAL, by the MouseWheelUp and MouseWheelDown directives which will do
|
||||
shading and unshading respectfully.
|
||||
|
||||
However, to avoid unwanted triggers of shading/unshading the window, two
|
||||
consecutive mouse wheel events in the same direction are required. The
|
||||
trigger won't occur if the events are separated by more than a double-click's
|
||||
worth of time, which is technically speaking like making a double-click with
|
||||
the button that corresponds to the mouse wheel direction.
|
||||
|
||||
Practically speaking, this means that you have to move the mouse wheel up
|
||||
or down quickly, like when you want to quickly scroll over something big.
|
||||
|
||||
|
||||
Shared application icons
|
||||
------------------------
|
||||
|
||||
Real application icon sharing was implemented in place of the collapse
|
||||
appicon thing. With this applications of the same instance.class will
|
||||
have a single shared application icon and hiding will hide all windows
|
||||
of the aplications attached to that appicon as if there is a single
|
||||
application. This feature is enabled by default for all applications in
|
||||
the global WMWindowAttributes defaults domain using:
|
||||
|
||||
"*" = {SharedAppIcon = Yes;};
|
||||
|
||||
If you're not satisfied with this or want the old behaviour back you
|
||||
can revert this (either in the global domain for all users or in your
|
||||
personal WMWindowAttibutes domain) using SharedAppIcon = No; for "*"
|
||||
It can also be enabled/disabled for individual applications as needed.
|
||||
|
||||
Setting this option can be done using the window's inspector panel in the
|
||||
"Application Specific" section. You can set/unset it for all applications by
|
||||
using the "Defaults for all windows" in the "Window Specification" section
|
||||
|
||||
Basically using this can have 2 major scenarios:
|
||||
1. Leave it on by default, but disable it for the few specific
|
||||
applications that do not behave well with it. (default)
|
||||
2. Leave it off by default, and enable it for all applications for
|
||||
which you want it enabled.
|
||||
|
||||
At this point all applications we tested work ok, some of them even
|
||||
work better with this feature turned on: for example xmms and Corel's
|
||||
WorkPerfect8 now only have 1 appicon (they used to have 2 without this
|
||||
feature).
|
||||
|
||||
This feature is turned off by default for the following applications
|
||||
because it's incompatible with them:
|
||||
1. all GNUstep applications
|
||||
2. applications with an application menu (wterm, Aileron, etc)
|
||||
3. all applications with withdrawn windows only (this means all dockapps)
|
||||
|
||||
As a side note: wterm can use the shared appicon feature as long as it
|
||||
doesn't use the appmenu (will do this by default). If you start it
|
||||
using the appmenu (wterm -wm) it will disable the shared appicon
|
||||
feature because apps with appmenus are incompatible with this feature.
|
||||
|
||||
If an application is a GNUstep application or if it has an appmenu, it's
|
||||
detected automatically and the shared appicon is disabled automatically
|
||||
without any user intervention or need to configure anything.
|
||||
|
||||
|
||||
Dock/Clip stealing appicons
|
||||
---------------------------
|
||||
|
||||
This feature is different form the Clip's "Autoattract Icons" feature
|
||||
as it won't attach any new icon to the dock/clip.
|
||||
What it does, is when you start an application by other means than
|
||||
dock/clip, like for example using the main menu or a terminal, it will
|
||||
search the dock/clips for the presence of an appicon for that
|
||||
application, that is not already running at that moment and will attach
|
||||
the started application to that appicon in the dock/clip if available,
|
||||
making it look like the dock/clip just stole the appicon for the started
|
||||
application. There is an animation for this to offer visual feedback
|
||||
that this happened.
|
||||
|
||||
|
||||
|
||||
--- 0.70.0
|
||||
|
||||
New dock option
|
||||
---------------
|
||||
|
||||
Copy/paste launch in dock.
|
||||
==========================
|
||||
|
||||
For example, put netscape %s in the Docked icon for Netscape, select an url
|
||||
somewhere and then middle-click the icon. The command will be launched with
|
||||
the "pasted" string.
|
||||
|
||||
|
||||
Xinerama Support
|
||||
================
|
||||
|
||||
Supported Xinerama features:
|
||||
|
||||
- Normal maximization of windows will maximize to only one of the screens,
|
||||
the one where the cursor pointer is.
|
||||
|
||||
- Full Maximize command in window menu
|
||||
|
||||
- Place dialogs in the middle of the head where the pointer is
|
||||
|
||||
- Try to place windows inside one head in non-manual placement modes
|
||||
|
||||
|
||||
Less dependancies
|
||||
-----------------
|
||||
|
||||
starting with 0.70.0 libPropList is no longer required to build Window
|
||||
Maker. PropList handling code was added to WINGs being now better
|
||||
integrated with all the rest. For more details check the Changelog and the
|
||||
following files:
|
||||
./WINGs/ChangeLog
|
||||
./WINGs/NEWS
|
||||
./WINGs/WINGs/WUtil.h
|
||||
./WINGs/WINGs/proplist-compat.h
|
||||
|
||||
|
||||
|
||||
--- 0.65.1
|
||||
|
||||
Removed FocusFollowMouse option, only SloppyFocus present now.
|
||||
|
||||
Added None option to MoveDisplay and ResizeDisplay
|
||||
|
||||
|
||||
|
||||
--- 0.65.0
|
||||
|
||||
Single AppIcon
|
||||
--------------
|
||||
|
||||
Removed --single-appicon patch and replaced it with a application
|
||||
specific collapsing option. Check inspector panel and appicon menu.
|
||||
|
||||
New options to configure the workspace mouse actions
|
||||
----------------------------------------------------
|
||||
|
||||
The following options were removed from the WindowMaker defaults configuration
|
||||
file:
|
||||
|
||||
SelectWindowsMouseButton, WindowListMouseButton and ApplicationMenuMouseButton.
|
||||
|
||||
They were replaced with the following 3+1:
|
||||
|
||||
MouseLeftButtonAction, MouseMiddleButtonAction and MouseRightButtonAction plus
|
||||
MouseWheelAction
|
||||
|
||||
In the old way because all gravitated around the workspace actions to which
|
||||
specific mouse buttons could have been bound, it allowed one to specify in
|
||||
the configuration file settings which would have led to weird situations
|
||||
that also had undesirable results.
|
||||
For example the same mouse button (for example left) could have been
|
||||
assigned to all workspace actions: 'select windows', 'show window list menu'
|
||||
and 'show applications menu' which of course were not only impossible to
|
||||
accomplish while still having a properly working workspace, but they also
|
||||
allowed one to specify some settings in the configuration file that were
|
||||
never in fact translatable to proper workspace actions.
|
||||
|
||||
To void this kind of user interface inconsistency, the new options now
|
||||
gravitate around the physical device (the mouse and its buttons) to which
|
||||
specific workspace actions can be bound. This way, even if one assigns the
|
||||
same action to all mouse buttons, that situation while gives redundant and
|
||||
unpractical settings it will still translatable to proper workspace actions:
|
||||
all buttons will execute the same action, but a button will execute only one
|
||||
action at a time.
|
||||
|
||||
The new options take the following values:
|
||||
all Mouse...ButtonAction can have one of the following values:
|
||||
|
||||
None, SelectWindows, OpenApplicationsMenu or OpenWindowListMenu
|
||||
|
||||
MouseWheelAction can be one of None or SwitchWorkspaces
|
||||
|
||||
If you had the default actions bound to mouse buttons before, then it will
|
||||
work for you without any intervention in the configuration files.
|
||||
Else you need to use WPrefs.app to bind the actions to the mouse buttons
|
||||
again to your old settings. Also if you want to change the mouse wheel
|
||||
behavior regarding workspaces you can now (use WPrefs.app to do this).
|
||||
|
||||
Client supplied icons
|
||||
---------------------
|
||||
|
||||
Window Maker saves the client supplied icons in
|
||||
~/GNUstep/Library/WindowMaker/CachedPixmaps in XPM format for later use
|
||||
when the app is no longer running (to have the image to display for docked
|
||||
icons for example).
|
||||
|
||||
Until recently the XPM images saved by Window Maker were incorrect, but a
|
||||
recent fix in the code to save XPM's fixed them. But with this fix, all
|
||||
previously saved XPM's in that directory are no longer readable (they give
|
||||
wrong images on screen or fail to load).
|
||||
|
||||
To avoid the need for the user to fix this by hand editing WMWindowAttributes
|
||||
and removing all references to icons in ~/GNUstep/Library/WindowMaker/CachedPixmaps
|
||||
which can be annoying, new code was added to Window Maker to permit the
|
||||
regeneration of images in ~/GNUstep/Library/WindowMaker/CachedPixmaps if they are missing.
|
||||
|
||||
With this addition, all you need to do to fix your old broken images, is to
|
||||
delete all *.xpm files from ~/GNUstep/Library/WindowMaker/CachedPixmaps. Next time the
|
||||
application that is supplying an icon image will start the icon will be
|
||||
recreated if missing, but this time it will be saved with the new XPM save
|
||||
code which produces good XPM images.
|
||||
All the rest of the process is transparent to the user.
|
||||
|
||||
Hermes library support
|
||||
----------------------
|
||||
|
||||
If configure finds hermes library (an optimized pixel format conversion
|
||||
library) installed it will use it to do the pixel format conversion in
|
||||
the wraster library for some cases (TrueColor visuals without dithering).
|
||||
Currently the hermes routines cannot convert to an indexed destination,
|
||||
so we can't use hermes for PseudoColor, GrayScale and StaticGray visuals.
|
||||
Also hermes only does dithering for just 2 combinations of source/destination
|
||||
bits/masks none of them useful to out needs so for dithering we still
|
||||
use out routines.
|
||||
|
||||
The Hermes library is completely optional, you can build Window Maker
|
||||
without having it, it just speeds up the things a little for some
|
||||
situations.
|
||||
|
||||
hermes library is available here: http://www.clanlib.org/hermes/
|
||||
|
||||
|
||||
--- 0.64.0
|
||||
|
||||
No Polling of Configuration Files
|
||||
---------------------------------
|
||||
|
||||
Running Window Maker with one of -nopolling or --no-polling command line
|
||||
options will make it not to poll every 3 seconds for changes in its
|
||||
configuration files (good for laptops to let them spin disks down when idle).
|
||||
|
||||
Note:
|
||||
For the ones used with Jim Knoble's 'no polling' patch, this is the same,
|
||||
except that the need to #define ENABLE_NO_POLLING in wconfig.h was removed
|
||||
and the behaviour is always available if you use the command line option.
|
||||
|
||||
|
||||
--- 0.63.0
|
||||
|
||||
|
||||
Interwoven Gradient
|
||||
-------------------
|
||||
|
||||
interwoven gradients rip^Winspired on blackbox. Will render a texture that
|
||||
interweaves 2 different ones.
|
||||
|
||||
(igradient, from1, to1, thickness1, from2, to2, thickness2)
|
||||
|
||||
Will render a interwoven texture with the 2 specified gradients,
|
||||
with each section having the specified thickness.
|
||||
|
||||
wmagnify
|
||||
--------
|
||||
|
||||
The wmagnify utility will magnify the area on teh screen where
|
||||
your mouse pointer is located, updating it in real-time.
|
||||
|
||||
tip: maximize it horizontally, make it Omnipresent and Always at Bottom.
|
||||
Then leave it in the bottom of the screen.
|
||||
|
||||
workspace border
|
||||
----------------
|
||||
|
||||
2 options (WorkspaceBorder and WorkspaceBorderSize) were added to allow one to
|
||||
set a small (0..5 pixels) border for the workspace. This border will not be
|
||||
covered by windows when maximizing, allowing one to easily access the clip
|
||||
or map a menu using the mouse in the border area, even when there are
|
||||
windows maximized in both horizontal and vertical directions.
|
||||
WorkspaceBorder can be one of (None, LeftRight, TopBottom, AllDirections)
|
||||
while WorkspaceBorderSize is the size in pixles of the border not to be
|
||||
covered by windows when maximizing (usually a small amount 0..5 pixles).
|
||||
|
||||
Both options can be set using WPrefs.app in the "Miscelaneous Ergonomic
|
||||
Preferences" section. WPrefs will always limit WorkspaceBorderSize in the
|
||||
(0..5) range.
|
||||
|
||||
Note that if "full screen maximization" option is set for a window, that
|
||||
window will ignore this border area, maximizing to full screen.
|
||||
|
||||
|
||||
--- 0.62.0
|
||||
|
||||
|
||||
@@ -329,7 +850,7 @@ Themes
|
||||
|
||||
Removed all themes from the source tree, and moved them in a separate package.
|
||||
You can download the new package from the same place as this package:
|
||||
ftp://ftp.windowmaker.org/pub/beta/srcs/
|
||||
ftp://ftp.windowmaker.info/pub/beta/srcs/
|
||||
Look after WindowMaker-extra-<version-number>.tar.gz
|
||||
Also WindowMaker-extra pack include the old WindowMaker-data.tar.gz which only
|
||||
contained icons.
|
||||
@@ -424,7 +945,7 @@ libPropList
|
||||
|
||||
WARNING!!! libPropList was removed from the Window Maker distribution
|
||||
and is being distributed separately. If you dont have it installed yet,
|
||||
get it from ftp.windowmaker.org/pub/libs and install before building
|
||||
get it from ftp.windowmaker.info/pub/libs and install before building
|
||||
Window Maker.
|
||||
|
||||
|
||||
@@ -785,7 +1306,7 @@ Persistent Program Suplied Icons
|
||||
|
||||
Application supplied icons are now stored, so that the dock will keep
|
||||
showing them after the app is exited. The icons are stored at
|
||||
~/GNUstep/.AppInfo/WindowMaker/
|
||||
~/GNUstep/Library/WindowMaker/CachedPixmaps
|
||||
|
||||
|
||||
Sound support
|
||||
|
||||
265
README
265
README
@@ -5,7 +5,6 @@
|
||||
X11 Window Manager
|
||||
|
||||
<http://windowmaker.org>
|
||||
<ftp://ftp.windowmaker.org>
|
||||
|
||||
by
|
||||
|
||||
@@ -13,9 +12,6 @@
|
||||
|
||||
Dan Pascu
|
||||
|
||||
Matthew Hawkins
|
||||
|
||||
]d
|
||||
|
||||
|
||||
Web/FTP Master
|
||||
@@ -44,25 +40,25 @@
|
||||
Description
|
||||
===========
|
||||
|
||||
Window Maker is the GNU window manager for the X Window System. It was
|
||||
designed to emulate the look and feel of part of the NEXTSTEP(tm) GUI. It's
|
||||
supposed to be relatively fast and small, feature rich, easy to configure and
|
||||
easy to use, with a simple and elegant appearance borrowed from NEXTSTEP(tm).
|
||||
Window Maker is the GNU window manager for the X Window System. It was designed
|
||||
to emulate the look and feel of part of the NEXTSTEP(tm) GUI. It's supposed to
|
||||
be relatively fast and small, feature rich, easy to configure and easy to use,
|
||||
with a simple and elegant appearance borrowed from NEXTSTEP(tm).
|
||||
|
||||
Window Maker was designed keeping integration with GNUstep in mind and is the
|
||||
"official" window manager for it. It is also part of the GNU project
|
||||
(www.gnu.org) Read more about GNUstep further on this file.
|
||||
|
||||
Hints (information given by applications to integrate well with the window
|
||||
manager) for Motif(tm), OPEN LOOK(tm), KDE and GNOME are also supported.
|
||||
So you can replace any of the window managers for these environments
|
||||
with Window Maker while keeping most, if not all, of the native window manager
|
||||
functionality.
|
||||
manager) for Motif(tm) and NETWM are also supported (NETWM is used by KDE and
|
||||
GNOME, so they are automatically supported as a result). So you can replace any
|
||||
of the window managers for these environments with Window Maker while keeping
|
||||
most, if not all, of the native window manager functionality.
|
||||
|
||||
Window Maker was previously called WindowMaker.
|
||||
|
||||
Window Maker has no connection with Windowmaker, the software for
|
||||
making windows and doors.
|
||||
Window Maker has no connection with Windowmaker, the software for making windows
|
||||
and doors.
|
||||
|
||||
|
||||
Documentation
|
||||
@@ -74,8 +70,8 @@ Read before asking.
|
||||
in the directories.
|
||||
|
||||
* INSTALL has installation instructions and some troubleshooting tips.
|
||||
You're meant to read it before installing. it was not written just to
|
||||
fill up space in the package...
|
||||
You're meant to read it before installing. it was not written just to fill up
|
||||
space in the package.
|
||||
|
||||
* FAQ: Frequently Asked Questions. READ IT!!! FAQ.I18N is for
|
||||
internationalization related questions.
|
||||
@@ -83,22 +79,23 @@ internationalization related questions.
|
||||
* NEWS: list user visible changes from the previous version. Read it if
|
||||
you are upgrading.
|
||||
|
||||
* MIRRORS: some alternative places where you can get Window Maker,
|
||||
including platform specific packages of Window Maker.
|
||||
|
||||
* BUGFORM: use it to send bug reports. Please do use it.
|
||||
|
||||
* ChangeLog: what changed from the previous version?
|
||||
|
||||
* BUGS: list of known bugs
|
||||
|
||||
*** Tutorial
|
||||
|
||||
There's a tutorial maintained by Georges Tarbouriech at:
|
||||
|
||||
http://www.linuxfocus.org/~georges.t/
|
||||
|
||||
|
||||
*** User Guide
|
||||
|
||||
The Window Maker User's Guide can be downloaded from the official ftp
|
||||
or web sites.
|
||||
It can also be viewed in HTML format in:
|
||||
http://people.delphi.com/crc3419/WMUserGuide/index.htm
|
||||
|
||||
The User Guide explains how to use Window Maker, the configuration files
|
||||
and options.
|
||||
@@ -121,8 +118,8 @@ way (not that the normal way is difficult, but...).
|
||||
* TODO: plans for the future
|
||||
|
||||
* contrib/ has some contributed patches that are not supported by Window Maker
|
||||
because they conflict with design filosophies of the developers or some
|
||||
other reason.
|
||||
because they conflict with design philosophies of the developers or some other
|
||||
reason.
|
||||
|
||||
* util/ has various utility programs.
|
||||
|
||||
@@ -145,137 +142,96 @@ HELP ME!!!
|
||||
==========
|
||||
|
||||
There is a mailing list for discussing Window Maker at
|
||||
wm-user@windowmaker.org To subscribe to it, send a message containing:
|
||||
subscribe
|
||||
in the subject of the message to wm-user-request@windowmaker.org
|
||||
wmaker-user@lists.windowmaker.org To subscribe to it, send a message to
|
||||
wmaker-user-subscribe@lists.windowmaker.info
|
||||
|
||||
If you got a problem, ask there (after reading the docs, of course). The
|
||||
people there is more likely to be able to answer your questions than we are.
|
||||
For bug reports use the BUGFORM.
|
||||
If you got a problem, ask there (after reading the docs, of course). The people
|
||||
there is more likely to be able to answer your questions than we are. For bug
|
||||
reports use the BUGFORM.
|
||||
|
||||
If you have a problem with a precompiled version of Window Maker
|
||||
(rpm, deb etc), first ask the person who made the package.
|
||||
If you have a problem with a precompiled version of Window Maker (rpm, deb etc),
|
||||
first ask the person who made the package.
|
||||
|
||||
IMPORTANT NOTE: when asking for help (in the mailing list or to the
|
||||
developerts, directly) *always* send information about the system you are
|
||||
using. You can use the system information section at the end of BUGFORM as a
|
||||
guideline. Another thing: please don't send HTML mail.
|
||||
IMPORTANT NOTE: when asking for help (in the mailing list or to the developerts,
|
||||
directly) *always* send information about the system you are using. You can use
|
||||
the system information section at the end of BUGFORM as a guideline. Another
|
||||
thing: please don't send HTML mail.
|
||||
|
||||
|
||||
There is also a #windowmaker IRC channel at openprojects. To join there,
|
||||
connect your irc client to irc.openprojects.net, irc.linux.com or some other
|
||||
server of that network.
|
||||
There is also a #windowmaker IRC channel at freenode. To join there, connect
|
||||
your irc client to irc.freenode.net. irc.windowmaker.org will direct you to the
|
||||
correct IRC network.
|
||||
|
||||
|
||||
GNUstep
|
||||
=======
|
||||
|
||||
GNUstep is a complete object-oriented development system, based on the
|
||||
OpenStep specification released by NeXT(tm) (now Apple(tm)) and Sun(tm). It
|
||||
will provide everything one needs to produce cross-platform, object-oriented,
|
||||
graphical (and non-graphical) applications; providing among other things,
|
||||
base system libraries, a high-level GUI application framework that uses a
|
||||
Display PostScript(tm)-like imaging model (DGS), objects for accessing
|
||||
relational databases, distributed objects and a graphical development
|
||||
environment, with tools like interface modeller, a project management system
|
||||
(project center) and other tools.
|
||||
GNUstep is a complete object-oriented development system, based on the OpenStep
|
||||
specification released by NeXT(tm) (now Apple(tm)) and Sun(tm). It will provide
|
||||
everything one needs to produce cross-platform, object-oriented, graphical (and
|
||||
non-graphical) applications; providing among other things, base system
|
||||
libraries, a high-level GUI application framework that uses a Display
|
||||
PostScript(tm)-like imaging model (DGS), objects for accessing relational
|
||||
databases, distributed objects and a graphical development environment, with
|
||||
tools like interface modeller, a project management system (project center) and
|
||||
other tools.
|
||||
|
||||
The GNUstep development system will be used to create a user environment,
|
||||
with everything needed for a complete graphical user interface, such as a
|
||||
file viewer, text editors and other applications. Note that the user
|
||||
environment (or "desktop environment") is only a small part of the whole
|
||||
GNUstep project and therefore it does not "compete" with other projects like
|
||||
KDE or GNOME, simply because they are completely different things.
|
||||
The GNUstep development system will be used to create a user environment, with
|
||||
everything needed for a complete graphical user interface, such as a file
|
||||
viewer, text editors and other applications. Note that the user environment (or
|
||||
"desktop environment") is only a small part of the whole GNUstep project and
|
||||
therefore it does not "compete" with other projects like KDE or GNOME, simply
|
||||
because they are completely different things.
|
||||
|
||||
For more information on the GNUstep project, visit: http://www.gnustep.org
|
||||
and http://gnustep.current.nu
|
||||
|
||||
|
||||
Running multiple instances of Window Maker
|
||||
==========================================
|
||||
|
||||
It is not a good idea to run more than one instance of Window Maker
|
||||
from the same user (so that wmaker will use the same configuration
|
||||
files) at the same time. You might get unexpected behaviour when Window Maker
|
||||
updates it's configuration files.
|
||||
from the same user (so that wmaker will use the same configuration files) at the
|
||||
same time. You might get unexpected behaviour when Window Maker updates it's
|
||||
configuration files.
|
||||
|
||||
If you really desire to do this, try running Window Maker with the
|
||||
command line option --static so that it will not update or change
|
||||
any of the configuration files.
|
||||
|
||||
Sound support
|
||||
=============
|
||||
|
||||
Sound is supported for Linux and FreeBSD systems with the use of a
|
||||
separately distributed module called WSoundServer. There is also a graphical
|
||||
configuration tool for setting up your sounds called WSoundPrefs.
|
||||
You can download these at:
|
||||
http://shadowmere.student.utwente.nl/
|
||||
|
||||
Note that you must compile Window Maker with the --enable-sound configure
|
||||
flag and set the DisableSound option to NO.
|
||||
|
||||
|
||||
OpenL**k support
|
||||
================
|
||||
|
||||
I guess many users, mainly from the academic world, have to use
|
||||
applications written using the OpenL**k toolkits, so having support
|
||||
for these apps must be of some use.
|
||||
|
||||
To enable, use --enable-openlook when doing the configure. Note that
|
||||
not everything is implemented.
|
||||
|
||||
Implemented stuff include decoration hints and the push-pin. Not implemented
|
||||
stuff include _SUN_WINDOW_STATE (the compose led state stuff), drag and drop
|
||||
interest stuff, header (not sure what's it) and footer strings.
|
||||
|
||||
Please give me feedback if something doesn't work. If the feature is
|
||||
already implemented, but is not working because of a bug, I'll try to
|
||||
have that fixed. If it's a non-implemented feature and you mention that
|
||||
it's important (ie: not just cosmetical), I'll consider implementing it.
|
||||
|
||||
The "out" state of the pushpin is emulated as a pushed-in close button.
|
||||
Just click on the button to make it pushed-out, which corresponds
|
||||
to the pinned-in state of the pushpin. If you push again in the pushed-out
|
||||
close button, it will act as a normal close button: it will close the window.
|
||||
If you really desire to do this, try running Window Maker with the command line
|
||||
option --static so that it will not update or change any of the configuration
|
||||
files.
|
||||
|
||||
|
||||
Performance Tuning
|
||||
==================
|
||||
|
||||
If you want to diminish Window Maker's memory usage and improve performance,
|
||||
while keeping a nice appearance and good functionality, follow the items
|
||||
bellow:
|
||||
while keeping a nice appearance and good functionality, follow the items bellow:
|
||||
|
||||
- use solid textures for everything, mainly titlebars and menus. If you
|
||||
want a nice looking desktop, use the Traditional style.
|
||||
- use solid textures for everything, mainly titlebars and menus. If you want a
|
||||
nice looking desktop, use the Traditional style.
|
||||
- turn NewStyle and Superfluous off
|
||||
- do not bind many shortcuts in the menu and keep only the essential items
|
||||
in the menu
|
||||
- do not bind many shortcuts in the menu and keep only the essential items in
|
||||
the menu
|
||||
- turn on DisableClip
|
||||
- edit wconfig.h and disable the NUMLOCK_HACK and the features you
|
||||
don't use anyway (keep in mind that some of the #defines might not
|
||||
work, as they are not fully supported). Make sure to always keep
|
||||
NumLock and ScrollLock turned off.
|
||||
- edit wconfig.h and disable the NUMLOCK_HACK and the features you don't use
|
||||
anyway (keep in mind that some of the #defines might not work, as they are not
|
||||
fully supported). Make sure to always keep NumLock and ScrollLock turned off.
|
||||
- turn on DisableAnimations. You can also #undefine ANIMATIONS in wconfig.h
|
||||
- strip down the default IconPath and PixmapPath entries to contain only
|
||||
the paths that you really have in your system.
|
||||
- do not use large images in the root background
|
||||
- remove support for image formats you don't use
|
||||
- to reduce memory usage, disable the icon cache, by setting the RIMAGE_CACHE
|
||||
environment variable to 0. If you want to increase performance at the cost
|
||||
of memory usage, set it's value to a value like the number of different
|
||||
icons you use.
|
||||
environment variable to 0. If you want to increase performance at the cost of
|
||||
memory usage, set it's value to a value like the number of different icons you
|
||||
use. Also, disable anti-aliased text support in ~/GNUstep/Defaults/WMGLOBAL.
|
||||
|
||||
|
||||
Keyboard Mouse Control
|
||||
======================
|
||||
|
||||
Many people ask about adding keyboard control of mouse, like in fvwm,
|
||||
but Window Maker will not have such feature. The XKB extension supports
|
||||
mouse simulation from the keyboard, in a much more powerfull fashion than
|
||||
any simulation done by a window manager.
|
||||
Many people ask about adding keyboard control of mouse, like in fvwm, but Window
|
||||
Maker will not have such feature. The XKB extension supports mouse simulation
|
||||
from the keyboard, in a much more powerfull fashion than any simulation done by
|
||||
a window manager.
|
||||
|
||||
To enable it, hit the Control+Shift+NumLock or Shift+NumLock key combination.
|
||||
You should hear the speaker beeping. To disable it, do the same thing.
|
||||
@@ -303,22 +259,27 @@ milleage may vary.
|
||||
How to make a gdb backtrace
|
||||
===========================
|
||||
|
||||
Backtraces can help us fix bugs that make Window Maker crash. If you
|
||||
find a bug that crashes Window Maker, please send a backtrace with your
|
||||
bug report.
|
||||
Backtraces can help us fix bugs that make Window Maker crash. If you find a bug
|
||||
that crashes Window Maker, please send a backtrace with your bug report.
|
||||
|
||||
To make a usefull backtrace, you need a core file with debugging
|
||||
information produced by Window Maker when it crashes. It should
|
||||
have been installed without stripping too. If you
|
||||
get the dialog window telling you that wmaker crashed and asks you
|
||||
what to do, tell it to "Abort and leave a core file".
|
||||
To make a usefull backtrace, you need a core file with debugging information
|
||||
produced by Window Maker when it crashes. It should have been installed without
|
||||
stripping too.
|
||||
|
||||
To compile wmaker with debugging information:
|
||||
|
||||
./configure
|
||||
make CFLAGS=-g
|
||||
|
||||
If you get the dialog window telling you that wmaker crashed and asks you what
|
||||
to do, tell it to "Abort and leave a core file".
|
||||
|
||||
script
|
||||
cd src
|
||||
gdb .libs/wmaker path_to_the_core_file
|
||||
|
||||
Then, in the gdb prompt type "bt". Quit from gdb by typing "quit"
|
||||
and then, in the shell prompt, type "exit".
|
||||
Then, in the gdb prompt type "bt". Quit from gdb by typing "quit" and then, in
|
||||
the shell prompt, type "exit".
|
||||
|
||||
The file named typescript will contain the backtrace.
|
||||
|
||||
@@ -327,20 +288,19 @@ The file named typescript will contain the backtrace.
|
||||
Copyrights & Disclaimers
|
||||
========================
|
||||
|
||||
Window Maker is copyrighted by Alfredo K. Kojima and is licensed through the
|
||||
GNU General Public License. Read the COPYING file for the complete license.
|
||||
Window Maker is copyrighted by Alfredo K. Kojima and is licensed through the GNU
|
||||
General Public License. Read the COPYING file for the complete license.
|
||||
|
||||
The icons that are distributed with this program and were made by Marco van
|
||||
Hylckama Vlieg, are licensed through the GNU General Public License. Read the
|
||||
COPYING file for the complete license.
|
||||
|
||||
The icons listed in COPYING.WTFPL and are distributed in this
|
||||
program and were made by Banlu Kemiyatorn (]d), are licensed through the
|
||||
"do What The Fuck you want to Public License". Read the COPYING.WTFPL
|
||||
file for the complete license.
|
||||
The icons listed in COPYING.WTFPL and are distributed in this program and were
|
||||
made by Banlu Kemiyatorn (]d), are licensed through the "do What The Fuck you
|
||||
want to Public License". Read the COPYING.WTFPL file for the complete license.
|
||||
|
||||
NeXT, OpenStep and NEXTSTEP are a trademarks of NeXT Computer, Inc.
|
||||
All other trademarks are property of their respective owners.
|
||||
NeXT, OpenStep and NEXTSTEP are a trademarks of NeXT Computer, Inc. All other
|
||||
trademarks are property of their respective owners.
|
||||
|
||||
The authors reserve the right to make changes in the software without prior
|
||||
notice.
|
||||
@@ -349,42 +309,19 @@ notice.
|
||||
Authors
|
||||
=======
|
||||
|
||||
Alfredo K. Kojima <kojima@windowmaker.org>
|
||||
Dan Pascu <dan@windowmaker.org>
|
||||
Matt Hawkins <matt@windowmaker.org>
|
||||
]d <id@windowmaker.org>
|
||||
Alfredo K. Kojima <kojima@windowmaker.info>
|
||||
Dan Pascu <dan@windowmaker.info>
|
||||
]d <id@windowmaker.info>
|
||||
|
||||
Please don't ask us questions before reading the documentation (esp. the
|
||||
FAQ, this file and INSTALL files) and about "cool" things you see in
|
||||
people's desktop screenshots.
|
||||
Please don't ask us questions before reading the documentation (esp. the FAQ,
|
||||
this file and INSTALL files) and about "cool" things you see in people's desktop
|
||||
screenshots.
|
||||
|
||||
|
||||
The AUTHORS file contains a list of the people who have contributed to the
|
||||
project. The name of people who have helped with localization (translation)
|
||||
can be found in po/README and Window Maker/README
|
||||
project. The name of people who have helped with localization (translation) can
|
||||
be found in po/README and Window Maker/README
|
||||
|
||||
If you have any comments, fixes and bug reports (filled BUGFORMs) send them
|
||||
to developers@windowmaker.org
|
||||
|
||||
|
||||
|
||||
|
||||
Musicware
|
||||
=========
|
||||
|
||||
If you use Window Maker and *really* like it, please consider making my day
|
||||
by sending me a music CD (or a MiniDisc or even a MP3 CDR) of your favorite
|
||||
band, singer, instrumentist, composer or whatever :^). I like listening to
|
||||
music and would love to get new CDs, especially from other parts of the
|
||||
world. I like almost any kind of music, from Ozzy Osbourne to Bach (mas não
|
||||
pagode e sertanejo pelamordideus :), so I will be happy to receive just about
|
||||
anything.
|
||||
|
||||
Snail mail address:
|
||||
|
||||
Alfredo Kengi Kojima
|
||||
Rua Firmino O. Bimbi, 255/25B
|
||||
Porto Alegre - RS
|
||||
CEP 91751-330
|
||||
Brazil
|
||||
to wmaker-dev@lists.windowmaker.org
|
||||
|
||||
|
||||
53
README.GNOME
53
README.GNOME
@@ -1,53 +0,0 @@
|
||||
|
||||
Information on Using Window Maker with GNOME
|
||||
--------------------------------------------
|
||||
|
||||
|
||||
Status of GNOME support
|
||||
-----------------------
|
||||
|
||||
|
||||
GNOME window manager protocols seem to be a work in progress.
|
||||
Things still change fairly frequently, so, the stuff implemented
|
||||
may not reflect the latest protocol. If something doesn't work,
|
||||
that's probably because the protocols have changed again and I still
|
||||
didn't have time to reimplement everything or noticed that it
|
||||
changed. If that happens, please tell me exactly what doesn't work.
|
||||
|
||||
Other than that, the so called "GNOME Window Manager Compliance - How to
|
||||
write a GNOME compliant Window Manager" document, says this:
|
||||
|
||||
"There are currently a set of other hints available that are, at the
|
||||
current time, not essential and therefore not documented here. It is,
|
||||
however envisaged that they will be finalized and added to this
|
||||
document, but for now are not needed."
|
||||
|
||||
Since they are non-essential and undocumented they are not yet implemented.
|
||||
|
||||
|
||||
Implemented stuff:
|
||||
|
||||
- GNOME window manager hints
|
||||
- Motif window manager hints
|
||||
|
||||
On the works:
|
||||
|
||||
- R6 style session management
|
||||
|
||||
|
||||
Compilation/Installation
|
||||
------------------------
|
||||
|
||||
To compile Window Maker with GNOME support, just configure it as:
|
||||
./configure --enable-gnome
|
||||
|
||||
before compiling.
|
||||
|
||||
Also, do not disable mwm hints support (they are enabled by default).
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
In WPrefs, go to the last section and toggle the "Disable miniwindows" option.
|
||||
|
||||
125
README.KDE
125
README.KDE
@@ -1,125 +0,0 @@
|
||||
|
||||
|
||||
Information on Using Window Maker with KDE
|
||||
------------------------------------------
|
||||
|
||||
|
||||
Window Maker supports almost all KDE/KWM specific client
|
||||
communication protocols, so you can simply replace kwm with
|
||||
Window Maker, if you think these advantages are worthy:
|
||||
|
||||
Window Maker KWM
|
||||
=============================================================================
|
||||
Looks NEXTSTEP(tm)/NEXTSTEP(tm) Original, but reminds
|
||||
enhanced Windows(tm)
|
||||
|
||||
Decoration solid, gradient, multi-color solid, vertical and
|
||||
Textures gradient, pixmaps, textured horizontal gradient,
|
||||
gradient - all gradients are pixmap
|
||||
supported in horizontal,
|
||||
vertical and diagonal
|
||||
directions
|
||||
|
||||
Configurable No Yes, but not totally
|
||||
Titlebar Buttons
|
||||
|
||||
Mini CLI Yes, but limited Yes
|
||||
|
||||
Window Specific Yes In KDE 1.1, yes.
|
||||
Configuration In KDE 1.0, no.
|
||||
|
||||
Quick Keyboard Yes In KDE 1.1, yes
|
||||
Navigation In KDE 1.0, no.
|
||||
|
||||
Pager KDE pagers will work as Yes
|
||||
well as GNOME pagers
|
||||
|
||||
Session Not yet supported, but Yes, old (pre-X11R6) style
|
||||
Management X11R6 style SM is being worked.
|
||||
|
||||
Dock kpanel, GNOME panel and Dock kpanel
|
||||
|
||||
Built-in Yes No
|
||||
krootbgwm
|
||||
|
||||
GNOME support Yes No
|
||||
|
||||
Memory Usage(1) 1.85Mb In KDE 1.0, 3.13Mb
|
||||
In KDE 1.1, probably more
|
||||
|
||||
|
||||
(1) Memory usage was tested by running wmaker and kwm at the same machine
|
||||
with the same windows, on the same screen and similar window texture
|
||||
configurations (at different times, of course). I looked in the output of
|
||||
ps -m, in the SIZE field, right after starting the window managers.
|
||||
|
||||
|
||||
|
||||
Enabling KDE Support
|
||||
--------------------
|
||||
|
||||
To enable KDE support in Window Maker, you must compile it after
|
||||
configuring it as follows:
|
||||
./configure --enable-kde
|
||||
|
||||
Then, just replace kwm with wmaker in your startkde script.
|
||||
If you are going to use Window Makers sound server, comment out
|
||||
kwmsound in startkde. Also if wmaker sets your root window
|
||||
background, comment out kbgndwm, kde's wallpaper setter.
|
||||
|
||||
Make sure to disable workspace background setting in KDE. If you
|
||||
wont be using Window Maker themes anyway, you can set
|
||||
WorkspaceBack = (none);
|
||||
|
||||
in ~/GNUstep/Defaults/WindowMaker
|
||||
|
||||
|
||||
Enhancing Integration
|
||||
---------------------
|
||||
|
||||
Window Maker adds some extensions to KDE's messaging stuff, so you can run
|
||||
Window Maker specific commands from places like kpanel, krootwm or even
|
||||
kwmcom. Recently KDE developers have kindly added support for these extensions
|
||||
in the more recent KDE versions from CVS. The added stuff are the following
|
||||
kwm like commands:
|
||||
|
||||
wm:wmaker - select Window Maker support mode
|
||||
wmaker:info - show info panel
|
||||
wmaker:legal - show legal panel
|
||||
wmaker:arrangeIcons - arrange icons
|
||||
wmaker:showAll - show all windows
|
||||
wmaker:hideOthers - hide others
|
||||
wmaker:restart - restart wmaker
|
||||
wmaker:exit - exit wmaker
|
||||
|
||||
You can test them with kwmcom, like:
|
||||
kwmcom wmaker:info
|
||||
|
||||
|
||||
Problems
|
||||
--------
|
||||
|
||||
* kpanel will not be kept always on top. That's because kpanel is an
|
||||
OverrideRedirect window, so Window Maker can't do anything about that.
|
||||
|
||||
Before requesting for a hack to work around that in Window Maker, please
|
||||
request the kpanel author to fix it.
|
||||
|
||||
* because the KDE protocol for letting the window manager know the usable
|
||||
window region is broken, you might find some problems with the window
|
||||
positioning/maximization code and kpanel's position.
|
||||
|
||||
* It seems kpanel (and maybe KDE in general) doesn't like dynamically
|
||||
changing the number of workspaces. So, don't create or destroy workspaces
|
||||
while running on KDE, unless you really need.
|
||||
|
||||
* If kpanel, kwmpager or kpager becomes confused about the number of
|
||||
windows present, restart them.
|
||||
|
||||
* Wmaker opens windows by default under/over the panel, when the panel is
|
||||
at top or left of screen. Use the GUI configuration tool WPrefs to change
|
||||
this.
|
||||
|
||||
* Some commands, such as cascade windows and rearrange windows are not
|
||||
yet implemented.
|
||||
|
||||
@@ -1,67 +1,78 @@
|
||||
# README.definable-cursor: How to use definable-cursor patch for Window Maker
|
||||
# created 1999-Apr-24 14:53 jmk
|
||||
# autodate: 1999-Apr-24 16:29
|
||||
|
||||
__________________________________________________
|
||||
|O| Definable Mouse Cursors for Window Maker |X|
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The definable-cursor patch for Window Maker
|
||||
<http://www.windowmaker.org/> allows user-definable mouse cursors; the
|
||||
Definable Mouse Cursors for Window Maker
|
||||
----------------------------------------
|
||||
|
||||
The definable-cursor feature allows user-definable mouse cursors; the
|
||||
cursors can either be the built-in ones from the X11 cursor font, or
|
||||
they can be bitmap (XBM) files. User-definable cursors can be useful
|
||||
for theme-builders, lefthanders, and the visually impaired.
|
||||
|
||||
This README describes how to apply the patch to Window Maker and how to
|
||||
use the features it enables.
|
||||
|
||||
____________________________
|
||||
|O| Applying the Patch |X|
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Defining Your Own Cursors
|
||||
-------------------------
|
||||
|
||||
The definable-cursor patch is available from
|
||||
<http://www.pobox.com/~jmknoble/WindowMaker/patches/>.
|
||||
|
||||
To apply the patch, do the following (where `XX' is the version of
|
||||
Window Maker you're patching):
|
||||
|
||||
(0) gzip -dc WindowMaker-XX.tar.gz | tar -xvf -
|
||||
|
||||
(1) cd ./WindowMaker-XX
|
||||
|
||||
(2) patch </wherever/you/put/WindowMaker-XX-definable-cursor.patch
|
||||
|
||||
(3) Build Window Maker according to the instructions in the
|
||||
accompanying `INSTALL' file.
|
||||
|
||||
___________________________________
|
||||
|O| Defining Your Own Cursors |X|
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A cursor specification is one of:
|
||||
A cursor specification takes one of the following forms in the
|
||||
~/GNUstep/Defaults/WindowMaker file:
|
||||
|
||||
(none)
|
||||
(builtin, <cursor-name>)
|
||||
(bitmap, <bitmap-filename>, <mask-filename>)
|
||||
|
||||
where <cursor-name> uses the same syntax as for `xsetroot -cursor_name',
|
||||
and <bitmap-filename> and <mask-filename> are the same as for
|
||||
`xsetroot -cursor'; <bitmap-filename> and <mask-filename> are searched
|
||||
for along WM's PixmapPath. If you use `(none)', the cursor will be
|
||||
inherited from the parent window (which often ends up being the root
|
||||
window).
|
||||
They have the following meanings:
|
||||
|
||||
none The cursor is inherited from the parent window (often,
|
||||
this means the root window).
|
||||
|
||||
builtin Use the cursor named <cursor-name> from X11's set of
|
||||
built-in cursors. The names are the same as you use
|
||||
with 'xsetroot -cursor_name'. See the xsetroot(1) man
|
||||
page for more information.
|
||||
|
||||
bitmap Use the bitmap in <bitmap-filename> as the foreground
|
||||
cursor bitmap, and the one in <mask-filename> as the
|
||||
background (mask) bitmap. This is pretty much the same
|
||||
as 'xsetroot -cursor', except that Window Maker searches
|
||||
for the bitmaps along its PixmapPath.
|
||||
|
||||
You can set the following cursor types (they're shown here with their
|
||||
defaults):
|
||||
|
||||
NormalCursor = (builtin, left_ptr);
|
||||
ArrowCursor = (builtin, top_left_arrow);
|
||||
MoveCursor = (builtin, fleur);
|
||||
ResizeCursor = (builtin, sizing);
|
||||
TopLeftResizeCursor = (builtin, top_left_corner);
|
||||
TopRightResizeCursor = (builtin, top_right_corner);
|
||||
BottomLeftResizeCursor = (builtin, bottom_left_corner);
|
||||
BottomRightResizeCursor = (builtin, bottom_right_corner);
|
||||
VerticalResizeCursor = (builtin, sb_v_double_arrow);
|
||||
HorizontalResizeCursor = (builtin, sb_h_double_arrow);
|
||||
WaitCursor = (builtin, watch);
|
||||
QuestionCursor = (builtin, question_arrow);
|
||||
TextCursor = (builtin, xterm);
|
||||
SelectCursor = (builtin, cross);
|
||||
|
||||
______________________
|
||||
|O| Random Notes |X|
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
The following cursor types are allowed, but they're deprecated (Window
|
||||
Maker used them in the past, but doesn't use them anymore):
|
||||
|
||||
ResizeCursor = (builtin, sizing);
|
||||
|
||||
|
||||
Using Cursors with 'getstyle' and 'setstyle'
|
||||
--------------------------------------------
|
||||
|
||||
The 'getstyle' and 'setstyle' style/theme-management utilities can
|
||||
handle user-definable cursors. By default, 'getstyle' ignores cursor
|
||||
definitions; using 'getstyle -t' to get theme-related settings will
|
||||
also include any cursors you've defined in the resulting stylefile.
|
||||
|
||||
However, by default, 'setstyle' does NOT ignore cursor settings. If
|
||||
you wish to set a style or theme without installing cursor settings,
|
||||
you can use 'setstyle --no-cursors' to ignore the cursor definitions.
|
||||
|
||||
|
||||
Random Notes
|
||||
------------
|
||||
|
||||
Most X11 cursors are 16x16 bitmaps. Many X servers can actually handle
|
||||
larger cursors, though. To check, use:
|
||||
@@ -75,12 +86,7 @@ and in the resulting output look for a line such as:
|
||||
The example above indicates that my X server can handle cursors up to
|
||||
64 pixels wide by 64 pixels high.
|
||||
|
||||
You can create your own bitmap cursors using the `bitmap' program that
|
||||
accompanies most X11 distributions. For example bitmap cursors, see
|
||||
<http://www.pobox.com/~jmknoble/WindowMaker/cursors/>.
|
||||
You can create your own bitmap cursors using the 'bitmap' program that
|
||||
accompanies most X11 distributions. For example bitmap cursors and
|
||||
masks, see <http://www.pobox.com/~jmknoble/WindowMaker/cursors/>.
|
||||
|
||||
For an example
|
||||
|
||||
--jim
|
||||
|
||||
%%%%%%%%%%%%%%% jim knoble %%%%%%%% jmknoble@pobox.com %%%%%%%%%%%%%%%%%
|
||||
|
||||
379
README.pt
379
README.pt
@@ -1,379 +0,0 @@
|
||||
|
||||
|
||||
GNU Window Maker
|
||||
Gerenciador de Janelas X11
|
||||
|
||||
<http://windowmaker.org>
|
||||
<ftp://ftp.windowmaker.org>
|
||||
|
||||
por
|
||||
|
||||
Alfredo K. Kojima
|
||||
|
||||
Dan Pascu
|
||||
|
||||
Matthew Hawkins
|
||||
|
||||
]d
|
||||
|
||||
|
||||
Web/FTP Master
|
||||
|
||||
Phillip Smith
|
||||
|
||||
|
||||
|
||||
Parabéns! Você acabou de adquirir um dispositivo muito
|
||||
bom que lhe proporcionaria milhares de anos de uso sem problemas,
|
||||
exceto por que, você, com vai certeza destruí-lo com algum procedimento
|
||||
idiota típico dos consumidores. Por isso nós pedimos POR FAVOR,
|
||||
PELO AMOR DE DEUS LEIA O MANUAL DO DONO COM MUITA ATENÇÃO ANTES
|
||||
DE DESEMBRULHAR O DISPOSITIVO. VOCÊ JÁ O DESEMPACOTOU, NÃO FOI?
|
||||
VOCÊ DESEMPACOTOU-O, CONECTOU-O, LIGOU-O E ENCHEU-O DE COISAS,
|
||||
E AGORA A SUA CRIANÇA, A MESMA CRIANÇA QUE UMA VEZ ENFIOU UMA
|
||||
SALSICHA NO SEU VIDEOCASSETE E APERTOU NO "FAST FORWARD", ESTA
|
||||
CRIANÇA ESTÁ BRINCANDO COM OS BOTÕES TAMBÉM CERTO? E SÓ AGORA VOCÊ
|
||||
ESTÁ COMEÇANDO A LER AS INSTRUÇÕES CERTO??? NÓS PODEMOS ENTÃO QUEBRAR
|
||||
ESTES DISPOSITIVOS NA FÁBRICA ANTES DE DESPACHÁ-LOS, VOCÊ
|
||||
SABIA DISSO?
|
||||
-- Dave Barry, "Read This First!"
|
||||
|
||||
|
||||
Descrição
|
||||
=========
|
||||
|
||||
O Window Maker é o gerenciador de janelas GNU para o X Window System. Ele foi
|
||||
desenvolvido para emular o visual e a sensação de parte da GUI NEXTSTEP(tm).
|
||||
Procura ser relativamente rápido e pequeno, rico em opções, fácil de
|
||||
configurar e usar, com uma aparência simples e elegante emprestada do
|
||||
NEXTSTEP(tm).
|
||||
|
||||
O Window Maker foi projetado tendo em mente a integração com o GNUStep e
|
||||
é o gerenciador de janelas "oficial" dele. É ainda parte do projeto GNU
|
||||
(www.gnu.org).
|
||||
Leia mais sobre o GNUstep neste arquivo.
|
||||
|
||||
Hints (informações dadas pelas aplicações para que se integrem bem com o
|
||||
gerenciador de janelas) para Motif(tm), OPEN LOOK(tm), KDE e GNOME também
|
||||
são suportados. Logo, você pode substituir os gerenciadores de janela desses
|
||||
ambientes pelo Window Maker e manter muito, senão toda a funcionalidade do
|
||||
gerenciador de janelas nativo.
|
||||
|
||||
O Window Maker antes se chamava WindowMaker.
|
||||
|
||||
O Window Maker não tem relação com o Windowmaker, o software para construção
|
||||
de janelas e portas.
|
||||
|
||||
|
||||
Documentação
|
||||
============
|
||||
|
||||
Leia antes de perguntar.
|
||||
|
||||
* Os arquivos README distribuídos por toda a árvore dos fontes contêm
|
||||
informações relacionadas ao conteúdo dos diretórios.
|
||||
|
||||
* O INSTALL possui instruções para instalação e algumas dicas quando há
|
||||
algum problema. Você deveria lê-lo antes da instalação. Ele não foi escrito
|
||||
somente para ocupar espaço no pacote...
|
||||
|
||||
* FAQ: Frequently Asked Questions. LEIA! O FAQ.I18N é sobre questões
|
||||
relacionadas à internacionalização.
|
||||
|
||||
* NEWS: lista as mudanças de uma versão para outra e que são visíveis ao
|
||||
usuário. Leia-o se você estiver fazendo uma atualização.
|
||||
|
||||
* MIRRORS: alguns locais alternativos onde você pode pegar o Window Maker,
|
||||
incluindo pacotes do Window Maker específicos para certas plataformas.
|
||||
|
||||
* BUGFORM: use-o para enviar relatos de bug. Use-o por favor.
|
||||
|
||||
* ChangeLog: o que foi mudado a partir da última versão?
|
||||
|
||||
* BUGS: lista dos bugs conhecidos
|
||||
|
||||
|
||||
*** Guia do Usuário
|
||||
|
||||
O Guia do Usuário Window Maker pode ser baixado do ftp oficial ou por
|
||||
sites web. Pode ser visto ainda no formato HTML no:
|
||||
http://people.delphi.com/crc3419/WMUserGuide/index.htm
|
||||
|
||||
O Guia do Usuário explica como usar o Window Maker, fala sobre os
|
||||
arquivos de configuração e as opções.
|
||||
|
||||
*** man pages
|
||||
|
||||
Digite "man wmaker" no prompt da shell para obter uma ajuda geral sobre
|
||||
o Window Maker.
|
||||
|
||||
|
||||
Diretórios & Arquivos na Árvore dos Fontes
|
||||
==========================================
|
||||
|
||||
* O Install é um script para configurar e compilar o Window Maker de
|
||||
um modo fácil (não que o modo normal seja difícil, mas...).
|
||||
|
||||
* AUTHORS: os créditos
|
||||
|
||||
* TODO: planos para o futuro
|
||||
|
||||
* O contrib/ possui alguns patches enviados e que não foram suportados
|
||||
pelo Window Maker por entrarem em conflito com a filosofia de projeto dos
|
||||
desenvolvedores ou por algum outro motivo.
|
||||
|
||||
* O util/ possui vários programas utilitários.
|
||||
|
||||
* O WPrefs.app/ é o programa de configuração.
|
||||
|
||||
* O src/wconfig.h possui opções de compilação que você pode mudar para
|
||||
selecionar algumas opções/aspectos e outras coisas mais.
|
||||
|
||||
* O WINGs/ é a biblioteca de widget NEXTSTEP lookalike
|
||||
|
||||
* A wrlib/ é a biblioteca de processamento de imagens
|
||||
|
||||
* O po/ possui catálogos de mensagens, que são versões traduzidas das
|
||||
mensagens mostradas pelo Window Maker
|
||||
|
||||
* A docklib-x.x.tar.gz é a biblioteca para desenvolvimento de dockapps
|
||||
|
||||
|
||||
SOCORRO!!!
|
||||
==========
|
||||
|
||||
Há uma lista de discussão para debate de questões sobre o Window Maker
|
||||
no wm-user@windowmaker.org. Para inscrever-se, mande uma mensagem
|
||||
contendo:
|
||||
subscribe
|
||||
no campo de assunto da mensagem para wm-user-request@windowmaker.org
|
||||
|
||||
Se você tiver algum problema, pergunte lá (somente depois de ter lido os
|
||||
documentos, é claro). As pessoas da lista estão mais preparadas para
|
||||
resolver o seu problema do que nós. Para relatar BUGS, use o BUGFORM.
|
||||
|
||||
Se você tiver problemas com uma versão pré-compilada do Window
|
||||
Maker (rpm, deb etc), primeiro questione a pessoa que criou o pacote.
|
||||
|
||||
NOTA IMPORTANTE: quando for pedir ajuda (seja na lista de discussão ou
|
||||
diretamente aos desenvolvedores) *sempre* envie informações sobre o sistema
|
||||
que você está usando. Você pode usar a seção system information no final
|
||||
do BUGFORM como guia. Outra coisa: não mande mensagens em HTML.
|
||||
|
||||
Há ainda o canal de IRC #windowmaker na EFNET. Para entrar lá, conecte
|
||||
seu cliente de irc no irc.concentric.net, irc.prison.net ou outro
|
||||
servidor dessa rede.
|
||||
|
||||
|
||||
GNUstep
|
||||
=======
|
||||
|
||||
O GNUstep é um completo sistema de desenvolvimento orientado a objetos,
|
||||
baseado na especificação OpenStep lançada pela NeXT(tm) (agora Apple(tm) e
|
||||
Sun(tm)). Ele irá fornecer tudo que é necessário para desenvolver aplicações
|
||||
orientadas a objetos, gráficas (e não gráficas), cross-platform; fornecendo,
|
||||
dentre outras coisas, bibliotecas bases do sistema, uma estrutura de alto
|
||||
nível para aplicações GUI que usa um modelo de imagens do tipo Display
|
||||
PostScript(tm), objetos para acesso a bancos de dados relacional, objetos
|
||||
distribuídos e um ambiente de desenvolvimento gráfico, com ferramentas como
|
||||
um modelador de interfaces, um projeto de gerenciamento de sistema (central
|
||||
de projetos) e outras ferramentas.
|
||||
|
||||
O sistema de desenvolvimento GNUstep será usado para criar um ambiente
|
||||
de usuário, com tudo necessário para uma interface gráfica, tais como
|
||||
visualizador de arquivos, editores de texto e outras aplicações. Note que o
|
||||
ambiente do usuário (ou "ambiente desktop") é somente uma pequena parte de
|
||||
todo o projeto GNUstep e não "compete" com projetos como o KDE e o GNOME,
|
||||
simplesmente por que eles são coisas completamente diferentes.
|
||||
|
||||
Para mais informação sobre o projeto GNUstep, visite http://www.gnustep.org
|
||||
e http://gnustep.current.nu
|
||||
|
||||
|
||||
Executando múltiplas instâncias do Window Maker
|
||||
===============================================
|
||||
|
||||
Não é uma boa idéia rodar mais de uma instância do Window Maker sob
|
||||
um mesmo usuário ao mesmo tempo (já que o wmaker usa os mesmos arquivos
|
||||
de configuração). Você pode obter comportamentos inesperados quando o
|
||||
Window Maker atualizar os seus arquivos de configuração.
|
||||
|
||||
|
||||
Suporte para som
|
||||
================
|
||||
|
||||
O Som é suportado nos sistemas Linux e FreeBSD com o uso de módulos
|
||||
distribuídos separadamente. Você pode baixá-los no:
|
||||
http://www.frontiernet.net/~southgat/wmsound
|
||||
|
||||
Observe que você deve compilar o Window Maker usando o configure com a
|
||||
flag --enable-sound e definindo a opção DisableSound para NO.
|
||||
|
||||
|
||||
Suporte ao OpenL**k
|
||||
===================
|
||||
|
||||
Acredito que muitos usuários, principalmente os do mundo acadêmico,
|
||||
tenham que usar aplicações escritas em toolkits OpenL**k, então o suporte
|
||||
para estes aplicativos deve ser de algum uso.
|
||||
|
||||
Para ativar, use o --enable-openlook quando rodar o configure. Note
|
||||
que nem tudo está implementado.
|
||||
|
||||
As opções implementadas incluem hints de decoração e o push-pin.
|
||||
Coisas não implementadas incluem _SUN_WINDOW_STATE (the compose led
|
||||
state stuff), coisas relacionadas ao "drag and drop", cabeçalho (não
|
||||
tenho certeza do que é) e o string footer.
|
||||
|
||||
Por favor me dêem retorno se algo não funcionar. Se a opção já está
|
||||
implementada, mas não está funcionando por causa de um bug, eu tentarei
|
||||
corrigí-la. Se é uma característica ainda não implementada e você mencionar
|
||||
que é importante (ie: não somente cosmética), eu considerarei a sua
|
||||
implementação.
|
||||
|
||||
O estado "out" do pushpin é emulado como um botão de fechar pressionado.
|
||||
Clique no botão para fazer com que ele fique despressionado, o que
|
||||
corresponde ao estado "pinned-in" do pushpin. Se você pressionar de novo
|
||||
o botão de fechar despressionado, ele vai agir como um botão de fechar
|
||||
normal: vai fechar a janela.
|
||||
|
||||
|
||||
Ajuste da Performance
|
||||
====================
|
||||
|
||||
Se você deseja diminuir o uso de memória pelo Window Maker, aumentar a
|
||||
performance, e ainda manter uma boa aparência e funcionalidade, siga os
|
||||
itens abaixo:
|
||||
|
||||
- use texturas sólidas para tudo, barras de títulos e menus. Se você quer
|
||||
um desktop com um belo visual, use o estilo "Traditional".
|
||||
- desligue o "NewStyle" e o "Superfluous"
|
||||
- não vincule muitos atalhos ao seu menu e guarde somente coisas essenciais
|
||||
no menu
|
||||
- ative o "DisableClip"
|
||||
- edite o wconfig.h e desative o NUMLOCK_HACK e as opções que você não
|
||||
usa mesmo (tenha em mente que alguns dos #defines podem não funcionar,
|
||||
já que eles não estão completamente suportados). Certifique-se de sempre
|
||||
manter o NumLock e o ScrollLock desligados.
|
||||
- ligue a opção "DisableAnimations". Você pode também usar o #undefine
|
||||
ANIMATIONS no arquivo config.h
|
||||
- verifique as entradas padrão "IconPath" e "PixmapPath" para que contenham
|
||||
somente os paths que você realmente possua no seu sistema.
|
||||
- não use imagens grandes no seu background root
|
||||
- remova o suporte para formatos de imagens que você não usa
|
||||
- para reduzir o uso de memória, desative o cache de ícones, definindo a
|
||||
variável de ambiente RIMAGE_CACHE para 0. Se você deseja melhorar o
|
||||
desempenho perdendo só um pouco de memória, defina essa variável para
|
||||
o valor correspondente ao número de ícones que você usa.
|
||||
|
||||
|
||||
Controle de Mouse pelo Teclado
|
||||
==============================
|
||||
|
||||
Muitas pessoas perguntam sobre adicionar o controle do mouse pelo teclado,
|
||||
como no fvwm, mas o Window Maker não possui tal opção. A extensão XKB
|
||||
suporta a simulação do mouse pelo teclado, de uma maneira muito mais
|
||||
poderosa do que qualquer outra simulação realizada por um gerenciador de
|
||||
janelas.
|
||||
|
||||
Para ativá-la, aperte a combinação Control+Shift+NumLock ou Shift+NumLock.
|
||||
Você deve então ouvir um beep. Para desativá-la, faça a mesma coisa.
|
||||
|
||||
Para controlar com o mouse, use as seguintes teclas do keypad:
|
||||
- 4 (seta esquerda), 7 (Home), 8 (seta para cima), 9 (PgUp), 6 (seta direita),
|
||||
3 (PgDn), 2 (seta para baixo) e 1 (End) move o mouse para as direções
|
||||
correspondentes;
|
||||
- segurar as teclas acima e depois segurar a tecla 5 vai fazer o ponteiro
|
||||
se mover mais rápido;
|
||||
- / vai selecionar o primeiro botão do mouse (botão esquerdo);
|
||||
- * vai selecionar o segundo botão do mouse (botão do meio);
|
||||
- - vai selecionar o terceiro botão do mouse (botão direito);
|
||||
- 5 vai fazer um clique com o botão do mouse que foi selecionado;
|
||||
- + vai fazer um duplo-clique com o botão do mouse que foi selecionado;
|
||||
- 0 (Ins) vai clicar e segurar o botão do mouse selecionado;
|
||||
- . (Del) vai liberar o botão do mouse selecionado que foi previamente
|
||||
clicado com a tecla 0 (Ins).
|
||||
|
||||
Os valores das teclas acima funcionam com um servidor X XFree86 3.2 (X11R6.1)
|
||||
mas nosso alcance pode variar.
|
||||
|
||||
|
||||
Como fazer um backtrace com o gdb
|
||||
=================================
|
||||
|
||||
Os backtraces nos ajudam a arrumar bugs que fazem com que o Window Maker
|
||||
trave. Se você achar um bug que trave o Window Maker, por favor envie o
|
||||
backtrace com o relato do bug.
|
||||
|
||||
Para fazer um backtrace útil, você precisa de um arquivo core
|
||||
com informações de depuração produzidas pelo Window Maker quando ele
|
||||
travar. O padrão do Window Maker é iniciar um outro gerenciador
|
||||
de janelas quando ele travar, o que não gerará um arquivo core. Você
|
||||
precisa editar o arquivo src/wconfig.h *depois* de ter rodado o configure
|
||||
e mudar a linha que se parece com o seguinte:
|
||||
|
||||
#undef NO_EMERGENCY_AUTORESTART
|
||||
|
||||
para:
|
||||
|
||||
#define NO_EMERGENCY_AUTORESTART
|
||||
|
||||
Depois, no diretório src, digite:
|
||||
make clean
|
||||
make CFLAGS=-g
|
||||
make install
|
||||
|
||||
e espere o Window Maker ser instalado.
|
||||
|
||||
Depois de instalado o Window Maker, inicie o X e reproduza o bug fazendo
|
||||
com que o Window Maker trave. Quando ele travar, vá até o diretório
|
||||
onde você compilou o wmaker e digite o seguinte comando na sua shell:
|
||||
|
||||
script
|
||||
cd src
|
||||
gdb .libs/wmaker path_ao_arquivo_core
|
||||
|
||||
Depois, no prompt do gdb, digite "bt". Saia do gdb digitando "quit"
|
||||
e depois no prompt da shell, digite "exit".
|
||||
|
||||
O arquivo chamado typescript conterá o backtrace.
|
||||
|
||||
|
||||
|
||||
Direitos Autorais & Disclaimers
|
||||
===============================
|
||||
|
||||
O Window Maker é registrado por Alfredo K. Kojima e é licenciado pela Licença
|
||||
Pública Geral GNU. Leia o arquivo COPYING para ler a licença completa.
|
||||
|
||||
Os ícones que são distribuídos com esse programa foram criados por Marco
|
||||
van Hylckama Vlieg são licenciados pela OpenContent License. Leia o
|
||||
arquivo COPYING.OPL para a licença completa.
|
||||
|
||||
NeXT, OpenStep e NEXTSTEP são marcas da NeXT Computer, Inc.
|
||||
Todas as outras marcas são propriedade dos respectivos donos.
|
||||
|
||||
Os autores se reservam no direito de fazer alterações no software sem
|
||||
qualquer aviso prévio.
|
||||
|
||||
|
||||
Autores
|
||||
=======
|
||||
|
||||
Alfredo K. Kojima <kojima@windowmaker.org>
|
||||
Dan Pascu <dan@windowmaker.org>
|
||||
]d <id@windowmaker.org>
|
||||
|
||||
Por favor não nos perguntem coisas antes de ler a documentação (o FAQ,
|
||||
este arquivo e os arquivos INSTALL), ou sobre coisas "legais" que você
|
||||
viu em screenshots de desktops.
|
||||
|
||||
O arquivo AUTHORS contem uma lista de pessoas que contribuíram com o projeto.
|
||||
O nome das pessoas que ajudaram com a tradução pode ser achado no po/README e
|
||||
Window Maker/README
|
||||
|
||||
Se você tem algum comentário, correção ou deseja relatar bugs (junto com
|
||||
o BUGFORM) mande-os para developers@windowmaker.org
|
||||
|
||||
|
||||
Traduzido por: Ricardo Sartori <sartori@inf.ufsc.br>
|
||||
24
TODO
24
TODO
@@ -7,14 +7,17 @@ Do ASAP:
|
||||
- fix RemakeStackList() to account for transient windows
|
||||
- blink border of clients with UrgencyHint set between red and black
|
||||
- finish session stuff
|
||||
- add multiline support for balloons
|
||||
- remove colors_per_channel stuff from wmaker after?
|
||||
+ finish the ability to browse for files/dirs in the WPrefs menu editor
|
||||
- check whether window states are being saved/restored properly via netwm
|
||||
on restart/crash-restart (grep for XXX/TODO)
|
||||
|
||||
Need to do:
|
||||
===========
|
||||
- put a "Do not save workspace state" in the exit confirmation dialog
|
||||
- figure out a better gnustep path for wprefs.app installation
|
||||
- impelment a generic pixmap type, which receives attributes
|
||||
(scaled/maxscaled/centered/tiled, smoothed, size/position, ...)
|
||||
- allow user to select/restore default root menu from wprefs
|
||||
- fix windoze cycle window patch
|
||||
- support for X11R6.4 extension for getting extra visual info in wrlib's
|
||||
automatic best context guessing
|
||||
- docklet to control AccessX (keyboard accessibility) functions
|
||||
@@ -22,12 +25,17 @@ Need to do:
|
||||
- add function to directly make a thumbnail of an image, using the
|
||||
functionality provided by the image libraries to load a minimal
|
||||
amount of data.
|
||||
+ investigate memory leaks
|
||||
- rewrite defaults/wdefaults stuff to use WINGs UD stuff. Search list:
|
||||
~/G/D/WindowMaker /u/l/s/W/D/WindowMaker built-in-defaults
|
||||
- remake internal string processing to use wchar? unicode?
|
||||
- add new file for stuff like default commands and dnd commands for
|
||||
docked apps, balloons for the dock etc
|
||||
- check whether apps with name.class set to empty strings should be treated
|
||||
like if name.class is NULL.NULL
|
||||
- review the defaults handling code (not to reread after we update a
|
||||
domain if possible, check WINGs apps updating WMWindowAttributes after
|
||||
start making screen to flash on update)
|
||||
|
||||
|
||||
Maybe some day:
|
||||
===============
|
||||
@@ -41,7 +49,7 @@ Never: (so, dont even bother to ask)
|
||||
with 2 CPUs ;).
|
||||
- anything that requires the mouse pointer to be jumped by WindowMaker to
|
||||
somewhere. This is *terrible* behaviour. And it's not just IMO.
|
||||
- rewrite to use Gtk... I wont even explain why...
|
||||
- rewrite to use Gtk... I wont even bother to explain why...
|
||||
|
||||
|
||||
- ICCCM 2.0: ICCCM 2.0 (not 1.0, which is what everybody supports so so) is
|
||||
@@ -54,3 +62,9 @@ sample implementation (twm?) it might be supported. Maybe dtwm supports
|
||||
it? I dont know...
|
||||
|
||||
|
||||
After 1.0.0 is released
|
||||
=======================
|
||||
- rework/redesign the appicon/dock/clip concept
|
||||
- maybe rewrite the main code in obj-c or c++
|
||||
- major clean up in theming/texturing stuff
|
||||
|
||||
|
||||
87
The-perfect-Window-Maker-patch.txt
Normal file
87
The-perfect-Window-Maker-patch.txt
Normal file
@@ -0,0 +1,87 @@
|
||||
____________
|
||||
Introduction
|
||||
------------
|
||||
|
||||
This short tutorial is meant to help you help me in the task
|
||||
of having a maintainable and bug-free Window Maker.
|
||||
|
||||
It assumes you have 'git' correctly installed and you have set
|
||||
the most basic configuration options via 'git config' (or by
|
||||
editing the $HOME/.gitconfig file yourself). See the end
|
||||
of this file for an example .gitconfig (which is the one
|
||||
I use).
|
||||
|
||||
You should probably by now have already cloned my repository,
|
||||
but here is how you can do it just in case:
|
||||
|
||||
# this is the preferred method (ie faster, native implementation)
|
||||
git clone git://repo.or.cz/wmaker-crm.git
|
||||
|
||||
# use the http method only if are behind a firewall which blocks git://
|
||||
git clone http://repo.or.cz/r/wmaker-crm.git
|
||||
|
||||
__________________________________
|
||||
How to submit patches the git way
|
||||
----------------------------------
|
||||
|
||||
Suppose you have a working copy of the git repo and you found
|
||||
a bug in Window Maker and you know how to fix it. This is
|
||||
what you can do to submit your patch in a way which will allow
|
||||
me to apply it quickly.
|
||||
|
||||
# Optional: Create a new branch (just to be safe in case you screw up)
|
||||
git checkout -b my-new-branch
|
||||
|
||||
Now you edit and save the files to fix the bug...
|
||||
|
||||
# Optional: Check what you did, review etc
|
||||
git diff
|
||||
|
||||
# if it looks good, commit your changes
|
||||
git commit -a
|
||||
|
||||
# git will pop up the editor which you configured in .gitconfig so
|
||||
# that you will be able to write a commit log. It will use the 'vi'
|
||||
# editor otherwise.
|
||||
|
||||
(write a _good_ and succinct commit log, explaining what you fixed etc)
|
||||
|
||||
# Prepare the patch to submit to the mailing-list. This step will create
|
||||
# a file named 0001-subject-of-your-patch.patch from the last commit
|
||||
# (use HEAD~2 if you want patches for the last 2 commits etc)
|
||||
git format-patch HEAD~1
|
||||
|
||||
After the above steps, you are ready to send the created .patch file
|
||||
to the mailing-list: wmaker-dev@lists.windowmaker.org
|
||||
|
||||
Just send it as-is, and I will be able to apply it with
|
||||
|
||||
# this is how I am going to apply your patch
|
||||
git am 0001-subject-of-your-patch.patch
|
||||
|
||||
and it will automatically append your commit to the repo, with the
|
||||
proper authorship, date, subject, commit log etc.
|
||||
|
||||
___________________
|
||||
Example .gitconfig
|
||||
-------------------
|
||||
|
||||
[user]
|
||||
name = Erwin Schrodinger
|
||||
email = schrodinger@gmail.com
|
||||
[core]
|
||||
editor = xjed
|
||||
[status]
|
||||
showUntrackedFiles = no
|
||||
[color]
|
||||
branch = auto
|
||||
status = auto
|
||||
diff = auto
|
||||
ui = auto
|
||||
[apply]
|
||||
whitespace = fix
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
Makefile Makefile.in
|
||||
fontl testcolorpanel testmywidget testnot wmfile wtest wmquery connect
|
||||
get-wings-flags get-wutil-flags
|
||||
.libs
|
||||
.psrc .inslog2 tca.map tca.log
|
||||
*.rpt
|
||||
304
WINGs/ChangeLog
304
WINGs/ChangeLog
@@ -1,3 +1,307 @@
|
||||
Changes since wmaker 0.92.0:
|
||||
............................
|
||||
|
||||
- updated the XDND code in to work with GDK based applications.
|
||||
WINGs based applications should now work with both KDE and GNOME
|
||||
applications (Sylvain Reynal <sreynal@nerim.net>)
|
||||
- better check for the XDND protocol version when interoperating with other
|
||||
applications. As it seems xdnd version 3 (which WINGs supports) and newer
|
||||
are not backward compatible with xdnd version 1 and 2. This is why WINGs
|
||||
applications cannot interoperate with GNUstep applications (which uses
|
||||
xdnd version 2). Xdnd version 4 and 5 are backwards compatible with
|
||||
version 3 though. (Sylvain Reynal <sreynal@nerim.net>)
|
||||
- removed dependency on rgb.txt from X11 and issues with locating it on the
|
||||
filesystem for different systems/distributions.
|
||||
- Removed dependency on rgb.txt (from X11) and issues with locating it on the
|
||||
filesystem for different systems/distributions.
|
||||
|
||||
|
||||
Changes since wmaker 0.80.1:
|
||||
............................
|
||||
|
||||
- Added WMSetConnectionShutdownOnClose()
|
||||
- Added an extra member to the ConnectionDelegate: canResumeSending
|
||||
see NEWS for details.
|
||||
- WMDrawString() and WMDrawImageString() now take WMColor instead of GC as
|
||||
arguments. WMDrawImageString() receives 2 colors (text & background).
|
||||
This is to allow easy extension for Xft/Xrender and hide X low level details
|
||||
Read NEWS for details since this will break backward compatibility.
|
||||
- Added alpha channel to WMColor. 2 new functions also:
|
||||
WMCreateRGBAColor() and WMSetColorAlpha()
|
||||
- Miscelaneous code cleanups in wtext.c
|
||||
- Added Xft2 support in WINGs (for drawing antialiased fonts with transparency).
|
||||
- New options in WMGLOBAL: AntialiasedText. Check NEWS for details.
|
||||
- Fixed some improper calls to snprintf in wfont.c
|
||||
- Added double buffering when drawing a WMFrame title with an antialiased font
|
||||
to avoid flickering.
|
||||
- Added double buffering when drawing WMList items to avoid flickering.
|
||||
Double buffering for list also works for user drawn lists. Read NEWS for
|
||||
details and incompatibilities introduced by this change.
|
||||
- Added WMGetColorAlpha(WMColor *color)
|
||||
- Better outline when drawing balloons.
|
||||
- Added WMCreateFontWithAttributes()
|
||||
- You can now pass "SystemFont", "BoldSystemFont", "SystemFont-##" or
|
||||
"BoldSystemFont-##", with ## being the font size to any font creating
|
||||
function to create a font with the (bold) system font font specification.
|
||||
- Added WMCopyFontWithChanges(). This is a more generic and powerful function
|
||||
meant to replaces the obsoleted WMEmphasizeFont(), WMNormalizeFont(),
|
||||
WMStrenghtenFont() and the other similar functions. To get the same effect
|
||||
you pass some predefined structs to it: WFANormal, WFABold, WFAEmphasized,
|
||||
etc which are declared in WINGs.h).
|
||||
- Fixed a bug with empty frame titles (Alexey Voinov <voins@voins.program.ru>)
|
||||
- Added WMGetWidgetBackgroundColor()
|
||||
- Code cleanup in wtext.c
|
||||
- Fixed a memory leak in wfontpanel.c
|
||||
- Fixed WMGetTextDefaultColor() not to retain the returned color. It returns
|
||||
only a reference to the internal color, which you shouldn't release
|
||||
- Added wstrndup()
|
||||
- Added WMGetFontName()
|
||||
- Added fontpanel callback
|
||||
- Added WMSetTableViewHasHorizontalScroller()
|
||||
- Fixed bug that could cause SIGSEGV by accessing beyond the end of text in
|
||||
a WINGs textfield widget.
|
||||
- Fixed small memory leak in the font panel code.
|
||||
- Fixed call to qsort in WMSortArray.
|
||||
- Fixed a memleak in the file panel.
|
||||
- Double/triple-click selection in text widgets
|
||||
(Vitaly Ovtchinnikov <ov@rbcmail.ru>)
|
||||
- Fixed bug in tableview (clicked row callback got incorrect row)
|
||||
(Carlos Torres <vlaadbrain@operamail.com>)
|
||||
- Fixed bug in resizing a scrollview
|
||||
- Fixed bug with wrong text wrapping (Alexey Voinov <voins@voins.program.ru>)
|
||||
- Added wmkrect()
|
||||
- Added xdnd v3 support (Sylvain Reynal <sreynal@nerim.net>)
|
||||
- Fixed and enhanced text wrapping.
|
||||
|
||||
|
||||
Changes since wmaker 0.80.0:
|
||||
............................
|
||||
|
||||
- fixed a bug in wfindfile() (rewrote wfindfile() with better logic).
|
||||
- separated the font caches for normal fonts and fontsets in WINGs (they can
|
||||
have the same names and collide in the cache giving unwanted results)
|
||||
- fixed labels not to display '\n' as a character if multiple '\n' are passed
|
||||
but just skip to the next line.
|
||||
- better warning when importing non-digit characters in PropList Data.
|
||||
- rewrote WMBox to use a WMArray for subviews. with this change fixed a bug
|
||||
about arranging subviews after removing one and a memleak occuring in the
|
||||
same case.
|
||||
- Fixed WMGetViewScreenPosition() to consider the window decorations.
|
||||
- Added ability to enable/disable individual WMTableViewItems.
|
||||
- Fixed textfields regarding interpretation of special keys with modifiers.
|
||||
- Fixed some functions that accept a boolean flag as a paramater, to set only
|
||||
1 or 0 for the flag value, not the flag passed by the user.
|
||||
- Added 2 functions to retrieve the default system fonts:
|
||||
WMDefaultSystemFont(WMScreen *scr) and WMDefaultBoldSystemFont(WMScreen *scr)
|
||||
- Added WMSetButtonImageDimsWhenDisabled() and WMGetButtonEnabled()
|
||||
- Cleaned-up the header files of functions/vars declared but not implemented
|
||||
- Added WMGetTextFieldDelegate()
|
||||
|
||||
|
||||
Changes since wmaker 0.70.0:
|
||||
............................
|
||||
|
||||
- added an internal strcasecmp() (only on systems where is not present)
|
||||
- removed some redundant includes of ../src/config.h when wconfig.h is
|
||||
included too
|
||||
- removed a wsyserror() message when reading a property list from file
|
||||
(the programmer should decide if to give that message or just ignore).
|
||||
- added a 'Bool recursive' flag to WMMergePLDictionaries()
|
||||
- added WMSubtractPLDictionaries()
|
||||
|
||||
|
||||
Changes since wmaker 0.65.0:
|
||||
............................
|
||||
|
||||
- fixed problem with WINGs based apps exiting with a "X_RotateProperties"
|
||||
related error when text was selected in a textfiled.
|
||||
- moved wstrdup(), wstrconcat() and wstrappend() from memory.c to string.c
|
||||
- added property list handling code making libPropList unnecessary and
|
||||
obsolete. Backward compatibility is provided through the
|
||||
WINGs/proplist-compat.h header file which has #defines from old libPropList
|
||||
function names to new function names with minimal changes. Read this
|
||||
header file and the NEWS file for more details about this subject.
|
||||
- Renamed WMGetUDAllKeys() to WMGetUDKeys()
|
||||
|
||||
|
||||
Changes since wmaker 0.64.0:
|
||||
............................
|
||||
|
||||
- made programmatic scroller changes send notifications
|
||||
- replaced WMSetBoxExpandsToParent with WMSetViewExpands...
|
||||
- added WMGetLabelFont()
|
||||
- added WMAddPersistentTimerHandler()
|
||||
- Moved all internal handlers (timer, idle and input) to handlers.c
|
||||
- simplified wevent.c and wutil.c.
|
||||
- fixed handling of input with poll (was broken)
|
||||
- fixed mem leak that occured when input handling was done with poll
|
||||
- simpler and more straightforward event handling for timer, idle, input
|
||||
and X events (also fixed some problems the old handling logic had)
|
||||
- moved timer, idle and input handler definitions and prototypes from
|
||||
WINGs.h to WUtil.h because they're not GUI related.
|
||||
- better and more robust handling of events (timer, idle, input, X) in
|
||||
WMMaskEvent(). Also fixed a bug where input and timer events were not
|
||||
treated for undefined periods of time under some circumstances.
|
||||
- fixed secure textfields not to allow text selection, to avoid compromising
|
||||
sensitive information by pasting it to a terminal.
|
||||
- replaced wmkrange(), wmkpoint() and wmksize() functions with macros.
|
||||
- added WMRemoveFromArrayMatching(array, match, cdata), which will remove the
|
||||
first element in the array that is matched by match(item, cdata)==True.
|
||||
- added WMArrayFirst(), WMArrayLast(), WMArrayNext() and WMArrayPrevious()
|
||||
functions and also WM_ITERATE_ARRAY() and WM_ETARETI_ARRAY() macros, to make
|
||||
interfaces to WMBag and WMArray similar and to make life a little simpler
|
||||
when iterating through all elements of an array.
|
||||
- replaced bags with arrays wherever appropriate. This will improve
|
||||
performance a bit.
|
||||
- replaced some recursive code with iterative code in selection.c
|
||||
- added WMCreateBlendedPixmapFromRImage()
|
||||
- small API change:
|
||||
1. Renamed WMSetApplicationIconImage(), WMGetApplicationIconImage() and
|
||||
WMSetWindowMiniwindowImage() to respectively WMSetApplicationIconPixmap(),
|
||||
WMGetApplicationIconPixmap() and WMSetWindowMiniwindowPixmap()
|
||||
They operate on a WMPixmap which is practically an X Pixmap with no alpha
|
||||
channel information and the new name is more suggestive and also leaves
|
||||
room for the new functions added for operating on images with alpha info.
|
||||
2. Added WMSetApplicationIconImage() and WMGetApplicationIconImage() which
|
||||
operate on an RImage and store alpha information too.
|
||||
3. Added WMCreateApplicationIconBlendedPixmap() which will take the image
|
||||
set by WMSetApplicationIconImage() and will combine it with a color.
|
||||
If color is NULL it will blend using the default panel color (#aeaaae)
|
||||
All these changes will allow WINGs to handle images with alpha blending
|
||||
correctly in panels and wherever else needed. More about in NEWS.
|
||||
- updated panels to use the newly available RImages if present and fallback
|
||||
to old WMPixmaps if not, to properly show alpha blended images.
|
||||
- replaced some still left malloc's with wmalloc's.
|
||||
- fixed a bug in WMReparentWidget()
|
||||
- added WMReparentWidget() to WINGs.h
|
||||
- fixed a bug that made the scroller knob jump backwards when dragged (this
|
||||
bug had no relation with the behavior that #define STRICT_NEXT_BEHAVIOUR
|
||||
attempts to accomplish).
|
||||
- fixed scrolling direction with mouse wheel for horizontal scroller.
|
||||
|
||||
|
||||
changes since wmaker 0.63.1:
|
||||
............................
|
||||
- added WMRunModalLoop() and WMBreakModalLoop()
|
||||
- added WMSetBoxExpandsToParent()
|
||||
- added WMRemoveBoxSubview()
|
||||
- moved WINGs headers in a WINGs subdirectory when installed.
|
||||
use #include <WINGs/header_file_name> in your application from now on.
|
||||
Also updated get-{wings|wutil}-flags.
|
||||
- Fixed a mem leak in WMList.
|
||||
- Fixed a bug that caused sigsegv for a WMList with more than 32767 items.
|
||||
- Added an example of how to create a server type program with WMConnection.
|
||||
- added WMOpenScreen()
|
||||
|
||||
|
||||
changes since wmaker 0.62.1:
|
||||
............................
|
||||
- added WRuler widget
|
||||
- added WText widget (rtf multiline text widget)
|
||||
Nwanua Elumeze <nwanua@colorado.edu>
|
||||
- added a new AUTO option for the UseMultiByte option
|
||||
- added WMRaiseWidget()/WMLowerWidget()
|
||||
- added missing EscapeTextMovement to textfield delegate/notification
|
||||
- added WMGetLabelText()
|
||||
- added WMReparentWidget()
|
||||
- added WMCreateTabViewItem()
|
||||
- added W_CreateUnmanagedTopView()
|
||||
- added wtokenjoin(), wtokensplit(), wtokenfree(), wtrimspace()
|
||||
- added WMWidgetIsMapped()
|
||||
- added WMSetApplicationIconWindow()
|
||||
- restructured the directory tree. Added Documentation, Examples and Tests
|
||||
subdirectories
|
||||
- removed WMArrayBag and reorganized WMTreeBag to be WMBag.
|
||||
- added WMArray class.
|
||||
- added WMSetWindowUserPosition()
|
||||
- added WMGetListSelectedItems()
|
||||
- added WMSetListAllowMultipleSelection(), WMListAllowsMultipleSelection().
|
||||
- added WMSetListAllowEmptySelection(), WMListAllowsEmptySelection().
|
||||
- WMListSelectionDidChangeNotification passes NULL as the notification
|
||||
client data (previously passed the selected item row).
|
||||
- added WMUnselectListItem(), WMSelectAllListItems(), WMUnselectAllListItems()
|
||||
- better behavior of wheel mices in WMList. Simple mouse wheel events
|
||||
will scroll by 1/3 of the WMList height. Using Shift as a modifier will
|
||||
scroll line by line, while using Control as a modifier will scroll page
|
||||
by page.
|
||||
- better behavior of WMScroller regarding mouse wheel events. 'Shift' modifier
|
||||
will scroll line by line, while 'Control' modifier will scroll page by page.
|
||||
- fixed some buffer overflow allowing bugs.
|
||||
- added WSDecrementWheel and WSIncrementWheel for handling mouse wheel in
|
||||
scrollers and scrolled widgets. This should be treated like the WSxxxPage
|
||||
counterparts, except it should scroll by page_size/3 instead of one full page
|
||||
- added WMSetBrowserAllowMultipleSelection(), WMSetBrowserAllowEmptySelection()
|
||||
WMBrowserAllowsMultipleSelection() and WMBrowserAllowsEmptySelection()
|
||||
- WMBrowser now allows multiple selections.
|
||||
- Added WMGetBrowserPaths() to retrieve the paths for browsers that allow
|
||||
multiple selections.
|
||||
- WMDestroyWidget() now calls WMUnmapWidget() first
|
||||
- added WMScrollerDidScrollNotification to scroller
|
||||
- added WMGetScrollViewVisibleRect()
|
||||
- fixed a mem leak in the browser code.
|
||||
- renamed wstrappend() to wstrconcat(). wstrconcat(str1, str2) concatenates
|
||||
str1 with str2 and returns that in a newly malloc'ed string.
|
||||
Be sure to rename wstrappend with wstrconcat in your code too, else
|
||||
hazardous things can happen!
|
||||
- implemented a new wstrappend() function. wstrappend(dst, src) will append
|
||||
src to dst modifing dst and returning a pointer to it. No new string is
|
||||
generated, except if dst is NULL, in which case its the same as calling
|
||||
wstrdup(src).
|
||||
dst can ONLY be NULL or a dynamically allocated string (obtained from a
|
||||
call to malloc, realloc, wmalloc, wrealloc, ...). dst CANNOT be a static
|
||||
or a constant string!
|
||||
- added wmessage() for printing a variable formatted string to stderr, with
|
||||
the program name prepended to it. Similar to wwarning(), except that it
|
||||
doesn't add "warning:" in the output message.
|
||||
- added WMBox widget
|
||||
- added WMAddTabViewItemWithView()
|
||||
- added W_SetViewCursor()
|
||||
- made Extra widgets library
|
||||
- added table widget in Extras library
|
||||
- added WMGetConnectionUnsentData() (WMGetConnectionQueuedData() too as an
|
||||
alias).
|
||||
- added WMSetConnectionCloseOnExec() to specify if the socket associated
|
||||
with a connection survives an exec* call or not. When a new connection is
|
||||
created using the WMCreate... or WMAcceptConnection() calls, it has the
|
||||
close on exec flag set automatically to 'True' by the library. Unless
|
||||
you want to let the socket of some connection to survive across an exec*
|
||||
call, you need not to call this function.
|
||||
- removed all the wsyserror() and wwarning() calls from host.c and
|
||||
connection.c and replaced where appropriate with assertions. If a function
|
||||
returns some invalid result, you can still get the system error message if
|
||||
you need, by calling wsyserrorwithcode() and passing WCErrorCode, if
|
||||
WCErrorCode > 0. If WCErrorCode==0, that is not a system error, and
|
||||
wsyserrorwithcode() should not be called in this case.
|
||||
- added WMNextHashEnumeratorKey() to retrieve all keys in some hash enumerator
|
||||
one by one.
|
||||
- fixed a bug with mouse wheels scrolling in scrollers even with the widget
|
||||
fully visible.
|
||||
- Fixed a memory leak (the destroy function for a view was never called and
|
||||
as a result the shaded windows didn't go away when closed. The non-shaded
|
||||
windows were unmapped on close but not destroyed either so they only
|
||||
apparently went away, but continued to use memory).
|
||||
- Fixed a bug in the hashtable code which free'd the whole item instead of
|
||||
just the item key in WMResetHashTable() (possible source of SIGSEGVs)
|
||||
|
||||
|
||||
changes since wmaker 0.62.0:
|
||||
............................
|
||||
- added WMSetWidgetDefaultFont(), WMSetWidgetDefaultBoldFont()
|
||||
|
||||
|
||||
|
||||
changes since wmaker 0.62.0:
|
||||
............................
|
||||
- added WM{S,G}etDataFormat()
|
||||
- added drag and drop
|
||||
- changed selection code
|
||||
- added clientdata to WMFindInBag
|
||||
- removed SetWindowInitialSize()
|
||||
- added SetWindowAspectRatio()
|
||||
- added initial timeout when establishing a connection.
|
||||
- added WMSetConnectionDefaultTimeout() and WMSetConnectionOpenTimeout();
|
||||
- added WMGetConnectionTimeoutState()
|
||||
|
||||
changes since wmaker 0.61.1:
|
||||
............................
|
||||
|
||||
|
||||
6
WINGs/Documentation/Makefile.am
Normal file
6
WINGs/Documentation/Makefile.am
Normal file
@@ -0,0 +1,6 @@
|
||||
## automake input file for WINGs - Documentation
|
||||
|
||||
AUTOMAKE_OPTIONS =
|
||||
|
||||
EXTRA_DIST =
|
||||
|
||||
40
WINGs/Examples/Makefile.am
Normal file
40
WINGs/Examples/Makefile.am
Normal file
@@ -0,0 +1,40 @@
|
||||
## automake input file for WINGs - Examples
|
||||
|
||||
AUTOMAKE_OPTIONS =
|
||||
|
||||
|
||||
noinst_PROGRAMS = connect server fontl puzzle colorpick
|
||||
|
||||
|
||||
LDADD= $(top_builddir)/WINGs/libWINGs.la $(top_builddir)/wrlib/libwraster.la \
|
||||
$(top_builddir)/WINGs/libWUtil.la \
|
||||
@XFTLIBS@ @INTLIBS@
|
||||
|
||||
colorpick_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la
|
||||
|
||||
fontl_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la
|
||||
|
||||
puzzle_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la
|
||||
|
||||
connect_DEPENDENCIES = $(top_builddir)/WINGs/libWUtil.la
|
||||
|
||||
connect_LDADD = $(top_builddir)/WINGs/libWUtil.la @LIBRARY_SEARCH_PATH@ @INTLIBS@
|
||||
|
||||
server_DEPENDENCIES = $(top_builddir)/WINGs/libWUtil.la
|
||||
|
||||
server_LDADD = $(top_builddir)/WINGs/libWUtil.la @LIBRARY_SEARCH_PATH@ @INTLIBS@
|
||||
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
|
||||
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @HEADER_SEARCH_PATH@ -DDEBUG
|
||||
|
||||
LIBTOOL = $(QUIET) $(SHELL) $(top_builddir)/libtool $(LIBTOOL_ARG)
|
||||
|
||||
.c.o:
|
||||
$(QUIET)$(COMPILE) -c $<
|
||||
|
||||
.c.obj:
|
||||
$(QUIET)$(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
$(QUIET)$(LTCOMPILE) -c -o $@ $<
|
||||
19
WINGs/Examples/README
Normal file
19
WINGs/Examples/README
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
|
||||
Files:
|
||||
-----
|
||||
|
||||
server - server example of using WMConnection. It keeps a database of
|
||||
timeouts for a group of users, allowing one to add/remove
|
||||
users and update the timeouts associated with them.
|
||||
|
||||
connect - client example of using WMConnection. Works with the server
|
||||
program above. Just start both without any parameter and
|
||||
type help in the client to find out how to operate them.
|
||||
Rest is self explanatory.
|
||||
|
||||
puzzle - a nice zuPzel =)
|
||||
|
||||
fontl - a map of all characters with their corresponding ascii,
|
||||
hex, decimal and octal representations.
|
||||
|
||||
39
WINGs/Examples/colorpick.c
Normal file
39
WINGs/Examples/colorpick.c
Normal file
@@ -0,0 +1,39 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <WINGs/WINGs.h>
|
||||
|
||||
void showSelectedColor(void *self, void *cdata)
|
||||
{
|
||||
WMColorPanel *panel = (WMColorPanel *) self;
|
||||
|
||||
printf("Selected Color: %s\n", WMGetColorRGBDescription(WMGetColorPanelColor(panel)));
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
Display *dpy;
|
||||
WMScreen *scr;
|
||||
|
||||
WMInitializeApplication("wmcolorpick", &argc, argv);
|
||||
|
||||
dpy = XOpenDisplay("");
|
||||
if (!dpy) {
|
||||
printf("could not open display\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
scr = WMCreateScreen(dpy, DefaultScreen(dpy));
|
||||
|
||||
{
|
||||
WMColorPanel *panel = WMGetColorPanel(scr);
|
||||
|
||||
WMSetColorPanelAction(panel, showSelectedColor, NULL);
|
||||
|
||||
WMShowColorPanel(panel);
|
||||
}
|
||||
|
||||
WMScreenMainLoop(scr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
97
WINGs/Examples/fontl.c
Normal file
97
WINGs/Examples/fontl.c
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* WINGs demo: font lister
|
||||
*
|
||||
* Copyright (c) 1998-2003 Alfredo K. Kojima
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <WINGs/WINGs.h>
|
||||
#include <WINGs/WUtil.h>
|
||||
|
||||
void wAbort()
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void show(WMWidget * self, void *data)
|
||||
{
|
||||
char buf[60];
|
||||
void *d;
|
||||
WMLabel *l = (WMLabel *) data;
|
||||
d = WMGetHangedData(self);
|
||||
sprintf(buf, "%i - 0x%x - 0%o", (int)d, (int)d, (int)d);
|
||||
WMSetLabelText(l, buf);
|
||||
}
|
||||
|
||||
void quit(WMWidget * self, void *data)
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
Display *dpy;
|
||||
WMWindow *win;
|
||||
WMScreen *scr;
|
||||
WMButton *lab, *l0 = NULL;
|
||||
WMLabel *pos;
|
||||
int x, y, c;
|
||||
char buf[20];
|
||||
|
||||
WMInitializeApplication("FontView", &argc, argv);
|
||||
|
||||
dpy = XOpenDisplay("");
|
||||
if (!dpy) {
|
||||
wfatal("cant open display");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
scr = WMCreateSimpleApplicationScreen(dpy);
|
||||
|
||||
win = WMCreateWindow(scr, "main");
|
||||
WMResizeWidget(win, 20 * 33, 20 + 20 * 9);
|
||||
WMSetWindowTitle(win, "Font Chars");
|
||||
WMSetWindowCloseAction(win, quit, NULL);
|
||||
pos = WMCreateLabel(win);
|
||||
WMResizeWidget(pos, 20 * 33, 20);
|
||||
WMMoveWidget(pos, 10, 5);
|
||||
|
||||
c = 0;
|
||||
for (y = 0; y < 8; y++) {
|
||||
for (x = 0; x < 32; x++, c++) {
|
||||
lab = WMCreateCustomButton(win, WBBStateLightMask);
|
||||
WMResizeWidget(lab, 20, 20);
|
||||
WMMoveWidget(lab, 10 + x * 20, 30 + y * 20);
|
||||
sprintf(buf, "%c", c);
|
||||
WMSetButtonText(lab, buf);
|
||||
WMSetButtonAction(lab, show, pos);
|
||||
WMHangData(lab, (void *)(uintptr_t) c);
|
||||
if (c > 0) {
|
||||
WMGroupButtons(l0, lab);
|
||||
} else {
|
||||
l0 = lab;
|
||||
}
|
||||
}
|
||||
}
|
||||
WMRealizeWidget(win);
|
||||
WMMapSubwidgets(win);
|
||||
WMMapWidget(win);
|
||||
WMScreenMainLoop(scr);
|
||||
return 0;
|
||||
}
|
||||
233
WINGs/Examples/puzzle.c
Normal file
233
WINGs/Examples/puzzle.c
Normal file
@@ -0,0 +1,233 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <WINGs/WINGs.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define MAX_SIZE 10*10
|
||||
|
||||
WMWindow *win;
|
||||
WMButton *Button[MAX_SIZE];
|
||||
signed char Map[MAX_SIZE];
|
||||
int Size = 4;
|
||||
int MoveCount;
|
||||
|
||||
#define MAP(x,y) Map[(x)+(y)*Size]
|
||||
|
||||
int WinSize = 120;
|
||||
|
||||
Bool CheckWin(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < Size * Size - 1; i++) {
|
||||
if (Map[i] != i)
|
||||
return False;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
void MoveButton(int button, int x, int y)
|
||||
{
|
||||
WMMoveWidget(Button[button], x * (WinSize / Size), y * (WinSize / Size));
|
||||
}
|
||||
|
||||
Bool SlideButton(int button)
|
||||
{
|
||||
int x = 0, y = 0, done = 0;
|
||||
|
||||
/* locate the button */
|
||||
for (y = 0; y < Size; y++) {
|
||||
for (x = 0; x < Size; x++) {
|
||||
if (MAP(x, y) == button) {
|
||||
done = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (done)
|
||||
break;
|
||||
}
|
||||
|
||||
if (x > 0 && MAP(x - 1, y) < 0) {
|
||||
MAP(x, y) = -1;
|
||||
MoveButton(button, x - 1, y);
|
||||
MAP(x - 1, y) = button;
|
||||
} else if (x < Size - 1 && MAP(x + 1, y) < 0) {
|
||||
MAP(x, y) = -1;
|
||||
MoveButton(button, x + 1, y);
|
||||
MAP(x + 1, y) = button;
|
||||
} else if (y > 0 && MAP(x, y - 1) < 0) {
|
||||
MAP(x, y) = -1;
|
||||
MoveButton(button, x, y - 1);
|
||||
MAP(x, y - 1) = button;
|
||||
} else if (y < Size - 1 && MAP(x, y + 1) < 0) {
|
||||
MAP(x, y) = -1;
|
||||
MoveButton(button, x, y + 1);
|
||||
MAP(x, y + 1) = button;
|
||||
} else {
|
||||
return False;
|
||||
}
|
||||
return True;
|
||||
}
|
||||
|
||||
#define SWAP(a,b) {int tmp; tmp=a; a=b; b=tmp;}
|
||||
|
||||
void ResetGame(void)
|
||||
{
|
||||
int i, x, y, ox, oy;
|
||||
|
||||
MoveCount = 0;
|
||||
|
||||
for (i = 0; i < Size * Size - 1; i++) {
|
||||
Map[i] = i;
|
||||
}
|
||||
Map[i] = -1;
|
||||
ox = x = Size - 1;
|
||||
oy = y = Size - 1;
|
||||
for (i = 0; i < 1000; i++) {
|
||||
int ok;
|
||||
ok = 1;
|
||||
switch (rand() % 4) {
|
||||
case 0:
|
||||
if (x > 0)
|
||||
x--;
|
||||
else
|
||||
ok = 0;
|
||||
break;
|
||||
case 2:
|
||||
if (x < Size - 1)
|
||||
x++;
|
||||
else
|
||||
ok = 0;
|
||||
break;
|
||||
case 1:
|
||||
if (y > 0)
|
||||
y--;
|
||||
else
|
||||
ok = 0;
|
||||
break;
|
||||
case 3:
|
||||
if (y < Size - 1)
|
||||
y++;
|
||||
else
|
||||
ok = 0;
|
||||
break;
|
||||
}
|
||||
if (ok) {
|
||||
MoveButton(MAP(x, y), ox, oy);
|
||||
|
||||
SWAP(MAP(ox, oy), MAP(x, y));
|
||||
|
||||
while (XPending(WMScreenDisplay(WMWidgetScreen(win)))) {
|
||||
XEvent ev;
|
||||
WMNextEvent(WMScreenDisplay(WMWidgetScreen(win)), &ev);
|
||||
WMHandleEvent(&ev);
|
||||
}
|
||||
ox = x;
|
||||
oy = y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void buttonClick(WMWidget * w, void *ptr)
|
||||
{
|
||||
char buffer[300];
|
||||
|
||||
if (SlideButton((uintptr_t)ptr)) {
|
||||
MoveCount++;
|
||||
|
||||
if (CheckWin()) {
|
||||
sprintf(buffer, "You finished the game in %i moves.", MoveCount);
|
||||
|
||||
if (WMRunAlertPanel(WMWidgetScreen(w), win, "You Won!", buffer,
|
||||
"Wee!", "Gah! Lemme retry!", NULL) == WAPRDefault) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
ResetGame();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void resizeObserver(void *self, WMNotification * notif)
|
||||
{
|
||||
WMSize size = WMGetViewSize(WMWidgetView(win));
|
||||
int x, y;
|
||||
|
||||
WinSize = size.width;
|
||||
for (y = 0; y < Size; y++) {
|
||||
for (x = 0; x < Size; x++) {
|
||||
if (MAP(x, y) >= 0) {
|
||||
WMResizeWidget(Button[(int)MAP(x, y)], WinSize / Size, WinSize / Size);
|
||||
WMMoveWidget(Button[(int)MAP(x, y)], x * (WinSize / Size), y * (WinSize / Size));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
Display *dpy;
|
||||
WMScreen *scr;
|
||||
int x, y, i;
|
||||
|
||||
WMInitializeApplication("Puzzle", &argc, argv);
|
||||
|
||||
dpy = XOpenDisplay("");
|
||||
if (!dpy) {
|
||||
printf("could not open display\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
scr = WMCreateScreen(dpy, DefaultScreen(dpy));
|
||||
|
||||
win = WMCreateWindow(scr, "puzzle");
|
||||
WMResizeWidget(win, WinSize, WinSize);
|
||||
WMSetWindowTitle(win, "zuPzel");
|
||||
WMSetWindowMinSize(win, 80, 80);
|
||||
WMSetWindowAspectRatio(win, 2, 2, 2, 2);
|
||||
WMSetWindowResizeIncrements(win, Size, Size);
|
||||
WMSetViewNotifySizeChanges(WMWidgetView(win), True);
|
||||
WMAddNotificationObserver(resizeObserver, NULL, WMViewSizeDidChangeNotification, WMWidgetView(win));
|
||||
|
||||
for (i = y = 0; y < Size && i < Size * Size - 1; y++) {
|
||||
for (x = 0; x < Size && i < Size * Size - 1; x++) {
|
||||
char buf[32];
|
||||
WMColor *color;
|
||||
RColor col;
|
||||
RHSVColor hsv;
|
||||
|
||||
hsv.hue = i * 360 / (Size * Size - 1);
|
||||
hsv.saturation = 120;
|
||||
hsv.value = 200;
|
||||
|
||||
RHSVtoRGB(&hsv, &col);
|
||||
|
||||
color = WMCreateRGBColor(scr, col.red << 8, col.green << 8, col.blue << 8, False);
|
||||
|
||||
MAP(x, y) = i;
|
||||
Button[i] = WMCreateButton(win, WBTMomentaryLight);
|
||||
WMSetWidgetBackgroundColor(Button[i], color);
|
||||
WMReleaseColor(color);
|
||||
WMSetButtonAction(Button[i], buttonClick, (void *)(uintptr_t) i);
|
||||
WMResizeWidget(Button[i], WinSize / Size, WinSize / Size);
|
||||
WMMoveWidget(Button[i], x * (WinSize / Size), y * (WinSize / Size));
|
||||
sprintf(buf, "%i", i + 1);
|
||||
WMSetButtonText(Button[i], buf);
|
||||
WMSetButtonTextAlignment(Button[i], WACenter);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
WMMapSubwidgets(win);
|
||||
WMMapWidget(win);
|
||||
WMRealizeWidget(win);
|
||||
|
||||
ResetGame();
|
||||
|
||||
WMScreenMainLoop(scr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
30
WINGs/Extras/Makefile.am
Normal file
30
WINGs/Extras/Makefile.am
Normal file
@@ -0,0 +1,30 @@
|
||||
## automake input file for WINGs
|
||||
|
||||
AUTOMAKE_OPTIONS =
|
||||
|
||||
# is this a kluge? if so, how should i do it?
|
||||
includedir = @includedir@/WINGs
|
||||
|
||||
include_HEADERS = wtableview.h wtabledelegates.h
|
||||
|
||||
|
||||
lib_LTLIBRARIES = libExtraWINGs.la
|
||||
|
||||
noinst_PROGRAMS = test
|
||||
|
||||
EXTRA_DIST =
|
||||
|
||||
libExtraWINGs_la_SOURCES = \
|
||||
wtableview.c \
|
||||
wtabledelegates.c \
|
||||
wtableview.h \
|
||||
wtabledelegates.h
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/WINGs \
|
||||
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @HEADER_SEARCH_PATH@ -DDEBUG
|
||||
|
||||
LDADD= $(top_builddir)/WINGs/libWINGs.la $(top_builddir)/wrlib/libwraster.la \
|
||||
$(top_builddir)/WINGs/libWUtil.la \
|
||||
@XFTLIBS@ @INTLIBS@
|
||||
|
||||
test_LDADD = wtableview.o wtabledelegates.o $(LDADD)
|
||||
124
WINGs/Extras/test.c
Normal file
124
WINGs/Extras/test.c
Normal file
@@ -0,0 +1,124 @@
|
||||
|
||||
#include <WINGs/WINGs.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include "wtableview.h"
|
||||
#include "wtabledelegates.h"
|
||||
|
||||
static char *col1[20] = { 0 };
|
||||
|
||||
static int col2[20];
|
||||
|
||||
static char *options[] = {
|
||||
"Option1",
|
||||
"Option2",
|
||||
"Option3",
|
||||
"Option4",
|
||||
"Option5"
|
||||
};
|
||||
|
||||
int numberOfRows(WMTableViewDelegate * self, WMTableView * table)
|
||||
{
|
||||
return 20;
|
||||
}
|
||||
|
||||
void *valueForCell(WMTableViewDelegate * self, WMTableColumn * column, int row)
|
||||
{
|
||||
/*WMTableView *table = (WMTableView*)WMGetTableColumnTableView(column); */
|
||||
int i;
|
||||
if (col1[0] == 0) {
|
||||
for (i = 0; i < 20; i++) {
|
||||
char buf[128];
|
||||
|
||||
sprintf(buf, "Test row %i", i);
|
||||
|
||||
col1[i] = wstrdup(buf);
|
||||
col2[i] = 0;
|
||||
}
|
||||
}
|
||||
if ((uintptr_t)WMGetTableColumnId(column) == 1)
|
||||
return col1[row];
|
||||
else
|
||||
return (void *)(uintptr_t) col2[row];
|
||||
}
|
||||
|
||||
void setValueForCell(WMTableViewDelegate * self, WMTableColumn * column, int row, void *data)
|
||||
{
|
||||
if ((uintptr_t)WMGetTableColumnId(column) == 1)
|
||||
col1[row] = data;
|
||||
else
|
||||
col2[row] = (uintptr_t) data;
|
||||
}
|
||||
|
||||
static WMTableViewDelegate delegate = {
|
||||
NULL,
|
||||
numberOfRows,
|
||||
valueForCell,
|
||||
setValueForCell
|
||||
};
|
||||
|
||||
void clickedTable(WMWidget * w, void *self)
|
||||
{
|
||||
int row = WMGetTableViewClickedRow((WMTableView *) self);
|
||||
|
||||
WMEditTableViewRow(self, row);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
WMScreen *scr;
|
||||
WMWindow *win;
|
||||
WMTableView *table;
|
||||
WMTableColumn *col;
|
||||
WMTableColumnDelegate *colDeleg;
|
||||
|
||||
WMInitializeApplication("test", &argc, argv);
|
||||
|
||||
scr = WMOpenScreen(NULL);
|
||||
|
||||
XSynchronize(WMScreenDisplay(scr), 1);
|
||||
|
||||
win = WMCreateWindow(scr, "eweq");
|
||||
WMResizeWidget(win, 400, 200);
|
||||
WMMapWidget(win);
|
||||
|
||||
table = WMCreateTableView(win);
|
||||
WMSetTableViewHasHorizontalScroller(table, 0);
|
||||
WMSetViewExpandsToParent(WMWidgetView(table), 10, 10, 10, 10);
|
||||
WMSetTableViewBackgroundColor(table, WMWhiteColor(scr));
|
||||
/*WMSetTableViewGridColor(table, WMGrayColor(scr)); */
|
||||
WMSetTableViewHeaderHeight(table, 20);
|
||||
WMSetTableViewDelegate(table, &delegate);
|
||||
WMSetTableViewAction(table, clickedTable, table);
|
||||
|
||||
colDeleg = WTCreateStringEditorDelegate(table);
|
||||
|
||||
col = WMCreateTableColumn("Group");
|
||||
WMSetTableColumnWidth(col, 180);
|
||||
WMAddTableViewColumn(table, col);
|
||||
WMSetTableColumnDelegate(col, colDeleg);
|
||||
WMSetTableColumnId(col, (void *)1);
|
||||
|
||||
colDeleg = WTCreateEnumSelectorDelegate(table);
|
||||
WTSetEnumSelectorOptions(colDeleg, options, 5);
|
||||
|
||||
col = WMCreateTableColumn("Package");
|
||||
WMSetTableColumnWidth(col, 140);
|
||||
WMAddTableViewColumn(table, col);
|
||||
WMSetTableColumnDelegate(col, colDeleg);
|
||||
WMSetTableColumnId(col, (void *)2);
|
||||
|
||||
colDeleg = WTCreateBooleanSwitchDelegate(table);
|
||||
|
||||
col = WMCreateTableColumn("Bool");
|
||||
WMSetTableColumnWidth(col, 50);
|
||||
WMAddTableViewColumn(table, col);
|
||||
WMSetTableColumnDelegate(col, colDeleg);
|
||||
WMSetTableColumnId(col, (void *)2);
|
||||
|
||||
WMMapWidget(table);
|
||||
WMRealizeWidget(win);
|
||||
WMScreenMainLoop(scr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
522
WINGs/Extras/wtabledelegates.c
Normal file
522
WINGs/Extras/wtabledelegates.c
Normal file
@@ -0,0 +1,522 @@
|
||||
|
||||
#include <stdint.h>
|
||||
#include <WINGs/WINGsP.h>
|
||||
|
||||
#include "wtableview.h"
|
||||
|
||||
#include "wtabledelegates.h"
|
||||
|
||||
typedef struct {
|
||||
WMTableView *table;
|
||||
WMFont *font;
|
||||
GC gc;
|
||||
GC selGC;
|
||||
WMColor *textColor;
|
||||
} StringData;
|
||||
|
||||
typedef struct {
|
||||
WMTableView *table;
|
||||
GC selGc;
|
||||
} PixmapData;
|
||||
|
||||
typedef struct {
|
||||
WMTextField *widget;
|
||||
WMTableView *table;
|
||||
WMFont *font;
|
||||
GC gc;
|
||||
GC selGC;
|
||||
WMColor *textColor;
|
||||
} StringEditorData;
|
||||
|
||||
typedef struct {
|
||||
WMPopUpButton *widget;
|
||||
WMTableView *table;
|
||||
WMFont *font;
|
||||
char **options;
|
||||
int count;
|
||||
GC gc;
|
||||
GC selGC;
|
||||
WMColor *textColor;
|
||||
} EnumSelectorData;
|
||||
|
||||
typedef struct {
|
||||
WMButton *widget;
|
||||
WMTableView *table;
|
||||
Bool state;
|
||||
GC gc;
|
||||
GC selGC;
|
||||
} BooleanSwitchData;
|
||||
|
||||
static char *SelectionColor = "#bbbbcc";
|
||||
|
||||
static void
|
||||
stringDraw(WMScreen * scr, Drawable d, GC gc, GC sgc, WMColor * textColor,
|
||||
WMFont * font, void *data, WMRect rect, Bool selected)
|
||||
{
|
||||
int x, y;
|
||||
XRectangle rects[1];
|
||||
Display *dpy = WMScreenDisplay(scr);
|
||||
|
||||
x = rect.pos.x + 5;
|
||||
y = rect.pos.y + (rect.size.height - WMFontHeight(font)) / 2;
|
||||
|
||||
rects[0].x = rect.pos.x + 1;
|
||||
rects[0].y = rect.pos.y + 1;
|
||||
rects[0].width = rect.size.width - 1;
|
||||
rects[0].height = rect.size.height - 1;
|
||||
XSetClipRectangles(dpy, gc, 0, 0, rects, 1, YXSorted);
|
||||
|
||||
if (!selected) {
|
||||
XFillRectangles(dpy, d, gc, rects, 1);
|
||||
|
||||
WMDrawString(scr, d, textColor, font, x, y, data, strlen(data));
|
||||
} else {
|
||||
XFillRectangles(dpy, d, sgc, rects, 1);
|
||||
|
||||
WMDrawString(scr, d, textColor, font, x, y, data, strlen(data));
|
||||
}
|
||||
|
||||
XSetClipMask(dpy, gc, None);
|
||||
}
|
||||
|
||||
static void pixmapDraw(WMScreen * scr, Drawable d, GC gc, GC sgc, WMPixmap * pixmap, WMRect rect, Bool selected)
|
||||
{
|
||||
int x, y;
|
||||
XRectangle rects[1];
|
||||
Display *dpy = WMScreenDisplay(scr);
|
||||
WMSize size;
|
||||
|
||||
rects[0].x = rect.pos.x + 1;
|
||||
rects[0].y = rect.pos.y + 1;
|
||||
rects[0].width = rect.size.width - 1;
|
||||
rects[0].height = rect.size.height - 1;
|
||||
XSetClipRectangles(dpy, gc, 0, 0, rects, 1, YXSorted);
|
||||
|
||||
if (!selected) {
|
||||
XFillRectangles(dpy, d, gc, rects, 1);
|
||||
|
||||
if (pixmap) {
|
||||
size = WMGetPixmapSize(pixmap);
|
||||
x = rect.pos.x + (rect.size.width - size.width) / 2;
|
||||
y = rect.pos.y + (rect.size.height - size.height) / 2;
|
||||
|
||||
WMDrawPixmap(pixmap, d, x, y);
|
||||
}
|
||||
} else {
|
||||
XFillRectangles(dpy, d, sgc, rects, 1);
|
||||
|
||||
if (pixmap) {
|
||||
size = WMGetPixmapSize(pixmap);
|
||||
x = rect.pos.x + (rect.size.width - size.width) / 2;
|
||||
y = rect.pos.y + (rect.size.height - size.height) / 2;
|
||||
|
||||
WMDrawPixmap(pixmap, d, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
XSetClipMask(dpy, gc, None);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static void SECellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
StringEditorData *strdata = (StringEditorData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
|
||||
stringDraw(WMWidgetScreen(table), d,
|
||||
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
|
||||
WMTableViewDataForCell(table, column, row), WMTableViewRectForCell(table, column, row), False);
|
||||
}
|
||||
|
||||
static void selectedSECellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
StringEditorData *strdata = (StringEditorData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
|
||||
stringDraw(WMWidgetScreen(table), d,
|
||||
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
|
||||
WMTableViewDataForCell(table, column, row), WMTableViewRectForCell(table, column, row), True);
|
||||
}
|
||||
|
||||
static void beginSECellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
|
||||
{
|
||||
StringEditorData *strdata = (StringEditorData *) self->data;
|
||||
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
|
||||
void *data = WMTableViewDataForCell(strdata->table, column, row);
|
||||
|
||||
WMSetTextFieldText(strdata->widget, (char *)data);
|
||||
WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y);
|
||||
WMResizeWidget(strdata->widget, rect.size.width + 1, rect.size.height + 1);
|
||||
|
||||
WMMapWidget(strdata->widget);
|
||||
}
|
||||
|
||||
static void endSECellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
|
||||
{
|
||||
StringEditorData *strdata = (StringEditorData *) self->data;
|
||||
char *text;
|
||||
|
||||
WMUnmapWidget(strdata->widget);
|
||||
|
||||
text = WMGetTextFieldText(strdata->widget);
|
||||
WMSetTableViewDataForCell(strdata->table, column, row, (void *)text);
|
||||
}
|
||||
|
||||
WMTableColumnDelegate *WTCreateStringEditorDelegate(WMTableView * parent)
|
||||
{
|
||||
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
|
||||
WMScreen *scr = WMWidgetScreen(parent);
|
||||
StringEditorData *data = wmalloc(sizeof(StringEditorData));
|
||||
|
||||
data->widget = WMCreateTextField(parent);
|
||||
W_ReparentView(WMWidgetView(data->widget), WMGetTableViewDocumentView(parent), 0, 0);
|
||||
data->table = parent;
|
||||
data->font = WMSystemFontOfSize(scr, 12);
|
||||
data->gc = WMColorGC(WMWhiteColor(scr));
|
||||
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
|
||||
data->textColor = WMBlackColor(scr);
|
||||
|
||||
delegate->data = data;
|
||||
delegate->drawCell = SECellPainter;
|
||||
delegate->drawSelectedCell = selectedSECellPainter;
|
||||
delegate->beginCellEdit = beginSECellEdit;
|
||||
delegate->endCellEdit = endSECellEdit;
|
||||
|
||||
return delegate;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static void ESCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
EnumSelectorData *strdata = (EnumSelectorData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
uintptr_t i = (uintptr_t)WMTableViewDataForCell(table, column, row);
|
||||
|
||||
stringDraw(WMWidgetScreen(table), d,
|
||||
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
|
||||
strdata->options[i], WMTableViewRectForCell(table, column, row), False);
|
||||
}
|
||||
|
||||
static void selectedESCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
EnumSelectorData *strdata = (EnumSelectorData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
uintptr_t i = (uintptr_t)WMTableViewDataForCell(table, column, row);
|
||||
|
||||
stringDraw(WMWidgetScreen(table), d,
|
||||
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
|
||||
strdata->options[i], WMTableViewRectForCell(table, column, row), True);
|
||||
}
|
||||
|
||||
static void beginESCellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
|
||||
{
|
||||
EnumSelectorData *strdata = (EnumSelectorData *) self->data;
|
||||
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
|
||||
uintptr_t data = (uintptr_t)WMTableViewDataForCell(strdata->table, column, row);
|
||||
|
||||
wassertr(data < strdata->count);
|
||||
|
||||
WMSetPopUpButtonSelectedItem(strdata->widget, data);
|
||||
|
||||
WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y);
|
||||
WMResizeWidget(strdata->widget, rect.size.width, rect.size.height + 1);
|
||||
|
||||
WMMapWidget(strdata->widget);
|
||||
}
|
||||
|
||||
static void endESCellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
|
||||
{
|
||||
EnumSelectorData *strdata = (EnumSelectorData *) self->data;
|
||||
int option;
|
||||
|
||||
WMUnmapWidget(strdata->widget);
|
||||
|
||||
option = WMGetPopUpButtonSelectedItem(strdata->widget);
|
||||
WMSetTableViewDataForCell(strdata->table, column, row, (void *)(uintptr_t) option);
|
||||
}
|
||||
|
||||
WMTableColumnDelegate *WTCreateEnumSelectorDelegate(WMTableView * parent)
|
||||
{
|
||||
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
|
||||
WMScreen *scr = WMWidgetScreen(parent);
|
||||
EnumSelectorData *data = wmalloc(sizeof(EnumSelectorData));
|
||||
|
||||
data->widget = WMCreatePopUpButton(parent);
|
||||
W_ReparentView(WMWidgetView(data->widget), WMGetTableViewDocumentView(parent), 0, 0);
|
||||
data->table = parent;
|
||||
data->font = WMSystemFontOfSize(scr, 12);
|
||||
data->gc = WMColorGC(WMWhiteColor(scr));
|
||||
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
|
||||
data->textColor = WMBlackColor(scr);
|
||||
data->count = 0;
|
||||
data->options = NULL;
|
||||
|
||||
delegate->data = data;
|
||||
delegate->drawCell = ESCellPainter;
|
||||
delegate->drawSelectedCell = selectedESCellPainter;
|
||||
delegate->beginCellEdit = beginESCellEdit;
|
||||
delegate->endCellEdit = endESCellEdit;
|
||||
|
||||
return delegate;
|
||||
}
|
||||
|
||||
void WTSetEnumSelectorOptions(WMTableColumnDelegate * delegate, char **options, int count)
|
||||
{
|
||||
EnumSelectorData *data = (EnumSelectorData *) delegate->data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < WMGetPopUpButtonNumberOfItems(data->widget); i++) {
|
||||
WMRemovePopUpButtonItem(data->widget, 0);
|
||||
}
|
||||
|
||||
data->options = options;
|
||||
data->count = count;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
WMAddPopUpButtonItem(data->widget, options[i]);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static void BSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
BooleanSwitchData *strdata = (BooleanSwitchData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
uintptr_t i = (uintptr_t)WMTableViewDataForCell(table, column, row);
|
||||
WMScreen *scr = WMWidgetScreen(table);
|
||||
|
||||
if (i) {
|
||||
pixmapDraw(scr, d,
|
||||
strdata->gc, strdata->selGC, WMGetSystemPixmap(scr, WSICheckMark),
|
||||
WMTableViewRectForCell(table, column, row), False);
|
||||
} else {
|
||||
pixmapDraw(scr, d,
|
||||
strdata->gc, strdata->selGC, NULL, WMTableViewRectForCell(table, column, row), False);
|
||||
}
|
||||
}
|
||||
|
||||
static void selectedBSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
BooleanSwitchData *strdata = (BooleanSwitchData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
uintptr_t i = (uintptr_t)WMTableViewDataForCell(table, column, row);
|
||||
WMScreen *scr = WMWidgetScreen(table);
|
||||
|
||||
if (i) {
|
||||
pixmapDraw(scr, d,
|
||||
strdata->gc, strdata->selGC, WMGetSystemPixmap(scr, WSICheckMark),
|
||||
WMTableViewRectForCell(table, column, row), True);
|
||||
} else {
|
||||
pixmapDraw(scr, d,
|
||||
strdata->gc, strdata->selGC, NULL, WMTableViewRectForCell(table, column, row), True);
|
||||
}
|
||||
}
|
||||
|
||||
static void beginBSCellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
|
||||
{
|
||||
BooleanSwitchData *strdata = (BooleanSwitchData *) self->data;
|
||||
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
|
||||
uintptr_t data = (uintptr_t)WMTableViewDataForCell(strdata->table, column, row);
|
||||
|
||||
WMSetButtonSelected(strdata->widget, data);
|
||||
WMMoveWidget(strdata->widget, rect.pos.x + 1, rect.pos.y + 1);
|
||||
WMResizeWidget(strdata->widget, rect.size.width - 1, rect.size.height - 1);
|
||||
|
||||
WMMapWidget(strdata->widget);
|
||||
}
|
||||
|
||||
static void endBSCellEdit(WMTableColumnDelegate * self, WMTableColumn * column, int row)
|
||||
{
|
||||
BooleanSwitchData *strdata = (BooleanSwitchData *) self->data;
|
||||
int value;
|
||||
|
||||
value = WMGetButtonSelected(strdata->widget);
|
||||
WMSetTableViewDataForCell(strdata->table, column, row, (void *)(uintptr_t) value);
|
||||
WMUnmapWidget(strdata->widget);
|
||||
}
|
||||
|
||||
WMTableColumnDelegate *WTCreateBooleanSwitchDelegate(WMTableView * parent)
|
||||
{
|
||||
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
|
||||
WMScreen *scr = WMWidgetScreen(parent);
|
||||
BooleanSwitchData *data = wmalloc(sizeof(BooleanSwitchData));
|
||||
WMColor *color;
|
||||
|
||||
data->widget = WMCreateSwitchButton(parent);
|
||||
W_ReparentView(WMWidgetView(data->widget), WMGetTableViewDocumentView(parent), 0, 0);
|
||||
WMSetButtonText(data->widget, NULL);
|
||||
WMSetButtonImagePosition(data->widget, WIPImageOnly);
|
||||
WMSetButtonImage(data->widget, NULL);
|
||||
WMSetButtonAltImage(data->widget, WMGetSystemPixmap(scr, WSICheckMark));
|
||||
|
||||
data->table = parent;
|
||||
color = WMCreateNamedColor(scr, SelectionColor, False);
|
||||
WMSetWidgetBackgroundColor(data->widget, color);
|
||||
data->gc = WMColorGC(WMWhiteColor(scr));
|
||||
data->selGC = WMColorGC(color);
|
||||
|
||||
delegate->data = data;
|
||||
delegate->drawCell = BSCellPainter;
|
||||
delegate->drawSelectedCell = selectedBSCellPainter;
|
||||
delegate->beginCellEdit = beginBSCellEdit;
|
||||
delegate->endCellEdit = endBSCellEdit;
|
||||
|
||||
return delegate;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static void SCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
StringData *strdata = (StringData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
|
||||
stringDraw(WMWidgetScreen(table), d,
|
||||
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
|
||||
WMTableViewDataForCell(table, column, row), WMTableViewRectForCell(table, column, row), False);
|
||||
}
|
||||
|
||||
static void selectedSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
StringData *strdata = (StringData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
|
||||
stringDraw(WMWidgetScreen(table), d,
|
||||
strdata->gc, strdata->selGC, strdata->textColor, strdata->font,
|
||||
WMTableViewDataForCell(table, column, row), WMTableViewRectForCell(table, column, row), True);
|
||||
}
|
||||
|
||||
WMTableColumnDelegate *WTCreateStringDelegate(WMTableView * parent)
|
||||
{
|
||||
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
|
||||
WMScreen *scr = WMWidgetScreen(parent);
|
||||
StringData *data = wmalloc(sizeof(StringData));
|
||||
|
||||
data->table = parent;
|
||||
data->font = WMSystemFontOfSize(scr, 12);
|
||||
data->gc = WMColorGC(WMWhiteColor(scr));
|
||||
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
|
||||
data->textColor = WMBlackColor(scr);
|
||||
|
||||
delegate->data = data;
|
||||
delegate->drawCell = SCellPainter;
|
||||
delegate->drawSelectedCell = selectedSCellPainter;
|
||||
delegate->beginCellEdit = NULL;
|
||||
delegate->endCellEdit = NULL;
|
||||
|
||||
return delegate;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static void PCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
StringData *strdata = (StringData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
|
||||
pixmapDraw(WMWidgetScreen(table), d,
|
||||
strdata->gc, strdata->selGC,
|
||||
(WMPixmap *) WMTableViewDataForCell(table, column, row),
|
||||
WMTableViewRectForCell(table, column, row), False);
|
||||
}
|
||||
|
||||
static void selectedPCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
StringData *strdata = (StringData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
|
||||
pixmapDraw(WMWidgetScreen(table), d,
|
||||
strdata->gc, strdata->selGC,
|
||||
(WMPixmap *) WMTableViewDataForCell(table, column, row),
|
||||
WMTableViewRectForCell(table, column, row), True);
|
||||
}
|
||||
|
||||
WMTableColumnDelegate *WTCreatePixmapDelegate(WMTableView * table)
|
||||
{
|
||||
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
|
||||
WMScreen *scr = WMWidgetScreen(table);
|
||||
StringData *data = wmalloc(sizeof(StringData));
|
||||
|
||||
data->table = table;
|
||||
data->gc = WMColorGC(WMWhiteColor(scr));
|
||||
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
|
||||
|
||||
delegate->data = data;
|
||||
delegate->drawCell = PCellPainter;
|
||||
delegate->drawSelectedCell = selectedPCellPainter;
|
||||
delegate->beginCellEdit = NULL;
|
||||
delegate->endCellEdit = NULL;
|
||||
|
||||
return delegate;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static void drawPSCell(WMTableColumnDelegate * self, Drawable d, WMTableColumn * column, int row, Bool selected)
|
||||
{
|
||||
StringData *strdata = (StringData *) self->data;
|
||||
WMTableView *table = WMGetTableColumnTableView(column);
|
||||
void **data;
|
||||
WMPixmap *pix;
|
||||
char *str;
|
||||
WMRect rect;
|
||||
WMSize size;
|
||||
|
||||
data = WMTableViewDataForCell(table, column, row);
|
||||
|
||||
str = (char *)data[0];
|
||||
pix = (WMPixmap *) data[1];
|
||||
|
||||
rect = WMTableViewRectForCell(table, column, row);
|
||||
|
||||
if (pix) {
|
||||
int owidth = rect.size.width;
|
||||
|
||||
size = WMGetPixmapSize(pix);
|
||||
rect.size.width = size.width;
|
||||
|
||||
pixmapDraw(WMWidgetScreen(table),
|
||||
WMViewXID(WMGetTableViewDocumentView(table)),
|
||||
strdata->gc, strdata->selGC, pix, rect, selected);
|
||||
|
||||
rect.pos.x += size.width - 1;
|
||||
rect.size.width = owidth - size.width + 1;
|
||||
}
|
||||
|
||||
stringDraw(WMWidgetScreen(table), d, strdata->gc, strdata->selGC,
|
||||
strdata->textColor, strdata->font, str, rect, selected);
|
||||
}
|
||||
|
||||
static void PSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
drawPSCell(self, d, column, row, False);
|
||||
}
|
||||
|
||||
static void selectedPSCellPainter(WMTableColumnDelegate * self, WMTableColumn * column, int row, Drawable d)
|
||||
{
|
||||
drawPSCell(self, d, column, row, True);
|
||||
}
|
||||
|
||||
WMTableColumnDelegate *WTCreatePixmapStringDelegate(WMTableView * parent)
|
||||
{
|
||||
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
|
||||
WMScreen *scr = WMWidgetScreen(parent);
|
||||
StringData *data = wmalloc(sizeof(StringData));
|
||||
|
||||
data->table = parent;
|
||||
data->font = WMSystemFontOfSize(scr, 12);
|
||||
data->gc = WMColorGC(WMWhiteColor(scr));
|
||||
data->selGC = WMColorGC(WMCreateNamedColor(scr, SelectionColor, False));
|
||||
data->textColor = WMBlackColor(scr);
|
||||
|
||||
delegate->data = data;
|
||||
delegate->drawCell = PSCellPainter;
|
||||
delegate->drawSelectedCell = selectedPSCellPainter;
|
||||
delegate->beginCellEdit = NULL;
|
||||
delegate->endCellEdit = NULL;
|
||||
|
||||
return delegate;
|
||||
}
|
||||
25
WINGs/Extras/wtabledelegates.h
Normal file
25
WINGs/Extras/wtabledelegates.h
Normal file
@@ -0,0 +1,25 @@
|
||||
|
||||
#ifndef _TABLEDELEGATES_H_
|
||||
#define _TABLEDELEGATES_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
WMTableColumnDelegate *WTCreatePixmapDelegate(WMTableView *table);
|
||||
WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *table);
|
||||
WMTableColumnDelegate *WTCreatePixmapStringDelegate(WMTableView *parent);
|
||||
|
||||
WMTableColumnDelegate *WTCreateStringEditorDelegate(WMTableView *table);
|
||||
|
||||
WMTableColumnDelegate *WTCreateEnumSelectorDelegate(WMTableView *table);
|
||||
void WTSetEnumSelectorOptions(WMTableColumnDelegate *delegate,
|
||||
char **options, int count);
|
||||
|
||||
WMTableColumnDelegate *WTCreateBooleanSwitchDelegate(WMTableView *parent);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
1243
WINGs/Extras/wtableview.c
Normal file
1243
WINGs/Extras/wtableview.c
Normal file
File diff suppressed because it is too large
Load Diff
121
WINGs/Extras/wtableview.h
Normal file
121
WINGs/Extras/wtableview.h
Normal file
@@ -0,0 +1,121 @@
|
||||
|
||||
|
||||
|
||||
#ifndef _WTABLEVIEW_H_
|
||||
#define _WTABLEVIEW_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct W_TableColumn WMTableColumn;
|
||||
typedef struct W_TableView WMTableView;
|
||||
|
||||
|
||||
extern const char *WMTableViewSelectionDidChangeNotification;
|
||||
|
||||
|
||||
typedef struct WMTableColumnDelegate {
|
||||
void *data;
|
||||
void (*drawCell)(struct WMTableColumnDelegate *self,
|
||||
WMTableColumn *column, int row, Drawable d);
|
||||
void (*drawSelectedCell)(struct WMTableColumnDelegate *self,
|
||||
WMTableColumn *column, int row, Drawable d);
|
||||
|
||||
void (*beginCellEdit)(struct WMTableColumnDelegate *self, WMTableColumn *column,
|
||||
int row);
|
||||
void (*endCellEdit)(struct WMTableColumnDelegate *self, WMTableColumn *column,
|
||||
int row);
|
||||
} WMTableColumnDelegate;
|
||||
|
||||
|
||||
typedef struct W_TableViewDelegate {
|
||||
void *data;
|
||||
int (*numberOfRows)(struct W_TableViewDelegate *self,
|
||||
WMTableView *table);
|
||||
void *(*valueForCell)(struct W_TableViewDelegate *self,
|
||||
WMTableColumn *column, int row);
|
||||
void (*setValueForCell)(struct W_TableViewDelegate *self,
|
||||
WMTableColumn *column, int row, void *value);
|
||||
} WMTableViewDelegate;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
WMTableColumn *WMCreateTableColumn(char *title);
|
||||
|
||||
void WMSetTableColumnWidth(WMTableColumn *column, unsigned width);
|
||||
|
||||
void WMSetTableColumnConstraints(WMTableColumn *column,
|
||||
unsigned minWidth, unsigned maxWidth);
|
||||
|
||||
void WMSetTableColumnDelegate(WMTableColumn *column,
|
||||
WMTableColumnDelegate *delegate);
|
||||
|
||||
|
||||
WMTableView *WMGetTableColumnTableView(WMTableColumn *column);
|
||||
|
||||
void WMSetTableColumnId(WMTableColumn *column, void *id);
|
||||
|
||||
void *WMGetTableColumnId(WMTableColumn *column);
|
||||
|
||||
|
||||
WMTableView *WMCreateTableView(WMWidget *parent);
|
||||
|
||||
|
||||
void WMSetTableViewDataSource(WMTableView *table, void *source);
|
||||
|
||||
void *WMGetTableViewDataSource(WMTableView *table);
|
||||
|
||||
void WMSetTableViewHeaderHeight(WMTableView *table, unsigned height);
|
||||
|
||||
void WMAddTableViewColumn(WMTableView *table, WMTableColumn *column);
|
||||
|
||||
void WMSetTableViewDelegate(WMTableView *table, WMTableViewDelegate *delegate);
|
||||
|
||||
void WMSetTableViewAction(WMTableView *table, WMAction *action,
|
||||
void *clientData);
|
||||
|
||||
void *WMGetTableViewClickedColumn(WMTableView *table);
|
||||
|
||||
int WMGetTableViewClickedRow(WMTableView *table);
|
||||
|
||||
WMArray *WMGetTableViewSelectedRows(WMTableView *table);
|
||||
|
||||
WMView *WMGetTableViewDocumentView(WMTableView *table);
|
||||
|
||||
void WMEditTableViewRow(WMTableView *table, int row);
|
||||
|
||||
void WMSelectTableViewRow(WMTableView *table, int row);
|
||||
|
||||
void *WMTableViewDataForCell(WMTableView *table, WMTableColumn *column,
|
||||
int row);
|
||||
|
||||
void WMSetTableViewDataForCell(WMTableView *table, WMTableColumn *column,
|
||||
int row, void *data);
|
||||
|
||||
WMRect WMTableViewRectForCell(WMTableView *table, WMTableColumn *column,
|
||||
int row);
|
||||
|
||||
void WMSetTableViewBackgroundColor(WMTableView *table, WMColor *color);
|
||||
|
||||
void WMSetTableViewGridColor(WMTableView *table, WMColor *color);
|
||||
|
||||
void WMSetTableViewRowHeight(WMTableView *table, int height);
|
||||
|
||||
void WMReloadTableView(WMTableView *table);
|
||||
|
||||
void WMNoteTableViewNumberOfRowsChanged(WMTableView *table);
|
||||
|
||||
void WMScrollTableViewRowToVisible(WMTableView *table, int row);
|
||||
|
||||
void WMSetTableViewHasHorizontalScroller(WMTableView *tPtr, Bool flag);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,85 +1,48 @@
|
||||
## automake input file for WINGs
|
||||
|
||||
AUTOMAKE_OPTIONS = no-dependencies
|
||||
AUTOMAKE_OPTIONS =
|
||||
|
||||
SUBDIRS = Resources
|
||||
SUBDIRS = WINGs . po Documentation Resources
|
||||
|
||||
|
||||
LIBLIST= $(top_builddir)/wrlib/libwraster.la\
|
||||
@LIBRARY_SEARCH_PATH@ @GFXLIBS@ @XLIBS@ \
|
||||
-lm @LIBPL@
|
||||
|
||||
|
||||
#lib_LTLIBRARIES = libWINGs.la
|
||||
|
||||
lib_LIBRARIES = libWINGs.a libWUtil.a
|
||||
|
||||
#libWINGs_la_LDFLAGS = -version-info 1:1:0
|
||||
|
||||
include_HEADERS = WINGs.h WUtil.h WINGsP.h
|
||||
libWINGs_la_LDFLAGS = -version-info @WINGS_VERSION@
|
||||
libWUtil_la_LDFLAGS = -version-info @WUTIL_VERSION@
|
||||
|
||||
bin_SCRIPTS = get-wings-flags get-wutil-flags
|
||||
|
||||
noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget testcolorpanel connect
|
||||
|
||||
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
|
||||
|
||||
testmywidget_LDADD = libWINGs.a $(LIBLIST)
|
||||
|
||||
fontl_SOURCES = fontl.c
|
||||
|
||||
fontl_LDADD = libWINGs.a $(LIBLIST)
|
||||
|
||||
wtest_SOURCES = wtest.c
|
||||
|
||||
wtest_LDADD = libWINGs.a $(LIBLIST)
|
||||
|
||||
wtest_DEPENDENCIES = libWINGs.a
|
||||
|
||||
wmfile_SOURCES = wmfile.c
|
||||
|
||||
wmfile_LDADD = libWINGs.a $(LIBLIST)
|
||||
|
||||
testcolorpanel_SOURCES = testcolorpanel.c
|
||||
|
||||
testcolorpanel_LDADD = libWINGs.a $(LIBLIST)
|
||||
|
||||
wmquery_SOURCES = wmquery.c
|
||||
|
||||
wmquery_LDADD = libWINGs.a $(LIBLIST)
|
||||
|
||||
connect_SOURCES = connect.c
|
||||
|
||||
connect_LDADD = libWUtil.a @LIBRARY_SEARCH_PATH@ @NETLIBS@ @LIBPL@
|
||||
lib_LTLIBRARIES = libWUtil.la libWINGs.la
|
||||
|
||||
|
||||
EXTRA_DIST = logo.xpm BUGS
|
||||
LDADD= libWUtil.la libWINGs.la $(top_builddir)/wrlib/libwraster.la @INTLIBS@
|
||||
libWINGs_la_LIBADD = libWUtil.la $(top_builddir)/wrlib/libwraster.la @XLIBS@ @XFTLIBS@ @FCLIBS@ @LIBM@
|
||||
libWUtil_la_LIBADD = @LIBBSD@
|
||||
|
||||
EXTRA_DIST = BUGS make-rgb Examples Extras Tests get-wings-flags.in get-wutil-flags.in
|
||||
|
||||
|
||||
# wbutton.c
|
||||
libWINGs_a_SOURCES = \
|
||||
WINGs.h \
|
||||
WINGsP.h \
|
||||
libWINGs_la_SOURCES = \
|
||||
configuration.c \
|
||||
dragcommon.c \
|
||||
dragdestination.c \
|
||||
dragsource.c \
|
||||
international.c \
|
||||
notification.c \
|
||||
rgb.h \
|
||||
selection.c \
|
||||
userdefaults.c \
|
||||
wapplication.c \
|
||||
wappresource.c \
|
||||
wballoon.c \
|
||||
wbox.c \
|
||||
wbrowser.c \
|
||||
wbutton.c \
|
||||
wcolor.c \
|
||||
wcolorpanel.c \
|
||||
wcolorwell.c \
|
||||
wconfig.h \
|
||||
wevent.c \
|
||||
wfilepanel.c \
|
||||
wframe.c \
|
||||
wfont.c \
|
||||
wfontpanel.c \
|
||||
widgets.c \
|
||||
winputmethod.c \
|
||||
wlabel.c \
|
||||
wlist.c \
|
||||
wmenuitem.c \
|
||||
@@ -88,49 +51,73 @@ libWINGs_a_SOURCES = \
|
||||
wpixmap.c \
|
||||
wpopupbutton.c \
|
||||
wprogressindicator.c \
|
||||
wruler.c \
|
||||
wscroller.c \
|
||||
wscrollview.c \
|
||||
wslider.c \
|
||||
wsplitview.c \
|
||||
wtabview.c \
|
||||
wtext.c \
|
||||
wtextfield.c \
|
||||
wwindow.c \
|
||||
wview.c \
|
||||
wwindow.c
|
||||
|
||||
libWUtil_la_SOURCES = \
|
||||
array.c \
|
||||
bagtree.c \
|
||||
data.c \
|
||||
error.c \
|
||||
findfile.c \
|
||||
bagarray.c \
|
||||
bagtree.c \
|
||||
connection.c \
|
||||
data.c \
|
||||
handlers.c \
|
||||
hashtable.c \
|
||||
host.c \
|
||||
memory.c \
|
||||
usleep.c
|
||||
|
||||
|
||||
libWUtil_a_SOURCES = \
|
||||
WINGs.h \
|
||||
WINGsP.h \
|
||||
bagarray.c \
|
||||
bagtree.c \
|
||||
connection.c \
|
||||
data.c \
|
||||
host.c \
|
||||
international.c \
|
||||
misc.c \
|
||||
notification.c \
|
||||
proplist.c \
|
||||
string.c \
|
||||
tree.c \
|
||||
userdefaults.c \
|
||||
usleep.c \
|
||||
wapplication.c \
|
||||
wutil.c \
|
||||
error.c \
|
||||
findfile.c \
|
||||
hashtable.c \
|
||||
memory.c \
|
||||
usleep.c
|
||||
wconfig.h \
|
||||
wutil.c
|
||||
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
|
||||
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @HEADER_SEARCH_PATH@ -DDEBUG
|
||||
AM_CPPFLAGS = -DLOCALEDIR=\"$(NLSDIR)\" -DRESOURCE_PATH=\"$(datadir)/WINGs\" -DDEBUG
|
||||
AM_CFLAGS =
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/WINGs/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
|
||||
@XFTFLAGS@ @HEADER_SEARCH_PATH@
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = WINGs.pc
|
||||
|
||||
DISTCLEANFILES = $(pkgconfig_DATA) get-wings-flags get-wutil-flags
|
||||
|
||||
WINGs.pc: Makefile
|
||||
@echo "Generating $@"
|
||||
@echo 'Name: WINGs' > $@
|
||||
@echo 'Description: Small widget set with the NeXTStep(TM) look and feel' >> $@
|
||||
@echo 'Version: $(VERSION)' >> $@
|
||||
@echo 'Requires: wrlib' >> $@
|
||||
@echo 'Libs: $(lib_search_path) -lWINGs' >> $@
|
||||
@echo 'Libs.private: $(XFTLIBS) $(XLIBS) -lm $(INTLIBS)' >> $@
|
||||
@echo 'Cflags: $(inc_search_path)' >> $@
|
||||
|
||||
get-wings-flags: get-wings-flags.in Makefile
|
||||
@echo "Generating $@"
|
||||
@$(SED) -e 's#$${inc_search_path}#$(inc_search_path)#;' \
|
||||
-e 's#$${lib_search_path}#$(lib_search_path)#;' \
|
||||
-e 's#$${GFXLIBS}#$(GFXLIBS)#;' \
|
||||
-e 's#$${XFTLIBS}#$(XFTLIBS)#;' \
|
||||
-e 's#$${INTLIBS}#$(INTLIBS)#;' \
|
||||
-e 's#$${XLIBS}#$(XLIBS)#;' < $(dir $<@)get-wings-flags.in > $@
|
||||
@chmod 755 $@
|
||||
|
||||
get-wutil-flags: get-wutil-flags.in Makefile
|
||||
@echo "Generating $@"
|
||||
@$(SED) -e 's#$${includedir}#$(includedir)#;' \
|
||||
-e 's#$${libdir}#$(libdir)#;' \
|
||||
-e 's#$${INTLIBS}#$(INTLIBS)#;' < $(dir $<@)get-wutil-flags.in > $@
|
||||
@chmod 755 $@
|
||||
|
||||
wcolorpanel.o: wcolorpanel.c
|
||||
$(COMPILE) -c -DRGBTXT="\"@X_LIBRARY_PATH@/X11/rgb.txt\"" $<
|
||||
|
||||
450
WINGs/NEWS
Normal file
450
WINGs/NEWS
Normal file
@@ -0,0 +1,450 @@
|
||||
** API and ABI modifications since wmaker 0.92.0
|
||||
|
||||
** libWINGs **
|
||||
<WINGsP.h>
|
||||
struct W_DragDestinationInfo: new members added SIZE CHANGE
|
||||
|
||||
<WINGs.h>
|
||||
WMGetTextFieldCursorPosition ADDED
|
||||
WC_Matrix REMOVED from enum.
|
||||
WMCreateProgressIndicator REMOVED
|
||||
WMSetProgressIndicatorMinValue REMOVED
|
||||
WMSetProgressIndicatorMaxValue REMOVED
|
||||
WMSetProgressIndicatorValue REMOVED
|
||||
WMGetProgressIndicatorMinValue REMOVED
|
||||
WMGetProgressIndicatorMaxValue REMOVED
|
||||
WMGetProgressIndicatorValue REMOVED
|
||||
typedef struct W_Ruler WMRuler REMOVED
|
||||
typedef struct WMRulerMargins REMOVED
|
||||
WMAppendTextBlock REMOVED
|
||||
WMAppendTextStream REMOVED
|
||||
WMCreateRuler REMOVED
|
||||
WMCreateTextBlockWithObject REMOVED
|
||||
WMCreateTextBlockWithPixmap REMOVED
|
||||
WMCreateTextBlockWithText REMOVED
|
||||
WMCreateTextForDocumentType REMOVED
|
||||
WMDestroyTextBlock REMOVED
|
||||
WMFindInTextStream REMOVED
|
||||
WMFreezeText REMOVED
|
||||
WMGetGrabbedRulerMargin REMOVED
|
||||
WMGetReleasedRulerMargin REMOVED
|
||||
WMGetRulerMargins REMOVED
|
||||
WMGetRulerOffset REMOVED
|
||||
WMGetTextBlockProperties REMOVED
|
||||
WMGetTextDefaultColor REMOVED
|
||||
WMGetTextDefaultFont REMOVED
|
||||
WMGetTextEditable REMOVED
|
||||
WMGetTextIgnoresNewline REMOVED
|
||||
WMGetTextInsertType REMOVED
|
||||
WMGetTextObjects REMOVED
|
||||
WMGetTextRulerShown REMOVED
|
||||
WMGetTextSelectedObjects REMOVED
|
||||
WMGetTextSelectedStream REMOVED
|
||||
WMGetTextSelectionColor REMOVED
|
||||
WMGetTextSelectionFont REMOVED
|
||||
WMGetTextSelectionUnderlined REMOVED
|
||||
WMGetTextStream REMOVED
|
||||
WMGetTextUsesMonoFont REMOVED
|
||||
WMIsMarginEqualToMargin REMOVED
|
||||
WMPageText REMOVED
|
||||
WMPrependTextBlock REMOVED
|
||||
WMPrependTextStream REMOVED
|
||||
WMRemoveTextBlock REMOVED
|
||||
WMReplaceTextSelection REMOVED
|
||||
WMScrollText REMOVED
|
||||
WMSetRulerMargins REMOVED
|
||||
WMSetRulerMoveAction REMOVED
|
||||
WMSetRulerOffset REMOVED
|
||||
WMSetRulerReleaseAction REMOVED
|
||||
WMSetTextAlignment REMOVED
|
||||
WMSetTextBackgroundColor REMOVED
|
||||
WMSetTextBackgroundPixmap REMOVED
|
||||
WMSetTextBlockProperties REMOVED
|
||||
WMSetTextDefaultColor REMOVED
|
||||
WMSetTextDefaultFont REMOVED
|
||||
WMSetTextDelegate REMOVED
|
||||
WMSetTextEditable REMOVED
|
||||
WMSetTextForegroundColor REMOVED
|
||||
WMSetTextHasHorizontalScroller REMOVED
|
||||
WMSetTextHasRuler REMOVED
|
||||
WMSetTextHasVerticalScroller REMOVED
|
||||
WMSetTextIgnoresNewline REMOVED
|
||||
WMSetTextIndentNewLines REMOVED
|
||||
WMSetTextRelief REMOVED
|
||||
WMSetTextSelectionColor REMOVED
|
||||
WMSetTextSelectionFont REMOVED
|
||||
WMSetTextSelectionUnderlined REMOVED
|
||||
WMSetTextUsesMonoFont REMOVED
|
||||
WMShowTextRuler REMOVED
|
||||
WMThawText REMOVED
|
||||
WMRefreshText REMOVED
|
||||
WMCreateText REMOVED
|
||||
WMClearText REMOVED
|
||||
|
||||
|
||||
|
||||
|
||||
** libWutil **
|
||||
enum WMConnectionState REMOVED
|
||||
enum WMConnectionTimeoutState REMOVED
|
||||
struct ConnectionDelegate REMOVED
|
||||
__wmessage ADDED
|
||||
wstrerror REMOVED
|
||||
wmessage converted from function to wrapper macro
|
||||
wwarning converted from function to wrapper macro
|
||||
wfatal converted from function to wrapper macro
|
||||
wsyserror converted from function to wrapper macro
|
||||
wsyserror REMOVED (use werror instead)
|
||||
werror macro ADDED (replaces wsyserror)
|
||||
wsyserrorwithcode removed
|
||||
wmkdirhier ADDED
|
||||
wrmdirhier ADDED
|
||||
wmalloc0 REMOVED
|
||||
wnew REMOVED
|
||||
wnew0 REMOVED
|
||||
wstrlcpy ADDED
|
||||
wstrlcat ADDED
|
||||
WMPushInArray REMOVED
|
||||
WMWritePropListToFile NUMBER OF FUNCTION ARGUMENTS CHANGED
|
||||
WMGetCurrentHost
|
||||
WMGetHostWithName
|
||||
WMGetHostWithAddress
|
||||
WMRetainHost
|
||||
WMReleaseHost
|
||||
WMSetHostCacheEnabled
|
||||
WMIsHostCacheEnabled
|
||||
WMFlushHostCache
|
||||
WMIsHostEqualToHost
|
||||
WMGetHostName
|
||||
WMGetHostNames
|
||||
WMGetHostAddress
|
||||
WMCreateConnectionAsServerAtAddress REMOVED
|
||||
WMCreateConnectionToAddress REMOVED
|
||||
WMCreateConnectionToAddressAndNotify REMOVED
|
||||
WMCloseConnection REMOVED
|
||||
WMDestroyConnection REMOVED
|
||||
WMConnection* WMAcceptConnection REMOVED
|
||||
WMGetConnectionAvailableData REMOVED
|
||||
WMSendConnectionData REMOVED
|
||||
WMEnqueueConnectionData REMOVED
|
||||
WMFlushConnection REMOVED
|
||||
WMSetConnectionDelegate REMOVED
|
||||
WMGetConnectionService REMOVED
|
||||
WMGetConnectionProtocol REMOVED
|
||||
WMSetConnectionNonBlocking REMOVED
|
||||
WMSetConnectionCloseOnExec REMOVED
|
||||
WMSetConnectionShutdownOnClose REMOVED
|
||||
WMGetConnectionClientData REMOVED
|
||||
WMSetConnectionClientData REMOVED
|
||||
WMGetConnectionFlags REMOVED
|
||||
WMSetConnectionFlags REMOVED
|
||||
WMGetConnectionSocket REMOVED
|
||||
WMGetConnectionState REMOVED
|
||||
WMGetConnectionTimeoutState REMOVED
|
||||
WMGetConnectionUnsentData REMOVED
|
||||
WMGetConnectionQueuedData REMOVED
|
||||
WMSetConnectionDefaultTimeout REMOVED
|
||||
WMSetConnectionOpenTimeout REMOVED
|
||||
WMSetConnectionSendTimeout REMOVED
|
||||
|
||||
WMTreeWalkProc ADDED
|
||||
WMTreeWalk ADDED
|
||||
wshellquote ADDED
|
||||
|
||||
|
||||
|
||||
----------------------------------------------------
|
||||
|
||||
*** Mon Oct 14 19:42:42 EEST 2002 - Dan
|
||||
|
||||
Double buffering
|
||||
----------------
|
||||
|
||||
To avoid flickering caused by redrawing the widgets on Expose events, a
|
||||
double buffering tehnique was implemented for most of the widgets.
|
||||
This flickering effect has gotten more vizible with the introduction
|
||||
of antialiased fonts. If with normal text one can redraw the text over the
|
||||
old one over and over again without any degradation of the text (new pixels
|
||||
simply overwrite old pixels), with antialiased text the situation is
|
||||
different and text gets quickly corrupted. To avoid this corruption, one
|
||||
needs to first erase the area where the text will go, which can cause the
|
||||
before mentioned flickering.
|
||||
The double buffer is implemented to solve this issue.
|
||||
|
||||
This is a change that that will be automatically available for any WINGs
|
||||
applications and will require no change in the existing code.
|
||||
However there is an exception from this in case of WMList if you delegate
|
||||
the drawing of items to userspace (read below for the compelte details).
|
||||
|
||||
|
||||
*** Mon Oct 14 22:07:42 EEST 2002 - Dan
|
||||
|
||||
WMList change
|
||||
-------------
|
||||
|
||||
In case of WMList there is the posibility to delegate the drawing of the
|
||||
list items to the application that is linked with WINGs, and this code will
|
||||
not be inside the WINGs library, but in userland. Since we use the double
|
||||
buffering tehnique in this case too (to allow all widgets based on WMList
|
||||
and the ones that draw their list items by themselves to benefit from the
|
||||
double buffering advantage automatically), we no longer pass the window to
|
||||
the user code doing item drawing, but instead pass this pixmap in which we
|
||||
draw before copying to the real window.
|
||||
|
||||
Since one cannot use XClearWindow() or XClearArea() on pixmaps, but only on
|
||||
windows, if the code drawing list items used to call these functions to clear
|
||||
the item area before drawing it needs to change to using XFillRectangle()
|
||||
instead.
|
||||
|
||||
With this change it also means that there is no longer any need to do any
|
||||
double buffering in the user code, since it's already done by WINGs.
|
||||
|
||||
|
||||
*** Mon Oct 14 19:28:35 EEST 2002 - Dan
|
||||
|
||||
API change
|
||||
----------
|
||||
|
||||
WMDrawString() and WMDrawImageString() no longer take a GC as argument.
|
||||
Instead WMDrawString() takes a WMColor* as the color for the string to be
|
||||
drawn, while WMDrawImageString() takes 2 WMColor* arguments in place of the
|
||||
old GC: first for text color and second for background color.
|
||||
|
||||
This change is required to support extending WMFont to allow it to handle
|
||||
antialiased fonts through the XFree86 Xft2 extension.
|
||||
|
||||
This also has the advantage of hiding low level X11 details and use WINGs
|
||||
internat objects instead.
|
||||
|
||||
To fix your old code to work with the new WINGs API you need to replace the
|
||||
GC passed to WMDraw***String() in your code with a WMColor*.
|
||||
Most of the old code used to be like this:
|
||||
|
||||
WMDrawString(screen, window, WMColorGC(color), font, x, y, txt, len);
|
||||
|
||||
for the new API it should be replaced by:
|
||||
|
||||
WMDrawString(screen, window, color, font, x, y, txt, len);
|
||||
|
||||
However if you used a particular GC created by yourself to suit your special
|
||||
needs, you need to pass a color which is the same as the foreground color of
|
||||
that gc.
|
||||
|
||||
For WMDrawImageString(), from:
|
||||
|
||||
WMDrawImageString(screen, window, gc, font, x, y, txt, len);
|
||||
|
||||
becomes
|
||||
|
||||
WMDrawImageString(screen, window, textColor, backColor, font, x, y, txt, len);
|
||||
|
||||
where textColor and backColor are declared like:
|
||||
|
||||
WMColor *textColor, *backColor;
|
||||
|
||||
and have the color of the foreground respective the background of the old gc.
|
||||
|
||||
|
||||
|
||||
*** Wed Oct 9 07:10:04 EEST 2002 - Dan
|
||||
|
||||
Antialiased font support
|
||||
------------------------
|
||||
|
||||
With the addition of Xft2 support in the WINGs library, now WINGs can display
|
||||
antialiased text with TrueType or any scalable fonts.
|
||||
|
||||
Antialiased text is enabled by default, but can be disabled by adding
|
||||
|
||||
AntialiasedText = NO; in ~/GNUstep/Defaults/WMGLOBAL
|
||||
|
||||
This will disable antialiased text for any WINGs based application. If you
|
||||
only want to disable them for a specific application only, like WindowMaker
|
||||
for example, then add the same option in the applications configuration file,
|
||||
in this case ~/GNUstep/Defaults/WindowMaker
|
||||
|
||||
Note that bitmapped fonts look much better than TrueType when antialiasing is
|
||||
disabled.
|
||||
|
||||
|
||||
*** Mon Sep 09 06:58:30 EEST 2002 - Dan
|
||||
|
||||
New delegate for the WMConnection class
|
||||
---------------------------------------
|
||||
|
||||
ConnectionDelegate structure has a new member: canResumeSending.
|
||||
The purpose of this callback is to notify you that you can resume sending
|
||||
data over a WMConnection.
|
||||
It works in the following manner:
|
||||
|
||||
WMSendConnectionData() can return 3 values: -1, 0, 1
|
||||
|
||||
-1 - means that the connection has died. you should stop sending data and
|
||||
close the connection ASAP.
|
||||
1 - means that the data was succesfully sent
|
||||
0 - means that the data (or part of it) was not sent. however, it was saved
|
||||
in a queue and the library will try to send it later when possible.
|
||||
|
||||
if the return value is 1, you can continue to send the next message, and so
|
||||
on, until the return value of such a send call will be 0.
|
||||
After it returns 0 you can continue sending, however, the data will not be
|
||||
sent over the connection because the operating system cannot accept any more
|
||||
data for the moment. Instead it will be queued inside the library, making your
|
||||
program's memory footprint increase. If the ammount of data you need to
|
||||
send is limited and not too big, this shouldn't be a problem, because your
|
||||
data will be queued and sent when the operating system will notify the
|
||||
library that sending is possible again.
|
||||
If this is the case you can just ignore the output of WMSendConnectionData()
|
||||
and not set a callback for canResumeSending.
|
||||
|
||||
However, if the ammount of data you have to send is undetermined and you
|
||||
also want to keep a small memory footprint for your program (so that it
|
||||
won't grow until it uses all your available memory ;) ), you will have to
|
||||
stop sending data over the connection as soon as WMSendConnectionData()
|
||||
returns with 0. Then you should somehow mark this situation in your program
|
||||
to avoid it trying to send anymore data until notified that it can resume.
|
||||
(You should have also set a canResumeSending callback when you initialized
|
||||
your WMConnection object because else you cannot be notified when to resume.)
|
||||
|
||||
Now, when you receive such a 0 from the send operation, your last sent data
|
||||
is put in a queue inside the library. At a later time when the operating
|
||||
system notifies the library that sending is possible again, the library will
|
||||
resume to send the data that is saved in the queue. After it will be able to
|
||||
send all the data in the queue, the canResumeSending callback will be
|
||||
called, letting you know that not only you can resume sending because the
|
||||
operating system is again able to send data, but also that the queue was
|
||||
completely flushed.
|
||||
|
||||
From the canResumeSending callback, you should again update the status of
|
||||
your program marking that it can send again, and then resume sending the
|
||||
data from where you were left.
|
||||
|
||||
|
||||
*** Thu Oct 04 06:00:09 EEST 2001 -Dan
|
||||
|
||||
Property lists handling code
|
||||
----------------------------
|
||||
|
||||
Code to handle property lists was added to WINGs. It is more robust
|
||||
than the libPropList code, mostly because some conflicting concepts
|
||||
borrowed from UserDefaults (which libPropList use) are no longer used in
|
||||
the WINGs property lists code. These borrowed concepts conflicted with the
|
||||
retain/release mechanism of property lists and could lead in certain cases
|
||||
to segmentation faults when executing libPropList based code. But the worse
|
||||
part was that these libPropList problems were practically unsolvable without
|
||||
removing one of those conflicting concepts and without a complete redesign.
|
||||
The new WINGs property lists code is also better integrated with the other
|
||||
data types from WINGs and is actively maintained.
|
||||
|
||||
Practically the things that were removed from the WINGs property list
|
||||
implementation compared to the old libPropList implementation, are exactly
|
||||
the UserDefaults borrowed concepts that conflict with the retain/release
|
||||
mechanism:
|
||||
- The container of a proplist object and the associated functions are gone.
|
||||
- The filename associated with a proplist object and the corresponding
|
||||
functions are gone. Now the saving function needs the filename as a
|
||||
parameter.
|
||||
- The synchronization functions are no longer supported. They are part of
|
||||
the UserDefaults and are implemented there.
|
||||
- No functions related to domains/registering were implemented in the WINGs
|
||||
property lists code, because they are also not part of property lists.
|
||||
They are more in connection with UserDefaults and a central point of access
|
||||
for domains.
|
||||
|
||||
The above 2 concepts: container and filename were added to libPropList just
|
||||
to let it support synchronization which was borrowed from UserDefaults.
|
||||
Property lists as defined in the openstep specification are just complex
|
||||
data structures composed of strings, data, arrays, dictionaries and a mix of
|
||||
them and are not associated with any file in particular. UserDefaults on the
|
||||
other hand are property lists read from a specific file and they associate
|
||||
that property list with that file and allow them to be synchronized.
|
||||
|
||||
Old libPropList based code can still be used by linking against the WINGs
|
||||
library containing the new proplist code with minimal changes which are
|
||||
described in detail in the comments at the top of the WINGs/proplist-compat.h
|
||||
header file (the same file carries the #defines for mapping old libPropList
|
||||
functions to the new WINGs proplist functions).
|
||||
Our recommendation is to move to the new functions WINGs provide because
|
||||
they better integrate with other function naming conventions in WINGs.
|
||||
The proplist-compat.h header file is just a way to have old code up and
|
||||
running with minimal changes so that we can remove the old and unmaintained
|
||||
libPropList from systems while keeping to use old libPropList based code
|
||||
without rewriting it and it should not be used for other purposes.
|
||||
|
||||
|
||||
*** Sat Apr 21 09:12:09 EEST 2001 -Dan
|
||||
|
||||
API change
|
||||
----------
|
||||
|
||||
To allow a correct display of icon images with alpha blending in panels and
|
||||
other places where a WINGs based application may use them the following
|
||||
changes took place:
|
||||
|
||||
1. The following functions were renamed:
|
||||
- WMSetApplicationIconImage() --> WMSetApplicationIconPixmap()
|
||||
- WMGetApplicationIconImage() --> WMGetApplicationIconPixmap()
|
||||
- WMSetWindowMiniwindowImage() --> WMSetWindowMiniwindowPixmap()
|
||||
2. The following functions were added:
|
||||
- WMSetApplicationIconImage(WMScreen *scr, RImage *image)
|
||||
- RImage* WMGetApplicationIconImage(WMScreen *scr)
|
||||
- WMPixmap* WMCreateApplicationIconBlendedPixmap(WMScreen *scr, RColor *col)
|
||||
|
||||
As you can see the old functions that operated on WMPixmap images (which are
|
||||
basically X Pixmaps that lack alpha information) were renamed to ...Pixmap()
|
||||
to make them more suggestive about what they do and to make room for the
|
||||
new functions that operate on RImages (that hold alpha information).
|
||||
|
||||
Since the corresponding WMGet... functions only retrieve the stored
|
||||
image/pixmap from the application, I'll outline how the WMSet...
|
||||
functions operate:
|
||||
|
||||
All WM...IconPixmap() functions operate on WMPixmaps
|
||||
All WM...IconImage() functions operate on RImages
|
||||
|
||||
|
||||
- WMSetApplicationIconImage() will set the RImage to be used in panels
|
||||
and will also convert the RImage to a WMPixmap with a threshold of 128
|
||||
and will use that pixmap for the appicon image. If that doesn't satisfy
|
||||
you, you can make a call to WMSetApplicationIconPixmap() on your own to
|
||||
set whatever WMPixmap you see fit for the appicon.
|
||||
|
||||
- WMSetApplicationIconPixmap() will set the WMPixmap to be used for the
|
||||
appicon and for the panels
|
||||
|
||||
|
||||
If you use only one of the above functions, the corresponding image/pixmap
|
||||
will be used everywhere where needed (panels and appicon), but the pixmap
|
||||
version will not be able to handle alpha blending correctly.
|
||||
|
||||
If you use both WMSetApplicationIconImage() and WMSetApplicationIconPixmap()
|
||||
then the RImage will have priority in panels, and the WMPixmap will only be
|
||||
used for the appicon. This allows you to better control what icon is
|
||||
displayed in the appicon, in case the default conversion of the RImage to a
|
||||
pixmap with a threshold of 128 is not good enough, or in case you want a
|
||||
different icon to be shown in the appicon than in panels.
|
||||
|
||||
|
||||
Also this new function was added:
|
||||
|
||||
- WMCreateApplicationIconBlendedPixmap() will use the RImage set with
|
||||
WMSetApplicationIconImage() if available and will blend it with the color
|
||||
you passed. This will make the image show well on a background of that
|
||||
color. If the RImage was not set it will return NULL. You need to call
|
||||
WMReleasePixmap() on it after you finish with it. Passing a NULL pointer
|
||||
instead of a color will make the RImage be blended with the default color
|
||||
of the WINGs widgets: '#aeaaae' making it suitable to be assigned to any
|
||||
WINGs widget.
|
||||
|
||||
|
||||
To make your existing code work as before all you need to do is to rename
|
||||
the following functions:
|
||||
|
||||
- WMSetApplicationIconImage() --> WMSetApplicationIconPixmap()
|
||||
- WMGetApplicationIconImage() --> WMGetApplicationIconPixmap()
|
||||
- WMSetWindowMiniwindowImage() --> WMSetWindowMiniwindowPixmap()
|
||||
|
||||
But if you want to take advantage of the new abilities to show alpha
|
||||
blended images you need to start using the new functions.
|
||||
|
||||
|
||||
18
WINGs/README
18
WINGs/README
@@ -5,7 +5,7 @@
|
||||
|
||||
Alfredo Kengi Kojima
|
||||
|
||||
kojima@windowmaker.org
|
||||
kojima@windowmaker.info
|
||||
|
||||
|
||||
WINGs is a small widget set with the N*XTSTEP look and feel. It's API
|
||||
@@ -13,7 +13,7 @@ is inspired in OpenStep and it's implementation borrows some ideas
|
||||
from Tk. It has a reasonable set of widgets, sufficient for building
|
||||
small applications (like a CDPlayer or hacking something like rxvt). It
|
||||
also has other functions that are usefull for applications, like a
|
||||
User Defaults like configuration manager and a notification system.
|
||||
User Defaults alike configuration manager and a notification system.
|
||||
|
||||
The library is limited and it's design is a little sloppy,
|
||||
so it's not intended to build large or complex applications, like
|
||||
@@ -26,7 +26,7 @@ workaround some of it's limitations, although you'll probably be able to
|
||||
write something like a trivial tic-tac-toe game without knowing much Xlib.
|
||||
|
||||
Some of it's functions are designed to support the Window Maker window
|
||||
manager (see http://windowmaker.org) In fact, it's primary role is to
|
||||
manager (see http://windowmaker.info) In fact, it's primary role is to
|
||||
support Window Maker. All other uses of it are just an added bonus.
|
||||
|
||||
It will help you to understand the API if you read the ApplicationKit
|
||||
@@ -56,22 +56,19 @@ Widgets provided by WINGs:
|
||||
- slider
|
||||
- scrollable view
|
||||
- color well
|
||||
- split view (only 2 subviews)
|
||||
- split view
|
||||
- tabbed view
|
||||
- progress indicator
|
||||
|
||||
- selection (make pasteboard like?)
|
||||
- drag&drop
|
||||
|
||||
- input box
|
||||
- file panel
|
||||
- color panel
|
||||
- alert panel
|
||||
- font panel
|
||||
|
||||
Planned:
|
||||
--------
|
||||
|
||||
- selection (pasteboard like)
|
||||
- drag&drop
|
||||
|
||||
If you think you can code the following, please do. They are needed by
|
||||
WPrefs.app, but the number of other things I have to do is huge.
|
||||
|
||||
@@ -84,7 +81,6 @@ Wish list: (I don't have the know-how or time to do them)
|
||||
|
||||
- text (with support for RTF)
|
||||
- matrix (like NSMatrix)
|
||||
- splitviews with more than 2 subviews
|
||||
- font manager (like NSFontManager)
|
||||
- finish other wigets
|
||||
- optimize list scrolling (XCopyArea() the area that's already drawn)
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
Makefile Makefile.in
|
||||
.psrc .inslog2 tca.map tca.log
|
||||
*.rpt
|
||||
@@ -1,231 +0,0 @@
|
||||
# Makefile.in generated automatically by automake 1.4 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
||||
# This Makefile.in is free software; the Free Software Foundation
|
||||
# gives unlimited permission to copy and/or distribute it,
|
||||
# with or without modifications, as long as this notice is preserved.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
# PARTICULAR PURPOSE.
|
||||
|
||||
|
||||
SHELL = @SHELL@
|
||||
|
||||
srcdir = @srcdir@
|
||||
top_srcdir = @top_srcdir@
|
||||
VPATH = @srcdir@
|
||||
prefix = @prefix@
|
||||
exec_prefix = @exec_prefix@
|
||||
|
||||
bindir = @bindir@
|
||||
sbindir = @sbindir@
|
||||
libexecdir = @libexecdir@
|
||||
datadir = @datadir@
|
||||
sysconfdir = @sysconfdir@
|
||||
sharedstatedir = @sharedstatedir@
|
||||
localstatedir = @localstatedir@
|
||||
libdir = @libdir@
|
||||
infodir = @infodir@
|
||||
mandir = @mandir@
|
||||
includedir = @includedir@
|
||||
oldincludedir = /usr/include
|
||||
|
||||
DESTDIR =
|
||||
|
||||
pkgdatadir = $(datadir)/@PACKAGE@
|
||||
pkglibdir = $(libdir)/@PACKAGE@
|
||||
pkgincludedir = $(includedir)/@PACKAGE@
|
||||
|
||||
top_builddir = ../..
|
||||
|
||||
ACLOCAL = @ACLOCAL@
|
||||
AUTOCONF = @AUTOCONF@
|
||||
AUTOMAKE = @AUTOMAKE@
|
||||
AUTOHEADER = @AUTOHEADER@
|
||||
|
||||
INSTALL = @INSTALL@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
transform = @program_transform_name@
|
||||
|
||||
NORMAL_INSTALL = :
|
||||
PRE_INSTALL = :
|
||||
POST_INSTALL = :
|
||||
NORMAL_UNINSTALL = :
|
||||
PRE_UNINSTALL = :
|
||||
POST_UNINSTALL = :
|
||||
host_alias = @host_alias@
|
||||
host_triplet = @host@
|
||||
AS = @AS@
|
||||
CC = @CC@
|
||||
CPP_PATH = @CPP_PATH@
|
||||
DFLAGS = @DFLAGS@
|
||||
DLLIBS = @DLLIBS@
|
||||
DLLTOOL = @DLLTOOL@
|
||||
GFXLIBS = @GFXLIBS@
|
||||
HEADER_SEARCH_PATH = @HEADER_SEARCH_PATH@
|
||||
ICONEXT = @ICONEXT@
|
||||
INTLIBS = @INTLIBS@
|
||||
LD = @LD@
|
||||
LIBPL = @LIBPL@
|
||||
LIBRARY_SEARCH_PATH = @LIBRARY_SEARCH_PATH@
|
||||
LIBTOOL = @LIBTOOL@
|
||||
LITE = @LITE@
|
||||
LN_S = @LN_S@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MOFILES = @MOFILES@
|
||||
NETLIBS = @NETLIBS@
|
||||
NLSDIR = @NLSDIR@
|
||||
NM = @NM@
|
||||
OBJDUMP = @OBJDUMP@
|
||||
PACKAGE = @PACKAGE@
|
||||
RANLIB = @RANLIB@
|
||||
VERSION = @VERSION@
|
||||
WPMOFILES = @WPMOFILES@
|
||||
XCFLAGS = @XCFLAGS@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
XLFLAGS = @XLFLAGS@
|
||||
XLIBS = @XLIBS@
|
||||
X_EXTRA_LIBS = @X_EXTRA_LIBS@
|
||||
X_LIBRARY_PATH = @X_LIBRARY_PATH@
|
||||
supported_locales = @supported_locales@
|
||||
wprefsdir = @wprefsdir@
|
||||
|
||||
resdatadir = $(datadir)/WINGs
|
||||
|
||||
resdata_DATA = Images.tiff Images.xpm defaultIcon.tiff defaultIcon.xpm
|
||||
|
||||
EXTRA_DIST = $(resdata_DATA) Images.xcf
|
||||
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||
CONFIG_HEADER = ../../src/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
DATA = $(resdata_DATA)
|
||||
|
||||
DIST_COMMON = Makefile.am Makefile.in
|
||||
|
||||
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
||||
TAR = gtar
|
||||
GZIP_ENV = --best
|
||||
all: all-redirect
|
||||
.SUFFIXES:
|
||||
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||
cd $(top_srcdir) && $(AUTOMAKE) --gnu WINGs/Resources/Makefile
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES)
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
|
||||
|
||||
install-resdataDATA: $(resdata_DATA)
|
||||
@$(NORMAL_INSTALL)
|
||||
$(mkinstalldirs) $(DESTDIR)$(resdatadir)
|
||||
@list='$(resdata_DATA)'; for p in $$list; do \
|
||||
if test -f $(srcdir)/$$p; then \
|
||||
echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(resdatadir)/$$p"; \
|
||||
$(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(resdatadir)/$$p; \
|
||||
else if test -f $$p; then \
|
||||
echo " $(INSTALL_DATA) $$p $(DESTDIR)$(resdatadir)/$$p"; \
|
||||
$(INSTALL_DATA) $$p $(DESTDIR)$(resdatadir)/$$p; \
|
||||
fi; fi; \
|
||||
done
|
||||
|
||||
uninstall-resdataDATA:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
list='$(resdata_DATA)'; for p in $$list; do \
|
||||
rm -f $(DESTDIR)$(resdatadir)/$$p; \
|
||||
done
|
||||
tags: TAGS
|
||||
TAGS:
|
||||
|
||||
|
||||
distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||
|
||||
subdir = WINGs/Resources
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
here=`cd $(top_builddir) && pwd`; \
|
||||
top_distdir=`cd $(top_distdir) && pwd`; \
|
||||
distdir=`cd $(distdir) && pwd`; \
|
||||
cd $(top_srcdir) \
|
||||
&& $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu WINGs/Resources/Makefile
|
||||
@for file in $(DISTFILES); do \
|
||||
d=$(srcdir); \
|
||||
if test -d $$d/$$file; then \
|
||||
cp -pr $$/$$file $(distdir)/$$file; \
|
||||
else \
|
||||
test -f $(distdir)/$$file \
|
||||
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file || :; \
|
||||
fi; \
|
||||
done
|
||||
info-am:
|
||||
info: info-am
|
||||
dvi-am:
|
||||
dvi: dvi-am
|
||||
check-am: all-am
|
||||
check: check-am
|
||||
installcheck-am:
|
||||
installcheck: installcheck-am
|
||||
install-exec-am:
|
||||
install-exec: install-exec-am
|
||||
|
||||
install-data-am: install-resdataDATA
|
||||
install-data: install-data-am
|
||||
|
||||
install-am: all-am
|
||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
||||
install: install-am
|
||||
uninstall-am: uninstall-resdataDATA
|
||||
uninstall: uninstall-am
|
||||
all-am: Makefile $(DATA)
|
||||
all-redirect: all-am
|
||||
install-strip:
|
||||
$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
|
||||
installdirs:
|
||||
$(mkinstalldirs) $(DESTDIR)$(resdatadir)
|
||||
|
||||
|
||||
mostlyclean-generic:
|
||||
|
||||
clean-generic:
|
||||
|
||||
distclean-generic:
|
||||
-rm -f Makefile $(CONFIG_CLEAN_FILES)
|
||||
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||
|
||||
maintainer-clean-generic:
|
||||
mostlyclean-am: mostlyclean-generic
|
||||
|
||||
mostlyclean: mostlyclean-am
|
||||
|
||||
clean-am: clean-generic mostlyclean-am
|
||||
|
||||
clean: clean-am
|
||||
|
||||
distclean-am: distclean-generic clean-am
|
||||
-rm -f libtool
|
||||
|
||||
distclean: distclean-am
|
||||
|
||||
maintainer-clean-am: maintainer-clean-generic distclean-am
|
||||
@echo "This command is intended for maintainers to use;"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
|
||||
maintainer-clean: maintainer-clean-am
|
||||
|
||||
.PHONY: uninstall-resdataDATA install-resdataDATA tags distdir info-am \
|
||||
info dvi-am dvi check check-am installcheck-am installcheck \
|
||||
install-exec-am install-exec install-data-am install-data install-am \
|
||||
install uninstall-am uninstall all-redirect all-am all installdirs \
|
||||
mostlyclean-generic distclean-generic clean-generic \
|
||||
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
|
||||
|
||||
|
||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||
.NOEXPORT:
|
||||
@@ -1,4 +1,13 @@
|
||||
- move paint to idle handlers
|
||||
- check if its useful to add some WMBrowserSelectionDidChangeNotification
|
||||
(actually a pass-through for WMListSelectionDidChangeNotification).
|
||||
Or a delegate to be called when the list selection change.
|
||||
- add some way to modify speed when scrolling WMList, depending on how
|
||||
far the mouse is moved outside of the list.
|
||||
- clean up header files of declared but not implemented anywhere functions
|
||||
- implement a generic WMChangeFontAttribute(WMFont *font, enum attributes)
|
||||
function
|
||||
|
||||
|
||||
- optimize color allocation for repeated colors
|
||||
- make it work in 8bpp
|
||||
|
||||
22
WINGs/Tests/Makefile.am
Normal file
22
WINGs/Tests/Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
## automake input file for WINGs - Tests
|
||||
|
||||
AUTOMAKE_OPTIONS =
|
||||
|
||||
noinst_PROGRAMS = wtest wmquery wmfile testmywidget
|
||||
|
||||
LDADD= $(top_builddir)/WINGs/libWINGs.la $(top_builddir)/wrlib/libwraster.la \
|
||||
$(top_builddir)/WINGs/libWUtil.la \
|
||||
@XFTLIBS@ @INTLIBS@
|
||||
|
||||
|
||||
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
|
||||
|
||||
wtest_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.la
|
||||
|
||||
|
||||
EXTRA_DIST = logo.xpm upbtn.xpm wm.html wm.png
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
|
||||
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @XFTFLAGS@ @HEADER_SEARCH_PATH@ \
|
||||
-DDEBUG
|
||||
|
||||
197
WINGs/Tests/mywidget.c
Normal file
197
WINGs/Tests/mywidget.c
Normal file
@@ -0,0 +1,197 @@
|
||||
/*
|
||||
* Demo user widget for WINGs
|
||||
*
|
||||
* Author: Alfredo K. Kojima
|
||||
*
|
||||
* This file is in the public domain.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Include the WINGs private data header.
|
||||
*
|
||||
*
|
||||
*/
|
||||
#include <WINGs/WINGsP.h>
|
||||
|
||||
/*
|
||||
* Our public header.
|
||||
*/
|
||||
#include "mywidget.h"
|
||||
|
||||
/*
|
||||
* Define the widget "class"
|
||||
*/
|
||||
typedef struct W_MyWidget {
|
||||
/* these two fields must be present in all your widgets in this
|
||||
* exact position */
|
||||
W_Class widgetClass;
|
||||
WMView *view;
|
||||
|
||||
/* put your stuff here */
|
||||
char *text;
|
||||
|
||||
} _MyWidget;
|
||||
|
||||
/* some forward declarations */
|
||||
|
||||
static void destroyMyWidget(_MyWidget * mPtr);
|
||||
static void paintMyWidget(_MyWidget * mPtr);
|
||||
|
||||
static void handleEvents(XEvent * event, void *data);
|
||||
static void handleActionEvents(XEvent * event, void *data);
|
||||
|
||||
/*
|
||||
* Delegates
|
||||
* See the source for the other widgets to see how to use.
|
||||
* You won't need to use this most of the time.
|
||||
*/
|
||||
static W_ViewDelegate _MyWidgetDelegate = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
/* our widget class ID */
|
||||
static W_Class myWidgetClass = 0;
|
||||
|
||||
/*
|
||||
* Initializer for our widget. Must be called before creating any
|
||||
* instances of the widget.
|
||||
*/
|
||||
W_Class InitMyWidget(WMScreen * scr)
|
||||
{
|
||||
/* register our widget with WINGs and get our widget class ID */
|
||||
if (!myWidgetClass) {
|
||||
myWidgetClass = W_RegisterUserWidget();
|
||||
}
|
||||
|
||||
return myWidgetClass;
|
||||
}
|
||||
|
||||
/*
|
||||
* Our widget fabrication plant.
|
||||
*/
|
||||
MyWidget *CreateMyWidget(WMWidget * parent)
|
||||
{
|
||||
MyWidget *mPtr;
|
||||
|
||||
/* allocate some storage for our new widget instance */
|
||||
mPtr = wmalloc(sizeof(MyWidget));
|
||||
/* initialize it */
|
||||
memset(mPtr, 0, sizeof(MyWidget));
|
||||
|
||||
/* set the class ID */
|
||||
mPtr->widgetClass = myWidgetClass;
|
||||
|
||||
/*
|
||||
* Create the view for our widget.
|
||||
* Note: the Window for the view is only created after the view is
|
||||
* realized with W_RealizeView()
|
||||
*
|
||||
* Consider the returned view as read-only.
|
||||
*/
|
||||
mPtr->view = W_CreateView(W_VIEW(parent));
|
||||
if (!mPtr->view) {
|
||||
wfree(mPtr);
|
||||
return NULL;
|
||||
}
|
||||
/* always do this */
|
||||
mPtr->view->self = mPtr;
|
||||
|
||||
/* setup the delegates for the view */
|
||||
mPtr->view->delegate = &_MyWidgetDelegate;
|
||||
|
||||
/*
|
||||
* Intercept some events for our widget, so that we can handle them.
|
||||
*/
|
||||
WMCreateEventHandler(mPtr->view, ExposureMask /* this allows us to know when we should paint */
|
||||
| StructureNotifyMask, /* this allows us to know things like when we are destroyed */
|
||||
handleEvents, mPtr);
|
||||
|
||||
/*
|
||||
* Intercept some other events. This could be merged with the above
|
||||
* call, but we separate for more organization.
|
||||
*/
|
||||
WMCreateEventHandler(mPtr->view, ButtonPressMask, handleActionEvents, mPtr);
|
||||
|
||||
return mPtr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Paint our widget contents.
|
||||
*/
|
||||
static void paintMyWidget(_MyWidget * mPtr)
|
||||
{
|
||||
W_Screen *scr = mPtr->view->screen;
|
||||
WMColor *color;
|
||||
|
||||
if (mPtr->text) {
|
||||
|
||||
color = WMWhiteColor(scr);
|
||||
|
||||
W_PaintText(mPtr->view, mPtr->view->window, scr->normalFont, 0, 0,
|
||||
mPtr->view->size.width, WACenter, color, False, mPtr->text, strlen(mPtr->text));
|
||||
|
||||
WMReleaseColor(color);
|
||||
}
|
||||
}
|
||||
|
||||
static void handleEvents(XEvent * event, void *data)
|
||||
{
|
||||
_MyWidget *mPtr = (_MyWidget *) data;
|
||||
|
||||
switch (event->type) {
|
||||
case Expose:
|
||||
if (event->xexpose.count != 0)
|
||||
break;
|
||||
paintMyWidget(mPtr);
|
||||
break;
|
||||
|
||||
case DestroyNotify:
|
||||
destroyMyWidget(mPtr);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void handleActionEvents(XEvent * event, void *data)
|
||||
{
|
||||
_MyWidget *mPtr = (_MyWidget *) data;
|
||||
|
||||
switch (event->type) {
|
||||
case ButtonPress:
|
||||
XBell(mPtr->view->screen->display, 100);
|
||||
XBell(mPtr->view->screen->display, 100);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetMyWidgetText(MyWidget * mPtr, char *text)
|
||||
{
|
||||
CHECK_CLASS(mPtr, myWidgetClass);
|
||||
|
||||
if (mPtr->text)
|
||||
wfree(mPtr->text);
|
||||
|
||||
mPtr->text = wstrdup(text);
|
||||
|
||||
if (W_VIEW_MAPPED(mPtr->view)) {
|
||||
paintMyWidget(mPtr);
|
||||
}
|
||||
}
|
||||
|
||||
static void destroyMyWidget(_MyWidget * mPtr)
|
||||
{
|
||||
/*
|
||||
* Free all data we allocated for our widget.
|
||||
*/
|
||||
|
||||
if (mPtr->text)
|
||||
wfree(mPtr->text);
|
||||
|
||||
wfree(mPtr);
|
||||
}
|
||||
46
WINGs/Tests/testmywidget.c
Normal file
46
WINGs/Tests/testmywidget.c
Normal file
@@ -0,0 +1,46 @@
|
||||
|
||||
#include <WINGs/WINGs.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "mywidget.h"
|
||||
|
||||
void wAbort()
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
Display *dpy = XOpenDisplay("");
|
||||
WMScreen *scr;
|
||||
WMWindow *win;
|
||||
MyWidget *thing;
|
||||
|
||||
WMInitializeApplication("Test", &argc, argv);
|
||||
|
||||
if (!dpy) {
|
||||
wfatal("could not open display");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
scr = WMCreateSimpleApplicationScreen(dpy);
|
||||
|
||||
/* init our widget */
|
||||
InitMyWidget(scr);
|
||||
|
||||
win = WMCreateWindow(scr, "test");
|
||||
WMResizeWidget(win, 150, 50);
|
||||
|
||||
thing = CreateMyWidget(win);
|
||||
SetMyWidgetText(thing, "The Test");
|
||||
WMResizeWidget(thing, 100, 20);
|
||||
WMMoveWidget(thing, 10, 10);
|
||||
|
||||
WMRealizeWidget(win);
|
||||
WMMapSubwidgets(win);
|
||||
WMMapWidget(win);
|
||||
|
||||
WMScreenMainLoop(scr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
57
WINGs/Tests/upbtn.xpm
Normal file
57
WINGs/Tests/upbtn.xpm
Normal file
@@ -0,0 +1,57 @@
|
||||
/* XPM */
|
||||
static char * upbtn_xpm[] = {
|
||||
"20 22 32 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
"+ c #FFFFFF",
|
||||
"@ c #4A485A",
|
||||
"# c #524052",
|
||||
"$ c #4A595A",
|
||||
"% c #5A596A",
|
||||
"& c #4A486A",
|
||||
"* c #5A595A",
|
||||
"= c #52556A",
|
||||
"- c #52406A",
|
||||
"; c #6A556A",
|
||||
"> c #5A6D6A",
|
||||
", c #5A597B",
|
||||
"' c #5A6D7B",
|
||||
") c #6A557B",
|
||||
"! c #6A6D7B",
|
||||
"~ c #6A697B",
|
||||
"{ c #6A698B",
|
||||
"] c #7B797B",
|
||||
"^ c #C5C2C5",
|
||||
"/ c #6A818B",
|
||||
"( c #6A7D7B",
|
||||
"_ c #7B698B",
|
||||
": c #6A798B",
|
||||
"< c #7B799C",
|
||||
"[ c #7B798B",
|
||||
"} c #7B8D94",
|
||||
"| c #7B81A4",
|
||||
"1 c #8B85A4",
|
||||
"2 c #73899C",
|
||||
"3 c #7B89A4",
|
||||
" ",
|
||||
" .+ ",
|
||||
" .@#+ ",
|
||||
" .$%$&+ ",
|
||||
" .*=*-*-+ ",
|
||||
" .%%%%%%$%+ ",
|
||||
" .%=%;%=*=*-+ ",
|
||||
" .>%>,''>,>%=%+ ",
|
||||
" .%)>)!~>)>)>=*#+ ",
|
||||
" .>~'~'{'{'~',>%$@+ ",
|
||||
" ]+++^{!{!~!)>+++++ ",
|
||||
" ./{/{({'~+ ",
|
||||
" ._:_:_!~>+ ",
|
||||
" ./</</{'~+ ",
|
||||
" .<<<[_({!+ ",
|
||||
" .}|}</{(~+ ",
|
||||
" .12<[_:{'+ ",
|
||||
" .31}</{'~+ ",
|
||||
" .12<[_!~>+ ",
|
||||
" .2</</{''+ ",
|
||||
" ]+++++++++ ",
|
||||
" "};
|
||||
37
WINGs/Tests/wm.html
Normal file
37
WINGs/Tests/wm.html
Normal file
@@ -0,0 +1,37 @@
|
||||
<HTML><font size=-1>
|
||||
<center>
|
||||
<Img src=wm.png></b><p>
|
||||
<b>GNU Window Maker</B><br>
|
||||
<i>X11 Window Manager</i><p>
|
||||
<u>http://windowmaker.info<br>
|
||||
ftp.windowmaker.info</u></font><Br>
|
||||
</center>
|
||||
|
||||
<b><i>Window Maker</b>
|
||||
<Img src=upbtn.xpm></i>is the GNU window manager
|
||||
for the X Window System. It was
|
||||
designed to emulate the look and feel of part of the NEXTSTEP(tm) GUI. Its
|
||||
supposed to be relatively fast and small, feature rich, easy to configure and
|
||||
easy to use, with a simple and elegant appearance borrowed from NEXTSTEP(tm).
|
||||
<p>
|
||||
<b>Window Maker</b> was designed keeping integration with GNUstep in
|
||||
mind and is the
|
||||
"official" window manager for it. It is also part of the GNU project
|
||||
(<u>www.gnu.org</u>)
|
||||
|
||||
<p>
|
||||
<b>What is <i>GNUstep?</i></b><p>
|
||||
<i><b>G</i>NU</b>step is a complete object-oriented development system, based on the
|
||||
OpenStep specification released by NeXT(tm) (now Apple(tm)) and Sun(tm). It will provide everything one needs to produce cross-platform, object-oriented, graphical (and non-graphical) applications; providing among other things, base system libraries, a high-level GUI application framework that uses a Display PostScript(tm)-like imaging model (DGS), objects for accessing relational databases, distributed objects and a graphical development environment, with tools like interface modeller, a project management system
|
||||
(project center) and other tools.
|
||||
<p>
|
||||
The GNUstep development system will be used to create a user environment,
|
||||
with everything needed for a complete graphical user interface, such as a
|
||||
file viewer, text editors and other applications. Note that the user
|
||||
environment (or "desktop environment") is only a small part of the whole
|
||||
GNUstep project and therefore it does not "compete" with other projects like
|
||||
KDE or GNOME, simply because they are completely different things.
|
||||
<p>
|
||||
For more information on the GNUstep project, visit:
|
||||
<u>http://www.gnustep.org</u> and <u>http://gnustep.current.nu</u>
|
||||
</HTML>
|
||||
BIN
WINGs/Tests/wm.png
Normal file
BIN
WINGs/Tests/wm.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
112
WINGs/Tests/wmfile.c
Normal file
112
WINGs/Tests/wmfile.c
Normal file
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* Author: Len Trigg <trigg@cs.waikato.ac.nz>
|
||||
*/
|
||||
|
||||
/*
|
||||
Update: Franck Wolff <frawolff@club-internet.fr>
|
||||
-----------------------------------------------------------------------
|
||||
List of updated functions :
|
||||
- main :
|
||||
add -s option for a save panel...
|
||||
-----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <WINGs/WINGs.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "logo.xpm"
|
||||
|
||||
void wAbort()
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *ProgName;
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"usage:\n"
|
||||
"\t%s [-options]\n"
|
||||
"\n"
|
||||
"options:\n"
|
||||
" -s\t\tSave panel (default open panel)\n"
|
||||
" -i <str>\tInitial directory (default /)\n"
|
||||
" -t <str>\tQuery window title (default none)\n"
|
||||
"\n"
|
||||
"information:\n"
|
||||
"\t%s pops up a WindowMaker style file selection panel.\n"
|
||||
"\n" "version:\n" "\t%s\n", ProgName, ProgName, __DATE__);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
#define OPEN_PANEL_TYPE 0
|
||||
#define SAVE_PANEL_TYPE 1
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
Display *dpy = XOpenDisplay("");
|
||||
WMScreen *scr;
|
||||
WMPixmap *pixmap;
|
||||
WMOpenPanel *oPanel;
|
||||
WMSavePanel *sPanel;
|
||||
/* RImage *image; */
|
||||
char *title = NULL;
|
||||
char *initial = "/";
|
||||
int ch;
|
||||
int panelType = OPEN_PANEL_TYPE;
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
if (!dpy) {
|
||||
puts("could not open display");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
WMInitializeApplication("WMFile", &argc, argv);
|
||||
|
||||
ProgName = argv[0];
|
||||
|
||||
while ((ch = getopt(argc, argv, "si:ht:")) != -1)
|
||||
switch (ch) {
|
||||
case 's':
|
||||
panelType = SAVE_PANEL_TYPE;
|
||||
break;
|
||||
case 'i':
|
||||
initial = optarg;
|
||||
break;
|
||||
case 't':
|
||||
title = optarg;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
|
||||
for (; optind < argc; optind++)
|
||||
usage();
|
||||
|
||||
scr = WMCreateSimpleApplicationScreen(dpy);
|
||||
|
||||
pixmap = WMCreatePixmapFromXPMData(scr, GNUSTEP_XPM);
|
||||
WMSetApplicationIconPixmap(scr, pixmap);
|
||||
WMReleasePixmap(pixmap);
|
||||
if (panelType == SAVE_PANEL_TYPE) {
|
||||
sPanel = WMGetSavePanel(scr);
|
||||
if (WMRunModalFilePanelForDirectory(sPanel, NULL, initial,
|
||||
/*title */ NULL, NULL) == True)
|
||||
printf("%s\n", WMGetFilePanelFileName(sPanel));
|
||||
else
|
||||
printf("\n");
|
||||
} else {
|
||||
oPanel = WMGetOpenPanel(scr);
|
||||
if (WMRunModalFilePanelForDirectory(oPanel, NULL, initial,
|
||||
/*title */ NULL, NULL) == True)
|
||||
printf("%s\n", WMGetFilePanelFileName(oPanel));
|
||||
else
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
90
WINGs/Tests/wmquery.c
Normal file
90
WINGs/Tests/wmquery.c
Normal file
@@ -0,0 +1,90 @@
|
||||
|
||||
/*
|
||||
* Author: Len Trigg <trigg@cs.waikato.ac.nz>
|
||||
*/
|
||||
|
||||
#include <WINGs/WINGs.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "logo.xpm"
|
||||
|
||||
void wAbort()
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
|
||||
char *ProgName;
|
||||
|
||||
void usage(void)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"usage:\n"
|
||||
"\t%s [-options]\n"
|
||||
"\n"
|
||||
"options:\n"
|
||||
" -i <str>\tInitial entry contents (default none)\n"
|
||||
" -p <str>\tPrompt message (default none)\n"
|
||||
" -t <str>\tQuery window title (default none)\n"
|
||||
"\n"
|
||||
"information:\n"
|
||||
"\t%s pops up a WindowMaker style input panel.\n"
|
||||
"\n" "version:\n" "\t%s\n", ProgName, ProgName, __DATE__);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
Display *dpy = XOpenDisplay("");
|
||||
WMScreen *scr;
|
||||
WMPixmap *pixmap;
|
||||
char *title = NULL;
|
||||
char *prompt = NULL;
|
||||
char *initial = NULL;
|
||||
char *result = NULL;
|
||||
int ch;
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
WMInitializeApplication("WMQuery", &argc, argv);
|
||||
|
||||
ProgName = argv[0];
|
||||
|
||||
if (!dpy) {
|
||||
puts("could not open display");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while ((ch = getopt(argc, argv, "i:hp:t:")) != -1)
|
||||
switch (ch) {
|
||||
case 'i':
|
||||
initial = optarg;
|
||||
break;
|
||||
case 'p':
|
||||
prompt = optarg;
|
||||
break;
|
||||
case 't':
|
||||
title = optarg;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
|
||||
for (; optind < argc; optind++)
|
||||
usage();
|
||||
|
||||
scr = WMCreateSimpleApplicationScreen(dpy);
|
||||
|
||||
pixmap = WMCreatePixmapFromXPMData(scr, GNUSTEP_XPM);
|
||||
|
||||
WMSetApplicationIconPixmap(scr, pixmap);
|
||||
WMReleasePixmap(pixmap);
|
||||
|
||||
if ((result = WMRunInputPanel(scr, NULL, title, prompt, initial, "OK", "Cancel")) != NULL)
|
||||
printf("%s\n", result);
|
||||
else
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
1002
WINGs/Tests/wtest.c
Normal file
1002
WINGs/Tests/wtest.c
Normal file
File diff suppressed because it is too large
Load Diff
1431
WINGs/WINGs.h
1431
WINGs/WINGs.h
File diff suppressed because it is too large
Load Diff
8
WINGs/WINGs/Makefile.am
Normal file
8
WINGs/WINGs/Makefile.am
Normal file
@@ -0,0 +1,8 @@
|
||||
## automake input file for WINGs - Headers subdir
|
||||
|
||||
AUTOMAKE_OPTIONS =
|
||||
|
||||
# is this a kluge? if so, how should i do it?
|
||||
includedir = @includedir@/WINGs
|
||||
|
||||
include_HEADERS = WINGs.h WUtil.h WINGsP.h proplist-compat.h
|
||||
1838
WINGs/WINGs/WINGs.h
Normal file
1838
WINGs/WINGs/WINGs.h
Normal file
File diff suppressed because it is too large
Load Diff
639
WINGs/WINGs/WINGsP.h
Normal file
639
WINGs/WINGs/WINGsP.h
Normal file
@@ -0,0 +1,639 @@
|
||||
#ifndef _WINGSP_H_
|
||||
#define _WINGSP_H_
|
||||
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
|
||||
#include <WINGs/WINGs.h>
|
||||
|
||||
#if WINGS_H_VERSION < 20041030
|
||||
#error There_is_an_old_WINGs.h_file_somewhere_in_your_system._Please_remove_it.
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#define DOUBLE_BUFFER 1
|
||||
|
||||
#define WC_UserWidget 128
|
||||
|
||||
#define SCROLLER_WIDTH 20
|
||||
|
||||
#define XDND_VERSION 3
|
||||
|
||||
|
||||
typedef struct W_Application {
|
||||
char *applicationName;
|
||||
int argc;
|
||||
char **argv;
|
||||
char *resourcePath;
|
||||
} W_Application;
|
||||
|
||||
|
||||
typedef struct W_Font {
|
||||
struct W_Screen *screen;
|
||||
|
||||
struct _XftFont *font;
|
||||
|
||||
short height;
|
||||
short y;
|
||||
short refCount;
|
||||
char *name;
|
||||
} W_Font;
|
||||
|
||||
|
||||
typedef struct W_Pixmap {
|
||||
struct W_Screen *screen;
|
||||
Pixmap pixmap;
|
||||
Pixmap mask;
|
||||
unsigned short width;
|
||||
unsigned short height;
|
||||
short depth;
|
||||
short refCount;
|
||||
} W_Pixmap;
|
||||
|
||||
|
||||
typedef struct W_Color {
|
||||
struct W_Screen *screen;
|
||||
|
||||
XColor color;
|
||||
unsigned short alpha;
|
||||
short refCount;
|
||||
GC gc;
|
||||
struct {
|
||||
unsigned int exact:1;
|
||||
} flags;
|
||||
} W_Color;
|
||||
|
||||
|
||||
typedef struct W_FocusInfo {
|
||||
struct W_View *toplevel;
|
||||
struct W_View *focused; /* view that has the focus in this toplevel */
|
||||
struct W_FocusInfo *next;
|
||||
} W_FocusInfo;
|
||||
|
||||
|
||||
|
||||
typedef void* W_DndState(WMView *destView, XClientMessageEvent *event,
|
||||
WMDraggingInfo *info);
|
||||
|
||||
|
||||
typedef struct W_DragOperationItem {
|
||||
WMDragOperationType type;
|
||||
char* text;
|
||||
} W_DragOperationItem;
|
||||
|
||||
|
||||
typedef struct W_DragSourceInfo {
|
||||
WMView *sourceView;
|
||||
Window destinationWindow;
|
||||
W_DndState *state;
|
||||
WMSelectionProcs *selectionProcs;
|
||||
Window icon;
|
||||
WMPoint imageLocation;
|
||||
WMPoint mouseOffset; /* mouse pos in icon */
|
||||
Cursor dragCursor;
|
||||
WMRect noPositionMessageZone;
|
||||
Atom firstThreeTypes[3];
|
||||
} W_DragSourceInfo;
|
||||
|
||||
|
||||
typedef struct W_DragDestinationInfo {
|
||||
WMView *destView;
|
||||
WMView *xdndAwareView;
|
||||
Window sourceWindow;
|
||||
W_DndState *state;
|
||||
Bool sourceActionChanged;
|
||||
WMArray *sourceTypes;
|
||||
WMArray *requiredTypes;
|
||||
Bool typeListAvailable;
|
||||
WMArray *dropDatas;
|
||||
} W_DragDestinationInfo;
|
||||
|
||||
|
||||
struct W_DraggingInfo {
|
||||
unsigned char protocolVersion; /* version supported on the other side */
|
||||
Time timestamp;
|
||||
|
||||
Atom sourceAction;
|
||||
Atom destinationAction;
|
||||
|
||||
W_DragSourceInfo* sourceInfo; /* infos needed by source */
|
||||
W_DragDestinationInfo* destInfo; /* infos needed by destination */
|
||||
} W_DraggingInfo;
|
||||
|
||||
|
||||
typedef struct W_Screen {
|
||||
Display *display;
|
||||
int screen;
|
||||
int depth;
|
||||
|
||||
Colormap colormap;
|
||||
|
||||
Visual *visual;
|
||||
|
||||
Time lastEventTime;
|
||||
|
||||
Window rootWin;
|
||||
|
||||
struct W_View *rootView;
|
||||
|
||||
RContext *rcontext;
|
||||
|
||||
struct W_IMContext *imctx;
|
||||
|
||||
struct _XftDraw *xftdraw; /* shared XftDraw */
|
||||
|
||||
/* application related */
|
||||
|
||||
W_FocusInfo *focusInfo;
|
||||
|
||||
RImage *applicationIconImage; /* image (can have alpha channel) */
|
||||
struct W_Pixmap *applicationIconPixmap; /* pixmap - no alpha channel */
|
||||
Window applicationIconWindow;
|
||||
|
||||
struct W_Window *windowList; /* list of windows in the app */
|
||||
|
||||
Window groupLeader; /* the leader of the application */
|
||||
/* also used for other things */
|
||||
|
||||
struct W_SelectionHandlers *selectionHandlerList;
|
||||
|
||||
struct {
|
||||
unsigned int hasAppIcon:1;
|
||||
unsigned int simpleApplication:1;
|
||||
} aflags;
|
||||
|
||||
WMOpenPanel *sharedOpenPanel;
|
||||
WMSavePanel *sharedSavePanel;
|
||||
|
||||
struct W_FontPanel *sharedFontPanel;
|
||||
|
||||
struct W_ColorPanel *sharedColorPanel;
|
||||
|
||||
Pixmap stipple;
|
||||
|
||||
struct W_View *dragSourceView;
|
||||
struct W_DraggingInfo dragInfo;
|
||||
|
||||
/* colors */
|
||||
W_Color *white;
|
||||
W_Color *black;
|
||||
W_Color *gray;
|
||||
W_Color *darkGray;
|
||||
|
||||
GC stippleGC;
|
||||
|
||||
GC copyGC;
|
||||
GC clipGC;
|
||||
|
||||
GC monoGC; /* GC for 1bpp visuals */
|
||||
|
||||
GC xorGC;
|
||||
|
||||
GC ixorGC; /* IncludeInferiors XOR */
|
||||
|
||||
GC drawStringGC; /* for WMDrawString() */
|
||||
|
||||
GC drawImStringGC; /* for WMDrawImageString() */
|
||||
|
||||
W_Font *normalFont;
|
||||
|
||||
W_Font *boldFont;
|
||||
|
||||
WMHashTable *fontCache;
|
||||
|
||||
Bool antialiasedText;
|
||||
|
||||
unsigned int ignoredModifierMask; /* modifiers to ignore when typing txt */
|
||||
|
||||
struct W_Balloon *balloon;
|
||||
|
||||
|
||||
struct W_Pixmap *checkButtonImageOn;
|
||||
struct W_Pixmap *checkButtonImageOff;
|
||||
|
||||
struct W_Pixmap *radioButtonImageOn;
|
||||
struct W_Pixmap *radioButtonImageOff;
|
||||
|
||||
struct W_Pixmap *buttonArrow;
|
||||
struct W_Pixmap *pushedButtonArrow;
|
||||
|
||||
struct W_Pixmap *scrollerDimple;
|
||||
|
||||
struct W_Pixmap *upArrow;
|
||||
struct W_Pixmap *downArrow;
|
||||
struct W_Pixmap *leftArrow;
|
||||
struct W_Pixmap *rightArrow;
|
||||
|
||||
struct W_Pixmap *hiUpArrow;
|
||||
struct W_Pixmap *hiDownArrow;
|
||||
struct W_Pixmap *hiLeftArrow;
|
||||
struct W_Pixmap *hiRightArrow;
|
||||
|
||||
struct W_Pixmap *pullDownIndicator;
|
||||
struct W_Pixmap *popUpIndicator;
|
||||
|
||||
struct W_Pixmap *checkMark;
|
||||
|
||||
struct W_Pixmap *homeIcon;
|
||||
struct W_Pixmap *altHomeIcon;
|
||||
|
||||
struct W_Pixmap *trashcanIcon;
|
||||
struct W_Pixmap *altTrashcanIcon;
|
||||
|
||||
struct W_Pixmap *createDirIcon;
|
||||
struct W_Pixmap *altCreateDirIcon;
|
||||
|
||||
struct W_Pixmap *disketteIcon;
|
||||
struct W_Pixmap *altDisketteIcon;
|
||||
struct W_Pixmap *unmountIcon;
|
||||
struct W_Pixmap *altUnmountIcon;
|
||||
|
||||
struct W_Pixmap *magnifyIcon;
|
||||
/*struct W_Pixmap *altMagnifyIcon;*/
|
||||
struct W_Pixmap *wheelIcon;
|
||||
struct W_Pixmap *grayIcon;
|
||||
struct W_Pixmap *rgbIcon;
|
||||
struct W_Pixmap *cmykIcon;
|
||||
struct W_Pixmap *hsbIcon;
|
||||
struct W_Pixmap *customPaletteIcon;
|
||||
struct W_Pixmap *colorListIcon;
|
||||
|
||||
struct W_Pixmap *defaultObjectIcon;
|
||||
|
||||
Cursor defaultCursor;
|
||||
|
||||
Cursor textCursor;
|
||||
|
||||
Cursor invisibleCursor;
|
||||
|
||||
Atom attribsAtom; /* GNUstepWindowAttributes */
|
||||
|
||||
Atom deleteWindowAtom; /* WM_DELETE_WINDOW */
|
||||
|
||||
Atom protocolsAtom; /* _XA_WM_PROTOCOLS */
|
||||
|
||||
Atom clipboardAtom; /* CLIPBOARD */
|
||||
|
||||
Atom xdndAwareAtom; /* XdndAware */
|
||||
Atom xdndSelectionAtom;
|
||||
Atom xdndEnterAtom;
|
||||
Atom xdndLeaveAtom;
|
||||
Atom xdndPositionAtom;
|
||||
Atom xdndDropAtom;
|
||||
Atom xdndFinishedAtom;
|
||||
Atom xdndTypeListAtom;
|
||||
Atom xdndActionListAtom;
|
||||
Atom xdndActionDescriptionAtom;
|
||||
Atom xdndStatusAtom;
|
||||
|
||||
Atom xdndActionCopy;
|
||||
Atom xdndActionMove;
|
||||
Atom xdndActionLink;
|
||||
Atom xdndActionAsk;
|
||||
Atom xdndActionPrivate;
|
||||
|
||||
Atom wmIconDragOffsetAtom;
|
||||
|
||||
Atom wmStateAtom; /* WM_STATE */
|
||||
|
||||
Atom utf8String;
|
||||
|
||||
Atom netwmName;
|
||||
Atom netwmIconName;
|
||||
Atom netwmIcon;
|
||||
|
||||
/* stuff for detecting double-clicks */
|
||||
Time lastClickTime; /* time of last mousedown event */
|
||||
Window lastClickWindow; /* window of the last mousedown */
|
||||
|
||||
struct W_View *modalView;
|
||||
unsigned modalLoop:1;
|
||||
unsigned ignoreNextDoubleClick:1;
|
||||
} W_Screen;
|
||||
|
||||
|
||||
|
||||
typedef struct W_ViewDelegate {
|
||||
void *data;
|
||||
|
||||
void (*didMove)(struct W_ViewDelegate*, WMView*);
|
||||
|
||||
void (*didResize)(struct W_ViewDelegate*, WMView*);
|
||||
|
||||
void (*willMove)(struct W_ViewDelegate*, WMView*, int*, int*);
|
||||
|
||||
void (*willResize)(struct W_ViewDelegate*, WMView*,
|
||||
unsigned int*, unsigned int*);
|
||||
} W_ViewDelegate;
|
||||
|
||||
|
||||
|
||||
typedef struct W_View {
|
||||
struct W_Screen *screen;
|
||||
|
||||
WMWidget *self; /* must point to the widget the view belongs to */
|
||||
|
||||
W_ViewDelegate *delegate;
|
||||
|
||||
Window window;
|
||||
|
||||
WMSize size;
|
||||
|
||||
short topOffs;
|
||||
short leftOffs;
|
||||
short bottomOffs;
|
||||
short rightOffs;
|
||||
|
||||
WMPoint pos;
|
||||
|
||||
struct W_View *nextFocusChain; /* next/prev in focus chain */
|
||||
struct W_View *prevFocusChain;
|
||||
|
||||
struct W_View *nextResponder; /* next to receive keyboard events */
|
||||
|
||||
struct W_View *parent; /* parent WMView */
|
||||
|
||||
struct W_View *childrenList; /* first in list of child windows */
|
||||
|
||||
struct W_View *nextSister; /* next on parent's children list */
|
||||
|
||||
WMArray *eventHandlers; /* event handlers for this window */
|
||||
|
||||
unsigned long attribFlags;
|
||||
XSetWindowAttributes attribs;
|
||||
|
||||
void *hangedData; /* data holder for user program */
|
||||
|
||||
WMColor *backColor;
|
||||
|
||||
Cursor cursor;
|
||||
|
||||
Atom *droppableTypes;
|
||||
struct W_DragSourceProcs *dragSourceProcs;
|
||||
struct W_DragDestinationProcs *dragDestinationProcs;
|
||||
WMPixmap *dragImage;
|
||||
int helpContext;
|
||||
|
||||
XIC xic;
|
||||
|
||||
struct {
|
||||
unsigned int realized:1;
|
||||
unsigned int mapped:1;
|
||||
unsigned int parentDying:1;
|
||||
unsigned int dying:1; /* the view is being destroyed */
|
||||
unsigned int topLevel:1; /* is a top level window */
|
||||
unsigned int root:1; /* is the root window */
|
||||
unsigned int mapWhenRealized:1; /* map the view when it's realized */
|
||||
unsigned int alreadyDead:1; /* view was freed */
|
||||
|
||||
unsigned int dontCompressMotion:1; /* motion notify event compress */
|
||||
unsigned int notifySizeChanged:1;
|
||||
unsigned int dontCompressExpose:1; /* expose event compress */
|
||||
|
||||
/* toplevel only */
|
||||
unsigned int worksWhenModal:1;
|
||||
unsigned int pendingRelease1:1;
|
||||
unsigned int pendingRelease2:1;
|
||||
unsigned int pendingRelease3:1;
|
||||
unsigned int pendingRelease4:1;
|
||||
unsigned int pendingRelease5:1;
|
||||
unsigned int xdndHintSet:1;
|
||||
} flags;
|
||||
|
||||
int refCount;
|
||||
} W_View;
|
||||
|
||||
|
||||
typedef struct W_EventHandler {
|
||||
unsigned long eventMask;
|
||||
|
||||
WMEventProc *proc;
|
||||
|
||||
void *clientData;
|
||||
} W_EventHandler;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct _WINGsConfiguration {
|
||||
char *systemFont;
|
||||
char *boldSystemFont;
|
||||
int defaultFontSize;
|
||||
Bool antialiasedText;
|
||||
char *floppyPath;
|
||||
unsigned doubleClickDelay;
|
||||
unsigned mouseWheelUp;
|
||||
unsigned mouseWheelDown;
|
||||
} _WINGsConfiguration;
|
||||
|
||||
extern _WINGsConfiguration WINGsConfiguration;
|
||||
|
||||
|
||||
|
||||
#define CHECK_CLASS(widget, class) assert(W_CLASS(widget)==(class))
|
||||
|
||||
|
||||
#define W_CLASS(widget) (((W_WidgetType*)(widget))->widgetClass)
|
||||
#define W_VIEW(widget) (((W_WidgetType*)(widget))->view)
|
||||
|
||||
#define W_VIEW_REALIZED(view) (view)->flags.realized
|
||||
#define W_VIEW_MAPPED(view) (view)->flags.mapped
|
||||
|
||||
#define W_VIEW_DISPLAY(view) (view)->screen->display
|
||||
#define W_VIEW_SCREEN(view) (view)->screen
|
||||
#define W_VIEW_DRAWABLE(view) (view)->window
|
||||
|
||||
#define W_VIEW_WIDTH(view) (view)->size.width
|
||||
#define W_VIEW_HEIGHT(view) (view)->size.height
|
||||
|
||||
|
||||
#define W_PIXEL(c) (c)->color.pixel
|
||||
|
||||
#define W_FONTID(f) (f)->font->fid
|
||||
|
||||
#define W_DRAWABLE(scr) (scr)->rcontext->drawable
|
||||
|
||||
|
||||
|
||||
W_View *W_GetViewForXWindow(Display *display, Window window);
|
||||
|
||||
W_View *W_CreateView(W_View *parent);
|
||||
|
||||
W_View *W_CreateTopView(W_Screen *screen);
|
||||
|
||||
W_View *W_CreateUnmanagedTopView(W_Screen *screen);
|
||||
|
||||
|
||||
W_View *W_CreateRootView(W_Screen *screen);
|
||||
|
||||
void W_DestroyView(W_View *view);
|
||||
|
||||
void W_RealizeView(W_View *view);
|
||||
|
||||
void W_ReparentView(W_View *view, W_View *newParent, int x, int y);
|
||||
|
||||
void W_RaiseView(W_View *view);
|
||||
|
||||
void W_LowerView(W_View *view);
|
||||
|
||||
|
||||
void W_MapView(W_View *view);
|
||||
|
||||
void W_MapSubviews(W_View *view);
|
||||
|
||||
void W_UnmapSubviews(W_View *view);
|
||||
|
||||
W_View *W_TopLevelOfView(W_View *view);
|
||||
|
||||
void W_UnmapView(W_View *view);
|
||||
|
||||
void W_MoveView(W_View *view, int x, int y);
|
||||
|
||||
void W_ResizeView(W_View *view, unsigned int width, unsigned int height);
|
||||
|
||||
void W_SetViewBackgroundColor(W_View *view, WMColor *color);
|
||||
|
||||
void W_SetViewCursor(W_View *view, Cursor cursor);
|
||||
|
||||
void W_DrawRelief(W_Screen *scr, Drawable d, int x, int y, unsigned int width,
|
||||
unsigned int height, WMReliefType relief);
|
||||
|
||||
void W_DrawReliefWithGC(W_Screen *scr, Drawable d, int x, int y,
|
||||
unsigned int width, unsigned int height,
|
||||
WMReliefType relief,
|
||||
GC black, GC dark, GC light, GC white);
|
||||
|
||||
void W_CallDestroyHandlers(W_View *view);
|
||||
|
||||
void W_PaintTextAndImage(W_View *view, int wrap, WMColor *textColor,
|
||||
W_Font *font, WMReliefType relief, char *text,
|
||||
WMAlignment alignment, W_Pixmap *image,
|
||||
WMImagePosition position, WMColor *backColor, int ofs);
|
||||
|
||||
void W_PaintText(W_View *view, Drawable d, WMFont *font, int x, int y,
|
||||
int width, WMAlignment alignment, WMColor *color,
|
||||
int wrap, char *text, int length);
|
||||
|
||||
int W_GetTextHeight(WMFont *font, char *text, int width, int wrap);
|
||||
|
||||
|
||||
int W_TextWidth(WMFont *font, char *text, int length);
|
||||
|
||||
|
||||
void W_BroadcastMessage(W_View *targetParent, XEvent *event);
|
||||
|
||||
void W_DispatchMessage(W_View *target, XEvent *event);
|
||||
|
||||
void W_SetFocusOfToplevel(W_View *toplevel, W_View *view);
|
||||
|
||||
W_View *W_FocusedViewOfToplevel(W_View *view);
|
||||
|
||||
void W_SetFocusOfTopLevel(W_View *toplevel, W_View *view);
|
||||
|
||||
void W_ReleaseView(WMView *view);
|
||||
|
||||
WMView *W_RetainView(WMView *view);
|
||||
|
||||
void W_InitApplication(WMScreen *scr);
|
||||
|
||||
void W_InitNotificationCenter(void);
|
||||
|
||||
W_Class W_RegisterUserWidget(void);
|
||||
|
||||
void W_RedisplayView(WMView *view);
|
||||
|
||||
Bool W_ApplicationInitialized(void);
|
||||
|
||||
void W_HandleSelectionEvent(XEvent *event);
|
||||
|
||||
void W_HandleDNDClientMessage(WMView *toplevel, XClientMessageEvent *event);
|
||||
|
||||
void W_FlushASAPNotificationQueue(void);
|
||||
|
||||
void W_FlushIdleNotificationQueue(void);
|
||||
|
||||
struct W_Balloon *W_CreateBalloon(WMScreen *scr);
|
||||
|
||||
void W_BalloonHandleEnterView(WMView *view);
|
||||
|
||||
void W_BalloonHandleLeaveView(WMView *view);
|
||||
|
||||
Bool W_CheckIdleHandlers(void);
|
||||
|
||||
void W_CheckTimerHandlers(void);
|
||||
|
||||
Bool W_HandleInputEvents(Bool waitForInput, int inputfd);
|
||||
|
||||
/* XDnD */
|
||||
Atom W_OperationToAction(WMScreen *scr, WMDragOperationType operation);
|
||||
|
||||
WMDragOperationType W_ActionToOperation(WMScreen *scr, Atom action);
|
||||
|
||||
void W_FreeDragOperationItem(void* item);
|
||||
|
||||
Bool W_SendDnDClientMessage(Display *dpy, Window win, Atom message,
|
||||
unsigned long data1, unsigned long data2,
|
||||
unsigned long data3, unsigned long data4,
|
||||
unsigned long data5);
|
||||
|
||||
void W_DragSourceStartTimer(WMDraggingInfo *info);
|
||||
|
||||
void W_DragSourceStopTimer(void);
|
||||
|
||||
void W_DragSourceStateHandler(WMDraggingInfo *info, XClientMessageEvent *event);
|
||||
|
||||
void W_DragDestinationStartTimer(WMDraggingInfo *info);
|
||||
|
||||
void W_DragDestinationStopTimer(void);
|
||||
|
||||
void W_DragDestinationStoreEnterMsgInfo(WMDraggingInfo *info, WMView *toplevel,
|
||||
XClientMessageEvent *event);
|
||||
|
||||
void W_DragDestinationStorePositionMsgInfo(WMDraggingInfo *info,
|
||||
WMView *toplevel,
|
||||
XClientMessageEvent *event);
|
||||
|
||||
void W_DragDestinationCancelDropOnEnter(WMView *toplevel, WMDraggingInfo *info);
|
||||
|
||||
void W_DragDestinationStateHandler(WMDraggingInfo *info,
|
||||
XClientMessageEvent *event);
|
||||
|
||||
void W_DragDestinationInfoClear(WMDraggingInfo *info);
|
||||
|
||||
void W_FreeViewXdndPart(WMView *view);
|
||||
|
||||
/* XIM */
|
||||
void W_InitIM(WMScreen *scr);
|
||||
|
||||
void W_CreateIC(WMView *view);
|
||||
|
||||
void W_DestroyIC(WMView *view);
|
||||
|
||||
void W_FocusIC(WMView *view);
|
||||
|
||||
void W_UnFocusIC(WMView *view);
|
||||
|
||||
void W_SetPreeditPositon(W_View *view, int x, int y);
|
||||
|
||||
int W_LookupString(W_View *view, XKeyPressedEvent *event, char *buffer,
|
||||
int buflen, KeySym *keysym, Status *status);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* _WINGSP_H_ */
|
||||
|
||||
881
WINGs/WINGs/WUtil.h
Normal file
881
WINGs/WINGs/WUtil.h
Normal file
@@ -0,0 +1,881 @@
|
||||
#ifndef _WUTIL_H_
|
||||
#define _WUTIL_H_
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <limits.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* SunOS 4.x Blargh.... */
|
||||
#ifndef NULL
|
||||
#define NULL ((void*)0)
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef WMAX
|
||||
# define WMAX(a,b) ((a)>(b) ? (a) : (b))
|
||||
#endif
|
||||
#ifndef WMIN
|
||||
# define WMIN(a,b) ((a)<(b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef __ASSERT_FUNCTION
|
||||
# if (!defined (__GNUC__) || (__GNUC__ < 2 && \
|
||||
__GNUC_MINOR__ < (defined (__cplusplus) ? 6 : 4)))
|
||||
# define __ASSERT_FUNCTION ((char *) 0)
|
||||
# else
|
||||
# define __ASSERT_FUNCTION __PRETTY_FUNCTION__
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef __GNUC__
|
||||
#define __attribute__(x) /*NOTHING*/
|
||||
#endif
|
||||
|
||||
#ifdef NDEBUG
|
||||
|
||||
#define wassertr(expr) {}
|
||||
#define wassertrv(expr, val) {}
|
||||
|
||||
#else /* !NDEBUG */
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#define wassertr(expr) assert(expr)
|
||||
|
||||
#define wassertrv(expr, val) assert(expr)
|
||||
|
||||
#else /* !DEBUG */
|
||||
|
||||
#define wassertr(expr) \
|
||||
if (!(expr)) { \
|
||||
wwarning("%s line %i (%s): assertion %s failed",\
|
||||
__FILE__, __LINE__, __ASSERT_FUNCTION, #expr);\
|
||||
return;\
|
||||
}
|
||||
|
||||
#define wassertrv(expr, val) \
|
||||
if (!(expr)) { \
|
||||
wwarning("%s line %i (%s): assertion %s failed",\
|
||||
__FILE__, __LINE__, __ASSERT_FUNCTION, #expr);\
|
||||
return (val);\
|
||||
}
|
||||
#endif /* !DEBUG */
|
||||
|
||||
#endif /* !NDEBUG */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
typedef enum {
|
||||
WMPostWhenIdle = 1,
|
||||
WMPostASAP = 2,
|
||||
WMPostNow = 3
|
||||
} WMPostingStyle;
|
||||
|
||||
|
||||
typedef enum {
|
||||
WNCNone = 0,
|
||||
WNCOnName = 1,
|
||||
WNCOnSender = 2
|
||||
} WMNotificationCoalescing;
|
||||
|
||||
|
||||
|
||||
enum {
|
||||
WBNotFound = INT_MIN, /* element was not found in WMBag */
|
||||
WANotFound = -1 /* element was not found in WMArray */
|
||||
};
|
||||
|
||||
|
||||
typedef struct W_Array WMArray;
|
||||
typedef struct W_Bag WMBag;
|
||||
typedef struct W_Data WMData;
|
||||
typedef struct W_TreeNode WMTreeNode;
|
||||
typedef struct W_HashTable WMHashTable;
|
||||
typedef struct W_UserDefaults WMUserDefaults;
|
||||
typedef struct W_Notification WMNotification;
|
||||
typedef struct W_NotificationQueue WMNotificationQueue;
|
||||
typedef struct W_Host WMHost;
|
||||
typedef struct W_Connection WMConnection;
|
||||
typedef struct W_PropList WMPropList;
|
||||
|
||||
|
||||
|
||||
/* Some typedefs for the handler stuff */
|
||||
typedef void *WMHandlerID;
|
||||
|
||||
typedef void WMCallback(void *data);
|
||||
|
||||
typedef void WMInputProc(int fd, int mask, void *clientData);
|
||||
|
||||
|
||||
|
||||
typedef int WMCompareDataProc(const void *item1, const void *item2);
|
||||
typedef void WMTreeWalkProc(WMTreeNode *aNode, void *data);
|
||||
|
||||
typedef void WMFreeDataProc(void *data);
|
||||
|
||||
/* Used by WMBag or WMArray for matching data */
|
||||
typedef int WMMatchDataProc(const void *item, const void *cdata);
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
int position;
|
||||
int count;
|
||||
} WMRange;
|
||||
|
||||
|
||||
|
||||
/* DO NOT ACCESS THE CONTENTS OF THIS STRUCT */
|
||||
typedef struct {
|
||||
void *table;
|
||||
void *nextItem;
|
||||
int index;
|
||||
} WMHashEnumerator;
|
||||
|
||||
|
||||
typedef struct {
|
||||
/* NULL is pointer hash */
|
||||
unsigned (*hash)(const void *);
|
||||
/* NULL is pointer compare */
|
||||
Bool (*keyIsEqual)(const void *, const void *);
|
||||
/* NULL does nothing */
|
||||
void* (*retainKey)(const void *);
|
||||
/* NULL does nothing */
|
||||
void (*releaseKey)(const void *);
|
||||
} WMHashTableCallbacks;
|
||||
|
||||
|
||||
typedef int WMArrayIterator;
|
||||
typedef void *WMBagIterator;
|
||||
|
||||
|
||||
typedef void WMNotificationObserverAction(void *observerData,
|
||||
WMNotification *notification);
|
||||
|
||||
|
||||
/* ---[ WINGs/memory.c ]-------------------------------------------------- */
|
||||
|
||||
void* wmalloc(size_t size);
|
||||
void* wrealloc(void *ptr, size_t newsize);
|
||||
void wfree(void *ptr);
|
||||
|
||||
void wrelease(void *ptr);
|
||||
void* wretain(void *ptr);
|
||||
|
||||
typedef void waborthandler(int);
|
||||
|
||||
waborthandler* wsetabort(waborthandler* handler);
|
||||
|
||||
/* ---[ WINGs/error.c ]--------------------------------------------------- */
|
||||
|
||||
enum {
|
||||
WMESSAGE_TYPE_MESSAGE,
|
||||
WMESSAGE_TYPE_WARNING,
|
||||
WMESSAGE_TYPE_ERROR,
|
||||
WMESSAGE_TYPE_FATAL
|
||||
};
|
||||
|
||||
#define wmessage(fmt, args...) __wmessage( __func__, __FILE__, __LINE__, WMESSAGE_TYPE_MESSAGE, fmt, ## args)
|
||||
#define wwarning(fmt, args...) __wmessage( __func__, __FILE__, __LINE__, WMESSAGE_TYPE_WARNING, fmt, ## args)
|
||||
#define werror(fmt, args...) __wmessage( __func__, __FILE__, __LINE__, WMESSAGE_TYPE_ERROR, fmt, ## args)
|
||||
#define wfatal(fmt, args...) __wmessage( __func__, __FILE__, __LINE__, WMESSAGE_TYPE_FATAL, fmt, ## args)
|
||||
|
||||
void __wmessage(const char *func, const char *file, int line, int type, const char *msg, ...)
|
||||
__attribute__((__format__(printf,5,6)));
|
||||
|
||||
/* ---[ WINGs/findfile.c ]------------------------------------------------ */
|
||||
|
||||
char* wfindfile(char *paths, char *file);
|
||||
|
||||
char* wfindfileinlist(char **path_list, char *file);
|
||||
|
||||
char* wfindfileinarray(WMPropList* array, char *file);
|
||||
|
||||
char* wexpandpath(char *path);
|
||||
|
||||
/* don't free the returned string */
|
||||
char* wgethomedir(void);
|
||||
|
||||
/* ---[ WINGs/proplist.c ]------------------------------------------------ */
|
||||
|
||||
int wmkdirhier(const char *path);
|
||||
int wrmdirhier(const char *path);
|
||||
|
||||
/* ---[ WINGs/string.c ]-------------------------------------------------- */
|
||||
|
||||
char *wstrdup(const char *str);
|
||||
char* wstrndup(const char *str, size_t len);
|
||||
|
||||
/* Concatenate str1 with str2 and return that in a newly malloc'ed string.
|
||||
* str1 and str2 can be any strings including static and constant strings.
|
||||
* str1 and str2 will not be modified.
|
||||
* Free the returned string when you're done with it. */
|
||||
char* wstrconcat(char *str1, char *str2);
|
||||
|
||||
/* This will append src to dst, and return dst. dst MUST be either NULL
|
||||
* or a string that was a result of a dynamic allocation (malloc, realloc
|
||||
* wmalloc, wrealloc, ...). dst CANNOT be a static or a constant string!
|
||||
* Modifies dst (no new string is created except if dst==NULL in which case
|
||||
* it is equivalent to calling wstrdup(src) ).
|
||||
* The returned address may be different from the original address of dst,
|
||||
* so always assign the returned address to avoid dangling pointers. */
|
||||
char* wstrappend(char *dst, char *src);
|
||||
|
||||
size_t wstrlcpy(char *, const char *, size_t);
|
||||
size_t wstrlcat(char *, const char *, size_t);
|
||||
|
||||
|
||||
void wtokensplit(char *command, char ***argv, int *argc);
|
||||
|
||||
char* wtokennext(char *word, char **next);
|
||||
|
||||
char* wtokenjoin(char **list, int count);
|
||||
|
||||
void wtokenfree(char **tokens, int count);
|
||||
|
||||
char* wtrimspace(const char *s);
|
||||
|
||||
/* transform `s' so that the result is safe to pass to the shell as an argument.
|
||||
* returns a newly allocated string.
|
||||
* with very heavy inspirations from NetBSD's shquote(3).
|
||||
*/
|
||||
char *wshellquote(const char *s);
|
||||
|
||||
/* ---[ WINGs/wmisc.c ]--------------------------------------------------- */
|
||||
|
||||
WMRange wmkrange(int start, int count);
|
||||
|
||||
/* ---[ WINGs/usleep.c ]-------------------------------------------------- */
|
||||
|
||||
void wusleep(unsigned int usec);
|
||||
|
||||
/* ---[ WINGs/handlers.c ]------------------------------------------------ */
|
||||
|
||||
/* Event handlers: timer, idle, input */
|
||||
|
||||
WMHandlerID WMAddTimerHandler(int milliseconds, WMCallback *callback,
|
||||
void *cdata);
|
||||
|
||||
WMHandlerID WMAddPersistentTimerHandler(int milliseconds, WMCallback *callback,
|
||||
void *cdata);
|
||||
|
||||
void WMDeleteTimerWithClientData(void *cdata);
|
||||
|
||||
void WMDeleteTimerHandler(WMHandlerID handlerID);
|
||||
|
||||
WMHandlerID WMAddIdleHandler(WMCallback *callback, void *cdata);
|
||||
|
||||
void WMDeleteIdleHandler(WMHandlerID handlerID);
|
||||
|
||||
WMHandlerID WMAddInputHandler(int fd, int condition, WMInputProc *proc,
|
||||
void *clientData);
|
||||
|
||||
void WMDeleteInputHandler(WMHandlerID handlerID);
|
||||
|
||||
|
||||
/* This function is used _only_ if you create a non-GUI program.
|
||||
* For GUI based programs use WMNextEvent()/WMHandleEvent() instead.
|
||||
* This function will handle all input/timer/idle events, then return.
|
||||
*/
|
||||
|
||||
void WHandleEvents(void);
|
||||
|
||||
/* ---[ WINGs/hashtable.c ]----------------------------------------------- */
|
||||
|
||||
|
||||
WMHashTable* WMCreateHashTable(WMHashTableCallbacks callbacks);
|
||||
|
||||
void WMFreeHashTable(WMHashTable *table);
|
||||
|
||||
void WMResetHashTable(WMHashTable *table);
|
||||
|
||||
unsigned WMCountHashTable(WMHashTable *table);
|
||||
|
||||
void* WMHashGet(WMHashTable *table, const void *key);
|
||||
|
||||
/* Returns True if there is a value associated with <key> in the table, in
|
||||
* which case <retKey> and <retItem> will contain the item's internal key
|
||||
* address and the item's value respectively.
|
||||
* If there is no value associated with <key> it will return False and in
|
||||
* this case <retKey> and <retItem> will be undefined.
|
||||
* Use this when you need to perform your own custom retain/release mechanism
|
||||
* which requires access to the keys too.
|
||||
*/
|
||||
Bool WMHashGetItemAndKey(WMHashTable *table, const void *key,
|
||||
void **retItem, void **retKey);
|
||||
|
||||
/* put data in table, replacing already existing data and returning
|
||||
* the old value */
|
||||
void* WMHashInsert(WMHashTable *table, const void *key, const void *data);
|
||||
|
||||
void WMHashRemove(WMHashTable *table, const void *key);
|
||||
|
||||
/* warning: do not manipulate the table while using the enumerator functions */
|
||||
WMHashEnumerator WMEnumerateHashTable(WMHashTable *table);
|
||||
|
||||
void* WMNextHashEnumeratorItem(WMHashEnumerator *enumerator);
|
||||
|
||||
void* WMNextHashEnumeratorKey(WMHashEnumerator *enumerator);
|
||||
|
||||
/* Returns True if there is a next element, in which case key and item
|
||||
* will contain the next element's key and value respectively.
|
||||
* If there is no next element available it will return False and in this
|
||||
* case key and item will be undefined.
|
||||
*/
|
||||
Bool WMNextHashEnumeratorItemAndKey(WMHashEnumerator *enumerator,
|
||||
void **item, void **key);
|
||||
|
||||
|
||||
|
||||
|
||||
/* some predefined callback sets */
|
||||
|
||||
extern const WMHashTableCallbacks WMIntHashCallbacks;
|
||||
/* sizeof(keys) are <= sizeof(void*) */
|
||||
|
||||
extern const WMHashTableCallbacks WMStringHashCallbacks;
|
||||
/* keys are strings. Strings will be copied with wstrdup()
|
||||
* and freed with wfree() */
|
||||
|
||||
extern const WMHashTableCallbacks WMStringPointerHashCallbacks;
|
||||
/* keys are strings, but they are not copied */
|
||||
|
||||
|
||||
/* ---[ WINGs/array.c ]--------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* WMArray use an array to store the elements.
|
||||
* Item indexes may be only positive integer numbers.
|
||||
* The array cannot contain holes in it.
|
||||
*
|
||||
* Pros:
|
||||
* Fast [O(1)] access to elements
|
||||
* Fast [O(1)] push/pop
|
||||
*
|
||||
* Cons:
|
||||
* A little slower [O(n)] for insertion/deletion of elements that
|
||||
* aren't in the end
|
||||
*/
|
||||
|
||||
WMArray* WMCreateArray(int initialSize);
|
||||
|
||||
WMArray* WMCreateArrayWithDestructor(int initialSize, WMFreeDataProc *destructor);
|
||||
|
||||
WMArray* WMCreateArrayWithArray(WMArray *array);
|
||||
|
||||
#define WMDuplicateArray(array) WMCreateArrayWithArray(array)
|
||||
|
||||
void WMEmptyArray(WMArray *array);
|
||||
|
||||
void WMFreeArray(WMArray *array);
|
||||
|
||||
int WMGetArrayItemCount(WMArray *array);
|
||||
|
||||
/* appends other to array. other remains unchanged */
|
||||
void WMAppendArray(WMArray *array, WMArray *other);
|
||||
|
||||
/* add will place the element at the end of the array */
|
||||
void WMAddToArray(WMArray *array, void *item);
|
||||
|
||||
/* insert will increment the index of elements after it by 1 */
|
||||
void WMInsertInArray(WMArray *array, int index, void *item);
|
||||
|
||||
/* replace and set will return the old item WITHOUT calling the
|
||||
* destructor on it even if its available. Free the returned item yourself.
|
||||
*/
|
||||
void* WMReplaceInArray(WMArray *array, int index, void *item);
|
||||
|
||||
#define WMSetInArray(array, index, item) WMReplaceInArray(array, index, item)
|
||||
|
||||
/* delete and remove will remove the elements and cause the elements
|
||||
* after them to decrement their indexes by 1. Also will call the
|
||||
* destructor on the deleted element if there's one available.
|
||||
*/
|
||||
int WMDeleteFromArray(WMArray *array, int index);
|
||||
|
||||
#define WMRemoveFromArray(array, item) WMRemoveFromArrayMatching(array, NULL, item)
|
||||
|
||||
int WMRemoveFromArrayMatching(WMArray *array, WMMatchDataProc *match, void *cdata);
|
||||
|
||||
void* WMGetFromArray(WMArray *array, int index);
|
||||
|
||||
#define WMGetFirstInArray(array, item) WMFindInArray(array, NULL, item)
|
||||
|
||||
/* pop will return the last element from the array, also removing it
|
||||
* from the array. The destructor is NOT called, even if available.
|
||||
* Free the returned element if needed by yourself
|
||||
*/
|
||||
void* WMPopFromArray(WMArray *array);
|
||||
|
||||
int WMFindInArray(WMArray *array, WMMatchDataProc *match, void *cdata);
|
||||
|
||||
int WMCountInArray(WMArray *array, void *item);
|
||||
|
||||
/* comparer must return:
|
||||
* < 0 if a < b
|
||||
* > 0 if a > b
|
||||
* = 0 if a = b
|
||||
*/
|
||||
void WMSortArray(WMArray *array, WMCompareDataProc *comparer);
|
||||
|
||||
void WMMapArray(WMArray *array, void (*function)(void*, void*), void *data);
|
||||
|
||||
WMArray* WMGetSubarrayWithRange(WMArray* array, WMRange aRange);
|
||||
|
||||
void* WMArrayFirst(WMArray *array, WMArrayIterator *iter);
|
||||
|
||||
void* WMArrayLast(WMArray *array, WMArrayIterator *iter);
|
||||
|
||||
/* The following 2 functions assume that the array doesn't change between calls */
|
||||
void* WMArrayNext(WMArray *array, WMArrayIterator *iter);
|
||||
|
||||
void* WMArrayPrevious(WMArray *array, WMArrayIterator *iter);
|
||||
|
||||
|
||||
/* The following 2 macros assume that the array doesn't change in the for loop */
|
||||
#define WM_ITERATE_ARRAY(array, var, i) \
|
||||
for (var = WMArrayFirst(array, &(i)); (i) != WANotFound; \
|
||||
var = WMArrayNext(array, &(i)))
|
||||
|
||||
#define WM_ETARETI_ARRAY(array, var, i) \
|
||||
for (var = WMArrayLast(array, &(i)); (i) != WANotFound; \
|
||||
var = WMArrayPrevious(array, &(i)))
|
||||
|
||||
/* ---[ WINGs/bagtree.c ]------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* Tree bags use a red-black tree for storage.
|
||||
* Item indexes may be any integer number.
|
||||
*
|
||||
* Pros:
|
||||
* O(lg n) insertion/deletion/search
|
||||
* Good for large numbers of elements with sparse indexes
|
||||
*
|
||||
* Cons:
|
||||
* O(lg n) insertion/deletion/search
|
||||
* Slow for storing small numbers of elements
|
||||
*/
|
||||
|
||||
#define WMCreateBag(size) WMCreateTreeBag()
|
||||
|
||||
#define WMCreateBagWithDestructor(size, d) WMCreateTreeBagWithDestructor(d)
|
||||
|
||||
WMBag* WMCreateTreeBag(void);
|
||||
|
||||
WMBag* WMCreateTreeBagWithDestructor(WMFreeDataProc *destructor);
|
||||
|
||||
int WMGetBagItemCount(WMBag *bag);
|
||||
|
||||
void WMAppendBag(WMBag *bag, WMBag *other);
|
||||
|
||||
void WMPutInBag(WMBag *bag, void *item);
|
||||
|
||||
/* insert will increment the index of elements after it by 1 */
|
||||
void WMInsertInBag(WMBag *bag, int index, void *item);
|
||||
|
||||
/* erase will remove the element from the bag,
|
||||
* but will keep the index of the other elements unchanged */
|
||||
int WMEraseFromBag(WMBag *bag, int index);
|
||||
|
||||
/* delete and remove will remove the elements and cause the elements
|
||||
* after them to decrement their indexes by 1 */
|
||||
int WMDeleteFromBag(WMBag *bag, int index);
|
||||
|
||||
int WMRemoveFromBag(WMBag *bag, void *item);
|
||||
|
||||
void* WMGetFromBag(WMBag *bag, int index);
|
||||
|
||||
void* WMReplaceInBag(WMBag *bag, int index, void *item);
|
||||
|
||||
#define WMSetInBag(bag, index, item) WMReplaceInBag(bag, index, item)
|
||||
|
||||
/* comparer must return:
|
||||
* < 0 if a < b
|
||||
* > 0 if a > b
|
||||
* = 0 if a = b
|
||||
*/
|
||||
void WMSortBag(WMBag *bag, WMCompareDataProc *comparer);
|
||||
|
||||
void WMEmptyBag(WMBag *bag);
|
||||
|
||||
void WMFreeBag(WMBag *bag);
|
||||
|
||||
void WMMapBag(WMBag *bag, void (*function)(void*, void*), void *data);
|
||||
|
||||
int WMGetFirstInBag(WMBag *bag, void *item);
|
||||
|
||||
int WMCountInBag(WMBag *bag, void *item);
|
||||
|
||||
int WMFindInBag(WMBag *bag, WMMatchDataProc *match, void *cdata);
|
||||
|
||||
void* WMBagFirst(WMBag *bag, WMBagIterator *ptr);
|
||||
|
||||
void* WMBagLast(WMBag *bag, WMBagIterator *ptr);
|
||||
|
||||
/* The following 4 functions assume that the bag doesn't change between calls */
|
||||
void* WMBagNext(WMBag *bag, WMBagIterator *ptr);
|
||||
|
||||
void* WMBagPrevious(WMBag *bag, WMBagIterator *ptr);
|
||||
|
||||
void* WMBagIteratorAtIndex(WMBag *bag, int index, WMBagIterator *ptr);
|
||||
|
||||
int WMBagIndexForIterator(WMBag *bag, WMBagIterator ptr);
|
||||
|
||||
|
||||
/* The following 2 macros assume that the bag doesn't change in the for loop */
|
||||
#define WM_ITERATE_BAG(bag, var, i) \
|
||||
for (var = WMBagFirst(bag, &(i)); (i) != NULL; \
|
||||
var = WMBagNext(bag, &(i)))
|
||||
|
||||
#define WM_ETARETI_BAG(bag, var, i) \
|
||||
for (var = WMBagLast(bag, &(i)); (i) != NULL; \
|
||||
var = WMBagPrevious(bag, &(i)))
|
||||
|
||||
|
||||
|
||||
/* ---[ WINGs/data.c ]---------------------------------------------------- */
|
||||
|
||||
/* WMData handling */
|
||||
|
||||
/* Creating/destroying data */
|
||||
|
||||
WMData* WMCreateDataWithCapacity(unsigned capacity);
|
||||
|
||||
WMData* WMCreateDataWithLength(unsigned length);
|
||||
|
||||
WMData* WMCreateDataWithBytes(void *bytes, unsigned length);
|
||||
|
||||
/* destructor is a function called to free the data when releasing the data
|
||||
* object, or NULL if no freeing of data is necesary. */
|
||||
WMData* WMCreateDataWithBytesNoCopy(void *bytes, unsigned length,
|
||||
WMFreeDataProc *destructor);
|
||||
|
||||
WMData* WMCreateDataWithData(WMData *aData);
|
||||
|
||||
WMData* WMRetainData(WMData *aData);
|
||||
|
||||
void WMReleaseData(WMData *aData);
|
||||
|
||||
/* Adjusting capacity */
|
||||
|
||||
void WMSetDataCapacity(WMData *aData, unsigned capacity);
|
||||
|
||||
void WMSetDataLength(WMData *aData, unsigned length);
|
||||
|
||||
void WMIncreaseDataLengthBy(WMData *aData, unsigned extraLength);
|
||||
|
||||
/* Accessing data */
|
||||
|
||||
const void* WMDataBytes(WMData *aData);
|
||||
|
||||
void WMGetDataBytes(WMData *aData, void *buffer);
|
||||
|
||||
void WMGetDataBytesWithLength(WMData *aData, void *buffer, unsigned length);
|
||||
|
||||
void WMGetDataBytesWithRange(WMData *aData, void *buffer, WMRange aRange);
|
||||
|
||||
WMData* WMGetSubdataWithRange(WMData *aData, WMRange aRange);
|
||||
|
||||
/* Testing data */
|
||||
|
||||
Bool WMIsDataEqualToData(WMData *aData, WMData *anotherData);
|
||||
|
||||
unsigned WMGetDataLength(WMData *aData);
|
||||
|
||||
/* Adding data */
|
||||
|
||||
void WMAppendDataBytes(WMData *aData, void *bytes, unsigned length);
|
||||
|
||||
void WMAppendData(WMData *aData, WMData *anotherData);
|
||||
|
||||
/* Modifying data */
|
||||
|
||||
void WMReplaceDataBytesInRange(WMData *aData, WMRange aRange, void *bytes);
|
||||
|
||||
void WMResetDataBytesInRange(WMData *aData, WMRange aRange);
|
||||
|
||||
void WMSetData(WMData *aData, WMData *anotherData);
|
||||
|
||||
|
||||
void WMSetDataFormat(WMData *aData, unsigned format);
|
||||
|
||||
unsigned WMGetDataFormat(WMData *aData);
|
||||
/* Storing data */
|
||||
|
||||
/* ---[ WINGs/tree.c ]---------------------------------------------------- */
|
||||
|
||||
/* Generic Tree and TreeNode */
|
||||
|
||||
WMTreeNode* WMCreateTreeNode(void *data);
|
||||
|
||||
WMTreeNode* WMCreateTreeNodeWithDestructor(void *data, WMFreeDataProc *destructor);
|
||||
|
||||
WMTreeNode* WMInsertItemInTree(WMTreeNode *parent, int index, void *item);
|
||||
|
||||
#define WMAddItemToTree(parent, item) WMInsertItemInTree(parent, -1, item)
|
||||
|
||||
WMTreeNode* WMInsertNodeInTree(WMTreeNode *parent, int index, WMTreeNode *aNode);
|
||||
|
||||
#define WMAddNodeToTree(parent, aNode) WMInsertNodeInTree(parent, -1, aNode)
|
||||
|
||||
void WMDestroyTreeNode(WMTreeNode *aNode);
|
||||
|
||||
void WMDeleteLeafForTreeNode(WMTreeNode *aNode, int index);
|
||||
|
||||
void WMRemoveLeafForTreeNode(WMTreeNode *aNode, void *leaf);
|
||||
|
||||
void* WMReplaceDataForTreeNode(WMTreeNode *aNode, void *newData);
|
||||
|
||||
void* WMGetDataForTreeNode(WMTreeNode *aNode);
|
||||
|
||||
int WMGetTreeNodeDepth(WMTreeNode *aNode);
|
||||
|
||||
WMTreeNode* WMGetParentForTreeNode(WMTreeNode *aNode);
|
||||
|
||||
/* Sort only the leaves of the passed node */
|
||||
void WMSortLeavesForTreeNode(WMTreeNode *aNode, WMCompareDataProc *comparer);
|
||||
|
||||
/* Sort all tree recursively starting from the passed node */
|
||||
void WMSortTree(WMTreeNode *aNode, WMCompareDataProc *comparer);
|
||||
|
||||
/* Returns the first node which matches node's data with cdata by 'match' */
|
||||
WMTreeNode* WMFindInTree(WMTreeNode *aTree, WMMatchDataProc *match, void *cdata);
|
||||
|
||||
/* Returns the first node where node's data matches cdata by 'match' and node is
|
||||
* at most `limit' depths down from `aTree'. */
|
||||
WMTreeNode *WMFindInTreeWithDepthLimit(WMTreeNode * aTree, WMMatchDataProc * match, void *cdata, int limit);
|
||||
|
||||
/* Returns first tree node that has data == cdata */
|
||||
#define WMGetFirstInTree(aTree, cdata) WMFindInTree(aTree, NULL, cdata)
|
||||
|
||||
/* Walk every node of aNode with `walk' */
|
||||
void WMTreeWalk(WMTreeNode *aNode, WMTreeWalkProc * walk, void *data, Bool DepthFirst);
|
||||
|
||||
/* ---[ WINGs/data.c ]---------------------------------------------------- */
|
||||
|
||||
|
||||
WMNotification* WMCreateNotification(const char *name, void *object, void *clientData);
|
||||
|
||||
void WMReleaseNotification(WMNotification *notification);
|
||||
|
||||
WMNotification* WMRetainNotification(WMNotification *notification);
|
||||
|
||||
void* WMGetNotificationClientData(WMNotification *notification);
|
||||
|
||||
void* WMGetNotificationObject(WMNotification *notification);
|
||||
|
||||
const char* WMGetNotificationName(WMNotification *notification);
|
||||
|
||||
|
||||
void WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
|
||||
void *observer, const char *name, void *object);
|
||||
|
||||
void WMPostNotification(WMNotification *notification);
|
||||
|
||||
void WMRemoveNotificationObserver(void *observer);
|
||||
|
||||
void WMRemoveNotificationObserverWithName(void *observer, const char *name,
|
||||
void *object);
|
||||
|
||||
void WMPostNotificationName(const char *name, void *object, void *clientData);
|
||||
|
||||
WMNotificationQueue* WMGetDefaultNotificationQueue(void);
|
||||
|
||||
WMNotificationQueue* WMCreateNotificationQueue(void);
|
||||
|
||||
void WMDequeueNotificationMatching(WMNotificationQueue *queue,
|
||||
WMNotification *notification,
|
||||
unsigned mask);
|
||||
|
||||
void WMEnqueueNotification(WMNotificationQueue *queue,
|
||||
WMNotification *notification,
|
||||
WMPostingStyle postingStyle);
|
||||
|
||||
void WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
|
||||
WMNotification *notification,
|
||||
WMPostingStyle postingStyle,
|
||||
unsigned coalesceMask);
|
||||
|
||||
|
||||
/* ---[ WINGs/proplist.c ]------------------------------------------------ */
|
||||
|
||||
/* Property Lists handling */
|
||||
|
||||
void WMPLSetCaseSensitive(Bool caseSensitive);
|
||||
|
||||
WMPropList* WMCreatePLString(char *str);
|
||||
|
||||
WMPropList* WMCreatePLData(WMData *data);
|
||||
|
||||
WMPropList* WMCreatePLDataWithBytes(unsigned char *bytes, unsigned int length);
|
||||
|
||||
WMPropList* WMCreatePLDataWithBytesNoCopy(unsigned char *bytes,
|
||||
unsigned int length,
|
||||
WMFreeDataProc *destructor);
|
||||
|
||||
WMPropList* WMCreatePLArray(WMPropList *elem, ...);
|
||||
|
||||
WMPropList* WMCreatePLDictionary(WMPropList *key, WMPropList *value, ...);
|
||||
|
||||
WMPropList* WMRetainPropList(WMPropList *plist);
|
||||
|
||||
void WMReleasePropList(WMPropList *plist);
|
||||
|
||||
/* Objects inserted in arrays and dictionaries will be retained,
|
||||
* so you can safely release them after insertion.
|
||||
* For dictionaries both the key and value are retained.
|
||||
* Objects removed from arrays or dictionaries are released */
|
||||
void WMInsertInPLArray(WMPropList *plist, int index, WMPropList *item);
|
||||
|
||||
void WMAddToPLArray(WMPropList *plist, WMPropList *item);
|
||||
|
||||
void WMDeleteFromPLArray(WMPropList *plist, int index);
|
||||
|
||||
void WMRemoveFromPLArray(WMPropList *plist, WMPropList *item);
|
||||
|
||||
void WMPutInPLDictionary(WMPropList *plist, WMPropList *key, WMPropList *value);
|
||||
|
||||
void WMRemoveFromPLDictionary(WMPropList *plist, WMPropList *key);
|
||||
|
||||
/* It will insert all key/value pairs from source into dest, overwriting
|
||||
* the values with the same keys from dest, keeping all values with keys
|
||||
* only present in dest unchanged */
|
||||
WMPropList* WMMergePLDictionaries(WMPropList *dest, WMPropList *source,
|
||||
Bool recursive);
|
||||
|
||||
/* It will remove all key/value pairs from dest for which there is an
|
||||
* identical key/value present in source. Entires only present in dest, or
|
||||
* which have different values in dest than in source will be preserved. */
|
||||
WMPropList* WMSubtractPLDictionaries(WMPropList *dest, WMPropList *source,
|
||||
Bool recursive);
|
||||
|
||||
int WMGetPropListItemCount(WMPropList *plist);
|
||||
|
||||
Bool WMIsPLString(WMPropList *plist);
|
||||
|
||||
Bool WMIsPLData(WMPropList *plist);
|
||||
|
||||
Bool WMIsPLArray(WMPropList *plist);
|
||||
|
||||
Bool WMIsPLDictionary(WMPropList *plist);
|
||||
|
||||
Bool WMIsPropListEqualTo(WMPropList *plist, WMPropList *other);
|
||||
|
||||
/* Returns a reference. Do not free it! */
|
||||
char* WMGetFromPLString(WMPropList *plist);
|
||||
|
||||
/* Returns a reference. Do not free it! */
|
||||
WMData* WMGetFromPLData(WMPropList *plist);
|
||||
|
||||
/* Returns a reference. Do not free it! */
|
||||
const unsigned char* WMGetPLDataBytes(WMPropList *plist);
|
||||
|
||||
int WMGetPLDataLength(WMPropList *plist);
|
||||
|
||||
/* Returns a reference. */
|
||||
WMPropList* WMGetFromPLArray(WMPropList *plist, int index);
|
||||
|
||||
/* Returns a reference. */
|
||||
WMPropList* WMGetFromPLDictionary(WMPropList *plist, WMPropList *key);
|
||||
|
||||
/* Returns a PropList array with all the dictionary keys. Release it when
|
||||
* you're done. Keys in array are retained from the original dictionary
|
||||
* not copied and need NOT to be released individually. */
|
||||
WMPropList* WMGetPLDictionaryKeys(WMPropList *plist);
|
||||
|
||||
/* Creates only the first level deep object. All the elements inside are
|
||||
* retained from the original */
|
||||
WMPropList* WMShallowCopyPropList(WMPropList *plist);
|
||||
|
||||
/* Makes a completely separate replica of the original proplist */
|
||||
WMPropList* WMDeepCopyPropList(WMPropList *plist);
|
||||
|
||||
WMPropList* WMCreatePropListFromDescription(char *desc);
|
||||
|
||||
/* Free the returned string when you no longer need it */
|
||||
char* WMGetPropListDescription(WMPropList *plist, Bool indented);
|
||||
|
||||
WMPropList* WMReadPropListFromFile(char *file);
|
||||
|
||||
Bool WMWritePropListToFile(WMPropList *plist, char *path);
|
||||
|
||||
/* ---[ WINGs/userdefaults.c ]-------------------------------------------- */
|
||||
|
||||
char* wusergnusteppath(void);
|
||||
|
||||
char* wdefaultspathfordomain(char *domain);
|
||||
|
||||
char* wglobaldefaultspathfordomain(const char *domain);
|
||||
|
||||
WMUserDefaults* WMGetStandardUserDefaults(void);
|
||||
|
||||
WMUserDefaults* WMGetDefaultsFromPath(char *path);
|
||||
|
||||
void WMSynchronizeUserDefaults(WMUserDefaults *database);
|
||||
|
||||
void WMSaveUserDefaults(WMUserDefaults *database);
|
||||
|
||||
void WMEnableUDPeriodicSynchronization(WMUserDefaults *database, Bool enable);
|
||||
|
||||
/* Returns a WMPropList array with all the keys in the user defaults database.
|
||||
* Free the array with WMReleasePropList() when no longer needed.
|
||||
* Keys in array are just retained references to the original keys */
|
||||
WMPropList* WMGetUDKeys(WMUserDefaults *database);
|
||||
|
||||
WMPropList* WMGetUDObjectForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
void WMSetUDObjectForKey(WMUserDefaults *database, WMPropList *object,
|
||||
char *defaultName);
|
||||
|
||||
void WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
char* WMGetUDStringForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
int WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
float WMGetUDFloatForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
Bool WMGetUDBoolForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
void WMSetUDStringForKey(WMUserDefaults *database, char *value,
|
||||
char *defaultName);
|
||||
|
||||
void WMSetUDIntegerForKey(WMUserDefaults *database, int value,
|
||||
char *defaultName);
|
||||
|
||||
void WMSetUDFloatForKey(WMUserDefaults *database, float value,
|
||||
char *defaultName);
|
||||
|
||||
void WMSetUDBoolForKey(WMUserDefaults *database, Bool value,
|
||||
char *defaultName);
|
||||
|
||||
WMPropList* WMGetUDSearchList(WMUserDefaults *database);
|
||||
|
||||
void WMSetUDSearchList(WMUserDefaults *database, WMPropList *list);
|
||||
|
||||
extern char *WMUserDefaultsDidChangeNotification;
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* Global variables */
|
||||
|
||||
extern int WCErrorCode;
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif
|
||||
138
WINGs/WINGs/proplist-compat.h
Normal file
138
WINGs/WINGs/proplist-compat.h
Normal file
@@ -0,0 +1,138 @@
|
||||
/*
|
||||
* This header file is provided for old libPropList compatibility.
|
||||
* DO _NOT_ USE this except for letting your old libPropList-based code to
|
||||
* work with the new property list code from WINGs, with minimal changes.
|
||||
*
|
||||
* All code written with old libPropList functions should work, given
|
||||
* that the following changes are made:
|
||||
*
|
||||
* 1. Replace all
|
||||
* #include <proplist.h>
|
||||
* with
|
||||
* #include <WINGs/proplist-compat.h>
|
||||
* in your code.
|
||||
*
|
||||
* 2. Change all calls to PLSave() to have the extra filename parameter like:
|
||||
* PLSave(proplist_t proplist, char* filename, Bool atomically)
|
||||
*
|
||||
* 3. The PLSetStringCmpHook() function is no longer available. There is a
|
||||
* similar but simpler function provided which is enough for practical
|
||||
* purposes:
|
||||
* PLSetCaseSensitive(Bool caseSensitive)
|
||||
*
|
||||
* 4. The following functions do no longer exist. They were removed because
|
||||
* they were based on concepts borrowed from UserDefaults which conflict
|
||||
* with the retain/release mechanism:
|
||||
* PLSynchronize(), PLDeepSynchronize(), PLShallowSynchronize()
|
||||
* PLSetFilename(), PLGetFilename()
|
||||
* PLGetContainer()
|
||||
* You should change your code to not use them anymore.
|
||||
*
|
||||
* 5. The following functions are no longer available. They were removed
|
||||
* because they also used borrowed concepts which have no place in a
|
||||
* property list as defined in the OpenStep specifications. Also these
|
||||
* functions were hardly ever used in programs to our knowledge.
|
||||
* PLGetDomainNames(), PLGetDomain(), PLSetDomain(), PLDeleteDomain()
|
||||
* PLRegister(), PLUnregister()
|
||||
* You should also change your code to not use them anymore (in case you
|
||||
* ever used them anyway ;-) ).
|
||||
*
|
||||
* 6. Link your program with libWINGs or libWUtil instead of libPropList.
|
||||
* (libWINGs should be used for GUI apps, while libWUtil for non-GUI apps)
|
||||
*
|
||||
*
|
||||
* Our recommandation is to rewrite your code to use the new functions and
|
||||
* link against libWINGs/libWUtil. We do not recommend you to keep using old
|
||||
* libPropList function names. This file is provided just to allow existing
|
||||
* libropList based applications to run with minimal changes with the new
|
||||
* proplist code from WINGs before their authors get the time to rewrite
|
||||
* them. New proplist code from WINGs provide a better integration with the
|
||||
* other data types from WINGs, not to mention that the proplist code in WINGs
|
||||
* is actively maintained while the old libPropList is dead.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _PROPLIST_COMPAT_H_
|
||||
#define _PROPLIST_COMPAT_H_
|
||||
|
||||
#include <WINGs/WUtil.h>
|
||||
|
||||
|
||||
typedef WMPropList* proplist_t;
|
||||
|
||||
|
||||
#ifndef YES
|
||||
#define YES True
|
||||
#endif
|
||||
|
||||
#ifndef NO
|
||||
#define NO False
|
||||
#endif
|
||||
|
||||
|
||||
#define PLSetCaseSensitive(c) WMPLSetCaseSensitive(c)
|
||||
|
||||
#define PLMakeString(bytes) WMCreatePLString(bytes)
|
||||
#define PLMakeData(bytes, length) WMCreatePLDataWithBytes(bytes, length)
|
||||
#define PLMakeArrayFromElements WMCreatePLArray
|
||||
#define PLMakeDictionaryFromEntries WMCreatePLDictionary
|
||||
|
||||
#define PLRetain(pl) WMRetainPropList(pl)
|
||||
#define PLRelease(pl) WMReleasePropList(pl)
|
||||
|
||||
#define PLInsertArrayElement(array, pl, pos) WMInsertInPLArray(array, pos, pl)
|
||||
#define PLAppendArrayElement(array, pl) WMAddToPLArray(array, pl)
|
||||
#define PLRemoveArrayElement(array, pos) WMDeleteFromPLArray(array, pos)
|
||||
#define PLInsertDictionaryEntry(dict, key, value) WMPutInPLDictionary(dict, key, value)
|
||||
#define PLRemoveDictionaryEntry(dict, key) WMRemoveFromPLDictionary(dict, key)
|
||||
#define PLMergeDictionaries(dest, source) WMMergePLDictionaries(dest, source, False)
|
||||
|
||||
#define PLGetNumberOfElements(pl) WMGetPropListItemCount(pl)
|
||||
|
||||
#define PLIsString(pl) WMIsPLString(pl)
|
||||
#define PLIsData(pl) WMIsPLData(pl)
|
||||
#define PLIsArray(pl) WMIsPLArray(pl)
|
||||
#define PLIsDictionary(pl) WMIsPLDictionary(pl)
|
||||
#define PLIsSimple(pl) (WMIsPLString(pl) || WMIsPLData(pl))
|
||||
#define PLIsCompound(pl) (WMIsPLArray(pl) || WMIsPLDictionary(pl))
|
||||
#define PLIsEqual(pl1, pl2) WMIsPropListEqualTo(pl1, pl2)
|
||||
|
||||
#define PLGetString(pl) WMGetFromPLString(pl)
|
||||
#define PLGetDataBytes(pl) WMGetPLDataBytes(pl)
|
||||
#define PLGetDataLength(pl) WMGetPLDataLength(pl)
|
||||
#define PLGetArrayElement(pl, index) WMGetFromPLArray(pl, index)
|
||||
#define PLGetDictionaryEntry(pl, key) WMGetFromPLDictionary(pl, key)
|
||||
#define PLGetAllDictionaryKeys(pl) WMGetPLDictionaryKeys(pl)
|
||||
|
||||
#define PLShallowCopy(pl) WMShallowCopyPropList(pl)
|
||||
#define PLDeepCopy(pl) WMDeepCopyPropList(pl)
|
||||
|
||||
#define PLGetProplistWithDescription(desc) WMCreatePropListFromDescription(desc)
|
||||
#define PLGetDescriptionIndent(pl, level) WMGetPropListDescription(pl, True)
|
||||
#define PLGetDescription(pl) WMGetPropListDescription(pl, False)
|
||||
#define PLGetStringDescription(pl) WMGetPropListDescription(pl, False)
|
||||
#define PLGetDataDescription(pl) WMGetPropListDescription(pl, False)
|
||||
|
||||
#define PLGetProplistWithPath(file) WMReadPropListFromFile(file)
|
||||
#define PLSave(pl, file, atm) WMWritePropListToFile(pl, file)
|
||||
|
||||
|
||||
/* Unsupported functions. Do not ask for them. They're evil :P */
|
||||
#define PLSetStringCmpHook(fn) error_PLSetStringCmpHook_is_not_supported
|
||||
#define PLDeepSynchronize(pl) error_PLDeepSynchronize_is_not_supported
|
||||
#define PLSynchronize(pl) error_PLSynchronize_is_not_supported
|
||||
#define PLShallowSynchronize(pl) error_PLShallowSynchronize_is_not_supported
|
||||
#define PLSetFilename(pl, filename) error_PLSetFilename_is_not_supported
|
||||
#define PLGetFilename(pl, filename) error_PLGetFilename_is_not_supported
|
||||
#define PLGetContainer(pl) error_PLGetContainer_is_not_supported
|
||||
|
||||
#define PLGetDomainNames error_PLGetDomainNames_is_not_supported
|
||||
#define PLGetDomain(name) error_PLGetDomain_is_not_supported
|
||||
#define PLSetDomain(name, value, kickme) error_PLSetDomain_is_not_supported
|
||||
#define PLDeleteDomain(name, kickme) error_PLDeleteDomain_is_not_supported
|
||||
#define PLRegister(name, callback) error_PLRegister_is_not_supported
|
||||
#define PLUnregister(name) error_PLUnregister_is_not_supported
|
||||
|
||||
|
||||
#endif
|
||||
510
WINGs/WINGsP.h
510
WINGs/WINGsP.h
@@ -1,510 +0,0 @@
|
||||
#ifndef _WINGSP_H_
|
||||
#define _WINGSP_H_
|
||||
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
|
||||
#include "WINGs.h"
|
||||
|
||||
#if WINGS_H_VERSION < 991003
|
||||
#error There_is_an_old_WINGs.h_file_somewhere_in_your_system._Please_remove_it.
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#define DOUBLE_BUFFER
|
||||
|
||||
|
||||
|
||||
#define WC_UserWidget 128
|
||||
|
||||
|
||||
|
||||
#define SCROLLER_WIDTH 20
|
||||
|
||||
|
||||
|
||||
#define XDND_VERSION 4
|
||||
|
||||
|
||||
typedef struct W_Application {
|
||||
char *applicationName;
|
||||
int argc;
|
||||
char **argv;
|
||||
char *resourcePath;
|
||||
} W_Application;
|
||||
|
||||
|
||||
typedef struct W_Font {
|
||||
struct W_Screen *screen;
|
||||
|
||||
union {
|
||||
XFontSet set;
|
||||
XFontStruct *normal;
|
||||
} font;
|
||||
short height;
|
||||
short y;
|
||||
short refCount;
|
||||
char *name;
|
||||
unsigned int notFontSet:1;
|
||||
} W_Font;
|
||||
|
||||
|
||||
typedef struct W_Pixmap {
|
||||
struct W_Screen *screen;
|
||||
Pixmap pixmap;
|
||||
Pixmap mask;
|
||||
unsigned short width;
|
||||
unsigned short height;
|
||||
short depth;
|
||||
short refCount;
|
||||
} W_Pixmap;
|
||||
|
||||
|
||||
typedef struct W_Color {
|
||||
struct W_Screen *screen;
|
||||
|
||||
XColor color;
|
||||
short refCount;
|
||||
GC gc;
|
||||
struct {
|
||||
unsigned int exact:1;
|
||||
} flags;
|
||||
} W_Color;
|
||||
|
||||
|
||||
typedef struct W_FocusInfo {
|
||||
struct W_View *toplevel;
|
||||
struct W_View *focused; /* view that has the focus in this toplevel */
|
||||
struct W_FocusInfo *next;
|
||||
} W_FocusInfo;
|
||||
|
||||
|
||||
|
||||
struct W_DraggingInfo {
|
||||
Window destinationWindow;
|
||||
Window sourceWindow;
|
||||
|
||||
WMPoint location;
|
||||
|
||||
unsigned sourceOperation;
|
||||
WMPixmap *image;
|
||||
WMPoint imageLocation;
|
||||
|
||||
Time timestamp;
|
||||
|
||||
int protocolVersion;
|
||||
|
||||
WMView *destView;
|
||||
|
||||
/* only valid if in the same app.. should be treated as internal data */
|
||||
// WMView *destination;
|
||||
// WMView *source;
|
||||
};
|
||||
|
||||
|
||||
typedef struct W_Screen {
|
||||
Display *display;
|
||||
int screen;
|
||||
int depth;
|
||||
|
||||
Colormap colormap;
|
||||
|
||||
Visual *visual;
|
||||
|
||||
Time lastEventTime;
|
||||
|
||||
Window rootWin;
|
||||
|
||||
struct W_View *rootView;
|
||||
|
||||
RContext *rcontext;
|
||||
|
||||
/* application related */
|
||||
|
||||
W_FocusInfo *focusInfo;
|
||||
|
||||
struct W_Pixmap *applicationIcon;
|
||||
|
||||
struct W_Window *windowList; /* list of windows in the app */
|
||||
|
||||
Window groupLeader; /* the leader of the application */
|
||||
/* also used for other things */
|
||||
|
||||
struct W_SelectionHandlers *selectionHandlerList;
|
||||
|
||||
struct {
|
||||
unsigned int hasAppIcon:1;
|
||||
unsigned int simpleApplication:1;
|
||||
} aflags;
|
||||
|
||||
WMOpenPanel *sharedOpenPanel;
|
||||
WMSavePanel *sharedSavePanel;
|
||||
|
||||
struct W_FontPanel *sharedFontPanel;
|
||||
|
||||
struct W_ColorPanel *sharedColorPanel;
|
||||
|
||||
Pixmap stipple;
|
||||
|
||||
struct W_DraggingInfo dragInfo;
|
||||
|
||||
/* colors */
|
||||
W_Color *white;
|
||||
W_Color *black;
|
||||
W_Color *gray;
|
||||
W_Color *darkGray;
|
||||
|
||||
GC stippleGC;
|
||||
|
||||
GC copyGC;
|
||||
GC clipGC;
|
||||
|
||||
GC monoGC; /* GC for 1bpp visuals */
|
||||
|
||||
GC xorGC;
|
||||
|
||||
GC ixorGC; /* IncludeInferiors XOR */
|
||||
|
||||
GC textFieldGC;
|
||||
|
||||
W_Font *normalFont;
|
||||
|
||||
W_Font *boldFont;
|
||||
|
||||
WMHashTable *fontCache;
|
||||
|
||||
Bool useMultiByte;
|
||||
|
||||
struct W_Balloon *balloon;
|
||||
|
||||
|
||||
struct W_Pixmap *checkButtonImageOn;
|
||||
struct W_Pixmap *checkButtonImageOff;
|
||||
|
||||
struct W_Pixmap *radioButtonImageOn;
|
||||
struct W_Pixmap *radioButtonImageOff;
|
||||
|
||||
struct W_Pixmap *buttonArrow;
|
||||
struct W_Pixmap *pushedButtonArrow;
|
||||
|
||||
struct W_Pixmap *scrollerDimple;
|
||||
|
||||
struct W_Pixmap *upArrow;
|
||||
struct W_Pixmap *downArrow;
|
||||
struct W_Pixmap *leftArrow;
|
||||
struct W_Pixmap *rightArrow;
|
||||
|
||||
struct W_Pixmap *hiUpArrow;
|
||||
struct W_Pixmap *hiDownArrow;
|
||||
struct W_Pixmap *hiLeftArrow;
|
||||
struct W_Pixmap *hiRightArrow;
|
||||
|
||||
struct W_Pixmap *pullDownIndicator;
|
||||
struct W_Pixmap *popUpIndicator;
|
||||
|
||||
struct W_Pixmap *checkMark;
|
||||
|
||||
struct W_Pixmap *homeIcon;
|
||||
struct W_Pixmap *altHomeIcon;
|
||||
|
||||
struct W_Pixmap *trashcanIcon;
|
||||
struct W_Pixmap *altTrashcanIcon;
|
||||
|
||||
struct W_Pixmap *createDirIcon;
|
||||
struct W_Pixmap *altCreateDirIcon;
|
||||
|
||||
struct W_Pixmap *disketteIcon;
|
||||
struct W_Pixmap *altDisketteIcon;
|
||||
struct W_Pixmap *unmountIcon;
|
||||
struct W_Pixmap *altUnmountIcon;
|
||||
|
||||
struct W_Pixmap *magnifyIcon;
|
||||
/* struct W_Pixmap *altMagnifyIcon;*/
|
||||
struct W_Pixmap *wheelIcon;
|
||||
struct W_Pixmap *grayIcon;
|
||||
struct W_Pixmap *rgbIcon;
|
||||
struct W_Pixmap *cmykIcon;
|
||||
struct W_Pixmap *hsbIcon;
|
||||
struct W_Pixmap *customPaletteIcon;
|
||||
struct W_Pixmap *colorListIcon;
|
||||
|
||||
struct W_Pixmap *defaultObjectIcon;
|
||||
|
||||
Cursor defaultCursor;
|
||||
|
||||
Cursor textCursor;
|
||||
|
||||
Cursor invisibleCursor;
|
||||
|
||||
Atom attribsAtom; /* GNUstepWindowAttributes */
|
||||
|
||||
Atom deleteWindowAtom; /* WM_DELETE_WINDOW */
|
||||
|
||||
Atom protocolsAtom; /* _XA_WM_PROTOCOLS */
|
||||
|
||||
Atom clipboardAtom; /* CLIPBOARD */
|
||||
|
||||
Atom xdndAwareAtom; /* XdndAware */
|
||||
Atom xdndSelectionAtom;
|
||||
Atom xdndEnterAtom;
|
||||
Atom xdndLeaveAtom;
|
||||
Atom xdndPositionAtom;
|
||||
Atom xdndDropAtom;
|
||||
Atom xdndFinishedAtom;
|
||||
Atom xdndTypeListAtom;
|
||||
Atom xdndStatusAtom;
|
||||
|
||||
Atom wmStateAtom; /* WM_STATE */
|
||||
|
||||
/* stuff for detecting double-clicks */
|
||||
Time lastClickTime; /* time of last mousedown event */
|
||||
Window lastClickWindow; /* window of the last mousedown */
|
||||
|
||||
struct W_View *modalView;
|
||||
unsigned modal:1;
|
||||
unsigned ignoreNextDoubleClick:1;
|
||||
} W_Screen;
|
||||
|
||||
|
||||
|
||||
typedef struct W_ViewDelegate {
|
||||
void *data;
|
||||
|
||||
void (*didMove)(struct W_ViewDelegate*, WMView*);
|
||||
|
||||
void (*didResize)(struct W_ViewDelegate*, WMView*);
|
||||
|
||||
void (*willMove)(struct W_ViewDelegate*, WMView*, int*, int*);
|
||||
|
||||
void (*willResize)(struct W_ViewDelegate*, WMView*,
|
||||
unsigned int*, unsigned int*);
|
||||
} W_ViewDelegate;
|
||||
|
||||
|
||||
|
||||
typedef struct W_View {
|
||||
struct W_Screen *screen;
|
||||
|
||||
WMWidget *self; /* must point to the widget the
|
||||
* view belongs to */
|
||||
|
||||
W_ViewDelegate *delegate;
|
||||
|
||||
Window window;
|
||||
|
||||
WMSize size;
|
||||
|
||||
WMPoint pos;
|
||||
|
||||
struct W_View *nextFocusChain; /* next/prev in focus chain */
|
||||
struct W_View *prevFocusChain;
|
||||
|
||||
struct W_View *parent; /* parent WMView */
|
||||
|
||||
struct W_View *childrenList; /* first in list of child windows */
|
||||
|
||||
struct W_View *nextSister; /* next on parent's children list */
|
||||
|
||||
struct W_EventHandler *handlerList;/* list of event handlers for this window */
|
||||
|
||||
unsigned long attribFlags;
|
||||
XSetWindowAttributes attribs;
|
||||
|
||||
void *hangedData; /* data holder for user program */
|
||||
|
||||
WMColor *backColor;
|
||||
|
||||
|
||||
Atom *droppableTypes;
|
||||
struct W_DragSourceProcs *dragSourceProcs;
|
||||
struct W_DragDestinationProcs *dragDestinationProcs;
|
||||
int helpContext;
|
||||
|
||||
|
||||
struct {
|
||||
unsigned int realized:1;
|
||||
unsigned int mapped:1;
|
||||
unsigned int parentDying:1;
|
||||
unsigned int dying:1; /* the view is being destroyed */
|
||||
unsigned int topLevel:1; /* is a top level window */
|
||||
unsigned int root:1; /* is the root window */
|
||||
unsigned int mapWhenRealized:1;/* map the view when it's realized */
|
||||
unsigned int alreadyDead:1; /* view was freed */
|
||||
|
||||
unsigned int dontCompressMotion:1; /* motion notify event compress */
|
||||
unsigned int notifySizeChanged:1;
|
||||
unsigned int dontCompressExpose:1; /* will compress all expose
|
||||
events into one */
|
||||
/* toplevel only */
|
||||
unsigned int worksWhenModal:1;
|
||||
unsigned int pendingRelease1:1;
|
||||
unsigned int pendingRelease2:1;
|
||||
unsigned int pendingRelease3:1;
|
||||
unsigned int pendingRelease4:1;
|
||||
unsigned int pendingRelease5:1;
|
||||
unsigned int xdndHintSet:1;
|
||||
} flags;
|
||||
|
||||
int refCount;
|
||||
} W_View;
|
||||
|
||||
|
||||
typedef struct W_EventHandler {
|
||||
unsigned long eventMask;
|
||||
|
||||
WMEventProc *proc;
|
||||
|
||||
void *clientData;
|
||||
|
||||
struct W_EventHandler *nextHandler;
|
||||
} W_EventHandler;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct _WINGsConfiguration {
|
||||
char *systemFont;
|
||||
char *boldSystemFont;
|
||||
int defaultFontSize;
|
||||
Bool useMultiByte;
|
||||
unsigned doubleClickDelay;
|
||||
} _WINGsConfiguration;
|
||||
|
||||
extern _WINGsConfiguration WINGsConfiguration;
|
||||
|
||||
|
||||
|
||||
#define CHECK_CLASS(widget, class) assert(W_CLASS(widget)==(class))
|
||||
|
||||
|
||||
#define W_CLASS(widget) (((W_WidgetType*)(widget))->widgetClass)
|
||||
#define W_VIEW(widget) (((W_WidgetType*)(widget))->view)
|
||||
|
||||
#define W_VIEW_REALIZED(view) (view)->flags.realized
|
||||
#define W_VIEW_MAPPED(view) (view)->flags.mapped
|
||||
|
||||
#define W_VIEW_SCREEN(view) (view)->screen
|
||||
#define W_VIEW_DRAWABLE(view) (view)->window
|
||||
|
||||
#define W_VIEW_WIDTH(view) (view)->size.width
|
||||
#define W_VIEW_HEIGHT(view) (view)->size.height
|
||||
|
||||
|
||||
#define W_PIXEL(c) (c)->color.pixel
|
||||
|
||||
#define W_FONTID(f) (f)->font->fid
|
||||
|
||||
#define W_DRAWABLE(scr) (scr)->rcontext->drawable
|
||||
|
||||
|
||||
|
||||
W_View *W_GetViewForXWindow(Display *display, Window window);
|
||||
|
||||
W_View *W_CreateView(W_View *parent);
|
||||
|
||||
W_View *W_CreateTopView(W_Screen *screen);
|
||||
|
||||
|
||||
W_View *W_CreateRootView(W_Screen *screen);
|
||||
|
||||
void W_DestroyView(W_View *view);
|
||||
|
||||
void W_RealizeView(W_View *view);
|
||||
|
||||
void W_ReparentView(W_View *view, W_View *newParent, int x, int y);
|
||||
|
||||
void W_MapView(W_View *view);
|
||||
|
||||
void W_MapSubviews(W_View *view);
|
||||
|
||||
void W_UnmapSubviews(W_View *view);
|
||||
|
||||
W_View *W_TopLevelOfView(W_View *view);
|
||||
|
||||
void W_UnmapView(W_View *view);
|
||||
|
||||
void W_MoveView(W_View *view, int x, int y);
|
||||
|
||||
void W_ResizeView(W_View *view, unsigned int width, unsigned int height);
|
||||
|
||||
void W_SetViewBackgroundColor(W_View *view, WMColor *color);
|
||||
|
||||
void W_DrawRelief(W_Screen *scr, Drawable d, int x, int y, unsigned int width,
|
||||
unsigned int height, WMReliefType relief);
|
||||
|
||||
|
||||
void W_CleanUpEvents(W_View *view);
|
||||
|
||||
void W_CallDestroyHandlers(W_View *view);
|
||||
|
||||
void W_PaintTextAndImage(W_View *view, int wrap, GC textGC, W_Font *font,
|
||||
WMReliefType relief, char *text,
|
||||
WMAlignment alignment, W_Pixmap *image,
|
||||
WMImagePosition position, GC backGC, int ofs);
|
||||
|
||||
void W_PaintText(W_View *view, Drawable d, WMFont *font, int x, int y,
|
||||
int width, WMAlignment alignment, GC gc,
|
||||
int wrap, char *text, int length);
|
||||
|
||||
int W_GetTextHeight(WMFont *font, char *text, int width, int wrap);
|
||||
|
||||
|
||||
int W_TextWidth(WMFont *font, char *text, int length);
|
||||
|
||||
|
||||
void W_BroadcastMessage(W_View *targetParent, XEvent *event);
|
||||
|
||||
void W_DispatchMessage(W_View *target, XEvent *event);
|
||||
|
||||
void W_SetFocusOfToplevel(W_View *toplevel, W_View *view);
|
||||
|
||||
W_View *W_FocusedViewOfToplevel(W_View *view);
|
||||
|
||||
void W_SetFocusOfTopLevel(W_View *toplevel, W_View *view);
|
||||
|
||||
void W_ReleaseView(WMView *view);
|
||||
|
||||
WMView *W_RetainView(WMView *view);
|
||||
|
||||
void W_InitApplication(WMScreen *scr);
|
||||
|
||||
void W_InitNotificationCenter(void);
|
||||
|
||||
W_Class W_RegisterUserWidget(void);
|
||||
|
||||
void W_RedisplayView(WMView *view);
|
||||
|
||||
Bool W_ApplicationInitialized(void);
|
||||
|
||||
char *W_GetTextSelection(WMScreen *scr, Atom selection);
|
||||
|
||||
void W_HandleSelectionEvent(XEvent *event);
|
||||
|
||||
void W_HandleDNDClientMessage(WMView *toplevel, XClientMessageEvent *event);
|
||||
|
||||
void W_FlushASAPNotificationQueue();
|
||||
|
||||
void W_FlushIdleNotificationQueue();
|
||||
|
||||
struct W_Balloon *W_CreateBalloon(WMScreen *scr);
|
||||
|
||||
void W_BalloonHandleEnterView(WMView *view);
|
||||
|
||||
void W_BalloonHandleLeaveView(WMView *view);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* _WINGSP_H_ */
|
||||
707
WINGs/WUtil.h
707
WINGs/WUtil.h
@@ -1,707 +0,0 @@
|
||||
#ifndef _WUTIL_H_
|
||||
#define _WUTIL_H_
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <limits.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* SunOS 4.x Blargh.... */
|
||||
#ifndef NULL
|
||||
#define NULL ((void*)0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Warning: proplist.h #defines BOOL which will clash with the
|
||||
* typedef BOOL in Xmd.h
|
||||
* proplist.h should use Bool (which is a #define in Xlib.h) instead.
|
||||
*
|
||||
*/
|
||||
#include <proplist.h>
|
||||
|
||||
|
||||
#ifndef WMAX
|
||||
# define WMAX(a,b) ((a)>(b) ? (a) : (b))
|
||||
#endif
|
||||
#ifndef WMIN
|
||||
# define WMIN(a,b) ((a)<(b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
|
||||
#if (!defined (__GNUC__) || __GNUC__ < 2 || \
|
||||
__GNUC_MINOR__ < (defined (__cplusplus) ? 6 : 4))
|
||||
#define __ASSERT_FUNCTION ((char *) 0)
|
||||
#else
|
||||
#define __ASSERT_FUNCTION __PRETTY_FUNCTION__
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef NDEBUG
|
||||
|
||||
#define wassertr(expr) {}
|
||||
#define wassertrv(expr, val) {}
|
||||
|
||||
#else /* !NDEBUG */
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#define wassertr(expr) assert(expr)
|
||||
|
||||
#define wassertrv(expr, val) assert(expr)
|
||||
|
||||
#else /* !DEBUG */
|
||||
|
||||
#define wassertr(expr) \
|
||||
if (!(expr)) { \
|
||||
wwarning("%s line %i (%s): assertion %s failed",\
|
||||
__FILE__, __LINE__, __ASSERT_FUNCTION, #expr);\
|
||||
return;\
|
||||
}
|
||||
|
||||
#define wassertrv(expr, val) \
|
||||
if (!(expr)) { \
|
||||
wwarning("%s line %i (%s): assertion %s failed",\
|
||||
__FILE__, __LINE__, __ASSERT_FUNCTION, #expr);\
|
||||
return (val);\
|
||||
}
|
||||
#endif /* !DEBUG */
|
||||
|
||||
#endif /* !NDEBUG */
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
typedef enum {
|
||||
WMPostWhenIdle = 1,
|
||||
WMPostASAP = 2,
|
||||
WMPostNow = 3
|
||||
} WMPostingStyle;
|
||||
|
||||
|
||||
typedef enum {
|
||||
WNCNone = 0,
|
||||
WNCOnName = 1,
|
||||
WNCOnSender = 2
|
||||
} WMNotificationCoalescing;
|
||||
|
||||
|
||||
/* The possible states for connections */
|
||||
typedef enum {
|
||||
WCNotConnected=0,
|
||||
WCListening,
|
||||
WCInProgress,
|
||||
WCFailed,
|
||||
WCConnected,
|
||||
WCDied,
|
||||
WCClosed
|
||||
} WMConnectionState;
|
||||
|
||||
|
||||
|
||||
enum {
|
||||
WBNotFound = INT_MIN /* element was not found in bag */
|
||||
};
|
||||
|
||||
|
||||
typedef struct W_Bag WMBag;
|
||||
typedef struct W_Data WMData;
|
||||
typedef struct W_HashTable WMHashTable;
|
||||
typedef struct W_UserDefaults WMUserDefaults;
|
||||
typedef struct W_Notification WMNotification;
|
||||
typedef struct W_NotificationQueue WMNotificationQueue;
|
||||
typedef struct W_Host WMHost;
|
||||
typedef struct W_Connection WMConnection;
|
||||
|
||||
|
||||
|
||||
typedef struct {
|
||||
int position;
|
||||
int count;
|
||||
} WMRange;
|
||||
|
||||
|
||||
|
||||
/* DO NOT ACCESS THE CONTENTS OF THIS STRUCT */
|
||||
typedef struct {
|
||||
void *table;
|
||||
void *nextItem;
|
||||
int index;
|
||||
} WMHashEnumerator;
|
||||
|
||||
|
||||
typedef struct {
|
||||
/* NULL is pointer hash */
|
||||
unsigned (*hash)(const void *);
|
||||
/* NULL is pointer compare */
|
||||
Bool (*keyIsEqual)(const void *, const void *);
|
||||
/* NULL does nothing */
|
||||
void* (*retainKey)(const void *);
|
||||
/* NULL does nothing */
|
||||
void (*releaseKey)(const void *);
|
||||
} WMHashTableCallbacks;
|
||||
|
||||
|
||||
typedef void *WMBagIterator;
|
||||
|
||||
typedef struct W_BagFunctions {
|
||||
int (*getItemCount)(WMBag *self);
|
||||
int (*appendBag)(WMBag *self, WMBag *bag);
|
||||
int (*putInBag)(WMBag *self, void *item);
|
||||
int (*insertInBag)(WMBag *self, int index, void *item);
|
||||
int (*removeFromBag)(WMBag *bag, void *item);
|
||||
int (*eraseFromBag)(WMBag *bag, int index);
|
||||
int (*deleteFromBag)(WMBag *bag, int index);
|
||||
void *(*getFromBag)(WMBag *bag, int index);
|
||||
int (*firstInBag)(WMBag *bag, void *item);
|
||||
int (*countInBag)(WMBag *bag, void *item);
|
||||
void *(*replaceInBag)(WMBag *bag, int index, void *item);
|
||||
int (*sortBag)(WMBag *bag, int (*comparer)(const void*, const void*));
|
||||
void (*emptyBag)(WMBag *bag);
|
||||
void (*freeBag)(WMBag *bag);
|
||||
void (*mapBag)(WMBag *bag, void (*function)(void*, void*), void *data);
|
||||
int (*findInBag)(WMBag *bag, int (*match)(void*));
|
||||
void *(*first)(WMBag *bag, WMBagIterator *ptr);
|
||||
void *(*last)(WMBag *bag, WMBagIterator *ptr);
|
||||
void *(*next)(WMBag *bag, WMBagIterator *ptr);
|
||||
void *(*previous)(WMBag *bag, WMBagIterator *ptr);
|
||||
void *(*iteratorAtIndex)(WMBag *bag, int index, WMBagIterator *ptr);
|
||||
int (*indexForIterator)(WMBag *bag, WMBagIterator ptr);
|
||||
} W_BagFunctions;
|
||||
|
||||
|
||||
struct W_Bag {
|
||||
void *data;
|
||||
|
||||
void (*destructor)(void *item);
|
||||
|
||||
W_BagFunctions func;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
typedef struct {
|
||||
char character; /* the escape character */
|
||||
char *value; /* value to place */
|
||||
} WMSEscapes;
|
||||
#endif
|
||||
|
||||
|
||||
/* The connection callbacks */
|
||||
typedef struct ConnectionDelegate {
|
||||
void *data;
|
||||
|
||||
void (*didCatchException)(struct ConnectionDelegate *self,
|
||||
WMConnection *cPtr);
|
||||
|
||||
void (*didDie)(struct ConnectionDelegate *self, WMConnection *cPtr);
|
||||
|
||||
void (*didInitialize)(struct ConnectionDelegate *self, WMConnection *cPtr);
|
||||
|
||||
void (*didReceiveInput)(struct ConnectionDelegate *self, WMConnection *cPtr);
|
||||
|
||||
void (*didTimeout)(struct ConnectionDelegate *self, WMConnection *cPtr);
|
||||
|
||||
} ConnectionDelegate;
|
||||
|
||||
|
||||
typedef void WMNotificationObserverAction(void *observerData,
|
||||
WMNotification *notification);
|
||||
|
||||
|
||||
|
||||
/*......................................................................*/
|
||||
|
||||
typedef void (waborthandler)(int);
|
||||
|
||||
waborthandler *wsetabort(waborthandler*);
|
||||
|
||||
|
||||
/* don't free the returned string */
|
||||
char *wstrerror(int errnum);
|
||||
|
||||
void wfatal(const char *msg, ...);
|
||||
void wwarning(const char *msg, ...);
|
||||
void wsyserror(const char *msg, ...);
|
||||
void wsyserrorwithcode(int error, const char *msg, ...);
|
||||
|
||||
char *wfindfile(char *paths, char *file);
|
||||
|
||||
char *wfindfileinlist(char **path_list, char *file);
|
||||
|
||||
char *wfindfileinarray(proplist_t array, char *file);
|
||||
|
||||
char *wexpandpath(char *path);
|
||||
|
||||
/* don't free the returned string */
|
||||
char *wgethomedir();
|
||||
|
||||
void *wmalloc(size_t size);
|
||||
void *wrealloc(void *ptr, size_t newsize);
|
||||
void wfree(void *ptr);
|
||||
|
||||
|
||||
void wrelease(void *ptr);
|
||||
void *wretain(void *ptr);
|
||||
|
||||
char *wstrdup(char *str);
|
||||
|
||||
char *wstrappend(char *dst, char *src);
|
||||
|
||||
char *wusergnusteppath();
|
||||
|
||||
char *wdefaultspathfordomain(char *domain);
|
||||
|
||||
void wusleep(unsigned int microsec);
|
||||
|
||||
#if 0
|
||||
int wsprintesc(char *buffer, int length, char *format, WMSEscapes **escapes,
|
||||
int count);
|
||||
#endif
|
||||
|
||||
/*......................................................................*/
|
||||
|
||||
/* This function is used _only_ if you create a NON-GUI program.
|
||||
* For GUI based programs use WMNextEvent()/WMHandleEvent() instead.
|
||||
* This function will handle all input/timer/idle events, then return.
|
||||
*/
|
||||
|
||||
void WHandleEvents();
|
||||
|
||||
/*......................................................................*/
|
||||
|
||||
|
||||
WMHashTable *WMCreateHashTable(WMHashTableCallbacks callbacks);
|
||||
|
||||
void WMFreeHashTable(WMHashTable *table);
|
||||
|
||||
void WMResetHashTable(WMHashTable *table);
|
||||
|
||||
void *WMHashGet(WMHashTable *table, const void *key);
|
||||
|
||||
/* put data in table, replacing already existing data and returning
|
||||
* the old value */
|
||||
void *WMHashInsert(WMHashTable *table, void *key, void *data);
|
||||
|
||||
void WMHashRemove(WMHashTable *table, const void *key);
|
||||
|
||||
/* warning: do not manipulate the table while using these functions */
|
||||
WMHashEnumerator WMEnumerateHashTable(WMHashTable *table);
|
||||
|
||||
void *WMNextHashEnumeratorItem(WMHashEnumerator *enumerator);
|
||||
|
||||
unsigned WMCountHashTable(WMHashTable *table);
|
||||
|
||||
|
||||
|
||||
|
||||
/* some predefined callback sets */
|
||||
|
||||
extern const WMHashTableCallbacks WMIntHashCallbacks;
|
||||
/* sizeof(keys) are <= sizeof(void*) */
|
||||
|
||||
extern const WMHashTableCallbacks WMStringHashCallbacks;
|
||||
/* keys are strings. Strings will be copied with wstrdup()
|
||||
* and freed with free() */
|
||||
|
||||
extern const WMHashTableCallbacks WMStringPointerHashCallbacks;
|
||||
/* keys are strings, bug they are not copied */
|
||||
|
||||
|
||||
/*......................................................................*/
|
||||
|
||||
|
||||
/*
|
||||
* Array bags use an array to store the elements.
|
||||
* Item indexes may be any integer number.
|
||||
*
|
||||
* Pros:
|
||||
* Fast [O(1)] access to elements
|
||||
* Fast [O(1)] push/pop
|
||||
*
|
||||
* Cons:
|
||||
* A little slower [O(n)] for insertion/deletion of elements that
|
||||
* arent in the end
|
||||
* Element indexes with large difference will cause large holes
|
||||
*/
|
||||
#if 0
|
||||
WMBag* WMCreateArrayBag(int initialSize);
|
||||
WMBag* WMCreateArrayBagWithDestructor(int initialSize,
|
||||
void (*destructor)(void*));
|
||||
#endif
|
||||
/*
|
||||
* Tree bags use a red-black tree for storage.
|
||||
* Item indexes may be any integer number.
|
||||
*
|
||||
* Pros:
|
||||
* O(lg n) insertion/deletion/search
|
||||
* Good for large numbers of elements with sparse indexes
|
||||
*
|
||||
* Cons:
|
||||
* O(lg n) insertion/deletion/search
|
||||
* Slow for storing small numbers of elements
|
||||
*/
|
||||
WMBag *WMCreateTreeBag(void);
|
||||
WMBag *WMCreateTreeBagWithDestructor(void (*destructor)(void*));
|
||||
|
||||
|
||||
#define WMCreateArrayBag(a) WMCreateTreeBag()
|
||||
#define WMCreateArrayBagWithDestructor(a,d) WMCreateTreeBagWithDestructor(d)
|
||||
|
||||
#define WMCreateBag(size) WMCreateTreeBag()
|
||||
|
||||
#define WMGetBagItemCount(bag) bag->func.getItemCount(bag)
|
||||
|
||||
#define WMAppendBag(bag, other) bag->func.appendBag(bag, other)
|
||||
|
||||
#define WMPutInBag(bag, item) bag->func.putInBag(bag, item)
|
||||
|
||||
/* insert will increment the index of elements after it by 1 */
|
||||
#define WMInsertInBag(bag, index, item) bag->func.insertInBag(bag, index, item)
|
||||
|
||||
/* this is slow */
|
||||
/* erase will remove the element from the bag,
|
||||
* but will keep the index of the other elements unchanged */
|
||||
#define WMEraseFromBag(bag, index) bag->func.deleteFromBag(bag, index)
|
||||
|
||||
/* delete and remove will remove the elements and cause the elements
|
||||
* after them to decrement their indexes by 1 */
|
||||
#define WMRemoveFromBag(bag, item) bag->func.removeFromBag(bag, item)
|
||||
|
||||
#define WMDeleteFromBag(bag, index) bag->func.deleteFromBag(bag, index)
|
||||
|
||||
#define WMGetFromBag(bag, index) bag->func.getFromBag(bag, index)
|
||||
|
||||
#define WMCountInBag(bag, item) bag->func.countInBag(bag, item)
|
||||
|
||||
#define WMReplaceInBag(bag, index, item) bag->func.replaceInBag(bag, index, item)
|
||||
#define WMSetInBag(bag, index, item) bag->func.replaceInBag(bag, index, item)
|
||||
|
||||
/* comparer must return:
|
||||
* < 0 if a < b
|
||||
* > 0 if a > b
|
||||
* = 0 if a = b
|
||||
*/
|
||||
#define WMSortBag(bag, comparer) bag->func.sortBag(bag, comparer)
|
||||
|
||||
#define WMEmptyBag(bag) bag->func.emptyBag(bag)
|
||||
|
||||
#define WMFreeBag(bag) bag->func.freeBag(bag)
|
||||
|
||||
#define WMMapBag(bag, function, cdata) bag->func.mapBag(bag, function, cdata)
|
||||
|
||||
#define WMGetFirstInBag(bag, item) bag->func.firstInBag(bag, item)
|
||||
|
||||
#define WMCountInBag(bag, item) bag->func.countInBag(bag, item)
|
||||
|
||||
#define WMFindInBag(bag, match) bag->func.findInBag(bag, match)
|
||||
|
||||
#define WMBagFirst(bag, ptr) bag->func.first(bag, ptr)
|
||||
|
||||
#define WMBagLast(bag, ptr) bag->func.last(bag, ptr)
|
||||
|
||||
#define WMBagNext(bag, ptr) bag->func.next(bag, ptr)
|
||||
|
||||
#define WMBagPrevious(bag, ptr) bag->func.previous(bag, ptr)
|
||||
|
||||
#define WMBagIteratorAtIndex(bag, index, ptr) bag->func.iteratorAtIndex(bag, index, ptr)
|
||||
|
||||
#define WMBagIndexForIterator(bag, ptr) bag->func.indexForIterator(bag, ptr)
|
||||
|
||||
|
||||
|
||||
#define WM_ITERATE_BAG(bag, var, i) \
|
||||
for (var = WMBagFirst(bag, &(i)); (i) != NULL; \
|
||||
var = WMBagNext(bag, &(i)))
|
||||
|
||||
#define WM_ETARETI_BAG(bag, var, i) \
|
||||
for (var = WMBagLast(bag, &(i)); (i) != NULL; \
|
||||
var = WMBagPrevious(bag, &(i)))
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* WMData handling */
|
||||
|
||||
/* Creating/destroying data */
|
||||
|
||||
WMData* WMCreateDataWithCapacity(unsigned capacity);
|
||||
|
||||
WMData* WMCreateDataWithLength(unsigned length);
|
||||
|
||||
WMData* WMCreateDataWithBytes(void *bytes, unsigned length);
|
||||
|
||||
WMData* WMCreateDataWithBytesNoCopy(void *bytes, unsigned length);
|
||||
|
||||
WMData* WMCreateDataWithData(WMData *aData);
|
||||
|
||||
WMData* WMRetainData(WMData *aData);
|
||||
|
||||
void WMReleaseData(WMData *aData);
|
||||
|
||||
/* Adjusting capacity */
|
||||
|
||||
void WMSetDataCapacity(WMData *aData, unsigned capacity);
|
||||
|
||||
void WMSetDataLength(WMData *aData, unsigned length);
|
||||
|
||||
void WMIncreaseDataLengthBy(WMData *aData, unsigned extraLength);
|
||||
|
||||
/* Accessing data */
|
||||
|
||||
const void* WMDataBytes(WMData *aData);
|
||||
|
||||
void WMGetDataBytes(WMData *aData, void *buffer);
|
||||
|
||||
void WMGetDataBytesWithLength(WMData *aData, void *buffer, unsigned length);
|
||||
|
||||
void WMGetDataBytesWithRange(WMData *aData, void *buffer, WMRange aRange);
|
||||
|
||||
WMData* WMGetSubdataWithRange(WMData *aData, WMRange aRange);
|
||||
|
||||
/* Testing data */
|
||||
|
||||
Bool WMIsDataEqualToData(WMData *aData, WMData *anotherData);
|
||||
|
||||
unsigned WMGetDataLength(WMData *aData);
|
||||
|
||||
unsigned WMGetDataHash(WMData *aData);
|
||||
|
||||
/* Adding data */
|
||||
|
||||
void WMAppendDataBytes(WMData *aData, void *bytes, unsigned length);
|
||||
|
||||
void WMAppendData(WMData *aData, WMData *anotherData);
|
||||
|
||||
/* Modifying data */
|
||||
|
||||
void WMReplaceDataBytesInRange(WMData *aData, WMRange aRange, void *bytes);
|
||||
|
||||
void WMResetDataBytesInRange(WMData *aData, WMRange aRange);
|
||||
|
||||
void WMSetData(WMData *aData, WMData *anotherData);
|
||||
|
||||
/* Storing data */
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
WMNotification *WMCreateNotification(char *name, void *object, void *clientData);
|
||||
|
||||
void WMReleaseNotification(WMNotification *notification);
|
||||
|
||||
WMNotification *WMRetainNotification(WMNotification *notification);
|
||||
|
||||
void *WMGetNotificationClientData(WMNotification *notification);
|
||||
|
||||
void *WMGetNotificationObject(WMNotification *notification);
|
||||
|
||||
char *WMGetNotificationName(WMNotification *notification);
|
||||
|
||||
|
||||
void WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
|
||||
void *observer, char *name, void *object);
|
||||
|
||||
void WMPostNotification(WMNotification *notification);
|
||||
|
||||
void WMRemoveNotificationObserver(void *observer);
|
||||
|
||||
void WMRemoveNotificationObserverWithName(void *observer, char *name,
|
||||
void *object);
|
||||
|
||||
void WMPostNotificationName(char *name, void *object, void *clientData);
|
||||
|
||||
WMNotificationQueue *WMGetDefaultNotificationQueue(void);
|
||||
|
||||
WMNotificationQueue *WMCreateNotificationQueue(void);
|
||||
|
||||
void WMDequeueNotificationMatching(WMNotificationQueue *queue,
|
||||
WMNotification *notification,
|
||||
unsigned mask);
|
||||
|
||||
void WMEnqueueNotification(WMNotificationQueue *queue,
|
||||
WMNotification *notification,
|
||||
WMPostingStyle postingStyle);
|
||||
|
||||
void WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
|
||||
WMNotification *notification,
|
||||
WMPostingStyle postingStyle,
|
||||
unsigned coalesceMask);
|
||||
|
||||
|
||||
/*......................................................................*/
|
||||
|
||||
WMUserDefaults *WMGetStandardUserDefaults(void);
|
||||
|
||||
WMUserDefaults *WMGetDefaultsFromPath(char *path);
|
||||
|
||||
void WMSynchronizeUserDefaults(WMUserDefaults *database);
|
||||
|
||||
void WMSaveUserDefaults(WMUserDefaults *database);
|
||||
|
||||
void WMEnableUDPeriodicSynchronization(WMUserDefaults *database, Bool enable);
|
||||
|
||||
proplist_t WMGetUDObjectForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
void WMSetUDObjectForKey(WMUserDefaults *database, proplist_t object,
|
||||
char *defaultName);
|
||||
|
||||
void WMRemoveUDObjectForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
/* you can free the returned string */
|
||||
char *WMGetUDStringForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
int WMGetUDIntegerForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
float WMGetUDFloatForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
Bool WMGetUDBoolForKey(WMUserDefaults *database, char *defaultName);
|
||||
|
||||
void WMSetUDStringForKey(WMUserDefaults *database, char *value,
|
||||
char *defaultName);
|
||||
|
||||
void WMSetUDIntegerForKey(WMUserDefaults *database, int value,
|
||||
char *defaultName);
|
||||
|
||||
void WMSetUDFloatForKey(WMUserDefaults *database, float value,
|
||||
char *defaultName);
|
||||
|
||||
void WMSetUDBoolForKey(WMUserDefaults *database, Bool value,
|
||||
char *defaultName);
|
||||
|
||||
proplist_t WMGetUDSearchList(WMUserDefaults *database);
|
||||
|
||||
void WMSetUDSearchList(WMUserDefaults *database, proplist_t list);
|
||||
|
||||
extern char *WMUserDefaultsDidChangeNotification;
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* WMHost: host handling */
|
||||
|
||||
WMHost* WMGetCurrentHost();
|
||||
|
||||
WMHost* WMGetHostWithName(char* name);
|
||||
|
||||
WMHost* WMGetHostWithAddress(char* address);
|
||||
|
||||
WMHost* WMRetainHost(WMHost *hPtr);
|
||||
|
||||
void WMReleaseHost(WMHost *hPtr);
|
||||
|
||||
/*
|
||||
* Host cache management
|
||||
* If enabled, only one object representing each host will be created, and
|
||||
* a shared instance will be returned by all methods that return a host.
|
||||
* Enabled by default.
|
||||
*/
|
||||
void WMSetHostCacheEnabled(Bool flag);
|
||||
|
||||
Bool WMIsHostCacheEnabled();
|
||||
|
||||
void WMFlushHostCache();
|
||||
|
||||
/*
|
||||
* Compare hosts: Hosts are equal if they share at least one address
|
||||
*/
|
||||
Bool WMIsHostEqualToHost(WMHost* hPtr, WMHost* anotherHost);
|
||||
|
||||
/*
|
||||
* Host names.
|
||||
* WMGetHostName() will return first name (official) if a host has several.
|
||||
* WMGetHostNames() will return a R/O WMBag with all the names of the host.
|
||||
*/
|
||||
char* WMGetHostName(WMHost* hPtr);
|
||||
|
||||
/* The returned bag is R/O. Do not modify it, and do not free it! */
|
||||
WMBag* WMGetHostNames(WMHost* hPtr);
|
||||
|
||||
/*
|
||||
* Host addresses.
|
||||
* Addresses are represented as "Dotted Decimal" strings, e.g. "192.42.172.1"
|
||||
* WMGetHostAddress() will return an arbitrary address if a host has several.
|
||||
* WMGetHostAddresses() will return a R/O WMBag with all addresses of the host.
|
||||
*/
|
||||
char* WMGetHostAddress(WMHost* hPtr);
|
||||
|
||||
/* The returned bag is R/O. Do not modify it, and do not free it! */
|
||||
WMBag* WMGetHostAddresses(WMHost* hPtr);
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* WMConnection functions */
|
||||
|
||||
WMConnection* WMCreateConnectionAsServerAtAddress(char *host, char *service,
|
||||
char *protocol);
|
||||
|
||||
WMConnection* WMCreateConnectionToAddress(char *host, char *service,
|
||||
char *protocol);
|
||||
|
||||
WMConnection* WMCreateConnectionToAddressAndNotify(char *host, char *service,
|
||||
char *protocol);
|
||||
|
||||
void WMCloseConnection(WMConnection *cPtr);
|
||||
|
||||
void WMDestroyConnection(WMConnection *cPtr);
|
||||
|
||||
WMConnection* WMAcceptConnection(WMConnection *listener);
|
||||
|
||||
/* Release the returned data! */
|
||||
WMData* WMGetConnectionAvailableData(WMConnection *cPtr);
|
||||
|
||||
int WMSendConnectionData(WMConnection *cPtr, WMData *data);
|
||||
|
||||
Bool WMEnqueueConnectionData(WMConnection *cPtr, WMData *data);
|
||||
|
||||
#define WMFlushConnection(cPtr) WMSendConnectionData((cPtr), NULL)
|
||||
|
||||
void WMSetConnectionDelegate(WMConnection *cPtr, ConnectionDelegate *delegate);
|
||||
|
||||
/* Connection info */
|
||||
|
||||
char* WMGetConnectionAddress(WMConnection *cPtr);
|
||||
|
||||
char* WMGetConnectionService(WMConnection *cPtr);
|
||||
|
||||
char* WMGetConnectionProtocol(WMConnection *cPtr);
|
||||
|
||||
void WMSetConnectionNonBlocking(WMConnection *cPtr, Bool flag);
|
||||
|
||||
void* WMGetConnectionClientData(WMConnection *cPtr);
|
||||
|
||||
void WMSetConnectionClientData(WMConnection *cPtr, void *data);
|
||||
|
||||
unsigned int WMGetConnectionFlags(WMConnection *cPtr);
|
||||
|
||||
void WMSetConnectionFlags(WMConnection *cPtr, unsigned int flags);
|
||||
|
||||
int WMGetConnectionSocket(WMConnection *cPtr);
|
||||
|
||||
WMConnectionState WMGetConnectionState(WMConnection *cPtr);
|
||||
|
||||
void WMSetConnectionSendTimeout(WMConnection *cPtr, unsigned int timeout);
|
||||
|
||||
|
||||
/* Global variables */
|
||||
|
||||
extern int WCErrorCode;
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif
|
||||
314
WINGs/array.c
Normal file
314
WINGs/array.c
Normal file
@@ -0,0 +1,314 @@
|
||||
/*
|
||||
* Dynamically Resized Array
|
||||
*
|
||||
* Authors: Alfredo K. Kojima <kojima@windowmaker.info>
|
||||
* Dan Pascu <dan@windowmaker.info>
|
||||
*
|
||||
* This code is released to the Public Domain, but
|
||||
* proper credit is always appreciated :)
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
#define INITIAL_SIZE 8
|
||||
#define RESIZE_INCREMENT 8
|
||||
|
||||
typedef struct W_Array {
|
||||
void **items; /* the array data */
|
||||
int itemCount; /* # of items in array */
|
||||
int allocSize; /* allocated size of array */
|
||||
WMFreeDataProc *destructor; /* the destructor to free elements */
|
||||
} W_Array;
|
||||
|
||||
WMArray *WMCreateArray(int initialSize)
|
||||
{
|
||||
return WMCreateArrayWithDestructor(initialSize, NULL);
|
||||
}
|
||||
|
||||
WMArray *WMCreateArrayWithDestructor(int initialSize, WMFreeDataProc * destructor)
|
||||
{
|
||||
WMArray *array;
|
||||
|
||||
array = wmalloc(sizeof(WMArray));
|
||||
|
||||
if (initialSize <= 0) {
|
||||
initialSize = INITIAL_SIZE;
|
||||
}
|
||||
|
||||
array->items = wmalloc(sizeof(void *) * initialSize);
|
||||
|
||||
array->itemCount = 0;
|
||||
array->allocSize = initialSize;
|
||||
array->destructor = destructor;
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
WMArray *WMCreateArrayWithArray(WMArray * array)
|
||||
{
|
||||
WMArray *newArray;
|
||||
|
||||
newArray = wmalloc(sizeof(WMArray));
|
||||
|
||||
newArray->items = wmalloc(sizeof(void *) * array->allocSize);
|
||||
memcpy(newArray->items, array->items, sizeof(void *) * array->itemCount);
|
||||
|
||||
newArray->itemCount = array->itemCount;
|
||||
newArray->allocSize = array->allocSize;
|
||||
newArray->destructor = NULL;
|
||||
|
||||
return newArray;
|
||||
}
|
||||
|
||||
void WMEmptyArray(WMArray * array)
|
||||
{
|
||||
if (array->destructor) {
|
||||
while (array->itemCount > 0) {
|
||||
array->itemCount--;
|
||||
array->destructor(array->items[array->itemCount]);
|
||||
}
|
||||
}
|
||||
/*memset(array->items, 0, array->itemCount * sizeof(void*)); */
|
||||
array->itemCount = 0;
|
||||
}
|
||||
|
||||
void WMFreeArray(WMArray * array)
|
||||
{
|
||||
WMEmptyArray(array);
|
||||
wfree(array->items);
|
||||
wfree(array);
|
||||
}
|
||||
|
||||
int WMGetArrayItemCount(WMArray * array)
|
||||
{
|
||||
return array->itemCount;
|
||||
}
|
||||
|
||||
void WMAppendArray(WMArray * array, WMArray * other)
|
||||
{
|
||||
if (other->itemCount == 0)
|
||||
return;
|
||||
|
||||
if (array->itemCount + other->itemCount > array->allocSize) {
|
||||
array->allocSize += other->allocSize;
|
||||
array->items = wrealloc(array->items, sizeof(void *) * array->allocSize);
|
||||
}
|
||||
|
||||
memcpy(array->items + array->itemCount, other->items, sizeof(void *) * other->itemCount);
|
||||
array->itemCount += other->itemCount;
|
||||
}
|
||||
|
||||
void WMAddToArray(WMArray * array, void *item)
|
||||
{
|
||||
if (array->itemCount >= array->allocSize) {
|
||||
array->allocSize += RESIZE_INCREMENT;
|
||||
array->items = wrealloc(array->items, sizeof(void *) * array->allocSize);
|
||||
}
|
||||
array->items[array->itemCount] = item;
|
||||
|
||||
array->itemCount++;
|
||||
}
|
||||
|
||||
void WMInsertInArray(WMArray * array, int index, void *item)
|
||||
{
|
||||
wassertr(index >= 0 && index <= array->itemCount);
|
||||
|
||||
if (array->itemCount >= array->allocSize) {
|
||||
array->allocSize += RESIZE_INCREMENT;
|
||||
array->items = wrealloc(array->items, sizeof(void *) * array->allocSize);
|
||||
}
|
||||
if (index < array->itemCount) {
|
||||
memmove(array->items + index + 1, array->items + index,
|
||||
sizeof(void *) * (array->itemCount - index));
|
||||
}
|
||||
array->items[index] = item;
|
||||
|
||||
array->itemCount++;
|
||||
}
|
||||
|
||||
void *WMReplaceInArray(WMArray * array, int index, void *item)
|
||||
{
|
||||
void *old;
|
||||
|
||||
wassertrv(index >= 0 && index <= array->itemCount, NULL);
|
||||
|
||||
/* is it really useful to perform append if index == array->itemCount ? -Dan */
|
||||
if (index == array->itemCount) {
|
||||
WMAddToArray(array, item);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
old = array->items[index];
|
||||
array->items[index] = item;
|
||||
|
||||
return old;
|
||||
}
|
||||
|
||||
int WMDeleteFromArray(WMArray * array, int index)
|
||||
{
|
||||
wassertrv(index >= 0 && index < array->itemCount, 0);
|
||||
|
||||
if (array->destructor) {
|
||||
array->destructor(array->items[index]);
|
||||
}
|
||||
|
||||
if (index < array->itemCount - 1) {
|
||||
memmove(array->items + index, array->items + index + 1,
|
||||
sizeof(void *) * (array->itemCount - index - 1));
|
||||
}
|
||||
|
||||
array->itemCount--;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int WMRemoveFromArrayMatching(WMArray * array, WMMatchDataProc * match, void *cdata)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (match != NULL) {
|
||||
for (i = 0; i < array->itemCount; i++) {
|
||||
if ((*match) (array->items[i], cdata)) {
|
||||
WMDeleteFromArray(array, i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < array->itemCount; i++) {
|
||||
if (array->items[i] == cdata) {
|
||||
WMDeleteFromArray(array, i);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *WMGetFromArray(WMArray * array, int index)
|
||||
{
|
||||
if (index < 0 || index >= array->itemCount)
|
||||
return NULL;
|
||||
|
||||
return array->items[index];
|
||||
}
|
||||
|
||||
void *WMPopFromArray(WMArray * array)
|
||||
{
|
||||
array->itemCount--;
|
||||
|
||||
return array->items[array->itemCount];
|
||||
}
|
||||
|
||||
int WMFindInArray(WMArray * array, WMMatchDataProc * match, void *cdata)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (match != NULL) {
|
||||
for (i = 0; i < array->itemCount; i++) {
|
||||
if ((*match) (array->items[i], cdata))
|
||||
return i;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < array->itemCount; i++) {
|
||||
if (array->items[i] == cdata)
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return WANotFound;
|
||||
}
|
||||
|
||||
int WMCountInArray(WMArray * array, void *item)
|
||||
{
|
||||
int i, count;
|
||||
|
||||
for (i = 0, count = 0; i < array->itemCount; i++) {
|
||||
if (array->items[i] == item)
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
void WMSortArray(WMArray * array, WMCompareDataProc * comparer)
|
||||
{
|
||||
if (array->itemCount > 1) { /* Don't sort empty or single element arrays */
|
||||
qsort(array->items, array->itemCount, sizeof(void *), comparer);
|
||||
}
|
||||
}
|
||||
|
||||
void WMMapArray(WMArray * array, void (*function) (void *, void *), void *data)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < array->itemCount; i++) {
|
||||
(*function) (array->items[i], data);
|
||||
}
|
||||
}
|
||||
|
||||
WMArray *WMGetSubarrayWithRange(WMArray * array, WMRange aRange)
|
||||
{
|
||||
WMArray *newArray;
|
||||
|
||||
if (aRange.count <= 0)
|
||||
return WMCreateArray(0);
|
||||
|
||||
if (aRange.position < 0)
|
||||
aRange.position = 0;
|
||||
if (aRange.position >= array->itemCount)
|
||||
aRange.position = array->itemCount - 1;
|
||||
if (aRange.position + aRange.count > array->itemCount)
|
||||
aRange.count = array->itemCount - aRange.position;
|
||||
|
||||
newArray = WMCreateArray(aRange.count);
|
||||
memcpy(newArray->items, array->items + aRange.position, sizeof(void *) * aRange.count);
|
||||
newArray->itemCount = aRange.count;
|
||||
|
||||
return newArray;
|
||||
}
|
||||
|
||||
void *WMArrayFirst(WMArray * array, WMArrayIterator * iter)
|
||||
{
|
||||
if (array->itemCount == 0) {
|
||||
*iter = WANotFound;
|
||||
return NULL;
|
||||
} else {
|
||||
*iter = 0;
|
||||
return array->items[0];
|
||||
}
|
||||
}
|
||||
|
||||
void *WMArrayLast(WMArray * array, WMArrayIterator * iter)
|
||||
{
|
||||
if (array->itemCount == 0) {
|
||||
*iter = WANotFound;
|
||||
return NULL;
|
||||
} else {
|
||||
*iter = array->itemCount - 1;
|
||||
return array->items[*iter];
|
||||
}
|
||||
}
|
||||
|
||||
void *WMArrayNext(WMArray * array, WMArrayIterator * iter)
|
||||
{
|
||||
if (*iter >= 0 && *iter < array->itemCount - 1) {
|
||||
return array->items[++(*iter)];
|
||||
} else {
|
||||
*iter = WANotFound;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void *WMArrayPrevious(WMArray * array, WMArrayIterator * iter)
|
||||
{
|
||||
if (*iter > 0 && *iter < array->itemCount) {
|
||||
return array->items[--(*iter)];
|
||||
} else {
|
||||
*iter = WANotFound;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
419
WINGs/bagarray.c
419
WINGs/bagarray.c
@@ -1,419 +0,0 @@
|
||||
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
#if 0
|
||||
|
||||
typedef struct W_ArrayBag {
|
||||
void **items;
|
||||
int size;
|
||||
int count;
|
||||
|
||||
int base;
|
||||
int first;
|
||||
int last;
|
||||
} W_ArrayBag;
|
||||
|
||||
|
||||
static int getItemCount(WMBag *bag);
|
||||
static int appendBag(WMBag *bag, WMBag *appendedBag);
|
||||
static int putInBag(WMBag *bag, void *item);
|
||||
static int insertInBag(WMBag *bag, int index, void *item);
|
||||
static int removeFromBag(WMBag *bag, void *item);
|
||||
static int deleteFromBag(WMBag *bag, int index);
|
||||
static void* getFromBag(WMBag *bag, int index);
|
||||
static int firstInBag(WMBag *bag, void *item);
|
||||
static int countInBag(WMBag *bag, void *item);
|
||||
static void* replaceInBag(WMBag *bag, int index, void *item);
|
||||
static int sortBag(WMBag *bag, int (*comparer)(const void*, const void*));
|
||||
static void emptyBag(WMBag *bag);
|
||||
static void freeBag(WMBag *bag);
|
||||
static void mapBag(WMBag *bag, void (*function)(void*, void*), void *data);
|
||||
static int findInBag(WMBag *bag, int (*match)(void*));
|
||||
static void* first(WMBag *bag, void **ptr);
|
||||
static void* last(WMBag *bag, void **ptr);
|
||||
static void* next(WMBag *bag, void **ptr);
|
||||
static void* previous(WMBag *bag, void **ptr);
|
||||
static void* iteratorAtIndex(WMBag *bag, int index, WMBagIterator *ptr);
|
||||
static int indexForIterator(WMBag *bag, WMBagIterator ptr);
|
||||
|
||||
|
||||
static W_BagFunctions arrayFunctions = {
|
||||
getItemCount,
|
||||
appendBag,
|
||||
putInBag,
|
||||
insertInBag,
|
||||
removeFromBag,
|
||||
deleteFromBag,
|
||||
deleteFromBag,
|
||||
getFromBag,
|
||||
firstInBag,
|
||||
countInBag,
|
||||
replaceInBag,
|
||||
sortBag,
|
||||
emptyBag,
|
||||
freeBag,
|
||||
mapBag,
|
||||
findInBag,
|
||||
first,
|
||||
last,
|
||||
next,
|
||||
previous,
|
||||
iteratorAtIndex,
|
||||
indexForIterator
|
||||
};
|
||||
|
||||
|
||||
#define ARRAY ((W_ArrayBag*)bag->data)
|
||||
|
||||
|
||||
#define I2O(a, i) ((a)->base + i)
|
||||
|
||||
|
||||
WMBag*
|
||||
WMCreateArrayBagWithDestructor(int initialSize, void (*destructor)(void*))
|
||||
{
|
||||
WMBag *bag;
|
||||
W_ArrayBag *array;
|
||||
int size;
|
||||
|
||||
assert(0&&"array bag is not working");
|
||||
bag = wmalloc(sizeof(WMBag));
|
||||
|
||||
array = wmalloc(sizeof(W_ArrayBag));
|
||||
|
||||
bag->data = array;
|
||||
|
||||
array->items = wmalloc(sizeof(void*) * size);
|
||||
array->size = size;
|
||||
array->count = 0;
|
||||
array->first = 0;
|
||||
array->last = 0;
|
||||
array->base = 0;
|
||||
|
||||
bag->func = arrayFunctions;
|
||||
|
||||
bag->destructor = destructor;
|
||||
|
||||
return bag;
|
||||
}
|
||||
|
||||
|
||||
WMBag*
|
||||
WMCreateArrayBag(int initialSize)
|
||||
{
|
||||
return WMCreateArrayBagWithDestructor(initialSize, NULL);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
getItemCount(WMBag *bag)
|
||||
{
|
||||
return ARRAY->count;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
appendBag(WMBag *bag, WMBag *appendedBag)
|
||||
{
|
||||
W_ArrayBag *array = (W_ArrayBag*)appendedBag->data;
|
||||
int ok;
|
||||
int i;
|
||||
|
||||
for (i = array->first; i <= array->last; i++) {
|
||||
if (array->items[array->base+i]) {
|
||||
ok = putInBag(bag, array->items[array->base+i]);
|
||||
if (!ok)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
putInBag(WMBag *bag, void *item)
|
||||
{
|
||||
return insertInBag(bag, ARRAY->last+1, item);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
insertInBag(WMBag *bag, int index, void *item)
|
||||
{
|
||||
W_ArrayBag *array = ARRAY;
|
||||
|
||||
if (I2O(array, index) >= array->size) {
|
||||
array->size = WMAX(array->size + 16, I2O(array, index));
|
||||
array->items = wrealloc(array->items, sizeof(void*) * array->size);
|
||||
memset(array->items + I2O(array, array->last), 0,
|
||||
sizeof(void*) * (array->size - I2O(array, array->last)));
|
||||
}
|
||||
|
||||
if (index > array->last) {
|
||||
array->last = index;
|
||||
} else if (index >= array->first) {
|
||||
memmove(array->items + I2O(array, index),
|
||||
array->items + (I2O(array, index) + 1), sizeof(void*));
|
||||
array->last++;
|
||||
} else {
|
||||
memmove(array->items,
|
||||
array->items + (abs(index) - array->base),
|
||||
sizeof(void*) * (abs(index) - array->base));
|
||||
memset(array->items, 0, sizeof(void*) * (abs(index) - array->base));
|
||||
array->first = index;
|
||||
array->base = abs(index);
|
||||
}
|
||||
|
||||
array->items[array->base + index] = item;
|
||||
array->count++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
removeFromBag(WMBag *bag, void *item)
|
||||
{
|
||||
int i;
|
||||
W_ArrayBag *array = ARRAY;
|
||||
|
||||
for (i = 0; i < array->count; i++) {
|
||||
if (array->items[i] == item) {
|
||||
if (bag->destructor)
|
||||
bag->destructor(array->items[i]);
|
||||
|
||||
memmove(&array->items[i], &array->items[i + 1],
|
||||
(array->count - i - 1) * sizeof(void*));
|
||||
array->count--;
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
deleteFromBag(WMBag *bag, int index)
|
||||
{
|
||||
W_ArrayBag *array = ARRAY;
|
||||
|
||||
if (index < 0 || index >= array->count)
|
||||
return 0;
|
||||
|
||||
if (index < array->count-1) {
|
||||
if (bag->destructor)
|
||||
bag->destructor(array->items[index]);
|
||||
|
||||
memmove(&array->items[index], &array->items[index + 1],
|
||||
(array->count - index - 1) * sizeof(void*));
|
||||
}
|
||||
array->count--;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static void*
|
||||
getFromBag(WMBag *bag, int index)
|
||||
{
|
||||
if (index < 0 || index >= ARRAY->count)
|
||||
return NULL;
|
||||
|
||||
return ARRAY->items[index];
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
firstInBag(WMBag *bag, void *item)
|
||||
{
|
||||
int j;
|
||||
int count = ARRAY->count;
|
||||
W_ArrayBag *array = ARRAY;
|
||||
|
||||
for (j = 0; j < count; j++) {
|
||||
if (array->items[j] == item)
|
||||
return j;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static int
|
||||
countInBag(WMBag *bag, void *item)
|
||||
{
|
||||
int i, j;
|
||||
int count = ARRAY->count;
|
||||
W_ArrayBag *array = ARRAY;
|
||||
|
||||
for (j = 0, i = 0; j < count; j++) {
|
||||
if (array->items[j] == item)
|
||||
i++;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
static void*
|
||||
replaceInBag(WMBag *bag, int index, void *item)
|
||||
{
|
||||
void *old;
|
||||
|
||||
if (index < 0 || index >= ARRAY->count)
|
||||
return NULL;
|
||||
|
||||
old = ARRAY->items[index];
|
||||
|
||||
ARRAY->items[index] = item;
|
||||
|
||||
return old;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
sortBag(WMBag *bag, int (*comparer)(const void*, const void*))
|
||||
{
|
||||
qsort(ARRAY->items, ARRAY->count, sizeof(void*), comparer);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
emptyBag(WMBag *bag)
|
||||
{
|
||||
W_ArrayBag *array = ARRAY;
|
||||
|
||||
if (bag->destructor) {
|
||||
while (--array->count) {
|
||||
bag->destructor(array->items[array->count]);
|
||||
}
|
||||
}
|
||||
ARRAY->count=0;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
freeBag(WMBag *bag)
|
||||
{
|
||||
emptyBag(bag);
|
||||
|
||||
wfree(ARRAY->items);
|
||||
wfree(ARRAY);
|
||||
wfree(bag);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
mapBag(WMBag *bag, void (*function)(void *, void *), void *clientData)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY->last; i++) {
|
||||
if (ARRAY->items[i])
|
||||
(*function)(ARRAY->items[i], clientData);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
findInBag(WMBag *bag, int (*match)(void*))
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY->last; i++) {
|
||||
if ((*match)(ARRAY->items[i]))
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
static void*
|
||||
first(WMBag *bag, void **ptr)
|
||||
{
|
||||
*ptr = NULL;
|
||||
|
||||
if (ARRAY->count == 0)
|
||||
return NULL;
|
||||
|
||||
*(int**)ptr = 0;
|
||||
return ARRAY->items[0];
|
||||
}
|
||||
|
||||
|
||||
static void*
|
||||
last(WMBag *bag, void **ptr)
|
||||
{
|
||||
*ptr = NULL;
|
||||
|
||||
if (ARRAY->count == 0)
|
||||
return NULL;
|
||||
|
||||
*(int*)ptr = ARRAY->count-1;
|
||||
|
||||
return ARRAY->items[ARRAY->count-1];
|
||||
}
|
||||
|
||||
|
||||
static void*
|
||||
next(WMBag *bag, void **ptr)
|
||||
{
|
||||
if (!*ptr)
|
||||
return NULL;
|
||||
|
||||
(*(int*)ptr)++;
|
||||
if (*(int*)ptr >= ARRAY->count) {
|
||||
*ptr = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ARRAY->items[*(int*)ptr];
|
||||
}
|
||||
|
||||
|
||||
static void*
|
||||
previous(WMBag *bag, void **ptr)
|
||||
{
|
||||
if (!*ptr)
|
||||
return NULL;
|
||||
|
||||
(*(int*)ptr)--;
|
||||
if (*(int*)ptr < 0) {
|
||||
*ptr = NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ARRAY->items[*(int*)ptr];
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void*
|
||||
iteratorAtIndex(WMBag *bag, int index, WMBagIterator *ptr)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
indexForIterator(WMBag *bag, WMBagIterator ptr)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
427
WINGs/bagtree.c
427
WINGs/bagtree.c
@@ -1,13 +1,9 @@
|
||||
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
|
||||
typedef struct W_Node {
|
||||
struct W_Node *parent;
|
||||
struct W_Node *left;
|
||||
@@ -18,75 +14,20 @@ typedef struct W_Node {
|
||||
int index;
|
||||
} W_Node;
|
||||
|
||||
|
||||
typedef struct W_TreeBag {
|
||||
typedef struct W_Bag {
|
||||
W_Node *root;
|
||||
|
||||
W_Node *nil; /* sentinel */
|
||||
|
||||
int count;
|
||||
} W_TreeBag;
|
||||
|
||||
|
||||
|
||||
static int getItemCount(WMBag *self);
|
||||
static int appendBag(WMBag *self, WMBag *bag);
|
||||
static int putInBag(WMBag *self, void *item);
|
||||
static int insertInBag(WMBag *self, int index, void *item);
|
||||
static int removeFromBag(WMBag *bag, void *item);
|
||||
static int eraseFromBag(WMBag *bag, int index);
|
||||
static int deleteFromBag(WMBag *bag, int index);
|
||||
static void *getFromBag(WMBag *bag, int index);
|
||||
static int countInBag(WMBag *bag, void *item);
|
||||
static int firstInBag(WMBag *bag, void *item);
|
||||
static void *replaceInBag(WMBag *bag, int index, void *item);
|
||||
static int sortBag(WMBag *bag, int (*comparer)(const void*, const void*));
|
||||
static void emptyBag(WMBag *bag);
|
||||
static void freeBag(WMBag *bag);
|
||||
static void mapBag(WMBag *bag, void (*function)(void*, void*), void *data);
|
||||
static int findInBag(WMBag *bag, int (*match)(void*));;
|
||||
static void *first(WMBag *bag, WMBagIterator *ptr);
|
||||
static void *last(WMBag *bag, WMBagIterator *ptr);
|
||||
static void *next(WMBag *bag, WMBagIterator *ptr);
|
||||
static void *previous(WMBag *bag, WMBagIterator *ptr);
|
||||
static void *iteratorAtIndex(WMBag *bag, int index, WMBagIterator *ptr);
|
||||
static int indexForIterator(WMBag *bag, WMBagIterator ptr);
|
||||
|
||||
|
||||
static W_BagFunctions bagFunctions = {
|
||||
getItemCount,
|
||||
appendBag,
|
||||
putInBag,
|
||||
insertInBag,
|
||||
removeFromBag,
|
||||
eraseFromBag,
|
||||
deleteFromBag,
|
||||
getFromBag,
|
||||
firstInBag,
|
||||
countInBag,
|
||||
replaceInBag,
|
||||
sortBag,
|
||||
emptyBag,
|
||||
freeBag,
|
||||
mapBag,
|
||||
findInBag,
|
||||
first,
|
||||
last,
|
||||
next,
|
||||
previous,
|
||||
iteratorAtIndex,
|
||||
indexForIterator
|
||||
};
|
||||
|
||||
|
||||
|
||||
void (*destructor) (void *item);
|
||||
} W_Bag;
|
||||
|
||||
#define IS_LEFT(node) (node == node->parent->left)
|
||||
#define IS_RIGHT(node) (node == node->parent->right)
|
||||
|
||||
|
||||
|
||||
static void leftRotate(W_TreeBag *tree, W_Node *node)
|
||||
static void leftRotate(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *node2;
|
||||
|
||||
@@ -110,9 +51,7 @@ static void leftRotate(W_TreeBag *tree, W_Node *node)
|
||||
node->parent = node2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void rightRotate(W_TreeBag *tree, W_Node *node)
|
||||
static void rightRotate(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *node2;
|
||||
|
||||
@@ -136,16 +75,14 @@ static void rightRotate(W_TreeBag *tree, W_Node *node)
|
||||
node->parent = node2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void treeInsert(W_TreeBag *tree, W_Node *node)
|
||||
static void treeInsert(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *y = tree->nil;
|
||||
W_Node *x = tree->root;
|
||||
|
||||
while (x != tree->nil) {
|
||||
y = x;
|
||||
if (node->index < x->index)
|
||||
if (node->index <= x->index)
|
||||
x = x->left;
|
||||
else
|
||||
x = x->right;
|
||||
@@ -153,14 +90,13 @@ static void treeInsert(W_TreeBag *tree, W_Node *node)
|
||||
node->parent = y;
|
||||
if (y == tree->nil)
|
||||
tree->root = node;
|
||||
else if (node->index < y->index)
|
||||
else if (node->index <= y->index)
|
||||
y->left = node;
|
||||
else
|
||||
y->right = node;
|
||||
}
|
||||
|
||||
|
||||
static void rbTreeInsert(W_TreeBag *tree, W_Node *node)
|
||||
static void rbTreeInsert(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *y;
|
||||
|
||||
@@ -212,9 +148,7 @@ static void rbTreeInsert(W_TreeBag *tree, W_Node *node)
|
||||
tree->root->color = 'B';
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void rbDeleteFixup(W_TreeBag *tree, W_Node *node)
|
||||
static void rbDeleteFixup(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *w;
|
||||
|
||||
@@ -248,7 +182,7 @@ static void rbDeleteFixup(W_TreeBag *tree, W_Node *node)
|
||||
if (w->color == 'R') {
|
||||
w->color = 'B';
|
||||
node->parent->color = 'R';
|
||||
leftRotate(tree, node->parent);
|
||||
rightRotate(tree, node->parent);
|
||||
w = node->parent->left;
|
||||
}
|
||||
if (w->left->color == 'B' && w->right->color == 'B') {
|
||||
@@ -258,20 +192,20 @@ static void rbDeleteFixup(W_TreeBag *tree, W_Node *node)
|
||||
if (w->left->color == 'B') {
|
||||
w->right->color = 'B';
|
||||
w->color = 'R';
|
||||
rightRotate(tree, w);
|
||||
leftRotate(tree, w);
|
||||
w = node->parent->left;
|
||||
}
|
||||
w->color = node->parent->color;
|
||||
node->parent->color = 'B';
|
||||
w->left->color = 'B';
|
||||
leftRotate(tree, node->parent);
|
||||
rightRotate(tree, node->parent);
|
||||
node = tree->root;
|
||||
}
|
||||
}
|
||||
}
|
||||
node->color = 'B';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static W_Node *treeMinimum(W_Node * node, W_Node * nil)
|
||||
{
|
||||
@@ -280,7 +214,6 @@ static W_Node *treeMinimum(W_Node *node, W_Node *nil)
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
static W_Node *treeMaximum(W_Node * node, W_Node * nil)
|
||||
{
|
||||
while (node->right != nil)
|
||||
@@ -288,7 +221,6 @@ static W_Node *treeMaximum(W_Node *node, W_Node *nil)
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
static W_Node *treeSuccessor(W_Node * node, W_Node * nil)
|
||||
{
|
||||
W_Node *y;
|
||||
@@ -304,7 +236,6 @@ static W_Node *treeSuccessor(W_Node *node, W_Node *nil)
|
||||
return y;
|
||||
}
|
||||
|
||||
|
||||
static W_Node *treePredecessor(W_Node * node, W_Node * nil)
|
||||
{
|
||||
W_Node *y;
|
||||
@@ -320,8 +251,7 @@ static W_Node *treePredecessor(W_Node *node, W_Node *nil)
|
||||
return y;
|
||||
}
|
||||
|
||||
|
||||
static W_Node *rbTreeDelete(W_TreeBag *tree, W_Node *node)
|
||||
static W_Node *rbTreeDelete(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *nil = tree->nil;
|
||||
W_Node *x, *y;
|
||||
@@ -360,8 +290,6 @@ static W_Node *rbTreeDelete(W_TreeBag *tree, W_Node *node)
|
||||
return y;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static W_Node *treeSearch(W_Node * root, W_Node * nil, int index)
|
||||
{
|
||||
if (root == nil || root->index == index) {
|
||||
@@ -375,7 +303,6 @@ static W_Node *treeSearch(W_Node *root, W_Node *nil, int index)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static W_Node *treeFind(W_Node * root, W_Node * nil, void *data)
|
||||
{
|
||||
W_Node *tmp;
|
||||
@@ -392,10 +319,6 @@ static W_Node *treeFind(W_Node *root, W_Node *nil, void *data)
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#if 0
|
||||
static char buf[512];
|
||||
|
||||
@@ -417,7 +340,6 @@ static void printNodes(W_Node *node, W_Node *nil, int depth)
|
||||
printNodes(node->right, nil, depth + 1);
|
||||
}
|
||||
|
||||
|
||||
void PrintTree(WMBag * bag)
|
||||
{
|
||||
W_TreeBag *tree = (W_TreeBag *) bag->data;
|
||||
@@ -426,83 +348,58 @@ void PrintTree(WMBag *bag)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
#define SELF ((W_TreeBag*)self->data)
|
||||
|
||||
WMBag *WMCreateTreeBag(void)
|
||||
{
|
||||
return WMCreateTreeBagWithDestructor(NULL);
|
||||
}
|
||||
|
||||
|
||||
WMBag *WMCreateTreeBagWithDestructor(void (*destructor)(void*))
|
||||
WMBag *WMCreateTreeBagWithDestructor(WMFreeDataProc * destructor)
|
||||
{
|
||||
WMBag *bag;
|
||||
W_TreeBag *tree;
|
||||
|
||||
bag = wmalloc(sizeof(WMBag));
|
||||
|
||||
bag->data = tree = wmalloc(sizeof(W_TreeBag));
|
||||
memset(tree, 0, sizeof(W_TreeBag));
|
||||
|
||||
tree->nil = wmalloc(sizeof(W_Node));
|
||||
memset(tree->nil, 0, sizeof(W_Node));
|
||||
tree->nil->left = tree->nil->right = tree->nil->parent = tree->nil;
|
||||
tree->nil->index = WBNotFound;
|
||||
|
||||
tree->root = tree->nil;
|
||||
|
||||
bag->nil = wmalloc(sizeof(W_Node));
|
||||
bag->nil->left = bag->nil->right = bag->nil->parent = bag->nil;
|
||||
bag->nil->index = WBNotFound;
|
||||
bag->root = bag->nil;
|
||||
bag->destructor = destructor;
|
||||
|
||||
bag->func = bagFunctions;
|
||||
|
||||
return bag;
|
||||
}
|
||||
|
||||
|
||||
static int getItemCount(WMBag *self)
|
||||
int WMGetBagItemCount(WMBag * self)
|
||||
{
|
||||
return SELF->count;
|
||||
return self->count;
|
||||
}
|
||||
|
||||
|
||||
static int appendBag(WMBag *self, WMBag *bag)
|
||||
void WMAppendBag(WMBag * self, WMBag * bag)
|
||||
{
|
||||
WMBagIterator ptr;
|
||||
void *data;
|
||||
|
||||
for (data = first(bag, &ptr); data != NULL; data = next(bag, &ptr)) {
|
||||
if (!putInBag(self, data))
|
||||
return 0;
|
||||
for (data = WMBagFirst(bag, &ptr); data != NULL; data = WMBagNext(bag, &ptr)) {
|
||||
WMPutInBag(self, data);
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int putInBag(WMBag *self, void *item)
|
||||
void WMPutInBag(WMBag * self, void *item)
|
||||
{
|
||||
W_Node *ptr;
|
||||
|
||||
ptr = wmalloc(sizeof(W_Node));
|
||||
|
||||
ptr->data = item;
|
||||
ptr->index = SELF->count;
|
||||
ptr->left = SELF->nil;
|
||||
ptr->right = SELF->nil;
|
||||
ptr->parent = SELF->nil;
|
||||
ptr->index = self->count;
|
||||
ptr->left = self->nil;
|
||||
ptr->right = self->nil;
|
||||
ptr->parent = self->nil;
|
||||
|
||||
rbTreeInsert(SELF, ptr);
|
||||
rbTreeInsert(self, ptr);
|
||||
|
||||
SELF->count++;
|
||||
|
||||
return 1;
|
||||
self->count++;
|
||||
}
|
||||
|
||||
|
||||
static int insertInBag(WMBag *self, int index, void *item)
|
||||
void WMInsertInBag(WMBag * self, int index, void *item)
|
||||
{
|
||||
W_Node *ptr;
|
||||
|
||||
@@ -510,41 +407,38 @@ static int insertInBag(WMBag *self, int index, void *item)
|
||||
|
||||
ptr->data = item;
|
||||
ptr->index = index;
|
||||
ptr->left = SELF->nil;
|
||||
ptr->right = SELF->nil;
|
||||
ptr->parent = SELF->nil;
|
||||
ptr->left = self->nil;
|
||||
ptr->right = self->nil;
|
||||
ptr->parent = self->nil;
|
||||
|
||||
rbTreeInsert(SELF, ptr);
|
||||
rbTreeInsert(self, ptr);
|
||||
|
||||
while ((ptr = treeSuccessor(ptr, SELF->nil)) != SELF->nil) {
|
||||
while ((ptr = treeSuccessor(ptr, self->nil)) != self->nil) {
|
||||
ptr->index++;
|
||||
}
|
||||
|
||||
|
||||
SELF->count++;
|
||||
|
||||
return 1;
|
||||
self->count++;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int removeFromBag(WMBag *self, void *item)
|
||||
int WMRemoveFromBag(WMBag * self, void *item)
|
||||
{
|
||||
W_Node *ptr = treeFind(SELF->root, SELF->nil, item);
|
||||
W_Node *ptr = treeFind(self->root, self->nil, item);
|
||||
|
||||
if (ptr != SELF->nil) {
|
||||
if (ptr != self->nil) {
|
||||
W_Node *tmp;
|
||||
|
||||
SELF->count--;
|
||||
self->count--;
|
||||
|
||||
tmp = treeSuccessor(ptr, SELF->nil);
|
||||
while (tmp != SELF->nil) {
|
||||
tmp = treeSuccessor(ptr, self->nil);
|
||||
while (tmp != self->nil) {
|
||||
tmp->index--;
|
||||
tmp = treeSuccessor(tmp, SELF->nil);
|
||||
tmp = treeSuccessor(tmp, self->nil);
|
||||
}
|
||||
|
||||
ptr = rbTreeDelete(SELF, ptr);
|
||||
free(ptr);
|
||||
ptr = rbTreeDelete(self, ptr);
|
||||
if (self->destructor)
|
||||
self->destructor(ptr->data);
|
||||
wfree(ptr);
|
||||
|
||||
return 1;
|
||||
} else {
|
||||
@@ -552,18 +446,20 @@ static int removeFromBag(WMBag *self, void *item)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int eraseFromBag(WMBag *self, int index)
|
||||
int WMEraseFromBag(WMBag * self, int index)
|
||||
{
|
||||
W_Node *ptr = treeSearch(SELF->root, SELF->nil, index);
|
||||
W_Node *ptr = treeSearch(self->root, self->nil, index);
|
||||
|
||||
if (ptr != SELF->nil) {
|
||||
if (ptr != self->nil) {
|
||||
|
||||
SELF->count--;
|
||||
self->count--;
|
||||
|
||||
ptr = rbTreeDelete(SELF, ptr);
|
||||
free(ptr);
|
||||
ptr = rbTreeDelete(self, ptr);
|
||||
if (self->destructor)
|
||||
self->destructor(ptr->data);
|
||||
wfree(ptr);
|
||||
|
||||
wassertrv(self->count == 0 || self->root->index >= 0, 1);
|
||||
|
||||
return 1;
|
||||
} else {
|
||||
@@ -571,24 +467,27 @@ static int eraseFromBag(WMBag *self, int index)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int deleteFromBag(WMBag *self, int index)
|
||||
int WMDeleteFromBag(WMBag * self, int index)
|
||||
{
|
||||
W_Node *ptr = treeSearch(SELF->root, SELF->nil, index);
|
||||
W_Node *ptr = treeSearch(self->root, self->nil, index);
|
||||
|
||||
if (ptr != SELF->nil) {
|
||||
if (ptr != self->nil) {
|
||||
W_Node *tmp;
|
||||
|
||||
SELF->count--;
|
||||
self->count--;
|
||||
|
||||
tmp = treeSuccessor(ptr, SELF->nil);
|
||||
while (tmp != SELF->nil) {
|
||||
tmp = treeSuccessor(ptr, self->nil);
|
||||
while (tmp != self->nil) {
|
||||
tmp->index--;
|
||||
tmp = treeSuccessor(tmp, SELF->nil);
|
||||
tmp = treeSuccessor(tmp, self->nil);
|
||||
}
|
||||
|
||||
ptr = rbTreeDelete(SELF, ptr);
|
||||
free(ptr);
|
||||
ptr = rbTreeDelete(self, ptr);
|
||||
if (self->destructor)
|
||||
self->destructor(ptr->data);
|
||||
wfree(ptr);
|
||||
|
||||
wassertrv(self->count == 0 || self->root->index >= 0, 1);
|
||||
|
||||
return 1;
|
||||
} else {
|
||||
@@ -596,33 +495,28 @@ static int deleteFromBag(WMBag *self, int index)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void *getFromBag(WMBag *self, int index)
|
||||
void *WMGetFromBag(WMBag * self, int index)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
node = treeSearch(SELF->root, SELF->nil, index);
|
||||
if (node != SELF->nil)
|
||||
node = treeSearch(self->root, self->nil, index);
|
||||
if (node != self->nil)
|
||||
return node->data;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int firstInBag(WMBag *self, void *item)
|
||||
int WMGetFirstInBag(WMBag * self, void *item)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
node = treeFind(SELF->root, SELF->nil, item);
|
||||
if (node != SELF->nil)
|
||||
node = treeFind(self->root, self->nil, item);
|
||||
if (node != self->nil)
|
||||
return node->index;
|
||||
else
|
||||
return WBNotFound;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int treeCount(W_Node * root, W_Node * nil, void *item)
|
||||
{
|
||||
int count = 0;
|
||||
@@ -642,25 +536,23 @@ static int treeCount(W_Node *root, W_Node *nil, void *item)
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int countInBag(WMBag *self, void *item)
|
||||
int WMCountInBag(WMBag * self, void *item)
|
||||
{
|
||||
return treeCount(SELF->root, SELF->nil, item);
|
||||
return treeCount(self->root, self->nil, item);
|
||||
}
|
||||
|
||||
|
||||
static void *replaceInBag(WMBag *self, int index, void *item)
|
||||
void *WMReplaceInBag(WMBag * self, int index, void *item)
|
||||
{
|
||||
W_Node *ptr = treeSearch(SELF->root, SELF->nil, index);
|
||||
W_Node *ptr = treeSearch(self->root, self->nil, index);
|
||||
void *old = NULL;
|
||||
|
||||
if (item == NULL) {
|
||||
SELF->count--;
|
||||
|
||||
ptr = rbTreeDelete(SELF, ptr);
|
||||
free(ptr);
|
||||
} else if (ptr != SELF->nil) {
|
||||
self->count--;
|
||||
ptr = rbTreeDelete(self, ptr);
|
||||
if (self->destructor)
|
||||
self->destructor(ptr->data);
|
||||
wfree(ptr);
|
||||
} else if (ptr != self->nil) {
|
||||
old = ptr->data;
|
||||
ptr->data = item;
|
||||
} else {
|
||||
@@ -670,58 +562,52 @@ static void *replaceInBag(WMBag *self, int index, void *item)
|
||||
|
||||
ptr->data = item;
|
||||
ptr->index = index;
|
||||
ptr->left = SELF->nil;
|
||||
ptr->right = SELF->nil;
|
||||
ptr->parent = SELF->nil;
|
||||
ptr->left = self->nil;
|
||||
ptr->right = self->nil;
|
||||
ptr->parent = self->nil;
|
||||
|
||||
rbTreeInsert(SELF, ptr);
|
||||
rbTreeInsert(self, ptr);
|
||||
|
||||
SELF->count++;
|
||||
self->count++;
|
||||
}
|
||||
|
||||
return old;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static int sortBag(WMBag *self, int (*comparer)(const void*, const void*))
|
||||
void WMSortBag(WMBag * self, WMCompareDataProc * comparer)
|
||||
{
|
||||
void **items;
|
||||
W_Node *tmp;
|
||||
int i;
|
||||
|
||||
if (self->count == 0)
|
||||
return;
|
||||
|
||||
items = wmalloc(sizeof(void*)*SELF->count);
|
||||
items = wmalloc(sizeof(void *) * self->count);
|
||||
i = 0;
|
||||
|
||||
tmp = treeMinimum(SELF->root, SELF->nil);
|
||||
while (tmp != SELF->nil) {
|
||||
tmp = treeMinimum(self->root, self->nil);
|
||||
while (tmp != self->nil) {
|
||||
items[i++] = tmp->data;
|
||||
tmp = treeSuccessor(tmp, SELF->nil);
|
||||
tmp = treeSuccessor(tmp, self->nil);
|
||||
}
|
||||
|
||||
qsort(&items[0], SELF->count, sizeof(void*), comparer);
|
||||
qsort(&items[0], self->count, sizeof(void *), comparer);
|
||||
|
||||
i = 0;
|
||||
tmp = treeMinimum(SELF->root, SELF->nil);
|
||||
while (tmp != SELF->nil) {
|
||||
tmp = treeMinimum(self->root, self->nil);
|
||||
while (tmp != self->nil) {
|
||||
tmp->index = i;
|
||||
tmp->data = items[i++];
|
||||
tmp = treeSuccessor(tmp, SELF->nil);
|
||||
tmp = treeSuccessor(tmp, self->nil);
|
||||
}
|
||||
|
||||
wfree(items);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void deleteTree(WMBag * self, W_Node * node)
|
||||
{
|
||||
if (node == SELF->nil)
|
||||
if (node == self->nil)
|
||||
return;
|
||||
|
||||
deleteTree(self, node->left);
|
||||
@@ -731,29 +617,24 @@ static void deleteTree(WMBag *self, W_Node *node)
|
||||
|
||||
deleteTree(self, node->right);
|
||||
|
||||
free(node);
|
||||
wfree(node);
|
||||
}
|
||||
|
||||
|
||||
static void emptyBag(WMBag *self)
|
||||
void WMEmptyBag(WMBag * self)
|
||||
{
|
||||
deleteTree(self, SELF->root);
|
||||
SELF->root = SELF->nil;
|
||||
SELF->count = 0;
|
||||
deleteTree(self, self->root);
|
||||
self->root = self->nil;
|
||||
self->count = 0;
|
||||
}
|
||||
|
||||
|
||||
static void freeBag(WMBag *self)
|
||||
void WMFreeBag(WMBag * self)
|
||||
{
|
||||
emptyBag(self);
|
||||
|
||||
free(self);
|
||||
WMEmptyBag(self);
|
||||
wfree(self->nil);
|
||||
wfree(self);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void mapTree(W_TreeBag *tree, W_Node *node,
|
||||
void (*function)(void*, void*), void *data)
|
||||
static void mapTree(W_Bag * tree, W_Node * node, void (*function) (void *, void *), void *data)
|
||||
{
|
||||
if (node == tree->nil)
|
||||
return;
|
||||
@@ -765,132 +646,108 @@ static void mapTree(W_TreeBag *tree, W_Node *node,
|
||||
mapTree(tree, node->right, function, data);
|
||||
}
|
||||
|
||||
|
||||
static void mapBag(WMBag *self, void (*function)(void*, void*), void *data)
|
||||
void WMMapBag(WMBag * self, void (*function) (void *, void *), void *data)
|
||||
{
|
||||
mapTree(SELF, SELF->root, function, data);
|
||||
mapTree(self, self->root, function, data);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int findInTree(W_TreeBag *tree, W_Node *node, int (*function)(void*))
|
||||
static int findInTree(W_Bag * tree, W_Node * node, WMMatchDataProc * function, void *cdata)
|
||||
{
|
||||
int index;
|
||||
|
||||
if (node == tree->nil)
|
||||
return WBNotFound;
|
||||
|
||||
index = findInTree(tree, node->left, function);
|
||||
index = findInTree(tree, node->left, function, cdata);
|
||||
if (index != WBNotFound)
|
||||
return index;
|
||||
|
||||
if ((*function)(node->data)) {
|
||||
if ((*function) (node->data, cdata)) {
|
||||
return node->index;
|
||||
}
|
||||
|
||||
return findInTree(tree, node->right, function);
|
||||
return findInTree(tree, node->right, function, cdata);
|
||||
}
|
||||
|
||||
|
||||
static int findInBag(WMBag *self, int (*match)(void*))
|
||||
int WMFindInBag(WMBag * self, WMMatchDataProc * match, void *cdata)
|
||||
{
|
||||
return findInTree(SELF, SELF->root, match);
|
||||
return findInTree(self, self->root, match, cdata);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void *first(WMBag *self, WMBagIterator *ptr)
|
||||
void *WMBagFirst(WMBag * self, WMBagIterator * ptr)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
node = treeMinimum(SELF->root, SELF->nil);
|
||||
node = treeMinimum(self->root, self->nil);
|
||||
|
||||
if (node == SELF->nil) {
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
|
||||
return NULL;
|
||||
} else {
|
||||
*ptr = node;
|
||||
|
||||
return node->data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void *last(WMBag *self, WMBagIterator *ptr)
|
||||
void *WMBagLast(WMBag * self, WMBagIterator * ptr)
|
||||
{
|
||||
|
||||
W_Node *node;
|
||||
|
||||
node = treeMaximum(SELF->root, SELF->nil);
|
||||
node = treeMaximum(self->root, self->nil);
|
||||
|
||||
if (node == SELF->nil) {
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
|
||||
return NULL;
|
||||
} else {
|
||||
*ptr = node;
|
||||
|
||||
return node->data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void *next(WMBag *self, WMBagIterator *ptr)
|
||||
void *WMBagNext(WMBag * self, WMBagIterator * ptr)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
if (*ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
node = treeSuccessor(*ptr, SELF->nil);
|
||||
node = treeSuccessor(*ptr, self->nil);
|
||||
|
||||
if (node == SELF->nil) {
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
|
||||
return NULL;
|
||||
} else {
|
||||
*ptr = node;
|
||||
|
||||
return node->data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void *previous(WMBag *self, WMBagIterator *ptr)
|
||||
void *WMBagPrevious(WMBag * self, WMBagIterator * ptr)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
if (*ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
node = treePredecessor(*ptr, SELF->nil);
|
||||
node = treePredecessor(*ptr, self->nil);
|
||||
|
||||
|
||||
if (node == SELF->nil) {
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
|
||||
return NULL;
|
||||
} else {
|
||||
*ptr = node;
|
||||
|
||||
return node->data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void *iteratorAtIndex(WMBag *self, int index, WMBagIterator *ptr)
|
||||
void *WMBagIteratorAtIndex(WMBag * self, int index, WMBagIterator * ptr)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
node = treeSearch(SELF->root, SELF->nil, index);
|
||||
node = treeSearch(self->root, self->nil, index);
|
||||
|
||||
if (node == SELF->nil) {
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
return NULL;
|
||||
} else {
|
||||
@@ -899,9 +756,7 @@ static void *iteratorAtIndex(WMBag *self, int index, WMBagIterator *ptr)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int indexForIterator(WMBag *bag, WMBagIterator ptr)
|
||||
int WMBagIndexForIterator(WMBag * bag, WMBagIterator ptr)
|
||||
{
|
||||
return ((W_Node *) ptr)->index;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,48 +1,93 @@
|
||||
|
||||
|
||||
#include "WINGsP.h"
|
||||
#include "wconfig.h"
|
||||
|
||||
#include <proplist.h>
|
||||
|
||||
#include <X11/Xlocale.h>
|
||||
|
||||
_WINGsConfiguration WINGsConfiguration;
|
||||
|
||||
#define SYSTEM_FONT "Trebuchet MS,sans serif"
|
||||
#define BOLD_SYSTEM_FONT "Trebuchet MS,sans serif:bold"
|
||||
#define DEFAULT_FONT_SIZE 12
|
||||
|
||||
#define FLOPPY_PATH "/floppy"
|
||||
|
||||
#define SYSTEM_FONT "-*-helvetica-medium-r-normal-*-%d-*-*-*-*-*-*-*,-*-*-medium-r-*-*-%d-*-*-*-*-*-*-*"
|
||||
static unsigned getButtonWithName(const char *name, unsigned defaultButton)
|
||||
{
|
||||
if (strncmp(name, "Button", 6) == 0 && strlen(name) == 7) {
|
||||
switch (name[6]) {
|
||||
case '1':
|
||||
return Button1;
|
||||
case '2':
|
||||
return Button2;
|
||||
case '3':
|
||||
return Button3;
|
||||
case '4':
|
||||
return Button4;
|
||||
case '5':
|
||||
return Button5;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#define BOLD_SYSTEM_FONT "-*-helvetica-bold-r-normal-*-%d-*-*-*-*-*-*-*,-*-*-bold-r-*-*-%d-*-*-*-*-*-*-*"
|
||||
return defaultButton;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
W_ReadConfigurations(void)
|
||||
void W_ReadConfigurations(void)
|
||||
{
|
||||
WMUserDefaults *defaults;
|
||||
Bool aaIsSet = False;
|
||||
|
||||
memset(&WINGsConfiguration, 0, sizeof(_WINGsConfiguration));
|
||||
|
||||
defaults = WMGetStandardUserDefaults();
|
||||
|
||||
if (defaults) {
|
||||
WINGsConfiguration.systemFont =
|
||||
WMGetUDStringForKey(defaults, "SystemFont");
|
||||
char *buttonName;
|
||||
WMPropList *val;
|
||||
unsigned button;
|
||||
|
||||
WINGsConfiguration.boldSystemFont =
|
||||
WMGetUDStringForKey(defaults, "BoldSystemFont");
|
||||
WINGsConfiguration.systemFont = WMGetUDStringForKey(defaults, "SystemFont");
|
||||
|
||||
WINGsConfiguration.useMultiByte =
|
||||
WMGetUDBoolForKey(defaults, "MultiByteText");
|
||||
WINGsConfiguration.boldSystemFont = WMGetUDStringForKey(defaults, "BoldSystemFont");
|
||||
|
||||
WINGsConfiguration.doubleClickDelay =
|
||||
WMGetUDIntegerForKey(defaults, "DoubleClickTime");
|
||||
|
||||
WINGsConfiguration.defaultFontSize =
|
||||
WMGetUDIntegerForKey(defaults, "DefaultFontSize");
|
||||
val = WMGetUDObjectForKey(defaults, "AntialiasedText");
|
||||
if (val && WMIsPLString(val) && WMGetFromPLString(val)) {
|
||||
aaIsSet = True;
|
||||
WINGsConfiguration.antialiasedText =
|
||||
WMGetUDBoolForKey(defaults, "AntialiasedText");
|
||||
}
|
||||
|
||||
WINGsConfiguration.doubleClickDelay = WMGetUDIntegerForKey(defaults, "DoubleClickTime");
|
||||
|
||||
WINGsConfiguration.floppyPath = WMGetUDStringForKey(defaults, "FloppyPath");
|
||||
|
||||
buttonName = WMGetUDStringForKey(defaults, "MouseWheelUp");
|
||||
if (buttonName) {
|
||||
button = getButtonWithName(buttonName, Button4);
|
||||
wfree(buttonName);
|
||||
} else {
|
||||
button = Button4;
|
||||
}
|
||||
WINGsConfiguration.mouseWheelUp = button;
|
||||
|
||||
buttonName = WMGetUDStringForKey(defaults, "MouseWheelDown");
|
||||
if (buttonName) {
|
||||
button = getButtonWithName(buttonName, Button5);
|
||||
wfree(buttonName);
|
||||
} else {
|
||||
button = Button5;
|
||||
}
|
||||
WINGsConfiguration.mouseWheelDown = button;
|
||||
|
||||
if (WINGsConfiguration.mouseWheelDown == WINGsConfiguration.mouseWheelUp) {
|
||||
WINGsConfiguration.mouseWheelUp = Button4;
|
||||
WINGsConfiguration.mouseWheelDown = Button5;
|
||||
}
|
||||
|
||||
WINGsConfiguration.defaultFontSize = WMGetUDIntegerForKey(defaults, "DefaultFontSize");
|
||||
}
|
||||
|
||||
if (!WINGsConfiguration.systemFont) {
|
||||
WINGsConfiguration.systemFont = SYSTEM_FONT;
|
||||
@@ -50,12 +95,23 @@ W_ReadConfigurations(void)
|
||||
if (!WINGsConfiguration.boldSystemFont) {
|
||||
WINGsConfiguration.boldSystemFont = BOLD_SYSTEM_FONT;
|
||||
}
|
||||
if (WINGsConfiguration.defaultFontSize == 0) {
|
||||
WINGsConfiguration.defaultFontSize = DEFAULT_FONT_SIZE;
|
||||
}
|
||||
if (!aaIsSet) {
|
||||
WINGsConfiguration.antialiasedText = True;
|
||||
}
|
||||
if (!WINGsConfiguration.floppyPath) {
|
||||
WINGsConfiguration.floppyPath = FLOPPY_PATH;
|
||||
}
|
||||
if (WINGsConfiguration.doubleClickDelay == 0) {
|
||||
WINGsConfiguration.doubleClickDelay = 250;
|
||||
}
|
||||
if (WINGsConfiguration.defaultFontSize == 0) {
|
||||
WINGsConfiguration.defaultFontSize = 12;
|
||||
if (WINGsConfiguration.mouseWheelUp == 0) {
|
||||
WINGsConfiguration.mouseWheelUp = Button4;
|
||||
}
|
||||
if (WINGsConfiguration.mouseWheelDown == 0) {
|
||||
WINGsConfiguration.mouseWheelDown = Button5;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
209
WINGs/connect.c
209
WINGs/connect.c
@@ -1,209 +0,0 @@
|
||||
/*
|
||||
* WINGs connect.c: example how to create a network client using WMConnection
|
||||
*
|
||||
* Copyright (c) 1999 Dan Pascu
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "WINGs.h"
|
||||
|
||||
|
||||
|
||||
static int initialized = 0;
|
||||
|
||||
|
||||
|
||||
static void didReceiveInput(ConnectionDelegate *self, WMConnection *cPtr);
|
||||
|
||||
static void connectionDidDie(ConnectionDelegate *self, WMConnection *cPtr);
|
||||
|
||||
static void didInitialize(ConnectionDelegate *self, WMConnection *cPtr);
|
||||
|
||||
|
||||
|
||||
static ConnectionDelegate socketDelegate = {
|
||||
NULL, /* data */
|
||||
NULL, /* didCatchException */
|
||||
connectionDidDie, /* didDie */
|
||||
didInitialize, /* didInitialize */
|
||||
didReceiveInput, /* didReceiveInput */
|
||||
NULL /* didTimeout */
|
||||
};
|
||||
|
||||
|
||||
|
||||
void
|
||||
wAbort(Bool foo) /*FOLD00*/
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
static char*
|
||||
getMessage(WMConnection *cPtr)
|
||||
{
|
||||
char *buffer;
|
||||
WMData *aData;
|
||||
int length;
|
||||
|
||||
aData = WMGetConnectionAvailableData(cPtr);
|
||||
if (!aData)
|
||||
return NULL;
|
||||
if ((length=WMGetDataLength(aData))==0) {
|
||||
WMReleaseData(aData);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer = (char*)wmalloc(length+1);
|
||||
WMGetDataBytes(aData, buffer);
|
||||
buffer[length]= '\0';
|
||||
WMReleaseData(aData);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
inputHandler(int fd, int mask, void *clientData)
|
||||
{
|
||||
WMConnection *cPtr = (WMConnection*)clientData;
|
||||
WMData *aData;
|
||||
char buf[4096];
|
||||
int n;
|
||||
|
||||
if (!initialized)
|
||||
return;
|
||||
|
||||
n = read(fd, buf, 4096);
|
||||
if (n>0) {
|
||||
aData = WMCreateDataWithBytes(buf, n);
|
||||
WMSendConnectionData(cPtr, aData);
|
||||
WMReleaseData(aData);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
didReceiveInput(ConnectionDelegate *self, WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
char *buffer;
|
||||
|
||||
buffer = getMessage(cPtr);
|
||||
if (!buffer) {
|
||||
fprintf(stderr, "Connection closed by peer.\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
printf("%s", buffer);
|
||||
|
||||
wfree(buffer);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
connectionDidDie(ConnectionDelegate *self, WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
WMCloseConnection(cPtr);
|
||||
|
||||
fprintf(stderr, "Connection closed by peer.\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
didInitialize(ConnectionDelegate *self, WMConnection *cPtr)
|
||||
{
|
||||
int state = WMGetConnectionState(cPtr);
|
||||
WMHost *host;
|
||||
|
||||
if (state == WCConnected) {
|
||||
host = WMGetHostWithAddress(WMGetConnectionAddress(cPtr));
|
||||
fprintf(stderr, "connected to '%s:%s'\n",
|
||||
host?WMGetHostName(host):WMGetConnectionAddress(cPtr),
|
||||
WMGetConnectionService(cPtr));
|
||||
initialized = 1;
|
||||
if (host)
|
||||
WMReleaseHost(host);
|
||||
return;
|
||||
} else {
|
||||
wsyserrorwithcode(WCErrorCode, "Unable to connect");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char **argv) /*FOLD00*/
|
||||
{
|
||||
char *ProgName, *host, *port;
|
||||
int i;
|
||||
WMConnection *sPtr;
|
||||
|
||||
wsetabort(wAbort);
|
||||
|
||||
WMInitializeApplication("connect", &argc, argv);
|
||||
|
||||
ProgName = strrchr(argv[0],'/');
|
||||
if (!ProgName)
|
||||
ProgName = argv[0];
|
||||
else
|
||||
ProgName++;
|
||||
|
||||
host = NULL;
|
||||
port = "7000";
|
||||
|
||||
if (argc>1) {
|
||||
for (i=1; i<argc; i++) {
|
||||
if (strcmp(argv[i], "--help")==0 || strcmp(argv[i], "-h")==0) {
|
||||
printf("usage: %s [host [port]]\n\n", ProgName);
|
||||
exit(0);
|
||||
} else {
|
||||
if (!host)
|
||||
host = argv[i];
|
||||
else
|
||||
port = argv[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("Trying to make connection to '%s:%s'\n",
|
||||
host?host:"localhost", port);
|
||||
|
||||
sPtr = WMCreateConnectionToAddressAndNotify(host, port, NULL);
|
||||
if (!sPtr) {
|
||||
wfatal("could not create connection. exiting");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
WMSetConnectionDelegate(sPtr, &socketDelegate);
|
||||
|
||||
/* watch what user types and send it over the connection */
|
||||
WMAddInputHandler(0, WIReadMask, inputHandler, sPtr);
|
||||
|
||||
while (1) {
|
||||
WHandleEvents();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,939 +0,0 @@
|
||||
/*
|
||||
* WINGs WMConnection function library
|
||||
*
|
||||
* Copyright (c) 1999 Dan Pascu
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* - decide if we want to support connections with external sockets, else
|
||||
* clean up the structure of the unneeded members.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "../src/config.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <signal.h>
|
||||
#ifdef __FreeBSD__
|
||||
#include <sys/signal.h>
|
||||
#endif
|
||||
|
||||
#include "WINGs.h"
|
||||
|
||||
|
||||
/* Some older systems does not define this (linux libc5, maybe others too) */
|
||||
#ifndef SHUT_RDWR
|
||||
# define SHUT_RDWR 2
|
||||
#endif
|
||||
|
||||
/* for SunOS */
|
||||
#ifndef SA_RESTART
|
||||
# define SA_RESTART 0
|
||||
#endif
|
||||
|
||||
/* Stuff for setting the sockets into non-blocking mode. */
|
||||
/*#ifdef __POSIX_SOURCE
|
||||
# define NONBLOCK_OPT O_NONBLOCK
|
||||
#else
|
||||
# define NONBLOCK_OPT FNDELAY
|
||||
#endif*/
|
||||
|
||||
#define NONBLOCK_OPT O_NONBLOCK
|
||||
|
||||
|
||||
#define NETBUF_SIZE 4096
|
||||
|
||||
|
||||
#define DEF_TIMEOUT 600 /* 600 seconds == 10 minutes */
|
||||
|
||||
|
||||
int WCErrorCode = 0;
|
||||
|
||||
|
||||
|
||||
static Bool SigInitialized = False;
|
||||
|
||||
|
||||
|
||||
typedef struct TimeoutData {
|
||||
unsigned timeout;
|
||||
WMHandlerID *handler;
|
||||
} TimeoutData;
|
||||
|
||||
|
||||
|
||||
typedef struct W_Connection {
|
||||
int sock; /* the socket we speak through */
|
||||
|
||||
struct {
|
||||
WMHandlerID *read; /* the input read handler */
|
||||
WMHandlerID *write; /* the input write handler */
|
||||
WMHandlerID *exception; /* the input exception handler */
|
||||
} handler;
|
||||
|
||||
ConnectionDelegate *delegate; /* client delegates */
|
||||
void *clientData; /* client data */
|
||||
unsigned int uflags; /* flags for the client */
|
||||
|
||||
WMBag *outputQueue;
|
||||
unsigned bufPos;
|
||||
|
||||
TimeoutData sendTimeout;
|
||||
|
||||
WMConnectionState state;
|
||||
|
||||
char *address;
|
||||
char *service;
|
||||
char *protocol;
|
||||
|
||||
Bool closeOnRelease;
|
||||
Bool wasNonBlocking;
|
||||
Bool isNonBlocking;
|
||||
|
||||
} W_Connection;
|
||||
|
||||
|
||||
|
||||
|
||||
static void
|
||||
clearOutputQueue(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
int i;
|
||||
|
||||
cPtr->bufPos = 0;
|
||||
|
||||
for (i=0; i<WMGetBagItemCount(cPtr->outputQueue); i++)
|
||||
WMReleaseData(WMGetFromBag(cPtr->outputQueue, i));
|
||||
|
||||
WMEmptyBag(cPtr->outputQueue);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
sendTimeout(void *cdata) /*FOLD00*/
|
||||
{
|
||||
WMConnection *cPtr = (WMConnection*) cdata;
|
||||
TimeoutData *tPtr = &cPtr->sendTimeout;
|
||||
|
||||
tPtr->handler = NULL;
|
||||
if (cPtr->handler.write) {
|
||||
WMDeleteInputHandler(cPtr->handler.write);
|
||||
cPtr->handler.write = NULL;
|
||||
}
|
||||
if (WMGetBagItemCount(cPtr->outputQueue)>0) {
|
||||
clearOutputQueue(cPtr);
|
||||
if (cPtr->delegate && cPtr->delegate->didTimeout)
|
||||
(*cPtr->delegate->didTimeout)(cPtr->delegate, cPtr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
inputHandler(int fd, int mask, void *clientData) /*FOLD00*/
|
||||
{
|
||||
WMConnection *cPtr = (WMConnection*)clientData;
|
||||
|
||||
if (cPtr->state==WCClosed || cPtr->state==WCDied)
|
||||
return;
|
||||
|
||||
if ((mask & WIWriteMask)) {
|
||||
if (cPtr->state == WCInProgress) {
|
||||
int result;
|
||||
int len = sizeof(result);
|
||||
|
||||
if (getsockopt(cPtr->sock, SOL_SOCKET, SO_ERROR,
|
||||
(void*)&result, &len) == 0 && result != 0) {
|
||||
cPtr->state = WCFailed;
|
||||
WCErrorCode = result;
|
||||
/* should call wsyserrorwithcode(result, ...) here? */
|
||||
} else {
|
||||
cPtr->state = WCConnected;
|
||||
}
|
||||
|
||||
if (cPtr->handler.write) {
|
||||
WMDeleteInputHandler(cPtr->handler.write);
|
||||
cPtr->handler.write = NULL;
|
||||
}
|
||||
|
||||
if (cPtr->delegate && cPtr->delegate->didInitialize)
|
||||
(*cPtr->delegate->didInitialize)(cPtr->delegate, cPtr);
|
||||
|
||||
if (cPtr->state == WCFailed)
|
||||
return;
|
||||
} else if (cPtr->state == WCConnected) {
|
||||
WMFlushConnection(cPtr);
|
||||
}
|
||||
}
|
||||
|
||||
if (!cPtr->delegate)
|
||||
return;
|
||||
|
||||
/* if the connection died, may get destroyed in the delegate, so retain */
|
||||
wretain(cPtr);
|
||||
|
||||
if ((mask & WIReadMask) && cPtr->delegate->didReceiveInput)
|
||||
(*cPtr->delegate->didReceiveInput)(cPtr->delegate, cPtr);
|
||||
|
||||
if ((mask & WIExceptMask) && cPtr->delegate->didCatchException)
|
||||
(*cPtr->delegate->didCatchException)(cPtr->delegate, cPtr);
|
||||
|
||||
wrelease(cPtr);
|
||||
}
|
||||
|
||||
|
||||
static Bool
|
||||
setSocketNonBlocking(int sock, Bool flag) /*FOLD00*/
|
||||
{
|
||||
int state;
|
||||
Bool isNonBlock;
|
||||
|
||||
state = fcntl(sock, F_GETFL, 0);
|
||||
|
||||
if (state < 0) {
|
||||
wsyserror("Failed to get socket flags with fcntl.");
|
||||
return False;
|
||||
}
|
||||
|
||||
isNonBlock = (state & NONBLOCK_OPT) != 0;
|
||||
|
||||
if (flag) {
|
||||
if (isNonBlock)
|
||||
return True;
|
||||
state |= NONBLOCK_OPT;
|
||||
} else {
|
||||
if (!isNonBlock)
|
||||
return True;
|
||||
state &= ~NONBLOCK_OPT;
|
||||
}
|
||||
|
||||
if (fcntl(sock, F_SETFL, state) < 0) {
|
||||
wsyserror("Failed to set socket flags with fcntl.");
|
||||
return False;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
setConnectionAddress(WMConnection *cPtr, struct sockaddr_in *socketaddr) /*FOLD00*/
|
||||
{
|
||||
wassertr(cPtr->address==NULL);
|
||||
|
||||
cPtr->address = wstrdup(inet_ntoa(socketaddr->sin_addr));
|
||||
cPtr->service = wmalloc(16);
|
||||
sprintf(cPtr->service, "%hu", ntohs(socketaddr->sin_port));
|
||||
cPtr->protocol = wstrdup("tcp");
|
||||
}
|
||||
|
||||
|
||||
static struct sockaddr_in*
|
||||
getSocketAddress(char* name, char* service, char* protocol) /*FOLD00*/
|
||||
{
|
||||
static struct sockaddr_in socketaddr;
|
||||
struct servent *sp;
|
||||
|
||||
if (!protocol || protocol[0]=='\0')
|
||||
protocol = "tcp";
|
||||
|
||||
memset(&socketaddr, 0, sizeof(struct sockaddr_in));
|
||||
socketaddr.sin_family = AF_INET;
|
||||
|
||||
/*
|
||||
* If we were given a hostname, we use any address for that host.
|
||||
* Otherwise we expect the given name to be an address unless it is
|
||||
* NULL (any address).
|
||||
*/
|
||||
if (name && name[0]!='\0') {
|
||||
WMHost *host = WMGetHostWithName(name);
|
||||
|
||||
if (!host)
|
||||
return NULL; /* name is not a hostname nor a number and dot adr */
|
||||
|
||||
name = WMGetHostAddress(host);
|
||||
#ifndef HAVE_INET_ATON
|
||||
if ((socketaddr.sin_addr.s_addr = inet_addr(name)) == INADDR_NONE) {
|
||||
#else
|
||||
if (inet_aton(name, &socketaddr.sin_addr) == 0) {
|
||||
#endif
|
||||
WMReleaseHost(host);
|
||||
return NULL;
|
||||
}
|
||||
WMReleaseHost(host);
|
||||
} else {
|
||||
socketaddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
||||
}
|
||||
|
||||
if (!service || service[0]=='\0') {
|
||||
socketaddr.sin_port = 0;
|
||||
} else if ((sp = getservbyname(service, protocol))==0) {
|
||||
char *endptr;
|
||||
unsigned portNumber;
|
||||
|
||||
portNumber = strtoul(service, &endptr, 10);
|
||||
|
||||
if (service[0]!='\0' && *endptr=='\0' && portNumber<65536) {
|
||||
socketaddr.sin_port = htons(portNumber);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
socketaddr.sin_port = sp->s_port;
|
||||
}
|
||||
|
||||
return &socketaddr;
|
||||
}
|
||||
|
||||
|
||||
static WMConnection*
|
||||
createConnectionWithSocket(int sock, Bool closeOnRelease) /*FOLD00*/
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
struct sigaction sig_action;
|
||||
|
||||
cPtr = wmalloc(sizeof(WMConnection));
|
||||
wretain(cPtr);
|
||||
memset(cPtr, 0, sizeof(WMConnection));
|
||||
|
||||
cPtr->sock = sock;
|
||||
cPtr->sendTimeout.timeout = DEF_TIMEOUT;
|
||||
cPtr->sendTimeout.handler = NULL;
|
||||
cPtr->closeOnRelease = closeOnRelease;
|
||||
cPtr->outputQueue = WMCreateBag(16);
|
||||
cPtr->state = WCNotConnected;
|
||||
|
||||
/* ignore dead pipe */
|
||||
if (!SigInitialized) {
|
||||
sig_action.sa_handler = SIG_IGN;
|
||||
sig_action.sa_flags = SA_RESTART;
|
||||
sigaction(SIGPIPE, &sig_action, NULL);
|
||||
SigInitialized = True;
|
||||
}
|
||||
|
||||
return cPtr;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
WMConnection*
|
||||
WMCreateConnectionWithSocket(int sock, Bool closeOnRelease) /*FOLD00*/
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
struct sockaddr_in clientname;
|
||||
int size, n;
|
||||
|
||||
cPtr = createConnectionWithSocket(sock, closeOnRelease);
|
||||
cPtr->wasNonBlocking = WMIsConnectionNonBlocking(cPtr);
|
||||
cPtr->isNonBlocking = cPtr->wasNonBlocking;
|
||||
|
||||
/* some way to find out if it is connected, and binded. can't find
|
||||
if it listens though!!!
|
||||
*/
|
||||
|
||||
size = sizeof(clientname);
|
||||
n = getpeername(sock, (struct sockaddr*) &clientname, &size);
|
||||
if (n==0) {
|
||||
/* Since we have a peer, it means we are connected */
|
||||
cPtr->state = WCConnected;
|
||||
} else {
|
||||
size = sizeof(clientname);
|
||||
n = getsockname(sock, (struct sockaddr*) &clientname, &size);
|
||||
if (n==0) {
|
||||
/* We don't have a peer, but we are binded to an address.
|
||||
* Assume we are listening on it (we don't know that for sure!)
|
||||
*/
|
||||
cPtr->state = WCListening;
|
||||
} else {
|
||||
cPtr->state = WCNotConnected;
|
||||
}
|
||||
}
|
||||
|
||||
return cPtr;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* host is the name on which we want to listen for incoming connections,
|
||||
* and it must be a name of this host, or NULL if we want to listen
|
||||
* on any incoming address.
|
||||
* service is either a service name as present in /etc/services, or the port
|
||||
* number we want to listen on. If NULL, a random port between
|
||||
* 1024 and 65535 will be assigned to us.
|
||||
* protocol is one of "tcp" or "udp". If NULL, "tcp" will be used by default.
|
||||
* currently only "tcp" is supported.
|
||||
*/
|
||||
WMConnection*
|
||||
WMCreateConnectionAsServerAtAddress(char *host, char *service, char *protocol) /*FOLD00*/
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
struct sockaddr_in *socketaddr;
|
||||
int sock, size, on;
|
||||
|
||||
if ((socketaddr = getSocketAddress(host, service, protocol)) == NULL) {
|
||||
WCErrorCode = 0;
|
||||
wwarning("Bad address-service-protocol combination");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create the actual socket */
|
||||
sock = socket(PF_INET, SOCK_STREAM, 0);
|
||||
if (sock<0) {
|
||||
WCErrorCode = errno;
|
||||
wsyserror("Unable to create socket");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set socket options. We try to make the port reusable and have it
|
||||
* close as fast as possible without waiting in unnecessary wait states
|
||||
* on close.
|
||||
*/
|
||||
on = 1;
|
||||
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on));
|
||||
|
||||
if (bind(sock, (struct sockaddr *)socketaddr, sizeof(*socketaddr)) < 0) {
|
||||
WCErrorCode = errno;
|
||||
wsyserror("Unable to bind to address '%s:%hu'",
|
||||
inet_ntoa(socketaddr->sin_addr),
|
||||
ntohs(socketaddr->sin_port));
|
||||
close(sock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (listen(sock, 10) < 0) {
|
||||
WCErrorCode = errno;
|
||||
wsyserror("Unable to listen on port '%hu'",
|
||||
ntohs(socketaddr->sin_port));
|
||||
close(sock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Find out what is the address/service/protocol we get */
|
||||
/* In case some of address/service/protocol were NULL */
|
||||
size = sizeof(*socketaddr);
|
||||
if (getsockname(sock, (struct sockaddr*)socketaddr, &size) < 0) {
|
||||
WCErrorCode = errno;
|
||||
wsyserror("Unable to get socket address");
|
||||
close(sock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cPtr = createConnectionWithSocket(sock, True);
|
||||
cPtr->state = WCListening;
|
||||
WMSetConnectionNonBlocking(cPtr, True);
|
||||
|
||||
setConnectionAddress(cPtr, socketaddr);
|
||||
|
||||
return cPtr;
|
||||
}
|
||||
|
||||
|
||||
WMConnection*
|
||||
WMCreateConnectionToAddress(char *host, char *service, char *protocol) /*FOLD00*/
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
struct sockaddr_in *socketaddr;
|
||||
int sock;
|
||||
|
||||
if (service==NULL || service[0]=='\0') {
|
||||
WCErrorCode = 0;
|
||||
wwarning("Bad argument - service is not specified");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (host==NULL || host[0]=='\0')
|
||||
host = "localhost";
|
||||
|
||||
if ((socketaddr = getSocketAddress(host, service, protocol)) == NULL) {
|
||||
WCErrorCode = 0;
|
||||
wwarning("Bad address-service-protocol combination");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create the actual socket */
|
||||
sock = socket(PF_INET, SOCK_STREAM, 0);
|
||||
if (sock<0) {
|
||||
WCErrorCode = errno;
|
||||
wsyserror("Unable to create socket");
|
||||
return NULL;
|
||||
}
|
||||
/* make socket blocking while we connect. */
|
||||
setSocketNonBlocking(sock, False);
|
||||
if (connect(sock, (struct sockaddr*)socketaddr, sizeof(*socketaddr)) < 0) {
|
||||
WCErrorCode = errno;
|
||||
wsyserror("Unable to make connection to address '%s:%hu'",
|
||||
inet_ntoa(socketaddr->sin_addr),
|
||||
ntohs(socketaddr->sin_port));
|
||||
close(sock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cPtr = createConnectionWithSocket(sock, True);
|
||||
cPtr->state = WCConnected;
|
||||
WMSetConnectionNonBlocking(cPtr, True);
|
||||
setConnectionAddress(cPtr, socketaddr);
|
||||
|
||||
return cPtr;
|
||||
}
|
||||
|
||||
|
||||
WMConnection*
|
||||
WMCreateConnectionToAddressAndNotify(char *host, char *service, char *protocol) /*FOLD00*/
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
/*TimeoutData *tPtr;*/
|
||||
struct sockaddr_in *socketaddr;
|
||||
int sock;
|
||||
Bool isNonBlocking;
|
||||
|
||||
if (service==NULL || service[0]=='\0') {
|
||||
WCErrorCode = 0;
|
||||
wwarning("Bad argument - service is not specified");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (host==NULL || host[0]=='\0')
|
||||
host = "localhost";
|
||||
|
||||
if ((socketaddr = getSocketAddress(host, service, protocol)) == NULL) {
|
||||
WCErrorCode = 0;
|
||||
wwarning("Bad address-service-protocol combination");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create the actual socket */
|
||||
sock = socket(PF_INET, SOCK_STREAM, 0);
|
||||
if (sock<0) {
|
||||
WCErrorCode = errno;
|
||||
wsyserror("Unable to create socket");
|
||||
return NULL;
|
||||
}
|
||||
isNonBlocking = setSocketNonBlocking(sock, True);
|
||||
if (connect(sock, (struct sockaddr*)socketaddr, sizeof(*socketaddr)) < 0) {
|
||||
if (errno!=EINPROGRESS) {
|
||||
WCErrorCode = errno;
|
||||
wsyserror("Unable to make connection to address '%s:%hu'",
|
||||
inet_ntoa(socketaddr->sin_addr),
|
||||
ntohs(socketaddr->sin_port));
|
||||
close(sock);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
cPtr = createConnectionWithSocket(sock, True);
|
||||
cPtr->state = WCInProgress;
|
||||
cPtr->isNonBlocking = isNonBlocking;
|
||||
|
||||
/*tPtr = &cPtr->sendTimeout;
|
||||
tPtr->handler = WMAddTimerHandler(tPtr->timeout*1000, connectTimeout, cPtr);
|
||||
*/
|
||||
cPtr->handler.write = WMAddInputHandler(cPtr->sock, WIWriteMask,
|
||||
inputHandler, cPtr);
|
||||
|
||||
setConnectionAddress(cPtr, socketaddr);
|
||||
|
||||
return cPtr;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
removeAllHandlers(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
if (cPtr->handler.read)
|
||||
WMDeleteInputHandler(cPtr->handler.read);
|
||||
if (cPtr->handler.write)
|
||||
WMDeleteInputHandler(cPtr->handler.write);
|
||||
if (cPtr->handler.exception)
|
||||
WMDeleteInputHandler(cPtr->handler.exception);
|
||||
if (cPtr->sendTimeout.handler)
|
||||
WMDeleteTimerHandler(cPtr->sendTimeout.handler);
|
||||
|
||||
cPtr->handler.read = NULL;
|
||||
cPtr->handler.write = NULL;
|
||||
cPtr->handler.exception = NULL;
|
||||
cPtr->sendTimeout.handler = NULL;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMDestroyConnection(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
if (cPtr->closeOnRelease && cPtr->sock>=0) {
|
||||
shutdown(cPtr->sock, SHUT_RDWR);
|
||||
close(cPtr->sock);
|
||||
}
|
||||
|
||||
removeAllHandlers(cPtr);
|
||||
clearOutputQueue(cPtr);
|
||||
WMFreeBag(cPtr->outputQueue);
|
||||
|
||||
if (cPtr->address) {
|
||||
wfree(cPtr->address);
|
||||
wfree(cPtr->service);
|
||||
wfree(cPtr->protocol);
|
||||
}
|
||||
|
||||
wrelease(cPtr);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMCloseConnection(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
if (cPtr->sock>=0) {
|
||||
shutdown(cPtr->sock, SHUT_RDWR);
|
||||
close(cPtr->sock);
|
||||
cPtr->sock = -1;
|
||||
}
|
||||
|
||||
removeAllHandlers(cPtr);
|
||||
clearOutputQueue(cPtr);
|
||||
|
||||
cPtr->state = WCClosed;
|
||||
}
|
||||
|
||||
|
||||
WMConnection*
|
||||
WMAcceptConnection(WMConnection *listener) /*FOLD00*/
|
||||
{
|
||||
struct sockaddr_in clientname;
|
||||
int size;
|
||||
int newSock;
|
||||
WMConnection *newConnection;
|
||||
|
||||
if (listener->state!=WCListening) {
|
||||
wwarning("Called 'WMAcceptConnection()' on a non-listening connection");
|
||||
WCErrorCode = 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size = sizeof(clientname);
|
||||
newSock = accept(listener->sock, (struct sockaddr*) &clientname, &size);
|
||||
if (newSock<0) {
|
||||
if (errno!=EAGAIN && errno!=EWOULDBLOCK) {
|
||||
WCErrorCode = errno;
|
||||
wsyserror("Could not accept connection");
|
||||
} else {
|
||||
WCErrorCode = 0;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
newConnection = createConnectionWithSocket(newSock, True);
|
||||
WMSetConnectionNonBlocking(newConnection, True);
|
||||
newConnection->state = WCConnected;
|
||||
setConnectionAddress(newConnection, &clientname);
|
||||
|
||||
return newConnection;
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
WMGetConnectionAddress(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
return cPtr->address;
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
WMGetConnectionService(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
return cPtr->service;
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
WMGetConnectionProtocol(WMConnection *cPtr)
|
||||
{
|
||||
return cPtr->protocol;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
WMGetConnectionSocket(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
return cPtr->sock;
|
||||
}
|
||||
|
||||
|
||||
WMConnectionState
|
||||
WMGetConnectionState(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
return cPtr->state;
|
||||
}
|
||||
|
||||
|
||||
Bool
|
||||
WMEnqueueConnectionData(WMConnection *cPtr, WMData *data) /*FOLD00*/
|
||||
{
|
||||
wassertrv(cPtr->state!=WCNotConnected && cPtr->state!=WCListening, False);
|
||||
wassertrv(cPtr->state!=WCInProgress && cPtr->state!=WCFailed, False);
|
||||
|
||||
if (cPtr->state!=WCConnected)
|
||||
return False;
|
||||
|
||||
WMPutInBag(cPtr->outputQueue, WMRetainData(data));
|
||||
return True;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
WMSendConnectionData(WMConnection *cPtr, WMData *data) /*FOLD00*/
|
||||
{
|
||||
int bytes, pos, len, totalTransfer;
|
||||
TimeoutData *tPtr = &cPtr->sendTimeout;
|
||||
const unsigned char *dataBytes;
|
||||
|
||||
wassertrv(cPtr->state!=WCNotConnected && cPtr->state!=WCListening, -1);
|
||||
wassertrv(cPtr->state!=WCInProgress && cPtr->state!=WCFailed, -1);
|
||||
|
||||
if (cPtr->state!=WCConnected)
|
||||
return -1;
|
||||
|
||||
/* If we have no data just flush the queue, else try to send data */
|
||||
if (data && WMGetDataLength(data)>0) {
|
||||
WMPutInBag(cPtr->outputQueue, WMRetainData(data));
|
||||
/* If there already was something in queue, and also a write input
|
||||
* handler is established, it means we were unable to send, so
|
||||
* return and let the write handler notify us when we can send.
|
||||
*/
|
||||
if (WMGetBagItemCount(cPtr->outputQueue)>1 && cPtr->handler.write)
|
||||
return 0;
|
||||
}
|
||||
|
||||
totalTransfer = 0;
|
||||
|
||||
while (WMGetBagItemCount(cPtr->outputQueue) > 0) {
|
||||
data = WMGetFromBag(cPtr->outputQueue, 0);
|
||||
dataBytes = (const unsigned char *)WMDataBytes(data);
|
||||
len = WMGetDataLength(data);
|
||||
pos = cPtr->bufPos; /* where we're left last time */
|
||||
while(pos < len) {
|
||||
again:
|
||||
bytes = write(cPtr->sock, dataBytes+pos, len - pos);
|
||||
if(bytes<0) {
|
||||
switch (errno) {
|
||||
case EINTR:
|
||||
goto again;
|
||||
case EWOULDBLOCK:
|
||||
/* save the position where we're left and add a timeout */
|
||||
cPtr->bufPos = pos;
|
||||
if (!tPtr->handler) {
|
||||
tPtr->handler = WMAddTimerHandler(tPtr->timeout*1000,
|
||||
sendTimeout, cPtr);
|
||||
}
|
||||
if (!cPtr->handler.write) {
|
||||
cPtr->handler.write =
|
||||
WMAddInputHandler(cPtr->sock, WIWriteMask,
|
||||
inputHandler, cPtr);
|
||||
}
|
||||
return totalTransfer;
|
||||
default:
|
||||
WCErrorCode = errno;
|
||||
cPtr->state = WCDied;
|
||||
/*clearOutputQueue(cPtr);*/
|
||||
removeAllHandlers(cPtr);
|
||||
if (cPtr->delegate && cPtr->delegate->didDie)
|
||||
(*cPtr->delegate->didDie)(cPtr->delegate, cPtr);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
pos += bytes;
|
||||
totalTransfer += bytes;
|
||||
}
|
||||
WMReleaseData(data);
|
||||
WMDeleteFromBag(cPtr->outputQueue, 0);
|
||||
cPtr->bufPos = 0;
|
||||
if (tPtr->handler) {
|
||||
WMDeleteTimerHandler(tPtr->handler);
|
||||
tPtr->handler = NULL;
|
||||
}
|
||||
if (cPtr->handler.write) {
|
||||
WMDeleteInputHandler(cPtr->handler.write);
|
||||
cPtr->handler.write = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return totalTransfer;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* WMGetConnectionAvailableData(connection):
|
||||
*
|
||||
* will return a WMData structure containing the available data on the
|
||||
* specified connection. If connection is non-blocking (default) and no data
|
||||
* is available when this function is called, an empty WMData is returned.
|
||||
*
|
||||
* If an error occurs while reading or the other side closed connection,
|
||||
* it will return NULL.
|
||||
* Also trying to read from an already died or closed connection is
|
||||
* considered to be an error condition, and will return NULL.
|
||||
*/
|
||||
WMData*
|
||||
WMGetConnectionAvailableData(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
char buffer[NETBUF_SIZE];
|
||||
int nbytes;
|
||||
WMData *aData;
|
||||
|
||||
wassertrv(cPtr->state!=WCNotConnected && cPtr->state!=WCListening, NULL);
|
||||
wassertrv(cPtr->state!=WCInProgress && cPtr->state!=WCFailed, NULL);
|
||||
|
||||
if (cPtr->state!=WCConnected)
|
||||
return NULL;
|
||||
|
||||
aData = NULL;
|
||||
|
||||
again:
|
||||
nbytes = read(cPtr->sock, buffer, NETBUF_SIZE);
|
||||
if (nbytes<0) {
|
||||
switch (errno) {
|
||||
case EINTR:
|
||||
goto again;
|
||||
case EWOULDBLOCK:
|
||||
aData = WMCreateDataWithCapacity(0);
|
||||
break;
|
||||
default:
|
||||
WCErrorCode = errno;
|
||||
cPtr->state = WCDied;
|
||||
removeAllHandlers(cPtr);
|
||||
if (cPtr->delegate && cPtr->delegate->didDie)
|
||||
(*cPtr->delegate->didDie)(cPtr->delegate, cPtr);
|
||||
break;
|
||||
}
|
||||
} else if (nbytes==0) { /* the other side has closed connection */
|
||||
cPtr->state = WCClosed;
|
||||
removeAllHandlers(cPtr);
|
||||
if (cPtr->delegate && cPtr->delegate->didDie)
|
||||
(*cPtr->delegate->didDie)(cPtr->delegate, cPtr);
|
||||
} else {
|
||||
aData = WMCreateDataWithBytes(buffer, nbytes);
|
||||
}
|
||||
|
||||
return aData;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMSetConnectionDelegate(WMConnection *cPtr, ConnectionDelegate *delegate) /*FOLD00*/
|
||||
{
|
||||
wassertr(cPtr->sock >= 0);
|
||||
/* Don't try to set the delegate multiple times */
|
||||
wassertr(cPtr->delegate == NULL);
|
||||
|
||||
cPtr->delegate = delegate;
|
||||
if (delegate && delegate->didReceiveInput && !cPtr->handler.read)
|
||||
cPtr->handler.read = WMAddInputHandler(cPtr->sock, WIReadMask,
|
||||
inputHandler, cPtr);
|
||||
if (delegate && delegate->didCatchException && !cPtr->handler.exception)
|
||||
cPtr->handler.exception = WMAddInputHandler(cPtr->sock, WIExceptMask,
|
||||
inputHandler, cPtr);
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
Bool
|
||||
WMIsConnectionNonBlocking(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
#if 1
|
||||
int state;
|
||||
|
||||
state = fcntl(cPtr->sock, F_GETFL, 0);
|
||||
|
||||
if (state < 0) {
|
||||
wsyserror("Failed to get socket flags with fcntl.");
|
||||
/* If we can't use fcntl on socket, this probably also means we could
|
||||
* not use fcntl to set non-blocking mode, and since a socket defaults
|
||||
* to blocking when created, return False as the best assumption */
|
||||
return False;
|
||||
}
|
||||
|
||||
return ((state & NONBLOCK_OPT)!=0);
|
||||
#else
|
||||
return cPtr->isNonBlocking;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
WMSetConnectionNonBlocking(WMConnection *cPtr, Bool flag) /*FOLD00*/
|
||||
{
|
||||
if (cPtr->sock < 0)
|
||||
return;
|
||||
|
||||
if (cPtr->isNonBlocking == flag)
|
||||
return;
|
||||
|
||||
if (setSocketNonBlocking(cPtr->sock, flag)==True)
|
||||
cPtr->isNonBlocking = flag;
|
||||
}
|
||||
|
||||
|
||||
void*
|
||||
WMGetConnectionClientData(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
return cPtr->clientData;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMSetConnectionClientData(WMConnection *cPtr, void *data) /*FOLD00*/
|
||||
{
|
||||
cPtr->clientData = data;
|
||||
}
|
||||
|
||||
|
||||
unsigned int
|
||||
WMGetConnectionFlags(WMConnection *cPtr) /*FOLD00*/
|
||||
{
|
||||
return cPtr->uflags;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMSetConnectionFlags(WMConnection *cPtr, unsigned int flags) /*FOLD00*/
|
||||
{
|
||||
cPtr->uflags = flags;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMSetConnectionSendTimeout(WMConnection *cPtr, unsigned int timeout) /*FOLD00*/
|
||||
{
|
||||
if (timeout == 0)
|
||||
timeout = DEF_TIMEOUT;
|
||||
|
||||
cPtr->sendTimeout.timeout = timeout;
|
||||
}
|
||||
|
||||
|
||||
171
WINGs/data.c
171
WINGs/data.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* WINGs WMData function library
|
||||
*
|
||||
* Copyright (c) 1999 Dan Pascu
|
||||
* Copyright (c) 1999-2003 Dan Pascu
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -18,28 +18,22 @@
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <string.h>
|
||||
#include "WUtil.h"
|
||||
|
||||
|
||||
typedef struct W_Data {
|
||||
unsigned length; /* How many bytes we have */
|
||||
unsigned capacity; /* How many bytes it can hold */
|
||||
unsigned growth; /* How much to grow */
|
||||
void *bytes; /* Actual data */
|
||||
unsigned retainCount;
|
||||
unsigned freeData:1; /* whether the data should be released */
|
||||
WMFreeDataProc *destructor;
|
||||
int format; /* 0, 8, 16 or 32 */
|
||||
} W_Data;
|
||||
|
||||
|
||||
|
||||
|
||||
/* Creating and destroying data objects */
|
||||
|
||||
WMData*
|
||||
WMCreateDataWithCapacity(unsigned capacity) /*FOLD00*/
|
||||
WMData *WMCreateDataWithCapacity(unsigned capacity)
|
||||
{
|
||||
WMData *aData;
|
||||
|
||||
@@ -49,18 +43,18 @@ WMCreateDataWithCapacity(unsigned capacity) /*FOLD00*/
|
||||
aData->bytes = wmalloc(capacity);
|
||||
else
|
||||
aData->bytes = NULL;
|
||||
|
||||
aData->capacity = capacity;
|
||||
aData->growth = capacity / 2 > 0 ? capacity / 2 : 1;
|
||||
aData->length = 0;
|
||||
aData->retainCount = 1;
|
||||
aData->freeData = 1;
|
||||
aData->format = 0;
|
||||
aData->destructor = wfree;
|
||||
|
||||
return aData;
|
||||
}
|
||||
|
||||
|
||||
WMData*
|
||||
WMCreateDataWithLength(unsigned length) /*FOLD00*/
|
||||
WMData *WMCreateDataWithLength(unsigned length)
|
||||
{
|
||||
WMData *aData;
|
||||
|
||||
@@ -73,9 +67,7 @@ WMCreateDataWithLength(unsigned length) /*FOLD00*/
|
||||
return aData;
|
||||
}
|
||||
|
||||
|
||||
WMData*
|
||||
WMCreateDataWithBytes(void *bytes, unsigned length) /*FOLD00*/
|
||||
WMData *WMCreateDataWithBytes(void *bytes, unsigned length)
|
||||
{
|
||||
WMData *aData;
|
||||
|
||||
@@ -86,9 +78,7 @@ WMCreateDataWithBytes(void *bytes, unsigned length) /*FOLD00*/
|
||||
return aData;
|
||||
}
|
||||
|
||||
|
||||
WMData*
|
||||
WMCreateDataWithBytesNoCopy(void *bytes, unsigned length) /*FOLD00*/
|
||||
WMData *WMCreateDataWithBytesNoCopy(void *bytes, unsigned length, WMFreeDataProc * destructor)
|
||||
{
|
||||
WMData *aData;
|
||||
|
||||
@@ -98,47 +88,46 @@ WMCreateDataWithBytesNoCopy(void *bytes, unsigned length) /*FOLD00*/
|
||||
aData->growth = length / 2 > 0 ? length / 2 : 1;
|
||||
aData->bytes = bytes;
|
||||
aData->retainCount = 1;
|
||||
aData->freeData = 0;
|
||||
aData->format = 0;
|
||||
aData->destructor = destructor;
|
||||
|
||||
return aData;
|
||||
}
|
||||
|
||||
|
||||
WMData*
|
||||
WMCreateDataWithData(WMData *aData) /*FOLD00*/
|
||||
WMData *WMCreateDataWithData(WMData * aData)
|
||||
{
|
||||
if (aData->length > 0)
|
||||
return WMCreateDataWithBytes(aData->bytes, aData->length);
|
||||
else
|
||||
return WMCreateDataWithCapacity(0);
|
||||
WMData *newData;
|
||||
|
||||
if (aData->length > 0) {
|
||||
newData = WMCreateDataWithBytes(aData->bytes, aData->length);
|
||||
} else {
|
||||
newData = WMCreateDataWithCapacity(0);
|
||||
}
|
||||
newData->format = aData->format;
|
||||
|
||||
return newData;
|
||||
}
|
||||
|
||||
|
||||
WMData*
|
||||
WMRetainData(WMData *aData) /*FOLD00*/
|
||||
WMData *WMRetainData(WMData * aData)
|
||||
{
|
||||
aData->retainCount++;
|
||||
return aData;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMReleaseData(WMData *aData) /*FOLD00*/
|
||||
void WMReleaseData(WMData * aData)
|
||||
{
|
||||
aData->retainCount--;
|
||||
if (aData->retainCount > 0)
|
||||
return;
|
||||
if (aData->bytes && aData->freeData)
|
||||
wfree(aData->bytes);
|
||||
if (aData->bytes != NULL && aData->destructor != NULL) {
|
||||
aData->destructor(aData->bytes);
|
||||
}
|
||||
wfree(aData);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Adjusting capacity */
|
||||
|
||||
void
|
||||
WMSetDataCapacity(WMData *aData, unsigned capacity) /*FOLD00*/
|
||||
void WMSetDataCapacity(WMData * aData, unsigned capacity)
|
||||
{
|
||||
if (aData->capacity != capacity) {
|
||||
aData->bytes = wrealloc(aData->bytes, capacity);
|
||||
@@ -150,49 +139,47 @@ WMSetDataCapacity(WMData *aData, unsigned capacity) /*FOLD00*/
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMSetDataLength(WMData *aData, unsigned length) /*FOLD00*/
|
||||
void WMSetDataLength(WMData * aData, unsigned length)
|
||||
{
|
||||
if (length > aData->capacity) {
|
||||
WMSetDataCapacity(aData, length);
|
||||
}
|
||||
if (length > aData->length) {
|
||||
unsigned char *dataBytes = (unsigned char *)aData->bytes;
|
||||
|
||||
memset(dataBytes + aData->length, 0, length - aData->length);
|
||||
memset((unsigned char *)aData->bytes + aData->length, 0, length - aData->length);
|
||||
}
|
||||
aData->length = length;
|
||||
}
|
||||
|
||||
void WMSetDataFormat(WMData * aData, unsigned format)
|
||||
{
|
||||
aData->format = format;
|
||||
}
|
||||
|
||||
void
|
||||
WMIncreaseDataLengthBy(WMData *aData, unsigned extraLength) /*FOLD00*/
|
||||
void WMIncreaseDataLengthBy(WMData * aData, unsigned extraLength)
|
||||
{
|
||||
WMSetDataLength(aData, aData->length + extraLength);
|
||||
}
|
||||
|
||||
|
||||
/* Accessing data */
|
||||
|
||||
const void*
|
||||
WMDataBytes(WMData *aData) /*FOLD00*/
|
||||
const void *WMDataBytes(WMData * aData)
|
||||
{
|
||||
return aData->bytes;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMGetDataBytes(WMData *aData, void *buffer) /*FOLD00*/
|
||||
void WMGetDataBytes(WMData * aData, void *buffer)
|
||||
{
|
||||
wassertr(aData->length > 0);
|
||||
|
||||
memcpy(buffer, aData->bytes, aData->length);
|
||||
}
|
||||
|
||||
unsigned WMGetDataFormat(WMData * aData)
|
||||
{
|
||||
return aData->format;
|
||||
}
|
||||
|
||||
void
|
||||
WMGetDataBytesWithLength(WMData *aData, void *buffer, unsigned length) /*FOLD00*/
|
||||
void WMGetDataBytesWithLength(WMData * aData, void *buffer, unsigned length)
|
||||
{
|
||||
wassertr(aData->length > 0);
|
||||
wassertr(length <= aData->length);
|
||||
@@ -200,37 +187,33 @@ WMGetDataBytesWithLength(WMData *aData, void *buffer, unsigned length) /*FOLD00*
|
||||
memcpy(buffer, aData->bytes, length);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMGetDataBytesWithRange(WMData *aData, void *buffer, WMRange aRange) /*FOLD00*/
|
||||
void WMGetDataBytesWithRange(WMData * aData, void *buffer, WMRange aRange)
|
||||
{
|
||||
unsigned char *dataBytes = (unsigned char *)aData->bytes;
|
||||
|
||||
wassertr(aRange.position < aData->length);
|
||||
wassertr(aRange.count <= aData->length - aRange.position);
|
||||
|
||||
memcpy(buffer,dataBytes + aRange.position, aRange.count);
|
||||
memcpy(buffer, (unsigned char *)aData->bytes + aRange.position, aRange.count);
|
||||
}
|
||||
|
||||
|
||||
WMData*
|
||||
WMGetSubdataWithRange(WMData *aData, WMRange aRange) /*FOLD00*/
|
||||
WMData *WMGetSubdataWithRange(WMData * aData, WMRange aRange)
|
||||
{
|
||||
void *buffer;
|
||||
WMData *newData;
|
||||
|
||||
/* return an empty subdata instead if aRange.count is 0 ? */
|
||||
wassertrv(aRange.count > 0, NULL);
|
||||
if (aRange.count <= 0)
|
||||
return WMCreateDataWithCapacity(0);
|
||||
|
||||
buffer = wmalloc(aRange.count);
|
||||
WMGetDataBytesWithRange(aData, buffer, aRange);
|
||||
return WMCreateDataWithBytesNoCopy(buffer, aRange.count);
|
||||
}
|
||||
newData = WMCreateDataWithBytesNoCopy(buffer, aRange.count, wfree);
|
||||
newData->format = aData->format;
|
||||
|
||||
return newData;
|
||||
}
|
||||
|
||||
/* Testing data */
|
||||
|
||||
Bool
|
||||
WMIsDataEqualToData(WMData *aData, WMData *anotherData) /*FOLD00*/
|
||||
Bool WMIsDataEqualToData(WMData * aData, WMData * anotherData)
|
||||
{
|
||||
if (aData->length != anotherData->length)
|
||||
return False;
|
||||
@@ -241,28 +224,16 @@ WMIsDataEqualToData(WMData *aData, WMData *anotherData) /*FOLD00*/
|
||||
return (memcmp(aData->bytes, anotherData->bytes, aData->length) == 0);
|
||||
}
|
||||
|
||||
|
||||
unsigned
|
||||
WMGetDataLength(WMData *aData) /*FOLD00*/
|
||||
unsigned WMGetDataLength(WMData * aData)
|
||||
{
|
||||
return aData->length;
|
||||
}
|
||||
|
||||
|
||||
unsigned
|
||||
WMGetDataHash(WMData *aData) /*FOLD00*/
|
||||
{
|
||||
return aData->length;
|
||||
}
|
||||
|
||||
|
||||
/* Adding data */
|
||||
void
|
||||
WMAppendDataBytes(WMData *aData, void *bytes, unsigned length) /*FOLD00*/
|
||||
void WMAppendDataBytes(WMData * aData, void *bytes, unsigned length)
|
||||
{
|
||||
unsigned oldLength = aData->length;
|
||||
unsigned newLength = oldLength + length;
|
||||
unsigned char *dataBytes = (unsigned char *)aData->bytes;
|
||||
|
||||
if (newLength > aData->capacity) {
|
||||
unsigned nextCapacity = aData->capacity + aData->growth;
|
||||
@@ -277,48 +248,35 @@ WMAppendDataBytes(WMData *aData, void *bytes, unsigned length) /*FOLD00*/
|
||||
WMSetDataCapacity(aData, nextCapacity);
|
||||
aData->growth = nextGrowth;
|
||||
}
|
||||
memcpy(dataBytes + oldLength, bytes, length);
|
||||
memcpy((unsigned char *)aData->bytes + oldLength, bytes, length);
|
||||
aData->length = newLength;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMAppendData(WMData *aData, WMData *anotherData) /*FOLD00*/
|
||||
void WMAppendData(WMData * aData, WMData * anotherData)
|
||||
{
|
||||
if (anotherData->length > 0)
|
||||
WMAppendDataBytes(aData, anotherData->bytes, anotherData->length);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Modifying data */
|
||||
|
||||
void
|
||||
WMReplaceDataBytesInRange(WMData *aData, WMRange aRange, void *bytes) /*FOLD00*/
|
||||
void WMReplaceDataBytesInRange(WMData * aData, WMRange aRange, void *bytes)
|
||||
{
|
||||
unsigned char *dataBytes = (unsigned char *)aData->bytes;
|
||||
|
||||
wassertr(aRange.position < aData->length);
|
||||
wassertr(aRange.count <= aData->length - aRange.position);
|
||||
|
||||
memcpy(dataBytes + aRange.position, bytes, aRange.count);
|
||||
memcpy((unsigned char *)aData->bytes + aRange.position, bytes, aRange.count);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMResetDataBytesInRange(WMData *aData, WMRange aRange) /*FOLD00*/
|
||||
void WMResetDataBytesInRange(WMData * aData, WMRange aRange)
|
||||
{
|
||||
unsigned char *dataBytes = (unsigned char *)aData->bytes;
|
||||
|
||||
wassertr(aRange.position < aData->length);
|
||||
wassertr(aRange.count <= aData->length - aRange.position);
|
||||
|
||||
memset(dataBytes + aRange.position, 0, aRange.count);
|
||||
memset((unsigned char *)aData->bytes + aRange.position, 0, aRange.count);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMSetData(WMData *aData, WMData *anotherData) /*FOLD00*/
|
||||
void WMSetData(WMData * aData, WMData * anotherData)
|
||||
{
|
||||
unsigned length = anotherData->length;
|
||||
|
||||
@@ -328,7 +286,4 @@ WMSetData(WMData *aData, WMData *anotherData) /*FOLD00*/
|
||||
aData->length = length;
|
||||
}
|
||||
|
||||
|
||||
/* Storing data */
|
||||
|
||||
|
||||
|
||||
255
WINGs/dragcommon.c
Normal file
255
WINGs/dragcommon.c
Normal file
@@ -0,0 +1,255 @@
|
||||
|
||||
#include "WINGsP.h"
|
||||
|
||||
#define XDND_SOURCE_VERSION(dragInfo) dragInfo->protocolVersion
|
||||
#define XDND_DEST_INFO(dragInfo) dragInfo->destInfo
|
||||
#define XDND_DEST_VIEW(dragInfo) dragInfo->destInfo->destView
|
||||
|
||||
static Bool _WindowExists;
|
||||
|
||||
Atom W_OperationToAction(WMScreen * scr, WMDragOperationType operation)
|
||||
{
|
||||
switch (operation) {
|
||||
case WDOperationNone:
|
||||
return None;
|
||||
|
||||
case WDOperationCopy:
|
||||
return scr->xdndActionCopy;
|
||||
|
||||
case WDOperationMove:
|
||||
return scr->xdndActionMove;
|
||||
|
||||
case WDOperationLink:
|
||||
return scr->xdndActionLink;
|
||||
|
||||
case WDOperationAsk:
|
||||
return scr->xdndActionAsk;
|
||||
|
||||
case WDOperationPrivate:
|
||||
return scr->xdndActionPrivate;
|
||||
|
||||
default:
|
||||
return None;
|
||||
}
|
||||
}
|
||||
|
||||
WMDragOperationType W_ActionToOperation(WMScreen * scr, Atom action)
|
||||
{
|
||||
if (action == scr->xdndActionCopy) {
|
||||
return WDOperationCopy;
|
||||
|
||||
} else if (action == scr->xdndActionMove) {
|
||||
return WDOperationMove;
|
||||
|
||||
} else if (action == scr->xdndActionLink) {
|
||||
return WDOperationLink;
|
||||
|
||||
} else if (action == scr->xdndActionAsk) {
|
||||
return WDOperationAsk;
|
||||
|
||||
} else if (action == scr->xdndActionPrivate) {
|
||||
return WDOperationPrivate;
|
||||
|
||||
} else if (action == None) {
|
||||
|
||||
return WDOperationNone;
|
||||
} else {
|
||||
char *tmp = XGetAtomName(scr->display, action);
|
||||
|
||||
wwarning("unknown XDND action %s ", tmp);
|
||||
XFree(tmp);
|
||||
|
||||
return WDOperationCopy;
|
||||
}
|
||||
}
|
||||
|
||||
static void freeDragOperationItem(void *item)
|
||||
{
|
||||
wfree(item);
|
||||
}
|
||||
|
||||
WMArray *WMCreateDragOperationArray(int initialSize)
|
||||
{
|
||||
return WMCreateArrayWithDestructor(initialSize, freeDragOperationItem);
|
||||
}
|
||||
|
||||
WMDragOperationItem *WMCreateDragOperationItem(WMDragOperationType type, char *text)
|
||||
{
|
||||
W_DragOperationItem *result = wmalloc(sizeof(W_DragOperationItem));
|
||||
|
||||
result->type = type;
|
||||
result->text = text;
|
||||
|
||||
return (WMDragOperationItem *) result;
|
||||
}
|
||||
|
||||
WMDragOperationType WMGetDragOperationItemType(WMDragOperationItem * item)
|
||||
{
|
||||
return ((W_DragOperationItem *) item)->type;
|
||||
}
|
||||
|
||||
char *WMGetDragOperationItemText(WMDragOperationItem * item)
|
||||
{
|
||||
return ((W_DragOperationItem *) item)->text;
|
||||
}
|
||||
|
||||
static int handleNoWindowXError(Display * dpy, XErrorEvent * errEvt)
|
||||
{
|
||||
if (errEvt->error_code == BadWindow || errEvt->error_code == BadDrawable) {
|
||||
_WindowExists = False;
|
||||
return Success;
|
||||
}
|
||||
|
||||
return errEvt->error_code;
|
||||
}
|
||||
|
||||
static Bool windowExists(Display * dpy, Window win)
|
||||
{
|
||||
void *previousErrorHandler;
|
||||
XWindowAttributes attr;
|
||||
|
||||
XSynchronize(dpy, True);
|
||||
previousErrorHandler = XSetErrorHandler(handleNoWindowXError);
|
||||
_WindowExists = True;
|
||||
|
||||
/* can generate BadDrawable or BadWindow */
|
||||
XGetWindowAttributes(dpy, win, &attr);
|
||||
|
||||
XSetErrorHandler(previousErrorHandler);
|
||||
XSynchronize(dpy, False);
|
||||
return _WindowExists;
|
||||
}
|
||||
|
||||
Bool
|
||||
W_SendDnDClientMessage(Display * dpy, Window win, Atom message,
|
||||
unsigned long data0,
|
||||
unsigned long data1, unsigned long data2, unsigned long data3, unsigned long data4)
|
||||
{
|
||||
XEvent ev;
|
||||
|
||||
#ifdef XDND_DEBUG
|
||||
char *msgName = XGetAtomName(dpy, message);
|
||||
|
||||
printf("sending message %s ... ", msgName);
|
||||
XFree(msgName);
|
||||
#endif
|
||||
|
||||
if (!windowExists(dpy, win)) {
|
||||
wwarning("xdnd message target %lu does no longer exist.", win);
|
||||
return False; /* message not sent */
|
||||
}
|
||||
|
||||
ev.type = ClientMessage;
|
||||
ev.xclient.message_type = message;
|
||||
ev.xclient.format = 32;
|
||||
ev.xclient.window = win;
|
||||
ev.xclient.data.l[0] = data0;
|
||||
ev.xclient.data.l[1] = data1;
|
||||
ev.xclient.data.l[2] = data2;
|
||||
ev.xclient.data.l[3] = data3;
|
||||
ev.xclient.data.l[4] = data4;
|
||||
|
||||
XSendEvent(dpy, win, False, 0, &ev);
|
||||
XFlush(dpy);
|
||||
|
||||
#ifdef XDND_DEBUG
|
||||
printf("sent\n");
|
||||
#endif
|
||||
return True; /* message sent */
|
||||
}
|
||||
|
||||
static void handleLeaveMessage(WMDraggingInfo * info)
|
||||
{
|
||||
if (XDND_DEST_INFO(info) != NULL) {
|
||||
/* XDND_DEST_VIEW is never NULL (it's the xdnd aware view) */
|
||||
wassertr(XDND_DEST_VIEW(info) != NULL);
|
||||
if (XDND_DEST_VIEW(info)->dragDestinationProcs != NULL) {
|
||||
XDND_DEST_VIEW(info)->dragDestinationProcs->concludeDragOperation(XDND_DEST_VIEW(info));
|
||||
}
|
||||
W_DragDestinationInfoClear(info);
|
||||
}
|
||||
}
|
||||
|
||||
void W_HandleDNDClientMessage(WMView * toplevel, XClientMessageEvent * event)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(toplevel);
|
||||
WMDraggingInfo *info = &scr->dragInfo;
|
||||
Atom messageType = event->message_type;
|
||||
|
||||
#ifdef XDND_DEBUG
|
||||
{
|
||||
char *msgTypeName = XGetAtomName(scr->display, messageType);
|
||||
|
||||
if (msgTypeName != NULL)
|
||||
printf("event type = %s\n", msgTypeName);
|
||||
else
|
||||
printf("pb with event type !\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Messages from destination to source */
|
||||
if (messageType == scr->xdndStatusAtom || messageType == scr->xdndFinishedAtom) {
|
||||
W_DragSourceStopTimer();
|
||||
W_DragSourceStateHandler(info, event);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Messages from source to destination */
|
||||
if (messageType == scr->xdndEnterAtom) {
|
||||
Bool positionSent = (XDND_DEST_INFO(info) != NULL);
|
||||
|
||||
W_DragDestinationStopTimer();
|
||||
W_DragDestinationStoreEnterMsgInfo(info, toplevel, event);
|
||||
|
||||
/* Xdnd version 3 and up are not compatible with version 1 or 2 */
|
||||
if (XDND_SOURCE_VERSION(info) > 2) {
|
||||
|
||||
if (positionSent) {
|
||||
/* xdndPosition previously received on xdnd aware view */
|
||||
W_DragDestinationStateHandler(info, event);
|
||||
return;
|
||||
} else {
|
||||
W_DragDestinationStartTimer(info);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
wwarning("received dnd enter msg with unsupported version %i", XDND_SOURCE_VERSION(info));
|
||||
W_DragDestinationCancelDropOnEnter(toplevel, info);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (messageType == scr->xdndPositionAtom) {
|
||||
W_DragDestinationStopTimer();
|
||||
W_DragDestinationStorePositionMsgInfo(info, toplevel, event);
|
||||
W_DragDestinationStateHandler(info, event);
|
||||
return;
|
||||
}
|
||||
|
||||
if (messageType == scr->xdndSelectionAtom || messageType == scr->xdndDropAtom) {
|
||||
W_DragDestinationStopTimer();
|
||||
W_DragDestinationStateHandler(info, event);
|
||||
return;
|
||||
}
|
||||
|
||||
if (messageType == scr->xdndLeaveAtom) {
|
||||
/* conclude drop operation, and clear dragging info */
|
||||
W_DragDestinationStopTimer();
|
||||
handleLeaveMessage(info);
|
||||
}
|
||||
}
|
||||
|
||||
/* called in destroyView (wview.c) */
|
||||
void W_FreeViewXdndPart(WMView * view)
|
||||
{
|
||||
WMUnregisterViewDraggedTypes(view);
|
||||
|
||||
if (view->dragSourceProcs)
|
||||
wfree(view->dragSourceProcs);
|
||||
|
||||
if (view->dragDestinationProcs)
|
||||
wfree(view->dragDestinationProcs);
|
||||
|
||||
if (view->dragImage)
|
||||
WMReleasePixmap(view->dragImage);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
1870
WINGs/dragsource.c
1870
WINGs/dragsource.c
File diff suppressed because it is too large
Load Diff
191
WINGs/error.c
191
WINGs/error.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Window Maker miscelaneous function library
|
||||
*
|
||||
* Copyright (c) 1997 Alfredo K. Kojima
|
||||
* Copyright (c) 1997-2003 Alfredo K. Kojima
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -18,158 +18,79 @@
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "wconfig.h"
|
||||
|
||||
#include "../src/config.h"
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <WUtil.h>
|
||||
|
||||
extern char *_WINGS_progname;
|
||||
|
||||
|
||||
#define MAXLINE 1024
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* Returns the system error message associated with error code 'errnum'
|
||||
*********************************************************************/
|
||||
char*
|
||||
wstrerror(int errnum)
|
||||
{
|
||||
#if defined(HAVE_STRERROR)
|
||||
return strerror(errnum);
|
||||
#elif !defined(HAVE_STRERROR) && defined(BSD)
|
||||
extern int errno, sys_nerr;
|
||||
# ifndef __DECC
|
||||
extern char *sys_errlist[];
|
||||
# endif
|
||||
static char buf[] = "Unknown error 12345678901234567890";
|
||||
|
||||
if (errno < sys_nerr)
|
||||
return sys_errlist[errnum];
|
||||
|
||||
sprintf (buf, "Unknown error %d", errnum);
|
||||
return buf;
|
||||
#else /* no strerror() and no sys_errlist[] */
|
||||
static char buf[] = "Error 12345678901234567890";
|
||||
|
||||
sprintf(buf, "Error %d", errnum);
|
||||
return buf;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Prints a fatal error message with variable arguments and terminates
|
||||
*
|
||||
* msg - message to print with optional formatting
|
||||
* ... - arguments to use on formatting
|
||||
**************************************************************************/
|
||||
void
|
||||
wfatal(const char *msg, ...)
|
||||
void __wmessage(const char *func, const char *file, int line, int type, const char *msg, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
char *buf;
|
||||
static int linemax = 0;
|
||||
int truncated = 0;
|
||||
|
||||
va_start(args, msg);
|
||||
|
||||
vsprintf(buf, msg, args);
|
||||
strcat(buf,"\n");
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname, stderr);
|
||||
fputs(" fatal error: ",stderr);
|
||||
fputs(buf, stderr);
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
va_end(args);
|
||||
if (linemax == 0) {
|
||||
#ifdef HAVE_SYSCONF
|
||||
linemax = sysconf(_SC_LINE_MAX);
|
||||
if (linemax == -1) {
|
||||
/* I'd like to know of this ever fires */
|
||||
fprintf(stderr, "%s %d: sysconf(_SC_LINE_MAX) returned error\n",
|
||||
__FILE__, __LINE__);
|
||||
linemax = 512;
|
||||
}
|
||||
#else /* !HAVE_SYSCONF */
|
||||
fprintf(stderr, "%s %d: Your system does not have sysconf(3); "
|
||||
"let wmaker-dev@windowmaker.org know.\n", __FILE__, __LINE__);
|
||||
linemax = 512;
|
||||
#endif /* HAVE_SYSCONF */
|
||||
}
|
||||
|
||||
buf = wmalloc(linemax);
|
||||
|
||||
/*********************************************************************
|
||||
* Prints a warning message with variable arguments
|
||||
*
|
||||
* msg - message to print with optional formatting
|
||||
* ... - arguments to use on formatting
|
||||
*********************************************************************/
|
||||
void
|
||||
wwarning(const char *msg, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
|
||||
va_start(args, msg);
|
||||
|
||||
vsprintf(buf, msg, args);
|
||||
strcat(buf,"\n");
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname, stderr);
|
||||
fputs(" warning: ",stderr);
|
||||
fputs(buf, stderr);
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
va_end(args);
|
||||
/* message format: <wings_progname>(function(file:line): <type?>: <message>"\n" */
|
||||
strncat(buf, _WINGS_progname ? _WINGS_progname : "WINGs", linemax - 1);
|
||||
snprintf(buf + strlen(buf), linemax - strlen(buf), "(%s(%s:%d))", func, file, line);
|
||||
strncat(buf, ": ", linemax - 1 - strlen(buf));
|
||||
|
||||
switch (type) {
|
||||
case WMESSAGE_TYPE_FATAL:
|
||||
strncat(buf, _("fatal error: "), linemax - 1 - strlen(buf));
|
||||
break;
|
||||
case WMESSAGE_TYPE_ERROR:
|
||||
strncat(buf, _("error: "), linemax - 1 - strlen(buf));
|
||||
break;
|
||||
case WMESSAGE_TYPE_WARNING:
|
||||
strncat(buf, _("warning: "), linemax - 1 - strlen(buf));
|
||||
break;
|
||||
case WMESSAGE_TYPE_MESSAGE:
|
||||
/* FALLTHROUGH */
|
||||
default: /* should not happen, but doesn't hurt either */
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* Prints a system error message with variable arguments
|
||||
*
|
||||
* msg - message to print with optional formatting
|
||||
* ... - arguments to use on formatting
|
||||
*********************************************************************/
|
||||
void
|
||||
wsyserror(const char *msg, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
int error=errno;
|
||||
|
||||
va_start(args, msg);
|
||||
vsprintf(buf, msg, args);
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname, stderr);
|
||||
fputs(" error: ", stderr);
|
||||
strcat(buf, ": ");
|
||||
strcat(buf, wstrerror(error));
|
||||
strcat(buf,"\n");
|
||||
fputs(buf, stderr);
|
||||
fflush(stderr);
|
||||
fflush(stdout);
|
||||
if (vsnprintf(buf + strlen(buf), linemax - strlen(buf), msg, args) >= linemax - strlen(buf))
|
||||
truncated = 1;
|
||||
|
||||
va_end(args);
|
||||
|
||||
fputs(buf, stderr);
|
||||
|
||||
if (truncated)
|
||||
fputs("*** message truncated ***", stderr);
|
||||
|
||||
fputs("\n", stderr);
|
||||
|
||||
wfree(buf);
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* Prints a system error message with variable arguments, being given
|
||||
* the error code.
|
||||
*
|
||||
* error - the error code foe which to print the message
|
||||
* msg - message to print with optional formatting
|
||||
* ... - arguments to use on formatting
|
||||
*********************************************************************/
|
||||
void
|
||||
wsyserrorwithcode(int error, const char *msg, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
|
||||
va_start(args, msg);
|
||||
vsprintf(buf, msg, args);
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname, stderr);
|
||||
fputs(" error: ", stderr);
|
||||
strcat(buf, ": ");
|
||||
strcat(buf, wstrerror(error));
|
||||
strcat(buf,"\n");
|
||||
fputs(buf, stderr);
|
||||
fflush(stderr);
|
||||
fflush(stdout);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
|
||||
|
||||
217
WINGs/findfile.c
217
WINGs/findfile.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Window Maker miscelaneous function library
|
||||
*
|
||||
* Copyright (c) 1997 Alfredo K. Kojima
|
||||
* Copyright (c) 1997-2003 Alfredo K. Kojima
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -18,11 +18,11 @@
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include "../src/config.h"
|
||||
#include "wconfig.h"
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
@@ -33,52 +33,59 @@
|
||||
#define PATH_MAX 1024
|
||||
#endif
|
||||
|
||||
|
||||
char*
|
||||
wgethomedir()
|
||||
char *wgethomedir()
|
||||
{
|
||||
char *home = getenv("HOME");
|
||||
static char *home = NULL;
|
||||
char *tmp;
|
||||
struct passwd *user;
|
||||
|
||||
if (home)
|
||||
return home;
|
||||
|
||||
tmp = getenv("HOME");
|
||||
if (tmp) {
|
||||
home = wstrdup(tmp);
|
||||
return home;
|
||||
}
|
||||
|
||||
user = getpwuid(getuid());
|
||||
if (!user) {
|
||||
wsyserror("could not get password entry for UID %i", getuid());
|
||||
return "/";
|
||||
}
|
||||
if (!user->pw_dir) {
|
||||
return "/";
|
||||
} else {
|
||||
return user->pw_dir;
|
||||
}
|
||||
werror(_("could not get password entry for UID %i"), getuid());
|
||||
home = "/";
|
||||
}
|
||||
|
||||
if (!user->pw_dir)
|
||||
home = "/";
|
||||
else
|
||||
home = wstrdup(user->pw_dir);
|
||||
|
||||
static char*
|
||||
getuserhomedir(char *username)
|
||||
return home;
|
||||
}
|
||||
|
||||
static char *getuserhomedir(const char *username)
|
||||
{
|
||||
static char *home = NULL;
|
||||
struct passwd *user;
|
||||
|
||||
if (home)
|
||||
return home;
|
||||
|
||||
user = getpwnam(username);
|
||||
if (!user) {
|
||||
wsyserror("could not get password entry for user %s", username);
|
||||
werror(_("could not get password entry for user %s"), username);
|
||||
return NULL;
|
||||
}
|
||||
if (!user->pw_dir) {
|
||||
return "/";
|
||||
} else {
|
||||
return user->pw_dir;
|
||||
}
|
||||
if (!user->pw_dir)
|
||||
home = "/";
|
||||
else
|
||||
home = wstrdup(user->pw_dir);
|
||||
|
||||
return home;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
char*
|
||||
wexpandpath(char *path)
|
||||
char *wexpandpath(char *path)
|
||||
{
|
||||
char *origpath = path;
|
||||
char buffer2[PATH_MAX + 2];
|
||||
char buffer[PATH_MAX + 2];
|
||||
int i;
|
||||
@@ -91,25 +98,28 @@ wexpandpath(char *path)
|
||||
path++;
|
||||
if (*path == '/' || *path == 0) {
|
||||
home = wgethomedir();
|
||||
strcat(buffer, home);
|
||||
if (strlen(home) > PATH_MAX ||
|
||||
wstrlcpy(buffer, home, sizeof(buffer)) >= sizeof(buffer))
|
||||
goto error;
|
||||
} else {
|
||||
int j;
|
||||
j = 0;
|
||||
while (*path != 0 && *path != '/') {
|
||||
if (j > PATH_MAX)
|
||||
goto error;
|
||||
buffer2[j++] = *path;
|
||||
buffer2[j] = 0;
|
||||
path++;
|
||||
}
|
||||
home = getuserhomedir(buffer2);
|
||||
if (!home)
|
||||
return NULL;
|
||||
strcat(buffer, home);
|
||||
if (!home || wstrlcat(buffer, home, sizeof(buffer)) >= sizeof(buffer))
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
i = strlen(buffer);
|
||||
|
||||
while (*path!=0) {
|
||||
while (*path != 0 && i <= PATH_MAX) {
|
||||
char *tmp;
|
||||
|
||||
if (*path == '$') {
|
||||
@@ -119,35 +129,51 @@ wexpandpath(char *path)
|
||||
if (*path == '(') {
|
||||
path++;
|
||||
while (*path != 0 && *path != ')') {
|
||||
if (j > PATH_MAX)
|
||||
goto error;
|
||||
buffer2[j++] = *(path++);
|
||||
buffer2[j] = 0;
|
||||
}
|
||||
if (*path==')')
|
||||
if (*path == ')') {
|
||||
path++;
|
||||
tmp = getenv(buffer2);
|
||||
if (!tmp) {
|
||||
buffer[i] = 0;
|
||||
strcat(buffer, "$(");
|
||||
strcat(buffer, buffer2);
|
||||
strcat(buffer, ")");
|
||||
i += strlen(buffer2)+3;
|
||||
} else {
|
||||
strcat(buffer, tmp);
|
||||
i += strlen(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
if (!tmp) {
|
||||
if ((i += strlen(buffer2) + 2) > PATH_MAX)
|
||||
goto error;
|
||||
buffer[i] = 0;
|
||||
if (wstrlcat(buffer, "$(", sizeof(buffer)) >= sizeof(buffer) ||
|
||||
wstrlcat(buffer, buffer2, sizeof(buffer)) >= sizeof(buffer))
|
||||
goto error;
|
||||
if (*(path-1)==')') {
|
||||
if (++i > PATH_MAX ||
|
||||
wstrlcat(buffer, ")", sizeof(buffer)) >= sizeof(buffer))
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
if ((i += strlen(tmp)) > PATH_MAX ||
|
||||
wstrlcat(buffer, tmp, sizeof(buffer)) >= sizeof(buffer))
|
||||
goto error;
|
||||
}
|
||||
} else {
|
||||
while (*path != 0 && *path != '/') {
|
||||
if (j > PATH_MAX)
|
||||
goto error;
|
||||
buffer2[j++] = *(path++);
|
||||
buffer2[j] = 0;
|
||||
}
|
||||
tmp = getenv(buffer2);
|
||||
if (!tmp) {
|
||||
strcat(buffer, "$");
|
||||
strcat(buffer, buffer2);
|
||||
i += strlen(buffer2)+1;
|
||||
if ((i += strlen(buffer2) + 1) > PATH_MAX ||
|
||||
wstrlcat(buffer, "$", sizeof(buffer)) >= sizeof(buffer) ||
|
||||
wstrlcat(buffer, buffer2, sizeof(buffer)) >= sizeof(buffer))
|
||||
goto error;
|
||||
} else {
|
||||
strcat(buffer, tmp);
|
||||
i += strlen(tmp);
|
||||
if ((i += strlen(tmp)) > PATH_MAX ||
|
||||
wstrlcat(buffer, tmp, sizeof(buffer)) >= sizeof(buffer))
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -156,10 +182,35 @@ wexpandpath(char *path)
|
||||
}
|
||||
}
|
||||
|
||||
if (*path!=0)
|
||||
goto error;
|
||||
|
||||
return wstrdup(buffer);
|
||||
|
||||
error:
|
||||
errno = ENAMETOOLONG;
|
||||
werror(_("could not expand %s"), origpath);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* return address of next char != tok or end of string whichever comes first */
|
||||
static char *skipchar(char *string, char tok)
|
||||
{
|
||||
while (*string != 0 && *string == tok)
|
||||
string++;
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
/* return address of next char == tok or end of string whichever comes first */
|
||||
static char *nextchar(char *string, char tok)
|
||||
{
|
||||
while (*string != 0 && *string != tok)
|
||||
string++;
|
||||
|
||||
return string;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
@@ -176,19 +227,17 @@ wexpandpath(char *path)
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
char*
|
||||
wfindfile(char *paths, char *file)
|
||||
char *wfindfile(char *paths, char *file)
|
||||
{
|
||||
char *path;
|
||||
char *tmp;
|
||||
int done;
|
||||
char *tmp, *tmp2;
|
||||
int len, flen;
|
||||
char *fullpath;
|
||||
|
||||
if (!file)
|
||||
return NULL;
|
||||
|
||||
if (*file=='/' || *file=='~' || *file=='$' || !paths) {
|
||||
if (*file == '/' || *file == '~' || *file == '$' || !paths || *paths == 0) {
|
||||
if (access(file, F_OK) < 0) {
|
||||
fullpath = wexpandpath(file);
|
||||
if (!fullpath)
|
||||
@@ -207,32 +256,42 @@ wfindfile(char *paths, char *file)
|
||||
|
||||
flen = strlen(file);
|
||||
tmp = paths;
|
||||
done = 0;
|
||||
while (!done) {
|
||||
len = strcspn(tmp, ":");
|
||||
if (len==0) done=1;
|
||||
while (*tmp) {
|
||||
tmp = skipchar(tmp, ':');
|
||||
if (*tmp == 0)
|
||||
break;
|
||||
tmp2 = nextchar(tmp, ':');
|
||||
len = tmp2 - tmp;
|
||||
path = wmalloc(len + flen + 2);
|
||||
path = memcpy(path, tmp, len);
|
||||
path[len] = 0;
|
||||
strcat(path, "/");
|
||||
strcat(path, file);
|
||||
if (path[len - 1] != '/' &&
|
||||
wstrlcat(path, "/", len + flen + 2) >= len + flen + 2) {
|
||||
wfree(path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (wstrlcat(path, file, len + flen + 2) >= len + flen + 2) {
|
||||
wfree(path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fullpath = wexpandpath(path);
|
||||
wfree(path);
|
||||
|
||||
if (fullpath) {
|
||||
if (access(fullpath, F_OK) == 0) {
|
||||
return fullpath;
|
||||
}
|
||||
wfree(fullpath);
|
||||
}
|
||||
tmp=&(tmp[len+1]);
|
||||
if (*tmp==0) break;
|
||||
tmp = tmp2;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
wfindfileinlist(char **path_list, char *file)
|
||||
char *wfindfileinlist(char **path_list, char *file)
|
||||
{
|
||||
int i;
|
||||
char *path;
|
||||
@@ -265,8 +324,11 @@ wfindfileinlist(char **path_list, char *file)
|
||||
path = wmalloc(len + flen + 2);
|
||||
path = memcpy(path, path_list[i], len);
|
||||
path[len] = 0;
|
||||
strcat(path, "/");
|
||||
strcat(path, file);
|
||||
if (wstrlcat(path, "/", len + flen + 2) >= len + flen + 2 ||
|
||||
wstrlcat(path, file, len + flen + 2) >= len + flen + 2) {
|
||||
wfree(path);
|
||||
return NULL;
|
||||
}
|
||||
/* expand tilde */
|
||||
fullpath = wexpandpath(path);
|
||||
wfree(path);
|
||||
@@ -278,13 +340,11 @@ wfindfileinlist(char **path_list, char *file)
|
||||
wfree(fullpath);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char*
|
||||
wfindfileinarray(proplist_t array, char *file)
|
||||
char *wfindfileinarray(WMPropList * array, char *file)
|
||||
{
|
||||
int i;
|
||||
char *path;
|
||||
@@ -312,21 +372,24 @@ wfindfileinarray(proplist_t array, char *file)
|
||||
}
|
||||
|
||||
flen = strlen(file);
|
||||
for (i=0; i<PLGetNumberOfElements(array); i++) {
|
||||
proplist_t prop;
|
||||
for (i = 0; i < WMGetPropListItemCount(array); i++) {
|
||||
WMPropList *prop;
|
||||
char *p;
|
||||
|
||||
prop = PLGetArrayElement(array, i);
|
||||
prop = WMGetFromPLArray(array, i);
|
||||
if (!prop)
|
||||
continue;
|
||||
p = PLGetString(prop);
|
||||
p = WMGetFromPLString(prop);
|
||||
|
||||
len = strlen(p);
|
||||
path = wmalloc(len + flen + 2);
|
||||
path = memcpy(path, p, len);
|
||||
path[len] = 0;
|
||||
strcat(path, "/");
|
||||
strcat(path, file);
|
||||
if (wstrlcat(path, "/", len + flen + 2) >= len + flen + 2 ||
|
||||
wstrlcat(path, file, len + flen + 2) >= len + flen + 2) {
|
||||
wfree(path);
|
||||
return NULL;
|
||||
}
|
||||
/* expand tilde */
|
||||
fullpath = wexpandpath(path);
|
||||
wfree(path);
|
||||
@@ -340,7 +403,3 @@ wfindfileinarray(proplist_t array, char *file)
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
104
WINGs/fontl.c
104
WINGs/fontl.c
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
* WINGs demo: font lister
|
||||
*
|
||||
* Copyright (c) 1998 Alfredo K. Kojima
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
* USA.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "WINGs.h"
|
||||
#include "WUtil.h"
|
||||
|
||||
void
|
||||
wAbort()
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void show(WMWidget *self, void *data)
|
||||
{
|
||||
char buf[60];
|
||||
void *d;
|
||||
WMLabel *l = (WMLabel*)data;
|
||||
d = WMGetHangedData(self);
|
||||
sprintf(buf, "%i - 0x%x - 0%o", (int)d, (int)d, (int)d);
|
||||
WMSetLabelText(l, buf);
|
||||
}
|
||||
|
||||
void quit(WMWidget *self, void *data)
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
Display *dpy;
|
||||
WMWindow *win;
|
||||
WMScreen *scr;
|
||||
WMButton *lab, *l0=NULL;
|
||||
WMLabel *pos;
|
||||
int x, y, c;
|
||||
char buf[20];
|
||||
|
||||
WMInitializeApplication("FontView", &argc, argv);
|
||||
|
||||
dpy = XOpenDisplay("");
|
||||
if (!dpy) {
|
||||
wfatal("cant open display");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
scr = WMCreateSimpleApplicationScreen(dpy);
|
||||
|
||||
win = WMCreateWindow(scr, "main");
|
||||
WMResizeWidget(win, 20*33, 20+20*9);
|
||||
WMSetWindowTitle(win, "Font Chars");
|
||||
WMSetWindowCloseAction(win, quit, NULL);
|
||||
pos = WMCreateLabel(win);
|
||||
WMResizeWidget(pos, 20*33, 20);
|
||||
WMMoveWidget(pos, 10, 5);
|
||||
|
||||
c = 0;
|
||||
for (y=0; y<8; y++) {
|
||||
for (x=0; x<32; x++, c++) {
|
||||
lab = WMCreateCustomButton(win, WBBStateLightMask);
|
||||
WMResizeWidget(lab, 20, 20);
|
||||
WMMoveWidget(lab, 10+x*20, 30+y*20);
|
||||
sprintf(buf, "%c", c);
|
||||
WMSetButtonText(lab, buf);
|
||||
WMSetButtonAction(lab, show, pos);
|
||||
WMHangData(lab, (void*)c);
|
||||
if (c>0) {
|
||||
WMGroupButtons(l0, lab);
|
||||
} else {
|
||||
l0 = lab;
|
||||
}
|
||||
}
|
||||
}
|
||||
WMRealizeWidget(win);
|
||||
WMMapSubwidgets(win);
|
||||
WMMapWidget(win);
|
||||
WMScreenMainLoop(scr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
31
WINGs/get-wings-flags.in
Normal file
31
WINGs/get-wings-flags.in
Normal file
@@ -0,0 +1,31 @@
|
||||
#!/bin/sh
|
||||
|
||||
WCFLAGS="${inc_search_path}"
|
||||
WLFLAGS="${lib_search_path}"
|
||||
WLIBS="-lWINGs -lWUtil -lwraster ${GFXLIBS} ${XFTLIBS} ${XLIBS} -lm ${INTLIBS}"
|
||||
|
||||
usage="Usage: get-wings-flags [--cflags] [--ldflags] [--libs]"
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case $1 in
|
||||
--cflags)
|
||||
echo $WCFLAGS
|
||||
;;
|
||||
--ldflags|--lflags)
|
||||
echo $WLFLAGS
|
||||
;;
|
||||
--libs)
|
||||
echo $WLIBS
|
||||
;;
|
||||
*)
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
31
WINGs/get-wutil-flags.in
Normal file
31
WINGs/get-wutil-flags.in
Normal file
@@ -0,0 +1,31 @@
|
||||
#!/bin/sh
|
||||
|
||||
WCFLAGS="-I${includedir}"
|
||||
WLFLAGS="-L${libdir}"
|
||||
WLIBS="-lWUtil ${INTLIBS}"
|
||||
|
||||
usage="Usage: get-wutil-flags [--cflags] [--ldflags] [--libs]"
|
||||
|
||||
if test $# -eq 0; then
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while test $# -gt 0; do
|
||||
case $1 in
|
||||
--cflags)
|
||||
echo $WCFLAGS
|
||||
;;
|
||||
--ldflags|--lflags)
|
||||
echo $WLFLAGS
|
||||
;;
|
||||
--libs)
|
||||
echo $WLIBS
|
||||
;;
|
||||
*)
|
||||
echo "${usage}" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
566
WINGs/handlers.c
Normal file
566
WINGs/handlers.c
Normal file
@@ -0,0 +1,566 @@
|
||||
|
||||
/*
|
||||
* WINGs internal handlers: timer, idle and input handlers
|
||||
*/
|
||||
|
||||
#include "wconfig.h"
|
||||
#include "WINGsP.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <X11/Xos.h>
|
||||
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
# include <sys/select.h>
|
||||
#endif
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#ifndef X_GETTIMEOFDAY
|
||||
#define X_GETTIMEOFDAY(t) gettimeofday(t, (struct timezone*)0)
|
||||
#endif
|
||||
|
||||
typedef struct TimerHandler {
|
||||
WMCallback *callback; /* procedure to call */
|
||||
struct timeval when; /* when to call the callback */
|
||||
void *clientData;
|
||||
struct TimerHandler *next;
|
||||
int nextDelay; /* 0 if it's one-shot */
|
||||
} TimerHandler;
|
||||
|
||||
typedef struct IdleHandler {
|
||||
WMCallback *callback;
|
||||
void *clientData;
|
||||
} IdleHandler;
|
||||
|
||||
typedef struct InputHandler {
|
||||
WMInputProc *callback;
|
||||
void *clientData;
|
||||
int fd;
|
||||
int mask;
|
||||
} InputHandler;
|
||||
|
||||
/* queue of timer event handlers */
|
||||
static TimerHandler *timerHandler = NULL;
|
||||
|
||||
static WMArray *idleHandler = NULL;
|
||||
|
||||
static WMArray *inputHandler = NULL;
|
||||
|
||||
#define timerPending() (timerHandler)
|
||||
|
||||
static void rightNow(struct timeval *tv)
|
||||
{
|
||||
X_GETTIMEOFDAY(tv);
|
||||
}
|
||||
|
||||
/* is t1 after t2 ? */
|
||||
#define IS_AFTER(t1, t2) (((t1).tv_sec > (t2).tv_sec) || \
|
||||
(((t1).tv_sec == (t2).tv_sec) \
|
||||
&& ((t1).tv_usec > (t2).tv_usec)))
|
||||
|
||||
#define IS_ZERO(tv) (tv.tv_sec == 0 && tv.tv_usec == 0)
|
||||
|
||||
#define SET_ZERO(tv) tv.tv_sec = 0, tv.tv_usec = 0
|
||||
|
||||
static void addmillisecs(struct timeval *tv, int milliseconds)
|
||||
{
|
||||
tv->tv_usec += milliseconds * 1000;
|
||||
|
||||
tv->tv_sec += tv->tv_usec / 1000000;
|
||||
tv->tv_usec = tv->tv_usec % 1000000;
|
||||
}
|
||||
|
||||
static void enqueueTimerHandler(TimerHandler * handler)
|
||||
{
|
||||
TimerHandler *tmp;
|
||||
|
||||
/* insert callback in queue, sorted by time left */
|
||||
if (!timerHandler || !IS_AFTER(handler->when, timerHandler->when)) {
|
||||
/* first in the queue */
|
||||
handler->next = timerHandler;
|
||||
timerHandler = handler;
|
||||
} else {
|
||||
tmp = timerHandler;
|
||||
while (tmp->next && IS_AFTER(handler->when, tmp->next->when)) {
|
||||
tmp = tmp->next;
|
||||
}
|
||||
handler->next = tmp->next;
|
||||
tmp->next = handler;
|
||||
}
|
||||
}
|
||||
|
||||
static void delayUntilNextTimerEvent(struct timeval *delay)
|
||||
{
|
||||
struct timeval now;
|
||||
TimerHandler *handler;
|
||||
|
||||
handler = timerHandler;
|
||||
while (handler && IS_ZERO(handler->when))
|
||||
handler = handler->next;
|
||||
|
||||
if (!handler) {
|
||||
/* The return value of this function is only valid if there _are_
|
||||
timers active. */
|
||||
delay->tv_sec = 0;
|
||||
delay->tv_usec = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
rightNow(&now);
|
||||
if (IS_AFTER(now, handler->when)) {
|
||||
delay->tv_sec = 0;
|
||||
delay->tv_usec = 0;
|
||||
} else {
|
||||
delay->tv_sec = handler->when.tv_sec - now.tv_sec;
|
||||
delay->tv_usec = handler->when.tv_usec - now.tv_usec;
|
||||
if (delay->tv_usec < 0) {
|
||||
delay->tv_usec += 1000000;
|
||||
delay->tv_sec--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WMHandlerID WMAddTimerHandler(int milliseconds, WMCallback * callback, void *cdata)
|
||||
{
|
||||
TimerHandler *handler;
|
||||
|
||||
handler = malloc(sizeof(TimerHandler));
|
||||
if (!handler)
|
||||
return NULL;
|
||||
|
||||
rightNow(&handler->when);
|
||||
addmillisecs(&handler->when, milliseconds);
|
||||
handler->callback = callback;
|
||||
handler->clientData = cdata;
|
||||
handler->nextDelay = 0;
|
||||
|
||||
enqueueTimerHandler(handler);
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
WMHandlerID WMAddPersistentTimerHandler(int milliseconds, WMCallback * callback, void *cdata)
|
||||
{
|
||||
TimerHandler *handler = WMAddTimerHandler(milliseconds, callback, cdata);
|
||||
|
||||
if (handler != NULL)
|
||||
handler->nextDelay = milliseconds;
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
void WMDeleteTimerWithClientData(void *cdata)
|
||||
{
|
||||
TimerHandler *handler, *tmp;
|
||||
|
||||
if (!cdata || !timerHandler)
|
||||
return;
|
||||
|
||||
tmp = timerHandler;
|
||||
if (tmp->clientData == cdata) {
|
||||
tmp->nextDelay = 0;
|
||||
if (!IS_ZERO(tmp->when)) {
|
||||
timerHandler = tmp->next;
|
||||
wfree(tmp);
|
||||
}
|
||||
} else {
|
||||
while (tmp->next) {
|
||||
if (tmp->next->clientData == cdata) {
|
||||
handler = tmp->next;
|
||||
handler->nextDelay = 0;
|
||||
if (IS_ZERO(handler->when))
|
||||
break;
|
||||
tmp->next = handler->next;
|
||||
wfree(handler);
|
||||
break;
|
||||
}
|
||||
tmp = tmp->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WMDeleteTimerHandler(WMHandlerID handlerID)
|
||||
{
|
||||
TimerHandler *tmp, *handler = (TimerHandler *) handlerID;
|
||||
|
||||
if (!handler || !timerHandler)
|
||||
return;
|
||||
|
||||
tmp = timerHandler;
|
||||
|
||||
handler->nextDelay = 0;
|
||||
|
||||
if (IS_ZERO(handler->when))
|
||||
return;
|
||||
|
||||
if (tmp == handler) {
|
||||
timerHandler = handler->next;
|
||||
wfree(handler);
|
||||
} else {
|
||||
while (tmp->next) {
|
||||
if (tmp->next == handler) {
|
||||
tmp->next = handler->next;
|
||||
wfree(handler);
|
||||
break;
|
||||
}
|
||||
tmp = tmp->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
WMHandlerID WMAddIdleHandler(WMCallback * callback, void *cdata)
|
||||
{
|
||||
IdleHandler *handler;
|
||||
|
||||
handler = malloc(sizeof(IdleHandler));
|
||||
if (!handler)
|
||||
return NULL;
|
||||
|
||||
handler->callback = callback;
|
||||
handler->clientData = cdata;
|
||||
/* add handler at end of queue */
|
||||
if (!idleHandler) {
|
||||
idleHandler = WMCreateArrayWithDestructor(16, wfree);
|
||||
}
|
||||
WMAddToArray(idleHandler, handler);
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
void WMDeleteIdleHandler(WMHandlerID handlerID)
|
||||
{
|
||||
IdleHandler *handler = (IdleHandler *) handlerID;
|
||||
|
||||
if (!handler || !idleHandler)
|
||||
return;
|
||||
|
||||
WMRemoveFromArray(idleHandler, handler);
|
||||
}
|
||||
|
||||
WMHandlerID WMAddInputHandler(int fd, int condition, WMInputProc * proc, void *clientData)
|
||||
{
|
||||
InputHandler *handler;
|
||||
|
||||
handler = wmalloc(sizeof(InputHandler));
|
||||
|
||||
handler->fd = fd;
|
||||
handler->mask = condition;
|
||||
handler->callback = proc;
|
||||
handler->clientData = clientData;
|
||||
|
||||
if (!inputHandler)
|
||||
inputHandler = WMCreateArrayWithDestructor(16, wfree);
|
||||
WMAddToArray(inputHandler, handler);
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
void WMDeleteInputHandler(WMHandlerID handlerID)
|
||||
{
|
||||
InputHandler *handler = (InputHandler *) handlerID;
|
||||
|
||||
if (!handler || !inputHandler)
|
||||
return;
|
||||
|
||||
WMRemoveFromArray(inputHandler, handler);
|
||||
}
|
||||
|
||||
Bool W_CheckIdleHandlers(void)
|
||||
{
|
||||
IdleHandler *handler;
|
||||
WMArray *handlerCopy;
|
||||
WMArrayIterator iter;
|
||||
|
||||
if (!idleHandler || WMGetArrayItemCount(idleHandler) == 0) {
|
||||
W_FlushIdleNotificationQueue();
|
||||
/* make sure an observer in queue didn't added an idle handler */
|
||||
return (idleHandler != NULL && WMGetArrayItemCount(idleHandler) > 0);
|
||||
}
|
||||
|
||||
handlerCopy = WMDuplicateArray(idleHandler);
|
||||
|
||||
WM_ITERATE_ARRAY(handlerCopy, handler, iter) {
|
||||
/* check if the handler still exist or was removed by a callback */
|
||||
if (WMGetFirstInArray(idleHandler, handler) == WANotFound)
|
||||
continue;
|
||||
|
||||
(*handler->callback) (handler->clientData);
|
||||
WMDeleteIdleHandler(handler);
|
||||
}
|
||||
|
||||
WMFreeArray(handlerCopy);
|
||||
|
||||
W_FlushIdleNotificationQueue();
|
||||
|
||||
/* this is not necesarrily False, because one handler can re-add itself */
|
||||
return (WMGetArrayItemCount(idleHandler) > 0);
|
||||
}
|
||||
|
||||
void W_CheckTimerHandlers(void)
|
||||
{
|
||||
TimerHandler *handler;
|
||||
struct timeval now;
|
||||
|
||||
if (!timerHandler) {
|
||||
W_FlushASAPNotificationQueue();
|
||||
return;
|
||||
}
|
||||
|
||||
rightNow(&now);
|
||||
|
||||
handler = timerHandler;
|
||||
while (handler && IS_AFTER(now, handler->when)) {
|
||||
if (!IS_ZERO(handler->when)) {
|
||||
SET_ZERO(handler->when);
|
||||
(*handler->callback) (handler->clientData);
|
||||
}
|
||||
handler = handler->next;
|
||||
}
|
||||
|
||||
while (timerHandler && IS_ZERO(timerHandler->when)) {
|
||||
handler = timerHandler;
|
||||
timerHandler = timerHandler->next;
|
||||
|
||||
if (handler->nextDelay > 0) {
|
||||
handler->when = now;
|
||||
addmillisecs(&handler->when, handler->nextDelay);
|
||||
enqueueTimerHandler(handler);
|
||||
} else {
|
||||
wfree(handler);
|
||||
}
|
||||
}
|
||||
|
||||
W_FlushASAPNotificationQueue();
|
||||
}
|
||||
|
||||
/*
|
||||
* This functions will handle input events on all registered file descriptors.
|
||||
* Input:
|
||||
* - waitForInput - True if we want the function to wait until an event
|
||||
* appears on a file descriptor we watch, False if we
|
||||
* want the function to immediately return if there is
|
||||
* no data available on the file descriptors we watch.
|
||||
* - inputfd - Extra input file descriptor to watch for input.
|
||||
* This is only used when called from wevent.c to watch
|
||||
* on ConnectionNumber(dpy) to avoid blocking of X events
|
||||
* if we wait for input from other file handlers.
|
||||
* Output:
|
||||
* if waitForInput is False, the function will return False if there are no
|
||||
* input handlers registered, or if there is no data
|
||||
* available on the registered ones, and will return True
|
||||
* if there is at least one input handler that has data
|
||||
* available.
|
||||
* if waitForInput is True, the function will return False if there are no
|
||||
* input handlers registered, else it will block until an
|
||||
* event appears on one of the file descriptors it watches
|
||||
* and then it will return True.
|
||||
*
|
||||
* If the retured value is True, the input handlers for the corresponding file
|
||||
* descriptors are also called.
|
||||
*
|
||||
* Parametersshould be passed like this:
|
||||
* - from wevent.c:
|
||||
* waitForInput - apropriate value passed by the function who called us
|
||||
* inputfd = ConnectionNumber(dpy)
|
||||
* - from wutil.c:
|
||||
* waitForInput - apropriate value passed by the function who called us
|
||||
* inputfd = -1
|
||||
*
|
||||
*/
|
||||
Bool W_HandleInputEvents(Bool waitForInput, int inputfd)
|
||||
{
|
||||
#if defined(HAVE_POLL) && defined(HAVE_POLL_H) && !defined(HAVE_SELECT)
|
||||
struct poll fd *fds;
|
||||
InputHandler *handler;
|
||||
int count, timeout, nfds, i, extrafd;
|
||||
|
||||
extrafd = (inputfd < 0) ? 0 : 1;
|
||||
|
||||
if (inputHandler)
|
||||
nfds = WMGetArrayItemCount(inputHandler);
|
||||
else
|
||||
nfds = 0;
|
||||
|
||||
if (!extrafd && nfds == 0) {
|
||||
W_FlushASAPNotificationQueue();
|
||||
return False;
|
||||
}
|
||||
|
||||
fds = wmalloc((nfds + extrafd) * sizeof(struct pollfd));
|
||||
if (extrafd) {
|
||||
/* put this to the end of array to avoid using ranges from 1 to nfds+1 */
|
||||
fds[nfds].fd = inputfd;
|
||||
fds[nfds].events = POLLIN;
|
||||
}
|
||||
|
||||
/* use WM_ITERATE_ARRAY() here */
|
||||
for (i = 0; i < nfds; i++) {
|
||||
handler = WMGetFromArray(inputHandler, i);
|
||||
fds[i].fd = handler->fd;
|
||||
fds[i].events = 0;
|
||||
if (handler->mask & WIReadMask)
|
||||
fds[i].events |= POLLIN;
|
||||
|
||||
if (handler->mask & WIWriteMask)
|
||||
fds[i].events |= POLLOUT;
|
||||
|
||||
#if 0 /* FIXME */
|
||||
if (handler->mask & WIExceptMask)
|
||||
FD_SET(handler->fd, &eset);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup the timeout to the estimated time until the
|
||||
* next timer expires.
|
||||
*/
|
||||
if (!waitForInput) {
|
||||
timeout = 0;
|
||||
} else if (timerPending()) {
|
||||
struct timeval tv;
|
||||
delayUntilNextTimerEvent(&tv);
|
||||
timeout = tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
||||
} else {
|
||||
timeout = -1;
|
||||
}
|
||||
|
||||
count = poll(fds, nfds + extrafd, timeout);
|
||||
|
||||
if (count > 0 && nfds > 0) {
|
||||
WMArray *handlerCopy = WMDuplicateArray(inputHandler);
|
||||
int mask;
|
||||
|
||||
/* use WM_ITERATE_ARRAY() here */
|
||||
for (i = 0; i < nfds; i++) {
|
||||
handler = WMGetFromArray(handlerCopy, i);
|
||||
/* check if the handler still exist or was removed by a callback */
|
||||
if (WMGetFirstInArray(inputHandler, handler) == WANotFound)
|
||||
continue;
|
||||
|
||||
mask = 0;
|
||||
|
||||
if ((handler->mask & WIReadMask) &&
|
||||
(fds[i].revents & (POLLIN | POLLRDNORM | POLLRDBAND | POLLPRI)))
|
||||
mask |= WIReadMask;
|
||||
|
||||
if ((handler->mask & WIWriteMask) && (fds[i].revents & (POLLOUT | POLLWRBAND)))
|
||||
mask |= WIWriteMask;
|
||||
|
||||
if ((handler->mask & WIExceptMask) && (fds[i].revents & (POLLHUP | POLLNVAL | POLLERR)))
|
||||
mask |= WIExceptMask;
|
||||
|
||||
if (mask != 0 && handler->callback) {
|
||||
(*handler->callback) (handler->fd, mask, handler->clientData);
|
||||
}
|
||||
}
|
||||
|
||||
WMFreeArray(handlerCopy);
|
||||
}
|
||||
|
||||
wfree(fds);
|
||||
|
||||
W_FlushASAPNotificationQueue();
|
||||
|
||||
return (count > 0);
|
||||
#else
|
||||
#ifdef HAVE_SELECT
|
||||
struct timeval timeout;
|
||||
struct timeval *timeoutPtr;
|
||||
fd_set rset, wset, eset;
|
||||
int maxfd, nfds, i;
|
||||
int count;
|
||||
InputHandler *handler;
|
||||
|
||||
if (inputHandler)
|
||||
nfds = WMGetArrayItemCount(inputHandler);
|
||||
else
|
||||
nfds = 0;
|
||||
|
||||
if (inputfd < 0 && nfds == 0) {
|
||||
W_FlushASAPNotificationQueue();
|
||||
return False;
|
||||
}
|
||||
|
||||
FD_ZERO(&rset);
|
||||
FD_ZERO(&wset);
|
||||
FD_ZERO(&eset);
|
||||
|
||||
if (inputfd < 0) {
|
||||
maxfd = 0;
|
||||
} else {
|
||||
FD_SET(inputfd, &rset);
|
||||
maxfd = inputfd;
|
||||
}
|
||||
|
||||
/* use WM_ITERATE_ARRAY() here */
|
||||
for (i = 0; i < nfds; i++) {
|
||||
handler = WMGetFromArray(inputHandler, i);
|
||||
if (handler->mask & WIReadMask)
|
||||
FD_SET(handler->fd, &rset);
|
||||
|
||||
if (handler->mask & WIWriteMask)
|
||||
FD_SET(handler->fd, &wset);
|
||||
|
||||
if (handler->mask & WIExceptMask)
|
||||
FD_SET(handler->fd, &eset);
|
||||
|
||||
if (maxfd < handler->fd)
|
||||
maxfd = handler->fd;
|
||||
}
|
||||
|
||||
/*
|
||||
* Setup the timeout to the estimated time until the
|
||||
* next timer expires.
|
||||
*/
|
||||
if (!waitForInput) {
|
||||
SET_ZERO(timeout);
|
||||
timeoutPtr = &timeout;
|
||||
} else if (timerPending()) {
|
||||
delayUntilNextTimerEvent(&timeout);
|
||||
timeoutPtr = &timeout;
|
||||
} else {
|
||||
timeoutPtr = (struct timeval *)0;
|
||||
}
|
||||
|
||||
count = select(1 + maxfd, &rset, &wset, &eset, timeoutPtr);
|
||||
|
||||
if (count > 0 && nfds > 0) {
|
||||
WMArray *handlerCopy = WMDuplicateArray(inputHandler);
|
||||
int mask;
|
||||
|
||||
/* use WM_ITERATE_ARRAY() here */
|
||||
for (i = 0; i < nfds; i++) {
|
||||
handler = WMGetFromArray(handlerCopy, i);
|
||||
/* check if the handler still exist or was removed by a callback */
|
||||
if (WMGetFirstInArray(inputHandler, handler) == WANotFound)
|
||||
continue;
|
||||
|
||||
mask = 0;
|
||||
|
||||
if ((handler->mask & WIReadMask) && FD_ISSET(handler->fd, &rset))
|
||||
mask |= WIReadMask;
|
||||
|
||||
if ((handler->mask & WIWriteMask) && FD_ISSET(handler->fd, &wset))
|
||||
mask |= WIWriteMask;
|
||||
|
||||
if ((handler->mask & WIExceptMask) && FD_ISSET(handler->fd, &eset))
|
||||
mask |= WIExceptMask;
|
||||
|
||||
if (mask != 0 && handler->callback) {
|
||||
(*handler->callback) (handler->fd, mask, handler->clientData);
|
||||
}
|
||||
}
|
||||
|
||||
WMFreeArray(handlerCopy);
|
||||
}
|
||||
|
||||
W_FlushASAPNotificationQueue();
|
||||
|
||||
return (count > 0);
|
||||
#else /* not HAVE_SELECT, not HAVE_POLL */
|
||||
# error Neither select nor poll. You lose.
|
||||
#endif /* HAVE_SELECT */
|
||||
#endif /* HAVE_POLL */
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
@@ -7,27 +6,21 @@
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
|
||||
|
||||
|
||||
#define INITIAL_CAPACITY 23
|
||||
|
||||
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
|
||||
# define INLINE inline
|
||||
#else
|
||||
# define INLINE
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct HashItem {
|
||||
void *key;
|
||||
void *data;
|
||||
const void *key;
|
||||
const void *data;
|
||||
|
||||
struct HashItem *next; /* collided item list */
|
||||
} HashItem;
|
||||
|
||||
|
||||
typedef struct W_HashTable {
|
||||
WMHashTableCallbacks callbacks;
|
||||
|
||||
@@ -37,9 +30,6 @@ typedef struct W_HashTable {
|
||||
HashItem **table;
|
||||
} HashTable;
|
||||
|
||||
|
||||
|
||||
|
||||
#define HASH(table, key) (((table)->callbacks.hash ? \
|
||||
(*(table)->callbacks.hash)(key) : hashPtr(key)) % (table)->size)
|
||||
|
||||
@@ -49,11 +39,7 @@ typedef struct W_HashTable {
|
||||
#define RELKEY(table, key) if ((table)->callbacks.releaseKey) \
|
||||
(*(table)->callbacks.releaseKey)(key)
|
||||
|
||||
|
||||
|
||||
|
||||
static INLINE unsigned
|
||||
hashString(const char *key)
|
||||
static INLINE unsigned hashString(const char *key)
|
||||
{
|
||||
unsigned ret = 0;
|
||||
unsigned ctr = 0;
|
||||
@@ -66,19 +52,12 @@ hashString(const char *key)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static INLINE unsigned
|
||||
hashPtr(const void *key)
|
||||
static INLINE unsigned hashPtr(const void *key)
|
||||
{
|
||||
return ((size_t) key / sizeof(char *));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void
|
||||
rellocateItem(WMHashTable *table, HashItem *item)
|
||||
static void rellocateItem(WMHashTable * table, HashItem * item)
|
||||
{
|
||||
unsigned h;
|
||||
|
||||
@@ -88,9 +67,7 @@ rellocateItem(WMHashTable *table, HashItem *item)
|
||||
table->table[h] = item;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
rebuildTable(WMHashTable *table)
|
||||
static void rebuildTable(WMHashTable * table)
|
||||
{
|
||||
HashItem *next;
|
||||
HashItem **oldArray;
|
||||
@@ -104,7 +81,6 @@ rebuildTable(WMHashTable *table)
|
||||
newSize = table->size * 2;
|
||||
|
||||
table->table = wmalloc(sizeof(char *) * newSize);
|
||||
memset(table->table, 0, sizeof(char*)*newSize);
|
||||
table->size = newSize;
|
||||
|
||||
for (i = 0; i < oldSize; i++) {
|
||||
@@ -117,10 +93,7 @@ rebuildTable(WMHashTable *table)
|
||||
wfree(oldArray);
|
||||
}
|
||||
|
||||
|
||||
|
||||
WMHashTable*
|
||||
WMCreateHashTable(WMHashTableCallbacks callbacks)
|
||||
WMHashTable *WMCreateHashTable(WMHashTableCallbacks callbacks)
|
||||
{
|
||||
HashTable *table;
|
||||
|
||||
@@ -137,9 +110,7 @@ WMCreateHashTable(WMHashTableCallbacks callbacks)
|
||||
return table;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMResetHashTable(WMHashTable *table)
|
||||
void WMResetHashTable(WMHashTable * table)
|
||||
{
|
||||
HashItem *item, *tmp;
|
||||
int i;
|
||||
@@ -148,7 +119,7 @@ WMResetHashTable(WMHashTable *table)
|
||||
item = table->table[i];
|
||||
while (item) {
|
||||
tmp = item->next;
|
||||
RELKEY(table, item);
|
||||
RELKEY(table, item->key);
|
||||
wfree(item);
|
||||
item = tmp;
|
||||
}
|
||||
@@ -164,9 +135,7 @@ WMResetHashTable(WMHashTable *table)
|
||||
memset(table->table, 0, sizeof(HashItem *) * table->size);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMFreeHashTable(WMHashTable *table)
|
||||
void WMFreeHashTable(WMHashTable * table)
|
||||
{
|
||||
HashItem *item, *tmp;
|
||||
int i;
|
||||
@@ -184,10 +153,12 @@ WMFreeHashTable(WMHashTable *table)
|
||||
wfree(table);
|
||||
}
|
||||
|
||||
unsigned WMCountHashTable(WMHashTable * table)
|
||||
{
|
||||
return table->itemCount;
|
||||
}
|
||||
|
||||
|
||||
void*
|
||||
WMHashGet(WMHashTable *table, const void *key)
|
||||
void *WMHashGet(WMHashTable * table, const void *key)
|
||||
{
|
||||
unsigned h;
|
||||
HashItem *item;
|
||||
@@ -211,15 +182,46 @@ WMHashGet(WMHashTable *table, const void *key)
|
||||
}
|
||||
}
|
||||
if (item)
|
||||
return item->data;
|
||||
return (void *)item->data;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Bool WMHashGetItemAndKey(WMHashTable * table, const void *key, void **retItem, void **retKey)
|
||||
{
|
||||
unsigned h;
|
||||
HashItem *item;
|
||||
|
||||
h = HASH(table, key);
|
||||
item = table->table[h];
|
||||
|
||||
void*
|
||||
WMHashInsert(WMHashTable *table, void *key, void *data)
|
||||
if (table->callbacks.keyIsEqual) {
|
||||
while (item) {
|
||||
if ((*table->callbacks.keyIsEqual) (key, item->key)) {
|
||||
break;
|
||||
}
|
||||
item = item->next;
|
||||
}
|
||||
} else {
|
||||
while (item) {
|
||||
if (key == item->key) {
|
||||
break;
|
||||
}
|
||||
item = item->next;
|
||||
}
|
||||
}
|
||||
if (item) {
|
||||
if (retKey)
|
||||
*retKey = (void *)item->key;
|
||||
if (retItem)
|
||||
*retItem = (void *)item->data;
|
||||
return True;
|
||||
} else {
|
||||
return False;
|
||||
}
|
||||
}
|
||||
|
||||
void *WMHashInsert(WMHashTable * table, const void *key, const void *data)
|
||||
{
|
||||
unsigned h;
|
||||
HashItem *item;
|
||||
@@ -247,14 +249,14 @@ WMHashInsert(WMHashTable *table, void *key, void *data)
|
||||
}
|
||||
|
||||
if (replacing) {
|
||||
void *old;
|
||||
const void *old;
|
||||
|
||||
old = item->data;
|
||||
item->data = data;
|
||||
RELKEY(table, item->key);
|
||||
item->key = DUPKEY(table, key);
|
||||
|
||||
return old;
|
||||
return (void *)old;
|
||||
} else {
|
||||
HashItem *nitem;
|
||||
|
||||
@@ -281,17 +283,14 @@ WMHashInsert(WMHashTable *table, void *key, void *data)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static HashItem*
|
||||
deleteFromList(HashTable *table, HashItem *item, const void *key)
|
||||
static HashItem *deleteFromList(HashTable * table, HashItem * item, const void *key)
|
||||
{
|
||||
HashItem *next;
|
||||
|
||||
if (item == NULL)
|
||||
return NULL;
|
||||
|
||||
if ((table->callbacks.keyIsEqual
|
||||
&& (*table->callbacks.keyIsEqual)(key, item->key))
|
||||
if ((table->callbacks.keyIsEqual && (*table->callbacks.keyIsEqual) (key, item->key))
|
||||
|| (!table->callbacks.keyIsEqual && key == item->key)) {
|
||||
|
||||
next = item->next;
|
||||
@@ -308,9 +307,7 @@ deleteFromList(HashTable *table, HashItem *item, const void *key)
|
||||
return item;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMHashRemove(WMHashTable *table, const void *key)
|
||||
void WMHashRemove(WMHashTable * table, const void *key)
|
||||
{
|
||||
unsigned h;
|
||||
|
||||
@@ -319,9 +316,7 @@ WMHashRemove(WMHashTable *table, const void *key)
|
||||
table->table[h] = deleteFromList(table, table->table[h], key);
|
||||
}
|
||||
|
||||
|
||||
WMHashEnumerator
|
||||
WMEnumerateHashTable(WMHashTable *table)
|
||||
WMHashEnumerator WMEnumerateHashTable(WMHashTable * table)
|
||||
{
|
||||
WMHashEnumerator enumerator;
|
||||
|
||||
@@ -332,12 +327,9 @@ WMEnumerateHashTable(WMHashTable *table)
|
||||
return enumerator;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void*
|
||||
WMNextHashEnumeratorItem(WMHashEnumerator *enumerator)
|
||||
void *WMNextHashEnumeratorItem(WMHashEnumerator * enumerator)
|
||||
{
|
||||
void *data = NULL;
|
||||
const void *data = NULL;
|
||||
|
||||
/* this assumes the table doesn't change between
|
||||
* WMEnumerateHashTable() and WMNextHashEnumeratorItem() calls */
|
||||
@@ -357,30 +349,72 @@ WMNextHashEnumeratorItem(WMHashEnumerator *enumerator)
|
||||
enumerator->nextItem = ((HashItem *) enumerator->nextItem)->next;
|
||||
}
|
||||
|
||||
return data;
|
||||
return (void *)data;
|
||||
}
|
||||
|
||||
|
||||
unsigned
|
||||
WMCountHashTable(WMHashTable *table)
|
||||
void *WMNextHashEnumeratorKey(WMHashEnumerator * enumerator)
|
||||
{
|
||||
return table->itemCount;
|
||||
const void *key = NULL;
|
||||
|
||||
/* this assumes the table doesn't change between
|
||||
* WMEnumerateHashTable() and WMNextHashEnumeratorKey() calls */
|
||||
|
||||
if (enumerator->nextItem == NULL) {
|
||||
HashTable *table = enumerator->table;
|
||||
while (++enumerator->index < table->size) {
|
||||
if (table->table[enumerator->index] != NULL) {
|
||||
enumerator->nextItem = table->table[enumerator->index];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (enumerator->nextItem) {
|
||||
key = ((HashItem *) enumerator->nextItem)->key;
|
||||
enumerator->nextItem = ((HashItem *) enumerator->nextItem)->next;
|
||||
}
|
||||
|
||||
static Bool
|
||||
compareStrings(const char *key1, const char *key2)
|
||||
return (void *)key;
|
||||
}
|
||||
|
||||
Bool WMNextHashEnumeratorItemAndKey(WMHashEnumerator * enumerator, void **item, void **key)
|
||||
{
|
||||
/* this assumes the table doesn't change between
|
||||
* WMEnumerateHashTable() and WMNextHashEnumeratorItemAndKey() calls */
|
||||
|
||||
if (enumerator->nextItem == NULL) {
|
||||
HashTable *table = enumerator->table;
|
||||
while (++enumerator->index < table->size) {
|
||||
if (table->table[enumerator->index] != NULL) {
|
||||
enumerator->nextItem = table->table[enumerator->index];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (enumerator->nextItem) {
|
||||
if (item)
|
||||
*item = (void *)((HashItem *) enumerator->nextItem)->data;
|
||||
if (key)
|
||||
*key = (void *)((HashItem *) enumerator->nextItem)->key;
|
||||
enumerator->nextItem = ((HashItem *) enumerator->nextItem)->next;
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
return False;
|
||||
}
|
||||
|
||||
static Bool compareStrings(const char *key1, const char *key2)
|
||||
{
|
||||
return strcmp(key1, key2) == 0;
|
||||
}
|
||||
|
||||
|
||||
typedef unsigned (*hashFunc) (const void *);
|
||||
typedef Bool(*isEqualFunc) (const void *, const void *);
|
||||
typedef void *(*retainFunc) (const void *);
|
||||
typedef void (*releaseFunc) (const void *);
|
||||
|
||||
|
||||
const WMHashTableCallbacks WMIntHashCallbacks = {
|
||||
NULL,
|
||||
NULL,
|
||||
@@ -392,15 +426,12 @@ const WMHashTableCallbacks WMStringHashCallbacks = {
|
||||
(hashFunc) hashString,
|
||||
(isEqualFunc) compareStrings,
|
||||
(retainFunc) wstrdup,
|
||||
(releaseFunc)free
|
||||
(releaseFunc) wfree
|
||||
};
|
||||
|
||||
|
||||
|
||||
const WMHashTableCallbacks WMStringPointerHashCallbacks = {
|
||||
(hashFunc) hashString,
|
||||
(isEqualFunc) compareStrings,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
316
WINGs/host.c
316
WINGs/host.c
@@ -1,316 +0,0 @@
|
||||
/*
|
||||
* WINGs WMHost function library
|
||||
*
|
||||
* Copyright (c) 1999-2000 Dan Pascu
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
|
||||
/* Tell stupid Solaris what's going on */
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE (-1)
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct W_Host {
|
||||
char *name;
|
||||
|
||||
WMBag *names;
|
||||
WMBag *addresses;
|
||||
|
||||
int refCount;
|
||||
} W_Host;
|
||||
|
||||
|
||||
static WMHashTable *hostCache = NULL;
|
||||
static Bool hostCacheEnabled = True;
|
||||
|
||||
|
||||
/* Max hostname length (RFC 1123) */
|
||||
#define W_MAXHOSTNAMELEN 255
|
||||
|
||||
|
||||
static WMHost*
|
||||
getHostFromCache(char *name)
|
||||
{
|
||||
if (!hostCache)
|
||||
return NULL;
|
||||
|
||||
return WMHashGet(hostCache, name);
|
||||
}
|
||||
|
||||
|
||||
static WMHost*
|
||||
getHostWithHostEntry(struct hostent *host, char *name)
|
||||
{
|
||||
WMHost *hPtr;
|
||||
struct in_addr in;
|
||||
int i;
|
||||
|
||||
hPtr = (WMHost*)wmalloc(sizeof(WMHost));
|
||||
memset(hPtr, 0, sizeof(WMHost));
|
||||
|
||||
hPtr->names = WMCreateBag(1);
|
||||
hPtr->addresses = WMCreateBag(1);
|
||||
|
||||
WMPutInBag(hPtr->names, wstrdup(host->h_name));
|
||||
|
||||
for (i=0; host->h_aliases[i]!=NULL; i++) {
|
||||
WMPutInBag(hPtr->names, wstrdup(host->h_aliases[i]));
|
||||
}
|
||||
|
||||
for (i=0; host->h_addr_list[i]!=NULL; i++) {
|
||||
memcpy((void*)&in.s_addr, (const void*)host->h_addr_list[i],
|
||||
host->h_length);
|
||||
WMPutInBag(hPtr->addresses, wstrdup(inet_ntoa(in)));
|
||||
}
|
||||
|
||||
hPtr->refCount = 1;
|
||||
|
||||
if (hostCacheEnabled) {
|
||||
if (!hostCache)
|
||||
hostCache = WMCreateHashTable(WMStringPointerHashCallbacks);
|
||||
hPtr->name = wstrdup(name);
|
||||
wassertr(WMHashInsert(hostCache, hPtr->name, hPtr)==NULL);
|
||||
hPtr->refCount++;
|
||||
}
|
||||
|
||||
return hPtr;
|
||||
}
|
||||
|
||||
|
||||
WMHost*
|
||||
WMGetCurrentHost()
|
||||
{
|
||||
char name[W_MAXHOSTNAMELEN+1];
|
||||
|
||||
if (gethostname(name, W_MAXHOSTNAMELEN) < 0) {
|
||||
wsyserror("Cannot get current host name");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
name[W_MAXHOSTNAMELEN] = '\0';
|
||||
|
||||
return WMGetHostWithName(name);
|
||||
}
|
||||
|
||||
|
||||
WMHost*
|
||||
WMGetHostWithName(char* name)
|
||||
{
|
||||
struct hostent *host;
|
||||
WMHost *hPtr;
|
||||
|
||||
if (name == NULL) {
|
||||
wwarning("NULL host name in 'WMGetHostWithName()'");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (hostCacheEnabled) {
|
||||
if ((hPtr = getHostFromCache(name)) != NULL) {
|
||||
WMRetainHost(hPtr);
|
||||
return hPtr;
|
||||
}
|
||||
}
|
||||
|
||||
host = gethostbyname(name);
|
||||
if (host == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hPtr = getHostWithHostEntry(host, name);
|
||||
|
||||
return hPtr;
|
||||
}
|
||||
|
||||
|
||||
WMHost*
|
||||
WMGetHostWithAddress(char* address)
|
||||
{
|
||||
struct hostent *host;
|
||||
struct in_addr in;
|
||||
WMHost *hPtr;
|
||||
|
||||
if (address == NULL) {
|
||||
wwarning("NULL address in 'WMGetHostWithAddress()'");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (hostCacheEnabled) {
|
||||
if ((hPtr = getHostFromCache(address)) != NULL) {
|
||||
WMRetainHost(hPtr);
|
||||
return hPtr;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef HAVE_INET_ATON
|
||||
if ((in.s_addr = inet_addr(address)) == INADDR_NONE)
|
||||
return NULL;
|
||||
#else
|
||||
if (inet_aton(address, &in.s_addr) == 0)
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
host = gethostbyaddr((char*)&in, sizeof(in), AF_INET);
|
||||
if (host == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hPtr = getHostWithHostEntry(host, address);
|
||||
|
||||
return hPtr;
|
||||
}
|
||||
|
||||
|
||||
WMHost*
|
||||
WMRetainHost(WMHost *hPtr)
|
||||
{
|
||||
hPtr->refCount++;
|
||||
return hPtr;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMReleaseHost(WMHost *hPtr)
|
||||
{
|
||||
int i;
|
||||
|
||||
hPtr->refCount--;
|
||||
|
||||
if (hPtr->refCount > 0)
|
||||
return;
|
||||
|
||||
for (i=0; i<WMGetBagItemCount(hPtr->names); i++)
|
||||
wfree(WMGetFromBag(hPtr->names, i));
|
||||
for (i=0; i<WMGetBagItemCount(hPtr->addresses); i++)
|
||||
wfree(WMGetFromBag(hPtr->addresses, i));
|
||||
|
||||
WMFreeBag(hPtr->names);
|
||||
WMFreeBag(hPtr->addresses);
|
||||
|
||||
if (hPtr->name) {
|
||||
WMHashRemove(hostCache, hPtr->name);
|
||||
wfree(hPtr->name);
|
||||
}
|
||||
|
||||
wfree(hPtr);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMSetHostCacheEnabled(Bool flag)
|
||||
{
|
||||
hostCacheEnabled = flag;
|
||||
}
|
||||
|
||||
|
||||
Bool
|
||||
WMIsHostCacheEnabled()
|
||||
{
|
||||
return hostCacheEnabled;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMFlushHostCache()
|
||||
{
|
||||
if (hostCache && WMCountHashTable(hostCache)>0) {
|
||||
WMBag *hostBag = WMCreateBag(WMCountHashTable(hostCache));
|
||||
WMHashEnumerator enumer = WMEnumerateHashTable(hostCache);
|
||||
WMHost *hPtr;
|
||||
int i;
|
||||
|
||||
while ((hPtr = WMNextHashEnumeratorItem(&enumer))) {
|
||||
/* we can't release the host here, because we can't change the
|
||||
* hash while using the enumerator functions. */
|
||||
WMPutInBag(hostBag, hPtr);
|
||||
}
|
||||
for (i=0; i<WMGetBagItemCount(hostBag); i++)
|
||||
WMReleaseHost(WMGetFromBag(hostBag, i));
|
||||
WMFreeBag(hostBag);
|
||||
WMResetHashTable(hostCache);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Bool
|
||||
WMIsHostEqualToHost(WMHost* hPtr, WMHost* aPtr)
|
||||
{
|
||||
int i, j;
|
||||
char *adr1, *adr2;
|
||||
|
||||
wassertrv(hPtr!=NULL && aPtr!=NULL, False);
|
||||
|
||||
if (hPtr == aPtr)
|
||||
return True;
|
||||
|
||||
for (i=0; i<WMGetBagItemCount(aPtr->addresses); i++) {
|
||||
adr1 = WMGetFromBag(aPtr->addresses, i);
|
||||
for (j=0; j<WMGetBagItemCount(hPtr->addresses); j++) {
|
||||
adr2 = WMGetFromBag(hPtr->addresses, j);
|
||||
if (strcmp(adr1, adr2)==0)
|
||||
return True;
|
||||
}
|
||||
}
|
||||
|
||||
return False;
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
WMGetHostName(WMHost *hPtr)
|
||||
{
|
||||
return (WMGetBagItemCount(hPtr->names) > 0 ?
|
||||
WMGetFromBag(hPtr->names, 0) : NULL);
|
||||
/*return WMGetFromBag(hPtr->names, 0);*/
|
||||
}
|
||||
|
||||
|
||||
WMBag*
|
||||
WMGetHostNames(WMHost *hPtr)
|
||||
{
|
||||
return hPtr->names;
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
WMGetHostAddress(WMHost *hPtr)
|
||||
{
|
||||
return (WMGetBagItemCount(hPtr->addresses) > 0 ?
|
||||
WMGetFromBag(hPtr->addresses, 0) : NULL);
|
||||
}
|
||||
|
||||
|
||||
WMBag*
|
||||
WMGetHostAddresses(WMHost *hPtr)
|
||||
{
|
||||
return hPtr->addresses;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include "WINGsP.h"
|
||||
|
||||
|
||||
void
|
||||
InitI18n(Display *dpy)
|
||||
{
|
||||
|
||||
}
|
||||
53
WINGs/make-rgb
Executable file
53
WINGs/make-rgb
Executable file
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import sys
|
||||
import re
|
||||
from optparse import OptionParser
|
||||
|
||||
parser = OptionParser(version="%prog 1.0")
|
||||
parser.add_option("-f", "--file", dest="rgbtxtFile", default='/etc/X11/rgb.txt',
|
||||
help="rgb.txt file containing X11 colors (/etc/X11/rgb.txt)",
|
||||
metavar="File")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
f = open(options.rgbtxtFile)
|
||||
lines = f.readlines()
|
||||
f.close()
|
||||
|
||||
colorLine = re.compile(r'''\s*
|
||||
(?P<red>\d+) # red
|
||||
\s+
|
||||
(?P<green>\d+) # green
|
||||
\s+
|
||||
(?P<blue>\d+) # blue
|
||||
\s+
|
||||
(?P<name>[^\s]+) # name
|
||||
''', re.VERBOSE)
|
||||
|
||||
print '''
|
||||
/* Automatically generated file. Do NOT edit. Regenerate it using make-rgb */
|
||||
|
||||
#ifndef RGB_H_
|
||||
#define RGB_H_
|
||||
|
||||
#include <wraster.h>
|
||||
|
||||
typedef struct RGBColor {
|
||||
RColor color;
|
||||
char *name;
|
||||
} RGBColor;
|
||||
|
||||
RGBColor rgbColors[] = {'''
|
||||
|
||||
for line in lines:
|
||||
m = colorLine.match(line)
|
||||
if m:
|
||||
print ''' {{%(red)3s, %(green)3s, %(blue)3s, 0}, "%(name)s"},''' % m.groupdict()
|
||||
|
||||
print ''' {{ 0, 0, 0, 0}, NULL}
|
||||
};
|
||||
|
||||
#endif
|
||||
'''
|
||||
|
||||
107
WINGs/memory.c
107
WINGs/memory.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Window Maker miscelaneous function library
|
||||
*
|
||||
* Copyright (c) 1997 Alfredo K. Kojima
|
||||
* Copyright (c) 1997-2003 Alfredo K. Kojima
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
@@ -18,9 +18,7 @@
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include "../src/config.h"
|
||||
|
||||
#include "wconfig.h"
|
||||
#include "WUtil.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
@@ -31,9 +29,12 @@
|
||||
#include <assert.h>
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef TEST_WITH_GC
|
||||
#ifdef USE_BOEHM_GC
|
||||
#ifndef GC_DEBUG
|
||||
#define GC_DEBUG
|
||||
#endif /* !GC_DEBUG */
|
||||
#include <gc/gc.h>
|
||||
#endif
|
||||
#endif /* USE_BOEHM_GC */
|
||||
|
||||
#ifndef False
|
||||
# define False 0
|
||||
@@ -42,9 +43,7 @@
|
||||
# define True 1
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
defaultHandler(int bla)
|
||||
static void defaultHandler(int bla)
|
||||
{
|
||||
if (bla)
|
||||
kill(getpid(), SIGABRT);
|
||||
@@ -52,14 +51,11 @@ defaultHandler(int bla)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
static waborthandler *aborthandler = (waborthandler *) defaultHandler;
|
||||
|
||||
#define wAbort(a) (*aborthandler)(a)
|
||||
|
||||
|
||||
waborthandler*
|
||||
wsetabort(waborthandler *handler)
|
||||
waborthandler *wsetabort(waborthandler * handler)
|
||||
{
|
||||
waborthandler *old = aborthandler;
|
||||
|
||||
@@ -68,28 +64,26 @@ wsetabort(waborthandler *handler)
|
||||
return old;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int Aborting = 0; /* if we're in the middle of an emergency exit */
|
||||
|
||||
|
||||
static WMHashTable *table = NULL;
|
||||
|
||||
|
||||
void *wmalloc(size_t size)
|
||||
{
|
||||
void *tmp;
|
||||
|
||||
#ifdef TEST_WITH_GC
|
||||
tmp = GC_malloc(size);
|
||||
assert(size > 0);
|
||||
|
||||
#ifdef USE_BOEHM_GC
|
||||
tmp = GC_MALLOC(size);
|
||||
#else
|
||||
tmp = malloc(size);
|
||||
#endif
|
||||
if (tmp == NULL) {
|
||||
wwarning("malloc() failed. Retrying after 2s.");
|
||||
sleep(2);
|
||||
#ifdef TEST_WITH_GC
|
||||
tmp = GC_malloc(size);
|
||||
#ifdef USE_BOEHM_GC
|
||||
tmp = GC_MALLOC(size);
|
||||
#else
|
||||
tmp = malloc(size);
|
||||
#endif
|
||||
@@ -104,10 +98,10 @@ void *wmalloc(size_t size)
|
||||
}
|
||||
}
|
||||
}
|
||||
memset(tmp, 0, size);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
void *wrealloc(void *ptr, size_t newsize)
|
||||
{
|
||||
void *nptr;
|
||||
@@ -118,23 +112,22 @@ void *wrealloc(void *ptr, size_t newsize)
|
||||
wfree(ptr);
|
||||
nptr = NULL;
|
||||
} else {
|
||||
#ifdef TEST_WITH_GC
|
||||
nptr = GC_realloc(ptr, newsize);
|
||||
#ifdef USE_BOEHM_GC
|
||||
nptr = GC_REALLOC(ptr, newsize);
|
||||
#else
|
||||
nptr = realloc(ptr, newsize);
|
||||
#endif
|
||||
if (nptr == NULL) {
|
||||
wwarning("realloc() failed. Retrying after 2s.");
|
||||
sleep(2);
|
||||
#ifdef TEST_WITH_GC
|
||||
nptr = GC_realloc(ptr, newsize);
|
||||
#ifdef USE_BOEHM_GC
|
||||
nptr = GC_REALLOC(ptr, newsize);
|
||||
#else
|
||||
nptr = realloc(ptr, newsize);
|
||||
#endif
|
||||
if (nptr == NULL) {
|
||||
if (Aborting) {
|
||||
fputs("Really Bad Error: recursive realloc() failure.",
|
||||
stderr);
|
||||
fputs("Really Bad Error: recursive realloc() failure.", stderr);
|
||||
exit(-1);
|
||||
} else {
|
||||
wfatal("virtual memory exhausted");
|
||||
@@ -147,9 +140,7 @@ void *wrealloc(void *ptr, size_t newsize)
|
||||
return nptr;
|
||||
}
|
||||
|
||||
|
||||
void*
|
||||
wretain(void *ptr)
|
||||
void *wretain(void *ptr)
|
||||
{
|
||||
int *refcount;
|
||||
|
||||
@@ -175,22 +166,28 @@ wretain(void *ptr)
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
wfree(void *ptr)
|
||||
void wfree(void *ptr)
|
||||
{
|
||||
#ifdef TEST_WITH_GC
|
||||
GC_free(ptr);
|
||||
if (ptr)
|
||||
#ifdef USE_BOEHM_GC
|
||||
/* This should eventually be removed, once the criss-cross
|
||||
* of wmalloc()d memory being free()d, malloc()d memory being
|
||||
* wfree()d, various misuses of calling wfree() on objects
|
||||
* allocated by libc malloc() and calling libc free() on
|
||||
* objects allocated by Boehm GC (think external libraries)
|
||||
* is cleaned up.
|
||||
*/
|
||||
if (GC_base(ptr) != 0)
|
||||
GC_FREE(ptr);
|
||||
else
|
||||
free(ptr);
|
||||
#else
|
||||
free(ptr);
|
||||
#endif
|
||||
ptr = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
wrelease(void *ptr)
|
||||
void wrelease(void *ptr)
|
||||
{
|
||||
int *refcount;
|
||||
|
||||
@@ -214,31 +211,3 @@ wrelease(void *ptr)
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
wstrdup(char *str)
|
||||
{
|
||||
assert(str!=NULL);
|
||||
|
||||
return strcpy(wmalloc(strlen(str)+1), str);
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
wstrappend(char *dst, char *src)
|
||||
{
|
||||
char *str;
|
||||
|
||||
if (!dst)
|
||||
return wstrdup(src);
|
||||
else if (!src)
|
||||
return wstrdup(dst);
|
||||
|
||||
str = wmalloc(strlen(dst)+strlen(src)+1);
|
||||
strcpy(str, dst);
|
||||
strcat(str, src);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
14
WINGs/misc.c
Normal file
14
WINGs/misc.c
Normal file
@@ -0,0 +1,14 @@
|
||||
|
||||
/* Miscelaneous helper functions */
|
||||
|
||||
#include "WINGsP.h"
|
||||
|
||||
WMRange wmkrange(int start, int count)
|
||||
{
|
||||
WMRange range;
|
||||
|
||||
range.position = start;
|
||||
range.count = count;
|
||||
|
||||
return range;
|
||||
}
|
||||
227
WINGs/mywidget.c
227
WINGs/mywidget.c
@@ -1,227 +0,0 @@
|
||||
/*
|
||||
* Demo user widget for WINGs
|
||||
*
|
||||
* Author: Alfredo K. Kojima
|
||||
*
|
||||
* This file is in the public domain.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* Include the WINGs private data header.
|
||||
*
|
||||
*
|
||||
*/
|
||||
#include "WINGsP.h"
|
||||
|
||||
/*
|
||||
* Our public header.
|
||||
*/
|
||||
#include "mywidget.h"
|
||||
|
||||
/*
|
||||
* Define the widget "class"
|
||||
*/
|
||||
typedef struct W_MyWidget {
|
||||
/* these two fields must be present in all your widgets in this
|
||||
* exact position */
|
||||
W_Class widgetClass;
|
||||
WMView *view;
|
||||
|
||||
/* put your stuff here */
|
||||
char *text;
|
||||
|
||||
} _MyWidget;
|
||||
|
||||
|
||||
|
||||
|
||||
/* some forward declarations */
|
||||
|
||||
static void destroyMyWidget(_MyWidget *mPtr);
|
||||
static void paintMyWidget(_MyWidget *mPtr);
|
||||
|
||||
|
||||
static void handleEvents(XEvent *event, void *data);
|
||||
static void handleActionEvents(XEvent *event, void *data);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Delegates
|
||||
* See the source for the other widgets to see how to use.
|
||||
* You won't need to use this most of the time.
|
||||
*/
|
||||
static W_ViewDelegate _MyWidgetDelegate = {
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
/* our widget class ID */
|
||||
static W_Class myWidgetClass = 0;
|
||||
|
||||
|
||||
/*
|
||||
* Initializer for our widget. Must be called before creating any
|
||||
* instances of the widget.
|
||||
*/
|
||||
W_Class
|
||||
InitMyWidget(WMScreen *scr)
|
||||
{
|
||||
/* register our widget with WINGs and get our widget class ID */
|
||||
if (!myWidgetClass) {
|
||||
myWidgetClass = W_RegisterUserWidget();
|
||||
}
|
||||
|
||||
return myWidgetClass;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Our widget fabrication plant.
|
||||
*/
|
||||
MyWidget*
|
||||
CreateMyWidget(WMWidget *parent)
|
||||
{
|
||||
MyWidget *mPtr;
|
||||
|
||||
/* allocate some storage for our new widget instance */
|
||||
mPtr = wmalloc(sizeof(MyWidget));
|
||||
/* initialize it */
|
||||
memset(mPtr, 0, sizeof(MyWidget));
|
||||
|
||||
/* set the class ID */
|
||||
mPtr->widgetClass = myWidgetClass;
|
||||
|
||||
/*
|
||||
* Create the view for our widget.
|
||||
* Note: the Window for the view is only created after the view is
|
||||
* realized with W_RealizeView()
|
||||
*
|
||||
* Consider the returned view as read-only.
|
||||
*/
|
||||
mPtr->view = W_CreateView(W_VIEW(parent));
|
||||
if (!mPtr->view) {
|
||||
wfree(mPtr);
|
||||
return NULL;
|
||||
}
|
||||
/* always do this */
|
||||
mPtr->view->self = mPtr;
|
||||
|
||||
/* setup the delegates for the view */
|
||||
mPtr->view->delegate = &_MyWidgetDelegate;
|
||||
|
||||
/*
|
||||
* Intercept some events for our widget, so that we can handle them.
|
||||
*/
|
||||
WMCreateEventHandler(mPtr->view, ExposureMask /* this allows us to know when we should paint */
|
||||
|StructureNotifyMask, /* this allows us to know things like when we are destroyed */
|
||||
handleEvents, mPtr);
|
||||
|
||||
/*
|
||||
* Intercept some other events. This could be merged with the above
|
||||
* call, but we separate for more organization.
|
||||
*/
|
||||
WMCreateEventHandler(mPtr->view, ButtonPressMask,handleActionEvents, mPtr);
|
||||
|
||||
return mPtr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Paint our widget contents.
|
||||
*/
|
||||
static void
|
||||
paintMyWidget(_MyWidget *mPtr)
|
||||
{
|
||||
W_Screen *scr = mPtr->view->screen;
|
||||
WMColor *color;
|
||||
|
||||
|
||||
if (mPtr->text) {
|
||||
|
||||
color = WMWhiteColor(scr);
|
||||
|
||||
W_PaintText(mPtr->view, mPtr->view->window, scr->normalFont, 0, 0,
|
||||
mPtr->view->size.width, WACenter, WMColorGC(color),
|
||||
False, mPtr->text, strlen(mPtr->text));
|
||||
|
||||
WMReleaseColor(color);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
handleEvents(XEvent *event, void *data)
|
||||
{
|
||||
_MyWidget *mPtr = (_MyWidget*)data;
|
||||
|
||||
|
||||
switch (event->type) {
|
||||
case Expose:
|
||||
if (event->xexpose.count!=0)
|
||||
break;
|
||||
paintMyWidget(mPtr);
|
||||
break;
|
||||
|
||||
case DestroyNotify:
|
||||
destroyMyWidget(mPtr);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
handleActionEvents(XEvent *event, void *data)
|
||||
{
|
||||
_MyWidget *mPtr = (_MyWidget*)data;
|
||||
|
||||
switch (event->type) {
|
||||
case ButtonPress:
|
||||
XBell(mPtr->view->screen->display, 100);
|
||||
XBell(mPtr->view->screen->display, 100);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SetMyWidgetText(MyWidget *mPtr, char *text)
|
||||
{
|
||||
CHECK_CLASS(mPtr, myWidgetClass);
|
||||
|
||||
if (mPtr->text)
|
||||
wfree(mPtr->text);
|
||||
|
||||
mPtr->text = wstrdup(text);
|
||||
|
||||
if (W_VIEW_MAPPED(mPtr->view)) {
|
||||
paintMyWidget(mPtr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
destroyMyWidget(_MyWidget *mPtr)
|
||||
{
|
||||
/*
|
||||
* Free all data we allocated for our widget.
|
||||
*/
|
||||
|
||||
if (mPtr->text)
|
||||
wfree(mPtr->text);
|
||||
|
||||
wfree(mPtr);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,58 +6,44 @@
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
|
||||
typedef struct W_Notification {
|
||||
char *name;
|
||||
const char *name;
|
||||
void *object;
|
||||
void *clientData;
|
||||
int refCount;
|
||||
} Notification;
|
||||
|
||||
|
||||
extern void W_FlushASAPNotificationQueue();
|
||||
|
||||
|
||||
char*
|
||||
WMGetNotificationName(WMNotification *notification)
|
||||
const char *WMGetNotificationName(WMNotification * notification)
|
||||
{
|
||||
return notification->name;
|
||||
}
|
||||
|
||||
|
||||
void*
|
||||
WMGetNotificationObject(WMNotification *notification)
|
||||
void *WMGetNotificationObject(WMNotification * notification)
|
||||
{
|
||||
return notification->object;
|
||||
}
|
||||
|
||||
|
||||
void*
|
||||
WMGetNotificationClientData(WMNotification *notification)
|
||||
void *WMGetNotificationClientData(WMNotification * notification)
|
||||
{
|
||||
return notification->clientData;
|
||||
}
|
||||
|
||||
|
||||
WMNotification*
|
||||
WMCreateNotification(char *name, void *object, void *clientData)
|
||||
WMNotification *WMCreateNotification(const char *name, void *object, void *clientData)
|
||||
{
|
||||
Notification *nPtr;
|
||||
|
||||
nPtr = wmalloc(sizeof(Notification));
|
||||
|
||||
nPtr->name = name;
|
||||
nPtr->object = object;
|
||||
nPtr->clientData = clientData;
|
||||
|
||||
nPtr->refCount = 1;
|
||||
|
||||
return nPtr;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMReleaseNotification(WMNotification *notification)
|
||||
void WMReleaseNotification(WMNotification * notification)
|
||||
{
|
||||
notification->refCount--;
|
||||
|
||||
@@ -66,23 +52,20 @@ WMReleaseNotification(WMNotification *notification)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
WMNotification*
|
||||
WMRetainNotification(WMNotification *notification)
|
||||
WMNotification *WMRetainNotification(WMNotification * notification)
|
||||
{
|
||||
notification->refCount++;
|
||||
|
||||
return notification;
|
||||
}
|
||||
|
||||
|
||||
/***************** Notification Center *****************/
|
||||
|
||||
typedef struct NotificationObserver {
|
||||
WMNotificationObserverAction *observerAction;
|
||||
void *observer;
|
||||
|
||||
char *name;
|
||||
const char *name;
|
||||
void *object;
|
||||
|
||||
struct NotificationObserver *prev; /* for tables */
|
||||
@@ -90,7 +73,6 @@ typedef struct NotificationObserver {
|
||||
struct NotificationObserver *nextAction; /* for observerTable */
|
||||
} NotificationObserver;
|
||||
|
||||
|
||||
typedef struct W_NotificationCenter {
|
||||
WMHashTable *nameTable; /* names -> observer lists */
|
||||
WMHashTable *objectTable; /* object -> observer lists */
|
||||
@@ -99,27 +81,21 @@ typedef struct W_NotificationCenter {
|
||||
WMHashTable *observerTable; /* observer -> NotificationObserver */
|
||||
} NotificationCenter;
|
||||
|
||||
|
||||
/* default (and only) center */
|
||||
static NotificationCenter *notificationCenter = NULL;
|
||||
|
||||
|
||||
void
|
||||
W_InitNotificationCenter(void)
|
||||
void W_InitNotificationCenter(void)
|
||||
{
|
||||
notificationCenter = wmalloc(sizeof(NotificationCenter));
|
||||
|
||||
notificationCenter->nameTable = WMCreateHashTable(WMStringPointerHashCallbacks);
|
||||
notificationCenter->objectTable = WMCreateHashTable(WMIntHashCallbacks);
|
||||
notificationCenter->nilList = NULL;
|
||||
|
||||
notificationCenter->observerTable = WMCreateHashTable(WMIntHashCallbacks);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMAddNotificationObserver(WMNotificationObserverAction * observerAction,
|
||||
void *observer, char *name, void *object)
|
||||
void *observer, const char *name, void *object)
|
||||
{
|
||||
NotificationObserver *oRec, *rec;
|
||||
|
||||
@@ -131,9 +107,8 @@ WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
|
||||
oRec->next = NULL;
|
||||
oRec->prev = NULL;
|
||||
|
||||
|
||||
/* put this action in the list of actions for this observer */
|
||||
rec = WMHashInsert(notificationCenter->observerTable, observer, oRec);
|
||||
rec = (NotificationObserver *) WMHashInsert(notificationCenter->observerTable, observer, oRec);
|
||||
|
||||
if (rec) {
|
||||
/* if this is not the first action for the observer */
|
||||
@@ -151,14 +126,14 @@ WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
|
||||
notificationCenter->nilList = oRec;
|
||||
} else if (!name) {
|
||||
/* any message coming from object */
|
||||
rec = WMHashInsert(notificationCenter->objectTable, object, oRec);
|
||||
rec = (NotificationObserver *) WMHashInsert(notificationCenter->objectTable, object, oRec);
|
||||
oRec->next = rec;
|
||||
if (rec) {
|
||||
rec->prev = oRec;
|
||||
}
|
||||
} else {
|
||||
/* name && (object || !object) */
|
||||
rec = WMHashInsert(notificationCenter->nameTable, name, oRec);
|
||||
rec = (NotificationObserver *) WMHashInsert(notificationCenter->nameTable, name, oRec);
|
||||
oRec->next = rec;
|
||||
if (rec) {
|
||||
rec->prev = oRec;
|
||||
@@ -166,22 +141,19 @@ WMAddNotificationObserver(WMNotificationObserverAction *observerAction,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMPostNotification(WMNotification *notification)
|
||||
void WMPostNotification(WMNotification * notification)
|
||||
{
|
||||
NotificationObserver *orec, *tmp;
|
||||
|
||||
WMRetainNotification(notification);
|
||||
|
||||
/* tell the observers that want to know about a particular message */
|
||||
orec = WMHashGet(notificationCenter->nameTable, notification->name);
|
||||
orec = (NotificationObserver *) WMHashGet(notificationCenter->nameTable, notification->name);
|
||||
|
||||
while (orec) {
|
||||
tmp = orec->next;
|
||||
|
||||
if (!orec->object || !notification->object
|
||||
|| orec->object == notification->object) {
|
||||
if (!orec->object || !notification->object || orec->object == notification->object) {
|
||||
/* tell the observer */
|
||||
if (orec->observerAction) {
|
||||
(*orec->observerAction) (orec->observer, notification);
|
||||
@@ -192,7 +164,7 @@ WMPostNotification(WMNotification *notification)
|
||||
}
|
||||
|
||||
/* tell the observers that want to know about an object */
|
||||
orec = WMHashGet(notificationCenter->objectTable, notification->object);
|
||||
orec = (NotificationObserver *) WMHashGet(notificationCenter->objectTable, notification->object);
|
||||
|
||||
while (orec) {
|
||||
tmp = orec->next;
|
||||
@@ -219,14 +191,12 @@ WMPostNotification(WMNotification *notification)
|
||||
WMReleaseNotification(notification);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMRemoveNotificationObserver(void *observer)
|
||||
void WMRemoveNotificationObserver(void *observer)
|
||||
{
|
||||
NotificationObserver *orec, *tmp, *rec;
|
||||
|
||||
/* get the list of actions the observer is doing */
|
||||
orec = WMHashGet(notificationCenter->observerTable, observer);
|
||||
orec = (NotificationObserver *) WMHashGet(notificationCenter->observerTable, observer);
|
||||
|
||||
/*
|
||||
* FOREACH orec IN actionlist for observer
|
||||
@@ -244,24 +214,22 @@ WMRemoveNotificationObserver(void *observer)
|
||||
notificationCenter->nilList = orec->next;
|
||||
} else if (!orec->name) {
|
||||
/* any message coming from object */
|
||||
rec = WMHashGet(notificationCenter->objectTable, orec->object);
|
||||
rec = (NotificationObserver *) WMHashGet(notificationCenter->objectTable, orec->object);
|
||||
if (rec == orec) {
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->objectTable, orec->object,
|
||||
orec->next);
|
||||
WMHashInsert(notificationCenter->objectTable, orec->object, orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->objectTable, orec->object);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* name && (object || !object) */
|
||||
rec = WMHashGet(notificationCenter->nameTable, orec->name);
|
||||
rec = (NotificationObserver *) WMHashGet(notificationCenter->nameTable, orec->name);
|
||||
if (rec == orec) {
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->nameTable, orec->name,
|
||||
orec->next);
|
||||
WMHashInsert(notificationCenter->nameTable, orec->name, orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->nameTable, orec->name);
|
||||
}
|
||||
@@ -280,15 +248,13 @@ WMRemoveNotificationObserver(void *observer)
|
||||
WMHashRemove(notificationCenter->observerTable, observer);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMRemoveNotificationObserverWithName(void *observer, char *name, void *object)
|
||||
void WMRemoveNotificationObserverWithName(void *observer, const char *name, void *object)
|
||||
{
|
||||
NotificationObserver *orec, *tmp, *rec;
|
||||
NotificationObserver *newList = NULL;
|
||||
|
||||
/* get the list of actions the observer is doing */
|
||||
orec = WMHashGet(notificationCenter->observerTable, observer);
|
||||
orec = (NotificationObserver *) WMHashGet(notificationCenter->observerTable, observer);
|
||||
|
||||
WMHashRemove(notificationCenter->observerTable, observer);
|
||||
|
||||
@@ -301,7 +267,9 @@ WMRemoveNotificationObserverWithName(void *observer, char *name, void *object)
|
||||
if (notificationCenter->nilList == orec)
|
||||
notificationCenter->nilList = orec->next;
|
||||
} else if (!name) {
|
||||
rec = WMHashGet(notificationCenter->objectTable, orec->object);
|
||||
rec =
|
||||
(NotificationObserver *) WMHashGet(notificationCenter->objectTable,
|
||||
orec->object);
|
||||
if (rec == orec) {
|
||||
assert(rec->prev == NULL);
|
||||
/* replace table entry */
|
||||
@@ -309,12 +277,12 @@ WMRemoveNotificationObserverWithName(void *observer, char *name, void *object)
|
||||
WMHashInsert(notificationCenter->objectTable,
|
||||
orec->object, orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->objectTable,
|
||||
orec->object);
|
||||
WMHashRemove(notificationCenter->objectTable, orec->object);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
rec = WMHashGet(notificationCenter->nameTable, orec->name);
|
||||
rec = (NotificationObserver *) WMHashGet(notificationCenter->nameTable,
|
||||
orec->name);
|
||||
if (rec == orec) {
|
||||
assert(rec->prev == NULL);
|
||||
/* replace table entry */
|
||||
@@ -322,8 +290,7 @@ WMRemoveNotificationObserverWithName(void *observer, char *name, void *object)
|
||||
WMHashInsert(notificationCenter->nameTable,
|
||||
orec->name, orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->nameTable,
|
||||
orec->name);
|
||||
WMHashRemove(notificationCenter->nameTable, orec->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -357,9 +324,7 @@ WMRemoveNotificationObserverWithName(void *observer, char *name, void *object)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMPostNotificationName(char *name, void *object, void *clientData)
|
||||
void WMPostNotificationName(const char *name, void *object, void *clientData)
|
||||
{
|
||||
WMNotification *notification;
|
||||
|
||||
@@ -370,27 +335,21 @@ WMPostNotificationName(char *name, void *object, void *clientData)
|
||||
WMReleaseNotification(notification);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**************** Notification Queues ****************/
|
||||
|
||||
|
||||
typedef struct W_NotificationQueue {
|
||||
WMBag *asapQueue;
|
||||
WMBag *idleQueue;
|
||||
WMArray *asapQueue;
|
||||
WMArray *idleQueue;
|
||||
|
||||
struct W_NotificationQueue *next;
|
||||
} NotificationQueue;
|
||||
|
||||
|
||||
static WMNotificationQueue *notificationQueueList = NULL;
|
||||
|
||||
/* default queue */
|
||||
static WMNotificationQueue *notificationQueue = NULL;
|
||||
|
||||
|
||||
WMNotificationQueue*
|
||||
WMGetDefaultNotificationQueue(void)
|
||||
WMNotificationQueue *WMGetDefaultNotificationQueue(void)
|
||||
{
|
||||
if (!notificationQueue)
|
||||
notificationQueue = WMCreateNotificationQueue();
|
||||
@@ -398,16 +357,13 @@ WMGetDefaultNotificationQueue(void)
|
||||
return notificationQueue;
|
||||
}
|
||||
|
||||
|
||||
WMNotificationQueue*
|
||||
WMCreateNotificationQueue(void)
|
||||
WMNotificationQueue *WMCreateNotificationQueue(void)
|
||||
{
|
||||
NotificationQueue *queue;
|
||||
|
||||
queue = wmalloc(sizeof(NotificationQueue));
|
||||
|
||||
queue->asapQueue = WMCreateBag(8);
|
||||
queue->idleQueue = WMCreateBag(8);
|
||||
queue->asapQueue = WMCreateArrayWithDestructor(8, (WMFreeDataProc *) WMReleaseNotification);
|
||||
queue->idleQueue = WMCreateArrayWithDestructor(8, (WMFreeDataProc *) WMReleaseNotification);
|
||||
queue->next = notificationQueueList;
|
||||
|
||||
notificationQueueList = queue;
|
||||
@@ -415,81 +371,52 @@ WMCreateNotificationQueue(void)
|
||||
return queue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
WMEnqueueNotification(WMNotificationQueue *queue, WMNotification *notification,
|
||||
WMPostingStyle postingStyle)
|
||||
void WMEnqueueNotification(WMNotificationQueue * queue, WMNotification * notification, WMPostingStyle postingStyle)
|
||||
{
|
||||
WMEnqueueCoalesceNotification(queue, notification, postingStyle,
|
||||
WNCOnName|WNCOnSender);
|
||||
WMEnqueueCoalesceNotification(queue, notification, postingStyle, WNCOnName | WNCOnSender);
|
||||
}
|
||||
|
||||
#define NOTIF ((WMNotification*)cdata)
|
||||
#define ITEM ((WMNotification*)item)
|
||||
|
||||
|
||||
void
|
||||
WMDequeueNotificationMatching(WMNotificationQueue *queue,
|
||||
WMNotification *notification, unsigned mask)
|
||||
static int matchSenderAndName(const void *item, const void *cdata)
|
||||
{
|
||||
WMBagIterator i;
|
||||
WMNotification *tmp;
|
||||
|
||||
if ((mask & WNCOnName) && (mask & WNCOnSender)) {
|
||||
WM_ITERATE_BAG(queue->asapQueue, tmp, i) {
|
||||
if (notification->object == tmp->object &&
|
||||
strcmp(notification->name, tmp->name) == 0) {
|
||||
WMRemoveFromBag(queue->asapQueue, tmp);
|
||||
WMReleaseNotification(tmp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
WM_ITERATE_BAG(queue->idleQueue, tmp, i) {
|
||||
if (notification->object == tmp->object &&
|
||||
strcmp(notification->name, tmp->name) == 0) {
|
||||
WMRemoveFromBag(queue->idleQueue, tmp);
|
||||
WMReleaseNotification(tmp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (mask & WNCOnName) {
|
||||
WM_ITERATE_BAG(queue->asapQueue, tmp, i) {
|
||||
if (strcmp(notification->name, tmp->name) == 0) {
|
||||
WMRemoveFromBag(queue->asapQueue, tmp);
|
||||
WMReleaseNotification(tmp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
WM_ITERATE_BAG(queue->idleQueue, tmp, i) {
|
||||
if (strcmp(notification->name, tmp->name) == 0) {
|
||||
WMRemoveFromBag(queue->idleQueue, tmp);
|
||||
WMReleaseNotification(tmp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (mask & WNCOnSender) {
|
||||
WM_ITERATE_BAG(queue->asapQueue, tmp, i) {
|
||||
if (notification->object == tmp->object) {
|
||||
WMRemoveFromBag(queue->asapQueue, tmp);
|
||||
WMReleaseNotification(tmp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
WM_ITERATE_BAG(queue->idleQueue, tmp, i) {
|
||||
if (notification->object == tmp->object) {
|
||||
WMRemoveFromBag(queue->idleQueue, tmp);
|
||||
WMReleaseNotification(tmp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return (NOTIF->object == ITEM->object && strcmp(NOTIF->name, ITEM->name) == 0);
|
||||
}
|
||||
|
||||
static int matchSender(const void *item, const void *cdata)
|
||||
{
|
||||
return (NOTIF->object == ITEM->object);
|
||||
}
|
||||
|
||||
static int matchName(const void *item, const void *cdata)
|
||||
{
|
||||
return (strcmp(NOTIF->name, ITEM->name) == 0);
|
||||
}
|
||||
|
||||
#undef NOTIF
|
||||
#undef ITEM
|
||||
|
||||
void WMDequeueNotificationMatching(WMNotificationQueue * queue, WMNotification * notification, unsigned mask)
|
||||
{
|
||||
WMMatchDataProc *matchFunc;
|
||||
|
||||
if ((mask & WNCOnName) && (mask & WNCOnSender))
|
||||
matchFunc = matchSenderAndName;
|
||||
else if (mask & WNCOnName)
|
||||
matchFunc = matchName;
|
||||
else if (mask & WNCOnSender)
|
||||
matchFunc = matchSender;
|
||||
else
|
||||
return;
|
||||
|
||||
WMRemoveFromArrayMatching(queue->asapQueue, matchFunc, notification);
|
||||
WMRemoveFromArrayMatching(queue->idleQueue, matchFunc, notification);
|
||||
}
|
||||
|
||||
void
|
||||
WMEnqueueCoalesceNotification(WMNotificationQueue * queue,
|
||||
WMNotification *notification,
|
||||
WMPostingStyle postingStyle,
|
||||
unsigned coalesceMask)
|
||||
WMNotification * notification, WMPostingStyle postingStyle, unsigned coalesceMask)
|
||||
{
|
||||
if (coalesceMask != WNCNone)
|
||||
WMDequeueNotificationMatching(queue, notification, coalesceMask);
|
||||
@@ -501,50 +428,39 @@ WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
|
||||
break;
|
||||
|
||||
case WMPostASAP:
|
||||
WMPutInBag(queue->asapQueue, notification);
|
||||
WMAddToArray(queue->asapQueue, notification);
|
||||
break;
|
||||
|
||||
case WMPostWhenIdle:
|
||||
WMPutInBag(queue->idleQueue, notification);
|
||||
WMAddToArray(queue->idleQueue, notification);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
W_FlushASAPNotificationQueue()
|
||||
void W_FlushASAPNotificationQueue()
|
||||
{
|
||||
WMNotificationQueue *queue = notificationQueueList;
|
||||
|
||||
while (queue) {
|
||||
while (WMGetBagItemCount(queue->asapQueue)) {
|
||||
WMNotification *tmp = WMGetFromBag(queue->asapQueue, 0);
|
||||
|
||||
WMPostNotification(tmp);
|
||||
WMReleaseNotification(tmp);
|
||||
WMDeleteFromBag(queue->asapQueue, 0);
|
||||
while (WMGetArrayItemCount(queue->asapQueue)) {
|
||||
WMPostNotification(WMGetFromArray(queue->asapQueue, 0));
|
||||
WMDeleteFromArray(queue->asapQueue, 0);
|
||||
}
|
||||
|
||||
queue = queue->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
W_FlushIdleNotificationQueue()
|
||||
void W_FlushIdleNotificationQueue()
|
||||
{
|
||||
WMNotificationQueue *queue = notificationQueueList;
|
||||
|
||||
while (queue) {
|
||||
while (WMGetBagItemCount(queue->idleQueue)) {
|
||||
WMNotification *tmp = WMGetFromBag(queue->idleQueue, 0);
|
||||
|
||||
WMPostNotification(tmp);
|
||||
WMReleaseNotification(tmp);
|
||||
WMDeleteFromBag(queue->idleQueue, 0);
|
||||
while (WMGetArrayItemCount(queue->idleQueue)) {
|
||||
WMPostNotification(WMGetFromArray(queue->idleQueue, 0));
|
||||
WMDeleteFromArray(queue->idleQueue, 0);
|
||||
}
|
||||
|
||||
queue = queue->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
50
WINGs/po/Makefile.am
Normal file
50
WINGs/po/Makefile.am
Normal file
@@ -0,0 +1,50 @@
|
||||
nlsdir = $(NLSDIR)
|
||||
|
||||
CATALOGS = @WINGSMOFILES@
|
||||
|
||||
CLEANFILES = $(CATALOGS) WINGs.pot
|
||||
|
||||
EXTRA_DIST = bg.po ca.po cs.po de.po fr.po sk.po
|
||||
|
||||
POTFILES = \
|
||||
$(top_builddir)/WINGs/error.c \
|
||||
$(top_builddir)/WINGs/findfile.c \
|
||||
$(top_builddir)/WINGs/proplist.c \
|
||||
$(top_builddir)/WINGs/userdefaults.c \
|
||||
$(top_builddir)/WINGs/wcolor.c \
|
||||
$(top_builddir)/WINGs/wcolorpanel.c \
|
||||
$(top_builddir)/WINGs/wfilepanel.c \
|
||||
$(top_builddir)/WINGs/wfont.c \
|
||||
$(top_builddir)/WINGs/wfontpanel.c \
|
||||
$(top_builddir)/WINGs/widgets.c \
|
||||
$(top_builddir)/WINGs/wruler.c
|
||||
|
||||
SUFFIXES = .po .mo
|
||||
|
||||
.po.mo:
|
||||
msgfmt -c -o $@ $<
|
||||
|
||||
|
||||
all-local: $(CATALOGS)
|
||||
|
||||
WINGs.pot: $(POTFILES)
|
||||
xgettext --default-domain=WINGs \
|
||||
--add-comments --keyword=_ --keyword=N_ $(POTFILES)
|
||||
if cmp -s WINGs.po WINGs.pot; then \
|
||||
rm -f WINGs.po; \
|
||||
else \
|
||||
mv -f WINGs.po WINGs.pot; \
|
||||
fi
|
||||
|
||||
install-data-local: $(CATALOGS)
|
||||
$(mkinstalldirs) $(DESTDIR)$(nlsdir)
|
||||
chmod 755 $(DESTDIR)$(nlsdir)
|
||||
for n in $(CATALOGS) __DuMmY ; do \
|
||||
if test "$$n" -a "$$n" != "__DuMmY" ; then \
|
||||
l=`basename $$n .mo`; \
|
||||
$(mkinstalldirs) $(DESTDIR)$(nlsdir)/$$l/LC_MESSAGES; \
|
||||
chmod 755 $(DESTDIR)$(nlsdir)/$$l; \
|
||||
chmod 755 $(DESTDIR)$(nlsdir)/$$l/LC_MESSAGES; \
|
||||
$(INSTALL_DATA) -m 644 $$n $(DESTDIR)$(nlsdir)/$$l/LC_MESSAGES/WINGs.mo; \
|
||||
fi; \
|
||||
done
|
||||
19
WINGs/po/README
Normal file
19
WINGs/po/README
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
Instructions for translating po files can be found in the po/README directory
|
||||
in the top of the WindowMaker source tree.
|
||||
|
||||
All files are in UTF-8
|
||||
|
||||
File Language Note Current Maintainer
|
||||
------------------------------------------------------------------------------
|
||||
ca.po Catalan Ernest Adrogué <eadrogue@gmx.net>
|
||||
cs.po Czech Jiri Hnidek <Jiri.Hnidek@vslib.cz
|
||||
de.po German Guido Scholz <guido.scholz@bayernline.de>
|
||||
fr.po French Emmanuel Benoit <tseeker@neptune.fr>
|
||||
Antoine Hulin <antoine@origan.fdn.org>
|
||||
sk.po Slovak Jan 'judas' Tomka <judas@linux.sk>
|
||||
bg.po Bulgarian Anton Zinoviev <zinoviev@debian.org>
|
||||
|
||||
Notes
|
||||
-----
|
||||
|
||||
660
WINGs/po/bg.po
Normal file
660
WINGs/po/bg.po
Normal file
@@ -0,0 +1,660 @@
|
||||
# Message catalog for WINGs
|
||||
# Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
# Anton Zinoviev <zinoviev@debian.org>, 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WINGs 0.80.0\n"
|
||||
"POT-Creation-Date: 2003-02-08 21:42+0200\n"
|
||||
"PO-Revision-Date: 2003-02-09 12:10+0200\n"
|
||||
"Last-Translator: Anton Zinoviev <zinoviev@debian.org>\n"
|
||||
"Language-Team: Bulgarian <dict@linux.zonebg.com>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../../WINGs/connection.c:461 ../../WINGs/connection.c:526
|
||||
#: ../../WINGs/connection.c:569
|
||||
msgid "Bad address-service-protocol combination"
|
||||
msgstr "Неправилна комбинация адрес-услуга-протокол"
|
||||
|
||||
#: ../../WINGs/error.c:54
|
||||
#, c-format
|
||||
msgid "Unknown error %d"
|
||||
msgstr "Непозната грешка %d"
|
||||
|
||||
#: ../../WINGs/error.c:59
|
||||
#, c-format
|
||||
msgid "Error %d"
|
||||
msgstr "Грешка %d"
|
||||
|
||||
#: ../../WINGs/error.c:110
|
||||
msgid " warning: "
|
||||
msgstr "внимание: "
|
||||
|
||||
#: ../../WINGs/error.c:137
|
||||
msgid " fatal error: "
|
||||
msgstr " критична грешка: "
|
||||
|
||||
#: ../../WINGs/error.c:163 ../../WINGs/error.c:192
|
||||
msgid " error: "
|
||||
msgstr " грешка: "
|
||||
|
||||
#: ../../WINGs/findfile.c:48
|
||||
#, c-format
|
||||
msgid "could not get password entry for UID %i"
|
||||
msgstr "не може да се получи записът за парола на потребител с номер %i"
|
||||
|
||||
#: ../../WINGs/findfile.c:66
|
||||
#, c-format
|
||||
msgid "could not get password entry for user %s"
|
||||
msgstr "не може да се получи записът за парола на потребител %s<"
|
||||
|
||||
#: ../../WINGs/host.c:114
|
||||
msgid "Cannot get current host name"
|
||||
msgstr "Не може да се получи името на хоста"
|
||||
|
||||
#: ../../WINGs/proplist.c:91
|
||||
#, c-format
|
||||
msgid "syntax error in %s %s, line %i: %s"
|
||||
msgstr "синтактична грешка в %s %s, ред %i: %s"
|
||||
|
||||
#: ../../WINGs/proplist.c:150
|
||||
msgid "Only string or data is supported for a proplist dictionary key"
|
||||
msgstr "Като ключ за достъп до proplist се поддържат само низове или данни"
|
||||
|
||||
#: ../../WINGs/proplist.c:184 ../../WINGs/proplist.c:236
|
||||
#: ../../WINGs/proplist.c:394 ../../WINGs/proplist.c:474
|
||||
#: ../../WINGs/proplist.c:1075 ../../WINGs/proplist.c:1127
|
||||
#: ../../WINGs/proplist.c:1293 ../../WINGs/proplist.c:1372
|
||||
#: ../../WINGs/proplist.c:1493 ../../WINGs/proplist.c:1540
|
||||
msgid "Used proplist functions on non-WMPropLists objects"
|
||||
msgstr "Ползват се proplist-функции за обекти, които не са от тип WMPropLists"
|
||||
|
||||
#: ../../WINGs/proplist.c:630
|
||||
msgid "unterminated PropList string"
|
||||
msgstr "незавършен низ PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:670
|
||||
msgid "unterminated PropList data"
|
||||
msgstr "незавършени данни PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:678
|
||||
msgid "unterminated PropList data (missing hexdigit)"
|
||||
msgstr "незавършени данни PropList (липсва шестнадесетично число)"
|
||||
|
||||
#: ../../WINGs/proplist.c:690 ../../WINGs/proplist.c:695
|
||||
msgid "non hexdigit character in PropList data"
|
||||
msgstr "знак, който не е шестнадесетично число, в данни PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:729
|
||||
msgid "unterminated PropList array"
|
||||
msgstr "незавършен масив PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:737
|
||||
msgid "missing or unterminated PropList array"
|
||||
msgstr "липсващ или незавършен масив Proplist"
|
||||
|
||||
#: ../../WINGs/proplist.c:747
|
||||
msgid "could not get PropList array element"
|
||||
msgstr "не може да се получи елемент от масив PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:776
|
||||
msgid "unterminated PropList dictionary"
|
||||
msgstr "незавършен речник PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:793
|
||||
msgid "missing PropList dictionary key"
|
||||
msgstr "липсващ ключ за достъп до PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:795
|
||||
msgid "missing PropList dictionary entry key or unterminated dictionary"
|
||||
msgstr "липсващ ключ за достъп до PropList или незавършен речник"
|
||||
|
||||
#: ../../WINGs/proplist.c:803
|
||||
msgid "error parsing PropList dictionary key"
|
||||
msgstr "грешка при разбор на ключ в PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:811
|
||||
msgid "missing = in PropList dictionary entry"
|
||||
msgstr "липсва знак за равенство в елемент на PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:819
|
||||
msgid "error parsing PropList dictionary entry value"
|
||||
msgstr "грешка при разбор на стойност на елемент в PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:827
|
||||
msgid "missing ; in PropList dictionary entry"
|
||||
msgstr "липсва знак точка и запетая в елемент на PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:888
|
||||
msgid ""
|
||||
"was expecting a string, data, array or dictionary. If it's a string, try "
|
||||
"enclosing it with \"."
|
||||
msgstr "очакваха се низ, данни, масив или речник. Ако е речник, пробвайте да го оградите с \"."
|
||||
|
||||
#: ../../WINGs/proplist.c:892
|
||||
msgid "Comments are not allowed inside WindowMaker owned domain files."
|
||||
msgstr "Не се позволяват коментари във файлове с области, собственост на Уиндоу Мейкър"
|
||||
|
||||
#: ../../WINGs/proplist.c:1563 ../../WINGs/proplist.c:1628
|
||||
msgid "extra data after end of property list"
|
||||
msgstr "данни в повече след края на списък свойства"
|
||||
|
||||
#: ../../WINGs/proplist.c:1606
|
||||
#, c-format
|
||||
msgid "could not get size for file '%s'"
|
||||
msgstr "не може да се получи размерът за файл \"%s\""
|
||||
|
||||
#: ../../WINGs/proplist.c:1618
|
||||
#, c-format
|
||||
msgid "error reading from file '%s'"
|
||||
msgstr "грешка при четене от файл \"%s\""
|
||||
|
||||
#: ../../WINGs/proplist.c:1669
|
||||
#, c-format
|
||||
msgid "mkstemp (%s) failed"
|
||||
msgstr "mkstemp (%s) не успя"
|
||||
|
||||
#: ../../WINGs/proplist.c:1680
|
||||
#, c-format
|
||||
msgid "mktemp (%s) failed"
|
||||
msgstr "mktemp (%s) не успя"
|
||||
|
||||
#: ../../WINGs/proplist.c:1691
|
||||
#, c-format
|
||||
msgid "open (%s) failed"
|
||||
msgstr "open (%s) не успя"
|
||||
|
||||
#: ../../WINGs/proplist.c:1698
|
||||
#, c-format
|
||||
msgid "writing to file: %s failed"
|
||||
msgstr "записът във файл %s не успя"
|
||||
|
||||
#: ../../WINGs/proplist.c:1706
|
||||
#, c-format
|
||||
msgid "fclose (%s) failed"
|
||||
msgstr "fclose (%s) не успя"
|
||||
|
||||
#: ../../WINGs/proplist.c:1715
|
||||
#, c-format
|
||||
msgid "rename ('%s' to '%s') failed"
|
||||
msgstr "преименуването (от \"%s\" на \"%s\") не успя"
|
||||
|
||||
#. something happened with the file. just overwrite it
|
||||
#: ../../WINGs/userdefaults.c:192 ../../WINGs/userdefaults.c:208
|
||||
#, c-format
|
||||
msgid "cannot read domain from file '%s' when syncing"
|
||||
msgstr "не може да се прочете областта от файл \"%s\" при синхронизиране"
|
||||
|
||||
#: ../../WINGs/wcolor.c:198 ../../WINGs/wcolor.c:211 ../../WINGs/wcolor.c:250
|
||||
#: ../../WINGs/wcolor.c:291
|
||||
#, c-format
|
||||
msgid "could not allocate %s color"
|
||||
msgstr "не може да се задели цвят %s"
|
||||
|
||||
#: ../../WINGs/wcolor.c:198
|
||||
msgid "white"
|
||||
msgstr "бял"
|
||||
|
||||
#: ../../WINGs/wcolor.c:211
|
||||
msgid "black"
|
||||
msgstr "черен"
|
||||
|
||||
#: ../../WINGs/wcolor.c:250
|
||||
msgid "gray"
|
||||
msgstr "сив"
|
||||
|
||||
#: ../../WINGs/wcolor.c:291
|
||||
msgid "dark gray"
|
||||
msgstr "тъмносив"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:415
|
||||
msgid "Colors"
|
||||
msgstr "Цветове"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:605 ../../WINGs/wcolorpanel.c:2824
|
||||
msgid "Brightness"
|
||||
msgstr "Яркост"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:607 ../../WINGs/wcolorpanel.c:683
|
||||
#: ../../WINGs/wcolorpanel.c:716 ../../WINGs/wcolorpanel.c:750
|
||||
#: ../../WINGs/wcolorpanel.c:810 ../../WINGs/wcolorpanel.c:844
|
||||
#: ../../WINGs/wcolorpanel.c:878 ../../WINGs/wcolorpanel.c:913
|
||||
#: ../../WINGs/wcolorpanel.c:2164 ../../WINGs/wcolorpanel.c:2826
|
||||
#: ../../WINGs/wcolorpanel.c:2862 ../../WINGs/wcolorpanel.c:2898
|
||||
#: ../../WINGs/wcolorpanel.c:3746
|
||||
msgid "Color Panel: Could not allocate memory"
|
||||
msgstr "Color Panel: не може да се задели памет"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:680 ../../WINGs/wcolorpanel.c:681
|
||||
msgid "Red"
|
||||
msgstr "Червен"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:713 ../../WINGs/wcolorpanel.c:714
|
||||
msgid "Green"
|
||||
msgstr "Зелен"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:747 ../../WINGs/wcolorpanel.c:748
|
||||
msgid "Blue"
|
||||
msgstr "Син"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:807 ../../WINGs/wcolorpanel.c:808
|
||||
msgid "Cyan"
|
||||
msgstr "Синьозелен"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:841 ../../WINGs/wcolorpanel.c:842
|
||||
msgid "Magenta"
|
||||
msgstr "Пурпурен"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:875 ../../WINGs/wcolorpanel.c:876
|
||||
msgid "Yellow"
|
||||
msgstr "Жълт"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:910 ../../WINGs/wcolorpanel.c:911
|
||||
msgid "Black"
|
||||
msgstr "Черен"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:991
|
||||
msgid "Spectrum"
|
||||
msgstr "Спектър"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1021
|
||||
msgid "Palette"
|
||||
msgstr "Палитра"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1027
|
||||
msgid "New from File..."
|
||||
msgstr "Нова от файл..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1028 ../../WINGs/wcolorpanel.c:1076
|
||||
#: ../../WINGs/wcolorpanel.c:1093
|
||||
msgid "Rename..."
|
||||
msgstr "Преименувай..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1029 ../../WINGs/wcolorpanel.c:1077
|
||||
#: ../../WINGs/wcolorpanel.c:1094 ../../WINGs/wcolorpanel.c:3321
|
||||
msgid "Remove"
|
||||
msgstr "Премахни"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1030
|
||||
msgid "Copy"
|
||||
msgstr "Копирай"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1031
|
||||
#, fuzzy
|
||||
msgid "New from Clipboard"
|
||||
msgstr "Нова от Clipboard"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1052
|
||||
msgid "X11-Colors"
|
||||
msgstr "Цветове от X11"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1069
|
||||
msgid "Color"
|
||||
msgstr "Цвят"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1075
|
||||
msgid "Add..."
|
||||
msgstr "Добави..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1085
|
||||
msgid "List"
|
||||
msgstr "Списък"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1092
|
||||
msgid "New..."
|
||||
msgstr "Нов..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1231
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Color Panel: Could not create directory %s needed to store configurations"
|
||||
msgstr "Color Panel: Не може да се създаде директория %s, необходима за да се запазят настройките"
|
||||
|
||||
#. Delete the file, it doesn't belong here
|
||||
#: ../../WINGs/wcolorpanel.c:1237 ../../WINGs/wcolorpanel.c:3207
|
||||
#: ../../WINGs/wcolorpanel.c:3211
|
||||
msgid "File Error"
|
||||
msgstr "Файлова грешка"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1238
|
||||
msgid "Could not create ColorPanel configuration directory"
|
||||
msgstr "Не може да се създаде конфигурационна директория за ColorPanel"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1239 ../../WINGs/wcolorpanel.c:3208
|
||||
#: ../../WINGs/wcolorpanel.c:3213 ../../WINGs/wcolorpanel.c:3240
|
||||
#: ../../WINGs/wfilepanel.c:250 ../../WINGs/wfilepanel.c:647
|
||||
#: ../../WINGs/wfilepanel.c:659 ../../WINGs/wfilepanel.c:760
|
||||
#: ../../WINGs/wfilepanel.c:971 ../../WINGs/wfontpanel.c:709
|
||||
msgid "OK"
|
||||
msgstr "Приемам"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1245 ../../WINGs/wcolorpanel.c:1281
|
||||
#: ../../WINGs/wcolorpanel.c:1299
|
||||
msgid "Color Panel: Could not find file"
|
||||
msgstr "Color Panel: Не може да се открие файла"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1486 ../../WINGs/wcolorpanel.c:1551
|
||||
#: ../../WINGs/wcolorpanel.c:1615
|
||||
msgid "Color Panel: X failed request"
|
||||
msgstr "Color Panel: не успя заявка към X"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2860
|
||||
msgid "Saturation"
|
||||
msgstr "Наситеност"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2896
|
||||
msgid "Hue"
|
||||
msgstr "Нюанс"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3146
|
||||
msgid "Open Palette"
|
||||
msgstr "Отваряне на палитра"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3208
|
||||
msgid "Invalid file format !"
|
||||
msgstr "Неправилен файлов формат!"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3210
|
||||
#, c-format
|
||||
msgid "can't remove file %s"
|
||||
msgstr "не може да се изтрие файлът %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3212
|
||||
msgid "Couldn't remove file from Configuration Directory !"
|
||||
msgstr "Не може да се изтрие файл от директорията за настройки!"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3239
|
||||
msgid "Rename"
|
||||
msgstr "Преименуване"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3239
|
||||
msgid "Rename palette to:"
|
||||
msgstr "Преименувай палитрата на "
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3240 ../../WINGs/wfilepanel.c:259
|
||||
#: ../../WINGs/wfilepanel.c:659 ../../WINGs/wfilepanel.c:760
|
||||
msgid "Cancel"
|
||||
msgstr "Отменям"
|
||||
|
||||
#. Careful, this palette exists already
|
||||
#: ../../WINGs/wcolorpanel.c:3256 ../../WINGs/wfilepanel.c:760
|
||||
msgid "Warning"
|
||||
msgstr "Внимание"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3257
|
||||
msgid ""
|
||||
"Palette already exists !\n"
|
||||
"\n"
|
||||
"Overwrite ?"
|
||||
msgstr ""
|
||||
"Такава палитра вече съществува!\n"
|
||||
"\n"
|
||||
"Да бъде ли заменена с новата?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3257 ../../WINGs/wcolorpanel.c:3321
|
||||
msgid "No"
|
||||
msgstr "Не"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3257 ../../WINGs/wcolorpanel.c:3321
|
||||
msgid "Yes"
|
||||
msgstr "Да"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3289
|
||||
#, c-format
|
||||
msgid "Couldn't rename palette %s to %s\n"
|
||||
msgstr "Палитрата %s не може да се преименува на %s\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3315
|
||||
msgid "This will permanently remove the palette "
|
||||
msgstr "Това ще отстрани палитрата необратимо "
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3318
|
||||
msgid ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Are you sure you want to remove this palette ?"
|
||||
msgstr ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Убедени ли сте, че искате да отстраните тази палитра?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3343
|
||||
#, c-format
|
||||
msgid "Couldn't remove palette %s\n"
|
||||
msgstr "Палитрата %s не може да бъде отстранена\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3648
|
||||
#, c-format
|
||||
msgid "Could not open %s"
|
||||
msgstr "Не може да бъде отворен %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3655
|
||||
#, c-format
|
||||
msgid "Could not create %s"
|
||||
msgstr "Не може да бъде създаден %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3666
|
||||
#, c-format
|
||||
msgid "Write error on file %s"
|
||||
msgstr "Грешка при запис във файл %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3711
|
||||
msgid "Color Panel: Color unspecified"
|
||||
msgstr "Color Panel: Не е посочен цвят"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:235
|
||||
msgid "Name:"
|
||||
msgstr "Име:"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:332 ../../WINGs/wfilepanel.c:396
|
||||
msgid "Open"
|
||||
msgstr "Отвори"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:350 ../../WINGs/wfilepanel.c:402
|
||||
msgid "Save"
|
||||
msgstr "Запази"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:562
|
||||
#, c-format
|
||||
msgid "WINGs: could not open directory %s\n"
|
||||
msgstr "WINGs: директорията %s не може да се отвори\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:580
|
||||
#, c-format
|
||||
msgid "WINGs: could not stat %s\n"
|
||||
msgstr "WINGs: не могат да се получат атрибутите (stat) за %s\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:647 ../../WINGs/wfilepanel.c:970
|
||||
#: ../../WINGs/wfontpanel.c:708
|
||||
msgid "Error"
|
||||
msgstr "Грешка"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:658
|
||||
msgid "Create Directory"
|
||||
msgstr "Създаване на директория"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:659
|
||||
msgid "Enter directory name"
|
||||
msgstr "Въведете името на директорията"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:695 ../../WINGs/wfilepanel.c:734
|
||||
#: ../../WINGs/wfilepanel.c:765 ../../WINGs/wfilepanel.c:793
|
||||
msgid "Permission denied."
|
||||
msgstr "Отказан достъп"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:698
|
||||
#, c-format
|
||||
msgid "'%s' already exists."
|
||||
msgstr "вече съществува \"%s\"."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:701
|
||||
msgid "Path does not exist."
|
||||
msgstr "Пътят не съществува."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:731 ../../WINGs/wfilepanel.c:790
|
||||
#, c-format
|
||||
msgid "'%s' does not exist."
|
||||
msgstr "Не съществува \"%s\"."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:738 ../../WINGs/wfilepanel.c:797
|
||||
msgid "Insufficient memory available."
|
||||
msgstr "Не е достъпна достатъчно памет."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:742 ../../WINGs/wfilepanel.c:801
|
||||
#, c-format
|
||||
msgid "'%s' is on a read-only filesystem."
|
||||
msgstr "\"%s\" се намира във файлова система с достъп само за четене."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:745 ../../WINGs/wfilepanel.c:777
|
||||
#: ../../WINGs/wfilepanel.c:804
|
||||
#, c-format
|
||||
msgid "Can not delete '%s'."
|
||||
msgstr "\"%s\" не може да бъде изтрит."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:752
|
||||
#, c-format
|
||||
msgid "Delete directory %s ?"
|
||||
msgstr "Да се изтрие ли директорията %s?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:756
|
||||
#, c-format
|
||||
msgid "Delete file %s ?"
|
||||
msgstr "Да се изтрие ли файлът %s?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:768
|
||||
#, c-format
|
||||
msgid "Directory '%s' does not exist."
|
||||
msgstr "Директорията \"%s\" не съществува."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:771
|
||||
#, c-format
|
||||
msgid "Directory '%s' is not empty."
|
||||
msgstr "Директорията \"%s\" не е празна."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:774
|
||||
#, c-format
|
||||
msgid "Directory '%s' is busy."
|
||||
msgstr "Директорията \"%s е заета."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:787
|
||||
#, c-format
|
||||
msgid "'%s' is a directory."
|
||||
msgstr "\"%s\" е директория."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:829
|
||||
#, c-format
|
||||
msgid "An error occured browsing '%s'."
|
||||
msgstr "Настъпи грешка при показване на \"%s\"."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:833
|
||||
#, c-format
|
||||
msgid "'%s' is not a directory."
|
||||
msgstr "\"%s\" не е директория."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:970
|
||||
msgid "File does not exist."
|
||||
msgstr "Файлът не съществува."
|
||||
|
||||
#: ../../WINGs/wfont.c:129
|
||||
#, c-format
|
||||
msgid "the following character sets are missing in %s:"
|
||||
msgstr "в %s липсват следните кодирания:"
|
||||
|
||||
#: ../../WINGs/wfont.c:136
|
||||
#, c-format
|
||||
msgid ""
|
||||
"the string \"%s\" will be used in place of any characters from those sets."
|
||||
msgstr "Вместо кой да е символ от тези кодирания ще се използва низът \"%s\"."
|
||||
|
||||
#: ../../WINGs/wfont.c:300 ../../WINGs/wfont.c:336
|
||||
#, c-format
|
||||
msgid "could not load font set %s. Trying fixed."
|
||||
msgstr "не може да се зареди шрифтова комбинация %s. Опит за шрифт fixed."
|
||||
|
||||
#: ../../WINGs/wfont.c:306 ../../WINGs/wfont.c:342
|
||||
#, c-format
|
||||
msgid "could not load font %s. Trying fixed."
|
||||
msgstr "не може да се зареди шрифт %s. Опит за шрифт fixed."
|
||||
|
||||
#: ../../WINGs/wfont.c:310 ../../WINGs/wfont.c:346
|
||||
msgid "could not load fixed font!"
|
||||
msgstr "не може да се зареди шрифтът fixed!"
|
||||
|
||||
#: ../../WINGs/wfont.c:441
|
||||
#, c-format
|
||||
msgid "font description %s is too large."
|
||||
msgstr "шрифтовото описание %s е твърде дълго."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:205
|
||||
msgid "Test!!!"
|
||||
msgstr "Проба!!! Test!!!"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:211
|
||||
msgid "Family"
|
||||
msgstr "Гарнитура"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:222
|
||||
msgid "Typeface"
|
||||
msgstr "Стил"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:233
|
||||
msgid "Size"
|
||||
msgstr "Размер"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:252
|
||||
msgid "Set"
|
||||
msgstr "Установи"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:257
|
||||
msgid "Revert"
|
||||
msgstr "Предишното"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:709
|
||||
msgid "Could not retrieve font list"
|
||||
msgstr "Не може да се получи списъка от шрифтове"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:721
|
||||
#, c-format
|
||||
msgid "font name %s is longer than 256, which is invalid."
|
||||
msgstr "името на шрифта %s е по-дълго от 256 символа, което е недопустимо."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:868
|
||||
msgid "Roman"
|
||||
msgstr "Изправен"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:871
|
||||
msgid "Italic"
|
||||
msgstr "Курсив"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:873
|
||||
msgid "Oblique"
|
||||
msgstr "Наклонен"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:875
|
||||
msgid "Rev Italic"
|
||||
msgstr "Обратен курсив"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:877
|
||||
msgid "Rev Oblique"
|
||||
msgstr "Обратно наклонен"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:883
|
||||
msgid "Normal"
|
||||
msgstr "Нормален"
|
||||
|
||||
#: ../../WINGs/widgets.c:415
|
||||
#, c-format
|
||||
msgid "WINGs: could not load widget images file: %s"
|
||||
msgstr "WINGs: не може да се зареди изображението %s на библиотеката."
|
||||
|
||||
#: ../../WINGs/widgets.c:763
|
||||
msgid ""
|
||||
"could not load any fonts. Make sure your font installation and locale "
|
||||
"settings are correct."
|
||||
msgstr "не може да се зареди никакъв шрифт. Убедете се, че имате правилно инсталирани шрифтове и посочен езиков локал."
|
||||
|
||||
#: ../../WINGs/wruler.c:189
|
||||
msgid "0 inches"
|
||||
msgstr "0 цола"
|
||||
736
WINGs/po/ca.po
Normal file
736
WINGs/po/ca.po
Normal file
@@ -0,0 +1,736 @@
|
||||
# Catalan messages for WINGs.
|
||||
# Copyright (C) 2003 Ernest Adrogué <eadrogue@gmx.net>.
|
||||
# This file is distributed under the terms of the GNU General Public License.
|
||||
#
|
||||
# Version history:
|
||||
# WM-ver author email date
|
||||
# 0.80.2 Ernest Adrogué eadrogue@gmx.net 23 Feb 2003
|
||||
# CVS-20030914 Ernest Adrogué eadrogue@gmx.net 15 Set 2003
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WINGs 0.80.2\n"
|
||||
"POT-Creation-Date: 2003-09-16 22:59+0200\n"
|
||||
"PO-Revision-Date: 2003-09-16 23:16+0200\n"
|
||||
"Last-Translator: Ernest Adrogué <eadrogue@gmx.net>\n"
|
||||
"Language-Team: Catalan <ca@dodds.net>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../../WINGs/connection.c:467 ../../WINGs/connection.c:532
|
||||
#: ../../WINGs/connection.c:575
|
||||
msgid "Bad address-service-protocol combination"
|
||||
msgstr "Combinació adreça-servei-protocol incorrecta"
|
||||
|
||||
#: ../../WINGs/error.c:54
|
||||
#, c-format
|
||||
msgid "Unknown error %d"
|
||||
msgstr "Error no identificat %d"
|
||||
|
||||
#: ../../WINGs/error.c:59
|
||||
#, c-format
|
||||
msgid "Error %d"
|
||||
msgstr "Error %d"
|
||||
|
||||
#: ../../WINGs/error.c:110
|
||||
msgid " warning: "
|
||||
msgstr ": atenció: "
|
||||
|
||||
#: ../../WINGs/error.c:137
|
||||
msgid " fatal error: "
|
||||
msgstr ": error fatal: "
|
||||
|
||||
#: ../../WINGs/error.c:163 ../../WINGs/error.c:192
|
||||
msgid " error: "
|
||||
msgstr ": error: "
|
||||
|
||||
#: ../../WINGs/findfile.c:48
|
||||
#, c-format
|
||||
msgid "could not get password entry for UID %i"
|
||||
msgstr "no s'ha pogut obtenir l'informació de compte de l'UID %i"
|
||||
|
||||
#: ../../WINGs/findfile.c:66
|
||||
#, c-format
|
||||
msgid "could not get password entry for user %s"
|
||||
msgstr "no s'ha pogut obtenir l'informació de compte de l'usuari %s"
|
||||
|
||||
#: ../../WINGs/host.c:114
|
||||
msgid "Cannot get current host name"
|
||||
msgstr "No s'ha pogut obtenir el nom de host actual"
|
||||
|
||||
# falten coses per traduïr en el codi font. eac
|
||||
#: ../../WINGs/proplist.c:91
|
||||
#, c-format
|
||||
msgid "syntax error in %s %s, line %i: %s"
|
||||
msgstr "error de sintaxi a %s %s, línia %i: %s"
|
||||
|
||||
#: ../../WINGs/proplist.c:150
|
||||
msgid "Only string or data is supported for a proplist dictionary key"
|
||||
msgstr ""
|
||||
"Una entrada PropList de diccionari només pot contenir dades o una cadena"
|
||||
|
||||
#: ../../WINGs/proplist.c:184 ../../WINGs/proplist.c:236
|
||||
#: ../../WINGs/proplist.c:394 ../../WINGs/proplist.c:474
|
||||
#: ../../WINGs/proplist.c:1075 ../../WINGs/proplist.c:1127
|
||||
#: ../../WINGs/proplist.c:1293 ../../WINGs/proplist.c:1372
|
||||
#: ../../WINGs/proplist.c:1493 ../../WINGs/proplist.c:1540
|
||||
msgid "Used proplist functions on non-WMPropLists objects"
|
||||
msgstr "S'han usat funcions PropList en objectes no-WMPropLists"
|
||||
|
||||
#: ../../WINGs/proplist.c:630
|
||||
msgid "unterminated PropList string"
|
||||
msgstr "cadena PropList incompleta"
|
||||
|
||||
#: ../../WINGs/proplist.c:670
|
||||
msgid "unterminated PropList data"
|
||||
msgstr "dades PropList incompletes"
|
||||
|
||||
#: ../../WINGs/proplist.c:678
|
||||
msgid "unterminated PropList data (missing hexdigit)"
|
||||
msgstr "Dades PropList incompletes (falta un digit hexadecimal)"
|
||||
|
||||
#: ../../WINGs/proplist.c:690 ../../WINGs/proplist.c:695
|
||||
msgid "non hexdigit character in PropList data"
|
||||
msgstr "cap digit hexadecimal a les dades PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:729
|
||||
msgid "unterminated PropList array"
|
||||
msgstr "matriu PropList incompleta"
|
||||
|
||||
#: ../../WINGs/proplist.c:737
|
||||
msgid "missing or unterminated PropList array"
|
||||
msgstr "matriu PropList incompleta o inexistent"
|
||||
|
||||
#: ../../WINGs/proplist.c:747
|
||||
msgid "could not get PropList array element"
|
||||
msgstr "no s'ha pogut obtenir un element de la matriu PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:776
|
||||
msgid "unterminated PropList dictionary"
|
||||
msgstr "diccionari PropList incomplet"
|
||||
|
||||
#: ../../WINGs/proplist.c:793
|
||||
msgid "missing PropList dictionary key"
|
||||
msgstr "falta una entrada PropList de diccionari"
|
||||
|
||||
#: ../../WINGs/proplist.c:795
|
||||
msgid "missing PropList dictionary entry key or unterminated dictionary"
|
||||
msgstr "falta una entrada PropList de diccionari o bé està incompleta"
|
||||
|
||||
#: ../../WINGs/proplist.c:803
|
||||
msgid "error parsing PropList dictionary key"
|
||||
msgstr "error mentre s'analitzava l'entrada PropList de diccionari"
|
||||
|
||||
#: ../../WINGs/proplist.c:811
|
||||
msgid "missing = in PropList dictionary entry"
|
||||
msgstr "falta un \"=\" a l'entrada PropList de diccionari"
|
||||
|
||||
#: ../../WINGs/proplist.c:819
|
||||
msgid "error parsing PropList dictionary entry value"
|
||||
msgstr "error mentre s'analitzava el valor de l'entrada PropList de diccionari"
|
||||
|
||||
#: ../../WINGs/proplist.c:827
|
||||
msgid "missing ; in PropList dictionary entry"
|
||||
msgstr "falta un \";\" a l'entrada PropList de diccionari"
|
||||
|
||||
#: ../../WINGs/proplist.c:888
|
||||
msgid ""
|
||||
"was expecting a string, data, array or dictionary. If it's a string, try "
|
||||
"enclosing it with \"."
|
||||
msgstr ""
|
||||
"s'esperava una cadena, dada, matriu o diccionari. Si es tractava d'una\n"
|
||||
"cadena proveu d'escriure-la \"entre cometes\"."
|
||||
|
||||
#: ../../WINGs/proplist.c:892
|
||||
msgid "Comments are not allowed inside WindowMaker owned domain files."
|
||||
msgstr "No es permeten comentaris en els fitxers de domini de WindowMaker."
|
||||
|
||||
#: ../../WINGs/proplist.c:1563 ../../WINGs/proplist.c:1630
|
||||
msgid "extra data after end of property list"
|
||||
msgstr "sobren dades després de la llista de propietats"
|
||||
|
||||
#: ../../WINGs/proplist.c:1606
|
||||
#, c-format
|
||||
msgid "could not get size for file '%s'"
|
||||
msgstr "no s'ha pogut obtenir la mida de \"%s\""
|
||||
|
||||
#: ../../WINGs/proplist.c:1619
|
||||
#, c-format
|
||||
msgid "error reading from file '%s'"
|
||||
msgstr "error mentre es llegia el fitxer \"%s\""
|
||||
|
||||
#: ../../WINGs/proplist.c:1671
|
||||
#, c-format
|
||||
msgid "mkstemp (%s) failed"
|
||||
msgstr "la rutina mkstemp (%s) ha fallat"
|
||||
|
||||
#: ../../WINGs/proplist.c:1682
|
||||
#, c-format
|
||||
msgid "mktemp (%s) failed"
|
||||
msgstr "la rutina mktemp (%s) ha fallat"
|
||||
|
||||
#: ../../WINGs/proplist.c:1693
|
||||
#, c-format
|
||||
msgid "open (%s) failed"
|
||||
msgstr "la rutina open (%s) ha fallat"
|
||||
|
||||
#: ../../WINGs/proplist.c:1700
|
||||
#, c-format
|
||||
msgid "writing to file: %s failed"
|
||||
msgstr "l'escriptura del fitxer \"%s\" ha fallat"
|
||||
|
||||
#: ../../WINGs/proplist.c:1708
|
||||
#, c-format
|
||||
msgid "fclose (%s) failed"
|
||||
msgstr "la rutina fclose (%s) ha fallat"
|
||||
|
||||
#: ../../WINGs/proplist.c:1717
|
||||
#, c-format
|
||||
msgid "rename ('%s' to '%s') failed"
|
||||
msgstr "el canvi de nom (\"%s\" a \"%s\") ha fallat"
|
||||
|
||||
#. something happened with the file. just overwrite it
|
||||
#: ../../WINGs/userdefaults.c:188 ../../WINGs/userdefaults.c:204
|
||||
#, c-format
|
||||
msgid "cannot read domain from file '%s' when syncing"
|
||||
msgstr "no s'ha pogut llegir un domini del fitxer \"%s\" quan es sincronitzava"
|
||||
|
||||
#: ../../WINGs/wcolor.c:224 ../../WINGs/wcolor.c:236 ../../WINGs/wcolor.c:275
|
||||
#: ../../WINGs/wcolor.c:316
|
||||
#, c-format
|
||||
msgid "could not allocate %s color"
|
||||
msgstr "no s'ha pogut assignar espai pel color \"%s\""
|
||||
|
||||
#: ../../WINGs/wcolor.c:224
|
||||
msgid "white"
|
||||
msgstr "blanc"
|
||||
|
||||
#: ../../WINGs/wcolor.c:236
|
||||
msgid "black"
|
||||
msgstr "negre"
|
||||
|
||||
#: ../../WINGs/wcolor.c:275
|
||||
msgid "gray"
|
||||
msgstr "gris"
|
||||
|
||||
#: ../../WINGs/wcolor.c:316
|
||||
msgid "dark gray"
|
||||
msgstr "gris fosc"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:420
|
||||
msgid "Colors"
|
||||
msgstr "Colors"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:610 ../../WINGs/wcolorpanel.c:2829
|
||||
msgid "Brightness"
|
||||
msgstr "Claror"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:612 ../../WINGs/wcolorpanel.c:688
|
||||
#: ../../WINGs/wcolorpanel.c:721 ../../WINGs/wcolorpanel.c:755
|
||||
#: ../../WINGs/wcolorpanel.c:815 ../../WINGs/wcolorpanel.c:849
|
||||
#: ../../WINGs/wcolorpanel.c:883 ../../WINGs/wcolorpanel.c:918
|
||||
#: ../../WINGs/wcolorpanel.c:2169 ../../WINGs/wcolorpanel.c:2831
|
||||
#: ../../WINGs/wcolorpanel.c:2867 ../../WINGs/wcolorpanel.c:2903
|
||||
#: ../../WINGs/wcolorpanel.c:3745
|
||||
msgid "Color Panel: Could not allocate memory"
|
||||
msgstr "Panell de color: No s'ha pogut assignar memòria"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:685 ../../WINGs/wcolorpanel.c:686
|
||||
msgid "Red"
|
||||
msgstr "Roig"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:718 ../../WINGs/wcolorpanel.c:719
|
||||
msgid "Green"
|
||||
msgstr "Verd"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:752 ../../WINGs/wcolorpanel.c:753
|
||||
msgid "Blue"
|
||||
msgstr "Blau"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:812 ../../WINGs/wcolorpanel.c:813
|
||||
msgid "Cyan"
|
||||
msgstr "Cian"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:846 ../../WINGs/wcolorpanel.c:847
|
||||
msgid "Magenta"
|
||||
msgstr "Magenta"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:880 ../../WINGs/wcolorpanel.c:881
|
||||
msgid "Yellow"
|
||||
msgstr "Groc"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:915 ../../WINGs/wcolorpanel.c:916
|
||||
msgid "Black"
|
||||
msgstr "Negre"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:996
|
||||
msgid "Spectrum"
|
||||
msgstr "Espectre"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1026
|
||||
msgid "Palette"
|
||||
msgstr "Paleta"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1032
|
||||
msgid "New from File..."
|
||||
msgstr "Obtenir d'un fitxer..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1033 ../../WINGs/wcolorpanel.c:1081
|
||||
#: ../../WINGs/wcolorpanel.c:1098
|
||||
msgid "Rename..."
|
||||
msgstr "Reanomenar..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1034 ../../WINGs/wcolorpanel.c:1082
|
||||
#: ../../WINGs/wcolorpanel.c:1099 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "Remove"
|
||||
msgstr "Eliminar"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1035
|
||||
msgid "Copy"
|
||||
msgstr "Copiar"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1036
|
||||
msgid "New from Clipboard"
|
||||
msgstr "Obtenir del porta-retalls..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1057
|
||||
msgid "X11-Colors"
|
||||
msgstr "Colors-X11"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1074
|
||||
msgid "Color"
|
||||
msgstr "Color"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1080
|
||||
msgid "Add..."
|
||||
msgstr "Afegeix..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1090
|
||||
msgid "List"
|
||||
msgstr "Llista"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1097
|
||||
msgid "New..."
|
||||
msgstr "Nou..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1236
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Color Panel: Could not create directory %s needed to store configurations"
|
||||
msgstr ""
|
||||
"Panell de color: No s'ha pogut crear el directori \"%s\" necessari per desar "
|
||||
"la configuració"
|
||||
|
||||
#. Delete the file, it doesn't belong here
|
||||
#: ../../WINGs/wcolorpanel.c:1242 ../../WINGs/wcolorpanel.c:3212
|
||||
#: ../../WINGs/wcolorpanel.c:3216
|
||||
msgid "File Error"
|
||||
msgstr "Error de fitxer"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1243
|
||||
msgid "Could not create ColorPanel configuration directory"
|
||||
msgstr "No s'ha pogut crear el directori de configuració del Panell de color"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1244 ../../WINGs/wcolorpanel.c:3213
|
||||
#: ../../WINGs/wcolorpanel.c:3218 ../../WINGs/wcolorpanel.c:3245
|
||||
#: ../../WINGs/wfilepanel.c:250 ../../WINGs/wfilepanel.c:650
|
||||
#: ../../WINGs/wfilepanel.c:662 ../../WINGs/wfilepanel.c:763
|
||||
#: ../../WINGs/wfilepanel.c:974 ../../WINGs/wfontpanel.c:751
|
||||
msgid "OK"
|
||||
msgstr "D'acord"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1250 ../../WINGs/wcolorpanel.c:1286
|
||||
#: ../../WINGs/wcolorpanel.c:1304
|
||||
msgid "Color Panel: Could not find file"
|
||||
msgstr "Panell de color: No s'ha trobat el fitxer"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1491 ../../WINGs/wcolorpanel.c:1556
|
||||
#: ../../WINGs/wcolorpanel.c:1620
|
||||
msgid "Color Panel: X failed request"
|
||||
msgstr "Panell de color: petició X fallida"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2865
|
||||
msgid "Saturation"
|
||||
msgstr "Saturació"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2901
|
||||
msgid "Hue"
|
||||
msgstr "Matís"
|
||||
|
||||
# és el títol d'un quadre de diàleg. eac
|
||||
#: ../../WINGs/wcolorpanel.c:3151
|
||||
msgid "Open Palette"
|
||||
msgstr "Obrir paleta"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3213
|
||||
msgid "Invalid file format !"
|
||||
msgstr "El format del fitxer no és vàlid !"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3215
|
||||
#, c-format
|
||||
msgid "can't remove file %s"
|
||||
msgstr "no s'ha pogut eliminar el fitxer \"%s\""
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3217
|
||||
msgid "Couldn't remove file from Configuration Directory !"
|
||||
msgstr "No s'ha pogut eliminar el fitxer del directori de configuració !"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3244
|
||||
msgid "Rename"
|
||||
msgstr "Reanomena"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3244
|
||||
msgid "Rename palette to:"
|
||||
msgstr "Reanomena la paleta com a:"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3245 ../../WINGs/wfilepanel.c:259
|
||||
#: ../../WINGs/wfilepanel.c:662 ../../WINGs/wfilepanel.c:763
|
||||
msgid "Cancel"
|
||||
msgstr "Cancel·la"
|
||||
|
||||
#. Careful, this palette exists already
|
||||
#: ../../WINGs/wcolorpanel.c:3261 ../../WINGs/wfilepanel.c:763
|
||||
msgid "Warning"
|
||||
msgstr "Atenció"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262
|
||||
msgid ""
|
||||
"Palette already exists !\n"
|
||||
"\n"
|
||||
"Overwrite ?"
|
||||
msgstr ""
|
||||
"Ja existia una paleta amb aquest nom!\n"
|
||||
"\n"
|
||||
"La voleu sobreescriure?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "No"
|
||||
msgstr "No"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "Yes"
|
||||
msgstr "Sí"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3294
|
||||
#, c-format
|
||||
msgid "Couldn't rename palette %s to %s\n"
|
||||
msgstr "No s'ha pogut reanomenar la paleta %s com a %s\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3320
|
||||
msgid "This will permanently remove the palette "
|
||||
msgstr "Això eliminarà la paleta per sempre "
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3323
|
||||
msgid ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Are you sure you want to remove this palette ?"
|
||||
msgstr ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Esteu segurs que voleu eliminar aquesta paleta?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3348
|
||||
#, c-format
|
||||
msgid "Couldn't remove palette %s\n"
|
||||
msgstr "No s'ha pogut eliminar la paleta %s\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3647
|
||||
#, c-format
|
||||
msgid "Could not open %s"
|
||||
msgstr "No s'ha pogut obrir %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3654
|
||||
#, c-format
|
||||
msgid "Could not create %s"
|
||||
msgstr "No s'ha pogut crear %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3665
|
||||
#, c-format
|
||||
msgid "Write error on file %s"
|
||||
msgstr "Error d'escriptura en el fitxer %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3710
|
||||
msgid "Color Panel: Color unspecified"
|
||||
msgstr "Panell de color: Color no especificat"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:235
|
||||
msgid "Name:"
|
||||
msgstr "Nom:"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:332 ../../WINGs/wfilepanel.c:396
|
||||
msgid "Open"
|
||||
msgstr "Obre"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:350 ../../WINGs/wfilepanel.c:402
|
||||
msgid "Save"
|
||||
msgstr "Desa"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:565
|
||||
#, c-format
|
||||
msgid "WINGs: could not open directory %s\n"
|
||||
msgstr "WINGs: no s'ha pogut obrir el directori %s\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:583
|
||||
#, c-format
|
||||
msgid "WINGs: could not stat %s\n"
|
||||
msgstr "WINGs: no s'ha pogut determinar l'estat de %s\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:650 ../../WINGs/wfilepanel.c:973
|
||||
#: ../../WINGs/wfontpanel.c:750
|
||||
msgid "Error"
|
||||
msgstr "Error"
|
||||
|
||||
# és el nom d'un quadre de diàleg. eac
|
||||
#: ../../WINGs/wfilepanel.c:661
|
||||
msgid "Create Directory"
|
||||
msgstr "Crear directori"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:662
|
||||
msgid "Enter directory name"
|
||||
msgstr "Entreu el nom del directori"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:698 ../../WINGs/wfilepanel.c:737
|
||||
#: ../../WINGs/wfilepanel.c:768 ../../WINGs/wfilepanel.c:796
|
||||
msgid "Permission denied."
|
||||
msgstr "Permís denegat."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:701
|
||||
#, c-format
|
||||
msgid "'%s' already exists."
|
||||
msgstr "\"%s\" existia prèviament."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:704
|
||||
msgid "Path does not exist."
|
||||
msgstr "L'ubicació no existeix."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:734 ../../WINGs/wfilepanel.c:793
|
||||
#, c-format
|
||||
msgid "'%s' does not exist."
|
||||
msgstr "\"%s\" no existeix."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:741 ../../WINGs/wfilepanel.c:800
|
||||
msgid "Insufficient memory available."
|
||||
msgstr "No hi ha prou memòria disponible."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:745 ../../WINGs/wfilepanel.c:804
|
||||
#, c-format
|
||||
msgid "'%s' is on a read-only filesystem."
|
||||
msgstr "\"%s\" es troba en un sistema de fitxers de només lectura."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:748 ../../WINGs/wfilepanel.c:780
|
||||
#: ../../WINGs/wfilepanel.c:807
|
||||
#, c-format
|
||||
msgid "Can not delete '%s'."
|
||||
msgstr "No s'ha pogut eliminar \"%s\"."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:755
|
||||
#, c-format
|
||||
msgid "Delete directory %s ?"
|
||||
msgstr "Voleu eliminar el directori %s ?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:759
|
||||
#, c-format
|
||||
msgid "Delete file %s ?"
|
||||
msgstr "Voleu eliminar el fitxer %s ?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:771
|
||||
#, c-format
|
||||
msgid "Directory '%s' does not exist."
|
||||
msgstr "El directori \"%s\" no existeix."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:774
|
||||
#, c-format
|
||||
msgid "Directory '%s' is not empty."
|
||||
msgstr "El directori \"%s\" no està buit."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:777
|
||||
#, c-format
|
||||
msgid "Directory '%s' is busy."
|
||||
msgstr "El directori \"%s\" es troba ocupat."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:790
|
||||
#, c-format
|
||||
msgid "'%s' is a directory."
|
||||
msgstr "\"%s\" és un directori."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:832
|
||||
#, c-format
|
||||
msgid "An error occured browsing '%s'."
|
||||
msgstr "S'ha produït un error mentre s'explorava \"%s\"."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:836
|
||||
#, c-format
|
||||
msgid "'%s' is not a directory."
|
||||
msgstr "\"%s\" no és un directori."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:973
|
||||
msgid "File does not exist."
|
||||
msgstr "El fitxer no existeix."
|
||||
|
||||
#: ../../WINGs/wfont.c:324 ../../WINGs/wfont.c:344
|
||||
#, c-format
|
||||
msgid "could not load font %s."
|
||||
msgstr "no s'ha pogut carregar el tipus de lletra %s."
|
||||
|
||||
#: ../../WINGs/wfont.c:375 ../../WINGs/wfont.c:420 ../../WINGs/wfont.c:475
|
||||
#: ../../WINGs/wfont.c:1337 ../../WINGs/wfont.c:1398 ../../WINGs/wfont.c:1469
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Conversion to widechar failed (possible invalid multibyte sequence): '%s':"
|
||||
"(pos %d)\n"
|
||||
msgstr ""
|
||||
"Ha fallat la conversió a caràcter estès (possible seqüència no vàlida): '%"
|
||||
"s': (pos %d)\n"
|
||||
|
||||
#. // remove warning later. or maybe not
|
||||
#: ../../WINGs/wfont.c:591 ../../WINGs/wfont.c:1568
|
||||
#, c-format
|
||||
msgid "Invalid font specification: '%s'\n"
|
||||
msgstr "Especificació de font no vàlida: \"%s\"\n"
|
||||
|
||||
#: ../../WINGs/wfont.c:770 ../../WINGs/wfont.c:780
|
||||
#, c-format
|
||||
msgid "Invalid size specification '%s' in %s. Using default %d\n"
|
||||
msgstr ""
|
||||
"La mida \"%s\" especificada a %s no és vàlida. S'usa el valor per omissió %"
|
||||
"d\n"
|
||||
|
||||
#: ../../WINGs/wfont.c:824
|
||||
#, c-format
|
||||
msgid "the following character sets are missing in %s:"
|
||||
msgstr "els següents conjunts de caràcters falten a %s:"
|
||||
|
||||
#: ../../WINGs/wfont.c:830
|
||||
#, c-format
|
||||
msgid ""
|
||||
"the string \"%s\" will be used in place of any characters from those sets."
|
||||
msgstr ""
|
||||
"la cadena \"%s\" s'usarà en lloc dels caràcters d'aquests conjunts de "
|
||||
"caràcters."
|
||||
|
||||
#. is arial a good fallback for multibyte?
|
||||
#: ../../WINGs/wfont.c:1232 ../../WINGs/wfont.c:1247
|
||||
#, c-format
|
||||
msgid "could not load font %s. Trying arial."
|
||||
msgstr "no s'ha pogut carregar el tipus de lletra %s. Provant amb \"arial\"."
|
||||
|
||||
#: ../../WINGs/wfont.c:1239
|
||||
msgid "could not load antialiased font set. Reverting to standard font sets."
|
||||
msgstr ""
|
||||
"no s'ha pogut carregar el conjunt de fonts amb allisat. S'usarà l'estàndard."
|
||||
|
||||
#: ../../WINGs/wfont.c:1242
|
||||
#, c-format
|
||||
msgid "could not load FontSet %s. Trying fixed."
|
||||
msgstr "no s'ha pogut carregar el tipus de lletra %s. Provant amb \"fixed\"."
|
||||
|
||||
#: ../../WINGs/wfont.c:1254
|
||||
msgid "could not load antialiased fonts. Reverting to normal fonts."
|
||||
msgstr "no s'han pogut carregar fonts allisades. S'usaran fonts normals."
|
||||
|
||||
#: ../../WINGs/wfont.c:1257 ../../WINGs/wfont.c:1268
|
||||
#, c-format
|
||||
msgid "could not load font %s. Trying fixed."
|
||||
msgstr "no s'ha pogut carregar la font %s. Provant amb \"fixed\"."
|
||||
|
||||
#: ../../WINGs/wfont.c:1262
|
||||
#, c-format
|
||||
msgid "could not load font set %s. Trying fixed."
|
||||
msgstr "no s'ha pogut carregar el conjunt de fonts %s. Provant amb \"fixed\"."
|
||||
|
||||
#: ../../WINGs/wfont.c:1272
|
||||
msgid "could not load fixed font!"
|
||||
msgstr "no s'ha pogut carregar el tipus de lletra \"fixed\" !"
|
||||
|
||||
#: ../../WINGs/wfont.c:1520
|
||||
#, c-format
|
||||
msgid "font description %s is too large."
|
||||
msgstr "la descripció de tipus de lletra %s és massa gran."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:235
|
||||
msgid "Test!!!"
|
||||
msgstr "Prova!!!"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:241
|
||||
msgid "Family"
|
||||
msgstr "Familia"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:252
|
||||
msgid "Typeface"
|
||||
msgstr "Fosa"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:263
|
||||
msgid "Size"
|
||||
msgstr "Mida"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:282
|
||||
msgid "Set"
|
||||
msgstr "Conjunt"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:288
|
||||
msgid "Revert"
|
||||
msgstr "Torna"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:751
|
||||
msgid "Could not retrieve font list"
|
||||
msgstr "No s'ha pogut obtenir la llista de tipus de lletra"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:765
|
||||
#, c-format
|
||||
msgid "font name %s is longer than 256, which is invalid."
|
||||
msgstr ""
|
||||
"el nom de tipus de lletra %s ocupa més de 256 caràcters, per tant no és "
|
||||
"vàlid."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:913
|
||||
msgid "Roman"
|
||||
msgstr "Romana"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:916
|
||||
msgid "Italic"
|
||||
msgstr "Itàlica"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:918
|
||||
msgid "Oblique"
|
||||
msgstr "Obliqua"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:920
|
||||
msgid "Rev Italic"
|
||||
msgstr "Itàlica inv"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:922
|
||||
msgid "Rev Oblique"
|
||||
msgstr "Obliqua inv"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:928
|
||||
msgid "Normal"
|
||||
msgstr "Normal"
|
||||
|
||||
#: ../../WINGs/widgets.c:419
|
||||
#, c-format
|
||||
msgid "WINGs: could not load widget images file: %s"
|
||||
msgstr "WINGs: no s'ha pogut carregar el fitxer d'imatges: %s"
|
||||
|
||||
#: ../../WINGs/widgets.c:772
|
||||
msgid ""
|
||||
"could not load any fonts. Make sure your font installation and locale "
|
||||
"settings are correct."
|
||||
msgstr ""
|
||||
"no s'ha pogut carregar cap font. Assegureu-vos que heu instal·lat i "
|
||||
"configurat correctament les fonts i el local."
|
||||
|
||||
#: ../../WINGs/wruler.c:192
|
||||
msgid "0 inches"
|
||||
msgstr "0 polzades"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Text antialiasing is enabled in the configuration but the X server "
|
||||
#~ "doesn't have the required capabilities (missing RENDER extension). "
|
||||
#~ "Disabling text antialiasing."
|
||||
#~ msgstr ""
|
||||
#~ "L'allisat de text està habilitat a la configuració però el servidor X no\n"
|
||||
#~ "té la capacitat necessària (falta l'extensió RENDER) de manera que "
|
||||
#~ "l'allisat\n"
|
||||
#~ "de text es deshabilitarà."
|
||||
663
WINGs/po/cs.po
Normal file
663
WINGs/po/cs.po
Normal file
@@ -0,0 +1,663 @@
|
||||
# Czech messages for WINGs
|
||||
# (C) 2001 Jiří Hnídek
|
||||
# Special thanks to Jan "judas" Tomka
|
||||
#
|
||||
# Original translation by Jiří Hnídek on Oct 11 2001
|
||||
# Currently maintained by Jiří Hnídek <jiri.hnidek@vslib.cz>
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WINGs 0.70.0\n"
|
||||
"POT-Creation-Date: 2001-10-11 19:10+0100\n"
|
||||
"PO-Revision-Date: 2001-10-11 22:00+0100\n"
|
||||
"Last-Translator: Jiří Hnídek <jiri.hnidek@vslib.cz>\n"
|
||||
"Language-Team: Czech <cz@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: unknown\n"
|
||||
|
||||
#: ../../WINGs/connection.c:451 ../../WINGs/connection.c:516
|
||||
#: ../../WINGs/connection.c:559
|
||||
msgid "Bad address-service-protocol combination"
|
||||
msgstr "Nesprávná kombinace adresa-služba-protokol"
|
||||
|
||||
#: ../../WINGs/dragsource.c:541
|
||||
msgid "DND selection lost during drag operation..."
|
||||
msgstr "DND výběr se ztratil během opere táhnutí..."
|
||||
|
||||
#: ../../WINGs/dragsource.c:610
|
||||
#, c-format
|
||||
msgid "drag & drop timed out while waiting for response from 0x%x\n"
|
||||
msgstr "čas pro drag & drop vypršel během čekání na odpoveď z 0x%x\n"
|
||||
|
||||
#: ../../WINGs/dragsource.c:728
|
||||
msgid "could not get ownership or DND selection"
|
||||
msgstr "nemožné získat vlastnictví nebo DND výběr"
|
||||
|
||||
#: ../../WINGs/dragsource.c:898
|
||||
#, c-format
|
||||
msgid "drag source received unexpected XdndFinished message from %x"
|
||||
msgstr "zdroj tahání přijal neočekávanou zprávu XdndFinished z %x"
|
||||
|
||||
#: ../../WINGs/dragsource.c:1040
|
||||
#, c-format
|
||||
msgid "unknown XDND action %s from 0x%x"
|
||||
msgstr "neznámá XDND akce %s z 0x%x"
|
||||
|
||||
#: ../../WINGs/dragsource.c:1073
|
||||
msgid "received invalid drag & drop type list"
|
||||
msgstr "přijatý nesprávný seznam typů drag & drop"
|
||||
|
||||
#: ../../WINGs/dragsource.c:1161
|
||||
msgid "received Enter event in bad order"
|
||||
msgstr "přijatá událost Enter v nesprávném pořadí"
|
||||
|
||||
#: ../../WINGs/dragsource.c:1168
|
||||
#, c-format
|
||||
msgid "received drag & drop request with unsupported version %i"
|
||||
msgstr "přijatý požadavek drag & drop s nepodporovanou verzí %i"
|
||||
|
||||
#: ../../WINGs/error.c:56
|
||||
#, c-format
|
||||
msgid "Unknown error %d"
|
||||
msgstr "Neznámá chyba %d"
|
||||
|
||||
#: ../../WINGs/error.c:61
|
||||
#, c-format
|
||||
msgid "Error %d"
|
||||
msgstr "Chyba %d"
|
||||
|
||||
#: ../../WINGs/error.c:112
|
||||
msgid " warning: "
|
||||
msgstr " varovíní: "
|
||||
|
||||
#: ../../WINGs/error.c:139
|
||||
msgid " fatal error: "
|
||||
msgstr " fatální chyba: "
|
||||
|
||||
#: ../../WINGs/error.c:165 ../../WINGs/error.c:194
|
||||
msgid " error: "
|
||||
msgstr " chyba: "
|
||||
|
||||
#: ../../WINGs/findfile.c:50
|
||||
#, c-format
|
||||
msgid "could not get password entry for UID %i"
|
||||
msgstr "nemožné zjistit informaci o UID %i"
|
||||
|
||||
#: ../../WINGs/findfile.c:68
|
||||
#, c-format
|
||||
msgid "could not get password entry for user %s"
|
||||
msgstr "nemožné zjistit informaci o uživatelovi %s"
|
||||
|
||||
#: ../../WINGs/hashtable.c:275
|
||||
msgid "rebuilding hash table...\n"
|
||||
msgstr "přepis tabulky hashovských funkcí...\n"
|
||||
|
||||
#: ../../WINGs/hashtable.c:279
|
||||
msgid "finished rebuild.\n"
|
||||
msgstr "konec přepisu.\n"
|
||||
|
||||
#: ../../WINGs/host.c:116
|
||||
msgid "Cannot get current host name"
|
||||
msgstr "Nemožné zjistit aktuální jméno počítače"
|
||||
|
||||
#: ../../WINGs/memory.c:94
|
||||
msgid "malloc() failed. Retrying after 2s."
|
||||
msgstr "chyba malloc(). Nový pokus o 2s."
|
||||
|
||||
#: ../../WINGs/memory.c:103
|
||||
msgid "Really Bad Error: recursive malloc() failure."
|
||||
msgstr "Skutečně ošklivá chyba: rekurzivní chyba malloc()."
|
||||
|
||||
#: ../../WINGs/memory.c:106 ../../WINGs/memory.c:146
|
||||
msgid "virtual memory exhausted"
|
||||
msgstr "virtuální paměť vyčerpaná"
|
||||
|
||||
#: ../../WINGs/memory.c:133
|
||||
msgid "realloc() failed. Retrying after 2s."
|
||||
msgstr "chyba realloc(). Nový pokus o 2s."
|
||||
|
||||
#: ../../WINGs/memory.c:142
|
||||
msgid "Really Bad Error: recursive realloc() failure."
|
||||
msgstr "Skutečně ošklivá chyba: rekurzivní chyba realloc()."
|
||||
|
||||
#: ../../WINGs/memory.c:205
|
||||
#, c-format
|
||||
msgid "trying to release unexisting data %p"
|
||||
msgstr "pokus uvolnit neexistujícá data %p"
|
||||
|
||||
#: ../../WINGs/memory.c:210
|
||||
#, c-format
|
||||
msgid "RELEASING %p\n"
|
||||
msgstr "UVOLNĚNÍ %p\n"
|
||||
|
||||
#: ../../WINGs/wcolor.c:198 ../../WINGs/wcolor.c:211 ../../WINGs/wcolor.c:250
|
||||
#: ../../WINGs/wcolor.c:291
|
||||
#, c-format
|
||||
msgid "could not allocate %s color"
|
||||
msgstr "nemožné alokovat %s barvu"
|
||||
|
||||
#: ../../WINGs/wcolor.c:198
|
||||
msgid "white"
|
||||
msgstr "bílou"
|
||||
|
||||
#: ../../WINGs/wcolor.c:211
|
||||
msgid "black"
|
||||
msgstr "černou"
|
||||
|
||||
#: ../../WINGs/wcolor.c:250
|
||||
msgid "gray"
|
||||
msgstr "šedou"
|
||||
|
||||
#: ../../WINGs/wcolor.c:291
|
||||
msgid "dark gray"
|
||||
msgstr "tmavě šedou"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:410
|
||||
msgid "Colors"
|
||||
msgstr "Barvy"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:600 ../../WINGs/wcolorpanel.c:2819
|
||||
msgid "Brightness"
|
||||
msgstr "Světlost"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:602 ../../WINGs/wcolorpanel.c:678
|
||||
#: ../../WINGs/wcolorpanel.c:711 ../../WINGs/wcolorpanel.c:745
|
||||
#: ../../WINGs/wcolorpanel.c:805 ../../WINGs/wcolorpanel.c:839
|
||||
#: ../../WINGs/wcolorpanel.c:873 ../../WINGs/wcolorpanel.c:908
|
||||
#: ../../WINGs/wcolorpanel.c:2159 ../../WINGs/wcolorpanel.c:2821
|
||||
#: ../../WINGs/wcolorpanel.c:2857 ../../WINGs/wcolorpanel.c:2893
|
||||
#: ../../WINGs/wcolorpanel.c:3741
|
||||
msgid "Color Panel: Could not allocate memory"
|
||||
msgstr "Panel barev: Nemožné alokovat paměť"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:675 ../../WINGs/wcolorpanel.c:676
|
||||
msgid "Red"
|
||||
msgstr "Červená"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:708 ../../WINGs/wcolorpanel.c:709
|
||||
msgid "Green"
|
||||
msgstr "Zelená"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:742 ../../WINGs/wcolorpanel.c:743
|
||||
msgid "Blue"
|
||||
msgstr "Modrá"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:802 ../../WINGs/wcolorpanel.c:803
|
||||
msgid "Cyan"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:836 ../../WINGs/wcolorpanel.c:837
|
||||
msgid "Magenta"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:870 ../../WINGs/wcolorpanel.c:871
|
||||
msgid "Yellow"
|
||||
msgstr "Žlutá"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:905 ../../WINGs/wcolorpanel.c:906
|
||||
msgid "Black"
|
||||
msgstr "Černá"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:986
|
||||
msgid "Spectrum"
|
||||
msgstr "Spektrum"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1016
|
||||
msgid "Palette"
|
||||
msgstr "Paleta"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1022
|
||||
msgid "New from File..."
|
||||
msgstr "Nová ze souboru..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1023 ../../WINGs/wcolorpanel.c:1071
|
||||
#: ../../WINGs/wcolorpanel.c:1088
|
||||
msgid "Rename..."
|
||||
msgstr "Přejmenovat..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1024 ../../WINGs/wcolorpanel.c:1072
|
||||
#: ../../WINGs/wcolorpanel.c:1089 ../../WINGs/wcolorpanel.c:3316
|
||||
msgid "Remove"
|
||||
msgstr "Odstranit"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1025
|
||||
msgid "Copy"
|
||||
msgstr "Kopírovat"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1026
|
||||
msgid "New from Clipboard"
|
||||
msgstr "Nová ze schránky"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1047
|
||||
msgid "X11-Colors"
|
||||
msgstr "Barvy X11"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1064
|
||||
msgid "Color"
|
||||
msgstr "Barva"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1070
|
||||
msgid "Add..."
|
||||
msgstr "Přidat..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1080
|
||||
msgid "List"
|
||||
msgstr "Seznam"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1087
|
||||
msgid "New..."
|
||||
msgstr "Nový..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1226
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Color Panel: Could not create directory %s needed to store configurations"
|
||||
msgstr ""
|
||||
"Panel barev: Nemožné vytvořit adresář %s potřebný k uložení nastavení"
|
||||
|
||||
#. Delete the file, it doesn't belong here
|
||||
#: ../../WINGs/wcolorpanel.c:1232 ../../WINGs/wcolorpanel.c:3202
|
||||
#: ../../WINGs/wcolorpanel.c:3206
|
||||
msgid "File Error"
|
||||
msgstr "Chyba souboru"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1233
|
||||
msgid "Could not create ColorPanel configuration directory"
|
||||
msgstr "Nemožné vytvořit konfigurační adresář panelu barev"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1234 ../../WINGs/wcolorpanel.c:3203
|
||||
#: ../../WINGs/wcolorpanel.c:3208 ../../WINGs/wcolorpanel.c:3235
|
||||
#: ../../WINGs/wfilepanel.c:243 ../../WINGs/wfilepanel.c:641
|
||||
#: ../../WINGs/wfilepanel.c:653 ../../WINGs/wfilepanel.c:752
|
||||
#: ../../WINGs/wfilepanel.c:963 ../../WINGs/wfontpanel.c:717
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1240 ../../WINGs/wcolorpanel.c:1276
|
||||
#: ../../WINGs/wcolorpanel.c:1294
|
||||
msgid "Color Panel: Could not find file"
|
||||
msgstr "Panel barev: Nemožné nalézt soubor"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1481 ../../WINGs/wcolorpanel.c:1546
|
||||
#: ../../WINGs/wcolorpanel.c:1610
|
||||
msgid "Color Panel: X failed request"
|
||||
msgstr "Panel barev: chyba požadavku X"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2855
|
||||
msgid "Saturation"
|
||||
msgstr "Saturace"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2891
|
||||
msgid "Hue"
|
||||
msgstr "Odteď"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3141
|
||||
msgid "Open Palette"
|
||||
msgstr "Otevřít paletu"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3203
|
||||
msgid "Invalid file format !"
|
||||
msgstr "Nesprávný souborový formát!"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3205
|
||||
#, c-format
|
||||
msgid "can't remove file %s"
|
||||
msgstr "nemožné odstranit soubor %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3207
|
||||
msgid "Couldn't remove file from Configuration Directory !"
|
||||
msgstr "Nemožné odstranit soubor z konfiguračního adresáře!"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3234
|
||||
msgid "Rename"
|
||||
msgstr "Přejmenovat"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3234
|
||||
msgid "Rename palette to:"
|
||||
msgstr "Přejmenovat paletu:"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3235 ../../WINGs/wfilepanel.c:252
|
||||
#: ../../WINGs/wfilepanel.c:653 ../../WINGs/wfilepanel.c:752
|
||||
msgid "Cancel"
|
||||
msgstr "Zrušit"
|
||||
|
||||
#. Careful, this palette exists already
|
||||
#: ../../WINGs/wcolorpanel.c:3251 ../../WINGs/wfilepanel.c:752
|
||||
msgid "Warning"
|
||||
msgstr "Varování"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3252
|
||||
msgid ""
|
||||
"Palette already exists !\n"
|
||||
"\n"
|
||||
"Overwrite ?"
|
||||
msgstr ""
|
||||
"Paleta už existuje!\n"
|
||||
"\n"
|
||||
"Přepsat?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3252 ../../WINGs/wcolorpanel.c:3316
|
||||
msgid "No"
|
||||
msgstr "Ne"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3252 ../../WINGs/wcolorpanel.c:3316
|
||||
msgid "Yes"
|
||||
msgstr "Ano"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3284
|
||||
#, c-format
|
||||
msgid "Couldn't rename palette %s to %s\n"
|
||||
msgstr "Nemožné přejmenovat paletu %s na %s\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3310
|
||||
msgid "This will permanently remove the palette "
|
||||
msgstr "Paleta bude natrvalo smazaná"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3313
|
||||
msgid ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Are you sure you want to remove this palette ?"
|
||||
msgstr ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Jste si jisti, že chcete odstranit tuto paletu?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3338
|
||||
#, c-format
|
||||
msgid "Couldn't remove palette %s\n"
|
||||
msgstr "Nemožné odstranit paletu %s\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3643
|
||||
#, c-format
|
||||
msgid "Could not open %s"
|
||||
msgstr "Nemožné otevřít %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3650
|
||||
#, c-format
|
||||
msgid "Could not create %s"
|
||||
msgstr "Nemožné vytvořit %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3661
|
||||
#, c-format
|
||||
msgid "Write error on file %s"
|
||||
msgstr "Chyba při zápisu do souboru %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3706
|
||||
msgid "Color Panel: Color unspecified"
|
||||
msgstr "Panel barev: Nespecifikovaná barva"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:228
|
||||
msgid "Name:"
|
||||
msgstr "Jméno:"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:325 ../../WINGs/wfilepanel.c:390
|
||||
msgid "Open"
|
||||
msgstr "Otevřít"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:343 ../../WINGs/wfilepanel.c:396
|
||||
msgid "Save"
|
||||
msgstr "Uložit"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:556
|
||||
#, c-format
|
||||
msgid "WINGs: could not open directory %s\n"
|
||||
msgstr "WINGs: nemožné otevřít adresář %s\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:574
|
||||
#, c-format
|
||||
msgid "WINGs: could not stat %s\n"
|
||||
msgstr "WINGs: nemožné zjistit informace o %s\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:641 ../../WINGs/wfilepanel.c:962
|
||||
#: ../../WINGs/wfontpanel.c:716
|
||||
msgid "Error"
|
||||
msgstr "Chyba"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:652
|
||||
msgid "Create Directory"
|
||||
msgstr "Vytvořit adresář"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:653
|
||||
msgid "Enter directory name"
|
||||
msgstr "Jméno adresáře"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:689 ../../WINGs/wfilepanel.c:728
|
||||
#: ../../WINGs/wfilepanel.c:757 ../../WINGs/wfilepanel.c:785
|
||||
msgid "Permission denied."
|
||||
msgstr "Přístup odmítnut."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:692
|
||||
#, c-format
|
||||
msgid "'%s' already exists."
|
||||
msgstr "'%s' už existuje"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:695
|
||||
msgid "Path does not exist."
|
||||
msgstr "Cesta neexistuje."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:725 ../../WINGs/wfilepanel.c:782
|
||||
#, c-format
|
||||
msgid "'%s' does not exist."
|
||||
msgstr "'%s' neexistuje."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:732 ../../WINGs/wfilepanel.c:789
|
||||
msgid "Insufficient memory available."
|
||||
msgstr "Nedostatek paměti."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:736 ../../WINGs/wfilepanel.c:793
|
||||
#, c-format
|
||||
msgid "'%s' is on a read-only filesystem."
|
||||
msgstr "'%s' je na souborovém systému jen pro čtení."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:739 ../../WINGs/wfilepanel.c:769
|
||||
#: ../../WINGs/wfilepanel.c:796
|
||||
#, c-format
|
||||
msgid "Can not delete '%s'."
|
||||
msgstr "Nemožné odstranit '%s'."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:745
|
||||
#, c-format
|
||||
msgid "Delete directory %s ?"
|
||||
msgstr "Odstranit adresář %s?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:748
|
||||
#, c-format
|
||||
msgid "Delete file %s ?"
|
||||
msgstr "Odstranit soubor %s?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:760
|
||||
#, c-format
|
||||
msgid "Directory '%s' does not exist."
|
||||
msgstr "Adresář '%s' neexistuje."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:763
|
||||
#, c-format
|
||||
msgid "Directory '%s' is not empty."
|
||||
msgstr "Adresář '%s' není prázdný."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:766
|
||||
#, c-format
|
||||
msgid "Directory '%s' is busy."
|
||||
msgstr "Adresář '%s' je používaný."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:779
|
||||
#, c-format
|
||||
msgid "'%s' is a directory."
|
||||
msgstr "'%s' je adresář."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:821
|
||||
#, c-format
|
||||
msgid "An error occured browsing '%s'."
|
||||
msgstr "Při prohlížení '%s' nastala chyba."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:825
|
||||
#, c-format
|
||||
msgid "'%s' is not a directory."
|
||||
msgstr "'%s' není adresář."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:962
|
||||
msgid "File does not exist."
|
||||
msgstr "Soubor neexistuje."
|
||||
|
||||
#: ../../WINGs/wfont.c:129
|
||||
#, c-format
|
||||
msgid "the following character sets are missing in %s:"
|
||||
msgstr "nasledující sady znaků chybí v %s:"
|
||||
|
||||
#: ../../WINGs/wfont.c:136
|
||||
#, c-format
|
||||
msgid ""
|
||||
"the string \"%s\" will be used in place of any characters from those sets."
|
||||
msgstr ""
|
||||
"řetězec \"%s\" bude použitý namísto znaků z těchto sad."
|
||||
|
||||
#: ../../WINGs/wfont.c:282 ../../WINGs/wfont.c:318
|
||||
#, c-format
|
||||
msgid "could not load font set %s. Trying fixed."
|
||||
msgstr "nemožné načíst font %s. Zkouší se načíst fixed."
|
||||
|
||||
#: ../../WINGs/wfont.c:288 ../../WINGs/wfont.c:324
|
||||
#, c-format
|
||||
msgid "could not load font %s. Trying fixed."
|
||||
msgstr "nemožno načíst font %s. Zkoší se načíst fixed."
|
||||
|
||||
#: ../../WINGs/wfont.c:292 ../../WINGs/wfont.c:328
|
||||
msgid "could not load fixed font!"
|
||||
msgstr "nemožné načíst font fixed!"
|
||||
|
||||
#: ../../WINGs/wfont.c:423
|
||||
#, c-format
|
||||
msgid "font description %s is too large."
|
||||
msgstr "popis fontu %s je příliš velký."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:205
|
||||
msgid "Test!!!"
|
||||
msgstr "Zkouška!!!"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:211
|
||||
msgid "Family"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:222
|
||||
msgid "Typeface"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:233
|
||||
msgid "Size"
|
||||
msgstr "Velikost"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:252
|
||||
msgid "Set"
|
||||
msgstr "Sada"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:257
|
||||
msgid "Revert"
|
||||
msgstr "Zpět"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:717
|
||||
msgid "Could not retrieve font list"
|
||||
msgstr "Nemožné obdržet seznam fontů"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:729
|
||||
#, c-format
|
||||
msgid "font name %s is longer than 256, which is invalid."
|
||||
msgstr "jméno fontu %s je delší než 256, což je špatně."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:880
|
||||
msgid "Roman"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:883
|
||||
msgid "Italic"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:885
|
||||
msgid "Oblique"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:887
|
||||
msgid "Rev Italic"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:889
|
||||
msgid "Rev Oblique"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:895
|
||||
msgid "Normal"
|
||||
msgstr "Normílní"
|
||||
|
||||
#: ../../WINGs/widgets.c:414
|
||||
#, c-format
|
||||
msgid "WINGs: could not load widget images file: %s"
|
||||
msgstr "WINGs: nemožné načíst soubor s obrázky pro widgety: %s"
|
||||
|
||||
#: ../../WINGs/widgets.c:525
|
||||
#, c-format
|
||||
msgid "WINGs: could not open display %s"
|
||||
msgstr "WINGs: nemožné otevřít display %s"
|
||||
|
||||
#: ../../WINGs/widgets.c:717
|
||||
msgid ""
|
||||
"could not load any fonts. Make sure your font installationand locale "
|
||||
"settings are correct."
|
||||
msgstr ""
|
||||
"nemožné načíst žádný font. Ubezpečte se, že instalace fontů a místního "
|
||||
"nastavení jsou v pořádku."
|
||||
|
||||
#: ../../WINGs/wruler.c:189
|
||||
msgid "0 inches"
|
||||
msgstr "0 palců"
|
||||
|
||||
#: ../../WINGs/wtext.c:1212
|
||||
msgid "...for this app will surely crash :-)\n"
|
||||
msgstr "...pro tuto aplikaci to určitě spadne :-)\n"
|
||||
|
||||
#: ../../WINGs/wtext.c:2084
|
||||
msgid "didn't get it\n"
|
||||
msgstr "nedosaženo\n"
|
||||
|
||||
#: ../../WINGs/wtext.c:2726
|
||||
#, c-format
|
||||
msgid "type is [%s]\n"
|
||||
msgstr "typ je [%s]\n"
|
||||
|
||||
#: ../../WINGs/wtext.c:2797
|
||||
msgid "could not request data for dropped data"
|
||||
msgstr "nemohou být vyžádána data pro položená data"
|
||||
|
||||
#: ../../WINGs/wtext.c:2995
|
||||
msgid "could not create text's view\n"
|
||||
msgstr "nemožné zobrazit text\n"
|
||||
|
||||
#: ../../WINGs/wview.c:219
|
||||
msgid "trying to realize widget of unrealized parent"
|
||||
msgstr "snaha vytvořit widget neexistujícího rodiče objektu"
|
||||
|
||||
#: ../../WINGs/wview.c:267
|
||||
msgid "trying to reparent realized view to unrealized parent"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wtextfield.c:490
|
||||
msgid "only left alignment is supported in textfields"
|
||||
msgstr "pro textové pole je povolené jen levé zarovnání"
|
||||
|
||||
#pozor, co je STRING?
|
||||
#: ../../WINGs/wwindow.c:222
|
||||
msgid "window title conversion error... using STRING encoding"
|
||||
msgstr "chyba konverze titulku okna... použije se kódovaní STRING"
|
||||
|
||||
#: ../../WINGs/wwindow.c:313
|
||||
msgid "could not allocate memory for window size hints"
|
||||
msgstr "nemožné alokovat paměť pro pokyny velikosti okna"
|
||||
|
||||
#: ../../WINGs/wwindow.c:586
|
||||
msgid "could not allocate memory for WM hints"
|
||||
msgstr "nemožné alokovat paměť pro pokyny WM"
|
||||
|
||||
#: ../../WINGs/wwindow.c:627
|
||||
msgid "icon title conversion error..using STRING encoding"
|
||||
msgstr "chyba konverze titulku ikony... použije se kódovaní STRING"
|
||||
|
||||
627
WINGs/po/de.po
Normal file
627
WINGs/po/de.po
Normal file
@@ -0,0 +1,627 @@
|
||||
#
|
||||
# German Message Catalog for WINGs
|
||||
#
|
||||
# Initial translation
|
||||
# Gudio Scholz <guido.scholz@bayernline.de>
|
||||
#
|
||||
# Adapted to versions 0.80 ff.
|
||||
# Torsten Marek <shlomme@gmx.net>
|
||||
#
|
||||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WINGs\n"
|
||||
"POT-Creation-Date: 2004-11-01 16:24+0100\n"
|
||||
"PO-Revision-Date: 2004-11-05 23:48+0100\n"
|
||||
"Last-Translator: shlomme@gmx.net\n"
|
||||
"Language-Team: German\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../../WINGs/connection.c:471 ../../WINGs/connection.c:536
|
||||
#: ../../WINGs/connection.c:579
|
||||
msgid "Bad address-service-protocol combination"
|
||||
msgstr "Ungültige Kombination von Adresse und Dienstprotokoll"
|
||||
|
||||
#: ../../WINGs/error.c:54
|
||||
#, c-format
|
||||
msgid "Unknown error %d"
|
||||
msgstr "Unbekannter Fehler %d"
|
||||
|
||||
#: ../../WINGs/error.c:59
|
||||
#, c-format
|
||||
msgid "Error %d"
|
||||
msgstr "Fehler %d"
|
||||
|
||||
#: ../../WINGs/error.c:110
|
||||
msgid " warning: "
|
||||
msgstr " Warnung: "
|
||||
|
||||
#: ../../WINGs/error.c:137
|
||||
msgid " fatal error: "
|
||||
msgstr " fataler Fehler: "
|
||||
|
||||
#: ../../WINGs/error.c:163 ../../WINGs/error.c:192
|
||||
msgid " error: "
|
||||
msgstr " Fehler: "
|
||||
|
||||
#: ../../WINGs/findfile.c:48
|
||||
#, c-format
|
||||
msgid "could not get password entry for UID %i"
|
||||
msgstr "Passworteintrag für UID %i konnte nicht ermittelt werden"
|
||||
|
||||
#: ../../WINGs/findfile.c:66
|
||||
#, c-format
|
||||
msgid "could not get password entry for user %s"
|
||||
msgstr "Passworteintrag für Benutzer %s konnte nicht ermittelt werden"
|
||||
|
||||
#: ../../WINGs/host.c:114
|
||||
msgid "Cannot get current host name"
|
||||
msgstr "Aktueller Hostname kann nicht ermittelt werden"
|
||||
|
||||
#: ../../WINGs/proplist.c:91
|
||||
#, c-format
|
||||
msgid "syntax error in %s %s, line %i: %s"
|
||||
msgstr "Syntaxfehler in %s %s, Zeile %i: %s"
|
||||
|
||||
#: ../../WINGs/proplist.c:150
|
||||
msgid "Only string or data is supported for a proplist dictionary key"
|
||||
msgstr ""
|
||||
"Nur Zeichenketten oder Binärdaten werden als Schlüssel für ein PropList-Dictionary "
|
||||
"unterstützt"
|
||||
|
||||
#: ../../WINGs/proplist.c:184 ../../WINGs/proplist.c:236
|
||||
#: ../../WINGs/proplist.c:394 ../../WINGs/proplist.c:474
|
||||
#: ../../WINGs/proplist.c:1075 ../../WINGs/proplist.c:1127
|
||||
#: ../../WINGs/proplist.c:1293 ../../WINGs/proplist.c:1372
|
||||
#: ../../WINGs/proplist.c:1493 ../../WINGs/proplist.c:1540
|
||||
msgid "Used proplist functions on non-WMPropLists objects"
|
||||
msgstr "PropList-Funktionen werden auf nicht-WMPropList-Objekte angewendet"
|
||||
|
||||
#: ../../WINGs/proplist.c:630
|
||||
msgid "unterminated PropList string"
|
||||
msgstr "nicht terminierte PropList-Zeichenkette"
|
||||
|
||||
#: ../../WINGs/proplist.c:670
|
||||
msgid "unterminated PropList data"
|
||||
msgstr "nicht terminierte PropList-Binärdaten"
|
||||
|
||||
#: ../../WINGs/proplist.c:678
|
||||
msgid "unterminated PropList data (missing hexdigit)"
|
||||
msgstr "nicht terminierte PropList-Binärdaten (fehlendes Hex-Zeichen)"
|
||||
|
||||
#: ../../WINGs/proplist.c:690 ../../WINGs/proplist.c:695
|
||||
msgid "non hexdigit character in PropList data"
|
||||
msgstr "falsches Hex-Zeichen in PropList-Binärdaten"
|
||||
|
||||
#: ../../WINGs/proplist.c:729
|
||||
msgid "unterminated PropList array"
|
||||
msgstr "nicht terminiertes PropList-Array"
|
||||
|
||||
#: ../../WINGs/proplist.c:737
|
||||
msgid "missing or unterminated PropList array"
|
||||
msgstr "fehlendes oder nicht terminiertes PropList-Array"
|
||||
|
||||
#: ../../WINGs/proplist.c:747
|
||||
msgid "could not get PropList array element"
|
||||
msgstr "PropList-Array-Element konnte nicht gelesen werden"
|
||||
|
||||
#: ../../WINGs/proplist.c:776
|
||||
msgid "unterminated PropList dictionary"
|
||||
msgstr "nicht terminiertes PropList-Dictionary"
|
||||
|
||||
#: ../../WINGs/proplist.c:793
|
||||
msgid "missing PropList dictionary key"
|
||||
msgstr "fehlender Schlüssel in PropList-Dictionary"
|
||||
|
||||
#: ../../WINGs/proplist.c:795
|
||||
msgid "missing PropList dictionary entry key or unterminated dictionary"
|
||||
msgstr "fehlender Schlüssel in PropList-Dictionary oder fehlende Terminierung"
|
||||
|
||||
#: ../../WINGs/proplist.c:803
|
||||
msgid "error parsing PropList dictionary key"
|
||||
msgstr "Fehler beim Parsen eines PropList-Dictionary-Schlüssels"
|
||||
|
||||
#: ../../WINGs/proplist.c:811
|
||||
msgid "missing = in PropList dictionary entry"
|
||||
msgstr "fehlendes \"=\" in PropList-Dictionary-Schlüssel"
|
||||
|
||||
#: ../../WINGs/proplist.c:819
|
||||
msgid "error parsing PropList dictionary entry value"
|
||||
msgstr "Fehler beim Parsen eines PropList-Dictionary-Wertes"
|
||||
|
||||
#: ../../WINGs/proplist.c:827
|
||||
msgid "missing ; in PropList dictionary entry"
|
||||
msgstr "fehlendes \";\" in PropList-Dictionary-Eintrag"
|
||||
|
||||
#: ../../WINGs/proplist.c:888
|
||||
msgid ""
|
||||
"was expecting a string, data, array or dictionary. If it's a string, try "
|
||||
"enclosing it with \"."
|
||||
msgstr ""
|
||||
"Zeichenkette, Binärdaten, Array oder Dictionary erwartet. Zeichenketten ggf. mit \" "
|
||||
"einklammern."
|
||||
|
||||
#: ../../WINGs/proplist.c:892
|
||||
msgid "Comments are not allowed inside WindowMaker owned domain files."
|
||||
msgstr "Kommentare sind in Domänendaten von WindowMaker nicht erlaubt."
|
||||
|
||||
#: ../../WINGs/proplist.c:1563 ../../WINGs/proplist.c:1630
|
||||
msgid "extra data after end of property list"
|
||||
msgstr "zusätzliche Daten hinter dem Ende der Propertyliste"
|
||||
|
||||
#: ../../WINGs/proplist.c:1606
|
||||
#, c-format
|
||||
msgid "could not get size for file '%s'"
|
||||
msgstr "Dateigröße von '%s' konnte nicht ermittelt werden"
|
||||
|
||||
#: ../../WINGs/proplist.c:1619
|
||||
#, c-format
|
||||
msgid "error reading from file '%s'"
|
||||
msgstr "Fehler beim Lesen der Datei '%s'"
|
||||
|
||||
#: ../../WINGs/proplist.c:1671
|
||||
#, c-format
|
||||
msgid "mkstemp (%s) failed"
|
||||
msgstr "mkstemp (%s) fehlgeschlagen"
|
||||
|
||||
#: ../../WINGs/proplist.c:1682
|
||||
#, c-format
|
||||
msgid "mktemp (%s) failed"
|
||||
msgstr "mktemp (%s) fehlgeschlagen"
|
||||
|
||||
#: ../../WINGs/proplist.c:1693
|
||||
#, c-format
|
||||
msgid "open (%s) failed"
|
||||
msgstr "open (%s) fehlgeschlagen"
|
||||
|
||||
#: ../../WINGs/proplist.c:1700
|
||||
#, c-format
|
||||
msgid "writing to file: %s failed"
|
||||
msgstr "Schreiben in Datei: %s fehlgeschlagen"
|
||||
|
||||
#: ../../WINGs/proplist.c:1708
|
||||
#, c-format
|
||||
msgid "fclose (%s) failed"
|
||||
msgstr "fclose (%s) fehlgeschlagen"
|
||||
|
||||
#: ../../WINGs/proplist.c:1717
|
||||
#, c-format
|
||||
msgid "rename ('%s' to '%s') failed"
|
||||
msgstr "rename ('%s' nach '%s') fehlgeschlagen"
|
||||
|
||||
#. something happened with the file. just overwrite it
|
||||
#: ../../WINGs/userdefaults.c:188 ../../WINGs/userdefaults.c:204
|
||||
#, c-format
|
||||
msgid "cannot read domain from file '%s' when syncing"
|
||||
msgstr "Bei der Synchronisation konnte nicht aus der Datei '%s' gelesen werden"
|
||||
|
||||
#: ../../WINGs/wcolor.c:237 ../../WINGs/wcolor.c:249 ../../WINGs/wcolor.c:288
|
||||
#: ../../WINGs/wcolor.c:329
|
||||
#, c-format
|
||||
msgid "could not allocate %s color"
|
||||
msgstr "Farbe %s konnte nicht erzeugt werden"
|
||||
|
||||
#: ../../WINGs/wcolor.c:237
|
||||
msgid "white"
|
||||
msgstr "Weiß"
|
||||
|
||||
#: ../../WINGs/wcolor.c:249
|
||||
msgid "black"
|
||||
msgstr "Schwarz"
|
||||
|
||||
#: ../../WINGs/wcolor.c:288
|
||||
msgid "gray"
|
||||
msgstr "Grau"
|
||||
|
||||
#: ../../WINGs/wcolor.c:329
|
||||
msgid "dark gray"
|
||||
msgstr "Dunkelgrau"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:420
|
||||
msgid "Colors"
|
||||
msgstr "Farben"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:610 ../../WINGs/wcolorpanel.c:2829
|
||||
msgid "Brightness"
|
||||
msgstr "Helligkeit"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:612 ../../WINGs/wcolorpanel.c:688
|
||||
#: ../../WINGs/wcolorpanel.c:721 ../../WINGs/wcolorpanel.c:755
|
||||
#: ../../WINGs/wcolorpanel.c:815 ../../WINGs/wcolorpanel.c:849
|
||||
#: ../../WINGs/wcolorpanel.c:883 ../../WINGs/wcolorpanel.c:918
|
||||
#: ../../WINGs/wcolorpanel.c:2169 ../../WINGs/wcolorpanel.c:2831
|
||||
#: ../../WINGs/wcolorpanel.c:2867 ../../WINGs/wcolorpanel.c:2903
|
||||
#: ../../WINGs/wcolorpanel.c:3745
|
||||
msgid "Color Panel: Could not allocate memory"
|
||||
msgstr "Farb-Panel: Speicher konnte nicht reserviert werden"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:685 ../../WINGs/wcolorpanel.c:686
|
||||
msgid "Red"
|
||||
msgstr "Rot"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:718 ../../WINGs/wcolorpanel.c:719
|
||||
msgid "Green"
|
||||
msgstr "Grün"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:752 ../../WINGs/wcolorpanel.c:753
|
||||
msgid "Blue"
|
||||
msgstr "Blau"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:812 ../../WINGs/wcolorpanel.c:813
|
||||
msgid "Cyan"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:846 ../../WINGs/wcolorpanel.c:847
|
||||
msgid "Magenta"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:880 ../../WINGs/wcolorpanel.c:881
|
||||
msgid "Yellow"
|
||||
msgstr "Gelb"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:915 ../../WINGs/wcolorpanel.c:916
|
||||
msgid "Black"
|
||||
msgstr "Schwarz"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:996
|
||||
msgid "Spectrum"
|
||||
msgstr "Spektrum"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1026
|
||||
msgid "Palette"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1032
|
||||
msgid "New from File..."
|
||||
msgstr "Neu aus Datei..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1033 ../../WINGs/wcolorpanel.c:1081
|
||||
#: ../../WINGs/wcolorpanel.c:1098
|
||||
msgid "Rename..."
|
||||
msgstr "Umbenennen..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1034 ../../WINGs/wcolorpanel.c:1082
|
||||
#: ../../WINGs/wcolorpanel.c:1099 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "Remove"
|
||||
msgstr "Entfernen"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1035
|
||||
msgid "Copy"
|
||||
msgstr "Kopieren"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1036
|
||||
msgid "New from Clipboard"
|
||||
msgstr "Neu aus Zwischenablage"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1057
|
||||
msgid "X11-Colors"
|
||||
msgstr "X11-Farben"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1074
|
||||
msgid "Color"
|
||||
msgstr "Farbe"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1080
|
||||
msgid "Add..."
|
||||
msgstr "Hinzufügen..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1090
|
||||
msgid "List"
|
||||
msgstr "Liste"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1097
|
||||
msgid "New..."
|
||||
msgstr "Neu..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1236
|
||||
#, c-format
|
||||
msgid "Color Panel: Could not create directory %s needed to store configurations"
|
||||
msgstr "Farb-Panel: Verzeichnis %s konnte zum Speichern der Konfiguration nicht erzeugt werden"
|
||||
|
||||
#. Delete the file, it doesn't belong here
|
||||
#: ../../WINGs/wcolorpanel.c:1242 ../../WINGs/wcolorpanel.c:3212
|
||||
#: ../../WINGs/wcolorpanel.c:3216
|
||||
msgid "File Error"
|
||||
msgstr "Dateifehler"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1243
|
||||
msgid "Could not create ColorPanel configuration directory"
|
||||
msgstr "Konfigurationsverzeichnis für Farb-Panel konnte nicht erzeugt werden"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1244 ../../WINGs/wcolorpanel.c:3213
|
||||
#: ../../WINGs/wcolorpanel.c:3218 ../../WINGs/wcolorpanel.c:3245
|
||||
#: ../../WINGs/wfilepanel.c:250 ../../WINGs/wfilepanel.c:650
|
||||
#: ../../WINGs/wfilepanel.c:662 ../../WINGs/wfilepanel.c:763
|
||||
#: ../../WINGs/wfilepanel.c:974 ../../WINGs/wfontpanel.c:591
|
||||
msgid "OK"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1250 ../../WINGs/wcolorpanel.c:1286
|
||||
#: ../../WINGs/wcolorpanel.c:1304
|
||||
msgid "Color Panel: Could not find file"
|
||||
msgstr "Farb-Panel: Datei konnte nicht gefunden werden"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1491 ../../WINGs/wcolorpanel.c:1556
|
||||
#: ../../WINGs/wcolorpanel.c:1620
|
||||
msgid "Color Panel: X failed request"
|
||||
msgstr "Farb-Panel: X-Anfrage fehlgeschlagen"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2865
|
||||
msgid "Saturation"
|
||||
msgstr "Sättigung"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2901
|
||||
msgid "Hue"
|
||||
msgstr "Farbton"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3151
|
||||
msgid "Open Palette"
|
||||
msgstr "Palette öffnen"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3213
|
||||
msgid "Invalid file format !"
|
||||
msgstr "Ungültiges Dateiformat!"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3215
|
||||
#, c-format
|
||||
msgid "can't remove file %s"
|
||||
msgstr "Datei %s konnte nicht entfert werden"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3217
|
||||
msgid "Couldn't remove file from Configuration Directory !"
|
||||
msgstr "Datei konnte nicht aus Konfigurationsverzeichnis entfernt werden!"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3244
|
||||
msgid "Rename"
|
||||
msgstr "Umbenennen"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3244
|
||||
msgid "Rename palette to:"
|
||||
msgstr "Palette umbenennen in:"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3245 ../../WINGs/wfilepanel.c:259
|
||||
#: ../../WINGs/wfilepanel.c:662 ../../WINGs/wfilepanel.c:763
|
||||
msgid "Cancel"
|
||||
msgstr "Abbrechen"
|
||||
|
||||
#. Careful, this palette exists already
|
||||
#: ../../WINGs/wcolorpanel.c:3261 ../../WINGs/wfilepanel.c:763
|
||||
msgid "Warning"
|
||||
msgstr "Warnung"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262
|
||||
msgid ""
|
||||
"Palette already exists !\n"
|
||||
"\n"
|
||||
"Overwrite ?"
|
||||
msgstr ""
|
||||
"Palette existiert bereits!\n"
|
||||
"\n"
|
||||
"Überschreiben?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "No"
|
||||
msgstr "Nein"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3294
|
||||
#, c-format
|
||||
msgid "Couldn't rename palette %s to %s\n"
|
||||
msgstr "Palette %s konnte nicht nach %s umbenannt werden\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3320
|
||||
msgid "This will permanently remove the palette "
|
||||
msgstr "Hiermit wird die Palette unwiderruflich gelöscht "
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3323
|
||||
msgid ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Are you sure you want to remove this palette ?"
|
||||
msgstr ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Sind Sie sicher, dass Sie die Palette löschen wollen?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3348
|
||||
#, c-format
|
||||
msgid "Couldn't remove palette %s\n"
|
||||
msgstr "Palette %s konnte nicht gelöscht werden\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3647
|
||||
#, c-format
|
||||
msgid "Could not open %s"
|
||||
msgstr "%s konnte nicht geöffnet werden"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3654
|
||||
#, c-format
|
||||
msgid "Could not create %s"
|
||||
msgstr "%s konnte nicht erzeugt werden"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3665
|
||||
#, c-format
|
||||
msgid "Write error on file %s"
|
||||
msgstr "Schreibfehler bei Datei %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3710
|
||||
msgid "Color Panel: Color unspecified"
|
||||
msgstr "Farb-Panel: Farbe nicht spezifiziert"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:235
|
||||
msgid "Name:"
|
||||
msgstr "Name:"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:332 ../../WINGs/wfilepanel.c:396
|
||||
msgid "Open"
|
||||
msgstr "Öffnen"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:350 ../../WINGs/wfilepanel.c:402
|
||||
msgid "Save"
|
||||
msgstr "Speichern"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:565
|
||||
#, c-format
|
||||
msgid "WINGs: could not open directory %s\n"
|
||||
msgstr "WINGs: Verzeichnis %s konnte nicht geöffnet werden\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:583
|
||||
#, c-format
|
||||
msgid "WINGs: could not stat %s\n"
|
||||
msgstr "WINGs: Dateistatus von %s unbestimmbar\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:650 ../../WINGs/wfilepanel.c:973
|
||||
#: ../../WINGs/wfontpanel.c:590
|
||||
msgid "Error"
|
||||
msgstr "Fehler"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:661
|
||||
msgid "Create Directory"
|
||||
msgstr "Verzeichnis anlegen"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:662
|
||||
msgid "Enter directory name"
|
||||
msgstr "Verzeichnisname eingeben"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:698 ../../WINGs/wfilepanel.c:737
|
||||
#: ../../WINGs/wfilepanel.c:768 ../../WINGs/wfilepanel.c:796
|
||||
msgid "Permission denied."
|
||||
msgstr "Zugriff verweigert."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:701
|
||||
#, c-format
|
||||
msgid "'%s' already exists."
|
||||
msgstr "'%s' existiert bereits."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:704
|
||||
msgid "Path does not exist."
|
||||
msgstr "Pfad existiert nicht."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:734 ../../WINGs/wfilepanel.c:793
|
||||
#, c-format
|
||||
msgid "'%s' does not exist."
|
||||
msgstr "'%s' existiert nicht."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:741 ../../WINGs/wfilepanel.c:800
|
||||
msgid "Insufficient memory available."
|
||||
msgstr "Nicht genügend Speicher verfügbar."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:745 ../../WINGs/wfilepanel.c:804
|
||||
#, c-format
|
||||
msgid "'%s' is on a read-only filesystem."
|
||||
msgstr "'%s' liegt auf einem nur lesbaren Dateisystem."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:748 ../../WINGs/wfilepanel.c:780
|
||||
#: ../../WINGs/wfilepanel.c:807
|
||||
#, c-format
|
||||
msgid "Can not delete '%s'."
|
||||
msgstr "Kann %s nicht löschen."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:755
|
||||
#, c-format
|
||||
msgid "Delete directory %s ?"
|
||||
msgstr "Verzeichnis %s löschen?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:759
|
||||
#, c-format
|
||||
msgid "Delete file %s ?"
|
||||
msgstr "Datei %s löschen?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:771
|
||||
#, c-format
|
||||
msgid "Directory '%s' does not exist."
|
||||
msgstr "Verzeichnis '%s' existiert nicht."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:774
|
||||
#, c-format
|
||||
msgid "Directory '%s' is not empty."
|
||||
msgstr "Verzeichnis '%s' ist nicht leer."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:777
|
||||
#, c-format
|
||||
msgid "Directory '%s' is busy."
|
||||
msgstr "Verzeichnis '%s' wird benutz."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:790
|
||||
#, c-format
|
||||
msgid "'%s' is a directory."
|
||||
msgstr "'%s' ist ein Verzeichnis."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:832
|
||||
#, c-format
|
||||
msgid "An error occured browsing '%s'."
|
||||
msgstr "Fehler beim Lesen von '%s'."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:836
|
||||
#, c-format
|
||||
msgid "'%s' is not a directory."
|
||||
msgstr "'%s' ist kein Verzeichnis."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:973
|
||||
msgid "File does not exist."
|
||||
msgstr "Datei existiert nicht."
|
||||
|
||||
#: ../../WINGs/wfont.c:40
|
||||
#, c-format
|
||||
msgid "invalid font: %s. Trying '%s'"
|
||||
msgstr "Ungültige Schriftart: %s. Wird ersetzt durch %s."
|
||||
|
||||
#: ../../WINGs/wfont.c:257 ../../WINGs/wfont.c:277
|
||||
#, c-format
|
||||
msgid "could not load font: %s."
|
||||
msgstr "Schriftart konnte nicht geladen werden: %s"
|
||||
|
||||
#. WMSetWidgetBackgroundColor(panel->win, WMWhiteColor(scr));
|
||||
#: ../../WINGs/wfontpanel.c:203
|
||||
msgid "Font Panel"
|
||||
msgstr "Schrift-Panel"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:239
|
||||
msgid "The quick brown fox jumps over the lazy dog"
|
||||
msgstr ""
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:245
|
||||
msgid "Family"
|
||||
msgstr "Familie"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:256
|
||||
msgid "Typeface"
|
||||
msgstr "Schriftart"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:267
|
||||
msgid "Size"
|
||||
msgstr "Größe"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:286
|
||||
msgid "Set"
|
||||
msgstr "Setzen"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:292
|
||||
msgid "Revert"
|
||||
msgstr "Zurücksetzen"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:591
|
||||
msgid "Could not init font config library\n"
|
||||
msgstr "\"font-config\"-Bibliothek konnte nicht initialisiert werden\n"
|
||||
|
||||
#: ../../WINGs/widgets.c:419
|
||||
#, c-format
|
||||
msgid "WINGs: could not load widget images file: %s"
|
||||
msgstr "WINGs: Widget-Bilderdatei konnte nicht geladen werden: %s"
|
||||
|
||||
#: ../../WINGs/widgets.c:767
|
||||
msgid ""
|
||||
"could not load any fonts. Make sure your font installation and locale "
|
||||
"settings are correct."
|
||||
msgstr ""
|
||||
"Keine Schrifen konnten geladen werden. Überprüfen Sie, ob Ihre Schrifteninstallation und -"
|
||||
"Lokalisierungseinstellungen korrekt sind."
|
||||
|
||||
#: ../../WINGs/wruler.c:192
|
||||
msgid "0 inches"
|
||||
msgstr "0 Inch"
|
||||
|
||||
739
WINGs/po/fr.po
Normal file
739
WINGs/po/fr.po
Normal file
@@ -0,0 +1,739 @@
|
||||
# KTranslator Generated File
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Free Software Foundation, Inc.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WINGs 0.80.0\n"
|
||||
"POT-Creation-Date: 2003-05-02 15:39+0200\n"
|
||||
"PO-Revision-Date: 2002-01-09 21:20+0100\n"
|
||||
"Last-Translator: Emmanuel Benoit <tseeker@neptune.fr>\n"
|
||||
"Language-Team: Français <fr@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: unknown\n"
|
||||
|
||||
#: ../../WINGs/connection.c:467 ../../WINGs/connection.c:532
|
||||
#: ../../WINGs/connection.c:575
|
||||
msgid "Bad address-service-protocol combination"
|
||||
msgstr "Mauvaise combinaison adresse-service-protocole"
|
||||
|
||||
#: ../../WINGs/error.c:54
|
||||
#, c-format
|
||||
msgid "Unknown error %d"
|
||||
msgstr "Erreur inconnue %d"
|
||||
|
||||
#: ../../WINGs/error.c:59
|
||||
#, c-format
|
||||
msgid "Error %d"
|
||||
msgstr "Erreur %d"
|
||||
|
||||
#: ../../WINGs/error.c:110
|
||||
msgid " warning: "
|
||||
msgstr " Avertissement : "
|
||||
|
||||
#: ../../WINGs/error.c:137
|
||||
msgid " fatal error: "
|
||||
msgstr " erreur fatale : "
|
||||
|
||||
#: ../../WINGs/error.c:163 ../../WINGs/error.c:192
|
||||
msgid " error: "
|
||||
msgstr " erreur : "
|
||||
|
||||
#: ../../WINGs/findfile.c:48
|
||||
#, c-format
|
||||
msgid "could not get password entry for UID %i"
|
||||
msgstr "Impossible de lire le mot de passe de l'UID %i"
|
||||
|
||||
#: ../../WINGs/findfile.c:66
|
||||
#, c-format
|
||||
msgid "could not get password entry for user %s"
|
||||
msgstr "Impossible de lire le mot de passe de l'utilisateur %s"
|
||||
|
||||
#: ../../WINGs/host.c:114
|
||||
msgid "Cannot get current host name"
|
||||
msgstr "Impossible de déterminer le nom de la machine"
|
||||
|
||||
# TODO pas de traduction correcte possible, cf source.
|
||||
#: ../../WINGs/proplist.c:91
|
||||
#, c-format
|
||||
msgid "syntax error in %s %s, line %i: %s"
|
||||
msgstr "Faute de syntaxe dans %s %s, ligne %i : %s"
|
||||
|
||||
#: ../../WINGs/proplist.c:150
|
||||
msgid "Only string or data is supported for a proplist dictionary key"
|
||||
msgstr ""
|
||||
"Seuls les types string ou data sont supportés pour une clé de dictionnaire "
|
||||
"Proplist"
|
||||
|
||||
#: ../../WINGs/proplist.c:184 ../../WINGs/proplist.c:236
|
||||
#: ../../WINGs/proplist.c:394 ../../WINGs/proplist.c:474
|
||||
#: ../../WINGs/proplist.c:1075 ../../WINGs/proplist.c:1127
|
||||
#: ../../WINGs/proplist.c:1293 ../../WINGs/proplist.c:1372
|
||||
#: ../../WINGs/proplist.c:1493 ../../WINGs/proplist.c:1540
|
||||
msgid "Used proplist functions on non-WMPropLists objects"
|
||||
msgstr "Une fonction Proplist a été utilisée sur des objets non-WMPropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:630
|
||||
msgid "unterminated PropList string"
|
||||
msgstr "chaîne PropList sans fin"
|
||||
|
||||
#: ../../WINGs/proplist.c:670
|
||||
msgid "unterminated PropList data"
|
||||
msgstr "données PropList sans fin"
|
||||
|
||||
#: ../../WINGs/proplist.c:678
|
||||
msgid "unterminated PropList data (missing hexdigit)"
|
||||
msgstr "données PropList sans fin (il manque un chiffre hexadécimal)"
|
||||
|
||||
#: ../../WINGs/proplist.c:690 ../../WINGs/proplist.c:695
|
||||
msgid "non hexdigit character in PropList data"
|
||||
msgstr "caractère non-hexadécimal dans les données PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:729
|
||||
msgid "unterminated PropList array"
|
||||
msgstr "tableau PropList sans fin"
|
||||
|
||||
#: ../../WINGs/proplist.c:737
|
||||
msgid "missing or unterminated PropList array"
|
||||
msgstr "tableau PropList manquant ou sans fin"
|
||||
|
||||
#: ../../WINGs/proplist.c:747
|
||||
msgid "could not get PropList array element"
|
||||
msgstr "impossible de lire l'élément du tableau PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:776
|
||||
msgid "unterminated PropList dictionary"
|
||||
msgstr "dictionnaire PropList sans fin"
|
||||
|
||||
#: ../../WINGs/proplist.c:793
|
||||
msgid "missing PropList dictionary key"
|
||||
msgstr "clef du dictionnaire PropList manquante"
|
||||
|
||||
#: ../../WINGs/proplist.c:795
|
||||
msgid "missing PropList dictionary entry key or unterminated dictionary"
|
||||
msgstr "clef du dictionnaire PropList manquante ou dictionnaire sans fin"
|
||||
|
||||
#: ../../WINGs/proplist.c:803
|
||||
msgid "error parsing PropList dictionary key"
|
||||
msgstr "erreur lors de l'analyse de la clef de dictionnaire PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:811
|
||||
msgid "missing = in PropList dictionary entry"
|
||||
msgstr "signe '=' manquant dans l'entrée du dictionnaire PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:819
|
||||
msgid "error parsing PropList dictionary entry value"
|
||||
msgstr ""
|
||||
"erreur lors de l'analyse de la valeur de l'entrée du dictionnaire PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:827
|
||||
msgid "missing ; in PropList dictionary entry"
|
||||
msgstr "signe ';' manquant dans l'entrée du dictionnaire PropList"
|
||||
|
||||
#: ../../WINGs/proplist.c:888
|
||||
msgid ""
|
||||
"was expecting a string, data, array or dictionary. If it's a string, try "
|
||||
"enclosing it with \"."
|
||||
msgstr ""
|
||||
"une chaine, des données, un tableau ou un dictionnaire étaient attendus. "
|
||||
"S'il s'agit d'une chaîne, essayez de la délimiter grâce à '\"'."
|
||||
|
||||
#: ../../WINGs/proplist.c:892
|
||||
msgid "Comments are not allowed inside WindowMaker owned domain files."
|
||||
msgstr ""
|
||||
"Les commentaires ne sont pas autorisés dans les fichiers appartenant au "
|
||||
"domaine de Window Maker."
|
||||
|
||||
#: ../../WINGs/proplist.c:1563 ../../WINGs/proplist.c:1628
|
||||
msgid "extra data after end of property list"
|
||||
msgstr "données excédentaires après la fin de la liste de propriétés"
|
||||
|
||||
#: ../../WINGs/proplist.c:1606
|
||||
#, c-format
|
||||
msgid "could not get size for file '%s'"
|
||||
msgstr "impossible de déterminer la taille du fichier '%s'"
|
||||
|
||||
#: ../../WINGs/proplist.c:1618
|
||||
#, c-format
|
||||
msgid "error reading from file '%s'"
|
||||
msgstr "erreur pendant la lecture du fichier '%s'"
|
||||
|
||||
#: ../../WINGs/proplist.c:1669
|
||||
#, c-format
|
||||
msgid "mkstemp (%s) failed"
|
||||
msgstr "mkstemp (%s) a échoué"
|
||||
|
||||
#: ../../WINGs/proplist.c:1680
|
||||
#, c-format
|
||||
msgid "mktemp (%s) failed"
|
||||
msgstr "mktemp (%s) a échoué"
|
||||
|
||||
#: ../../WINGs/proplist.c:1691
|
||||
#, c-format
|
||||
msgid "open (%s) failed"
|
||||
msgstr "open (%s) a échoué"
|
||||
|
||||
#: ../../WINGs/proplist.c:1698
|
||||
#, c-format
|
||||
msgid "writing to file: %s failed"
|
||||
msgstr "erreur pendant l'écriture dans le fichier '%s'"
|
||||
|
||||
#: ../../WINGs/proplist.c:1706
|
||||
#, c-format
|
||||
msgid "fclose (%s) failed"
|
||||
msgstr "erreur lors de la fermeture du fichier '%s'"
|
||||
|
||||
#: ../../WINGs/proplist.c:1715
|
||||
#, c-format
|
||||
msgid "rename ('%s' to '%s') failed"
|
||||
msgstr "impossible de renommer '%s' en '%s'"
|
||||
|
||||
#. something happened with the file. just overwrite it
|
||||
#: ../../WINGs/userdefaults.c:188 ../../WINGs/userdefaults.c:204
|
||||
#, c-format
|
||||
msgid "cannot read domain from file '%s' when syncing"
|
||||
msgstr ""
|
||||
"impossible de lire le domaine depuis le fichier '%s' pendant la "
|
||||
"synchronisation"
|
||||
|
||||
#: ../../WINGs/wcolor.c:224 ../../WINGs/wcolor.c:236 ../../WINGs/wcolor.c:275
|
||||
#: ../../WINGs/wcolor.c:316
|
||||
#, c-format
|
||||
msgid "could not allocate %s color"
|
||||
msgstr "impossible d'allouer la couleur %s"
|
||||
|
||||
#: ../../WINGs/wcolor.c:224
|
||||
msgid "white"
|
||||
msgstr "blanc"
|
||||
|
||||
#: ../../WINGs/wcolor.c:236
|
||||
msgid "black"
|
||||
msgstr "noir"
|
||||
|
||||
#: ../../WINGs/wcolor.c:275
|
||||
msgid "gray"
|
||||
msgstr "gris"
|
||||
|
||||
#: ../../WINGs/wcolor.c:316
|
||||
msgid "dark gray"
|
||||
msgstr "gris sombre"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:420
|
||||
msgid "Colors"
|
||||
msgstr "Couleurs"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:610 ../../WINGs/wcolorpanel.c:2829
|
||||
msgid "Brightness"
|
||||
msgstr "Luminosité"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:612 ../../WINGs/wcolorpanel.c:688
|
||||
#: ../../WINGs/wcolorpanel.c:721 ../../WINGs/wcolorpanel.c:755
|
||||
#: ../../WINGs/wcolorpanel.c:815 ../../WINGs/wcolorpanel.c:849
|
||||
#: ../../WINGs/wcolorpanel.c:883 ../../WINGs/wcolorpanel.c:918
|
||||
#: ../../WINGs/wcolorpanel.c:2169 ../../WINGs/wcolorpanel.c:2831
|
||||
#: ../../WINGs/wcolorpanel.c:2867 ../../WINGs/wcolorpanel.c:2903
|
||||
#: ../../WINGs/wcolorpanel.c:3745
|
||||
msgid "Color Panel: Could not allocate memory"
|
||||
msgstr "Panneau de Sélection des Couleur: impossible d'allouer la mémoire"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:685 ../../WINGs/wcolorpanel.c:686
|
||||
msgid "Red"
|
||||
msgstr "Rouge"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:718 ../../WINGs/wcolorpanel.c:719
|
||||
msgid "Green"
|
||||
msgstr "Vert"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:752 ../../WINGs/wcolorpanel.c:753
|
||||
msgid "Blue"
|
||||
msgstr "Bleu"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:812 ../../WINGs/wcolorpanel.c:813
|
||||
msgid "Cyan"
|
||||
msgstr "Cyan"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:846 ../../WINGs/wcolorpanel.c:847
|
||||
msgid "Magenta"
|
||||
msgstr "Magenta"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:880 ../../WINGs/wcolorpanel.c:881
|
||||
msgid "Yellow"
|
||||
msgstr "Jaune"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:915 ../../WINGs/wcolorpanel.c:916
|
||||
msgid "Black"
|
||||
msgstr "Noir"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:996
|
||||
msgid "Spectrum"
|
||||
msgstr "Spectre"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1026
|
||||
msgid "Palette"
|
||||
msgstr "Palette"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1032
|
||||
msgid "New from File..."
|
||||
msgstr "Nouveau d'après le fichier..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1033 ../../WINGs/wcolorpanel.c:1081
|
||||
#: ../../WINGs/wcolorpanel.c:1098
|
||||
msgid "Rename..."
|
||||
msgstr "Renommer..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1034 ../../WINGs/wcolorpanel.c:1082
|
||||
#: ../../WINGs/wcolorpanel.c:1099 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "Remove"
|
||||
msgstr "Supprimer"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1035
|
||||
msgid "Copy"
|
||||
msgstr "Copier"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1036
|
||||
msgid "New from Clipboard"
|
||||
msgstr "Nouveau d'après le presse-papier"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1057
|
||||
msgid "X11-Colors"
|
||||
msgstr "Couleurs X11"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1074
|
||||
msgid "Color"
|
||||
msgstr "Couleur"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1080
|
||||
msgid "Add..."
|
||||
msgstr "Ajouter..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1090
|
||||
msgid "List"
|
||||
msgstr "Liste"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1097
|
||||
msgid "New..."
|
||||
msgstr "Nouveau..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1236
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Color Panel: Could not create directory %s needed to store configurations"
|
||||
msgstr ""
|
||||
"Panneau de sélection des couleurs : impossible de créer le répertoire %s "
|
||||
"requis pour enregistrer les configurations."
|
||||
|
||||
#. Delete the file, it doesn't belong here
|
||||
#: ../../WINGs/wcolorpanel.c:1242 ../../WINGs/wcolorpanel.c:3212
|
||||
#: ../../WINGs/wcolorpanel.c:3216
|
||||
msgid "File Error"
|
||||
msgstr "Erreur de fichier"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1243
|
||||
msgid "Could not create ColorPanel configuration directory"
|
||||
msgstr ""
|
||||
"Impossible de créer le répertoire pour la configuration du panneau de "
|
||||
"sélection des couleurs."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1244 ../../WINGs/wcolorpanel.c:3213
|
||||
#: ../../WINGs/wcolorpanel.c:3218 ../../WINGs/wcolorpanel.c:3245
|
||||
#: ../../WINGs/wfilepanel.c:250 ../../WINGs/wfilepanel.c:650
|
||||
#: ../../WINGs/wfilepanel.c:662 ../../WINGs/wfilepanel.c:763
|
||||
#: ../../WINGs/wfilepanel.c:974 ../../WINGs/wfontpanel.c:751
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1250 ../../WINGs/wcolorpanel.c:1286
|
||||
#: ../../WINGs/wcolorpanel.c:1304
|
||||
msgid "Color Panel: Could not find file"
|
||||
msgstr "Panneau de sélection des couleurs : Impossible de trouver le fichier."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1491 ../../WINGs/wcolorpanel.c:1556
|
||||
#: ../../WINGs/wcolorpanel.c:1620
|
||||
msgid "Color Panel: X failed request"
|
||||
msgstr "Panneau de sélection des couleurs : échec d'une requête X"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2865
|
||||
msgid "Saturation"
|
||||
msgstr "Saturation"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2901
|
||||
msgid "Hue"
|
||||
msgstr "Teinte"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3151
|
||||
msgid "Open Palette"
|
||||
msgstr "Ouvrir une palette"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3213
|
||||
msgid "Invalid file format !"
|
||||
msgstr "Format de fichier invalide !"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3215
|
||||
#, c-format
|
||||
msgid "can't remove file %s"
|
||||
msgstr "Impossible de supprimer le fichier %s."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3217
|
||||
msgid "Couldn't remove file from Configuration Directory !"
|
||||
msgstr "Impossible de supprimer le fichier du répertoire de configuration !"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3244
|
||||
msgid "Rename"
|
||||
msgstr "Renommer"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3244
|
||||
msgid "Rename palette to:"
|
||||
msgstr "Renommer la palette en :"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3245 ../../WINGs/wfilepanel.c:259
|
||||
#: ../../WINGs/wfilepanel.c:662 ../../WINGs/wfilepanel.c:763
|
||||
msgid "Cancel"
|
||||
msgstr "Annuler"
|
||||
|
||||
#. Careful, this palette exists already
|
||||
#: ../../WINGs/wcolorpanel.c:3261 ../../WINGs/wfilepanel.c:763
|
||||
msgid "Warning"
|
||||
msgstr "Avertissement"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262
|
||||
msgid ""
|
||||
"Palette already exists !\n"
|
||||
"\n"
|
||||
"Overwrite ?"
|
||||
msgstr ""
|
||||
"La palette existe déjà !\n"
|
||||
"\n"
|
||||
"Écraser ?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "No"
|
||||
msgstr "Non"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "Yes"
|
||||
msgstr "Oui"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3294
|
||||
#, c-format
|
||||
msgid "Couldn't rename palette %s to %s\n"
|
||||
msgstr "Impossible de renommer la palette %s en %s.\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3320
|
||||
msgid "This will permanently remove the palette "
|
||||
msgstr "Ceci détruira définitivement la palette "
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3323
|
||||
msgid ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Are you sure you want to remove this palette ?"
|
||||
msgstr ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Êtes-vous sûr de vouloir supprimer cette palette ?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3348
|
||||
#, c-format
|
||||
msgid "Couldn't remove palette %s\n"
|
||||
msgstr "Impossible de détruire la palette %s.\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3647
|
||||
#, c-format
|
||||
msgid "Could not open %s"
|
||||
msgstr "Impossible d'ouvrir %s."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3654
|
||||
#, c-format
|
||||
msgid "Could not create %s"
|
||||
msgstr "Impossible de créer %s."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3665
|
||||
#, c-format
|
||||
msgid "Write error on file %s"
|
||||
msgstr "Erreur d'écriture dans le fichier %s."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3710
|
||||
msgid "Color Panel: Color unspecified"
|
||||
msgstr "Panneau de sélection des couleurs: couleur non spécifiée."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:235
|
||||
msgid "Name:"
|
||||
msgstr "Nom :"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:332 ../../WINGs/wfilepanel.c:396
|
||||
msgid "Open"
|
||||
msgstr "Ouvrir"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:350 ../../WINGs/wfilepanel.c:402
|
||||
msgid "Save"
|
||||
msgstr "Enregistrer"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:565
|
||||
#, c-format
|
||||
msgid "WINGs: could not open directory %s\n"
|
||||
msgstr "WINGs : Impossible d'ouvrir le répertoire %s.\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:583
|
||||
#, c-format
|
||||
msgid "WINGs: could not stat %s\n"
|
||||
msgstr "WINGs : impossible de lire l'état du fichier %s.\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:650 ../../WINGs/wfilepanel.c:973
|
||||
#: ../../WINGs/wfontpanel.c:750
|
||||
msgid "Error"
|
||||
msgstr "Erreur"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:661
|
||||
msgid "Create Directory"
|
||||
msgstr "Créer un répertoire"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:662
|
||||
msgid "Enter directory name"
|
||||
msgstr "Saisissez le nom du répertoire"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:698 ../../WINGs/wfilepanel.c:737
|
||||
#: ../../WINGs/wfilepanel.c:768 ../../WINGs/wfilepanel.c:796
|
||||
msgid "Permission denied."
|
||||
msgstr "Permission refusée."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:701
|
||||
#, c-format
|
||||
msgid "'%s' already exists."
|
||||
msgstr "'%s' existe déjà."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:704
|
||||
msgid "Path does not exist."
|
||||
msgstr "Le chemin n'existe pas."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:734 ../../WINGs/wfilepanel.c:793
|
||||
#, c-format
|
||||
msgid "'%s' does not exist."
|
||||
msgstr "'%s' n'existe pas."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:741 ../../WINGs/wfilepanel.c:800
|
||||
msgid "Insufficient memory available."
|
||||
msgstr "Mémoire disponible insuffisante."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:745 ../../WINGs/wfilepanel.c:804
|
||||
#, c-format
|
||||
msgid "'%s' is on a read-only filesystem."
|
||||
msgstr "'%s' est sur un système de fichiers en lecture seule."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:748 ../../WINGs/wfilepanel.c:780
|
||||
#: ../../WINGs/wfilepanel.c:807
|
||||
#, c-format
|
||||
msgid "Can not delete '%s'."
|
||||
msgstr "Impossible de supprimer '%s'."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:755
|
||||
#, c-format
|
||||
msgid "Delete directory %s ?"
|
||||
msgstr "Supprimer le répertoire %s ?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:759
|
||||
#, c-format
|
||||
msgid "Delete file %s ?"
|
||||
msgstr "Supprimer le fichier %s ?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:771
|
||||
#, c-format
|
||||
msgid "Directory '%s' does not exist."
|
||||
msgstr "Le répertoire '%s' n'existe pas."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:774
|
||||
#, c-format
|
||||
msgid "Directory '%s' is not empty."
|
||||
msgstr "Le répertoire '%s' n'est pas vide."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:777
|
||||
#, c-format
|
||||
msgid "Directory '%s' is busy."
|
||||
msgstr "Le répertoire '%s' est occupé."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:790
|
||||
#, c-format
|
||||
msgid "'%s' is a directory."
|
||||
msgstr "'%s' est un répertoire."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:832
|
||||
#, c-format
|
||||
msgid "An error occured browsing '%s'."
|
||||
msgstr "Une erreur s'est produite pendant le parcours de '%s'."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:836
|
||||
#, c-format
|
||||
msgid "'%s' is not a directory."
|
||||
msgstr "'%s' n'est pas un répertoire."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:973
|
||||
msgid "File does not exist."
|
||||
msgstr "Le fichier n'existe pas."
|
||||
|
||||
#: ../../WINGs/wfont.c:133 ../../WINGs/wfont.c:143
|
||||
#, c-format
|
||||
msgid "Invalid size specification '%s' in %s. Using default %d\n"
|
||||
msgstr ""
|
||||
"Taille invalide dans %2$s : '%1$s'. Utilisation de la valeur par défaut %3"
|
||||
"$d\n"
|
||||
|
||||
#: ../../WINGs/wfont.c:187
|
||||
#, c-format
|
||||
msgid "the following character sets are missing in %s:"
|
||||
msgstr "Les jeux de caractères suivants manquent dans %s :"
|
||||
|
||||
#: ../../WINGs/wfont.c:193
|
||||
#, c-format
|
||||
msgid ""
|
||||
"the string \"%s\" will be used in place of any characters from those sets."
|
||||
msgstr ""
|
||||
"La chaîne « %s » sera utilisée à la place de tous les caractères de ces jeux."
|
||||
|
||||
#. is arial a good fallback for multibyte?
|
||||
#: ../../WINGs/wfont.c:599 ../../WINGs/wfont.c:614
|
||||
#, c-format
|
||||
msgid "could not load font %s. Trying arial."
|
||||
msgstr ""
|
||||
"Impossible de charger la police de caractères %s, essai de la police "
|
||||
"« arial »."
|
||||
|
||||
#: ../../WINGs/wfont.c:606
|
||||
msgid "could not load antialiased font set. Reverting to standard font sets."
|
||||
msgstr ""
|
||||
"Impossible de charger les polices lissées, utilisation des polices normales."
|
||||
|
||||
#: ../../WINGs/wfont.c:609
|
||||
#, c-format
|
||||
msgid "could not load FontSet %s. Trying fixed."
|
||||
msgstr ""
|
||||
"Impossible de charger la famille de polices %s, essai de la famille "
|
||||
"« fixed »."
|
||||
|
||||
#: ../../WINGs/wfont.c:621
|
||||
msgid "could not load antialiased fonts. Reverting to normal fonts."
|
||||
msgstr ""
|
||||
"Impossible de charger les polices lissées, utilisation des polices normales."
|
||||
|
||||
#: ../../WINGs/wfont.c:624 ../../WINGs/wfont.c:635
|
||||
#, c-format
|
||||
msgid "could not load font %s. Trying fixed."
|
||||
msgstr ""
|
||||
"Impossible de charger la police de caractères %s, essai de la police "
|
||||
"« fixed »."
|
||||
|
||||
#: ../../WINGs/wfont.c:629
|
||||
#, c-format
|
||||
msgid "could not load font set %s. Trying fixed."
|
||||
msgstr ""
|
||||
"Impossible de charger la famille de polices %s, essai de la famille "
|
||||
"« fixed »."
|
||||
|
||||
#: ../../WINGs/wfont.c:639
|
||||
msgid "could not load fixed font!"
|
||||
msgstr "Impossible de charger la police de caractères « fixed » !"
|
||||
|
||||
#: ../../WINGs/wfont.c:704 ../../WINGs/wfont.c:765 ../../WINGs/wfont.c:836
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Conversion to widechar failed (possible invalid multibyte sequence): '%s':"
|
||||
"(pos %d)\n"
|
||||
msgstr ""
|
||||
"Échec de la conversion en widechar (probablement une séquence d'octets "
|
||||
"erronée) : « %s » (pos %d)\n"
|
||||
|
||||
#: ../../WINGs/wfont.c:887
|
||||
#, c-format
|
||||
msgid "font description %s is too large."
|
||||
msgstr "La description de la police de caractères %s est trop volumineuse."
|
||||
|
||||
#. // remove warning later. or maybe not
|
||||
#: ../../WINGs/wfont.c:935
|
||||
#, c-format
|
||||
msgid "Invalid font specification: '%s'\n"
|
||||
msgstr "Déclaration de police invalide : « %s »\n"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:235
|
||||
msgid "Test!!!"
|
||||
msgstr "Test !"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:241
|
||||
msgid "Family"
|
||||
msgstr "Famille"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:252
|
||||
msgid "Typeface"
|
||||
msgstr "Caractère"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:263
|
||||
msgid "Size"
|
||||
msgstr "Taille"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:282
|
||||
msgid "Set"
|
||||
msgstr "Famille"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:288
|
||||
msgid "Revert"
|
||||
msgstr "Revenir"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:751
|
||||
msgid "Could not retrieve font list"
|
||||
msgstr "Impossible de lire la liste des polices de caractères."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:765
|
||||
#, c-format
|
||||
msgid "font name %s is longer than 256, which is invalid."
|
||||
msgstr ""
|
||||
"Le nom de police %s a plus de 256 caractères et est par conséquent invalide."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:913
|
||||
msgid "Roman"
|
||||
msgstr "Roman"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:916
|
||||
msgid "Italic"
|
||||
msgstr "Italique"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:918
|
||||
msgid "Oblique"
|
||||
msgstr "Penché"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:920
|
||||
msgid "Rev Italic"
|
||||
msgstr "Italique inverse"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:922
|
||||
msgid "Rev Oblique"
|
||||
msgstr "Penché inverse"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:928
|
||||
msgid "Normal"
|
||||
msgstr "Normal"
|
||||
|
||||
#: ../../WINGs/widgets.c:419
|
||||
#, c-format
|
||||
msgid "WINGs: could not load widget images file: %s"
|
||||
msgstr "WINGs : impossible de charger le fichier d'images de widget '%s'."
|
||||
|
||||
#: ../../WINGs/widgets.c:770
|
||||
msgid ""
|
||||
"Text antialiasing is enabled in the configuration but the X server doesn't "
|
||||
"have the required capabilities (missing RENDER extension). Disabling text "
|
||||
"antialiasing."
|
||||
msgstr ""
|
||||
"Le lissage du texte est activé dans la configuration mais le serveur X ne "
|
||||
"dispose pas de l'extension adéquate (extension RENDER). Desactivation du "
|
||||
"lissage."
|
||||
|
||||
#: ../../WINGs/widgets.c:787
|
||||
msgid ""
|
||||
"could not load any fonts. Make sure your font installation and locale "
|
||||
"settings are correct."
|
||||
msgstr ""
|
||||
"Aucune police n'a pu être chargée. Veuillez vérifier que vos polices sont "
|
||||
"correctement installées et que votre langue est bien configurée."
|
||||
|
||||
#: ../../WINGs/wruler.c:192
|
||||
msgid "0 inches"
|
||||
msgstr "0 pouces"
|
||||
719
WINGs/po/sk.po
Normal file
719
WINGs/po/sk.po
Normal file
@@ -0,0 +1,719 @@
|
||||
# Slovak messages for WINGs
|
||||
# (C) 2001 Jan "judas" Tomka
|
||||
#
|
||||
# Original translation by Jan "judas" Tomka on Feb 25 2001
|
||||
# Currently maintained by Jan "judas" Tomka <judas@linux.sk>
|
||||
#
|
||||
# Version history:
|
||||
# WM-ver author email date
|
||||
# 0.65.1 Jan "judas" Tomka <judas@linux.sk> Aug 08 2001
|
||||
# 0.70.0 Jan "judas" Tomka <judas@linux.sk> Oct 15 2001
|
||||
# 0.70.1 Jan "judas" Tomka <judas@linux.sk> Nov 02 2001
|
||||
# 0.80.0 Jan "judas" Tomka <judas@linux.sk> Dec 20 2001
|
||||
# 0.80.2 Jan "judas" Tomka <judas@linux.sk> Jan 31 2004
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: WINGs 0.80.0\n"
|
||||
"POT-Creation-Date: 2004-01-31 18:36+0100\n"
|
||||
"PO-Revision-Date: 2001-12-20 04:00+0100\n"
|
||||
"Last-Translator: Jan \"judas\" Tomka <judas@linux.sk>\n"
|
||||
"Language-Team: Slovak <sk@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: ../../WINGs/connection.c:467 ../../WINGs/connection.c:532
|
||||
#: ../../WINGs/connection.c:575
|
||||
msgid "Bad address-service-protocol combination"
|
||||
msgstr "Nesprávna kombinácia adresa-služba-protokol"
|
||||
|
||||
#: ../../WINGs/error.c:54
|
||||
#, c-format
|
||||
msgid "Unknown error %d"
|
||||
msgstr "Nezmána chyba %d"
|
||||
|
||||
#: ../../WINGs/error.c:59
|
||||
#, c-format
|
||||
msgid "Error %d"
|
||||
msgstr "Chyba %d"
|
||||
|
||||
#: ../../WINGs/error.c:110
|
||||
msgid " warning: "
|
||||
msgstr " varovanie: "
|
||||
|
||||
#: ../../WINGs/error.c:137
|
||||
msgid " fatal error: "
|
||||
msgstr " fatálna chyba: "
|
||||
|
||||
#: ../../WINGs/error.c:163 ../../WINGs/error.c:192
|
||||
msgid " error: "
|
||||
msgstr " chyba: "
|
||||
|
||||
#: ../../WINGs/findfile.c:48
|
||||
#, c-format
|
||||
msgid "could not get password entry for UID %i"
|
||||
msgstr "nemožno zistiť informácie o UID %i"
|
||||
|
||||
#: ../../WINGs/findfile.c:66
|
||||
#, c-format
|
||||
msgid "could not get password entry for user %s"
|
||||
msgstr "nemožno zistiť informácie o užívateľovi %s"
|
||||
|
||||
#: ../../WINGs/host.c:114
|
||||
msgid "Cannot get current host name"
|
||||
msgstr "Nemožno zistiť aktuálne meno počítača"
|
||||
|
||||
#: ../../WINGs/proplist.c:91
|
||||
#, c-format
|
||||
msgid "syntax error in %s %s, line %i: %s"
|
||||
msgstr "chyba syntaxe v %s %s, riadok %i: %s"
|
||||
|
||||
#: ../../WINGs/proplist.c:150
|
||||
msgid "Only string or data is supported for a proplist dictionary key"
|
||||
msgstr "Pre kľúč slovníka proplist je podporovaný len reťazec alebo dáta"
|
||||
|
||||
#: ../../WINGs/proplist.c:184 ../../WINGs/proplist.c:236
|
||||
#: ../../WINGs/proplist.c:394 ../../WINGs/proplist.c:474
|
||||
#: ../../WINGs/proplist.c:1075 ../../WINGs/proplist.c:1127
|
||||
#: ../../WINGs/proplist.c:1293 ../../WINGs/proplist.c:1372
|
||||
#: ../../WINGs/proplist.c:1493 ../../WINGs/proplist.c:1540
|
||||
msgid "Used proplist functions on non-WMPropLists objects"
|
||||
msgstr "Použitá proplist funkcia na iných ako WMPropLists objektoch"
|
||||
|
||||
#: ../../WINGs/proplist.c:630
|
||||
msgid "unterminated PropList string"
|
||||
msgstr "neukončený PropList reťazec"
|
||||
|
||||
#: ../../WINGs/proplist.c:670
|
||||
msgid "unterminated PropList data"
|
||||
msgstr "neukončené PropList dáta"
|
||||
|
||||
#: ../../WINGs/proplist.c:678
|
||||
msgid "unterminated PropList data (missing hexdigit)"
|
||||
msgstr "neukončené PropList dáta (chýbajúca hex číslica)"
|
||||
|
||||
#: ../../WINGs/proplist.c:690 ../../WINGs/proplist.c:695
|
||||
msgid "non hexdigit character in PropList data"
|
||||
msgstr "v PropList dátach je znak, ktorý nie je hex číslicou"
|
||||
|
||||
#: ../../WINGs/proplist.c:729
|
||||
msgid "unterminated PropList array"
|
||||
msgstr "neukončené PropList pole"
|
||||
|
||||
#: ../../WINGs/proplist.c:737
|
||||
msgid "missing or unterminated PropList array"
|
||||
msgstr "chýbajúce alebo neukončené PropList pole"
|
||||
|
||||
#: ../../WINGs/proplist.c:747
|
||||
msgid "could not get PropList array element"
|
||||
msgstr "nemožno zistiť prvok PropList poľa"
|
||||
|
||||
#: ../../WINGs/proplist.c:776
|
||||
msgid "unterminated PropList dictionary"
|
||||
msgstr "neukončený PropList slovník"
|
||||
|
||||
#: ../../WINGs/proplist.c:793
|
||||
msgid "missing PropList dictionary key"
|
||||
msgstr "chýbajúci kľúč PropList slovníka"
|
||||
|
||||
#: ../../WINGs/proplist.c:795
|
||||
msgid "missing PropList dictionary entry key or unterminated dictionary"
|
||||
msgstr "chýbajúci kľúč položky PropList slovníka alebo neukončený slovník"
|
||||
|
||||
#: ../../WINGs/proplist.c:803
|
||||
msgid "error parsing PropList dictionary key"
|
||||
msgstr "chyba pri parsovaní kľúča PropList slovníka"
|
||||
|
||||
#: ../../WINGs/proplist.c:811
|
||||
msgid "missing = in PropList dictionary entry"
|
||||
msgstr "chýbajúce = v položke PropList slovníka"
|
||||
|
||||
#: ../../WINGs/proplist.c:819
|
||||
msgid "error parsing PropList dictionary entry value"
|
||||
msgstr "chyba pri parsovaní hodnoty položky PropList slovníka"
|
||||
|
||||
#: ../../WINGs/proplist.c:827
|
||||
msgid "missing ; in PropList dictionary entry"
|
||||
msgstr "chýbajúca ; v položke PropList slovníka"
|
||||
|
||||
#: ../../WINGs/proplist.c:888
|
||||
msgid ""
|
||||
"was expecting a string, data, array or dictionary. If it's a string, try "
|
||||
"enclosing it with \"."
|
||||
msgstr ""
|
||||
"očakávaný bol reťazec, dáta, pole alebo slovník. Ak je to reťazec, skúste ho "
|
||||
"uzavrieť medzi \"."
|
||||
|
||||
#: ../../WINGs/proplist.c:892
|
||||
msgid "Comments are not allowed inside WindowMaker owned domain files."
|
||||
msgstr "Komentáre v doménových súboroch Window Makera nie sú povolené."
|
||||
|
||||
#: ../../WINGs/proplist.c:1563 ../../WINGs/proplist.c:1630
|
||||
msgid "extra data after end of property list"
|
||||
msgstr "prebytočné dáta na konci property listu"
|
||||
|
||||
#: ../../WINGs/proplist.c:1606
|
||||
#, c-format
|
||||
msgid "could not get size for file '%s'"
|
||||
msgstr "nemožno zistiť veľkosť súboru '%s'"
|
||||
|
||||
#: ../../WINGs/proplist.c:1619
|
||||
#, c-format
|
||||
msgid "error reading from file '%s'"
|
||||
msgstr "chyba pri čítaní zo súboru '%s'"
|
||||
|
||||
#: ../../WINGs/proplist.c:1671
|
||||
#, c-format
|
||||
msgid "mkstemp (%s) failed"
|
||||
msgstr "chyba mkstemp (%s)"
|
||||
|
||||
#: ../../WINGs/proplist.c:1682
|
||||
#, c-format
|
||||
msgid "mktemp (%s) failed"
|
||||
msgstr "chyba mktemp(%s)"
|
||||
|
||||
#: ../../WINGs/proplist.c:1693
|
||||
#, c-format
|
||||
msgid "open (%s) failed"
|
||||
msgstr "chyba pri otváraní (%s)"
|
||||
|
||||
#: ../../WINGs/proplist.c:1700
|
||||
#, c-format
|
||||
msgid "writing to file: %s failed"
|
||||
msgstr "chyba pri zápise do súboru: %s"
|
||||
|
||||
#: ../../WINGs/proplist.c:1708
|
||||
#, c-format
|
||||
msgid "fclose (%s) failed"
|
||||
msgstr "chyba fclose (%s)"
|
||||
|
||||
#: ../../WINGs/proplist.c:1717
|
||||
#, c-format
|
||||
msgid "rename ('%s' to '%s') failed"
|
||||
msgstr "chyba rename ('%s' na '%s')"
|
||||
|
||||
#. something happened with the file. just overwrite it
|
||||
#: ../../WINGs/userdefaults.c:188 ../../WINGs/userdefaults.c:204
|
||||
#, c-format
|
||||
msgid "cannot read domain from file '%s' when syncing"
|
||||
msgstr "nemožno čítať doménu zo súboru '%s' pri synchronizácii"
|
||||
|
||||
#: ../../WINGs/wcolor.c:224 ../../WINGs/wcolor.c:236 ../../WINGs/wcolor.c:275
|
||||
#: ../../WINGs/wcolor.c:316
|
||||
#, c-format
|
||||
msgid "could not allocate %s color"
|
||||
msgstr "nemožno alokovať %s farbu"
|
||||
|
||||
#: ../../WINGs/wcolor.c:224
|
||||
msgid "white"
|
||||
msgstr "bielu"
|
||||
|
||||
#: ../../WINGs/wcolor.c:236
|
||||
msgid "black"
|
||||
msgstr "čiernu"
|
||||
|
||||
#: ../../WINGs/wcolor.c:275
|
||||
msgid "gray"
|
||||
msgstr "šedú"
|
||||
|
||||
#: ../../WINGs/wcolor.c:316
|
||||
msgid "dark gray"
|
||||
msgstr "tmavošedú"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:420
|
||||
msgid "Colors"
|
||||
msgstr "Farby"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:610 ../../WINGs/wcolorpanel.c:2829
|
||||
msgid "Brightness"
|
||||
msgstr "Svetlosť"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:612 ../../WINGs/wcolorpanel.c:688
|
||||
#: ../../WINGs/wcolorpanel.c:721 ../../WINGs/wcolorpanel.c:755
|
||||
#: ../../WINGs/wcolorpanel.c:815 ../../WINGs/wcolorpanel.c:849
|
||||
#: ../../WINGs/wcolorpanel.c:883 ../../WINGs/wcolorpanel.c:918
|
||||
#: ../../WINGs/wcolorpanel.c:2169 ../../WINGs/wcolorpanel.c:2831
|
||||
#: ../../WINGs/wcolorpanel.c:2867 ../../WINGs/wcolorpanel.c:2903
|
||||
#: ../../WINGs/wcolorpanel.c:3745
|
||||
msgid "Color Panel: Could not allocate memory"
|
||||
msgstr "Panel farieb: Nemožno alokovať pamäť"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:685 ../../WINGs/wcolorpanel.c:686
|
||||
msgid "Red"
|
||||
msgstr "Červená"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:718 ../../WINGs/wcolorpanel.c:719
|
||||
msgid "Green"
|
||||
msgstr "Zelená"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:752 ../../WINGs/wcolorpanel.c:753
|
||||
msgid "Blue"
|
||||
msgstr "Modrá"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:812 ../../WINGs/wcolorpanel.c:813
|
||||
msgid "Cyan"
|
||||
msgstr "Azúrová"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:846 ../../WINGs/wcolorpanel.c:847
|
||||
msgid "Magenta"
|
||||
msgstr "Purpurová"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:880 ../../WINGs/wcolorpanel.c:881
|
||||
msgid "Yellow"
|
||||
msgstr "Žltá"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:915 ../../WINGs/wcolorpanel.c:916
|
||||
msgid "Black"
|
||||
msgstr "Čierna"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:996
|
||||
msgid "Spectrum"
|
||||
msgstr "Spektrum"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1026
|
||||
msgid "Palette"
|
||||
msgstr "Paleta"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1032
|
||||
msgid "New from File..."
|
||||
msgstr "Nová zo súboru..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1033 ../../WINGs/wcolorpanel.c:1081
|
||||
#: ../../WINGs/wcolorpanel.c:1098
|
||||
msgid "Rename..."
|
||||
msgstr "Premenovať..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1034 ../../WINGs/wcolorpanel.c:1082
|
||||
#: ../../WINGs/wcolorpanel.c:1099 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "Remove"
|
||||
msgstr "Odstrániť"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1035
|
||||
msgid "Copy"
|
||||
msgstr "Kopírovať"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1036
|
||||
msgid "New from Clipboard"
|
||||
msgstr "Nová z nástenky"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1057
|
||||
msgid "X11-Colors"
|
||||
msgstr "Farby X11"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1074
|
||||
msgid "Color"
|
||||
msgstr "Farba"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1080
|
||||
msgid "Add..."
|
||||
msgstr "Pridať..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1090
|
||||
msgid "List"
|
||||
msgstr "Zoznam"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1097
|
||||
msgid "New..."
|
||||
msgstr "Nový..."
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1236
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Color Panel: Could not create directory %s needed to store configurations"
|
||||
msgstr ""
|
||||
"Panel farieb: Nemožno vytvoriť adresár %s potrebný na uloženie nastavení"
|
||||
|
||||
#. Delete the file, it doesn't belong here
|
||||
#: ../../WINGs/wcolorpanel.c:1242 ../../WINGs/wcolorpanel.c:3212
|
||||
#: ../../WINGs/wcolorpanel.c:3216
|
||||
msgid "File Error"
|
||||
msgstr "Chyba súboru"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1243
|
||||
msgid "Could not create ColorPanel configuration directory"
|
||||
msgstr "Nemožno vytvoriť konfiguračný adresár panelu farieb"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1244 ../../WINGs/wcolorpanel.c:3213
|
||||
#: ../../WINGs/wcolorpanel.c:3218 ../../WINGs/wcolorpanel.c:3245
|
||||
#: ../../WINGs/wfilepanel.c:250 ../../WINGs/wfilepanel.c:650
|
||||
#: ../../WINGs/wfilepanel.c:662 ../../WINGs/wfilepanel.c:763
|
||||
#: ../../WINGs/wfilepanel.c:974 ../../WINGs/wfontpanel.c:751
|
||||
msgid "OK"
|
||||
msgstr "OK"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1250 ../../WINGs/wcolorpanel.c:1286
|
||||
#: ../../WINGs/wcolorpanel.c:1304
|
||||
msgid "Color Panel: Could not find file"
|
||||
msgstr "Panel farieb: Nemožno nájsť súbor"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:1491 ../../WINGs/wcolorpanel.c:1556
|
||||
#: ../../WINGs/wcolorpanel.c:1620
|
||||
msgid "Color Panel: X failed request"
|
||||
msgstr "Panel farieb: chyba požiadavky X"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2865
|
||||
msgid "Saturation"
|
||||
msgstr "Saturácia"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:2901
|
||||
msgid "Hue"
|
||||
msgstr "Odtieň"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3151
|
||||
msgid "Open Palette"
|
||||
msgstr "Otvoriť paletu"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3213
|
||||
msgid "Invalid file format !"
|
||||
msgstr "Nesprávny súborový formát!"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3215
|
||||
#, c-format
|
||||
msgid "can't remove file %s"
|
||||
msgstr "namožno odstrániť súbor %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3217
|
||||
msgid "Couldn't remove file from Configuration Directory !"
|
||||
msgstr "Nemožno odstrániť súbor z konfiguračného adresára!"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3244
|
||||
msgid "Rename"
|
||||
msgstr "Premenovať"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3244
|
||||
msgid "Rename palette to:"
|
||||
msgstr "Premenovať paletu:"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3245 ../../WINGs/wfilepanel.c:259
|
||||
#: ../../WINGs/wfilepanel.c:662 ../../WINGs/wfilepanel.c:763
|
||||
msgid "Cancel"
|
||||
msgstr "Zrušiť"
|
||||
|
||||
#. Careful, this palette exists already
|
||||
#: ../../WINGs/wcolorpanel.c:3261 ../../WINGs/wfilepanel.c:763
|
||||
msgid "Warning"
|
||||
msgstr "Varovanie"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262
|
||||
msgid ""
|
||||
"Palette already exists !\n"
|
||||
"\n"
|
||||
"Overwrite ?"
|
||||
msgstr ""
|
||||
"Paleta už existuje!\n"
|
||||
"\n"
|
||||
"Prepísať?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "No"
|
||||
msgstr "Nie"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3262 ../../WINGs/wcolorpanel.c:3326
|
||||
msgid "Yes"
|
||||
msgstr "Áno"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3294
|
||||
#, c-format
|
||||
msgid "Couldn't rename palette %s to %s\n"
|
||||
msgstr "Nemožno premenovať paletu %s na %s\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3320
|
||||
msgid "This will permanently remove the palette "
|
||||
msgstr "Paleta bude natrvalo zmazaná"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3323
|
||||
msgid ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Are you sure you want to remove this palette ?"
|
||||
msgstr ""
|
||||
".\n"
|
||||
"\n"
|
||||
"Ste si istý, že chcete odstrániť túto paletu?"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3348
|
||||
#, c-format
|
||||
msgid "Couldn't remove palette %s\n"
|
||||
msgstr "Nemožno odstrániť paletu %s\n"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3647
|
||||
#, c-format
|
||||
msgid "Could not open %s"
|
||||
msgstr "Nemožno otvoriť %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3654
|
||||
#, c-format
|
||||
msgid "Could not create %s"
|
||||
msgstr "Nemožno vytvoriť %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3665
|
||||
#, c-format
|
||||
msgid "Write error on file %s"
|
||||
msgstr "Chyba zápisu do súboru %s"
|
||||
|
||||
#: ../../WINGs/wcolorpanel.c:3710
|
||||
msgid "Color Panel: Color unspecified"
|
||||
msgstr "Panel farieb: Nešpecifikovaná farba"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:235
|
||||
msgid "Name:"
|
||||
msgstr "Meno:"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:332 ../../WINGs/wfilepanel.c:396
|
||||
msgid "Open"
|
||||
msgstr "Otvoriť"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:350 ../../WINGs/wfilepanel.c:402
|
||||
msgid "Save"
|
||||
msgstr "Uložiť"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:565
|
||||
#, c-format
|
||||
msgid "WINGs: could not open directory %s\n"
|
||||
msgstr "WINGs: nemožno otvoriť adresár %s\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:583
|
||||
#, c-format
|
||||
msgid "WINGs: could not stat %s\n"
|
||||
msgstr "WINGs: nemožno zistiť informácie o %s\n"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:650 ../../WINGs/wfilepanel.c:973
|
||||
#: ../../WINGs/wfontpanel.c:750
|
||||
msgid "Error"
|
||||
msgstr "Chyba"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:661
|
||||
msgid "Create Directory"
|
||||
msgstr "Vytvoriť adresár"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:662
|
||||
msgid "Enter directory name"
|
||||
msgstr "Meno adresára"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:698 ../../WINGs/wfilepanel.c:737
|
||||
#: ../../WINGs/wfilepanel.c:768 ../../WINGs/wfilepanel.c:796
|
||||
msgid "Permission denied."
|
||||
msgstr "Prístup zamietnutý."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:701
|
||||
#, c-format
|
||||
msgid "'%s' already exists."
|
||||
msgstr "'%s' už existuje"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:704
|
||||
msgid "Path does not exist."
|
||||
msgstr "Cesta neexistuje."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:734 ../../WINGs/wfilepanel.c:793
|
||||
#, c-format
|
||||
msgid "'%s' does not exist."
|
||||
msgstr "'%s' neexistuje."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:741 ../../WINGs/wfilepanel.c:800
|
||||
msgid "Insufficient memory available."
|
||||
msgstr "Nedostatok pamäti."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:745 ../../WINGs/wfilepanel.c:804
|
||||
#, c-format
|
||||
msgid "'%s' is on a read-only filesystem."
|
||||
msgstr "'%s' je na súborovom systéme len pre čítanie."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:748 ../../WINGs/wfilepanel.c:780
|
||||
#: ../../WINGs/wfilepanel.c:807
|
||||
#, c-format
|
||||
msgid "Can not delete '%s'."
|
||||
msgstr "Nemožno odstrániť '%s'."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:755
|
||||
#, c-format
|
||||
msgid "Delete directory %s ?"
|
||||
msgstr "Odstrániť adresár %s?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:759
|
||||
#, c-format
|
||||
msgid "Delete file %s ?"
|
||||
msgstr "Odstrániť súbor %s?"
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:771
|
||||
#, c-format
|
||||
msgid "Directory '%s' does not exist."
|
||||
msgstr "Adresár '%s' neexistuje."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:774
|
||||
#, c-format
|
||||
msgid "Directory '%s' is not empty."
|
||||
msgstr "Adresár '%s' nie je prázdny."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:777
|
||||
#, c-format
|
||||
msgid "Directory '%s' is busy."
|
||||
msgstr "Adresár '%s' je používaný."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:790
|
||||
#, c-format
|
||||
msgid "'%s' is a directory."
|
||||
msgstr "'%s' je adresár."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:832
|
||||
#, c-format
|
||||
msgid "An error occured browsing '%s'."
|
||||
msgstr "Pri prehliadaní '%s' nastala chyba."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:836
|
||||
#, c-format
|
||||
msgid "'%s' is not a directory."
|
||||
msgstr "'%s' nie je adresár."
|
||||
|
||||
#: ../../WINGs/wfilepanel.c:973
|
||||
msgid "File does not exist."
|
||||
msgstr "Súbor neexistuje."
|
||||
|
||||
#: ../../WINGs/wfont.c:324 ../../WINGs/wfont.c:344
|
||||
#, c-format
|
||||
msgid "could not load font %s."
|
||||
msgstr "nemožno načítať font %s."
|
||||
|
||||
#: ../../WINGs/wfont.c:375 ../../WINGs/wfont.c:420 ../../WINGs/wfont.c:475
|
||||
#: ../../WINGs/wfont.c:1337 ../../WINGs/wfont.c:1398 ../../WINGs/wfont.c:1469
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Conversion to widechar failed (possible invalid multibyte sequence): '%s':"
|
||||
"(pos %d)\n"
|
||||
msgstr ""
|
||||
"Konverzia do widechar zlyhala (možno nesprávna multibyte sekvencia): '%s':"
|
||||
"(pos %d)\n"
|
||||
|
||||
#. // remove warning later. or maybe not
|
||||
#: ../../WINGs/wfont.c:591 ../../WINGs/wfont.c:1568
|
||||
#, c-format
|
||||
msgid "Invalid font specification: '%s'\n"
|
||||
msgstr "Chybná špecifikácia fontu: '%s'\n"
|
||||
|
||||
#: ../../WINGs/wfont.c:770 ../../WINGs/wfont.c:780
|
||||
#, c-format
|
||||
msgid "Invalid size specification '%s' in %s. Using default %d\n"
|
||||
msgstr "Chybná špecifikácia veľkosti '%s' v %s. Použije sa implicitná %d\n"
|
||||
|
||||
#: ../../WINGs/wfont.c:824
|
||||
#, c-format
|
||||
msgid "the following character sets are missing in %s:"
|
||||
msgstr "nasledujúce sady znakov chýbajú v %s:"
|
||||
|
||||
#: ../../WINGs/wfont.c:830
|
||||
#, c-format
|
||||
msgid ""
|
||||
"the string \"%s\" will be used in place of any characters from those sets."
|
||||
msgstr "reťazec \"%s\" bude použitý namiesto znakov z týchto sád."
|
||||
|
||||
#. is arial a good fallback for multibyte?
|
||||
#: ../../WINGs/wfont.c:1232 ../../WINGs/wfont.c:1247
|
||||
#, c-format
|
||||
msgid "could not load font %s. Trying arial."
|
||||
msgstr "nemožno načítať font %s. Skúša sa načítať arial."
|
||||
|
||||
#: ../../WINGs/wfont.c:1239
|
||||
msgid "could not load antialiased font set. Reverting to standard font sets."
|
||||
msgstr "nemožno načítať antialiasovanú sadu fontov. Späť k štandardnej sade fontov."
|
||||
|
||||
#: ../../WINGs/wfont.c:1242
|
||||
#, c-format
|
||||
msgid "could not load FontSet %s. Trying fixed."
|
||||
msgstr "nemožno načítať sadu fontov %s. Skúša sa načítať fixed."
|
||||
|
||||
#: ../../WINGs/wfont.c:1254
|
||||
msgid "could not load antialiased fonts. Reverting to normal fonts."
|
||||
msgstr "nemožno zaviesť antialiasovaný font. Návrat k normálnemu fontu."
|
||||
|
||||
#: ../../WINGs/wfont.c:1257 ../../WINGs/wfont.c:1268
|
||||
#, c-format
|
||||
msgid "could not load font %s. Trying fixed."
|
||||
msgstr "nemožno načítať font %s. Skúša sa načítať fixed."
|
||||
|
||||
#: ../../WINGs/wfont.c:1262
|
||||
#, c-format
|
||||
msgid "could not load font set %s. Trying fixed."
|
||||
msgstr "nemožno načítať font %s. Skúša sa načítať fixed."
|
||||
|
||||
#: ../../WINGs/wfont.c:1272
|
||||
msgid "could not load fixed font!"
|
||||
msgstr "nemožno načítať font fixed!"
|
||||
|
||||
#: ../../WINGs/wfont.c:1520
|
||||
#, c-format
|
||||
msgid "font description %s is too large."
|
||||
msgstr "popis fontu %s je príliš veľký."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:235
|
||||
msgid "Test!!!"
|
||||
msgstr "Skúška!!!"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:241
|
||||
msgid "Family"
|
||||
msgstr "Rodina"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:252
|
||||
msgid "Typeface"
|
||||
msgstr "Vzhľad"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:263
|
||||
msgid "Size"
|
||||
msgstr "Veľkosť"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:282
|
||||
msgid "Set"
|
||||
msgstr "Sada"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:288
|
||||
msgid "Revert"
|
||||
msgstr "Obrátiť"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:751
|
||||
msgid "Could not retrieve font list"
|
||||
msgstr "Nemožno obdržať zoznam fontov"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:765
|
||||
#, c-format
|
||||
msgid "font name %s is longer than 256, which is invalid."
|
||||
msgstr "meno fontu %s je dlhšie ako 256, čo je nesprávne."
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:913
|
||||
msgid "Roman"
|
||||
msgstr "roman"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:916
|
||||
msgid "Italic"
|
||||
msgstr "kurzíva"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:918
|
||||
msgid "Oblique"
|
||||
msgstr "šikmé"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:920
|
||||
msgid "Rev Italic"
|
||||
msgstr "obr. kurzíva"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:922
|
||||
msgid "Rev Oblique"
|
||||
msgstr "obr. šikmé"
|
||||
|
||||
#: ../../WINGs/wfontpanel.c:928
|
||||
msgid "Normal"
|
||||
msgstr "normálne"
|
||||
|
||||
#: ../../WINGs/widgets.c:419
|
||||
#, c-format
|
||||
msgid "WINGs: could not load widget images file: %s"
|
||||
msgstr "WINGs: nemožno načítať súbor s obrázkami pre widgety: %s"
|
||||
|
||||
#: ../../WINGs/widgets.c:772
|
||||
msgid ""
|
||||
"could not load any fonts. Make sure your font installation and locale "
|
||||
"settings are correct."
|
||||
msgstr ""
|
||||
"nemožno načítať žiadny font. Ubezpečte sa, že inštalácia fontov a miestne "
|
||||
"nastavenia sú v poriadku."
|
||||
|
||||
#: ../../WINGs/wruler.c:192
|
||||
msgid "0 inches"
|
||||
msgstr "0 palcov"
|
||||
1748
WINGs/proplist.c
Normal file
1748
WINGs/proplist.c
Normal file
File diff suppressed because it is too large
Load Diff
771
WINGs/rgb.h
Normal file
771
WINGs/rgb.h
Normal file
@@ -0,0 +1,771 @@
|
||||
|
||||
/* Automatically generated file. Do NOT edit. Regenerate it using make-rgb */
|
||||
|
||||
#ifndef RGB_H_
|
||||
#define RGB_H_
|
||||
|
||||
#include <wraster.h>
|
||||
|
||||
typedef struct RGBColor {
|
||||
RColor color;
|
||||
char *name;
|
||||
} RGBColor;
|
||||
|
||||
RGBColor rgbColors[] = {
|
||||
{{255, 250, 250, 0}, "snow"},
|
||||
{{248, 248, 255, 0}, "ghost"},
|
||||
{{248, 248, 255, 0}, "GhostWhite"},
|
||||
{{245, 245, 245, 0}, "white"},
|
||||
{{245, 245, 245, 0}, "WhiteSmoke"},
|
||||
{{220, 220, 220, 0}, "gainsboro"},
|
||||
{{255, 250, 240, 0}, "floral"},
|
||||
{{255, 250, 240, 0}, "FloralWhite"},
|
||||
{{253, 245, 230, 0}, "old"},
|
||||
{{253, 245, 230, 0}, "OldLace"},
|
||||
{{250, 240, 230, 0}, "linen"},
|
||||
{{250, 235, 215, 0}, "antique"},
|
||||
{{250, 235, 215, 0}, "AntiqueWhite"},
|
||||
{{255, 239, 213, 0}, "papaya"},
|
||||
{{255, 239, 213, 0}, "PapayaWhip"},
|
||||
{{255, 235, 205, 0}, "blanched"},
|
||||
{{255, 235, 205, 0}, "BlanchedAlmond"},
|
||||
{{255, 228, 196, 0}, "bisque"},
|
||||
{{255, 218, 185, 0}, "peach"},
|
||||
{{255, 218, 185, 0}, "PeachPuff"},
|
||||
{{255, 222, 173, 0}, "navajo"},
|
||||
{{255, 222, 173, 0}, "NavajoWhite"},
|
||||
{{255, 228, 181, 0}, "moccasin"},
|
||||
{{255, 248, 220, 0}, "cornsilk"},
|
||||
{{255, 255, 240, 0}, "ivory"},
|
||||
{{255, 250, 205, 0}, "lemon"},
|
||||
{{255, 250, 205, 0}, "LemonChiffon"},
|
||||
{{255, 245, 238, 0}, "seashell"},
|
||||
{{240, 255, 240, 0}, "honeydew"},
|
||||
{{245, 255, 250, 0}, "mint"},
|
||||
{{245, 255, 250, 0}, "MintCream"},
|
||||
{{240, 255, 255, 0}, "azure"},
|
||||
{{240, 248, 255, 0}, "alice"},
|
||||
{{240, 248, 255, 0}, "AliceBlue"},
|
||||
{{230, 230, 250, 0}, "lavender"},
|
||||
{{255, 240, 245, 0}, "lavender"},
|
||||
{{255, 240, 245, 0}, "LavenderBlush"},
|
||||
{{255, 228, 225, 0}, "misty"},
|
||||
{{255, 228, 225, 0}, "MistyRose"},
|
||||
{{255, 255, 255, 0}, "white"},
|
||||
{{ 0, 0, 0, 0}, "black"},
|
||||
{{ 47, 79, 79, 0}, "dark"},
|
||||
{{ 47, 79, 79, 0}, "DarkSlateGray"},
|
||||
{{ 47, 79, 79, 0}, "dark"},
|
||||
{{ 47, 79, 79, 0}, "DarkSlateGrey"},
|
||||
{{105, 105, 105, 0}, "dim"},
|
||||
{{105, 105, 105, 0}, "DimGray"},
|
||||
{{105, 105, 105, 0}, "dim"},
|
||||
{{105, 105, 105, 0}, "DimGrey"},
|
||||
{{112, 128, 144, 0}, "slate"},
|
||||
{{112, 128, 144, 0}, "SlateGray"},
|
||||
{{112, 128, 144, 0}, "slate"},
|
||||
{{112, 128, 144, 0}, "SlateGrey"},
|
||||
{{119, 136, 153, 0}, "light"},
|
||||
{{119, 136, 153, 0}, "LightSlateGray"},
|
||||
{{119, 136, 153, 0}, "light"},
|
||||
{{119, 136, 153, 0}, "LightSlateGrey"},
|
||||
{{190, 190, 190, 0}, "gray"},
|
||||
{{190, 190, 190, 0}, "grey"},
|
||||
{{211, 211, 211, 0}, "light"},
|
||||
{{211, 211, 211, 0}, "LightGrey"},
|
||||
{{211, 211, 211, 0}, "light"},
|
||||
{{211, 211, 211, 0}, "LightGray"},
|
||||
{{ 25, 25, 112, 0}, "midnight"},
|
||||
{{ 25, 25, 112, 0}, "MidnightBlue"},
|
||||
{{ 0, 0, 128, 0}, "navy"},
|
||||
{{ 0, 0, 128, 0}, "navy"},
|
||||
{{ 0, 0, 128, 0}, "NavyBlue"},
|
||||
{{100, 149, 237, 0}, "cornflower"},
|
||||
{{100, 149, 237, 0}, "CornflowerBlue"},
|
||||
{{ 72, 61, 139, 0}, "dark"},
|
||||
{{ 72, 61, 139, 0}, "DarkSlateBlue"},
|
||||
{{106, 90, 205, 0}, "slate"},
|
||||
{{106, 90, 205, 0}, "SlateBlue"},
|
||||
{{123, 104, 238, 0}, "medium"},
|
||||
{{123, 104, 238, 0}, "MediumSlateBlue"},
|
||||
{{132, 112, 255, 0}, "light"},
|
||||
{{132, 112, 255, 0}, "LightSlateBlue"},
|
||||
{{ 0, 0, 205, 0}, "medium"},
|
||||
{{ 0, 0, 205, 0}, "MediumBlue"},
|
||||
{{ 65, 105, 225, 0}, "royal"},
|
||||
{{ 65, 105, 225, 0}, "RoyalBlue"},
|
||||
{{ 0, 0, 255, 0}, "blue"},
|
||||
{{ 30, 144, 255, 0}, "dodger"},
|
||||
{{ 30, 144, 255, 0}, "DodgerBlue"},
|
||||
{{ 0, 191, 255, 0}, "deep"},
|
||||
{{ 0, 191, 255, 0}, "DeepSkyBlue"},
|
||||
{{135, 206, 235, 0}, "sky"},
|
||||
{{135, 206, 235, 0}, "SkyBlue"},
|
||||
{{135, 206, 250, 0}, "light"},
|
||||
{{135, 206, 250, 0}, "LightSkyBlue"},
|
||||
{{ 70, 130, 180, 0}, "steel"},
|
||||
{{ 70, 130, 180, 0}, "SteelBlue"},
|
||||
{{176, 196, 222, 0}, "light"},
|
||||
{{176, 196, 222, 0}, "LightSteelBlue"},
|
||||
{{173, 216, 230, 0}, "light"},
|
||||
{{173, 216, 230, 0}, "LightBlue"},
|
||||
{{176, 224, 230, 0}, "powder"},
|
||||
{{176, 224, 230, 0}, "PowderBlue"},
|
||||
{{175, 238, 238, 0}, "pale"},
|
||||
{{175, 238, 238, 0}, "PaleTurquoise"},
|
||||
{{ 0, 206, 209, 0}, "dark"},
|
||||
{{ 0, 206, 209, 0}, "DarkTurquoise"},
|
||||
{{ 72, 209, 204, 0}, "medium"},
|
||||
{{ 72, 209, 204, 0}, "MediumTurquoise"},
|
||||
{{ 64, 224, 208, 0}, "turquoise"},
|
||||
{{ 0, 255, 255, 0}, "cyan"},
|
||||
{{224, 255, 255, 0}, "light"},
|
||||
{{224, 255, 255, 0}, "LightCyan"},
|
||||
{{ 95, 158, 160, 0}, "cadet"},
|
||||
{{ 95, 158, 160, 0}, "CadetBlue"},
|
||||
{{102, 205, 170, 0}, "medium"},
|
||||
{{102, 205, 170, 0}, "MediumAquamarine"},
|
||||
{{127, 255, 212, 0}, "aquamarine"},
|
||||
{{ 0, 100, 0, 0}, "dark"},
|
||||
{{ 0, 100, 0, 0}, "DarkGreen"},
|
||||
{{ 85, 107, 47, 0}, "dark"},
|
||||
{{ 85, 107, 47, 0}, "DarkOliveGreen"},
|
||||
{{143, 188, 143, 0}, "dark"},
|
||||
{{143, 188, 143, 0}, "DarkSeaGreen"},
|
||||
{{ 46, 139, 87, 0}, "sea"},
|
||||
{{ 46, 139, 87, 0}, "SeaGreen"},
|
||||
{{ 60, 179, 113, 0}, "medium"},
|
||||
{{ 60, 179, 113, 0}, "MediumSeaGreen"},
|
||||
{{ 32, 178, 170, 0}, "light"},
|
||||
{{ 32, 178, 170, 0}, "LightSeaGreen"},
|
||||
{{152, 251, 152, 0}, "pale"},
|
||||
{{152, 251, 152, 0}, "PaleGreen"},
|
||||
{{ 0, 255, 127, 0}, "spring"},
|
||||
{{ 0, 255, 127, 0}, "SpringGreen"},
|
||||
{{124, 252, 0, 0}, "lawn"},
|
||||
{{124, 252, 0, 0}, "LawnGreen"},
|
||||
{{ 0, 255, 0, 0}, "green"},
|
||||
{{127, 255, 0, 0}, "chartreuse"},
|
||||
{{ 0, 250, 154, 0}, "medium"},
|
||||
{{ 0, 250, 154, 0}, "MediumSpringGreen"},
|
||||
{{173, 255, 47, 0}, "green"},
|
||||
{{173, 255, 47, 0}, "GreenYellow"},
|
||||
{{ 50, 205, 50, 0}, "lime"},
|
||||
{{ 50, 205, 50, 0}, "LimeGreen"},
|
||||
{{154, 205, 50, 0}, "yellow"},
|
||||
{{154, 205, 50, 0}, "YellowGreen"},
|
||||
{{ 34, 139, 34, 0}, "forest"},
|
||||
{{ 34, 139, 34, 0}, "ForestGreen"},
|
||||
{{107, 142, 35, 0}, "olive"},
|
||||
{{107, 142, 35, 0}, "OliveDrab"},
|
||||
{{189, 183, 107, 0}, "dark"},
|
||||
{{189, 183, 107, 0}, "DarkKhaki"},
|
||||
{{240, 230, 140, 0}, "khaki"},
|
||||
{{238, 232, 170, 0}, "pale"},
|
||||
{{238, 232, 170, 0}, "PaleGoldenrod"},
|
||||
{{250, 250, 210, 0}, "light"},
|
||||
{{250, 250, 210, 0}, "LightGoldenrodYellow"},
|
||||
{{255, 255, 224, 0}, "light"},
|
||||
{{255, 255, 224, 0}, "LightYellow"},
|
||||
{{255, 255, 0, 0}, "yellow"},
|
||||
{{255, 215, 0, 0}, "gold"},
|
||||
{{238, 221, 130, 0}, "light"},
|
||||
{{238, 221, 130, 0}, "LightGoldenrod"},
|
||||
{{218, 165, 32, 0}, "goldenrod"},
|
||||
{{184, 134, 11, 0}, "dark"},
|
||||
{{184, 134, 11, 0}, "DarkGoldenrod"},
|
||||
{{188, 143, 143, 0}, "rosy"},
|
||||
{{188, 143, 143, 0}, "RosyBrown"},
|
||||
{{205, 92, 92, 0}, "indian"},
|
||||
{{205, 92, 92, 0}, "IndianRed"},
|
||||
{{139, 69, 19, 0}, "saddle"},
|
||||
{{139, 69, 19, 0}, "SaddleBrown"},
|
||||
{{160, 82, 45, 0}, "sienna"},
|
||||
{{205, 133, 63, 0}, "peru"},
|
||||
{{222, 184, 135, 0}, "burlywood"},
|
||||
{{245, 245, 220, 0}, "beige"},
|
||||
{{245, 222, 179, 0}, "wheat"},
|
||||
{{244, 164, 96, 0}, "sandy"},
|
||||
{{244, 164, 96, 0}, "SandyBrown"},
|
||||
{{210, 180, 140, 0}, "tan"},
|
||||
{{210, 105, 30, 0}, "chocolate"},
|
||||
{{178, 34, 34, 0}, "firebrick"},
|
||||
{{165, 42, 42, 0}, "brown"},
|
||||
{{233, 150, 122, 0}, "dark"},
|
||||
{{233, 150, 122, 0}, "DarkSalmon"},
|
||||
{{250, 128, 114, 0}, "salmon"},
|
||||
{{255, 160, 122, 0}, "light"},
|
||||
{{255, 160, 122, 0}, "LightSalmon"},
|
||||
{{255, 165, 0, 0}, "orange"},
|
||||
{{255, 140, 0, 0}, "dark"},
|
||||
{{255, 140, 0, 0}, "DarkOrange"},
|
||||
{{255, 127, 80, 0}, "coral"},
|
||||
{{240, 128, 128, 0}, "light"},
|
||||
{{240, 128, 128, 0}, "LightCoral"},
|
||||
{{255, 99, 71, 0}, "tomato"},
|
||||
{{255, 69, 0, 0}, "orange"},
|
||||
{{255, 69, 0, 0}, "OrangeRed"},
|
||||
{{255, 0, 0, 0}, "red"},
|
||||
{{255, 105, 180, 0}, "hot"},
|
||||
{{255, 105, 180, 0}, "HotPink"},
|
||||
{{255, 20, 147, 0}, "deep"},
|
||||
{{255, 20, 147, 0}, "DeepPink"},
|
||||
{{255, 192, 203, 0}, "pink"},
|
||||
{{255, 182, 193, 0}, "light"},
|
||||
{{255, 182, 193, 0}, "LightPink"},
|
||||
{{219, 112, 147, 0}, "pale"},
|
||||
{{219, 112, 147, 0}, "PaleVioletRed"},
|
||||
{{176, 48, 96, 0}, "maroon"},
|
||||
{{199, 21, 133, 0}, "medium"},
|
||||
{{199, 21, 133, 0}, "MediumVioletRed"},
|
||||
{{208, 32, 144, 0}, "violet"},
|
||||
{{208, 32, 144, 0}, "VioletRed"},
|
||||
{{255, 0, 255, 0}, "magenta"},
|
||||
{{238, 130, 238, 0}, "violet"},
|
||||
{{221, 160, 221, 0}, "plum"},
|
||||
{{218, 112, 214, 0}, "orchid"},
|
||||
{{186, 85, 211, 0}, "medium"},
|
||||
{{186, 85, 211, 0}, "MediumOrchid"},
|
||||
{{153, 50, 204, 0}, "dark"},
|
||||
{{153, 50, 204, 0}, "DarkOrchid"},
|
||||
{{148, 0, 211, 0}, "dark"},
|
||||
{{148, 0, 211, 0}, "DarkViolet"},
|
||||
{{138, 43, 226, 0}, "blue"},
|
||||
{{138, 43, 226, 0}, "BlueViolet"},
|
||||
{{160, 32, 240, 0}, "purple"},
|
||||
{{147, 112, 219, 0}, "medium"},
|
||||
{{147, 112, 219, 0}, "MediumPurple"},
|
||||
{{216, 191, 216, 0}, "thistle"},
|
||||
{{255, 250, 250, 0}, "snow1"},
|
||||
{{238, 233, 233, 0}, "snow2"},
|
||||
{{205, 201, 201, 0}, "snow3"},
|
||||
{{139, 137, 137, 0}, "snow4"},
|
||||
{{255, 245, 238, 0}, "seashell1"},
|
||||
{{238, 229, 222, 0}, "seashell2"},
|
||||
{{205, 197, 191, 0}, "seashell3"},
|
||||
{{139, 134, 130, 0}, "seashell4"},
|
||||
{{255, 239, 219, 0}, "AntiqueWhite1"},
|
||||
{{238, 223, 204, 0}, "AntiqueWhite2"},
|
||||
{{205, 192, 176, 0}, "AntiqueWhite3"},
|
||||
{{139, 131, 120, 0}, "AntiqueWhite4"},
|
||||
{{255, 228, 196, 0}, "bisque1"},
|
||||
{{238, 213, 183, 0}, "bisque2"},
|
||||
{{205, 183, 158, 0}, "bisque3"},
|
||||
{{139, 125, 107, 0}, "bisque4"},
|
||||
{{255, 218, 185, 0}, "PeachPuff1"},
|
||||
{{238, 203, 173, 0}, "PeachPuff2"},
|
||||
{{205, 175, 149, 0}, "PeachPuff3"},
|
||||
{{139, 119, 101, 0}, "PeachPuff4"},
|
||||
{{255, 222, 173, 0}, "NavajoWhite1"},
|
||||
{{238, 207, 161, 0}, "NavajoWhite2"},
|
||||
{{205, 179, 139, 0}, "NavajoWhite3"},
|
||||
{{139, 121, 94, 0}, "NavajoWhite4"},
|
||||
{{255, 250, 205, 0}, "LemonChiffon1"},
|
||||
{{238, 233, 191, 0}, "LemonChiffon2"},
|
||||
{{205, 201, 165, 0}, "LemonChiffon3"},
|
||||
{{139, 137, 112, 0}, "LemonChiffon4"},
|
||||
{{255, 248, 220, 0}, "cornsilk1"},
|
||||
{{238, 232, 205, 0}, "cornsilk2"},
|
||||
{{205, 200, 177, 0}, "cornsilk3"},
|
||||
{{139, 136, 120, 0}, "cornsilk4"},
|
||||
{{255, 255, 240, 0}, "ivory1"},
|
||||
{{238, 238, 224, 0}, "ivory2"},
|
||||
{{205, 205, 193, 0}, "ivory3"},
|
||||
{{139, 139, 131, 0}, "ivory4"},
|
||||
{{240, 255, 240, 0}, "honeydew1"},
|
||||
{{224, 238, 224, 0}, "honeydew2"},
|
||||
{{193, 205, 193, 0}, "honeydew3"},
|
||||
{{131, 139, 131, 0}, "honeydew4"},
|
||||
{{255, 240, 245, 0}, "LavenderBlush1"},
|
||||
{{238, 224, 229, 0}, "LavenderBlush2"},
|
||||
{{205, 193, 197, 0}, "LavenderBlush3"},
|
||||
{{139, 131, 134, 0}, "LavenderBlush4"},
|
||||
{{255, 228, 225, 0}, "MistyRose1"},
|
||||
{{238, 213, 210, 0}, "MistyRose2"},
|
||||
{{205, 183, 181, 0}, "MistyRose3"},
|
||||
{{139, 125, 123, 0}, "MistyRose4"},
|
||||
{{240, 255, 255, 0}, "azure1"},
|
||||
{{224, 238, 238, 0}, "azure2"},
|
||||
{{193, 205, 205, 0}, "azure3"},
|
||||
{{131, 139, 139, 0}, "azure4"},
|
||||
{{131, 111, 255, 0}, "SlateBlue1"},
|
||||
{{122, 103, 238, 0}, "SlateBlue2"},
|
||||
{{105, 89, 205, 0}, "SlateBlue3"},
|
||||
{{ 71, 60, 139, 0}, "SlateBlue4"},
|
||||
{{ 72, 118, 255, 0}, "RoyalBlue1"},
|
||||
{{ 67, 110, 238, 0}, "RoyalBlue2"},
|
||||
{{ 58, 95, 205, 0}, "RoyalBlue3"},
|
||||
{{ 39, 64, 139, 0}, "RoyalBlue4"},
|
||||
{{ 0, 0, 255, 0}, "blue1"},
|
||||
{{ 0, 0, 238, 0}, "blue2"},
|
||||
{{ 0, 0, 205, 0}, "blue3"},
|
||||
{{ 0, 0, 139, 0}, "blue4"},
|
||||
{{ 30, 144, 255, 0}, "DodgerBlue1"},
|
||||
{{ 28, 134, 238, 0}, "DodgerBlue2"},
|
||||
{{ 24, 116, 205, 0}, "DodgerBlue3"},
|
||||
{{ 16, 78, 139, 0}, "DodgerBlue4"},
|
||||
{{ 99, 184, 255, 0}, "SteelBlue1"},
|
||||
{{ 92, 172, 238, 0}, "SteelBlue2"},
|
||||
{{ 79, 148, 205, 0}, "SteelBlue3"},
|
||||
{{ 54, 100, 139, 0}, "SteelBlue4"},
|
||||
{{ 0, 191, 255, 0}, "DeepSkyBlue1"},
|
||||
{{ 0, 178, 238, 0}, "DeepSkyBlue2"},
|
||||
{{ 0, 154, 205, 0}, "DeepSkyBlue3"},
|
||||
{{ 0, 104, 139, 0}, "DeepSkyBlue4"},
|
||||
{{135, 206, 255, 0}, "SkyBlue1"},
|
||||
{{126, 192, 238, 0}, "SkyBlue2"},
|
||||
{{108, 166, 205, 0}, "SkyBlue3"},
|
||||
{{ 74, 112, 139, 0}, "SkyBlue4"},
|
||||
{{176, 226, 255, 0}, "LightSkyBlue1"},
|
||||
{{164, 211, 238, 0}, "LightSkyBlue2"},
|
||||
{{141, 182, 205, 0}, "LightSkyBlue3"},
|
||||
{{ 96, 123, 139, 0}, "LightSkyBlue4"},
|
||||
{{198, 226, 255, 0}, "SlateGray1"},
|
||||
{{185, 211, 238, 0}, "SlateGray2"},
|
||||
{{159, 182, 205, 0}, "SlateGray3"},
|
||||
{{108, 123, 139, 0}, "SlateGray4"},
|
||||
{{202, 225, 255, 0}, "LightSteelBlue1"},
|
||||
{{188, 210, 238, 0}, "LightSteelBlue2"},
|
||||
{{162, 181, 205, 0}, "LightSteelBlue3"},
|
||||
{{110, 123, 139, 0}, "LightSteelBlue4"},
|
||||
{{191, 239, 255, 0}, "LightBlue1"},
|
||||
{{178, 223, 238, 0}, "LightBlue2"},
|
||||
{{154, 192, 205, 0}, "LightBlue3"},
|
||||
{{104, 131, 139, 0}, "LightBlue4"},
|
||||
{{224, 255, 255, 0}, "LightCyan1"},
|
||||
{{209, 238, 238, 0}, "LightCyan2"},
|
||||
{{180, 205, 205, 0}, "LightCyan3"},
|
||||
{{122, 139, 139, 0}, "LightCyan4"},
|
||||
{{187, 255, 255, 0}, "PaleTurquoise1"},
|
||||
{{174, 238, 238, 0}, "PaleTurquoise2"},
|
||||
{{150, 205, 205, 0}, "PaleTurquoise3"},
|
||||
{{102, 139, 139, 0}, "PaleTurquoise4"},
|
||||
{{152, 245, 255, 0}, "CadetBlue1"},
|
||||
{{142, 229, 238, 0}, "CadetBlue2"},
|
||||
{{122, 197, 205, 0}, "CadetBlue3"},
|
||||
{{ 83, 134, 139, 0}, "CadetBlue4"},
|
||||
{{ 0, 245, 255, 0}, "turquoise1"},
|
||||
{{ 0, 229, 238, 0}, "turquoise2"},
|
||||
{{ 0, 197, 205, 0}, "turquoise3"},
|
||||
{{ 0, 134, 139, 0}, "turquoise4"},
|
||||
{{ 0, 255, 255, 0}, "cyan1"},
|
||||
{{ 0, 238, 238, 0}, "cyan2"},
|
||||
{{ 0, 205, 205, 0}, "cyan3"},
|
||||
{{ 0, 139, 139, 0}, "cyan4"},
|
||||
{{151, 255, 255, 0}, "DarkSlateGray1"},
|
||||
{{141, 238, 238, 0}, "DarkSlateGray2"},
|
||||
{{121, 205, 205, 0}, "DarkSlateGray3"},
|
||||
{{ 82, 139, 139, 0}, "DarkSlateGray4"},
|
||||
{{127, 255, 212, 0}, "aquamarine1"},
|
||||
{{118, 238, 198, 0}, "aquamarine2"},
|
||||
{{102, 205, 170, 0}, "aquamarine3"},
|
||||
{{ 69, 139, 116, 0}, "aquamarine4"},
|
||||
{{193, 255, 193, 0}, "DarkSeaGreen1"},
|
||||
{{180, 238, 180, 0}, "DarkSeaGreen2"},
|
||||
{{155, 205, 155, 0}, "DarkSeaGreen3"},
|
||||
{{105, 139, 105, 0}, "DarkSeaGreen4"},
|
||||
{{ 84, 255, 159, 0}, "SeaGreen1"},
|
||||
{{ 78, 238, 148, 0}, "SeaGreen2"},
|
||||
{{ 67, 205, 128, 0}, "SeaGreen3"},
|
||||
{{ 46, 139, 87, 0}, "SeaGreen4"},
|
||||
{{154, 255, 154, 0}, "PaleGreen1"},
|
||||
{{144, 238, 144, 0}, "PaleGreen2"},
|
||||
{{124, 205, 124, 0}, "PaleGreen3"},
|
||||
{{ 84, 139, 84, 0}, "PaleGreen4"},
|
||||
{{ 0, 255, 127, 0}, "SpringGreen1"},
|
||||
{{ 0, 238, 118, 0}, "SpringGreen2"},
|
||||
{{ 0, 205, 102, 0}, "SpringGreen3"},
|
||||
{{ 0, 139, 69, 0}, "SpringGreen4"},
|
||||
{{ 0, 255, 0, 0}, "green1"},
|
||||
{{ 0, 238, 0, 0}, "green2"},
|
||||
{{ 0, 205, 0, 0}, "green3"},
|
||||
{{ 0, 139, 0, 0}, "green4"},
|
||||
{{127, 255, 0, 0}, "chartreuse1"},
|
||||
{{118, 238, 0, 0}, "chartreuse2"},
|
||||
{{102, 205, 0, 0}, "chartreuse3"},
|
||||
{{ 69, 139, 0, 0}, "chartreuse4"},
|
||||
{{192, 255, 62, 0}, "OliveDrab1"},
|
||||
{{179, 238, 58, 0}, "OliveDrab2"},
|
||||
{{154, 205, 50, 0}, "OliveDrab3"},
|
||||
{{105, 139, 34, 0}, "OliveDrab4"},
|
||||
{{202, 255, 112, 0}, "DarkOliveGreen1"},
|
||||
{{188, 238, 104, 0}, "DarkOliveGreen2"},
|
||||
{{162, 205, 90, 0}, "DarkOliveGreen3"},
|
||||
{{110, 139, 61, 0}, "DarkOliveGreen4"},
|
||||
{{255, 246, 143, 0}, "khaki1"},
|
||||
{{238, 230, 133, 0}, "khaki2"},
|
||||
{{205, 198, 115, 0}, "khaki3"},
|
||||
{{139, 134, 78, 0}, "khaki4"},
|
||||
{{255, 236, 139, 0}, "LightGoldenrod1"},
|
||||
{{238, 220, 130, 0}, "LightGoldenrod2"},
|
||||
{{205, 190, 112, 0}, "LightGoldenrod3"},
|
||||
{{139, 129, 76, 0}, "LightGoldenrod4"},
|
||||
{{255, 255, 224, 0}, "LightYellow1"},
|
||||
{{238, 238, 209, 0}, "LightYellow2"},
|
||||
{{205, 205, 180, 0}, "LightYellow3"},
|
||||
{{139, 139, 122, 0}, "LightYellow4"},
|
||||
{{255, 255, 0, 0}, "yellow1"},
|
||||
{{238, 238, 0, 0}, "yellow2"},
|
||||
{{205, 205, 0, 0}, "yellow3"},
|
||||
{{139, 139, 0, 0}, "yellow4"},
|
||||
{{255, 215, 0, 0}, "gold1"},
|
||||
{{238, 201, 0, 0}, "gold2"},
|
||||
{{205, 173, 0, 0}, "gold3"},
|
||||
{{139, 117, 0, 0}, "gold4"},
|
||||
{{255, 193, 37, 0}, "goldenrod1"},
|
||||
{{238, 180, 34, 0}, "goldenrod2"},
|
||||
{{205, 155, 29, 0}, "goldenrod3"},
|
||||
{{139, 105, 20, 0}, "goldenrod4"},
|
||||
{{255, 185, 15, 0}, "DarkGoldenrod1"},
|
||||
{{238, 173, 14, 0}, "DarkGoldenrod2"},
|
||||
{{205, 149, 12, 0}, "DarkGoldenrod3"},
|
||||
{{139, 101, 8, 0}, "DarkGoldenrod4"},
|
||||
{{255, 193, 193, 0}, "RosyBrown1"},
|
||||
{{238, 180, 180, 0}, "RosyBrown2"},
|
||||
{{205, 155, 155, 0}, "RosyBrown3"},
|
||||
{{139, 105, 105, 0}, "RosyBrown4"},
|
||||
{{255, 106, 106, 0}, "IndianRed1"},
|
||||
{{238, 99, 99, 0}, "IndianRed2"},
|
||||
{{205, 85, 85, 0}, "IndianRed3"},
|
||||
{{139, 58, 58, 0}, "IndianRed4"},
|
||||
{{255, 130, 71, 0}, "sienna1"},
|
||||
{{238, 121, 66, 0}, "sienna2"},
|
||||
{{205, 104, 57, 0}, "sienna3"},
|
||||
{{139, 71, 38, 0}, "sienna4"},
|
||||
{{255, 211, 155, 0}, "burlywood1"},
|
||||
{{238, 197, 145, 0}, "burlywood2"},
|
||||
{{205, 170, 125, 0}, "burlywood3"},
|
||||
{{139, 115, 85, 0}, "burlywood4"},
|
||||
{{255, 231, 186, 0}, "wheat1"},
|
||||
{{238, 216, 174, 0}, "wheat2"},
|
||||
{{205, 186, 150, 0}, "wheat3"},
|
||||
{{139, 126, 102, 0}, "wheat4"},
|
||||
{{255, 165, 79, 0}, "tan1"},
|
||||
{{238, 154, 73, 0}, "tan2"},
|
||||
{{205, 133, 63, 0}, "tan3"},
|
||||
{{139, 90, 43, 0}, "tan4"},
|
||||
{{255, 127, 36, 0}, "chocolate1"},
|
||||
{{238, 118, 33, 0}, "chocolate2"},
|
||||
{{205, 102, 29, 0}, "chocolate3"},
|
||||
{{139, 69, 19, 0}, "chocolate4"},
|
||||
{{255, 48, 48, 0}, "firebrick1"},
|
||||
{{238, 44, 44, 0}, "firebrick2"},
|
||||
{{205, 38, 38, 0}, "firebrick3"},
|
||||
{{139, 26, 26, 0}, "firebrick4"},
|
||||
{{255, 64, 64, 0}, "brown1"},
|
||||
{{238, 59, 59, 0}, "brown2"},
|
||||
{{205, 51, 51, 0}, "brown3"},
|
||||
{{139, 35, 35, 0}, "brown4"},
|
||||
{{255, 140, 105, 0}, "salmon1"},
|
||||
{{238, 130, 98, 0}, "salmon2"},
|
||||
{{205, 112, 84, 0}, "salmon3"},
|
||||
{{139, 76, 57, 0}, "salmon4"},
|
||||
{{255, 160, 122, 0}, "LightSalmon1"},
|
||||
{{238, 149, 114, 0}, "LightSalmon2"},
|
||||
{{205, 129, 98, 0}, "LightSalmon3"},
|
||||
{{139, 87, 66, 0}, "LightSalmon4"},
|
||||
{{255, 165, 0, 0}, "orange1"},
|
||||
{{238, 154, 0, 0}, "orange2"},
|
||||
{{205, 133, 0, 0}, "orange3"},
|
||||
{{139, 90, 0, 0}, "orange4"},
|
||||
{{255, 127, 0, 0}, "DarkOrange1"},
|
||||
{{238, 118, 0, 0}, "DarkOrange2"},
|
||||
{{205, 102, 0, 0}, "DarkOrange3"},
|
||||
{{139, 69, 0, 0}, "DarkOrange4"},
|
||||
{{255, 114, 86, 0}, "coral1"},
|
||||
{{238, 106, 80, 0}, "coral2"},
|
||||
{{205, 91, 69, 0}, "coral3"},
|
||||
{{139, 62, 47, 0}, "coral4"},
|
||||
{{255, 99, 71, 0}, "tomato1"},
|
||||
{{238, 92, 66, 0}, "tomato2"},
|
||||
{{205, 79, 57, 0}, "tomato3"},
|
||||
{{139, 54, 38, 0}, "tomato4"},
|
||||
{{255, 69, 0, 0}, "OrangeRed1"},
|
||||
{{238, 64, 0, 0}, "OrangeRed2"},
|
||||
{{205, 55, 0, 0}, "OrangeRed3"},
|
||||
{{139, 37, 0, 0}, "OrangeRed4"},
|
||||
{{255, 0, 0, 0}, "red1"},
|
||||
{{238, 0, 0, 0}, "red2"},
|
||||
{{205, 0, 0, 0}, "red3"},
|
||||
{{139, 0, 0, 0}, "red4"},
|
||||
{{255, 20, 147, 0}, "DeepPink1"},
|
||||
{{238, 18, 137, 0}, "DeepPink2"},
|
||||
{{205, 16, 118, 0}, "DeepPink3"},
|
||||
{{139, 10, 80, 0}, "DeepPink4"},
|
||||
{{255, 110, 180, 0}, "HotPink1"},
|
||||
{{238, 106, 167, 0}, "HotPink2"},
|
||||
{{205, 96, 144, 0}, "HotPink3"},
|
||||
{{139, 58, 98, 0}, "HotPink4"},
|
||||
{{255, 181, 197, 0}, "pink1"},
|
||||
{{238, 169, 184, 0}, "pink2"},
|
||||
{{205, 145, 158, 0}, "pink3"},
|
||||
{{139, 99, 108, 0}, "pink4"},
|
||||
{{255, 174, 185, 0}, "LightPink1"},
|
||||
{{238, 162, 173, 0}, "LightPink2"},
|
||||
{{205, 140, 149, 0}, "LightPink3"},
|
||||
{{139, 95, 101, 0}, "LightPink4"},
|
||||
{{255, 130, 171, 0}, "PaleVioletRed1"},
|
||||
{{238, 121, 159, 0}, "PaleVioletRed2"},
|
||||
{{205, 104, 137, 0}, "PaleVioletRed3"},
|
||||
{{139, 71, 93, 0}, "PaleVioletRed4"},
|
||||
{{255, 52, 179, 0}, "maroon1"},
|
||||
{{238, 48, 167, 0}, "maroon2"},
|
||||
{{205, 41, 144, 0}, "maroon3"},
|
||||
{{139, 28, 98, 0}, "maroon4"},
|
||||
{{255, 62, 150, 0}, "VioletRed1"},
|
||||
{{238, 58, 140, 0}, "VioletRed2"},
|
||||
{{205, 50, 120, 0}, "VioletRed3"},
|
||||
{{139, 34, 82, 0}, "VioletRed4"},
|
||||
{{255, 0, 255, 0}, "magenta1"},
|
||||
{{238, 0, 238, 0}, "magenta2"},
|
||||
{{205, 0, 205, 0}, "magenta3"},
|
||||
{{139, 0, 139, 0}, "magenta4"},
|
||||
{{255, 131, 250, 0}, "orchid1"},
|
||||
{{238, 122, 233, 0}, "orchid2"},
|
||||
{{205, 105, 201, 0}, "orchid3"},
|
||||
{{139, 71, 137, 0}, "orchid4"},
|
||||
{{255, 187, 255, 0}, "plum1"},
|
||||
{{238, 174, 238, 0}, "plum2"},
|
||||
{{205, 150, 205, 0}, "plum3"},
|
||||
{{139, 102, 139, 0}, "plum4"},
|
||||
{{224, 102, 255, 0}, "MediumOrchid1"},
|
||||
{{209, 95, 238, 0}, "MediumOrchid2"},
|
||||
{{180, 82, 205, 0}, "MediumOrchid3"},
|
||||
{{122, 55, 139, 0}, "MediumOrchid4"},
|
||||
{{191, 62, 255, 0}, "DarkOrchid1"},
|
||||
{{178, 58, 238, 0}, "DarkOrchid2"},
|
||||
{{154, 50, 205, 0}, "DarkOrchid3"},
|
||||
{{104, 34, 139, 0}, "DarkOrchid4"},
|
||||
{{155, 48, 255, 0}, "purple1"},
|
||||
{{145, 44, 238, 0}, "purple2"},
|
||||
{{125, 38, 205, 0}, "purple3"},
|
||||
{{ 85, 26, 139, 0}, "purple4"},
|
||||
{{171, 130, 255, 0}, "MediumPurple1"},
|
||||
{{159, 121, 238, 0}, "MediumPurple2"},
|
||||
{{137, 104, 205, 0}, "MediumPurple3"},
|
||||
{{ 93, 71, 139, 0}, "MediumPurple4"},
|
||||
{{255, 225, 255, 0}, "thistle1"},
|
||||
{{238, 210, 238, 0}, "thistle2"},
|
||||
{{205, 181, 205, 0}, "thistle3"},
|
||||
{{139, 123, 139, 0}, "thistle4"},
|
||||
{{ 0, 0, 0, 0}, "gray0"},
|
||||
{{ 0, 0, 0, 0}, "grey0"},
|
||||
{{ 3, 3, 3, 0}, "gray1"},
|
||||
{{ 3, 3, 3, 0}, "grey1"},
|
||||
{{ 5, 5, 5, 0}, "gray2"},
|
||||
{{ 5, 5, 5, 0}, "grey2"},
|
||||
{{ 8, 8, 8, 0}, "gray3"},
|
||||
{{ 8, 8, 8, 0}, "grey3"},
|
||||
{{ 10, 10, 10, 0}, "gray4"},
|
||||
{{ 10, 10, 10, 0}, "grey4"},
|
||||
{{ 13, 13, 13, 0}, "gray5"},
|
||||
{{ 13, 13, 13, 0}, "grey5"},
|
||||
{{ 15, 15, 15, 0}, "gray6"},
|
||||
{{ 15, 15, 15, 0}, "grey6"},
|
||||
{{ 18, 18, 18, 0}, "gray7"},
|
||||
{{ 18, 18, 18, 0}, "grey7"},
|
||||
{{ 20, 20, 20, 0}, "gray8"},
|
||||
{{ 20, 20, 20, 0}, "grey8"},
|
||||
{{ 23, 23, 23, 0}, "gray9"},
|
||||
{{ 23, 23, 23, 0}, "grey9"},
|
||||
{{ 26, 26, 26, 0}, "gray10"},
|
||||
{{ 26, 26, 26, 0}, "grey10"},
|
||||
{{ 28, 28, 28, 0}, "gray11"},
|
||||
{{ 28, 28, 28, 0}, "grey11"},
|
||||
{{ 31, 31, 31, 0}, "gray12"},
|
||||
{{ 31, 31, 31, 0}, "grey12"},
|
||||
{{ 33, 33, 33, 0}, "gray13"},
|
||||
{{ 33, 33, 33, 0}, "grey13"},
|
||||
{{ 36, 36, 36, 0}, "gray14"},
|
||||
{{ 36, 36, 36, 0}, "grey14"},
|
||||
{{ 38, 38, 38, 0}, "gray15"},
|
||||
{{ 38, 38, 38, 0}, "grey15"},
|
||||
{{ 41, 41, 41, 0}, "gray16"},
|
||||
{{ 41, 41, 41, 0}, "grey16"},
|
||||
{{ 43, 43, 43, 0}, "gray17"},
|
||||
{{ 43, 43, 43, 0}, "grey17"},
|
||||
{{ 46, 46, 46, 0}, "gray18"},
|
||||
{{ 46, 46, 46, 0}, "grey18"},
|
||||
{{ 48, 48, 48, 0}, "gray19"},
|
||||
{{ 48, 48, 48, 0}, "grey19"},
|
||||
{{ 51, 51, 51, 0}, "gray20"},
|
||||
{{ 51, 51, 51, 0}, "grey20"},
|
||||
{{ 54, 54, 54, 0}, "gray21"},
|
||||
{{ 54, 54, 54, 0}, "grey21"},
|
||||
{{ 56, 56, 56, 0}, "gray22"},
|
||||
{{ 56, 56, 56, 0}, "grey22"},
|
||||
{{ 59, 59, 59, 0}, "gray23"},
|
||||
{{ 59, 59, 59, 0}, "grey23"},
|
||||
{{ 61, 61, 61, 0}, "gray24"},
|
||||
{{ 61, 61, 61, 0}, "grey24"},
|
||||
{{ 64, 64, 64, 0}, "gray25"},
|
||||
{{ 64, 64, 64, 0}, "grey25"},
|
||||
{{ 66, 66, 66, 0}, "gray26"},
|
||||
{{ 66, 66, 66, 0}, "grey26"},
|
||||
{{ 69, 69, 69, 0}, "gray27"},
|
||||
{{ 69, 69, 69, 0}, "grey27"},
|
||||
{{ 71, 71, 71, 0}, "gray28"},
|
||||
{{ 71, 71, 71, 0}, "grey28"},
|
||||
{{ 74, 74, 74, 0}, "gray29"},
|
||||
{{ 74, 74, 74, 0}, "grey29"},
|
||||
{{ 77, 77, 77, 0}, "gray30"},
|
||||
{{ 77, 77, 77, 0}, "grey30"},
|
||||
{{ 79, 79, 79, 0}, "gray31"},
|
||||
{{ 79, 79, 79, 0}, "grey31"},
|
||||
{{ 82, 82, 82, 0}, "gray32"},
|
||||
{{ 82, 82, 82, 0}, "grey32"},
|
||||
{{ 84, 84, 84, 0}, "gray33"},
|
||||
{{ 84, 84, 84, 0}, "grey33"},
|
||||
{{ 87, 87, 87, 0}, "gray34"},
|
||||
{{ 87, 87, 87, 0}, "grey34"},
|
||||
{{ 89, 89, 89, 0}, "gray35"},
|
||||
{{ 89, 89, 89, 0}, "grey35"},
|
||||
{{ 92, 92, 92, 0}, "gray36"},
|
||||
{{ 92, 92, 92, 0}, "grey36"},
|
||||
{{ 94, 94, 94, 0}, "gray37"},
|
||||
{{ 94, 94, 94, 0}, "grey37"},
|
||||
{{ 97, 97, 97, 0}, "gray38"},
|
||||
{{ 97, 97, 97, 0}, "grey38"},
|
||||
{{ 99, 99, 99, 0}, "gray39"},
|
||||
{{ 99, 99, 99, 0}, "grey39"},
|
||||
{{102, 102, 102, 0}, "gray40"},
|
||||
{{102, 102, 102, 0}, "grey40"},
|
||||
{{105, 105, 105, 0}, "gray41"},
|
||||
{{105, 105, 105, 0}, "grey41"},
|
||||
{{107, 107, 107, 0}, "gray42"},
|
||||
{{107, 107, 107, 0}, "grey42"},
|
||||
{{110, 110, 110, 0}, "gray43"},
|
||||
{{110, 110, 110, 0}, "grey43"},
|
||||
{{112, 112, 112, 0}, "gray44"},
|
||||
{{112, 112, 112, 0}, "grey44"},
|
||||
{{115, 115, 115, 0}, "gray45"},
|
||||
{{115, 115, 115, 0}, "grey45"},
|
||||
{{117, 117, 117, 0}, "gray46"},
|
||||
{{117, 117, 117, 0}, "grey46"},
|
||||
{{120, 120, 120, 0}, "gray47"},
|
||||
{{120, 120, 120, 0}, "grey47"},
|
||||
{{122, 122, 122, 0}, "gray48"},
|
||||
{{122, 122, 122, 0}, "grey48"},
|
||||
{{125, 125, 125, 0}, "gray49"},
|
||||
{{125, 125, 125, 0}, "grey49"},
|
||||
{{127, 127, 127, 0}, "gray50"},
|
||||
{{127, 127, 127, 0}, "grey50"},
|
||||
{{130, 130, 130, 0}, "gray51"},
|
||||
{{130, 130, 130, 0}, "grey51"},
|
||||
{{133, 133, 133, 0}, "gray52"},
|
||||
{{133, 133, 133, 0}, "grey52"},
|
||||
{{135, 135, 135, 0}, "gray53"},
|
||||
{{135, 135, 135, 0}, "grey53"},
|
||||
{{138, 138, 138, 0}, "gray54"},
|
||||
{{138, 138, 138, 0}, "grey54"},
|
||||
{{140, 140, 140, 0}, "gray55"},
|
||||
{{140, 140, 140, 0}, "grey55"},
|
||||
{{143, 143, 143, 0}, "gray56"},
|
||||
{{143, 143, 143, 0}, "grey56"},
|
||||
{{145, 145, 145, 0}, "gray57"},
|
||||
{{145, 145, 145, 0}, "grey57"},
|
||||
{{148, 148, 148, 0}, "gray58"},
|
||||
{{148, 148, 148, 0}, "grey58"},
|
||||
{{150, 150, 150, 0}, "gray59"},
|
||||
{{150, 150, 150, 0}, "grey59"},
|
||||
{{153, 153, 153, 0}, "gray60"},
|
||||
{{153, 153, 153, 0}, "grey60"},
|
||||
{{156, 156, 156, 0}, "gray61"},
|
||||
{{156, 156, 156, 0}, "grey61"},
|
||||
{{158, 158, 158, 0}, "gray62"},
|
||||
{{158, 158, 158, 0}, "grey62"},
|
||||
{{161, 161, 161, 0}, "gray63"},
|
||||
{{161, 161, 161, 0}, "grey63"},
|
||||
{{163, 163, 163, 0}, "gray64"},
|
||||
{{163, 163, 163, 0}, "grey64"},
|
||||
{{166, 166, 166, 0}, "gray65"},
|
||||
{{166, 166, 166, 0}, "grey65"},
|
||||
{{168, 168, 168, 0}, "gray66"},
|
||||
{{168, 168, 168, 0}, "grey66"},
|
||||
{{171, 171, 171, 0}, "gray67"},
|
||||
{{171, 171, 171, 0}, "grey67"},
|
||||
{{173, 173, 173, 0}, "gray68"},
|
||||
{{173, 173, 173, 0}, "grey68"},
|
||||
{{176, 176, 176, 0}, "gray69"},
|
||||
{{176, 176, 176, 0}, "grey69"},
|
||||
{{179, 179, 179, 0}, "gray70"},
|
||||
{{179, 179, 179, 0}, "grey70"},
|
||||
{{181, 181, 181, 0}, "gray71"},
|
||||
{{181, 181, 181, 0}, "grey71"},
|
||||
{{184, 184, 184, 0}, "gray72"},
|
||||
{{184, 184, 184, 0}, "grey72"},
|
||||
{{186, 186, 186, 0}, "gray73"},
|
||||
{{186, 186, 186, 0}, "grey73"},
|
||||
{{189, 189, 189, 0}, "gray74"},
|
||||
{{189, 189, 189, 0}, "grey74"},
|
||||
{{191, 191, 191, 0}, "gray75"},
|
||||
{{191, 191, 191, 0}, "grey75"},
|
||||
{{194, 194, 194, 0}, "gray76"},
|
||||
{{194, 194, 194, 0}, "grey76"},
|
||||
{{196, 196, 196, 0}, "gray77"},
|
||||
{{196, 196, 196, 0}, "grey77"},
|
||||
{{199, 199, 199, 0}, "gray78"},
|
||||
{{199, 199, 199, 0}, "grey78"},
|
||||
{{201, 201, 201, 0}, "gray79"},
|
||||
{{201, 201, 201, 0}, "grey79"},
|
||||
{{204, 204, 204, 0}, "gray80"},
|
||||
{{204, 204, 204, 0}, "grey80"},
|
||||
{{207, 207, 207, 0}, "gray81"},
|
||||
{{207, 207, 207, 0}, "grey81"},
|
||||
{{209, 209, 209, 0}, "gray82"},
|
||||
{{209, 209, 209, 0}, "grey82"},
|
||||
{{212, 212, 212, 0}, "gray83"},
|
||||
{{212, 212, 212, 0}, "grey83"},
|
||||
{{214, 214, 214, 0}, "gray84"},
|
||||
{{214, 214, 214, 0}, "grey84"},
|
||||
{{217, 217, 217, 0}, "gray85"},
|
||||
{{217, 217, 217, 0}, "grey85"},
|
||||
{{219, 219, 219, 0}, "gray86"},
|
||||
{{219, 219, 219, 0}, "grey86"},
|
||||
{{222, 222, 222, 0}, "gray87"},
|
||||
{{222, 222, 222, 0}, "grey87"},
|
||||
{{224, 224, 224, 0}, "gray88"},
|
||||
{{224, 224, 224, 0}, "grey88"},
|
||||
{{227, 227, 227, 0}, "gray89"},
|
||||
{{227, 227, 227, 0}, "grey89"},
|
||||
{{229, 229, 229, 0}, "gray90"},
|
||||
{{229, 229, 229, 0}, "grey90"},
|
||||
{{232, 232, 232, 0}, "gray91"},
|
||||
{{232, 232, 232, 0}, "grey91"},
|
||||
{{235, 235, 235, 0}, "gray92"},
|
||||
{{235, 235, 235, 0}, "grey92"},
|
||||
{{237, 237, 237, 0}, "gray93"},
|
||||
{{237, 237, 237, 0}, "grey93"},
|
||||
{{240, 240, 240, 0}, "gray94"},
|
||||
{{240, 240, 240, 0}, "grey94"},
|
||||
{{242, 242, 242, 0}, "gray95"},
|
||||
{{242, 242, 242, 0}, "grey95"},
|
||||
{{245, 245, 245, 0}, "gray96"},
|
||||
{{245, 245, 245, 0}, "grey96"},
|
||||
{{247, 247, 247, 0}, "gray97"},
|
||||
{{247, 247, 247, 0}, "grey97"},
|
||||
{{250, 250, 250, 0}, "gray98"},
|
||||
{{250, 250, 250, 0}, "grey98"},
|
||||
{{252, 252, 252, 0}, "gray99"},
|
||||
{{252, 252, 252, 0}, "grey99"},
|
||||
{{255, 255, 255, 0}, "gray100"},
|
||||
{{255, 255, 255, 0}, "grey100"},
|
||||
{{169, 169, 169, 0}, "dark"},
|
||||
{{169, 169, 169, 0}, "DarkGrey"},
|
||||
{{169, 169, 169, 0}, "dark"},
|
||||
{{169, 169, 169, 0}, "DarkGray"},
|
||||
{{ 0, 0, 139, 0}, "dark"},
|
||||
{{ 0, 0, 139, 0}, "DarkBlue"},
|
||||
{{ 0, 139, 139, 0}, "dark"},
|
||||
{{ 0, 139, 139, 0}, "DarkCyan"},
|
||||
{{139, 0, 139, 0}, "dark"},
|
||||
{{139, 0, 139, 0}, "DarkMagenta"},
|
||||
{{139, 0, 0, 0}, "dark"},
|
||||
{{139, 0, 0, 0}, "DarkRed"},
|
||||
{{144, 238, 144, 0}, "light"},
|
||||
{{144, 238, 144, 0}, "LightGreen"},
|
||||
{{ 0, 0, 0, 0}, NULL}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <X11/Xatom.h>
|
||||
@@ -8,67 +7,70 @@
|
||||
|
||||
#define MAX_PROPERTY_SIZE 8*1024
|
||||
|
||||
char *WMSelectionOwnerDidChangeNotification = "WMSelectionOwnerDidChange";
|
||||
|
||||
typedef struct SelectionHandler {
|
||||
WMWidget *widget;
|
||||
WMView *view;
|
||||
Atom selection;
|
||||
Time timestamp;
|
||||
WMConvertSelectionProc *convProc;
|
||||
WMLoseSelectionProc *loseProc;
|
||||
WMSelectionDoneProc *doneProc;
|
||||
WMSelectionProcs procs;
|
||||
void *data;
|
||||
|
||||
struct {
|
||||
unsigned delete_pending:1;
|
||||
unsigned done_pending:1;
|
||||
} flags;
|
||||
|
||||
struct SelectionHandler *next;
|
||||
} SelectionHandler;
|
||||
|
||||
|
||||
static SelectionHandler *selHandlers = NULL;
|
||||
|
||||
|
||||
void
|
||||
WMDeleteSelectionHandler(WMWidget *widget, Atom selection)
|
||||
{
|
||||
SelectionHandler *handler, *tmp;
|
||||
Display *dpy = WMWidgetScreen(widget)->display;
|
||||
Window win = WMWidgetXID(widget);
|
||||
typedef struct SelectionCallback {
|
||||
WMView *view;
|
||||
Atom selection;
|
||||
Atom target;
|
||||
Time timestamp;
|
||||
WMSelectionCallback *callback;
|
||||
void *data;
|
||||
|
||||
struct {
|
||||
unsigned delete_pending:1;
|
||||
unsigned done_pending:1;
|
||||
} flags;
|
||||
} SelectionCallback;
|
||||
|
||||
static WMArray *selCallbacks = NULL;
|
||||
|
||||
static WMArray *selHandlers = NULL;
|
||||
|
||||
static Bool gotXError = False;
|
||||
|
||||
void WMDeleteSelectionHandler(WMView * view, Atom selection, Time timestamp)
|
||||
{
|
||||
SelectionHandler *handler;
|
||||
Display *dpy = W_VIEW_SCREEN(view)->display;
|
||||
Window win = W_VIEW_DRAWABLE(view);
|
||||
WMArrayIterator iter;
|
||||
|
||||
if (!selHandlers)
|
||||
return;
|
||||
|
||||
tmp = selHandlers;
|
||||
/*//printf("deleting selection handler for %d", win); */
|
||||
|
||||
if (tmp->widget == widget) {
|
||||
WM_ITERATE_ARRAY(selHandlers, handler, iter) {
|
||||
if (handler->view == view && (handler->selection == selection || selection == None)
|
||||
&& (handler->timestamp == timestamp || timestamp == CurrentTime)) {
|
||||
|
||||
if (tmp->flags.done_pending) {
|
||||
tmp->flags.delete_pending = 1;
|
||||
if (handler->flags.done_pending) {
|
||||
handler->flags.delete_pending = 1;
|
||||
/*//puts(": postponed because still pending"); */
|
||||
return;
|
||||
}
|
||||
selHandlers = tmp->next;
|
||||
timestamp = tmp->timestamp;
|
||||
wfree(tmp);
|
||||
} else {
|
||||
while (tmp->next) {
|
||||
if (tmp->next->widget == widget) {
|
||||
|
||||
if (tmp->next->flags.done_pending) {
|
||||
tmp->next->flags.delete_pending = 1;
|
||||
return;
|
||||
}
|
||||
handler = tmp->next;
|
||||
tmp->next = handler->next;
|
||||
timestamp = handler->timestamp;
|
||||
wfree(handler);
|
||||
/*//printf(": found & removed"); */
|
||||
WMRemoveFromArray(selHandlers, handler);
|
||||
break;
|
||||
}
|
||||
tmp = tmp->next;
|
||||
}
|
||||
}
|
||||
|
||||
/*//printf("\n"); */
|
||||
|
||||
XGrabServer(dpy);
|
||||
if (XGetSelectionOwner(dpy, selection) == win) {
|
||||
XSetSelectionOwner(dpy, selection, None, timestamp);
|
||||
@@ -76,48 +78,68 @@ WMDeleteSelectionHandler(WMWidget *widget, Atom selection)
|
||||
XUngrabServer(dpy);
|
||||
}
|
||||
|
||||
|
||||
static Bool gotError = 0;
|
||||
/*
|
||||
static int
|
||||
errorHandler(XErrorEvent *error)
|
||||
void WMDeleteSelectionCallback(WMView * view, Atom selection, Time timestamp)
|
||||
{
|
||||
return 0;
|
||||
SelectionCallback *handler;
|
||||
WMArrayIterator iter;
|
||||
|
||||
if (!selCallbacks)
|
||||
return;
|
||||
|
||||
WM_ITERATE_ARRAY(selCallbacks, handler, iter) {
|
||||
if (handler->view == view && (handler->selection == selection || selection == None)
|
||||
&& (handler->timestamp == timestamp || timestamp == CurrentTime)) {
|
||||
|
||||
if (handler->flags.done_pending) {
|
||||
handler->flags.delete_pending = 1;
|
||||
return;
|
||||
}
|
||||
WMRemoveFromArray(selCallbacks, handler);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
static Bool
|
||||
writeSelection(Display *dpy, Window requestor, Atom property, Atom type,
|
||||
void *value, long length, int format)
|
||||
static int handleXError(Display * dpy, XErrorEvent * ev)
|
||||
{
|
||||
/*
|
||||
printf("write to %x: %s\n", requestor, XGetAtomName(dpy, property));
|
||||
*/
|
||||
gotError = False;
|
||||
gotXError = True;
|
||||
|
||||
#ifndef __sgi
|
||||
if (!XChangeProperty(dpy, requestor, property, type, format,
|
||||
PropModeReplace, value, length))
|
||||
return False;
|
||||
#else
|
||||
/* in sgi seems this seems to return void */
|
||||
XChangeProperty(dpy, requestor, property, type, format,
|
||||
PropModeReplace, value, length);
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
|
||||
static Bool writeSelection(Display * dpy, Window requestor, Atom property, Atom type, WMData * data)
|
||||
{
|
||||
static void *oldHandler;
|
||||
int format, bpi;
|
||||
|
||||
format = WMGetDataFormat(data);
|
||||
if (format == 0)
|
||||
format = 8;
|
||||
|
||||
bpi = format / 8;
|
||||
|
||||
/* printf("write to %x: %s\n", requestor, XGetAtomName(dpy, property)); */
|
||||
|
||||
oldHandler = XSetErrorHandler(handleXError);
|
||||
|
||||
gotXError = False;
|
||||
|
||||
XChangeProperty(dpy, requestor, property, type, format, PropModeReplace,
|
||||
WMDataBytes(data), WMGetDataLength(data) / bpi);
|
||||
|
||||
XFlush(dpy);
|
||||
|
||||
return !gotError;
|
||||
XSetErrorHandler(oldHandler);
|
||||
|
||||
return !gotXError;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
notifySelection(XEvent *event, Atom prop)
|
||||
static void notifySelection(XEvent * event, Atom prop)
|
||||
{
|
||||
XEvent ev;
|
||||
/*
|
||||
printf("envent to %x\n", event->xselectionrequest.requestor);
|
||||
*/
|
||||
|
||||
/* printf("event to %x\n", event->xselectionrequest.requestor); */
|
||||
|
||||
ev.xselection.type = SelectionNotify;
|
||||
ev.xselection.serial = 0;
|
||||
ev.xselection.send_event = True;
|
||||
@@ -128,295 +150,240 @@ notifySelection(XEvent *event, Atom prop)
|
||||
ev.xselection.property = prop;
|
||||
ev.xselection.time = event->xselectionrequest.time;
|
||||
|
||||
XSendEvent(event->xany.display, event->xselectionrequest.requestor,
|
||||
False, 0, &ev);
|
||||
XSendEvent(event->xany.display, event->xselectionrequest.requestor, False, 0, &ev);
|
||||
XFlush(event->xany.display);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
W_HandleSelectionEvent(XEvent *event)
|
||||
static void handleRequestEvent(XEvent * event)
|
||||
{
|
||||
SelectionHandler *handler;
|
||||
WMArrayIterator iter;
|
||||
WMArray *copy;
|
||||
Bool handledRequest;
|
||||
|
||||
handler = selHandlers;
|
||||
|
||||
while (handler) {
|
||||
if (WMWidgetXID(handler->widget)==event->xany.window
|
||||
/* && handler->selection == event->selection*/) {
|
||||
WM_ITERATE_ARRAY(selHandlers, handler, iter) {
|
||||
|
||||
switch (event->type) {
|
||||
case SelectionClear:
|
||||
if (handler->loseProc)
|
||||
(*handler->loseProc)(handler->widget, handler->selection);
|
||||
break;
|
||||
|
||||
case SelectionRequest:
|
||||
if (handler->convProc) {
|
||||
Atom atom;
|
||||
void *data;
|
||||
unsigned length;
|
||||
int format;
|
||||
Atom prop;
|
||||
|
||||
/* they're requesting for something old */
|
||||
if (event->xselectionrequest.time < handler->timestamp
|
||||
&& event->xselectionrequest.time != CurrentTime) {
|
||||
|
||||
notifySelection(event, None);
|
||||
if (W_VIEW_DRAWABLE(handler->view)
|
||||
!= event->xselectionclear.window) {
|
||||
break;
|
||||
}
|
||||
|
||||
handler->flags.done_pending = 1;
|
||||
if (handler->procs.selectionLost)
|
||||
handler->procs.selectionLost(handler->view, handler->selection, handler->data);
|
||||
handler->flags.done_pending = 0;
|
||||
handler->flags.delete_pending = 1;
|
||||
break;
|
||||
|
||||
if (!(*handler->convProc)(handler->widget,
|
||||
handler->selection,
|
||||
event->xselectionrequest.target,
|
||||
&atom, &data, &length, &format)) {
|
||||
|
||||
notifySelection(event, None);
|
||||
case SelectionRequest:
|
||||
if (W_VIEW_DRAWABLE(handler->view) != event->xselectionrequest.owner) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (handler->procs.convertSelection != NULL
|
||||
&& handler->selection == event->xselectionrequest.selection) {
|
||||
Atom atom;
|
||||
WMData *data;
|
||||
Atom prop;
|
||||
|
||||
/* they're requesting for something old.. maybe another handler
|
||||
* can handle it */
|
||||
if (event->xselectionrequest.time < handler->timestamp
|
||||
&& event->xselectionrequest.time != CurrentTime) {
|
||||
break;
|
||||
}
|
||||
|
||||
handledRequest = False;
|
||||
|
||||
handler->flags.done_pending = 1;
|
||||
|
||||
data = handler->procs.convertSelection(handler->view,
|
||||
handler->selection,
|
||||
event->xselectionrequest.target,
|
||||
handler->data, &atom);
|
||||
|
||||
prop = event->xselectionrequest.property;
|
||||
/* obsolete clients that don't set the property field */
|
||||
if (prop == None)
|
||||
prop = event->xselectionrequest.target;
|
||||
|
||||
if (!writeSelection(event->xselectionrequest.display,
|
||||
event->xselectionrequest.requestor,
|
||||
prop, atom, data, length, format)) {
|
||||
|
||||
wfree(data);
|
||||
notifySelection(event, None);
|
||||
break;
|
||||
if (data) {
|
||||
if (writeSelection(event->xselectionrequest.display,
|
||||
event->xselectionrequest.requestor, prop, atom, data)) {
|
||||
handledRequest = True;
|
||||
}
|
||||
WMReleaseData(data);
|
||||
}
|
||||
wfree(data);
|
||||
|
||||
notifySelection(event, prop);
|
||||
notifySelection(event, (handledRequest == True ? prop : None));
|
||||
|
||||
if (handler->doneProc) {
|
||||
(*handler->doneProc)(handler->widget,
|
||||
if (handler->procs.selectionDone != NULL) {
|
||||
handler->procs.selectionDone(handler->view,
|
||||
handler->selection,
|
||||
event->xselectionrequest.target);
|
||||
event->xselectionrequest.target,
|
||||
handler->data);
|
||||
}
|
||||
|
||||
handler->flags.done_pending = 0;
|
||||
|
||||
/* in case the handler was deleted from some
|
||||
* callback */
|
||||
if (handler->flags.delete_pending) {
|
||||
WMDeleteSelectionHandler(handler->widget,
|
||||
handler->selection);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case SelectionNotify:
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
handler = handler->next;
|
||||
/* delete handlers */
|
||||
copy = WMDuplicateArray(selHandlers);
|
||||
WM_ITERATE_ARRAY(copy, handler, iter) {
|
||||
if (handler && handler->flags.delete_pending) {
|
||||
WMDeleteSelectionHandler(handler->view, handler->selection, handler->timestamp);
|
||||
}
|
||||
}
|
||||
WMFreeArray(copy);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Bool
|
||||
WMCreateSelectionHandler(WMWidget *w, Atom selection, Time timestamp,
|
||||
WMConvertSelectionProc *convProc,
|
||||
WMLoseSelectionProc *loseProc,
|
||||
WMSelectionDoneProc *doneProc)
|
||||
static WMData *getSelectionData(Display * dpy, Window win, Atom where)
|
||||
{
|
||||
SelectionHandler *handler, *tmp;
|
||||
Display *dpy = WMWidgetScreen(w)->display;
|
||||
WMData *wdata;
|
||||
unsigned char *data;
|
||||
Atom rtype;
|
||||
int bits, bpi;
|
||||
unsigned long len, bytes;
|
||||
|
||||
XSetSelectionOwner(dpy, selection, WMWidgetXID(w), timestamp);
|
||||
if (XGetSelectionOwner(dpy, selection) != WMWidgetXID(w))
|
||||
if (XGetWindowProperty(dpy, win, where, 0, MAX_PROPERTY_SIZE,
|
||||
False, AnyPropertyType, &rtype, &bits, &len, &bytes, &data) != Success) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bpi = bits / 8;
|
||||
|
||||
wdata = WMCreateDataWithBytesNoCopy(data, len * bpi, (WMFreeDataProc *) XFree);
|
||||
WMSetDataFormat(wdata, bits);
|
||||
|
||||
return wdata;
|
||||
}
|
||||
|
||||
static void handleNotifyEvent(XEvent * event)
|
||||
{
|
||||
SelectionCallback *handler;
|
||||
WMArrayIterator iter;
|
||||
WMArray *copy;
|
||||
WMData *data;
|
||||
|
||||
WM_ITERATE_ARRAY(selCallbacks, handler, iter) {
|
||||
|
||||
if (W_VIEW_DRAWABLE(handler->view) != event->xselection.requestor
|
||||
|| handler->selection != event->xselection.selection) {
|
||||
continue;
|
||||
}
|
||||
handler->flags.done_pending = 1;
|
||||
|
||||
if (event->xselection.property == None) {
|
||||
data = NULL;
|
||||
} else {
|
||||
data = getSelectionData(event->xselection.display,
|
||||
event->xselection.requestor, event->xselection.property);
|
||||
}
|
||||
|
||||
(*handler->callback) (handler->view, handler->selection,
|
||||
handler->target, handler->timestamp, handler->data, data);
|
||||
|
||||
if (data != NULL) {
|
||||
WMReleaseData(data);
|
||||
}
|
||||
handler->flags.done_pending = 0;
|
||||
handler->flags.delete_pending = 1;
|
||||
}
|
||||
|
||||
/* delete callbacks */
|
||||
copy = WMDuplicateArray(selCallbacks);
|
||||
WM_ITERATE_ARRAY(copy, handler, iter) {
|
||||
if (handler && handler->flags.delete_pending) {
|
||||
WMDeleteSelectionCallback(handler->view, handler->selection, handler->timestamp);
|
||||
}
|
||||
}
|
||||
WMFreeArray(copy);
|
||||
}
|
||||
|
||||
void W_HandleSelectionEvent(XEvent * event)
|
||||
{
|
||||
/*//printf("%d received selection ", event->xany.window); */
|
||||
/*//switch(event->type) {
|
||||
case SelectionNotify:
|
||||
puts("notify"); break;
|
||||
case SelectionRequest:
|
||||
puts("request"); break;
|
||||
case SelectionClear:
|
||||
puts("clear"); break;
|
||||
default:
|
||||
puts("unknown"); break;
|
||||
} */
|
||||
|
||||
if (event->type == SelectionNotify) {
|
||||
handleNotifyEvent(event);
|
||||
} else {
|
||||
handleRequestEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
Bool WMCreateSelectionHandler(WMView * view, Atom selection, Time timestamp, WMSelectionProcs * procs, void *cdata)
|
||||
{
|
||||
SelectionHandler *handler;
|
||||
Display *dpy = W_VIEW_SCREEN(view)->display;
|
||||
|
||||
XSetSelectionOwner(dpy, selection, W_VIEW_DRAWABLE(view), timestamp);
|
||||
if (XGetSelectionOwner(dpy, selection) != W_VIEW_DRAWABLE(view)) {
|
||||
return False;
|
||||
}
|
||||
|
||||
handler = malloc(sizeof(SelectionHandler));
|
||||
if (!handler)
|
||||
return False;
|
||||
WMPostNotificationName(WMSelectionOwnerDidChangeNotification, (void *)selection, (void *)view);
|
||||
|
||||
handler->widget = w;
|
||||
/*//printf("created selection handler for %d\n", W_VIEW_DRAWABLE(view)); */
|
||||
|
||||
handler = wmalloc(sizeof(SelectionHandler));
|
||||
handler->view = view;
|
||||
handler->selection = selection;
|
||||
handler->timestamp = timestamp;
|
||||
handler->convProc = convProc;
|
||||
handler->loseProc = loseProc;
|
||||
handler->doneProc = doneProc;
|
||||
handler->procs = *procs;
|
||||
handler->data = cdata;
|
||||
memset(&handler->flags, 0, sizeof(handler->flags));
|
||||
|
||||
if (!selHandlers) {
|
||||
/* first in the queue */
|
||||
handler->next = selHandlers;
|
||||
selHandlers = handler;
|
||||
} else {
|
||||
tmp = selHandlers;
|
||||
while (tmp->next) {
|
||||
tmp = tmp->next;
|
||||
}
|
||||
handler->next = tmp->next;
|
||||
tmp->next = handler;
|
||||
if (selHandlers == NULL) {
|
||||
selHandlers = WMCreateArrayWithDestructor(4, wfree);
|
||||
}
|
||||
|
||||
WMAddToArray(selHandlers, handler);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void
|
||||
timeoutHandler(void *data)
|
||||
Bool
|
||||
WMRequestSelection(WMView * view, Atom selection, Atom target, Time timestamp,
|
||||
WMSelectionCallback * callback, void *cdata)
|
||||
{
|
||||
*(int*)data = 1;
|
||||
}
|
||||
SelectionCallback *handler;
|
||||
|
||||
|
||||
static Bool
|
||||
getInternalSelection(WMScreen *scr, Atom selection, Atom target,
|
||||
void **data, unsigned *length)
|
||||
{
|
||||
Window owner;
|
||||
SelectionHandler *handler;
|
||||
|
||||
/*
|
||||
* Check if the selection is owned by this application and if so,
|
||||
* do the conversion directly.
|
||||
*/
|
||||
|
||||
*data = NULL;
|
||||
|
||||
owner = XGetSelectionOwner(scr->display, selection);
|
||||
if (!owner)
|
||||
if (XGetSelectionOwner(W_VIEW_SCREEN(view)->display, selection) == None)
|
||||
return False;
|
||||
|
||||
handler = selHandlers;
|
||||
|
||||
while (handler) {
|
||||
if (WMWidgetXID(handler->widget) == owner
|
||||
/* && handler->selection == event->selection*/) {
|
||||
break;
|
||||
}
|
||||
handler = handler->next;
|
||||
}
|
||||
|
||||
if (!handler)
|
||||
if (!XConvertSelection(W_VIEW_SCREEN(view)->display, selection, target,
|
||||
W_VIEW_SCREEN(view)->clipboardAtom, W_VIEW_DRAWABLE(view), timestamp)) {
|
||||
return False;
|
||||
|
||||
if (handler->convProc) {
|
||||
Atom atom;
|
||||
int format;
|
||||
|
||||
if (!(*handler->convProc)(handler->widget, handler->selection,
|
||||
target, &atom, data, length, &format)) {
|
||||
return True;
|
||||
}
|
||||
|
||||
if (handler->doneProc) {
|
||||
(*handler->doneProc)(handler->widget, handler->selection, target);
|
||||
}
|
||||
handler = wmalloc(sizeof(SelectionCallback));
|
||||
handler->view = view;
|
||||
handler->selection = selection;
|
||||
handler->target = target;
|
||||
handler->timestamp = timestamp;
|
||||
handler->callback = callback;
|
||||
handler->data = cdata;
|
||||
|
||||
if (selCallbacks == NULL) {
|
||||
selCallbacks = WMCreateArrayWithDestructor(4, wfree);
|
||||
}
|
||||
|
||||
WMAddToArray(selCallbacks, handler);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
W_GetTextSelection(WMScreen *scr, Atom selection)
|
||||
{
|
||||
int buffer = -1;
|
||||
|
||||
switch (selection) {
|
||||
case XA_CUT_BUFFER0:
|
||||
buffer = 0;
|
||||
break;
|
||||
case XA_CUT_BUFFER1:
|
||||
buffer = 1;
|
||||
break;
|
||||
case XA_CUT_BUFFER2:
|
||||
buffer = 2;
|
||||
break;
|
||||
case XA_CUT_BUFFER3:
|
||||
buffer = 3;
|
||||
break;
|
||||
case XA_CUT_BUFFER4:
|
||||
buffer = 4;
|
||||
break;
|
||||
case XA_CUT_BUFFER5:
|
||||
buffer = 5;
|
||||
break;
|
||||
case XA_CUT_BUFFER6:
|
||||
buffer = 6;
|
||||
break;
|
||||
case XA_CUT_BUFFER7:
|
||||
buffer = 7;
|
||||
break;
|
||||
}
|
||||
if (buffer >= 0) {
|
||||
char *data;
|
||||
int size;
|
||||
|
||||
data = XFetchBuffer(scr->display, &size, buffer);
|
||||
|
||||
return data;
|
||||
} else {
|
||||
char *data;
|
||||
int bits;
|
||||
Atom rtype;
|
||||
unsigned long len, bytes;
|
||||
WMHandlerID timer;
|
||||
int timeout = 0;
|
||||
XEvent ev;
|
||||
unsigned length;
|
||||
|
||||
XDeleteProperty(scr->display, scr->groupLeader, scr->clipboardAtom);
|
||||
|
||||
if (getInternalSelection(scr, selection, XA_STRING, (void**)&data,
|
||||
&length)) {
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
XConvertSelection(scr->display, selection, XA_STRING,
|
||||
scr->clipboardAtom, scr->groupLeader,
|
||||
scr->lastEventTime);
|
||||
|
||||
timer = WMAddTimerHandler(1000, timeoutHandler, &timeout);
|
||||
|
||||
while (!XCheckTypedWindowEvent(scr->display, scr->groupLeader,
|
||||
SelectionNotify, &ev) && !timeout);
|
||||
|
||||
if (!timeout) {
|
||||
WMDeleteTimerHandler(timer);
|
||||
} else {
|
||||
wwarning("selection retrieval timed out");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* nobody owns the selection or the current owner has
|
||||
* nothing to do with what we need */
|
||||
if (ev.xselection.property == None) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (XGetWindowProperty(scr->display, scr->groupLeader,
|
||||
scr->clipboardAtom, 0, MAX_PROPERTY_SIZE,
|
||||
False, XA_STRING, &rtype, &bits, &len,
|
||||
&bytes, (unsigned char**)&data)!=Success) {
|
||||
return NULL;
|
||||
}
|
||||
if (rtype!=XA_STRING || bits!=8) {
|
||||
wwarning("invalid data in text selection");
|
||||
if (data)
|
||||
XFree(data);
|
||||
return NULL;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
427
WINGs/string.c
Normal file
427
WINGs/string.c
Normal file
@@ -0,0 +1,427 @@
|
||||
/*
|
||||
* Until FreeBSD gets their act together;
|
||||
* http://www.mail-archive.com/freebsd-hackers@freebsd.org/msg69469.html
|
||||
*/
|
||||
#if defined( FREEBSD )
|
||||
# undef _XOPEN_SOURCE
|
||||
#endif
|
||||
|
||||
#include "wconfig.h"
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#ifdef HAVE_BSD_STRING_H
|
||||
#include <bsd/string.h>
|
||||
#endif
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
#define PRC_ALPHA 0
|
||||
#define PRC_BLANK 1
|
||||
#define PRC_ESCAPE 2
|
||||
#define PRC_DQUOTE 3
|
||||
#define PRC_EOS 4
|
||||
#define PRC_SQUOTE 5
|
||||
|
||||
typedef struct {
|
||||
short nstate;
|
||||
short output;
|
||||
} DFA;
|
||||
|
||||
static DFA mtable[9][6] = {
|
||||
{{3, 1}, {0, 0}, {4, 0}, {1, 0}, {8, 0}, {6, 0}},
|
||||
{{1, 1}, {1, 1}, {2, 0}, {3, 0}, {5, 0}, {1, 1}},
|
||||
{{1, 1}, {1, 1}, {1, 1}, {1, 1}, {5, 0}, {1, 1}},
|
||||
{{3, 1}, {5, 0}, {4, 0}, {1, 0}, {5, 0}, {6, 0}},
|
||||
{{3, 1}, {3, 1}, {3, 1}, {3, 1}, {5, 0}, {3, 1}},
|
||||
{{-1, -1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, /* final state */
|
||||
{{6, 1}, {6, 1}, {7, 0}, {6, 1}, {5, 0}, {3, 0}},
|
||||
{{6, 1}, {6, 1}, {6, 1}, {6, 1}, {5, 0}, {6, 1}},
|
||||
{{-1, -1}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}, /* final state */
|
||||
};
|
||||
|
||||
char *wtokennext(char *word, char **next)
|
||||
{
|
||||
char *ptr;
|
||||
char *ret, *t;
|
||||
int state, ctype;
|
||||
|
||||
t = ret = wmalloc(strlen(word) + 1);
|
||||
ptr = word;
|
||||
|
||||
state = 0;
|
||||
while (1) {
|
||||
if (*ptr == 0)
|
||||
ctype = PRC_EOS;
|
||||
else if (*ptr == '\\')
|
||||
ctype = PRC_ESCAPE;
|
||||
else if (*ptr == '"')
|
||||
ctype = PRC_DQUOTE;
|
||||
else if (*ptr == '\'')
|
||||
ctype = PRC_SQUOTE;
|
||||
else if (*ptr == ' ' || *ptr == '\t')
|
||||
ctype = PRC_BLANK;
|
||||
else
|
||||
ctype = PRC_ALPHA;
|
||||
|
||||
if (mtable[state][ctype].output) {
|
||||
*t = *ptr;
|
||||
t++;
|
||||
*t = 0;
|
||||
}
|
||||
state = mtable[state][ctype].nstate;
|
||||
ptr++;
|
||||
if (mtable[state][0].output < 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (*ret == 0)
|
||||
t = NULL;
|
||||
else
|
||||
t = wstrdup(ret);
|
||||
|
||||
wfree(ret);
|
||||
|
||||
if (ctype == PRC_EOS)
|
||||
*next = NULL;
|
||||
else
|
||||
*next = ptr;
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
/* separate a string in tokens, taking " and ' into account */
|
||||
void wtokensplit(char *command, char ***argv, int *argc)
|
||||
{
|
||||
char *token, *line;
|
||||
int count;
|
||||
|
||||
count = 0;
|
||||
line = command;
|
||||
do {
|
||||
token = wtokennext(line, &line);
|
||||
if (token) {
|
||||
if (count == 0)
|
||||
*argv = wmalloc(sizeof(char **));
|
||||
else
|
||||
*argv = wrealloc(*argv, (count + 1) * sizeof(char **));
|
||||
(*argv)[count++] = token;
|
||||
}
|
||||
} while (token != NULL && line != NULL);
|
||||
|
||||
*argc = count;
|
||||
}
|
||||
|
||||
char *wtokenjoin(char **list, int count)
|
||||
{
|
||||
int i, j;
|
||||
char *flat_string, *wspace;
|
||||
|
||||
j = 0;
|
||||
for (i = 0; i < count; i++) {
|
||||
if (list[i] != NULL && list[i][0] != 0) {
|
||||
j += strlen(list[i]);
|
||||
if (strpbrk(list[i], " \t"))
|
||||
j += 2;
|
||||
}
|
||||
}
|
||||
|
||||
flat_string = wmalloc(j + count + 1);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (list[i] != NULL && list[i][0] != 0) {
|
||||
if (i > 0 &&
|
||||
wstrlcat(flat_string, " ", j + count + 1) >= j + count + 1)
|
||||
goto error;
|
||||
|
||||
wspace = strpbrk(list[i], " \t");
|
||||
|
||||
if (wspace &&
|
||||
wstrlcat(flat_string, "\"", j + count + 1) >= j + count + 1)
|
||||
goto error;
|
||||
|
||||
if (wstrlcat(flat_string, list[i], j + count + 1) >= j + count + 1)
|
||||
goto error;
|
||||
|
||||
if (wspace &&
|
||||
wstrlcat(flat_string, "\"", j + count + 1) >= j + count + 1)
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
|
||||
return flat_string;
|
||||
|
||||
error:
|
||||
wfree(flat_string);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void wtokenfree(char **tokens, int count)
|
||||
{
|
||||
while (count--)
|
||||
wfree(tokens[count]);
|
||||
wfree(tokens);
|
||||
}
|
||||
|
||||
char *wtrimspace(const char *s)
|
||||
{
|
||||
char *t;
|
||||
|
||||
if (s == NULL)
|
||||
return NULL;
|
||||
|
||||
while (isspace(*s) && *s)
|
||||
s++;
|
||||
t = (char *)s + strlen(s) - 1;
|
||||
while (t > s && isspace(*t))
|
||||
t--;
|
||||
|
||||
return wstrndup(s, t - s + 1);
|
||||
}
|
||||
|
||||
char *wstrdup(const char *str)
|
||||
{
|
||||
assert(str != NULL);
|
||||
|
||||
return strcpy(wmalloc(strlen(str) + 1), str);
|
||||
}
|
||||
|
||||
char *wstrndup(const char *str, size_t len)
|
||||
{
|
||||
char *copy;
|
||||
|
||||
assert(str != NULL);
|
||||
|
||||
len = WMIN(len, strlen(str));
|
||||
copy = strncpy(wmalloc(len + 1), str, len);
|
||||
copy[len] = 0;
|
||||
|
||||
return copy;
|
||||
}
|
||||
|
||||
char *wstrconcat(char *str1, char *str2)
|
||||
{
|
||||
char *str;
|
||||
size_t slen;
|
||||
|
||||
if (!str1)
|
||||
return wstrdup(str2);
|
||||
else if (!str2)
|
||||
return wstrdup(str1);
|
||||
|
||||
slen = strlen(str1) + strlen(str2) + 1;
|
||||
str = wmalloc(slen);
|
||||
if (wstrlcpy(str, str1, slen) >= slen ||
|
||||
wstrlcat(str, str2, slen) >= slen) {
|
||||
wfree(str);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
char *wstrappend(char *dst, char *src)
|
||||
{
|
||||
size_t slen;
|
||||
|
||||
if (!dst)
|
||||
return wstrdup(src);
|
||||
else if (!src || *src == 0)
|
||||
return dst;
|
||||
|
||||
slen = strlen(dst) + strlen(src) + 1;
|
||||
dst = wrealloc(dst, slen);
|
||||
if (wstrlcat(dst, src, slen) >= slen)
|
||||
return NULL;
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
|
||||
#if HAVE_STRLCAT
|
||||
size_t
|
||||
wstrlcat(char *dst, const char *src, size_t siz)
|
||||
{
|
||||
return strlcat(dst, src, siz);
|
||||
}
|
||||
#else
|
||||
/* $OpenBSD: strlcat.c,v 1.13 2005/08/08 08:05:37 espie Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Appends src to string dst of size siz (unlike strncat, siz is the
|
||||
* full size of dst, not space left). At most siz-1 characters
|
||||
* will be copied. Always NUL terminates (unless siz <= strlen(dst)).
|
||||
* Returns strlen(src) + MIN(siz, strlen(initial dst)).
|
||||
* If retval >= siz, truncation occurred.
|
||||
*/
|
||||
size_t
|
||||
wstrlcat(char *dst, const char *src, size_t siz)
|
||||
{
|
||||
char *d = dst;
|
||||
const char *s = src;
|
||||
size_t n = siz;
|
||||
size_t dlen;
|
||||
|
||||
/* Find the end of dst and adjust bytes left but don't go past end */
|
||||
while (n-- != 0 && *d != '\0')
|
||||
d++;
|
||||
dlen = d - dst;
|
||||
n = siz - dlen;
|
||||
|
||||
if (n == 0)
|
||||
return(dlen + strlen(s));
|
||||
while (*s != '\0') {
|
||||
if (n != 1) {
|
||||
*d++ = *s;
|
||||
n--;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
*d = '\0';
|
||||
|
||||
return(dlen + (s - src)); /* count does not include NUL */
|
||||
}
|
||||
#endif /* HAVE_STRLCAT */
|
||||
|
||||
#if HAVE_STRLCPY
|
||||
size_t
|
||||
wstrlcpy(char *dst, const char *src, size_t siz)
|
||||
{
|
||||
return strlcpy(dst, src, siz);
|
||||
}
|
||||
#else
|
||||
|
||||
/* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copy src to string dst of size siz. At most siz-1 characters
|
||||
* will be copied. Always NUL terminates (unless siz == 0).
|
||||
* Returns strlen(src); if retval >= siz, truncation occurred.
|
||||
*/
|
||||
size_t
|
||||
wstrlcpy(char *dst, const char *src, size_t siz)
|
||||
{
|
||||
char *d = dst;
|
||||
const char *s = src;
|
||||
size_t n = siz;
|
||||
|
||||
/* Copy as many bytes as will fit */
|
||||
if (n != 0) {
|
||||
while (--n != 0) {
|
||||
if ((*d++ = *s++) == '\0')
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Not enough room in dst, add NUL and traverse rest of src */
|
||||
if (n == 0) {
|
||||
if (siz != 0)
|
||||
*d = '\0'; /* NUL-terminate dst */
|
||||
while (*s++)
|
||||
;
|
||||
}
|
||||
|
||||
return(s - src - 1); /* count does not include NUL */
|
||||
}
|
||||
#endif /* HAVE_STRLCPY */
|
||||
|
||||
/* transform `s' so that the result is safe to pass to the shell as an argument.
|
||||
* returns a newly allocated string.
|
||||
* with very heavy inspirations from NetBSD's shquote(3).
|
||||
*/
|
||||
char *wshellquote(const char *s)
|
||||
{
|
||||
char *p, *r, *last, *ret;
|
||||
size_t slen;
|
||||
int needs_quoting;
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
needs_quoting = !*s; /* the empty string does need quoting */
|
||||
|
||||
/* do not quote if consists only of the following characters */
|
||||
for (p = (char *)s; *p && !needs_quoting; p++) {
|
||||
needs_quoting = !(isalnum(*p) || (*p == '+') || (*p == '/') ||
|
||||
(*p == '.') || (*p == ',') || (*p == '-'));
|
||||
}
|
||||
|
||||
if (!needs_quoting)
|
||||
return wstrdup(s);
|
||||
|
||||
for (slen = 0, p = (char *)s; *p; p++) /* count space needed (worst case) */
|
||||
slen += *p == '\'' ? 4 : 1; /* every single ' becomes ''\' */
|
||||
|
||||
slen += 2 /* leading + trailing "'" */ + 1 /* NULL */;
|
||||
|
||||
ret = r = wmalloc(slen);
|
||||
p = (char *)s;
|
||||
last = p;
|
||||
|
||||
if (*p != '\'') /* if string doesn't already begin with "'" */
|
||||
*r++ ='\''; /* start putting it in quotes */
|
||||
|
||||
while (*p) {
|
||||
last = p;
|
||||
if (*p == '\'') { /* turn each ' into ''\' */
|
||||
if (p != s) /* except if it's the first ', in which case */
|
||||
*r++ = '\''; /* only escape it */
|
||||
*r++ = '\\';
|
||||
*r++ = '\'';
|
||||
while (*++p && *p == '\'') { /* keep turning each consecutive 's into \' */
|
||||
*r++ = '\\';
|
||||
*r++ = '\'';
|
||||
}
|
||||
if (*p) /* if more input follows, terminate */
|
||||
*r++ = '\''; /* what we have so far */
|
||||
} else {
|
||||
*r++ = *p++;
|
||||
}
|
||||
}
|
||||
|
||||
if (*last != '\'') /* if the last one isn't already a ' */
|
||||
*r++ = '\''; /* terminate the whole shebang */
|
||||
|
||||
*r = '\0';
|
||||
|
||||
return ret; /* technically, we lose (but not leak) a couple of */
|
||||
/* bytes (twice the number of consecutive 's in the */
|
||||
/* input or so), but since these are relatively rare */
|
||||
/* and short-lived strings, not sure if a trip to */
|
||||
/* wstrdup+wfree worths the gain. */
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user