mirror of
https://github.com/gryf/wmaker.git
synced 2026-03-11 03:55:53 +01:00
Compare commits
1629 Commits
wm-0.20.1
...
wmaker-0.9
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
a29175db52 | ||
|
|
2acc122e2c | ||
|
|
5730c765c3 | ||
|
|
b40d52edd6 | ||
|
|
046fe3f1ca | ||
|
|
ce9c88c0e8 | ||
|
|
cc5592f087 | ||
|
|
1dc1f56802 | ||
|
|
27b9c077a4 | ||
|
|
355fffe3c4 | ||
|
|
6d81ede842 | ||
|
|
24416415a6 | ||
|
|
c6498bebd8 | ||
|
|
f65c549814 | ||
|
|
15734b9147 | ||
|
|
137ce7e0f1 | ||
|
|
7bb187a3b3 | ||
|
|
fb51ee83b7 | ||
|
|
3d7cb106af | ||
|
|
03e14f363f | ||
|
|
d267d17621 | ||
|
|
9e45e85dc6 | ||
|
|
8219011758 | ||
|
|
2e154a404d | ||
|
|
a652f23c40 | ||
|
|
cd079b9d3c | ||
|
|
a4cd5b7c9a | ||
|
|
d82906b4b7 | ||
|
|
190cd648e1 | ||
|
|
f5177e67d5 | ||
|
|
6672180d77 | ||
|
|
20c8f4fd58 | ||
|
|
41bbee7f38 | ||
|
|
bdfd7788cf | ||
|
|
fb802f2d6e | ||
|
|
85ee588aa6 | ||
|
|
5bd797b066 | ||
|
|
62a929a231 | ||
|
|
e43e1fe2f7 | ||
|
|
c7fa92794b | ||
|
|
4587f126c0 | ||
|
|
f711e49c17 | ||
|
|
98f5c6ff36 | ||
|
|
3c5f5cba0e | ||
|
|
e9cb10749b | ||
|
|
956c167bbf | ||
|
|
1315875ee0 | ||
|
|
90ab2c15cb | ||
|
|
150432ff95 | ||
|
|
9915c4ab2a | ||
|
|
817f30a754 | ||
|
|
39314191ad | ||
|
|
3d20415b8e | ||
|
|
4932d4aef8 | ||
|
|
9685ae0815 | ||
|
|
d94626fd70 | ||
|
|
2f09891b60 | ||
|
|
db594a9b89 | ||
|
|
b8ec94f941 | ||
|
|
b974bd7e78 | ||
|
|
0f9aa277c1 | ||
|
|
6c8226a52f | ||
|
|
553539748d | ||
|
|
1dc5c1882c | ||
|
|
e9ee3765f9 | ||
|
|
37217ce180 | ||
|
|
93941b2c03 | ||
|
|
41334b84d5 | ||
|
|
d97997b5e9 | ||
|
|
225c60f2f9 | ||
|
|
6ec0f20d6a | ||
|
|
210dd8ce36 | ||
|
|
e27ac1e643 | ||
|
|
5a89cfae86 | ||
|
|
e8ecd3d559 | ||
|
|
e03f8e6847 | ||
|
|
0af2448349 | ||
|
|
f7fe1b2e94 | ||
|
|
2090f81b40 | ||
|
|
34c4040d91 | ||
|
|
fea35bfc99 | ||
|
|
65f5627d98 | ||
|
|
182ecaf0f6 | ||
|
|
0efd007607 | ||
|
|
13b197ff5b | ||
|
|
0e22fc0293 | ||
|
|
2f9eb0703b | ||
|
|
08e7220dfe | ||
|
|
ac38d149e0 | ||
|
|
754230a6b7 | ||
|
|
a0ebed9cb2 | ||
|
|
23c40b0540 | ||
|
|
c7e2b37083 | ||
|
|
5d5eaf33e4 | ||
|
|
d5c2da25c4 | ||
|
|
08b0a885d1 | ||
|
|
a2ae76e274 | ||
|
|
58ca0c2824 | ||
|
|
34cd5125e3 | ||
|
|
ae354fc758 | ||
|
|
9b10e8d034 | ||
|
|
3b374faadc | ||
|
|
a5cc413432 | ||
|
|
1e5a1d8c91 | ||
|
|
0780ab82fe | ||
|
|
ec5f3a294e | ||
|
|
0d1935e3d8 | ||
|
|
14939535b6 | ||
|
|
23c0cda243 | ||
|
|
e18cba4da9 | ||
|
|
b7296cff16 | ||
|
|
049a69a9bf | ||
|
|
8e872f4efd | ||
|
|
f316df83c9 | ||
|
|
18cbed4750 | ||
|
|
7df3e111bc | ||
|
|
dd1d08461c | ||
|
|
f9851d88f1 | ||
|
|
a30475fc0f | ||
|
|
f2de1c9dcf | ||
|
|
f10d928e0a | ||
|
|
808d4e7df0 | ||
|
|
c6bc1227de | ||
|
|
e474e18f23 | ||
|
|
9fe3f77559 | ||
|
|
eca1fc5e9f | ||
|
|
448b08de0b | ||
|
|
3a47d8430e | ||
|
|
ae22c4dc1d | ||
|
|
503c1e8864 | ||
|
|
d98f1fa645 | ||
|
|
dba6e4d2d0 | ||
|
|
d5f177fe66 | ||
|
|
8073c07601 | ||
|
|
96902f5b9d | ||
|
|
95e71d500a | ||
|
|
8eb0c79c54 | ||
|
|
087fc7c82c | ||
|
|
bf4c63d657 | ||
|
|
b33d6351e5 | ||
|
|
87368574a3 | ||
|
|
285dea0340 | ||
|
|
3c5a587313 | ||
|
|
534bb721a9 | ||
|
|
2472bd3c89 | ||
|
|
3f9b7858df | ||
|
|
e5a7a883eb | ||
|
|
c952eb84ae | ||
|
|
9c59becb31 | ||
|
|
d39bb888a0 | ||
|
|
03748f0fbe | ||
|
|
9e47eba187 | ||
|
|
adaa3e0aeb | ||
|
|
c4c42d9ff6 | ||
|
|
c2cbce6d84 | ||
|
|
bb75616aad | ||
|
|
4b69ea222e | ||
|
|
34c926186c | ||
|
|
8800cd0b67 | ||
|
|
3a8499143f | ||
|
|
ef42fce3e6 | ||
|
|
c914639b8c | ||
|
|
4313762bdb | ||
|
|
5e32d1cb4f | ||
|
|
d6fb042749 | ||
|
|
8b062b07c1 | ||
|
|
9eb9198bad | ||
|
|
1d56ad7615 | ||
|
|
06b390ca01 | ||
|
|
8cd13fe96e | ||
|
|
7698ba2f1c | ||
|
|
33b8c225e1 | ||
|
|
38807b65c7 | ||
|
|
eaba3dc788 | ||
|
|
24682a9471 | ||
|
|
1176559ef7 | ||
|
|
a1e552d988 | ||
|
|
7347ef3a2f | ||
|
|
aa27686912 | ||
|
|
90f1b587c4 | ||
|
|
d425538578 | ||
|
|
a5203640f6 | ||
|
|
8c09918339 | ||
|
|
94f4483dbd | ||
|
|
4e65111750 | ||
|
|
9c2026eb44 | ||
|
|
e4ac18c04d | ||
|
|
0ccb32dab9 | ||
|
|
8163b93a99 | ||
|
|
597b04f5f7 | ||
|
|
6dd37d5972 | ||
|
|
652caa1f93 | ||
|
|
0faaf3fa68 | ||
|
|
eb87c40967 | ||
|
|
914648cc2b | ||
|
|
471862a8b1 | ||
|
|
d4ebd574d2 | ||
|
|
b47c417b72 | ||
|
|
f7016a0be6 | ||
|
|
5385a02b33 | ||
|
|
08903ea9ea | ||
|
|
d6566ff6bd | ||
|
|
cce4ef3664 | ||
|
|
1c03cc4422 | ||
|
|
80fb09a74e | ||
|
|
3ac51d8e32 | ||
|
|
d66f23813b | ||
|
|
f51a301fb9 | ||
|
|
1401269ae4 | ||
|
|
28636cc873 | ||
|
|
c11f146ec0 | ||
|
|
d7937630b2 | ||
|
|
1c64c62b3b | ||
|
|
28f185d801 | ||
|
|
e82c30b205 | ||
|
|
e2dba622bf | ||
|
|
d527e845c5 | ||
|
|
b76072162d | ||
|
|
2064d9359c | ||
|
|
dbdb44a4db | ||
|
|
4545d536bd | ||
|
|
c8e0f4164d | ||
|
|
66972237a3 | ||
|
|
b703b7428d | ||
|
|
d220b22b81 | ||
|
|
845ceca24c | ||
|
|
d1ee3cadb3 | ||
|
|
9b34f23b50 | ||
|
|
0092ff64f0 | ||
|
|
c7bc663b55 | ||
|
|
6f28a38d4d | ||
|
|
a0d037e6fc | ||
|
|
fb0710d31a | ||
|
|
b28e491fd4 | ||
|
|
d5fbe62ddd | ||
|
|
54e241d2fc | ||
|
|
412b2a052e | ||
|
|
2525c5d1fa | ||
|
|
0a615406df | ||
|
|
a06f09c849 | ||
|
|
48bbd508e1 | ||
|
|
0764c169a4 | ||
|
|
fc1c86a87e | ||
|
|
5b9b715cc4 | ||
|
|
e7df5ed456 | ||
|
|
3aa1d977b7 | ||
|
|
057da64de7 | ||
|
|
81c2bf97c2 | ||
|
|
5c88136401 | ||
|
|
e230ca4245 | ||
|
|
5f4618e8e7 | ||
|
|
72ac523394 | ||
|
|
dfe360e5c0 | ||
|
|
c917f68883 | ||
|
|
0e263f7394 | ||
|
|
d565c36ef9 | ||
|
|
9908327a4f | ||
|
|
4dabd2ec8c | ||
|
|
ac64e68fcb | ||
|
|
a66bff850c | ||
|
|
b1554bcd80 | ||
|
|
85afb7a1b6 | ||
|
|
7c930d1e2a | ||
|
|
623106e922 | ||
|
|
8747093e64 | ||
|
|
ac4053478a | ||
|
|
3c04618278 | ||
|
|
052ab01c84 | ||
|
|
54c54401d4 | ||
|
|
b59afcffc7 | ||
|
|
c38079190a | ||
|
|
32f123d43d | ||
|
|
f2f71a1f09 | ||
|
|
d214a2ca98 | ||
|
|
65f617ad0c | ||
|
|
6f119bd0ab | ||
|
|
4384ccd5b0 | ||
|
|
dc0d9cff70 | ||
|
|
124822d720 | ||
|
|
b81ce0caa5 | ||
|
|
c15be3e163 | ||
|
|
5764aa41cd | ||
|
|
4468346353 | ||
|
|
14ab80511e | ||
|
|
6dbd586586 | ||
|
|
d7384c2e07 | ||
|
|
e0423a1276 | ||
|
|
5748c8502b | ||
|
|
824edac371 | ||
|
|
55f0f37a66 | ||
|
|
f6bd8f0b7a | ||
|
|
c865218351 | ||
|
|
6d90da02ef | ||
|
|
62240a0f26 | ||
|
|
caf8ffee27 | ||
|
|
bb50f8368b | ||
|
|
ced24f3182 | ||
|
|
7cc53d5134 | ||
|
|
fcc083e51b | ||
|
|
f1fff3180f | ||
|
|
b24129831d | ||
|
|
ec54fa3f38 | ||
|
|
d1ad96755c | ||
|
|
c3fca9a0a5 | ||
|
|
3385847632 | ||
|
|
83062312fd | ||
|
|
b9c1aba415 | ||
|
|
a10885b99d | ||
|
|
667e7de647 | ||
|
|
3c503eac88 | ||
|
|
2958e72f1a | ||
|
|
c5de384f71 | ||
|
|
ba5279276f | ||
|
|
76ad1726a0 | ||
|
|
7648e92c36 | ||
|
|
c2dee60f75 | ||
|
|
937f7f5b33 | ||
|
|
9099fe535e | ||
|
|
b208eb01b9 | ||
|
|
fb6e3c1386 | ||
|
|
838a627e0b | ||
|
|
cf4f0910b7 | ||
|
|
38bb25a732 | ||
|
|
7f36af4fdf | ||
|
|
81d1ec430f | ||
|
|
bb1a700aa9 | ||
|
|
7d7be49dae | ||
|
|
029695bcda | ||
|
|
7c9574b1ea | ||
|
|
2bff75f4f7 | ||
|
|
52e674c064 | ||
|
|
1c56fc397f | ||
|
|
c5353da48c | ||
|
|
f9a04a642f | ||
|
|
54927f007a | ||
|
|
3d5f435be7 | ||
|
|
a498d53fda | ||
|
|
fbd9035f3e | ||
|
|
c8cbc630c4 | ||
|
|
bdd18ccdf0 | ||
|
|
57b315f50c | ||
|
|
ed7a292482 | ||
|
|
5e4625dafe | ||
|
|
a43f369ec3 | ||
|
|
3b98adc9ae | ||
|
|
17c4c23f22 | ||
|
|
a3dd7dc748 | ||
|
|
f039a59a1b | ||
|
|
0ba7ae448f | ||
|
|
6e97e4cae5 | ||
|
|
df7998e9e1 | ||
|
|
01b5fe34cc | ||
|
|
adb74c688c | ||
|
|
ec9847d1a3 | ||
|
|
9ca84c07bb | ||
|
|
daaccf6fc9 | ||
|
|
66eeb83d05 | ||
|
|
2bce79404d | ||
|
|
17e920ac4d | ||
|
|
b3112e2b3c | ||
|
|
c28f3b2c5b | ||
|
|
3301950805 | ||
|
|
a5d0648ad5 | ||
|
|
4ba9b80c98 | ||
|
|
8fb8355a32 | ||
|
|
4df40ab8e0 | ||
|
|
5a7a706fc4 | ||
|
|
16a5105912 | ||
|
|
374143227a | ||
|
|
b4d4d52d49 | ||
|
|
35735b2f36 | ||
|
|
d9347ea4cf | ||
|
|
351b417f3b | ||
|
|
d40250728d | ||
|
|
d6f1c81924 | ||
|
|
37ba5a836f | ||
|
|
d95a0af324 | ||
|
|
aff8982859 | ||
|
|
07e83b45d0 | ||
|
|
b06fb162df | ||
|
|
237fa3ce01 | ||
|
|
64fcfedd48 | ||
|
|
bedc22384f | ||
|
|
59e1504fe7 | ||
|
|
905010ce1e | ||
|
|
86f9c4dd32 | ||
|
|
7a1de9dad9 | ||
|
|
7f6c4d1a73 | ||
|
|
0380d048b1 | ||
|
|
55d51e546d | ||
|
|
da36a4ee96 | ||
|
|
23aac1a87a | ||
|
|
3896e61326 | ||
|
|
3b68d85428 | ||
|
|
ff8138f584 | ||
|
|
12ff477910 | ||
|
|
87c48374b7 | ||
|
|
0607245378 | ||
|
|
55c9657253 | ||
|
|
6d74b96ce2 | ||
|
|
a5e14b4b30 | ||
|
|
dd2d71fc9b | ||
|
|
70a363de7b | ||
|
|
39513b9f35 | ||
|
|
a98624ab84 | ||
|
|
bb0228dae5 | ||
|
|
cec66c4e14 | ||
|
|
2f178db0b9 | ||
|
|
6fc9e2a2e5 | ||
|
|
0b851ffc3e | ||
|
|
f8918e85f7 | ||
|
|
37e669d1d8 | ||
|
|
b67fc5cad4 | ||
|
|
113955d0a8 | ||
|
|
590af69c0b | ||
|
|
714e2ef487 | ||
|
|
ef00e3316b | ||
|
|
1962d931d5 | ||
|
|
b7b8827769 | ||
|
|
94a873707c | ||
|
|
c2434e8925 | ||
|
|
cfef89e920 | ||
|
|
d36d6f9320 | ||
|
|
50e27d6315 | ||
|
|
daeb6d67e2 | ||
|
|
b13dba1183 | ||
|
|
99e67c8ed0 | ||
|
|
8f68cfd8cd | ||
|
|
d6f2dd663e | ||
|
|
e8ffdaf8e9 | ||
|
|
e50b7e9ca9 | ||
|
|
5a156f9131 | ||
|
|
aac9a006d0 | ||
|
|
76827c72d1 | ||
|
|
a205d1f5c2 | ||
|
|
d3609d3449 | ||
|
|
fe2e0156e0 | ||
|
|
98df61be32 | ||
|
|
d3f29988d0 | ||
|
|
2c1f4634e3 | ||
|
|
a0ebbef813 | ||
|
|
3d4b4e7a44 | ||
|
|
7f01849758 | ||
|
|
446c02aa5c | ||
|
|
5bdb028648 | ||
|
|
1bb45d3466 | ||
|
|
0614a8333b | ||
|
|
a8b7216c31 | ||
|
|
553c61ee3b | ||
|
|
0bebc5a792 | ||
|
|
a997825148 | ||
|
|
dfbc246a3f | ||
|
|
2a19d45517 | ||
|
|
cef3b29d94 | ||
|
|
da4fc6b3a8 | ||
|
|
5637e33524 | ||
|
|
070680f72e | ||
|
|
5391ce4c5d | ||
|
|
33fa831bb0 | ||
|
|
95d036c52e | ||
|
|
f8d963e036 | ||
|
|
c1e7875744 | ||
|
|
bc0b869ba9 | ||
|
|
df04a0a157 | ||
|
|
cf6fbf7e13 | ||
|
|
2b1dfb439d | ||
|
|
2effbfafde | ||
|
|
674eb20ec4 | ||
|
|
a28c4144ac | ||
|
|
b54a5f65e4 | ||
|
|
eb8adc46f5 | ||
|
|
9eb4f894d0 | ||
|
|
8bdc78fcd1 | ||
|
|
afcbe06363 | ||
|
|
b147e8f85c | ||
|
|
57f0f4b245 | ||
|
|
416f28248c | ||
|
|
5324ab3304 | ||
|
|
52917e53de | ||
|
|
6c22352007 | ||
|
|
4b609a4ddc | ||
|
|
c98f229d9c | ||
|
|
e96d9a99ee | ||
|
|
4cc21af228 | ||
|
|
fad6a286d8 | ||
|
|
ad6c5e0bd8 | ||
|
|
da91828129 | ||
|
|
3bf0fa92c9 | ||
|
|
072e3002e0 | ||
|
|
7e07b7b5b9 | ||
|
|
4a473b8ad7 | ||
|
|
9df0e16707 | ||
|
|
370c15ad2b | ||
|
|
a5500d5cf5 | ||
|
|
156501bcb8 | ||
|
|
4cd8da33a7 | ||
|
|
e1001cb0db | ||
|
|
5f8c82969b | ||
|
|
bd190c5739 | ||
|
|
ceb20ee1fd | ||
|
|
9acdde0042 | ||
|
|
e7532d1892 | ||
|
|
69340d517a | ||
|
|
dfac16f988 | ||
|
|
e75050c3f4 | ||
|
|
09f8126a38 | ||
|
|
f214ef92d2 | ||
|
|
1ba54a5199 | ||
|
|
9a3d1fef45 | ||
|
|
42b8948743 | ||
|
|
ea55bc5e3f | ||
|
|
67a008937f | ||
|
|
dad0e04829 | ||
|
|
d8c169c0a8 | ||
|
|
cd35b67a6b | ||
|
|
4eda694989 | ||
|
|
5298849122 | ||
|
|
6d7e5a338d | ||
|
|
0477777415 | ||
|
|
4b4e4cf56a | ||
|
|
d0166d199f | ||
|
|
7f9f88940d | ||
|
|
c56756dc73 | ||
|
|
ea5d3bcde3 | ||
|
|
1160cbdb9d | ||
|
|
cc81785b82 | ||
|
|
088c0ac230 | ||
|
|
60980735fe | ||
|
|
e7495baff7 | ||
|
|
931a37b124 | ||
|
|
d694d6fe1c | ||
|
|
75a7f74723 | ||
|
|
416e3a82be | ||
|
|
3aeb1eb052 | ||
|
|
00e3bec101 | ||
|
|
cb320b2fc3 | ||
|
|
a37bb3aed5 | ||
|
|
64d136789c | ||
|
|
b5e9c6f9ee | ||
|
|
0261c32636 | ||
|
|
16698efd45 | ||
|
|
abb778ab53 | ||
|
|
345d980be3 | ||
|
|
9007a6575d | ||
|
|
59eb947539 | ||
|
|
abde3e0c4e | ||
|
|
9af1c6c415 |
8
.cvsignore
Normal file
8
.cvsignore
Normal file
@@ -0,0 +1,8 @@
|
||||
Makefile Makefile.in
|
||||
aclocal.m4
|
||||
configure config.log config.cache config.guess config.status config.sub
|
||||
libtool ltconfig ltmain.sh
|
||||
autom4te.cache
|
||||
.psrc .inslog2 tca.map tca.log pchdir *.rpt
|
||||
update
|
||||
WindowMaker*.tar.gz
|
||||
87
.gitignore
vendored
Normal file
87
.gitignore
vendored
Normal file
@@ -0,0 +1,87 @@
|
||||
*Makefile
|
||||
*Makefile.in
|
||||
WINGs/get-wings-flags
|
||||
WINGs/get-wutil-flags
|
||||
WINGs/WINGs.pc
|
||||
aclocal.m4
|
||||
autom4te.cache*
|
||||
config.guess
|
||||
config.log
|
||||
config.status
|
||||
config.sub
|
||||
configure
|
||||
contrib/WindowMaker.spec
|
||||
libtool
|
||||
ltmain.sh
|
||||
src/config.h
|
||||
src/config.h.in
|
||||
src/stamp-h1
|
||||
src/wconfig.h
|
||||
wmlib/wmlib.pc
|
||||
wrlib/get-wraster-flags
|
||||
wrlib/wrlib.pc
|
||||
*.o
|
||||
*.lo
|
||||
WINGs/Examples/.libs/colorpick
|
||||
WINGs/Examples/.libs/fontl
|
||||
WINGs/Examples/.libs/puzzle
|
||||
WINGs/Examples/colorpick
|
||||
WINGs/Examples/connect
|
||||
WINGs/Examples/fontl
|
||||
WINGs/Examples/puzzle
|
||||
WINGs/Examples/server
|
||||
WINGs/Extras/.libs/test
|
||||
WINGs/Extras/libExtraWINGs.a
|
||||
WINGs/Extras/test
|
||||
WINGs/Tests/.libs/testmywidget
|
||||
WINGs/Tests/.libs/wmfile
|
||||
WINGs/Tests/.libs/wmquery
|
||||
WINGs/Tests/.libs/wtest
|
||||
WINGs/Tests/testmywidget
|
||||
WINGs/Tests/wmfile
|
||||
WINGs/Tests/wmquery
|
||||
WINGs/Tests/wtest
|
||||
WINGs/libWINGs.a
|
||||
WINGs/libWUtil.a
|
||||
WPrefs.app/.libs/WPrefs
|
||||
WPrefs.app/WPrefs
|
||||
WindowMaker/Defaults/WMRootMenu
|
||||
WindowMaker/Defaults/WMState
|
||||
WindowMaker/Defaults/WMWindowAttributes
|
||||
WindowMaker/Defaults/WindowMaker
|
||||
WindowMaker/IconSets/Default.iconset
|
||||
src/.libs/wmaker
|
||||
src/wmaker
|
||||
test/wtest
|
||||
util/.libs/wmagnify
|
||||
util/.libs/wmsetbg
|
||||
util/.libs/wmsetup
|
||||
util/convertfonts
|
||||
util/geticonset
|
||||
util/getstyle
|
||||
util/seticons
|
||||
util/setstyle
|
||||
util/wdread
|
||||
util/wdwrite
|
||||
util/wmagnify
|
||||
util/wmaker.inst
|
||||
util/wmsetbg
|
||||
util/wmsetup
|
||||
util/wxcopy
|
||||
util/wxpaste
|
||||
wmlib/libWMaker.a
|
||||
wrlib/.libs/libwraster.a
|
||||
wrlib/.libs/libwraster.la
|
||||
wrlib/.libs/libwraster.lai
|
||||
wrlib/.libs/libwraster.so
|
||||
wrlib/.libs/libwraster.so.3
|
||||
wrlib/.libs/libwraster.so.3.1.0
|
||||
wrlib/libwraster.la
|
||||
wrlib/tests/.libs/testdraw
|
||||
wrlib/tests/.libs/testgrad
|
||||
wrlib/tests/.libs/testrot
|
||||
wrlib/tests/.libs/view
|
||||
wrlib/tests/testdraw
|
||||
wrlib/tests/testgrad
|
||||
wrlib/tests/testrot
|
||||
wrlib/tests/view
|
||||
101
AUTHORS
101
AUTHORS
@@ -2,7 +2,7 @@ Information about locale translators is at src/po/README and
|
||||
Library/WindowMaker/README
|
||||
|
||||
Many thanks to the following people who have contributed
|
||||
patches, bug fixes and other stuff for WindowMaker:
|
||||
patches, bug fixes and other stuff for Window Maker:
|
||||
|
||||
ABE Shige <sabe@ibm.net>
|
||||
I18N support, diagonal and vertical gradient, cosmetic additions to
|
||||
@@ -13,9 +13,12 @@ restart, dock bug fixes
|
||||
Andrea Arcangeli <arcangeli@mbox.queen.it>
|
||||
Fix for cascade window placement
|
||||
|
||||
Peter Bentley <peter.bentley@nomura.co.uk>
|
||||
Dmitry Astapov <adept@dimail.alpline.mao.kiev.ua>
|
||||
Fix and some additions on XKB lock language status.
|
||||
|
||||
Peter Bentley <pete@sorted.org>
|
||||
fixed WM_STATE handling bug, fixed some memory leaks, made application menus
|
||||
be mapped near the windows for non-click-to-focus modes.
|
||||
be mapped near the windows for non-click-to-focus modes, timer bug
|
||||
|
||||
Ulf Betlehem <flu@iki.fi>
|
||||
Window resize with Meta-Click3, fixed OpaqueMove to send only 1 synth.
|
||||
@@ -24,11 +27,20 @@ ConfigureNotify
|
||||
Olly Betts <olly@muscat.co.uk>
|
||||
shaded window indication in window list
|
||||
|
||||
Tudor Bosman <tudorb@caltech.edu>
|
||||
autoraise bugfix
|
||||
|
||||
Rob Clark <rclark@turing.cs.hmc.edu>
|
||||
Text input field, 15bpp support
|
||||
|
||||
George Clernon <clernong@tinet.ie>
|
||||
bug fix in browser widget
|
||||
|
||||
Omar Cornut / Zoop <cornut@capway.com>
|
||||
SteelBlueSilk theme
|
||||
|
||||
Sylvain CORRE <sylvain.corre@wanadoo.fr>
|
||||
bug fix for MkLinux/PPC, bug fix for cpixmap in wmsetbg
|
||||
bug fix for MkLinux/PPC
|
||||
|
||||
Frederic Devernay <devernay@istar.fr>
|
||||
dock fix for openwindows, made asclock be friendlier with colorcell impaired
|
||||
@@ -53,36 +65,54 @@ Documentation help, autoconf cleanup
|
||||
Mark 'segfault' Guzman <root@lsd.pbx.org>
|
||||
Various bugfixes
|
||||
|
||||
Ullrich Hafner <hafner@informatik.uni-wuerzburg.de>
|
||||
Better detection of gfx libraries
|
||||
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
|
||||
|
||||
Alban Hertroys <dalroi@wit401310.student.utwente.nl>
|
||||
WINGs color panel
|
||||
|
||||
HIDEKI Fujimoto <hideki70@osk2.threewebnet.or.jp>
|
||||
FreeBSD portability, icon arrangement fixes, dock initialization bug fix,
|
||||
some I18N related fixes
|
||||
|
||||
Pascal Hofstee <daeron@wit401305.student.utwente.nl>
|
||||
WINGs bug fixes, WINGs color panel
|
||||
|
||||
Robert A. Holak <panthar@tradeservices.com>
|
||||
bug fix
|
||||
|
||||
Michael Hokenson <logan@dct.com>
|
||||
wkde2menu.pl script
|
||||
|
||||
IKARASHI Akira <ikarashi@itlb.te.noda.sut.ac.jp>
|
||||
Workspace change bug fix
|
||||
|
||||
Sudish Joseph <sj@eng.mindspring.net>
|
||||
Modifier binding fix and other bug fixes
|
||||
|
||||
Luke Kendall <luke@research.canon.com.au>
|
||||
menu format converter, various enhancements to wxcopy and wxpaste
|
||||
|
||||
Bradley M Keryan <keryan@andrew.cmu.edu>
|
||||
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
|
||||
misclellaneous bug fixes, definable cursors, --no-polling command line option.
|
||||
|
||||
Alfredo K. Kojima <kojima@inf.ufrgs.br>
|
||||
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
|
||||
|
||||
@@ -92,20 +122,20 @@ Move/resize code fixes, button press/release fix
|
||||
Ryan Land <rland@bc1.com>
|
||||
workspace "layers"
|
||||
|
||||
Largo <largo@gnu.net>
|
||||
wm.gnu.net maintainer, FAQ maintainer
|
||||
Largo <largo@current.nu>
|
||||
wm.current.nu maintainer, FAQ co-maintainer
|
||||
|
||||
Stuart Luppescu <s-luppescu@uchicago.edu>
|
||||
Documentation help
|
||||
|
||||
Marcelo E. Magallon <mmagallo@efis.ucr.ac.cr>
|
||||
CPP search path improvement, man pages
|
||||
CPP search path improvement, man pages, bug fixes
|
||||
|
||||
Tim Malone <mrgone@eskimo.com>
|
||||
bug fix
|
||||
bug fix, jpeg bug fix
|
||||
|
||||
MANOME Tomonori <manome@itlb.te.noda.sut.ac.jp>
|
||||
I18N bug fixes and japanese locale
|
||||
I18N bug fixes and japanese locale, wsetfont script
|
||||
|
||||
Brian Alexander Martin <brian@goober.wireless.ucsc.edu>
|
||||
PIPE_MENU
|
||||
@@ -116,13 +146,13 @@ Andrea Mistrali <andre@ulmo.aleph.it>
|
||||
Jeff Meininger <jeffm@boxybutgood.com>
|
||||
Fix for unassociated alpha tiff
|
||||
|
||||
Dan Pascu <dan@services.iiruc.ro>
|
||||
Craig Nellist <crn@ozemail.com.au>
|
||||
selection in textfield
|
||||
|
||||
Dan Pascu <dan@windowmaker.info>
|
||||
dock ghost (superfluous mode) fix, enhancement for scrollable menus,
|
||||
clip, numerous other stuff, project maintainer
|
||||
|
||||
Kenneth W. Persinger Jr. <Kenn_Persinger@sector7.com>
|
||||
tcl/tk dockit
|
||||
|
||||
Biagio Pippa <1993s017@educ.disi.unige.it>
|
||||
fixed miniaturization with transient window
|
||||
|
||||
@@ -134,7 +164,11 @@ Initial code for clip's collapse feature.
|
||||
|
||||
Ture Pelsson <ture@lysator.liu.se>
|
||||
various portability fixes, replaced busy wait with select() in event
|
||||
handling code, fixed problem with some misbehaved kids after a fork().
|
||||
handling code, fixed problem with some misbehaved kids after a fork(),
|
||||
some other bug fixes, support for poll() in event handling code
|
||||
|
||||
Toby Sargeant <?>
|
||||
menu format converter
|
||||
|
||||
Carsten Schaar <nhadcasc@fs-maphy.uni-hannover.de>
|
||||
SCO portability, german locale, autoconf enhancements
|
||||
@@ -145,8 +179,14 @@ REDUCE_APPICON/single-icon
|
||||
Chong Shang Shan <chongsha@sps.nus.edu.sg>
|
||||
flipping iconification animation
|
||||
|
||||
Daniel Skarda <0rfelyus@atrey.karlin.mff.cuni.cz>
|
||||
SGI "black dialogs" bug fix
|
||||
|
||||
Paul D. Smith <psmith@BayNetworks.COM>
|
||||
SunOS portability, configure fixes
|
||||
|
||||
Phillip Smith <teknix@alloy.net>
|
||||
FTP and WWW site provider/maintainer
|
||||
FTP, WWW, mailing list site provider/maintainer (Net logistics)
|
||||
|
||||
Lauri Tarkkala <ltarkkal@cs.hut.fi>
|
||||
SIGHUP unblock bug fix
|
||||
@@ -155,10 +195,19 @@ Sam Varner <varner@nmr.physics.wm.edu>
|
||||
many fixes and enhancements for move, resize and window placement code.
|
||||
|
||||
Marco van Hylckama Vlieg <fatal@global.uibk.ac.at>
|
||||
house icon for WINGs file dialogs, defaullAppIcon and Clip xpm icon
|
||||
house icon for WINGs file dialogs, defaultAppIcon and Clip xpm tchX.tiff
|
||||
Plus the following icons:
|
||||
DefaultAppIcon.tiff GNUterm.tiff clip2.tiff defaultterm.tiff draw.tiff
|
||||
linuxterm.tiff mixer.tiff notepad.tiff pdf.tiff ps.tiff real.tiff sgiterm.tiff
|
||||
sound.tiff staroffice2.tiff timer.tiff wilber.tiff write.tiff xdvi.tiff
|
||||
xv.tiff
|
||||
|
||||
David Wang <dwang@cisco.com>
|
||||
edge resistance
|
||||
edge resistance, 8bpp balloon bug fix, other 8bpp related fixes
|
||||
|
||||
Franck Wolff <frawolff@club-internet.fr>
|
||||
various fixes/enhancements to WINGs
|
||||
|
||||
|
||||
Yoav Yerushalmi <yoav@mit.edu>
|
||||
Fixed -visualid for screens that can do multiple depths. Another fix in
|
||||
@@ -167,11 +216,17 @@ libproplist. Chooses best depth in screen.
|
||||
FRBall <frb@umr.edu>
|
||||
dgradient fix
|
||||
|
||||
"]d" <mhz@gpf.or.th>
|
||||
Window list menu miniaturized/hidden hints
|
||||
|
||||
"]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,
|
||||
WINGs color panel, Appearance section icon(s)
|
||||
|
||||
|
||||
Trae Mc Combs <x@themes.org>
|
||||
BlueWaves.jpeg background image in BlueWaves theme.
|
||||
|
||||
And a special thanks to Martin Eskildsen for giving me his
|
||||
copy of NEXTSTEP :-)
|
||||
|
||||
|
||||
18
BUGFORM
18
BUGFORM
@@ -3,10 +3,12 @@
|
||||
---------------------------
|
||||
|
||||
|
||||
If you find a bug please fill this form and send it to
|
||||
developers@windowmaker.org
|
||||
You can also report a bug in the WWW bug tracker at
|
||||
http://windowmaker.org/cgi-bin/bugs
|
||||
If you find a bug please fill this form and send it to
|
||||
developers@windowmaker.info Please, USE THIS FORM!!!
|
||||
|
||||
You can also report a bug in the WWW bug tracker at
|
||||
http://windowmaker.info/cgi-bin/bugs or by sending this report
|
||||
to bugs@windowmaker.info
|
||||
|
||||
|
||||
0. Before reporting this bug I already:
|
||||
@@ -32,10 +34,8 @@ http://windowmaker.org/cgi-bin/bugs
|
||||
4. Configure time options you specified:
|
||||
[ ] --enable-kanji
|
||||
[ ] --disable-shape
|
||||
[ ] --disable-xpm
|
||||
[ ] --disable-tiff
|
||||
[ ] --disable-png
|
||||
[ ] --enable-single-icon
|
||||
[ ] --enable-modelock
|
||||
[ ] Others: .......................
|
||||
|
||||
|
||||
@@ -68,4 +68,8 @@ X Server Vendor: ...................... Color Depth: .................
|
||||
WindowMaker Version (run "wmaker -version"): .........................
|
||||
|
||||
|
||||
11. backtrace if the bug made Window Maker crash. PLEASE SEND THE
|
||||
BACKTRACE. Your bug report might be of not much use without one.
|
||||
strace/truss outputs are usually not usefull for crashes, so you can
|
||||
skip it. The README file has instructions to make one.
|
||||
|
||||
|
||||
30
BUGS
30
BUGS
@@ -1,10 +1,24 @@
|
||||
- the app menu does not update after a style/theme change without restart.
|
||||
- the animation of shade puts ImageMagick/display in a weird state
|
||||
- during startup, transient windows should be miniaturized with their owners
|
||||
not in their own icons
|
||||
- shaped windows don't resize very well
|
||||
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)
|
||||
- WINGs has problems in some platforms (SGI, Sun etc.) Anyone on these
|
||||
systems want to fix it?
|
||||
- save session doesnt work on some platforms (Alpha and Sparc)
|
||||
- GNUSTEP_WM_ATTR in WINGs has problems on Alpha boxes
|
||||
- texture pixmaps are being incorrectly freed somewhere. Either
|
||||
fix bug (to support broken MetroX servers) or remove all useless references
|
||||
to the Pixmap (to save memory and drop bug compatibility).
|
||||
- host information is not saved/honored by the dock or save session stuff.
|
||||
It should at least check if the host is the local machine and only save it
|
||||
in the session/allow docking it if yes.
|
||||
- the SHELL environment variable support in the apps menu was removed
|
||||
because of a problem with tcsh. If ~/.tcshrc contains "stty erase ^H",
|
||||
it will block and the cmd will not be executed.
|
||||
- mouse grab being done in client window (in wWindowResetMouseGrabs())
|
||||
instead of the frame window. If grab is done in frame, titlebar buttons
|
||||
dont work well
|
||||
|
||||
- mysterious mess in dock icons (specially netscape)
|
||||
|
||||
91
COPYING.OPL
Normal file
91
COPYING.OPL
Normal file
@@ -0,0 +1,91 @@
|
||||
|
||||
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.
|
||||
54
COPYING.WTFPL
Normal file
54
COPYING.WTFPL
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
The following artwork were created by Banlu Kemiyatorn and
|
||||
are distributed through the license in this file:
|
||||
GNUstepGlow.tiff
|
||||
GNUstepGlow.xpm
|
||||
Magnify.tiff
|
||||
Magnify.xpm
|
||||
Terminal.tiff
|
||||
Terminal.xpm
|
||||
TerminalGNUstep.tiff
|
||||
TerminalGNUstep.xpm
|
||||
TerminalLinux.tiff
|
||||
TerminalLinux.xpm
|
||||
tiff/msty1.tiff
|
||||
tiff/msty2.tiff
|
||||
tiff/msty3.tiff
|
||||
xpm/msty1.xpm
|
||||
xpm/msty2.xpm
|
||||
xpm/msty3.xpm
|
||||
WPrefs.tiff
|
||||
WPrefs.xpm
|
||||
tiff/tdel.tiff
|
||||
tiff/tedit.tiff
|
||||
tiff/textr.tiff
|
||||
tiff/tnew.tiff
|
||||
xpm/tdel.xpm
|
||||
xpm/tedit.xpm
|
||||
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
|
||||
|
||||
Version 1.0, March 2000
|
||||
Copyright (C) 2000 Banlu Kemiyatorn (]d).
|
||||
136 Nives 7 Jangwattana 14 Laksi Bangkok
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Ok, the purpose of this license is simple
|
||||
and you just
|
||||
|
||||
DO WHAT THE FUCK YOU WANT TO.
|
||||
42
FAQ.I18N
42
FAQ.I18N
@@ -8,6 +8,13 @@ If I18N support does not work for you, check these:
|
||||
can check if your locale is supported by X's locale emulation.
|
||||
See "/usr/X11R6/lib/X11/locale/locale.alias"
|
||||
|
||||
- Check if you're using appropriate fonts for the locale you
|
||||
chose. If you're using a font set that has a different
|
||||
encoding than the one used by Xlib or libc, bad things can
|
||||
happen. Try specifically putting the encoding in the LANG
|
||||
variable, like ru_RU.KOI8-R. Again, see
|
||||
"/usr/X11R6/lib/X11/locale/locale.alias"
|
||||
|
||||
- if your OS doesn't support any locale or if your OS doesn't
|
||||
support a locale for your language, you can use X Window System's
|
||||
locale emulation feature instead of OS's locale. To use this
|
||||
@@ -25,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, wmaker have to
|
||||
be compiled with multibyte character support. Add this option
|
||||
to the configure, "--enable-kanji".
|
||||
|
||||
- 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:
|
||||
|
||||
"-*-*-medium-r-normal-*-14-*-*-*-*-*-*-*"
|
||||
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:
|
||||
|
||||
and also you need to change font settings in style files in
|
||||
"sans:pixelsize=12"
|
||||
|
||||
However, please note that if your font is something like:
|
||||
|
||||
"Trebuchet MS,Luxi Sans,sans: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
|
||||
|
||||
64
FAQ.I18N.cs
Normal file
64
FAQ.I18N.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
Často kladené otázky na podporu místního nastavení
|
||||
==================================================
|
||||
|
||||
Pokud vám nefunguje podpora I18N, tak zkontrolujte tato nastavení:
|
||||
|
||||
- systémová proměnná LANG musí být nastavená tak, aby odpovídala vašemu
|
||||
místnímu nastavení (čeština = czech), vaše místní nastavení musí být
|
||||
podporovatelné vaším operačním systémem nebo X emulací. Všechny
|
||||
podporovatelné lokalizace zobrazíte příkazem "locale -a". Měli byste
|
||||
také zkontrolovat, zda-li je vaše místní nastavení podporované
|
||||
X emulací. Soubor: "/usr/X11R6/lib/X11/locale/locale.alias" by měl
|
||||
obsahovat podobnou sekvenci (podpora pro češtinu):
|
||||
|
||||
cs cs_CZ.ISO8859-2
|
||||
cs_CS cs_CZ.ISO8859-2
|
||||
cs_CS.ISO8859-2 cs_CZ.ISO8859-2
|
||||
cs_CZ cs_CZ.ISO8859-2
|
||||
cs_CZ.iso88592 cs_CZ.ISO8859-2
|
||||
cz cz_CZ.ISO8859-2
|
||||
cz_CZ cz_CZ.ISO8859-2
|
||||
|
||||
- zkontrolujte použití správných fontů pro vaše místní nastavení.
|
||||
Pokud nepoužíváte správné fonty s kódováním, které je nastaveno v
|
||||
Xlib nebo libc, tak se můžou dít "dost divné věci". Zkuste explicitně
|
||||
zadat kování do proměnné LANG: LANG=cs_CS.ISO8859-2 nebo
|
||||
LANG=cs_CZ.iso88592 a znovu zkontrolujte:
|
||||
"/usr/X11R6/lib/X11/locale/locale.alias"
|
||||
|
||||
- pokud váš operační systém nepodporuje místní nastavení (locales), nebo
|
||||
pokud váš OS nepodporuje místní nastavení pro váš jazyk, můžete
|
||||
použít emulaci místního nastavení X Window Systému. Zprovoznit tuto
|
||||
emulaci je možné spuštěním ./configure s volbou "--witn-x-locale".
|
||||
Pokud používáte nějaký komerční systém jako je například IRIX, AIX,
|
||||
Solaris, ...,tak asi X emulaci nebudete potřebovat. Ovšem pokud je
|
||||
vaším operačním systémem Linux, NetBSD nebo jiný užasný, volně
|
||||
šiřitelný operační systém, tak je možné, že vaše místní nastavení
|
||||
zatím není podporované. Potom použijte volbu "--witn-x-locale".
|
||||
|
||||
Pozn: Aby jste mohli používat X emulaci místních nastavení, tak vaše
|
||||
Xlib musí být zkompilované s touto podporou. Xlib v RedHat 5.0
|
||||
tak zkompilované nejsou (RH4.x jsou OK). Překompilované Xlib
|
||||
s podporou pro emulací místních nastavení pro RH5.0 jsou
|
||||
dostupné na adrese:
|
||||
|
||||
ftp://ftp.linux.or.jp/pub/RPM/glibc
|
||||
|
||||
- fonty, které používáte by měli být podporované vaším místním nastavením.
|
||||
Jestliže vaše nastavení fontů v souboru ~/GNUstep/Defaults/WindowMaker
|
||||
vypadá takto:
|
||||
|
||||
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
|
||||
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*"; ,
|
||||
|
||||
nemůžete zobrazovat znaky jiné než iso8859-x ve fontu helvetica.
|
||||
Jednoduchý způsob, jak zobrazovat znaky různých jazyků, je nastavit všechny
|
||||
fonty takto:
|
||||
|
||||
"-*-*-medium-r-normal-*-14-*-*-*-*-*-*-*"
|
||||
|
||||
Také je nutné změnit nastavení fontů v souborech stylů v adresáři:
|
||||
~/Library/WindowMaker/Style.
|
||||
|
||||
- pokud si nejste jisti, zda-li má systémová proměnná LC_TYPE správnou
|
||||
hodnotu, tak ji nenastavujte.
|
||||
57
FAQ.I18N.sk
Normal file
57
FAQ.I18N.sk
Normal file
@@ -0,0 +1,57 @@
|
||||
(Toto je len preklad dosť starého súboru! Ak by ste mali skutočne problémy
|
||||
s Window Makerom a slovenčinou a v tomto súbore by ste nenašli pomoc,
|
||||
pošlite popis problému na adresu <judas@linux.sk>.)
|
||||
|
||||
Ak vám nefunguje podpora miestnych nastavení, skontrolujte nasledujúce:
|
||||
|
||||
- premenná LANG je nastavená na vaše miestne nastavenia a tieto
|
||||
sú podporované vašim OS alebo X emuláciou. Zoznam podporovaných
|
||||
miestnych nastavení získate príkazom "locale -a". Zoznam
|
||||
miestnych nastvení podporovaných X emuláciou sa nachádza v
|
||||
súbore "/usr/X11R6/lib/X11/locale/locale.alias".
|
||||
|
||||
- používate správne fonty pre svoje miestne nastavenia. Ak
|
||||
používate font s odlišným kódovaním ako je nastavené v Xlib
|
||||
alebo libc, môžu sa diať čudné veci. Skúste explicitne zadať
|
||||
kókovanie do premennej LANG, teda sk_SK.ISO-8859-2. Znovu,
|
||||
pozrite si súbor "/usr/X11R6/lib/X11/locale/locale.aliax".
|
||||
|
||||
- ak váš OS nepodporuje žiadne miestne nastavenia alebo váš OS
|
||||
nepodporuje vaše miestne nastavenia, môžete použiť emuláciu
|
||||
podpory miestnych nastavení X Window Systému. To urobíte
|
||||
voľbou "--with-x-locale" skriptu configure. Ak používate
|
||||
komerčný OS ako Solaris, IRIX, AIX, ..., pravdepodobne
|
||||
nepotrebujete použiť X emuláciu miestnych nastavení. Ale ak
|
||||
je váš OS Linux alebo NetBSD alebo ..., je možné, že vaše
|
||||
miestne nastavenia ešte nie sú podporované. Vtedy použite
|
||||
"--with-x-locale".
|
||||
|
||||
Pozor: aby ste mohli používať X emuláciu miestnych nastvení,
|
||||
vaša Xlib musí byť skompilovaná s touto podporou.
|
||||
Xlib v Linux RedHat5.0 tak skompilovaná nie je.
|
||||
(RH4.x je v poriadku). Prekompilovaná Xlib pre
|
||||
RH5.0 s podporou emulácie miestnych nastavení je
|
||||
dostupná na adrese
|
||||
|
||||
ftp://ftp.linux.or.jp/pub/RPM/glibc
|
||||
|
||||
- fonty, ktoré používate, podporujú vaše miesne nastavenia.
|
||||
Ak vaše nastavenia fontov v ~/GNUstep/Defaults/WindowMaker
|
||||
vyzerajú takto:
|
||||
|
||||
WindowTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
|
||||
MenuTitleFont = "-*-helvetica-bold-r-normal-*-12-*-*-*-*-*-*-*";
|
||||
......................................................
|
||||
|
||||
potom nemôžete zobrazovať znaky iné ako iso8859-x vo fonte
|
||||
helvetica. Jednoduchý spôsob ako zobrazovať znaky rôznych
|
||||
jazykov je nastaviť všetky fonty takto:
|
||||
|
||||
"-*-*-medium-r-normal-*-14-*-*-*-*-*-*-*"
|
||||
|
||||
a tiež potrebujete zmeniť nastavenia fontov v súboroch štýlov
|
||||
v adresári ~/Library/WindowMaker/Style.
|
||||
|
||||
- premenná LC_CTYPE nie je nastavená alebo má správnu hodnotu. Ak
|
||||
si nie ste istí, nenastavujte ju.
|
||||
|
||||
455
INSTALL
455
INSTALL
@@ -1,5 +1,5 @@
|
||||
|
||||
Installation Instructions for WindowMaker
|
||||
Installation Instructions for Window Maker
|
||||
|
||||
|
||||
|
||||
@@ -7,55 +7,87 @@ SUPPORTED PLATFORMS
|
||||
===================
|
||||
(ie: I've heard someone has compiled it on...)
|
||||
|
||||
- Intel/Linux RedHat 4.2 (primary platform)
|
||||
- Intel/Linux other distributions
|
||||
- Sparc/Linux RedHat 5.1
|
||||
- PowerPC/MkLinux
|
||||
- Alpha/Linux RedHat 5.1
|
||||
- Intel GNU/Linux Conectiva 5.9 (beta)
|
||||
- Intel GNU/Linux Slackware
|
||||
- Intel GNU/Linux Debian
|
||||
- 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
|
||||
- Solaris 2.8 on Ultra Sparc 10 and E450
|
||||
- SCO Unix
|
||||
- SGI Irix
|
||||
- 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)
|
||||
- IBM S/390 running Linux
|
||||
- IBM S/390 running Conectiva Linux (experimental)
|
||||
- iBook running Darwin
|
||||
- Darwin PPC / Macos X
|
||||
- Windows NT with Cygwin/XFree86
|
||||
- Sony PlayStation2 running Linux
|
||||
|
||||
Patches to make it work on other platforms are welcome.
|
||||
All registered trademarks are registered by their owners. (duh)
|
||||
|
||||
Patches to make it work on other platforms are welcome.
|
||||
|
||||
|
||||
REQUIREMENTS:
|
||||
=============
|
||||
|
||||
The following software is required to use WindowMaker
|
||||
The following software is required to use Window Maker:
|
||||
|
||||
- X11R6.x
|
||||
WindowMaker can be compiled in older versions of X, like X11R5
|
||||
Window Maker can be compiled in older versions of X, like X11R5
|
||||
(Solaris) or X11R4 (OpenWindows) but it will not work 100% correctly.
|
||||
In such servers there will not be application icons and you'll have
|
||||
trouble using the dock.
|
||||
trouble using the dock. Upgrading the client libraries (Xlib, Xt etc)
|
||||
will help if you can't upgrade the server.
|
||||
|
||||
The following is required to build Window Maker:
|
||||
|
||||
If you will build WindowMaker, make sure you have gcc 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 WindowMaker.
|
||||
- Basic obvious stuff
|
||||
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
|
||||
autoconf 2.54
|
||||
automake 1.4
|
||||
libtool 1.4.2
|
||||
|
||||
- Xft2
|
||||
and its dependencies (such as freetype2 and fontconfig)
|
||||
You will also need the development files for it (xft2-devel)
|
||||
|
||||
|
||||
OPTIONAL:
|
||||
=========
|
||||
|
||||
These libraries are not required to make WindowMaker work, but they
|
||||
These libraries are not required to make Window Maker work, but they
|
||||
are supported in case you want to use them. Version numbers are those
|
||||
that I have (and therefore, guraranteed to work), but other versions
|
||||
might work too. Tell me if you made wmaker work with some library
|
||||
with a version older than the stated here.
|
||||
might work too.
|
||||
|
||||
|
||||
- libXPM 4.7
|
||||
- libXPM 4.7 or newer
|
||||
Older versions may not work!!!
|
||||
Available at ftp://sunsite.unc.edu/pub/Linux/libs/X/
|
||||
|
||||
@@ -64,142 +96,205 @@ with a version older than the stated here.
|
||||
|
||||
- libpng 0.96 or newer and zlib
|
||||
For PNG image support.
|
||||
http://www.cdrom.com/pub/png/
|
||||
|
||||
- libtiff 3.4 or newer
|
||||
For TIFF image support.
|
||||
You can get it at ftp://ftp.sgi.com/graphics/tiff
|
||||
|
||||
- libjpeg 6.0.1
|
||||
- libjpeg 6.0.1 or newer
|
||||
For JPEG image support
|
||||
http://www.ijg.org/
|
||||
|
||||
- libgif 2.2 or libungif
|
||||
For GIF image support
|
||||
For GIF image support
|
||||
ftp://prtr-13.ucsc.edu/pub/libungif/
|
||||
|
||||
- GNU xgettext
|
||||
If you want to use translated messages, you will need GNU gettext.
|
||||
Other versions of gettext are not compatible and will not work.
|
||||
Get the GNU version from ftp://prep.ai.mit.edu
|
||||
Get the GNU version from ftp://ftp.gnu.org
|
||||
|
||||
Most of these can be get from ftp.uu.net/pub/graphics
|
||||
|
||||
|
||||
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 WindowMaker features. Example:
|
||||
some Window Maker features. Example:
|
||||
|
||||
./configure --enable-kanji
|
||||
./configure --enable-modelock --disable-gif
|
||||
|
||||
will configure WindowMaker with kanji characters support compiled in.
|
||||
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
|
||||
|
||||
--disable-xpm disables use of the XPM library even if it is available on
|
||||
your system.
|
||||
--with-libs-from
|
||||
specify additional paths for libraries to be searched.
|
||||
The -L flag must precede each path, like:
|
||||
--with-libs-from="-L/opt/libs -L/usr/local/lib"
|
||||
|
||||
--disable-png disables use of PNG library
|
||||
--with-incs-from
|
||||
specify additional paths for header files to be searched.
|
||||
The -I flag must precede each paths, like:
|
||||
--with-incs-from="-I/opt/headers -I/usr/local/include"
|
||||
|
||||
--disable-tiff disable use of TIFF library
|
||||
--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
|
||||
necessary due to a bug that manifests as messed icons and textures.
|
||||
|
||||
--disable-gif disable use of GIF library
|
||||
--disable-motif
|
||||
disable support for mwm window manager hints
|
||||
|
||||
--disable-jpeg disable use of JPEG library
|
||||
--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.
|
||||
|
||||
--disable-shape disables shaped windows (for oclock, xeyes etc.)
|
||||
--enable-modelock
|
||||
XKB language status lock support. If you don't know what it is you
|
||||
probably don't need it.
|
||||
|
||||
--enable-debug adds extra debugging information. Do not use it
|
||||
unless you're debugging WindowMaker.
|
||||
|
||||
--enable-kanji support to display Kanji characters, Korean, Chinese
|
||||
and other languagues that require special characters.
|
||||
--disable-xpm
|
||||
disables use of the XPM library even if it is available on your
|
||||
system.
|
||||
|
||||
--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-png
|
||||
disables use of PNG library
|
||||
|
||||
--disable-tiff
|
||||
disable use of TIFF library
|
||||
|
||||
--disable-gif
|
||||
disable use of GIF library
|
||||
|
||||
--disable-jpeg
|
||||
disable use of JPEG library
|
||||
|
||||
--disable-shape
|
||||
disables shaped windows (for oclock, xeyes etc.)
|
||||
|
||||
|
||||
PLATFORM SPECIFIC NOTES:
|
||||
========================
|
||||
|
||||
- DEC/Alpha machines
|
||||
|
||||
#>>>>>>>>>>>
|
||||
From: Anton Ivanov <aivanov@eu.level3.net>
|
||||
To: Marcelo E. Magallon <mmagallo@debian.org>
|
||||
Subject: Re: Is the WindowMaker package working ok on Alpha?
|
||||
|
||||
> Hi,
|
||||
>
|
||||
> I was reading some docs on the WindowMaker tarball, and found this:
|
||||
>
|
||||
> | - DEC/Alpha machines
|
||||
> | You might need to pass the --disable-shm flag to configure,
|
||||
> | like ./configure --disable-shm
|
||||
>
|
||||
> is anyone having problems with WindowMaker on Alpha? Can someone
|
||||
> please test this? Should the flag be passed when building on Alpha?
|
||||
|
||||
Disclaimer: alphas under my command have never run X and are least likely to
|
||||
suddenly start running it anytime soon.
|
||||
|
||||
Alpha used to have some ridiculously low amount of shared memory
|
||||
configured.
|
||||
So quite a lot of apps used to barf. Namely - cdrecord, mysql server, etc.
|
||||
|
||||
Check where is yours at the moment and raise it to a more appropriate
|
||||
value by either catting to the appropriate /proc entry or changing the
|
||||
/usr/src/linux/include/asm/shmparam.h.
|
||||
|
||||
Otherwise the shared memory on alpha should be fully functional and I
|
||||
see no reason to disable it. Mine are bumped up to 32 or more on most
|
||||
machines.
|
||||
|
||||
And If I recall correctly the comments in that file are actually
|
||||
wrong. Value is not bytes, but in machine size word. For alpha *8.
|
||||
|
||||
As I said - I do not run X on them so all #include "stdisclaimer.h"
|
||||
apply.
|
||||
#<<<<<<<<<<<<
|
||||
|
||||
|
||||
- SCO Unix - run configure like
|
||||
CFLAGS="-belf -DANSICPP" ./configure
|
||||
|
||||
- SunOS, Solaris
|
||||
If you have gcc installed, after running configure, edit
|
||||
src/config.h and change the #define CPP_PATH line to
|
||||
#define CPP_PATH "gcc -E -x c"
|
||||
Sun's cpp lacks some features needed by WindowMaker and it can
|
||||
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.
|
||||
|
||||
- RedHat Linux
|
||||
Make sure you don't have the LANG and LINGUAS environment variables
|
||||
set to en_RN. Also, make sure you have /usr/local/bin in your
|
||||
PATH environment variable, as for some mysterious reason the folks
|
||||
at RedHat did not include it in the default configuration files
|
||||
in RH 5.{0,1}.
|
||||
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.
|
||||
Uninstall any packaged version of Window Maker before installing a new
|
||||
version.
|
||||
|
||||
- RedHat GNU/Linux
|
||||
RedHat systems have several annoying problems. If you use it,
|
||||
be sure to follow the steps below or Window Maker will not work:
|
||||
|
||||
* if you installed the Window Maker that comes with RedHat, uninstall
|
||||
it before upgrading;
|
||||
|
||||
* make sure you don't have the LANG and LINGUAS environment variables
|
||||
set to en_RN;
|
||||
|
||||
* make sure you have /usr/local/bin in your PATH environment
|
||||
variable;
|
||||
|
||||
* make sure you have /usr/local/lib in /etc/ld.so.conf before running
|
||||
ldconfig;
|
||||
|
||||
- PowerPC MkLinux
|
||||
You will need to have the latest version of Xpmac. Older versions
|
||||
seem to have bugs that cause the system to hang.
|
||||
|
||||
- Debian Linux
|
||||
- Debian GNU/Linux
|
||||
If you want JPEG and TIFF support, make sure you have libtiff-dev
|
||||
and libjpeg-dev installed.
|
||||
|
||||
|
||||
- SuSE GNU/Linux
|
||||
If you installed the Window Maker package from SuSE,
|
||||
uninstall it before trying to compile wmaker or you
|
||||
might have problems.
|
||||
|
||||
- MetroX (unknown version)
|
||||
MetroX has a bug that corrupts pixmaps that are set as window
|
||||
backgrounds. If you use MetroX and has weird problems with
|
||||
textures, do not use textures in titlebars. Or use a different
|
||||
X server.
|
||||
|
||||
|
||||
INSTALLATION:
|
||||
=============
|
||||
|
||||
Unpack WindowMaker-data.tar.gz and move the pixmaps directory in it
|
||||
to /usr/local/share/pixmaps
|
||||
|
||||
You can get the file at ftp://ftp.windowmaker.org. This file is not strictly
|
||||
necessary, but contains some additional nice icons and other things.
|
||||
|
||||
|
||||
autoconf and automake
|
||||
---------------------
|
||||
|
||||
autoconf and automake are not required, but if you have them installed,
|
||||
make sure you have autoconf 2.12 and automake 1.3 or newer. If you have
|
||||
an older version, disable them by temporarily renaming them to something
|
||||
else or uninstalling them from your system.
|
||||
|
||||
|
||||
Build libPropList
|
||||
-----------------
|
||||
|
||||
Note: You only need to build libPropList if you don't have it installed
|
||||
in your system.
|
||||
|
||||
libPropList is included with the distribution, so you don't
|
||||
need to download it anywhere (some people have asked me this...)
|
||||
But if you already have libPropList installed on you system you
|
||||
can skip this step, since configure will detect that and use the
|
||||
installed version first if available.
|
||||
|
||||
To build libPropList, simply type the following at the shell prompt:
|
||||
|
||||
gunzip -c libPropList.tar.gz | tar xf -
|
||||
cd libPropList
|
||||
./configure
|
||||
make
|
||||
|
||||
then, login as root and type:
|
||||
|
||||
make install
|
||||
|
||||
|
||||
Build WindowMaker
|
||||
-----------------
|
||||
If this is the first time you're building WindowMaker, you can
|
||||
simply type:
|
||||
Build Window Maker
|
||||
------------------
|
||||
For a quick start, type the following in your shell prompt:
|
||||
|
||||
./configure
|
||||
make
|
||||
@@ -207,13 +302,15 @@ simply type:
|
||||
then, login as root and type:
|
||||
|
||||
make install
|
||||
ldconfig
|
||||
|
||||
or if you want to strip the binaries from debugging symbols and make them
|
||||
or if you want to strip the debugging symbols from the binaries and make them
|
||||
smaller, you can instead type:
|
||||
|
||||
make install-strip
|
||||
ldconfig
|
||||
|
||||
This will build and install WindowMaker with default parameters.
|
||||
This will build and install Window Maker with default parameters.
|
||||
|
||||
If you want to customize some compile-time options, you can do the
|
||||
following.
|
||||
@@ -225,86 +322,94 @@ following.
|
||||
|
||||
to get a complete listing of other options that are available.
|
||||
|
||||
Note that the WPrefs.app installation path is configured
|
||||
in a different way. Look at WPrefs/README for information.
|
||||
|
||||
2. Run configure with the options you want. For example, if you
|
||||
want to use the --enable-kanji option, type:
|
||||
want to use the --enable-modelock option, type:
|
||||
|
||||
./configure --enable-kanji
|
||||
./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.
|
||||
|
||||
4. Compile WindowMaker. Just type:
|
||||
4. Compile. Just type:
|
||||
|
||||
make
|
||||
|
||||
5. Login as root (if you can't do that, read the "I don't have the
|
||||
root password :-(" section) and install WindowMaker in your system.
|
||||
Again, type:
|
||||
root password :-(" section) and install Window Maker in your system:
|
||||
su root
|
||||
make install
|
||||
|
||||
|
||||
User specific configuration
|
||||
---------------------------
|
||||
|
||||
These instructions do not need to be followed when upgrading WindowMaker
|
||||
These instructions do not need to be followed when upgrading Window Maker
|
||||
from an older version, unless stated differently in the NEWS file.
|
||||
|
||||
Every user on your system that wishes to run WindowMaker must do the
|
||||
Every user on your system that wishes to run Window Maker must do the
|
||||
following:
|
||||
|
||||
1. Install WindowMaker configuration files in your home directory.
|
||||
1. Install Window Maker configuration files in your home directory.
|
||||
Type:
|
||||
wmaker.inst
|
||||
|
||||
wmaker.inst will install WindowMaker configuration files and will
|
||||
setup X to automatically launch WindowMaker at startup.
|
||||
wmaker.inst will install Window Maker configuration files and will
|
||||
setup X to automatically launch Window Maker at startup.
|
||||
|
||||
That's it! The configuration file where you can edit your preferences
|
||||
is $HOME/GNUstep/Defaults/WindowMaker.
|
||||
The $HOME/GNUstep/Defaults/WMWindowAttributes file is where you assign
|
||||
icons to applications and edit some other attributes for windows. This can
|
||||
be also edited from the "Attributes Panel". To access it, click the titlebar
|
||||
of the window with the Right mouse button and select "Attributes...".
|
||||
That's it!
|
||||
|
||||
You can type "man wmaker" to get some general help for configuration
|
||||
and other stuff.
|
||||
|
||||
The $HOME/GNUstep/Library/WindowMaker/menu file is the definition of
|
||||
the root menu. Edit it according to the applications you have installed.
|
||||
|
||||
Read the User Guide for a more in depth explanation of WindowMaker.
|
||||
The User Guide is avaiable at http://windowmaker.org
|
||||
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 ftp://ftp.windowmaker.info. 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 WindowMaker . Example:
|
||||
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
|
||||
WPrefs.app Example:
|
||||
|
||||
./configure --prefix=/home/jshmoe
|
||||
./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Applications
|
||||
|
||||
If you use national language support, you must also supply the --with-nlsdir
|
||||
option, as:
|
||||
|
||||
./configure --prefix=/home/jshmoe --with-nlsdir=/home/jshmoe/lib/locale
|
||||
|
||||
Then make /home/jshmoe/bin be included in your search path and run
|
||||
Then make /home/jshmoe/bin be included in your search PATH, add
|
||||
/home/jshmoe/lib to your LD_LIBRARY_PATH environment variable and run
|
||||
bin/wmaker.inst
|
||||
|
||||
Of course, /home/jshmoe is supposed to be replaced with your actual home
|
||||
directory path.
|
||||
|
||||
|
||||
|
||||
UPGRADING
|
||||
=========
|
||||
|
||||
If you are upgrading from an older version of WindowMaker:
|
||||
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.
|
||||
|
||||
1. Configure and build WindowMaker as always
|
||||
2. Install WindowMaker (but do not run wmaker.inst)
|
||||
3. Read the NEWS file and update your configuration files,
|
||||
if necessary.
|
||||
|
||||
TROUBLESHOOTING
|
||||
===============
|
||||
@@ -314,36 +419,34 @@ like not being able to use a graphic format library you think you have
|
||||
installed, look at the config.log file for clues of the problem.
|
||||
|
||||
|
||||
== When I try to start X after installing wmaker, I get this:
|
||||
exec: wmaker: not found
|
||||
== Error with loading fonts, even if they exist.
|
||||
|
||||
You probably are using a brain-damaged distribution. Add /usr/local/bin
|
||||
into your path environment variable (editing .cshrc or .profile)
|
||||
Try rebuilding without NLS support.
|
||||
|
||||
== Error during build of libPropList
|
||||
== Error when configuring
|
||||
|
||||
make: *** No rule to make target `libPropList.a.c', needed by
|
||||
`libPropList.a.o'. Stop.
|
||||
ltconfig: unrecognized option `--no-reexec'
|
||||
Try `ltconfig --help' for more information.
|
||||
configure: error: libtool configure failed
|
||||
|
||||
Make sure the autoconf and automake versions you have installed are at
|
||||
least:
|
||||
autoconf 2.12
|
||||
automake 1.3
|
||||
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
|
||||
libtool 1.3
|
||||
|
||||
If you are using the RPM's that come with RedHat 4.x, don't use them.
|
||||
It is broken. Uninstall the RPM and reinstall a fresh package from
|
||||
|
||||
You can get them from ftp://prep.ai.mit.edu or any mirror.
|
||||
Note that it must not be libtool 1.2b, it must be libtool 1.3,
|
||||
from the GNU sites.
|
||||
|
||||
== configure doesn't detect libtiff, or other graphic libraries.
|
||||
|
||||
Delete config.cache, then rerun configure adding the following options to
|
||||
configure (among the other options you use):
|
||||
--with-gfx-libs="-L/usr/local/lib"
|
||||
--with-gfx-incs="-I/usr/local/include -I/usr/local/include/tiff"
|
||||
--with-libs-from="-L/usr/local/lib"
|
||||
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
|
||||
Put the paths where your graphic libs and their corresponding header files are
|
||||
located. You can put multiple paths in any of these options, as the example
|
||||
of --with-gfx-incs shows. Just put a space between them.
|
||||
of --with-incs-from shows. Just put a space between them.
|
||||
|
||||
|
||||
== configure doesn't detect libXpm.
|
||||
@@ -367,17 +470,21 @@ 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...")
|
||||
|
||||
* WindowMaker is not finding cpp (the C preprocessor). If your cpp is
|
||||
* 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
|
||||
CPP_PATH.
|
||||
|
||||
== checking lex output file root... configure: error: cannot find output from true; giving up
|
||||
|
||||
* Read the REQUIREMENTS section of this file.
|
||||
|
||||
|
||||
LOCALES/INTERNATIONALIZATION
|
||||
============================
|
||||
|
||||
WindowMaker has national language support.
|
||||
To enable national language support, you must compile
|
||||
WindowMaker with some additional parameters.
|
||||
Window Maker has national language support. To enable national language
|
||||
support, you must compile Window Maker with some additional parameters.
|
||||
|
||||
|
||||
0 - You must have the GNU gettext package installed. It can be
|
||||
obtained at ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
|
||||
@@ -403,9 +510,10 @@ Read po/README if you wish to translate and maintain locale files
|
||||
for other languages.
|
||||
|
||||
2 - Additionally, if your language uses multi-byte characters, such
|
||||
as Japanese or Korean, you must supply the --enable-kanji flag to configure.
|
||||
as Japanese or Korean, you must set the MultiByteText option to YES
|
||||
in ~/GNUstep/Defaults/WMGLOBAL
|
||||
|
||||
3 - Configure, build and install WindowMaker normally.
|
||||
3 - Configure, build and install Window Maker normally.
|
||||
|
||||
4 - To select a particular locale at runtime you must set the LANG
|
||||
environment variable to the locale you want. For example, if you want to set
|
||||
@@ -422,7 +530,7 @@ in Bourne sh and similars
|
||||
Note: If you have the LC_CTYPE environment variable set, you must
|
||||
unset it before running wmaker.
|
||||
|
||||
For menu definition files, WindowMaker searches for them in the
|
||||
For menu definition files, Window Maker searches for them in the
|
||||
following order (for brazilian portuguese, in this case):
|
||||
|
||||
menu.pt_BR
|
||||
@@ -430,26 +538,3 @@ 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. Note that at the moment you can only
|
||||
supply a single font in WMGLOBAL. The %d in the font names must not be
|
||||
removed.
|
||||
|
||||
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-*-*-*-*-*-*-*";
|
||||
|
||||
|
||||
|
||||
604
INSTALL.cs
Normal file
604
INSTALL.cs
Normal file
@@ -0,0 +1,604 @@
|
||||
Instrukce pro instalaci okenního manažera Window Maker
|
||||
|
||||
PODPOROVANÉ PLATFORMY
|
||||
=====================
|
||||
("Podporované" znamená, že už to na dané platformě někdo zprovoznil...)
|
||||
|
||||
- Intel GNU/Linux Conectiva 5.9 (beta)
|
||||
- Intel GNU/Linux Slackware
|
||||
- Intel GNU/Linux Debian
|
||||
- Intel GNU/Linux ostatní distribuce
|
||||
- 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)
|
||||
- IBM S/390 s Linuxem
|
||||
- iBook s OS Darwin
|
||||
|
||||
Patche pro rozběhání na jiných platformách jsou vítané.
|
||||
|
||||
POŽADAVKY
|
||||
=========
|
||||
|
||||
Následující software je potřebný/nezbytný pro běh Window Makeru:
|
||||
|
||||
- X11R6.x
|
||||
Window Maker může být zkompilován na starších verzích X, jako
|
||||
je X11R5 (Solaris) nebo X11R4 (OpenWindows), ale nebude to pracovat
|
||||
100% spolehlivě. Na těchto systémech nebudou fungovat ikony
|
||||
aplikací a budete mít problémy s používáním doku. Upgrade
|
||||
uživatelských knihoven (Xlib, Xt atd.) zlepší tyto problémy pokud
|
||||
nemůžete aktualizovat váš X server.
|
||||
|
||||
Následující software je potřebný ke zkompilování Window Makeru:
|
||||
|
||||
- Zákládní běžné věci
|
||||
Když budete komplivat Window Maker, tak se ujistěte, že máte gcc
|
||||
(nebo jiný ANCI C kompilátor) a nainstalované hlavičkové soubory
|
||||
pro X. Hlavně pro začátečníky v Linuxu: musíte nainstalovat všechny
|
||||
X-devel balíky a gcc. Jinak nebudete schopni zkompilovat žádný
|
||||
program s grafickým rozhraním, tedy ani Window Maker.
|
||||
|
||||
- autoconf, automake a libtool
|
||||
Tyto nástroje NEJSOU POTŘEBA, ale když máte jeden nebo dva nebo
|
||||
všechny tři nainstalované, tak se UJISTĚTE, že máte přesně
|
||||
následující VERZE:
|
||||
autoconf 2.54
|
||||
automake 1.4
|
||||
libtool 1.4.2
|
||||
Máte-li odlišnou verzi, tak ji dočasně přejmenujte, nebo ji rovnou
|
||||
odinstalujte z vašeho systému. Pokud nebudete programovat, tak ji
|
||||
stejně nebudete potřebovat, takže ji můžete bezpečně odinstalovat.
|
||||
|
||||
Pozn. libProblist už není potřeba ke zkompilování Window Makeru, protože
|
||||
libProblist byl přímo zabudován do WINGs. Z toho důvodu už není
|
||||
potřeba ani lex (flex) a yacc (nebo bison).
|
||||
|
||||
|
||||
NEPOVINNÉ
|
||||
=========
|
||||
|
||||
Tyto knihovny nejsou nutné pro běh Windo Makeru, ale jsou podporované, když
|
||||
je budete chtít použít. Tyto verze jsou používané vývojovým týmem, který
|
||||
garantuje, že budou fungovat. Ostatní verze by měli fungovat také.
|
||||
|
||||
- libXPM 4.7 nebo novější
|
||||
Starší verze nemusí fungovat!!!
|
||||
Dostupné na ftp://sunsite.unc.edu/pub/Linux/libs/X/
|
||||
|
||||
Je zde zabudovaná podpora pro soubory XPM, ale nenačte obrázky s
|
||||
nestandardním formátem kódování.
|
||||
|
||||
- libpng 0.96 nebo novější a zlib
|
||||
Pro podporu PNG obrázků
|
||||
http://www.cdrom.com/pub/png/
|
||||
|
||||
- libtiff 3.4 nebo novější
|
||||
Pro podporu TIFF obrázků
|
||||
Dostupné na ftp://ftp.sgi.com/graphics/tiff
|
||||
|
||||
- libjpeg 6.0.1 nebo novější
|
||||
Pro podporu JPEG obrázků
|
||||
http://www.ijg.org/
|
||||
|
||||
- libgif 2.2 nebo libungif
|
||||
Pro podporu GIF obrázků
|
||||
Dostupné na ftp://prtr-13.ucsc.edu/pub/libungif/
|
||||
|
||||
-GNU xgettxt
|
||||
Když chcete používat češtinu nebo jiné jazyky kromě angličtiny,
|
||||
tak potřebujete GNU xgettext.
|
||||
Ostatní verze nejsou kompatibilní a nebudou fungovat
|
||||
GNU verze je dostupná na ftp://ftp.gnu.org
|
||||
|
||||
|
||||
KONFIGURAČNÍ NASTAVENÍ
|
||||
======================
|
||||
|
||||
Tyto volby mohou být předané konfiguračnímu skriptu jako argumenty za
|
||||
účelem povolení/zakázání určité vlastnosti Window Makera.
|
||||
|
||||
Příklad:
|
||||
|
||||
./configura --enable-kde --enable-gnome
|
||||
|
||||
nakonfiguruje Window Maker s podporou KDE a GNOME
|
||||
|
||||
Seznam ostatních možností dostanete spuštěním ./configure --help
|
||||
|
||||
--with-libs-from
|
||||
specifikuje, které další adresáře s knihovnami se mají
|
||||
prohledávat. Řetězec -L musí předcházet každému adresáři,
|
||||
např:
|
||||
--with-libs-from="-L/opt/libs -L/usr/local/lib"
|
||||
|
||||
--with-incs-from
|
||||
určuje, které další adresáře s hlavičkovými soubory se mají
|
||||
prohledat. Řetězec -I musí předcházet každému adresáři,
|
||||
např:
|
||||
--with-incs-from="-I/opt/headers -I/usr/local/include"
|
||||
|
||||
--enable-single-icon
|
||||
umožňuje skrýt všechny ikony aplikací WM_CLASS+WM_INSTANCE
|
||||
do jedné jediné. Tato vlastnost není podporovaná ze strany vývojářů.
|
||||
Když budete mít s touto funkcí problémy, tak se obraťte na jejího
|
||||
autora: Christopher Seawood <cls@seawood.org>
|
||||
|
||||
--disable-shm
|
||||
zakáže používání zdílené paměti MIT. To trochu zpomalí generování
|
||||
textur, ale v některých případech se to jeví jako nezbytnost z důvodu
|
||||
chyby, která způsobuje špatné zobrazování ikon a textur.
|
||||
|
||||
--disable-motif
|
||||
zakáže podporu pokynů pro okenní manažer mwm.
|
||||
|
||||
--enable-lite
|
||||
odstraní nástroje a funkce, které jsou už dostupné v desktopových
|
||||
prosředích KDE a GNOME. Odstraní se: seznam oken, menu aplikací,
|
||||
výběr více oken. Uvědomte si, že takto už nebudete schopni ukončit
|
||||
samotný Window Maker pomocí aplikačního menu. Budete muset zabít Window
|
||||
Maker z textové konzole nebo ho ukončit z KDE nebo GNOME.
|
||||
Nedoporučuje se povolit tuto vlastnost.
|
||||
|
||||
--enable-modelock
|
||||
podpora pro XKB nastavení jazyka. Když nevíte, o co jde, tak to
|
||||
pravděpodobně nebudete potřebovat.
|
||||
|
||||
--enable-sound
|
||||
povolí podporu modulu zvukových efektů.
|
||||
|
||||
--disable-xpm
|
||||
zakáže podporu knihovny XPM, pokud je dostupná na vašem systému.
|
||||
|
||||
--disable-png
|
||||
zakáže podporu knihovny PNG.
|
||||
|
||||
--disable-tiff
|
||||
zakáže podporu knihovny TIFF.
|
||||
|
||||
--disable-gif
|
||||
zakáže podporu knihovny GIF.
|
||||
|
||||
--disable-jpeg
|
||||
zakáže podporu knihovny JPEG.
|
||||
|
||||
--disable-shape
|
||||
zakáže tvarovaná okna (pro oclock, xeyes, atd.).
|
||||
|
||||
POŽADAVKY PRO SPECIFICKÉ PLATFORMY
|
||||
==================================
|
||||
|
||||
-DEC/Alpha
|
||||
|
||||
Následující mail není přeložen, ale hovoří se v něm, že pravděpodobně
|
||||
není potřeba konfigurovat Window Maker na Alphě s volbou --disable-shm.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
From: Anton Ivanov <aivanov@eu.level3.net>
|
||||
To: Marcelo E. Magallon <mmagallo@debian.org>
|
||||
Subject: Re: Is the WindowMaker package working ok on Alpha?
|
||||
|
||||
> Hi,
|
||||
>
|
||||
> I was reading some docs on the WindowMaker tarball, and found this:
|
||||
>
|
||||
> | - DEC/Alpha machines
|
||||
> | You might need to pass the --disable-shm flag to configure,
|
||||
> | like ./configure --disable-shm
|
||||
>
|
||||
> is anyone having problems with WindowMaker on Alpha? Can someone
|
||||
> please test this? Should the flag be passed when building on Alpha?
|
||||
|
||||
Disclaimer: alphas under my command have never run X and are least likely to
|
||||
suddenly start running it anytime soon.
|
||||
|
||||
Alpha used to have some ridiculously low amount of shared memory
|
||||
configured.
|
||||
So quite a lot of apps used to barf. Namely - cdrecord, mysql server, etc.
|
||||
|
||||
Check where is yours at the moment and raise it to a more appropriate
|
||||
value by either catting to the appropriate /proc entry or changing the
|
||||
/usr/src/linux/include/asm/shmparam.h.
|
||||
|
||||
Otherwise the shared memory on alpha should be fully functional and I
|
||||
see no reason to disable it. Mine are bumped up to 32 or more on most
|
||||
machines.
|
||||
|
||||
And If I recall correctly the comments in that file are actually
|
||||
wrong. Value is not bytes, but in machine size word. For alpha *8.
|
||||
|
||||
As I said - I do not run X on them so all #include "stdisclaimer.h"
|
||||
apply.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
- SCO Unix - configure spusťte takto:
|
||||
CFLAGS="-belf -DANSICPP" ./configure
|
||||
|
||||
- SunOS, Solaris
|
||||
Když máte naistalovaný gcc, tak configure spusťte takto:
|
||||
CPP_PATH="gcc -E -x c" ./configure
|
||||
Preprocesoru cpp od Sunu chybějí některé vlastnosti, které Window Maker
|
||||
potřebuje, a to může způsobit problémy během parsování konfiguračních
|
||||
souborů. Je možné, že budete muset použít --with-libs-from a
|
||||
--with-incs-from k nahrazení adresáře s libtiff.
|
||||
Někdo doporučuje použít /usr/local/lib jako první cestu v LD_LIBRARY_PATH.
|
||||
|
||||
Když máte Ultra Creator 3D nebo jinou high-end grafickou kartu, tak se
|
||||
ujistěte, že X server startuje s 24 bitovou barevnou hloubkou, jinak
|
||||
můžete mít problémy s pomícháním barev. Toto je chyba Window Makeru,
|
||||
která bude odstraněna.
|
||||
|
||||
- GNU/Linux obecně
|
||||
Ujistěte se, že soubor /etc/ld.so.conf obsahuje řádek "/usr/local/lib".
|
||||
Odinstalujte jakoukoliv starší verzi balíčku Window Makeru před instalací
|
||||
novější verze.
|
||||
Nezapomeňte spustit ldconfig po instalaci Window Makeru.
|
||||
|
||||
- RedHat GNU/Linux
|
||||
RedHat má několik obtěžujících chyb. Pokud ho používáte dodržujte několik
|
||||
následujících kroků, jinak vám Window Maker nebude fungovat.
|
||||
|
||||
* pokud máte nainstalovaný Window Maker z distribuce RedHat, tak ho před
|
||||
upgradem odinstalujte
|
||||
|
||||
* ujistěte se, že nemáte systémové proměnné LANG a LINGUAS nastavené
|
||||
na en_RN
|
||||
|
||||
* ujistěte se, že vaše systémová proměnná PATH obsahuje položku
|
||||
/usr/local/bin
|
||||
|
||||
* ujistěte se, že soubor /etc/ld.so.conf obsahuje řádek "/usr/local/lib"
|
||||
před tím, než spustíte ldconfig (na konci instalace)
|
||||
|
||||
* pokud máte problémy, které se projevují chybovou hláškou, která
|
||||
obsahuje text --no-reexec, tak odinstalujte libtool-1.2b a nainstalujte
|
||||
si novější verzi libtool-1.3. libtool-1.3 můžete nalézt na adrese:
|
||||
ftp.gnu.org . Přečtěte si také odstavec ŘEŠENÍ PROBLÉMÚ.
|
||||
|
||||
* pokud máte nainstalovaný balíček Window Maker od RedHatu a nyní
|
||||
instalujete novou verzi "ručně" (kompilováním zdrojových kódů), tak
|
||||
nejprve odinstalujte stávající balíček.
|
||||
|
||||
* ujistěte se, že se na vašem systému nachází symbolický link z
|
||||
/usr/include/X11 na /usr/X11R6/include/X11. Pokud tomu tak není, tak
|
||||
na příkazovou řádku napište:
|
||||
|
||||
ln -s /usr/X11R6/include/X11 /usr/include/X11
|
||||
|
||||
* ujistěte se, že máte symbolický link /lib/cpp ukazující na cpp
|
||||
program
|
||||
|
||||
Pokud pochybujete o nějakém z předcházejích kroků, tak neváhejte
|
||||
kontaktovat uživatelskou podporu distribuce RedHat. Oni vám laskavě
|
||||
zodpoví všechny vaše dotazy zohledňující váš systém. Oni vědí
|
||||
mnohem více o vašem (jejich) systému než my (my nepoužíváme
|
||||
RedHat).
|
||||
|
||||
- PowerPC MkLinux
|
||||
Budete potřebovat poslední verzi Xpma. Starší verze pravděpodobně
|
||||
obsahují chybu, která způsobuje zamrznutí systému.
|
||||
|
||||
- Debian GNU/Linux
|
||||
Pokud chcete podporu JPEG a TIFF, tak se ujistěte, že máte nainstalovány
|
||||
balíčky libtiff-dev a libjpeg-dev.
|
||||
|
||||
- SuSE GNU/Linux
|
||||
Pokud máte již nainstalován baliček Window Maker od SuSE, tak ho
|
||||
odstraňte než se pustíte do kompilace Window Makeru. když tak
|
||||
neučiníte, budete mít problémy.
|
||||
|
||||
- MetroX (neznámá verze)
|
||||
Metrox obsahuje chybu, která zapřičiňuje, že obrázky, které jsou
|
||||
nastaveny jako pozadí, jsou poškozeny. Pokud používáte Metrox a
|
||||
máte podivné problémy s texturami, tak nepoužívejte textury v
|
||||
titulcích nebo používejte jiný X server.
|
||||
|
||||
INSTALACE
|
||||
=========
|
||||
|
||||
Nejjednodušší způsob, jak nainstalovat Window Maker, je spustit skript
|
||||
Install nebo Install.cs (ten s vámi komunikuje česky). Oba skripty
|
||||
vás jednoduše provedou celou instalací.
|
||||
|
||||
su
|
||||
Install.cs
|
||||
|
||||
Poznámka: tato metoda neposkytuje všechny možnosti konfigurace a pokud
|
||||
se setkáte s nějakými problémy, tak stejně budete muset
|
||||
použít následující způsob kompilace.
|
||||
|
||||
Kompilace Window Makeru
|
||||
-----------------------
|
||||
Pro osvědčený způsob zadejte následující příkazy v shellu:
|
||||
|
||||
./configure
|
||||
make
|
||||
|
||||
pak se přihlašte jako root a zadejte:
|
||||
|
||||
make install
|
||||
ldconfig
|
||||
|
||||
pokud nejste programátor a nebudete ladit Window Maker, tak se můžete zbavit
|
||||
ladících symbolů v binárních souborech a zmenšit jejich velikost:
|
||||
|
||||
make install-strip
|
||||
ldconfig
|
||||
|
||||
Takto zkompilujete a nainstalujete Window Maker se standartními parametry.
|
||||
|
||||
Pokud chcete upravit některé vlastnosti, tak musíte učinit následující:
|
||||
|
||||
1. (volitelné) Podívejte se na část MOŽNOSTI KONFIGURACE, kde jsou
|
||||
uvedené možnosti konfigurace. Nebo spusťte:
|
||||
|
||||
./configure --help
|
||||
|
||||
tak dostanete kompletní seznam všech dostupných možností konfigurace.
|
||||
|
||||
2. Spusťte ./configure s možností, kterou jste si vybrali. Například,
|
||||
pokud chcete použít možnost --enable-kde, tak zadejte:
|
||||
|
||||
./configure --enable-kde
|
||||
|
||||
3. (volitelné) Otevřete soubor ./src/wconfig.h vaším oblíbeným editorem
|
||||
a upravte některé možnosti, které si přejete změnit.
|
||||
|
||||
4. Kompilace. Zadejte pouze:
|
||||
|
||||
make
|
||||
|
||||
5. Přihlaste se jako root (pokud tak nemůžetet učinit, tak si přečtěte
|
||||
část "Nemám rootovské helso :-(") a nainstalujte Window Maker na váš
|
||||
systém:
|
||||
|
||||
su root
|
||||
make install
|
||||
|
||||
Nastavení specifické pro uživatele
|
||||
----------------------------------
|
||||
|
||||
Tyto instrukce nejsou povinné, pokud upgradujete Window Maker ze starší
|
||||
verze na novější a pokud není uvedeno jinak v souboru NEWS.
|
||||
|
||||
Každý uživatel na vašem systému, který si přeje používat Window Maker musí
|
||||
udělat následující:
|
||||
|
||||
1. Nainsatlovat konfigurační soubory Window Makeru do jeho domovského
|
||||
adresáře:
|
||||
|
||||
wmaker.inst
|
||||
|
||||
wmaker.inst nainstaluje konfigurační soubory a nastaví X server tak,
|
||||
aby automaticky spouštěl Window Maker při jejich spuštění.
|
||||
|
||||
To je všechno, přátelé.
|
||||
|
||||
Informace o konfiguraci a spoustě ostatních věcí vám poskytne:
|
||||
|
||||
man wmaker
|
||||
|
||||
Pro hlubší úvod do Window Makeru si přečtěte Uživatelskou příručku (User Guide).
|
||||
|
||||
Měli byste se také podívat na FAQ (Frequently Asked Questions = často kladené
|
||||
otázky), pokud budete mít nějaké problémy/potíže jak při samotné kompilaci,
|
||||
tak s užíváním Window Makeru.
|
||||
|
||||
Instalování speciálního balíčku
|
||||
-------------------------------
|
||||
|
||||
Rozbalte WindowMaker-extra-<číslo_verze>.tar.gz v adresáři /usr/local/share
|
||||
|
||||
Tento soubor si můžete sehnat na adrese: ftp://ftp.windowmaker.info. Instalace
|
||||
tohoto souboru vůbec není nutná. tento balíček obsahuje několik ikon a témat.
|
||||
Hledejte poslední dostupnou verzi. V balíčku také naleznete soubor
|
||||
WindowMaker-extra.readme, který vám poradí, co máte udělat.
|
||||
|
||||
Nemám rootovské helso :-(
|
||||
-------------------------
|
||||
|
||||
Pokud nemáte superuživatelská privilegia (nemůžete se přihlásit jako root),
|
||||
tak nezoufejte, protože můžete nainstalovat Window Maker do vašeho vlastního
|
||||
domovského adresáře. K tomu musíte použít volbu --prefix při spuštění
|
||||
./configure. Také musíte použít volbu --with-appspath, která specifikuje
|
||||
cestu pro WPrefs.app.
|
||||
Příklad:
|
||||
|
||||
./configure --prefix=/home/karel --with-appspath=/home/karel/GNUstep/Applications
|
||||
|
||||
Potom přidejte adresář /home/karel/bin do systémové proměnné PATH a adresář
|
||||
/home/karel/lib do sytémové proměnné LD_LIBRARY_PATH a nakonec spusťte
|
||||
~/bin/wmaker.inst.
|
||||
|
||||
Samozřejmě, že adresář /home/karel bude ve vašem případě nahrazen vaším
|
||||
vlastním domovským adresářem.
|
||||
|
||||
|
||||
UPGRADE
|
||||
=======
|
||||
|
||||
Pokud upgradujete ze starší verze Window Makeru:
|
||||
|
||||
1. Nakonfigurujte a zkompilujte Window Maker jako obvykle.
|
||||
2. Nainstalujte Window Maker (ale nespouštějte wmaker.inst).
|
||||
3. Přečtěte si soubor NEWS a aktualizujte vaše konfigurační soubory,
|
||||
pokud je to nezbytné.
|
||||
|
||||
ŘEŠENÍ PROBLÉMÚ
|
||||
===============
|
||||
|
||||
Pokud máte nějaké problémy během konfigurace (když běží configure), jako
|
||||
například neschopnost použít knihovnu grafického formátu, o kterém víte, že
|
||||
ho máte nainstalován, tak se podívejte do souboru config.log. Možná zde
|
||||
najdete příčinu svých problémů.
|
||||
|
||||
== Error with loading fonts, even if they exist.
|
||||
|
||||
Zkuste kompilaci bez podpory NLS (národního prostředí).
|
||||
|
||||
== Error when configuring
|
||||
|
||||
ltconfig: unrecognized option `--no-reexec'
|
||||
Try `ltconfig --help' for more information.
|
||||
configure: error: libtool configure failed
|
||||
|
||||
odstraňte volbu --no-reexec ze souboru aclocal.mc a spusťte znovu configure.
|
||||
Také zkontrolujte, zda verze autoconfu a automaku, které máte nainsatlované
|
||||
odpovídají níže uvedeným hodnotám:
|
||||
autoconf 2.13
|
||||
automake 1.4
|
||||
libtool 1.3
|
||||
|
||||
Poznámka: nemůže to být libtool 1.2b, ale musí to být libtool 1.3 ze stránek
|
||||
GNU.
|
||||
|
||||
== configure doesn't detect libtiff, or other graphic libraries.
|
||||
|
||||
Smažte soubor config.cache, pak znovu spusťte configure s následujícími
|
||||
volbami (a jinými, které používáte):
|
||||
--with-libs-from="-L/usr/local/lib"
|
||||
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
|
||||
Na příslušná místa vložte cesty k vaším grafickým knihovnám a odpovídajícím
|
||||
hlavičkovým souborům. Můžete zadat několik cest do těchto voleb, jako je to
|
||||
ve výše uvedeném příkladě --with-incs-from. Jenom je nezapomeňte oddělit
|
||||
mezerou.
|
||||
|
||||
== configure doesn't detect libXpm.
|
||||
|
||||
* Zkontrolujte, jestli máte symbolický link ze souboru libXpm.so.4.9 na
|
||||
soubor libXpm.so
|
||||
|
||||
== Segmentation fault on startup
|
||||
|
||||
* Zkontrolujte, jestli verze knihovny libXPM je vyšší než 4.7
|
||||
|
||||
* Zkontrolujte, zda-li máte upravenou verzi ~/GNUstep/Defaults/WindowMaker
|
||||
Pokud si nejste jisti, tak zkuste přejmenovat ~/GNUstep na ~/GNUtmp a
|
||||
spusťte wmaker.inst
|
||||
|
||||
== "...: your machine is misconfigured. gethostname() returned (none)"
|
||||
|
||||
* Jméno vašeho počítače je nastaveno nesprávně, protože začíná uvozovkami.
|
||||
Spusťte man hostname a zde se dozvíte, jak změnit jméno vašeho počítače.
|
||||
|
||||
== The root menu contains only 2 entries. ("XTerm" and "Exit...")
|
||||
|
||||
* Window Maker nemůže nalézt cpp (preprocesor jazyka C). Pokud se váš cpp
|
||||
nenachází v /lib/cpp, tak otevřte soubor src/config.h a nastavte správně
|
||||
cestu CPP_PATH.
|
||||
|
||||
== checking lex output file root... configure: error: cannot find output from true; giving up
|
||||
|
||||
* Přečtěte si odstavec POŽADAVKY na začátku tohoto souboru.
|
||||
|
||||
MÍSTNÍ NASTAVENÍ / INTERNACIONALIZACE
|
||||
=====================================
|
||||
|
||||
Window Maker má podporu národních jazyků. Aby jste ji povolili, tak
|
||||
musíte zkompilovat Window Maker s několika dalšími parametry.
|
||||
Seznam podporovaných jazyků naleznete v souboru ./po/README.
|
||||
|
||||
0 - Musíte mít nainstalovaný balíček GNU gettextu. Tento balíček
|
||||
můžete nalézt na ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
|
||||
|
||||
Kroky 1,2 a 3 můžete vynechat, pokud používáte skript Install.cs nebo
|
||||
skript Install.
|
||||
|
||||
1 - Vyberte si jazyky, které budete chtít používat. Zadejte seznam
|
||||
těchto jazyků do systémové proměnné LINGUAS. Angličtina je
|
||||
podporována vždy. Příklady
|
||||
|
||||
C - shell:
|
||||
|
||||
setenv LINGUAS "pt ja de"
|
||||
|
||||
Bash(sh):
|
||||
|
||||
export LINGUAS
|
||||
LINGUAS="pt ja de"
|
||||
|
||||
Přečtěte si soubor po/README pokud chcete přeložit Window Maker
|
||||
pro nějaký další jazyk.
|
||||
|
||||
2 - Navíc, pokud váš jazyk používá multi-byte znaky, například Japonština
|
||||
nebo Korejština, tak musíte nastavit volbu the MultiByteText na YES
|
||||
v souboru ~/GNUstep/Defaults/WMGLOBAL
|
||||
|
||||
3 - Nakonfigurujte, zkompilujte a nainstalujte Window Maker jako obvykle.
|
||||
|
||||
4 - Národní prostředí si můžete změnit i za běhu Window Makeru. Systémovou
|
||||
proměnnou LANG nastavíte na vámi zvolenou hodnotu. Například, pokud
|
||||
chcete použít portugalské prostředí, musíte spustit:
|
||||
|
||||
C - shell:
|
||||
|
||||
setenv LANG pt
|
||||
|
||||
Bourne shell a podobné:
|
||||
|
||||
export LANG
|
||||
LANG=pt
|
||||
|
||||
Nakonec musíte restartovat/spustit Window Maker.
|
||||
|
||||
Poznámka: Když máte nastavenou systémovou proměnnou LC_TYPE, tak jí
|
||||
musíte zrušit před spuštěním Window Makeru.
|
||||
|
||||
Window Maker hledá soubory s definicí menu v tomto pořadí (pro
|
||||
brazilskou portugalštinu):
|
||||
|
||||
menu.pt_BR
|
||||
menu.pt
|
||||
menu
|
||||
|
||||
5 - Pokud si vyberete jazyk, který používá multi-byte znaky, tak musíte
|
||||
příslušným způsobem nastavit fonty. Přečtěte si manuálové stránky
|
||||
o XCreateFontSet k získání většího množství informací o daném
|
||||
problému. Musíte změnit v souboru ~/GNUstep/Default/WindowMaker
|
||||
nastavení fontů pro titulky, menu, atd. Fonty pro dialogy nastavíte
|
||||
v souboru ~/GNUstep/Default/WMGLOBAL. Řetězce %d ve jménech fontů
|
||||
nemusí být odstraněné. Také můžete použít skript wsetfont, který
|
||||
toto vše učiní za vás. Pokud se ho rozhodnote použít, tak si k němu
|
||||
přečtěte instrukce tak, že spustíte wsetfont bez argumentů.
|
||||
|
||||
Příklad části souboru ~/GNUstep/Default/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-*";
|
||||
|
||||
a souboru ~/GNUstep/Default/WMGLOBAL:
|
||||
|
||||
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
|
||||
Tyto dva fonty jsou používány v aplikacích, které používají WINGs (WindowMaker a
|
||||
WPrefs.app).
|
||||
|
||||
Skript wsetfont vám umožní nastavit fonty mnohem jednoduším způsobem. Podívejte
|
||||
se na jeho manuálové stránku k získání bližších informací.
|
||||
594
INSTALL.es
Normal file
594
INSTALL.es
Normal file
@@ -0,0 +1,594 @@
|
||||
|
||||
Instrucciones de Instalación para Window Maker
|
||||
|
||||
|
||||
|
||||
PLATAFORMAS SOPORTADAS
|
||||
======================
|
||||
(obs: Alguien me mencionó que lo compiló en...)
|
||||
|
||||
- Intel GNU/Linux Conectiva 5.9 (beta)
|
||||
- Intel GNU/Linux Slackware
|
||||
- Intel GNU/Linux Debian
|
||||
- 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)
|
||||
- IBM S/390 running Linux
|
||||
- iBook running Darwin
|
||||
- Windows NT with Cygwin/XFree86
|
||||
- Sony PlayStation2 running Linux
|
||||
|
||||
Todas las marcas registradas están registradas por sus dueños. (duh)
|
||||
|
||||
Los parches que lo hagan funcionar en otras plataformas son bienvenidos.
|
||||
|
||||
|
||||
REQUERIMIENTOS:
|
||||
==============
|
||||
|
||||
El siguiente software se necesita para usar Window Maker:
|
||||
|
||||
- X11R6.x
|
||||
Window Maker puede ser compilado en versiones más antiguas de X,
|
||||
como X11R5 (Solaris) o X11R4 (OpenWindows) pero no funcionará 100%
|
||||
correctamente.
|
||||
En tales servidores no habrá íconos de aplicación y tendrá problemas
|
||||
usando el dock. Actualizar las bibliotecas cliente (Xlib, Xt, etc)
|
||||
ayudará si no puede actualizar el servidor.
|
||||
|
||||
Lo siguiente se necesita para compilar Window Maker:
|
||||
|
||||
- Requerimientos básicos y obvios
|
||||
Si compila Window Maker, asegúrese de tener gcc (u algún otro
|
||||
compilador ANSI C) y los archivos header de X instalados. Especialmente
|
||||
para los usuarios de Linux principiantes: debe instalar todos los paquetes
|
||||
de desarrollo de X y la suite gcc. De lo contrario no será capaz de
|
||||
compilar ningún programa X, incluyendo Window Maker.
|
||||
|
||||
- libPropList
|
||||
Esta biblioteca se puede encontrar en ftp://ftp.windowmaker.info/pub/libs
|
||||
o en ftp://ftp.gnome.org/pub/libPropList
|
||||
Instálela antes de compilar Window Maker.
|
||||
|
||||
- autoconf, automake y libtool
|
||||
Estas herramientas NO son necesarias, pero SI tiene una o más de ellas
|
||||
instaladas, asegúrese de tener TODO lo siguiente con estas versiones
|
||||
exactas:
|
||||
|
||||
autoconf 2.54
|
||||
automake 1.4
|
||||
libtool 1.4.2
|
||||
|
||||
Si tiene una versión distinta, desactívelas temporalemte renombrándolas
|
||||
a otras cosa o desinstalándolas desde su sistema. Si no desarrolla
|
||||
software no las necesita, así que puede desinstalarla sin peligro.
|
||||
|
||||
- lex (o flex) y yacc (o bison)
|
||||
Estas son usadas por libPropList. lex en realidad no se necesita ya que
|
||||
su archivo de salida está incluido, pero o yo o automake es tonto,
|
||||
causando que el script configure para libPropList simplemente
|
||||
aborte sin ningún motivo si lex no es encontrado.
|
||||
|
||||
OPCIONAL:
|
||||
=========
|
||||
Estas bibliotecas no son necesarias para hacer que Window Maker funcione,
|
||||
pero están soportadas en caso de que quiera usarlas. Los números de versión
|
||||
son aquellos que yo tengo (y por lo tanto, garantizo que funciona), pero
|
||||
otras versiones podría funcionar también.
|
||||
|
||||
- libXPM 4.7 o más actual.
|
||||
Versiones antiguas pueden no funcionar!!!
|
||||
Disponible en ftp://sunsite.unc.edu/pub/Linux/libs/X/
|
||||
|
||||
Hay soporte nativo para archivos XPM, pero no cargará imagenes de
|
||||
algunos formatos poco comunes.
|
||||
|
||||
-libpng 0.96 o más actual y zlib
|
||||
Para soporte de imágenes PNG.
|
||||
http://www.cdrom.com/pub/png/
|
||||
|
||||
- libtiff 3.4 o más actual.
|
||||
Para soporte de imaen TIFF.
|
||||
Puede obtenerla en ftp://ftp.sgi.com/graphics/tiff
|
||||
|
||||
- libjpeg 6.0.1 o más actual
|
||||
Para soporte de imagen JPEG
|
||||
http://www.ijg.org/
|
||||
|
||||
- libgif 2.2 o libungif
|
||||
Para soporte de imagen GIF.
|
||||
ftp://prtr-13.ucsc.edu/pub/libungif/
|
||||
|
||||
- GNU xgettext
|
||||
Si quiere usar mensajes traducidos, necesitará GNU gettext.
|
||||
Otras versiones de gettext no son compatibles y no funcionarán.
|
||||
Obtenga la versión GNU desde ftp://ftp.gnu.org
|
||||
|
||||
OPCIONES DE CONFIGURACIÓN:
|
||||
=========================
|
||||
Estas opciones pueden ser pasadas al script configure para activar/desactivar
|
||||
algunas opciones de Window Maker. Ejemplo:
|
||||
|
||||
./configure --enable-kde --enable-gnome
|
||||
|
||||
configurará Window Maker para que sea compilado con soporte para KDE y GNOME.
|
||||
|
||||
Para obtener una lista de otras opciones, ejecute ./configure --help
|
||||
|
||||
--with-libs-from
|
||||
especifica rutas adicionales por donde se debe buscar bibliotecas.
|
||||
El -L flag debe preceder a cada ruta, tal como:
|
||||
|
||||
--with-libs-from="-L/opt/libs -L/usr/local/lib"
|
||||
|
||||
--with-incs-from
|
||||
especifica rutas adicionales para la búsqueda de archivos header.
|
||||
El parámetro -I debe preceder a cada ruta, tal como:
|
||||
|
||||
--with-incs-from="-I/opt/headers -I/usr/local/include"
|
||||
|
||||
--enable-single-icon
|
||||
activa el agrupamiento de todos los appicons (iconos de aplicaciones)
|
||||
del WM_CLASS+WM_INSTANCE en uno solo. Esta característica no es soportada
|
||||
por todos los desarrolladores. Si tiene algún problema con ella, contacte
|
||||
a su autor: Christopher Seawood <cls@seawood.org>
|
||||
|
||||
--disable-shm
|
||||
desactiva el uso de la extensión MIT de memoria compartida. Esto
|
||||
ralentizará la generación de texturas un poco, pero en algunos casos
|
||||
parecerá necesario debido a un error que se manifiesta como íconos y
|
||||
texturas desordenadas.
|
||||
|
||||
--disable-motif
|
||||
desactiva el soporte para el gestor de ventanas mwm.
|
||||
|
||||
--enable-lite
|
||||
quita cosas que ya están soportadas en los entornos de escritorio,
|
||||
tal como KDE y Gnome. Desactiva cosas como: lista de ventanas,
|
||||
menú de aplicaciones raíz, selección de ventanas múltiple. Note
|
||||
que no podrá salir más desde dentro de Window Maker; tendrá que usar
|
||||
kill con la señal SIGTERM o salir de KDE. No aconsejo activarlo.
|
||||
|
||||
--enable-modelock
|
||||
Soporte para bloqueo de estado de lenguaje XKB. Si no sabe que es esto
|
||||
probablemente no lo necesite.
|
||||
|
||||
--enable-sound
|
||||
activa el soporte del módulo para efectos sonoros.
|
||||
|
||||
--disable-xpm
|
||||
desactiva el uso de la biblioteca XPM aunque este disponible en su
|
||||
sistema.
|
||||
|
||||
--disable-png
|
||||
desactiva el uso de la biblioteca PNG.
|
||||
|
||||
--disable-tiff
|
||||
desactiva el uso de la biblioteca TIFF.
|
||||
|
||||
--disable-gif
|
||||
desactiva el uso de la biblioteca GIF.
|
||||
|
||||
--disable-jpeg
|
||||
desactiva el uso de la biblioteca JPEG.
|
||||
|
||||
--disable-shape
|
||||
desactiva la forma de ventanas (para oclock, xeyes etc.)
|
||||
|
||||
NOTAS ESPECÍFICAS A LA PLATAFORMA:
|
||||
=================================
|
||||
|
||||
- máquinas DEC/Alpha
|
||||
|
||||
#>>>>>>>>>>>
|
||||
From: Anton Ivanov <aivanov@eu.level3.net>
|
||||
To: Marcelo E. Magallon <mmagallo@debian.org>
|
||||
Subject: Re: El paquete WindowMaker funciona bien en Alpha?
|
||||
|
||||
> Hola,
|
||||
>
|
||||
> Estuve leyendo algunos documentos en el tarball de WindowMaker,
|
||||
> y encontré esto:
|
||||
>
|
||||
> | - máquinas DEC/Alpha
|
||||
> | podría necesitar pasar el parámetro --disable-shm a configure,
|
||||
> | así ./configure --disable-shm
|
||||
>
|
||||
> alguien está teniendo problemas con WindowMaker en Alpha? Puede alguien
|
||||
> por favor probar esto? Debería el parámetro ser pasado al compilar
|
||||
> en Alpha?
|
||||
|
||||
Descargo de responsabilidad: alphas bajo mi mando nunca han ejecutado X
|
||||
y es poco probable de que las ejecute repentinamente en algún momento.
|
||||
|
||||
Alpha suele tener alguna ridícula poca cantidad de memoria compartida
|
||||
configurada.
|
||||
|
||||
Así que muchísimas aplicaciones suelen to barf. Concretamente - cdrecord, mysql server, etc.
|
||||
|
||||
Verifique donde está el suyo en este momento y súbalo a un valor más adecuado catting la entrada
|
||||
adecuada de /proc o cambiando el /usr/src/linux/include/asm/shmparam.h.
|
||||
|
||||
De lo contrario la memoria compartida en alpha debiera ser completamente funcional y no veo razón
|
||||
para desactivarla. Las mías están aumentadas a 32 o más en muchas máquinas.
|
||||
|
||||
Y si recuerdo correctamente los comentarios en aquél archivo están en realidad mal.
|
||||
El valor no está en bytes, pero si en palabra de tamaño máquina. Para alpha *8.
|
||||
|
||||
Como dije - no ejecuto X en ellas asi que apliqué a todas #include "stdisclaimer.h".
|
||||
#<<<<<<<<<<<<
|
||||
|
||||
- SCO Unix - ejecute configure así
|
||||
CFLAGS="-belf -DANSICPP" ./configure
|
||||
|
||||
-SunOS, Solaris
|
||||
Si tiene gcc instalado, ejecute configure como:
|
||||
CPP_PATH="gcc -E -x c" ./configure
|
||||
Sun cpp le falta algunas características que necesita Window Maker y
|
||||
puede causarle problemas al analizar sintacticamente los archivos config.
|
||||
También podría necesitar usar el --with-libs-from y --with-incs-from para
|
||||
suministrarle el directorio donde libtiff se aloja.
|
||||
Alguien me envió un mensaje diciéndome que también debe hacer que /usr/local/lib
|
||||
sea la primera ruta en LD_LIBRARY_PATH para que funcione.
|
||||
|
||||
Si tiene un Ultra Creator 3D o alguna otra máquina con gráficos high-end,
|
||||
asegúrese de iniciar el servidor X con el valor visual por defecto a 24bpp o
|
||||
podría experimentar problemas con colores destrozados.
|
||||
Este es un error de wmaker y será reparado.
|
||||
|
||||
- GNU/Linux en general
|
||||
Asegúrese de tener /usr/local/lib en /etc/ld.so.conf y de ejecutar
|
||||
ldconfig después de instalar.
|
||||
Desinstale cualquier versión empaquetada de Window Maker antes de
|
||||
instalar una nueva versión.
|
||||
|
||||
- RedHat GNU/Linux
|
||||
Los sistemas RedHat tienen varios problemas molestos. Si lo usa,
|
||||
asegúrese de seguir los pasos de más abajo o Window Maker no funcionará:
|
||||
|
||||
* si instaló el Window Maker que viene con RedHat, desinstálelo antes de
|
||||
actualizar;
|
||||
|
||||
*asegúrese que no tiene las variables de entorno LANG y LINGUAS establecidas a
|
||||
en_RN;
|
||||
|
||||
*asegúrese de tener /usr/local/bin en su variable de entorno PATH;
|
||||
|
||||
* asegúrese de tener /usr/local/lib en /etc/ld.so.conf antes de ejecutar
|
||||
ldconfig;
|
||||
|
||||
*si tiene problemas que mencionan un menaje de error con --no-reexec
|
||||
desinstale libtool-1.2b e instale libtool-1.3 en su lugar. libtool-1.3
|
||||
se puede encontrar en ftp.gnu.org. También lea la sección TROUBLESHOOTING
|
||||
(PROBLEMAS);
|
||||
|
||||
* si instaló el paquete Window Maker desde RedHat y está instalando una
|
||||
nueva versión de WM a mano (compilandolo usted mismo), desinstale antes el
|
||||
paquete desde RedHat.
|
||||
|
||||
*asegúrese de tener un enlace simbólico desde /usr/include/X11 hacia
|
||||
/usr/X11R6/include/X11 (si no, tipee ln -s /usr/X11R6/include/X11 /usr/include/X11)
|
||||
|
||||
* asegúrese de tener /lib/cpp apuntando al programa cpp.
|
||||
|
||||
Si tiene alguna duda en cuanto a hacer algunas de las cosas de arriba,
|
||||
por favor no dude en contactar el soporte para usuarios de RedHat. Ellos
|
||||
responderán amablemente a todas sus preguntas en lo que respecta a su sistema.
|
||||
Ellos también conocen mucho más acerca de su propio sistema que nosotros
|
||||
(nosotros no usamos RedHat).
|
||||
|
||||
- PowerPC MkLinux
|
||||
Necesitará tener la última version de Xpmac. Las versiones más antiguas
|
||||
parecen tener errores que producen el cuelgue del sistema.
|
||||
|
||||
- Debian GNU/Linux
|
||||
Si quiere soporte JPEG y TIFF, asegúrese de tener libtiff-dev y
|
||||
libjpeg-dev instalados.
|
||||
|
||||
- SuSE GNU/Linux
|
||||
Si instaló el paquete Window Maker desde SuSE,
|
||||
desinstálelo antes de instentar compilar wmaker o podría
|
||||
tener problemas.
|
||||
|
||||
|
||||
- MetroX (version desconocida)
|
||||
MetroX tiene un error que corrompe pixmaps que se establecen como
|
||||
fondos de ventana. Si usa MetroX y tuvo problemas raros con texturas, no use
|
||||
texturas en las barras de títulos. O use un servidor X distinto.
|
||||
|
||||
INSTALACIÓN:
|
||||
=============
|
||||
|
||||
Compilando Window Maker
|
||||
------------------
|
||||
Para un comienzo rápido, tipee lo siguiente en el prompt del shell:
|
||||
|
||||
./configure
|
||||
make
|
||||
|
||||
luego, regístrese como root y tipee:
|
||||
|
||||
make install
|
||||
ldconfig
|
||||
|
||||
o si quiere remover los símbolos de depuración desde los binarios y hacerlos más
|
||||
pequeños, puede tipear:
|
||||
|
||||
make install-strip
|
||||
ldconfig
|
||||
|
||||
Esto compilará e instalará Window Maker con los parámetros por defecto.
|
||||
|
||||
Si quiere personalizar algunas opciones de compilación, puede hacer lo siguiente.
|
||||
|
||||
1. (opcional)Mire en la sección OPCIONES DE CONFIGURACIÓN para ver las
|
||||
opciones disponibles. También ejecute:
|
||||
|
||||
./configure --help
|
||||
|
||||
para obtener un listado completo de otras opciones que están disponibles.
|
||||
|
||||
2. Ejecute configure con las opciones que quiera. Por ejemplo, si quiere
|
||||
usar la opción --enable-kde, tipee:
|
||||
|
||||
./configure --enable-kde
|
||||
|
||||
3. (opcional) Edite src/wconfig.h con su editor de texto favorito y
|
||||
echele un vistazo por algunas opciones que podría querer cambiar.
|
||||
|
||||
4. Compile. Solo tipee:
|
||||
|
||||
make
|
||||
|
||||
5. Regístrese como root (si no puede hacerlo, lea la sección "No tengo la contraseña de root" :-()
|
||||
e instale Window Maker en su sistema:
|
||||
su root
|
||||
make install
|
||||
|
||||
|
||||
Configuración específica del usuario
|
||||
------------------------------------
|
||||
|
||||
Estas instrucciones no necesitan ser seguidas al actualizar Window Maker
|
||||
desde una versión más antigua, a menos que se indique de otra forma en el archivo
|
||||
NEWS.
|
||||
|
||||
Todo usuario en su sistema que desee ejecutar Window Maker debe hacer lo siguiente:
|
||||
|
||||
1. Instale los archivos de configuración de Window Maker en su directorio home.
|
||||
Tipee:
|
||||
wmaker.inst
|
||||
|
||||
wmaker.inst instalará los archivos de configuración de Window Maker y
|
||||
configurará X para que automáticamente lance Window Maker al inicio.
|
||||
|
||||
Eso es todo!
|
||||
|
||||
Puede tipear "man wmaker" para obtener algo de ayuda general para la
|
||||
configuración y otras cosas.
|
||||
Lea la Guia de Usuario para una explicación más a fondo de Window Maker.
|
||||
|
||||
Podría querer dar una mirada a la FAQ también.
|
||||
|
||||
Instalando el paquete extras
|
||||
----------------------------
|
||||
|
||||
Desempaquete WindowMaker-extra-<número-de-versión>.tar.gz en /usr/local/share
|
||||
|
||||
Puede obtener el archivo en ftp://ftp.windowmmaker.org. Este archivo es optativo
|
||||
y solo tiene unos pocos íconos, y temas. Busque el último <número-de-versión>
|
||||
disponible.
|
||||
También hay un WindowMaker-extra.readme que le enseña donde vería ir ese paquete.
|
||||
|
||||
|
||||
No tengo la contraseña de root :(
|
||||
--------------------------------
|
||||
|
||||
Si no puede obtener privilegios de superusuario (no puede ser root) puede
|
||||
instalar wmaker en su propio directorio home. Para esto, proporcione la
|
||||
opción --prefix al ejecutar configure en el paso 2 de compilando Window Maker.
|
||||
También necesitará proporcionar la opción --with-appspath, para especificar la ruta
|
||||
para WPrefs.app. Ejemplo:
|
||||
|
||||
./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Applications
|
||||
|
||||
Luego haga /home/jshmoe/bin para que se lo incluya en su ruta de búsqueda, agregue
|
||||
/home/jshmoe/lib a su variable de entorno LD_LIBRARY_PATH y ejecute bin/wmaker.inst
|
||||
|
||||
Por supuesto, /home/jshmoe se supone que va a ser reemplazado con la ruta a su
|
||||
directorio home real.
|
||||
|
||||
|
||||
ACTUALIZANDO
|
||||
============
|
||||
Si está actualizando desde una versión antigua de Window Maker:
|
||||
|
||||
1. Configure y compile Window Maker como siempre.
|
||||
2. Instale Window Maker (pero no ejecute wmaker.inst)
|
||||
3. Lea el archivo NEWS y actualice sus archivos de configuración,
|
||||
si es necesario.
|
||||
|
||||
PROBLEMAS
|
||||
=========
|
||||
|
||||
Cuando tenga alguno problemas durante la configuración (al ejecutar configure),
|
||||
tal como no poder usar una biblioteca de formato gráfico que piensa tener instalada,
|
||||
mire en el archivo config.log para obtener ideas sobre el problema.
|
||||
|
||||
== Error al cargar las fuentes, siempre que existan.
|
||||
|
||||
Intente recompilar sin el soporte NLS.
|
||||
|
||||
== Error al configurar
|
||||
|
||||
ltconfig: unrecognized option `--no-reexec'
|
||||
Try `ltconfig --help' for more information.
|
||||
configure: error: libtool configure failed
|
||||
|
||||
quite la opción --no-reexec desde aclocal.m4 y libPropList/aclocal.m4 y
|
||||
reconfigure.
|
||||
También asegúrese que las versiones de autoconf y automake que tenga instaladas son:
|
||||
|
||||
autoconf 2.13
|
||||
automake 1.4
|
||||
libtool 1.3
|
||||
|
||||
Note que ella no debe ser libtool 1.2b, debe ser libtool 1.3,
|
||||
desde los sitios GNU.
|
||||
|
||||
== No puedo encontrar proplist.h o libPropList.something
|
||||
|
||||
Baje e instale libPropList desde los lugares ya citados en algún lugar
|
||||
de este archivo.
|
||||
|
||||
== configure no detecta libtiff, u otras bibliotecas gráficas.
|
||||
|
||||
Elimine config.cache, luego vuelva a ejecutar configure añadiendo las siguientes
|
||||
opciones a configure (entre sus otras opciones):
|
||||
|
||||
--with-libs-from="-L/usr/local/lib"
|
||||
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
|
||||
|
||||
Sustituya las rutas donde están localizadas sus bibliotecas gráficas y sus
|
||||
correspondientes archivos header. Puede colocar rutas múltiples en cualquiera de
|
||||
estas opciones, como se muestra en el ejemplo de --with-incs-from . Solo coloque
|
||||
un espacio entre ellas.
|
||||
|
||||
== configure no detecta libXpm.
|
||||
|
||||
* Verifique si tiene un enlace simbólico desde libXpm.so.4.9 a libXpm.so
|
||||
|
||||
== Segmentation fault al inicio.
|
||||
|
||||
* Verifique si la versión de libXPM que tiene es por lo menos la 4.7
|
||||
|
||||
* Verifique si tiene una versión actualizada de ~/GNUstep/Defaults/WindowMaker
|
||||
|
||||
Si no está seguro, intente renombrar ~/GNUstep a ~/GNUtmp y luego ejecute wmaker.inst
|
||||
|
||||
== "...: your machine is misconfigured. gethostname() returned (none)"
|
||||
|
||||
* el hostname de su máquina está definido a algo inválido, como comenzar con
|
||||
un paréntesis. Haga un man hostname para obtener información acerca de como definirlo.
|
||||
|
||||
|
||||
== El menú raíz contiene solo 2 entradas. ("XTerm" y "Exit...")
|
||||
|
||||
* Window Maker no está encontrando cpp (el preprocesador de C). Si su
|
||||
cpp no está ubicado en /lib/cpp, edite src/config.h y corrija la ruta en
|
||||
CPP_PATH.
|
||||
|
||||
== checking lex output file root... configure: error: cannot find output from true; giving up
|
||||
|
||||
* Lea la sección REQUERIMIENTOS de este archivo.
|
||||
|
||||
|
||||
LOCALES/INTERNACIONALIZACIÓN
|
||||
============================
|
||||
|
||||
Window Maker tiene soporte de idioma nacional. Para activar este soporte,
|
||||
debe compilar Window Maker con algunos parámetros adicionales.
|
||||
|
||||
0 - Debe tener el paquete GNU gettext instalado. Puede obtenerse en
|
||||
ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
|
||||
|
||||
Los pasos 1 al 3 pueden saltearse si usa el script Install.
|
||||
|
||||
1 - Debe seleccionar los idiomas que quiere soportar. Defina el
|
||||
LINGUAS a la lista de locales que quiera. El Inglés siempre está
|
||||
soportado. Ejemplo:
|
||||
|
||||
setenv LINGUAS "pt ja de"
|
||||
en csh
|
||||
|
||||
o
|
||||
|
||||
export LINGUAS;LINGUAS="pt ja de"
|
||||
en sh
|
||||
|
||||
La lista de locales soportados se pueden encontrar en po/README.
|
||||
El Inglés es el idioma pr defecto.
|
||||
|
||||
Lea po/README si desea traducir y mantener archivos locale para otros
|
||||
idiomas.
|
||||
|
||||
2 - Adicionalmente, si su idioma usa caracteres multi-byte, tal como
|
||||
Japonés o Coreano, debe definir la opción MultiByteText a YES
|
||||
en ~/GNUstep/Defaults/WMGLOBAL
|
||||
|
||||
3 - Configure, compile e instale Window Maker normalmente.
|
||||
|
||||
4 - Para seleccionar un locale particular en tiempo de ejecución debe definir la
|
||||
variable de entorno LANG al locale que quiera. Por ejemplo, si quiere definir
|
||||
el locale portugués, debe ejecutar
|
||||
|
||||
setenv LANG pt
|
||||
|
||||
en csh o
|
||||
|
||||
export LANG; LANG=pt
|
||||
|
||||
en Bourne sh y similares
|
||||
|
||||
Nota: Si tiene definida la variable de entorno LC_CTYPE, debe
|
||||
indefinirla antes de ejecutar wmaker.
|
||||
|
||||
Window Maker busca los archivos de definición de menú en el siguiente orden:
|
||||
(para portugués brasileño, en este caso):
|
||||
|
||||
menu.pt_BR
|
||||
menu.pt
|
||||
menu
|
||||
|
||||
5 - Si elige un idioma que usa caracteres multi-byte, debe configurar
|
||||
las fuentes adecuadamente. Lea la página del manual para XCreateFontSet
|
||||
para obtener más detalles sobre esto. Debe cambiar el archivo ~/G/D/Windowmaker
|
||||
para las fuentes usadas en barras de título, menús y otras cosas. Para las fuentes
|
||||
usadas en ventanas de diálogo, cambie ~/G/D/WMGLOBAL. El %d en los nombres de las
|
||||
fuentes no debe ser quitado. Puede también usar el script wsetfont proporcionado para
|
||||
esta tarea. Lea el mismo script para obtener instrucciones.
|
||||
|
||||
Por ejemplo, puede especificar lo siguiente en ~/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-*";
|
||||
|
||||
y en ~/G/D/WMGLOBAL:
|
||||
|
||||
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
|
||||
Las 2 fuentes de arriba son usadas únicamente por aplicaciones que usan WINGs
|
||||
(WindowMaker y WPrefs.app)
|
||||
|
||||
El script wsetfont que se proporciona le permitirá cambiar las definiciones de fuentes
|
||||
de una manera fácil. De una mirada al script para detalles de uso.
|
||||
|
||||
traducido por Efraín Maximiliano Palermo <max_drake2001@yahoo.com.ar>
|
||||
631
INSTALL.fr
Normal file
631
INSTALL.fr
Normal file
@@ -0,0 +1,631 @@
|
||||
|
||||
Instructions pour l'installation de Window Maker
|
||||
|
||||
|
||||
|
||||
PLATEFORMES SUPPORTÉES
|
||||
======================
|
||||
(c.à.d. : j'ai entendu dire que la compilation a été réalisée avec succès sur..)
|
||||
|
||||
- Intel GNU/Linux Conectiva 5.9 (beta)
|
||||
- Intel GNU/Linux Slackware
|
||||
- Intel GNU/Linux Debian
|
||||
- Intel GNU/Linux (autres)
|
||||
- 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
|
||||
- Solaris 2.8 sur Ultra Sparc 10 et E450
|
||||
- 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 sous MacOS
|
||||
- Amiga 3000 sous RedHat Linux 5.1 (Rawhide)
|
||||
- IBM S/390 sous Linux
|
||||
- IBM S/390 sous Conectiva Linux (experimental)
|
||||
- iBook sous Darwin
|
||||
- Windows NT sous Cygwin/XFree86
|
||||
- Sony PlayStation2 sous Linux
|
||||
|
||||
Toutes les marques déposées sont la propriété de leur propriétaire.
|
||||
|
||||
Tout patch qui pourrait faciliter l'adaptation à d'autres plateformes
|
||||
est le bienvenu.
|
||||
|
||||
|
||||
PRÉ-REQUIS
|
||||
==========
|
||||
|
||||
Les logiciels suivants sont nécessaires à l'utilisation de Window Maker :
|
||||
|
||||
- X11R6.x
|
||||
Window Maker peut être compilé avec des versions plus anciennes de X,
|
||||
comme X11R5 (Solaris) ou X11R4 (OpenWindows), mais il ne fonctionnera
|
||||
pas correctement à 100%.
|
||||
Avec ces serveurs X, les icônes des applications n'apparaîtrons pas,
|
||||
et vous aurez des problèmes à l'utilisation du dock. La mise à jour
|
||||
des librairies côté client (Xlib, Xt, etc.) pourront améliorer les
|
||||
choses si vous ne pouvez pas mettre à jour le serveur.
|
||||
|
||||
Les éléments suivants sont nécessaires à la compilation de Window Maker :
|
||||
|
||||
- pré-requis de base
|
||||
Pour compiler Window Maker, assurez-vous que gcc (ou tout autre
|
||||
compilateur de C ANSI) ainsi que les fichiers d'en-têtes de X sont
|
||||
installés. Débutants sous Linux : vous devez installer les paquetages
|
||||
de développement de X ainsi que ceux de la suite gcc. Le cas contraire,
|
||||
vous ne pourrez jamais compiler aucun programme prévu pour X, y compris
|
||||
Window Maker.
|
||||
|
||||
- autoconf, automake et libtool
|
||||
Ces outils ne sont pas indispensables, mais si au moins l'un d'eux
|
||||
est installé sur votre système, assurez-vous que TOUS le sont, et
|
||||
que les versions de ces outils sont exactement :
|
||||
autoconf 2.54
|
||||
automake 1.4
|
||||
libtool 1.4.2
|
||||
Si les versions installées sur votre système différent, désactivez-les
|
||||
provisoirement, par exemple en les renommant, ou en les désinstallant
|
||||
de votre système. Si vous ne développez ni de compilez de logiciels,
|
||||
vous n'en avez pas besoin et leur désinstallation n'est donc pas un
|
||||
problème.
|
||||
|
||||
|
||||
OPTIONNEL
|
||||
=========
|
||||
|
||||
Ces librairies ne sont pas nécessaires pour utiliser Window Maker, mais
|
||||
elles sont supportées, au cas où vous souhaiteriez les utiliser. Les
|
||||
versions ci-dessous sont celles dont je dispose (et du coup, il est
|
||||
garanti qu'elles fonctionnent), mais des versions différentes peuvent
|
||||
fonctionner aussi bien.
|
||||
|
||||
|
||||
- libXPM 4.7 ou plus récent
|
||||
Les versions plus anciennes peuvent ne pas fonctionner !!!
|
||||
Disponible sur ftp://sunsite.unc.edu/pub/Linux/libs/X/
|
||||
|
||||
Le support des fichiers XPM est intégré, mais il ne prendra
|
||||
pas en compte les images dont le format est exotique.
|
||||
|
||||
- libpng 0.96 ou plus récent, et zlib
|
||||
Pour pouvoir utiliser les images au format PNG.
|
||||
http://www.cdrom.com/pub/png/
|
||||
|
||||
- libtiff 3.4 ou plus récent
|
||||
Pour pouvoir utiliser les images au format TIFF.
|
||||
Vous trouverez ça ici : ftp://ftp.sgi.com/graphics/tiff
|
||||
|
||||
- libjpeg 6.0.1 ou plus récent
|
||||
Pour pouvoir utiliser les images au format JPEG.
|
||||
http://www.ijg.org/
|
||||
|
||||
- libgif 2.2 ou libungif
|
||||
Pour pouvoir utiliser les images au format GIF.
|
||||
ftp://prtr-13.ucsc.edu/pub/libungif/
|
||||
|
||||
- GNU xgettext
|
||||
Si vous voulez disposer des traductions en d'autres langues, GNU gettext
|
||||
est nécessaire. Les autres versions de gettext sont incompatibles et ne
|
||||
fonctionneront pas.
|
||||
Vous trouverez la version GNU sur ftp://ftp.gnu.org
|
||||
|
||||
|
||||
OPTIONS DE CONFIGURATION
|
||||
========================
|
||||
|
||||
Ces options peuvent être passées au script de configuration afin d'activer
|
||||
ou désactiver des fonctionnalités de Window Maker. Par exemple :
|
||||
|
||||
./configure --enable-kde --enable-gnome
|
||||
|
||||
configurera Window Maker avec le support intégré pour KDE et GNOME.
|
||||
|
||||
|
||||
Afin d'obtenir la liste des autres options, exécutez ./configure --help
|
||||
|
||||
--with-libs-from
|
||||
ajoute des chemins d'accès pour la recherche des librairies.
|
||||
L'option -L doit précéder chaque chemin d'accès, comme suit :
|
||||
--with-libs-from="-L/opt/libs -L/usr/local/lib"
|
||||
|
||||
--with-incs-from
|
||||
ajoute des chemins d'accès pour la recherche des fichiers d'en-tête.
|
||||
L'option -I doit précéder chaque chemin d'accès, comme suit :
|
||||
--with-incs-from="-I/opt/headers -I/usr/local/include"
|
||||
|
||||
--enable-single-icon
|
||||
active le regroupement des toutes les appicons des WM_CLASS et WM_INSTANCE
|
||||
en une seule icône. Aucun support n'est offert par les développeurs pour
|
||||
cette fonctionnalité. Si vous avez des problèmes avec celle-ci, contactez
|
||||
son auteur :
|
||||
Christopher Seawood <cls@seawood.org>
|
||||
|
||||
--disable-shm
|
||||
désactive l'utilisation de l'extension "MIT shared memory". Cela ralentira
|
||||
un petit peu la génération des textures, mais il semble que cela soit
|
||||
nécessaire dans certains cas pour éviter un bogue se manifestant au niveau
|
||||
des icônes et des textures.
|
||||
|
||||
--disable-motif
|
||||
désactive le support pour les fonctionnalités en rapport avec le gestionnaire
|
||||
de fenêtres mwm.
|
||||
|
||||
--enable-lite
|
||||
désactive des fonctionnalités déjà prises en compte par les gestionnaires de
|
||||
bureau tels que KDE et GNOME. Celà concerne : la liste de fenêtres, le menu
|
||||
des applications, la sélection multiple de fenêtres. Attention : vous ne
|
||||
pourrez plus sortir de Window Maker autrement qu'en utilisant kill avec le
|
||||
signal SIGTERM ou en quittant à l'aide de KDE. Il n'est pas conseillé
|
||||
d'utiliser cette option.
|
||||
|
||||
--enable-modelock
|
||||
active le support pour le verrouillage du "XKB language status". Si vous ne
|
||||
savez pas de quoi il retourne, c'est probablement que vous n'en avez pas
|
||||
utilité.
|
||||
|
||||
--enable-sound
|
||||
active le support pour le module de gestion des effets sonores.
|
||||
|
||||
--disable-xpm
|
||||
désactive l'utilisation de la librairie XPM même si elle est présente
|
||||
sur votre système.
|
||||
|
||||
--disable-png
|
||||
désactive l'utilisation de la librairie PNG.
|
||||
|
||||
--disable-tiff
|
||||
désactive l'utilisation de la librairie TIFF.
|
||||
|
||||
--disable-gif
|
||||
désactive l'utilisation de la librairie GIF.
|
||||
|
||||
--disable-jpeg
|
||||
désactive l'utilisation de la librairie JPEG.
|
||||
|
||||
--disable-shape
|
||||
désactive l'utilisation de "shaped windows" (pour oclock, xeyes, etc.).
|
||||
|
||||
|
||||
NOTES SPÉCIFIQUES AUX PLATEFORMES
|
||||
=================================
|
||||
|
||||
- machines DEC/Alpha
|
||||
|
||||
#>>>>>>>>>>>
|
||||
De : Anton Ivanov <aivanov@eu.level3.net>
|
||||
A : Marcelo E. Magallon <mmagallo@debian.org>
|
||||
Sujet : Re : Est-ce que le paquetage WindowMaker fonctionne correctement sur Alpha?
|
||||
|
||||
> Salut,
|
||||
>
|
||||
> Je lisais la doc contenue dans l'archive de WindowMaker, quand je suis
|
||||
> tombé sur ça :
|
||||
>
|
||||
> | - machines DEC/Alpha
|
||||
> | Il est possible que vous deviez utiliser l'option --disable-shm pour
|
||||
> | configurer la compilation, comme suit :
|
||||
> | ./configure --disable-shm
|
||||
>
|
||||
> est-ce que quelqu'un a eu des problèmes avec WindowMaker sur Alpha? Est-ce
|
||||
> que quelqu'un peut tester cela? Doit-on vraiment utiliser cette option
|
||||
> pour compiler sur Alpha?
|
||||
|
||||
Notez bien : les Alphas dont je me sers ne sont jamais sous X et ne sont pas près
|
||||
de l'être.
|
||||
|
||||
Bien souvent, la configuration des Alphas n'inclut qu'un volume ridiculement
|
||||
petit de mémoire partagée. Aussi il n'est pas étonnant qu'un grand nombre
|
||||
d'applications comme cdrecord ou mysql server plantent carrément.
|
||||
|
||||
Vérifiez ces réglages sur votre système et modifiez-les en conséquent :
|
||||
pour cela, manipulez l'entrée appropriée dans /proc ou modifiez le fichier
|
||||
/usr/src/linux/include/asm/shmparam.h.
|
||||
|
||||
En dehors de ce cas, la mémoire partagée sous Alpha est sensée ne pas
|
||||
poser de problème et je ne vois aucune raison de la désactiver.
|
||||
Pour ma part, elle est à 32 ou plus sur la pluspart des machines.
|
||||
|
||||
De plus, si ma mémoire est exacte, les commentaires dans ce fichier
|
||||
sont tout à fait inexacts. La valeur n'est pas exprimée en octets, mais en
|
||||
mots, dépendant de la machine. Pour les Alphas, c'est donc *8.
|
||||
|
||||
Je rappelle que je n'utilise pas X sur ces machines, donc ce que j'indique
|
||||
est soumis à toutes les réserves habituelles. (#include "standard_disclaimer.h")
|
||||
#<<<<<<<<<<<<
|
||||
|
||||
|
||||
- SCO Unix
|
||||
Lancez configure comme suit :
|
||||
CFLAGS="-belf -DANSICPP" ./configure
|
||||
|
||||
- SunOS, Solaris
|
||||
Si gcc est installé, lancez configure comme suit :
|
||||
CPP_PATH="gcc -E -x c" ./configure
|
||||
Le cpp de Sun ne dispose pas de certaines fonctionnalités nécessaire pour
|
||||
Window Maker et cela peut occasionner des problèmes avec l'utilisation des
|
||||
fichiers de configuration.
|
||||
Il peut être aussi nécessaire d'indiquer le chemin d'accès à la librairie
|
||||
libtiff en utilisant les options --with-libs-from et --with-incs-from
|
||||
avec configure.
|
||||
Quelqu'un m'a rapporté qu'il est nécessaire de faire figurer /usr/local/lib
|
||||
en premier dans la variable d'environnement LD_LIBRARY_PATH.
|
||||
|
||||
Si vous utilisez un Ultra Creator 3D ou une autre machine graphique
|
||||
de haut niveau, faites en sorte de démarrer le serveur X avec le mode
|
||||
graphique par défaut à 24bpp sinon vous pourriez constaer des problèmes
|
||||
au niveau des couleurs.
|
||||
C'est une bogue répertorié au niveau de Window Maker, il sera corrigé.
|
||||
|
||||
- GNU/Linux en général
|
||||
Assurez-vous que /usr/local/lib figure dans /etc/ld.so.conf et que vous
|
||||
avez lancé ldconfig après l'installation.
|
||||
Désinstallez tout précédent paquetage de Window Maker avant d'installer
|
||||
une nouvelle version.
|
||||
|
||||
- RedHat GNU/Linux
|
||||
Il peut y avoir plusieurs problèmes ennuyeux sur les systèmes RedHat.
|
||||
Voici la marche à suivre sous peine de ne pouvoir utiliser Window Maker
|
||||
sur ces systèmes :
|
||||
|
||||
* si la version de Window Maker livrée avec RedHat est installée,
|
||||
désinstallez-la avant de mettre à jour votre système;
|
||||
|
||||
* assurez-vous que ni la variable d'environnement LANG ni LINGUAS ne
|
||||
contiennent "en_RN";
|
||||
|
||||
* vérifiez que /usr/local/bin est présent dans votre variable d'environnement
|
||||
PATH;
|
||||
|
||||
* il faut que /usr/local/lib soit dans /etc/ld.so.conf avant de lancer
|
||||
ldconfig;
|
||||
|
||||
* si vous rencontrez des messages d'erreur en rapport avec "--no-reexec",
|
||||
désinstallez libtool-1.2b et installez libtool-1.3.
|
||||
libtool-1.3 peut être trouvé sur ftp.gnu.org.
|
||||
Consultez aussi la section PROBLÈMES;
|
||||
|
||||
* si vous aviez auparavant installé le paquetage de Window Maker livré
|
||||
avec RedHat et que vous voulez installer maintenant manuellement une nouvelle
|
||||
version, vous devez au préalable désinstaller le paquetage provenant de la
|
||||
RedHat;
|
||||
|
||||
* assurez-vous qu'il existe un lien symbolique de from /usr/include/X11 vers
|
||||
/usr/X11R6/include/X11 (le cas échéant, lancez cette commande :
|
||||
ln -s /usr/X11R6/include/X11 /usr/include/X11);
|
||||
|
||||
* assurez-vous que /lib/cpp pointe bien vers le programme cpp
|
||||
|
||||
Si vous avez un doute concernant quoi que ce soit de relatif à l'installation
|
||||
de Window Maker sur une RedHat, n'hésitez pas à contacter le support
|
||||
utilisateur de RedHat. Ils vous renseigneront toujours et tenteront de vous
|
||||
dépanner dans l'utilisation et la configuration de votre système RedHat.
|
||||
D'un autre côté, ils sont plus au fait que nous pour tout ce qui est relatif
|
||||
aux RedHat (nous n'en utilisons pas).
|
||||
|
||||
- PowerPC MkLinux
|
||||
Installez la version la plus récente de Xpmac. Les versions plus
|
||||
anciennes semblent contenir un bogue qui est susceptible de bloquer
|
||||
le système.
|
||||
|
||||
- Debian GNU/Linux
|
||||
Si vous voulez bénéficier du support des fichier JPEG et TIFF,
|
||||
assurez-vous que les paquetages libtiff-dev et libjpeg-dev sont installés.
|
||||
|
||||
- SuSE GNU/Linux
|
||||
Désinstallez tout précédent paquetage de Window Maker avant d'installer
|
||||
une nouvelle version. Le cas échéant, vous pourriez rencontrer des
|
||||
problèmes.
|
||||
|
||||
- MetroX (version indéterminée)
|
||||
MetroX contient un bogue qui corrompt les pixmaps utilisées en fond
|
||||
de fenêtres. Si vous utilisez MetroX et rencontrer des problèmes
|
||||
avec les textures, n'utilisez pas les textures dans les barres de titre,
|
||||
ou bien utilisez un autre serveur X.
|
||||
|
||||
|
||||
INSTALLATION
|
||||
============
|
||||
|
||||
Compiler Window Maker
|
||||
---------------------
|
||||
Pour aller vite, tapez ce qui suit dans un prompt shell :
|
||||
|
||||
./configure
|
||||
make
|
||||
|
||||
puis, loguez-vous en tant que root and tapez :
|
||||
|
||||
make install
|
||||
ldconfig
|
||||
|
||||
ou, si vous voulez ôter les infos de débogage des exécutables et ainsi les
|
||||
rendre plus petits, tapez plutôt :
|
||||
|
||||
make install-strip
|
||||
ldconfig
|
||||
|
||||
Tout ceci compile et installe Window Maker avec les réglages par défaut.
|
||||
|
||||
Maintenant, si vous voulez personnaliser des options de compilation, vous
|
||||
pouvez faire :
|
||||
|
||||
1. (optionnel) Consulter la section OPTIONS DE CONFIGURATION
|
||||
dans ce même fichier. Exécutez aussi :
|
||||
|
||||
./configure --help
|
||||
|
||||
pour avoir la liste des autres options disponibles.
|
||||
|
||||
2. Lancez configure avec les options choisies. Par exemple, si vous voulez
|
||||
utiliser l'option --enable-kde, tapez :
|
||||
|
||||
./configure --enable-kde
|
||||
|
||||
3. (optionnel) Éditez src/wconfig.h avec votre éditeur de texte favori et
|
||||
et modifiez sont contenu à votre guise.
|
||||
|
||||
4. Compilez. Il faut juste taper :
|
||||
|
||||
make
|
||||
|
||||
5. Loguez-vous en tant que root (si vous ne pouvez pas le faire, lisez le
|
||||
paragraphe "Je n'ai pas le mot de passe de root :-(") et installez
|
||||
Window Maker sur votre système :
|
||||
su root
|
||||
make install
|
||||
|
||||
|
||||
Réglages pour un utilisateur
|
||||
----------------------------
|
||||
|
||||
Ces instructions suivantes ne sont pas nécessaires si vous mettez à jour
|
||||
Window Maker à partir d'une version plus ancienne, à moins que ce soit
|
||||
précisé dans le fichier NEWS.
|
||||
|
||||
Chaque utilisateur qui veut utiliser Window Maker sur votre système doit
|
||||
faire ce qui suit :
|
||||
|
||||
1. Installer les fichiers de configuration de Window Maker dans son
|
||||
répertoire personnel.
|
||||
|
||||
Pour ceci, il doit taper :
|
||||
wmaker.inst
|
||||
|
||||
wmaker.inst installera les fichiers de configuration de Window Maker
|
||||
pour l'utilisateur et configurera ses paramètres de X de façon à ce que
|
||||
Window Maker soit automatiquement lancé au démarrage de X.
|
||||
|
||||
C'est tout!
|
||||
|
||||
Vous pouvez aussi taper "man wmaker" afin d'obtenir plus de renseignements
|
||||
sur la configuration et d'autres sujets.
|
||||
|
||||
Consultez le Guide de l'utilisateur afin d'obtenir des informationss plus
|
||||
en détail sur Window Maker.
|
||||
|
||||
Pourquoi ne pas aussi jeter un oeil aux FAQs..
|
||||
|
||||
|
||||
|
||||
Installation du paquetage additionnel
|
||||
-------------------------------------
|
||||
|
||||
Décompressez WindowMaker-extra-<version-number>.tar.gz dans /usr/local/share
|
||||
|
||||
Vous trouverez le fichier sur ftp://ftp.windowmaker.info. Ce paquetage est optionnel,
|
||||
il contient des icônes et des thèmes supplémentaires. Vérifiez que vous avez
|
||||
bien la derniere version de ce paquetage.
|
||||
Il y a aussi un fichier WindowMaker-extra.readme qui indique comment procéder à
|
||||
l'installation de ce paquetage.
|
||||
|
||||
|
||||
|
||||
Je n'ai pas le mot de passe de root :-(
|
||||
---------------------------------------
|
||||
|
||||
Si vous n'avez pas acc-s aux privilèges du super-utilisateur (root), vous pouvez
|
||||
installer Window Maker dans votre répertoire personnel. Pour ce faire, ajoutez
|
||||
l'option --prefix correctement renseignée au moment de l'exécution de ./configure
|
||||
(étape 2 de la compilation de Window Maker).
|
||||
Il est aussi nécessaire d'utiliser l'option --with-appspath, afin de préciser
|
||||
le chemin d'accès à WPrefs.app. Par exemple :
|
||||
|
||||
./configure --prefix=/home/jshmoe --with-appspath=/home/jshmoe/GNUstep/Applications
|
||||
|
||||
|
||||
Puis, faites en sorte que /home/jshmoe/bin soit inclus dans votre PATH, ajoutez
|
||||
/home/jshmoe/lib à votre variable d'environnement LD_LIBRARY_PATH puis lancez
|
||||
bin/wmaker.inst
|
||||
|
||||
Bien sûr, /home/jshmoe est supposé être remplacé par votre répertoire personnel.
|
||||
|
||||
|
||||
MISE À JOUR
|
||||
===========
|
||||
|
||||
Si vous mettez à jour une version plus ancienne de Window Maker :
|
||||
|
||||
1. Configurez et compilez Window Maker comme d'habitude
|
||||
2. Installez Window Maker (mais n'exécutez pas wmaker.inst)
|
||||
3. Consultez le fichier NEWS et mettez à jour vos fichiers de configuration
|
||||
si nécessaire.
|
||||
|
||||
|
||||
PROBLÈMES
|
||||
=========
|
||||
|
||||
Si vous rencontrez des problèmes pendant la phase de configuration, comme par
|
||||
exemple l'impossibilité d'utiliser une librairie de manipulation de format
|
||||
graphique alors que vous pensez qu'elle est installée, jetez un oeil au contenu
|
||||
du fichier config.log, vous y trouverez peut-être des indices pour résoudre
|
||||
ce problème.
|
||||
|
||||
|
||||
== erreur de chargement de polices, alors qu'elles existent
|
||||
|
||||
Essayez de recompiler sans le support pour le NLS.
|
||||
|
||||
|
||||
== erreur à la configuration
|
||||
|
||||
ltconfig: unrecognized option `--no-reexec'
|
||||
Try `ltconfig --help' for more information.
|
||||
configure: error: libtool configure failed
|
||||
|
||||
Otez l'option --no-reexec du fichier aclocal.m4 et relancer la configuration.
|
||||
Assurez vous aussi que les versions d'autoconf et d'automake correspondent bien
|
||||
aux pré-requis :
|
||||
autoconf 2.13
|
||||
automake 1.4
|
||||
libtool 1.3
|
||||
|
||||
Notez bien que ce ne doit PAS être libtool 1.2b, mais libtool bien 1.3,
|
||||
disponible sur les sites GNU.
|
||||
|
||||
|
||||
== configure ne trouve pas libtiff ou une autre librairie graphique
|
||||
|
||||
Effacez le fichier config.cache, et exécutez à nouveau configure avec les options
|
||||
suivantes (en plus des options que vous utilisiez déjà) :
|
||||
--with-libs-from="-L/usr/local/lib"
|
||||
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
|
||||
Insérez les chemins d'accès aux librairies graphiques et à leurs fichiers d'en-tête.
|
||||
Plusieurs chemins d'accès peuvent être ajoutés pour chacune de ces options,
|
||||
comme montré pour --with-incs-from. Séparez-les juste par un espace.
|
||||
|
||||
|
||||
== configure ne trouve pas libXpm
|
||||
|
||||
* Vérifiez que vous avez un lien sympbolique de libXpm.so.4.9 vers libXpm.so
|
||||
|
||||
|
||||
== segmentation fault au démarrage
|
||||
|
||||
* Vérifiez que la version de libXPM qui est installée est au moins 4.7.
|
||||
|
||||
* Vérifiez que votre fichier ~/GNUstep/Defaults/WindowMaker est à jour.
|
||||
|
||||
Si vous n'en êtes pas sûr, renommez ~/GNUstep en ~/GNUtmp et lancez wmaker.inst.
|
||||
|
||||
|
||||
== "...: your machine is misconfigured. gethostname() returned (none)"
|
||||
|
||||
* Le nom d'hôte de votre machine n'est pas indiqué ou est invalide (il commence
|
||||
par une parenthèse par exemple). Consultez les pages du manuel (man hostname) pour
|
||||
savoir comment le positionner correctement.
|
||||
|
||||
|
||||
== Le menu des applications ne contient que 2 entrées ("XTerm" et "Exit...")
|
||||
|
||||
* Window Maker ne trouve pas cpp (le preprocesseur de C). Si votre cpp n'est pas situé
|
||||
dans /lib/cpp, editez src/config.h et modifiez le chemin d'accès dans CPP_PATH en conséquent.
|
||||
|
||||
== checking lex output file root... configure: error: cannot find output from true; giving up
|
||||
|
||||
* Consultez la section PRE-REQUIS dans ce même fichier.
|
||||
|
||||
|
||||
LOCALES/INTERNATIONALISATION
|
||||
============================
|
||||
|
||||
Window Maker supporte les langues étrangères. Pour activer cette fonctionalité,
|
||||
vous devez compiler Window Maker avec des paramètres supplémentaires.
|
||||
|
||||
|
||||
0 - GNU gettext doit être installé. Il peut être trouvé ici :
|
||||
ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
|
||||
|
||||
Vous pouvez passer à l'étape 4 si vous utilisez le script Install.
|
||||
|
||||
1 - Il vous faut choisir les langues que vous voulez rendre disponible. Modifiez
|
||||
pour cela la liste des codes de nationalité dans LINGUAS. L'anglais est inclus
|
||||
de façon implicite dans cette liste. Par exemple :
|
||||
|
||||
setenv LINGUAS "pt ja de"
|
||||
sous csh
|
||||
|
||||
ou
|
||||
|
||||
export LINGUAS;LINGUAS="pt ja de"
|
||||
sous sh
|
||||
|
||||
La liste de tous les codes de nationalité peut être trouvée dans po/README.
|
||||
L'anglais est la langue par défault.
|
||||
|
||||
Lisez po/README si vous souhaitez traduire ou maintenir les fichiers propres
|
||||
à d'autres adaptations nationales.
|
||||
|
||||
2 - De plus, si votre langue utilise des caractères multi-octets, comme
|
||||
le japonais ou le coréen, vous devez vous assurer que l'option MultiByteText est à YES
|
||||
dans ~/GNUstep/Defaults/WMGLOBAL.
|
||||
|
||||
3 - Configurez, compilez et installez Window Maker normalement.
|
||||
|
||||
4 - Pour choisir une langue particulière à l'exécution, vous devez positionner la variable
|
||||
d'environnement LANG avec la valeur correspondant au code de nationalité adéquat.
|
||||
Par exemple, si vous voulez utiliser le portugais, vous devez faire :
|
||||
|
||||
setenv LANG pt
|
||||
|
||||
sous csh ou
|
||||
|
||||
export LANG; LANG=pt
|
||||
|
||||
sous Bourne sh et apparentés
|
||||
|
||||
Note : si la variable d'environnement LC_CTYPE est positionnée, vous devez l'ôter de
|
||||
l'environnement (unset LC_CTYPE), avant d'exécuter Window Maker.
|
||||
|
||||
En ce qui concerne les fichiers de configuration des menus, Window Maker procède
|
||||
à une recherche suivant cet ordre (pour le portugais brésilien, dans ce cas) :
|
||||
|
||||
menu.pt_BR
|
||||
menu.pt
|
||||
menu
|
||||
|
||||
|
||||
5 - Si vous choisissez une langue qui utilise les caractères multi-octets, vous
|
||||
devez configurer les polices de façon adéquate. Consultez pour cela les pages
|
||||
de manuel de XCreateFontSet. Vous devez modifier dans votre fichier ~/G/D/WindowMaker
|
||||
les polices utilisées dans les titres, menus et autres. En ce qui concerne les polices
|
||||
utilisées dans les boîte de dialogue, modifiez ~/G/D/WMGLOBAL.
|
||||
Le %d dans la définition des polices ne doit PAS être enlevé. Vous pouvez aussi utiliser
|
||||
le script wsetfont, fourni à ces fins.
|
||||
Consultez le script lui-même pour en connaître les instructions.
|
||||
|
||||
Par exemple, vous pouvez mettre ceci dans ~/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-*";
|
||||
|
||||
et dans ~/G/D/WMGLOBAL :
|
||||
|
||||
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
|
||||
Les 2 polices ci-dessus sont uniquement utilisées par les applications qui utilisent
|
||||
WINGs (Window Maker et WPrefs.app).
|
||||
|
||||
Le script wsetfont inclus vous permettra de changer les réglages des polices de
|
||||
façon plus aisée. Consultez-le afin d'obtenir plus d'informations.
|
||||
557
INSTALL.pt
Normal file
557
INSTALL.pt
Normal file
@@ -0,0 +1,557 @@
|
||||
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.info/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.54
|
||||
automake 1.4
|
||||
libtool 1.4.2
|
||||
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-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.info. 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/Applications
|
||||
|
||||
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>
|
||||
601
INSTALL.sk
Normal file
601
INSTALL.sk
Normal file
@@ -0,0 +1,601 @@
|
||||
|
||||
In¹trukcie pre in¹taláciu Window Makera
|
||||
|
||||
|
||||
|
||||
PODPOROVANÉ PLATFORMY
|
||||
=====================
|
||||
(tzn: vraj to na tom niekto skompiloval...)
|
||||
|
||||
- Intel GNU/Linux Conectiva 5.9 (beta)
|
||||
- Intel GNU/Linux Slackware
|
||||
- Intel GNU/Linux Debian
|
||||
- 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)
|
||||
- IBM S/390 running Linux
|
||||
- iBook running Darwin
|
||||
|
||||
Patche na rozbehanie na iných platformách sú vítané.
|
||||
|
||||
|
||||
PO®IADAVKY:
|
||||
===========
|
||||
|
||||
Nasledovný softvér je potrebný pre beh Window Makera:
|
||||
|
||||
- X11R6.x
|
||||
Window Maker mô¾e by» skompilovaný na star¹ích verziách X, ako
|
||||
X11R5 (Solaris) alebo X11R4 (OpenWindows) ale nebude pracova»
|
||||
100% korektne. Na takých serveroch nebudú ikony aplikácií a budete
|
||||
ma» problémy s pou¾ívaním doku. Upgrade klientských kni¾níc (Xlib,
|
||||
Xt, atï.) pomô¾e, ak u¾ nemô¾ete spravi» upgrade servera.
|
||||
|
||||
Nasledovné je potrebné k skompilovaniu Window Makera:
|
||||
|
||||
- Základné be¾né veci
|
||||
Ak chcete kompilova» Window Maker, uistite sa, ¾e máte gcc (alebo
|
||||
iný ANSI C kompilátor) a hlavièkové súbory iXov. Hlavne pre zaèia-
|
||||
toèníkov v Linuxe: musíte nain¹talova» v¹etky X-devel balíky a gcc.
|
||||
Inak nebudete schopní skompilova» ¾iadny program pre X, teda ani
|
||||
Window Maker.
|
||||
|
||||
- libPropList
|
||||
Túto kni¾nicu mo¾no nájs» na ftp://ftp.windowmaker.info/pub/libs alebo
|
||||
ftp://ftp.gnome.org/pub/libPropList. Nain¹talujte ju pred kompiláciou
|
||||
Window Makera.
|
||||
|
||||
- autoconf, automake a libtool
|
||||
Tieto nástroje NIE sú potrebné, ale ak máte niektoré z nich nain¹talo-
|
||||
vané, uistite sa, ¾e V©ETKY sú presne nasledovné verzie:
|
||||
autoconf 2.54
|
||||
automake 1.4
|
||||
libtool 1.4.2
|
||||
Ak máte odli¹né verzie, odin¹talujte ich alebo ich doèasne premenujte.
|
||||
Ak neprogramujete, nebudete ich potrebova» a teda ich mô¾ete
|
||||
odin¹talova».
|
||||
|
||||
- lex (alebo flex) a yacc (alebo bison)
|
||||
Tieto sú vyu¾ívané z libPropList. Lex v skutoènosti nie je nutný,
|
||||
lebo jeho výstupný súbor je prítomný, ale buï ja alebo automake je
|
||||
hlupák, lebo configuraèný skript pre libPropList sa jednoducho
|
||||
ukonèí z neznámych dôvodov ak lex nie je prítomný.
|
||||
|
||||
|
||||
|
||||
NEPOVINNÉ:
|
||||
==========
|
||||
|
||||
Tieto kni¾nice nie sú nutné pre beh Window Makera, ale sú podporované
|
||||
v prípade, ¾e ich chcete pou¾íva». Èísla verzií sú tie, ktoré som pou¾il
|
||||
ja (teda urèite fungujú), ale aj iné verzie mô¾u pracova» správne.
|
||||
|
||||
|
||||
- libXPM 4.7 alebo nov¹ia
|
||||
Star¹ie verzie nemusia fungova»!!!
|
||||
Dostupné na ftp://sunsite.unc.edu/pub/Linux/libs/X/
|
||||
|
||||
Podpora XPM je aj vstavaná, ale nenaèíta obrázky v
|
||||
ne¹tandardných kódovaniach.
|
||||
|
||||
- libpng 0.96 alebo nov¹ia a zlib
|
||||
Pre podporu obrázkov PNG.
|
||||
http://www.cdrom.com/pub/png/
|
||||
|
||||
- libtiff 3.4 alebo nov¹ia
|
||||
Pre podporu obrázkov TIFF.
|
||||
ftp://ftp.sgi.com/graphics/tiff
|
||||
|
||||
- libjpeg 6.0.1 alebo nov¹ia
|
||||
Pre podporu obrázkov JPEG.
|
||||
http://www.ijg.org/
|
||||
|
||||
- libgif 2.2 alebo libungif
|
||||
Pre podporu obrázkov GIF.
|
||||
ftp://prtr-13.ucsc.edu/pub/libungif/
|
||||
|
||||
- GNU xgettext
|
||||
Ak chcete pou¾íva» prelo¾ené hlásenia, potrebujete GNU gettext.
|
||||
Iné verzie gettext nie sú kompatibilné a nebudú fungova».
|
||||
Stiahnite si GNU verziu z ftp://ftp.gnu.org
|
||||
|
||||
|
||||
|
||||
MO®NOSTI CONFIGURE:
|
||||
===================
|
||||
|
||||
Tieto mo¾nosti mô¾u by» dané skriptu configure ako argumenty za úèelom
|
||||
povolenia/zakázania urèitých vlastností Window Makera. Príklad:
|
||||
|
||||
./configure --enable-kde --enable-gnome
|
||||
|
||||
nakonfiguruje Window Maker s podporou KDE a GNOME.
|
||||
|
||||
|
||||
Zoznam v¹etkých mo¾ností vypí¹e príkaz ./configure --help
|
||||
|
||||
--with-libs-from
|
||||
cesty, kde sa majú hµada» kni¾nice. Re»azec -L musí predchádza»
|
||||
ka¾dú cestu, napr.:
|
||||
--with-libs-from="-L/opt/libs -L/usr/local/lib"
|
||||
|
||||
--with-incs-from
|
||||
cesty, kde sa majú hµada» hlavièkové súbory. Re»azec -I musí
|
||||
predchádza» ka¾dú cestu, napr.:
|
||||
--with-incs-from="-I/opt/headers -I/usr/local/include"
|
||||
|
||||
--enable-single-icon
|
||||
umo¾òuje zrolovanie v¹etký ikon aplikácií WM_CLASS+WM_INSTANCE do
|
||||
jedinej. Táto vlastnos» nie je podporovaná zo strany vývojárov.
|
||||
V prípade problémov s òou, kontaktujte autora:
|
||||
Christopher Seawood <cls@seawood.org>
|
||||
|
||||
--disable-shm
|
||||
zaká¾e pou¾itie roz¹írenia zdieµanej pamäte MIT. Toto trochu spomalí
|
||||
generovanie textúr, ale v niektorých prípadoch je táto voµba potrebná
|
||||
kvôli chybe, ktorá spôsobuje nesprávne zobrazovanie ikon a textúr.
|
||||
|
||||
--disable-motif
|
||||
zaká¾e podporu pre pokyny mana¾éra okien wmw
|
||||
|
||||
--enable-lite
|
||||
odstráni veci, ktoré sa u¾ nachádzajú v desktopových prostrediach
|
||||
ako KDE a GNOME. Odstránené veci sú: zoznam okien, menu aplikácií,
|
||||
výber viacerých okien. Vedzte, ¾e u¾ nebudete schopní ukonèi»
|
||||
Window Maker; budete ho musie» zabi» pou¾itím signálu SIGTERM alebo
|
||||
ho ukonèi» z KDE. Neodporúèa sa povoli» túto vlastnos».
|
||||
|
||||
--enable-modelock
|
||||
podpora pre XKB nastavenie jazyka. Ak neviete, èo to je, pravdepo-
|
||||
dobne to nepotrebujete. (Slú¾i to na prepínanie rozlo¾enia kláves
|
||||
pomocou nového tlaèidla na hornom paneli okien.)
|
||||
|
||||
--enable-sound
|
||||
povolí podporu pre modul zvukových efektov
|
||||
|
||||
--disable-xpm
|
||||
zaká¾e podporu pre kni¾nicu XPM aj keï je dostupná na va¹om systéme.
|
||||
|
||||
--disable-png
|
||||
zaká¾e pou¾itie kni¾nice PNG
|
||||
|
||||
--disable-tiff
|
||||
zaká¾e pou¾itie kni¾nice TIFF
|
||||
|
||||
--disable-gif
|
||||
zaká¾e pou¾itie kni¾nice GIF
|
||||
|
||||
--disable-jpeg
|
||||
zaká¾e pou¾itie kni¾nice JPEG
|
||||
|
||||
--disable-shape
|
||||
zaká¾e tvarované okná (pre oclock, xeyes atï.)
|
||||
|
||||
|
||||
POZNÁMKY PRE ©PECIFICKÉ PLATFORMY:
|
||||
==================================
|
||||
|
||||
- DEC/Alpha
|
||||
|
||||
Nasledovný mail nie je prelo¾ený, ale hovorí sa v òom, ¾e
|
||||
_pravdepodobne_ nie je nutné konfigurova» Window Maker na
|
||||
Alphe s voµbou --disable-shm.
|
||||
|
||||
#>>>>>>>>>>>
|
||||
From: Anton Ivanov <aivanov@eu.level3.net>
|
||||
To: Marcelo E. Magallon <mmagallo@debian.org>
|
||||
Subject: Re: Is the WindowMaker package working ok on Alpha?
|
||||
|
||||
> Hi,
|
||||
>
|
||||
> I was reading some docs on the WindowMaker tarball, and found this:
|
||||
>
|
||||
> | - DEC/Alpha machines
|
||||
> | You might need to pass the --disable-shm flag to configure,
|
||||
> | like ./configure --disable-shm
|
||||
>
|
||||
> is anyone having problems with WindowMaker on Alpha? Can someone
|
||||
> please test this? Should the flag be passed when building on Alpha?
|
||||
|
||||
Disclaimer: alphas under my command have never run X and are least likely to
|
||||
suddenly start running it anytime soon.
|
||||
|
||||
Alpha used to have some ridiculously low amount of shared memory
|
||||
configured.
|
||||
So quite a lot of apps used to barf. Namely - cdrecord, mysql server, etc.
|
||||
|
||||
Check where is yours at the moment and raise it to a more appropriate
|
||||
value by either catting to the appropriate /proc entry or changing the
|
||||
/usr/src/linux/include/asm/shmparam.h.
|
||||
|
||||
Otherwise the shared memory on alpha should be fully functional and I
|
||||
see no reason to disable it. Mine are bumped up to 32 or more on most
|
||||
machines.
|
||||
|
||||
And If I recall correctly the comments in that file are actually
|
||||
wrong. Value is not bytes, but in machine size word. For alpha *8.
|
||||
|
||||
As I said - I do not run X on them so all #include "stdisclaimer.h"
|
||||
apply.
|
||||
#<<<<<<<<<<<<
|
||||
|
||||
|
||||
- SCO Unix - spustite configure takto
|
||||
CFLAGS="-belf -DANSICPP" ./configure
|
||||
|
||||
- SunOS, Solaris
|
||||
Ak máte nain¹alované gcc, spustite configure takto:
|
||||
CPP_PATH="gcc -E -x c" ./configure
|
||||
Cpp od Sunu chýbajú niektoré vlastnosti, ktoré Window Maker potrebuje,
|
||||
a to mô¾e spôsobi» problémy pri parsovaní konfiguraèných súborov.
|
||||
Je tie¾ mo¾né, ¾e budete musie» pou¾i» --with-libs-from a
|
||||
--with-incs-from na urèenie ciest k libtiff.
|
||||
Niekto mi mailoval, ¾e tie¾ /usr/local/lib musí by» prvá cesta v
|
||||
premennej LD_LIBRARY_PATH, aby to fungovalo.
|
||||
Ak máte Ultra Creator 3D alebo iný stroj s high-end grafikou,
|
||||
uistite sa, ¾e spú¹»ate iXy s 24-bitovou farebnou håbkou alebo
|
||||
mô¾ete ma» problémy s pomie¹anými farbami. Toto je chyba wmakera
|
||||
a bude opravená.
|
||||
|
||||
- GNU/Linux vo v¹eobecnosti
|
||||
Uistite sa, ¾e máte /usr/local/lib v /etc/ld.so.conf a ¾e ste
|
||||
po in¹talácii spustili ldconfig.
|
||||
Odin¹talujte v¹etky balíkované verzie Window Makera pred in¹talovaním
|
||||
novej verzie.
|
||||
|
||||
- RedHat GNU/Linux
|
||||
Systémy RedHat majú niekoµko nepríjemných problémov. Ak ich pou¾ívate,
|
||||
dodr¾ujte nasledovné kroky, alebo vám Window Maker nebude fungova»:
|
||||
|
||||
* ak máte nain¹alovaný Window Maker, ktorý je dodaný s RedHatom,
|
||||
pred upgadom ho odin¹talujte;
|
||||
|
||||
* uistite sa, ¾e nemáte premenné LANG a LINGUAS nastavené na en_RN;
|
||||
|
||||
* uistite sa, ¾e máte /usr/local/bin v premennej PATH;
|
||||
|
||||
* uistite sa, ¾e máte /usr/local/lib v /etc/ld.so.conf pred
|
||||
spustením ldconfig;
|
||||
|
||||
* ak máte problémy, v ktorých sa spomína chyba s --no-reexec,
|
||||
odin¹talujte libtool-1.2b a nain¹talujte libtool-1.3. libtool-1.3
|
||||
nájdete na ftp.gnu.org. Tie¾ si preèítajte èas» RIE©ENIE PROBLÉMOV.
|
||||
|
||||
|
||||
* uistite sa, ¾e máte symbolický odkaz z /usr/include/X11 na
|
||||
/usr/X11R6/include/X11 (ak nie, zadajte ln -s /usr/X11R6/include/X11
|
||||
/usr/include/X11 )
|
||||
|
||||
* uistite sa, ¾e /lib/cpp odkazuje na program cpp
|
||||
|
||||
Ak máte akékoµvek pochybnosti, prosím, neotáµajte a spojte sa
|
||||
s u¾ívateµskou podporou RedHatu. Radi vám odpovedia na v¹etky
|
||||
va¹e otázky týkajúce sa ich systému. Vedia toho o svojom
|
||||
systéme viac ako my (nepou¾ívame RedHat).
|
||||
|
||||
|
||||
- PowerPC MkLinux
|
||||
Musíte ma» poslednú verziu Xpmac. Star¹ie verzie majú asi chyby,
|
||||
ktoré spôsobujú zmrznutie celého systému.
|
||||
|
||||
- Debian GNU/Linux
|
||||
Ak chcete podporu JPEG a TIFF, uistite sa, ¾e máte nain¹talované
|
||||
libiff-dev a libjpeg-dev.
|
||||
|
||||
- SuSE GNU/Linux
|
||||
Ak ste si nain¹talovali balík Window Makera od SuSE, odin¹talujte
|
||||
ho pred pokusmi o skompilovanie wmakera, alebo mô¾ete ma» problémy.
|
||||
|
||||
- MetroX (neznáma verzia)
|
||||
MetroX má chybu, ktorá kazí obrázky, ktoré sú nastavené ako pozadie
|
||||
okien. Ak pou¾ívate MetroX a máte èudné problémy s textúrami,
|
||||
nepou¾ívajte textúry v horných li¹tách. Alebo pou¾ite iný X server.
|
||||
|
||||
|
||||
IN©TALÁCIA:
|
||||
===========
|
||||
|
||||
Kompilácia Window Makera
|
||||
------------------------
|
||||
Pre rýchly ¹tart, zadajte nasledovné príkazy v shelly:
|
||||
|
||||
./configure
|
||||
make
|
||||
|
||||
potom sa prihláste ako root a zadajte:
|
||||
|
||||
make install
|
||||
ldconfig
|
||||
|
||||
alebo ak chcete z binárnych súborov odstráni» symboly pre debugger a urobi»
|
||||
ich men¹ie, napí¹te miesto toho
|
||||
|
||||
make install-strip
|
||||
ldconfig
|
||||
|
||||
Toto skompiluje a nain¹taluje Window Maker so ¹tandardnými parametrami.
|
||||
|
||||
Ak si chcete prispôsobi» nastavenia kompilácie, mo¾ete to urobi» nasledovne:
|
||||
|
||||
1. (voliteµne) Pozrite sa na èas» MO®NOSTI CONFIGURE, kde sú
|
||||
uvedené mo¾nosti. Tie¾ spustite:
|
||||
|
||||
./configure --help
|
||||
|
||||
ktorý vám vypí¹e kompletný zoznam ostatných mo¾ných nastavení.
|
||||
|
||||
2. Spustite configure s nastaveniami, ktoré chcete. Napríklad,
|
||||
ak chcete pou¾íva» podporu pre KDE, zadajte:
|
||||
|
||||
./configure --enable-kde
|
||||
|
||||
3. (voliteµne) Otvorte si súbor src/wconfig.h vo svojom obµúbenom
|
||||
textovom editore a prejdite si ho, èi nenájdete nejaké nastavenia,
|
||||
ktoré chcete zmeni».
|
||||
|
||||
4. Kompilácia. Zadajte len:
|
||||
|
||||
make
|
||||
|
||||
5. Prihláste sa ako root (ak to nie je mo¾né, èítajte èas» "Nemám
|
||||
rootove heslo :-( ") a nain¹talujte Window Maker:
|
||||
|
||||
su root
|
||||
make install
|
||||
|
||||
|
||||
Nastavenia ¹pecifické pre u¾ívateµov
|
||||
------------------------------------
|
||||
|
||||
Nemusíte sa dr¾a» týchto in¹trukcií, ak robíte upgrade Window Makera zo
|
||||
star¹ej verzie, pokiaµ to nie je uvedené v súbore NEWS.
|
||||
|
||||
Ka¾dý u¾ívateµ na va¹om systéme, ktorý chce pou¾íva» Window Maker, musí
|
||||
urobi» nasledovné:
|
||||
|
||||
1. Nain¹talova» konfiguraèné súbory Window Makera do svojho
|
||||
domovského adresára:
|
||||
|
||||
wmaker.inst
|
||||
|
||||
wmaker.inst nain¹taluje konfiguraèné súbory Window Makera a nastaví
|
||||
iXy aby sa pri ¹tarte automaticky spustil Window Maker.
|
||||
|
||||
To je v¹etko!
|
||||
|
||||
Základné informácie o konfigurácii a iných veciach vám poskytne
|
||||
"man wmaker".
|
||||
|
||||
Pre hlb¹í úvod do Window Makera si preèítajte si U¾ívateµký manuál.
|
||||
|
||||
Tie¾ sa mô¾te pozrie» na FAQ.
|
||||
|
||||
|
||||
|
||||
Installing the extras package
|
||||
-----------------------------
|
||||
|
||||
Unpack WindowMaker-extra-<version-number>.tar.gz in /usr/local/share
|
||||
|
||||
You can get the file at ftp://ftp.windowmaker.info. 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.
|
||||
|
||||
|
||||
|
||||
Nemám rootove heslo :(
|
||||
----------------------
|
||||
|
||||
Ak nemáte práva roota, mô¾ete si nain¹talova» Window Maker do svojho
|
||||
domovského adresára. Na to musíte pou¾i» voµbu --prefix pre configure
|
||||
v druhom kroku kompilácie Window Makera. Tie¾ musíte pou¾i» voµbu
|
||||
--with-appspath, pomocou ktorej ¹pecifikujete cestu pre WPrefs.app.
|
||||
Príklad:
|
||||
|
||||
./configure --prefix=/home/jshome --with-appspath=/home/jshome/GNUstep/Applications
|
||||
|
||||
Poto pridajte adresár /home/jshome/bin do premennej PATH, /home/jshome/lib
|
||||
do premennej LD_LIBRARY_PATH a spustite bin/wmaker.inst
|
||||
|
||||
Samozrejme, predpokladá sa, ¾e /home/jshome nahradíte va¹im skutoèným
|
||||
domovským adresárom.
|
||||
|
||||
|
||||
UPGRADE
|
||||
=======
|
||||
|
||||
Ak robíte upgrade zo star¹ej verzie Window Makera:
|
||||
|
||||
1. Skofigurujte a skompilujte Window Maker ako v¾dy
|
||||
2. Nain¹talujte Window Maker (ale nespustite wmaker.inst)
|
||||
3. Preèítajte si súbor NEWS a ak je to potrebné, upravte
|
||||
svoje konfiguraèné súbory.
|
||||
|
||||
|
||||
RIE©ENIA PROBLÉMOV
|
||||
==================
|
||||
|
||||
Ak máte problémy poèas konfigurácie (spú¹»ania configure), napríklad
|
||||
nemo¾nos» pou¾i» grafickú kni¾nicu, o ktorej viete, ¾e ju máte nain¹talovanú,
|
||||
v súbore config.log nájdete príèinu problému.
|
||||
|
||||
== Error with loading fonts, even if they exist.
|
||||
|
||||
Skúste kompiláciu bez podpory NLS.
|
||||
|
||||
== Error when configuring
|
||||
|
||||
ltconfig: unrecognized option `--no-reexec'
|
||||
Try `ltconfig --help' for more information.
|
||||
configure: error: libtool configure failed
|
||||
|
||||
Odstáòte voµbu --no-reexec zo súborov aclocal.m4 a libPropList/aclocal.m4
|
||||
a spustite configure.
|
||||
Tie¾ sa uistite, ¾e autoconf a automake, ktoré máte nain¹talované, sú v
|
||||
týchto verziách:
|
||||
autoconf 2.13
|
||||
automake 1.4
|
||||
libtool 1.3
|
||||
|
||||
Nesmie to by» libtool 1.2b, ale libtool 1.3, zo stránok GNU.
|
||||
|
||||
== Cant find proplist.h or libPropList.something
|
||||
|
||||
Stiahnite a nain¹talujte si libPropList zo stránok uvedených
|
||||
niekde v tomto súbore.
|
||||
|
||||
|
||||
== configure doesn't detect libtiff, or other graphic libraries.
|
||||
|
||||
Odstráòte config.cache, spustite configure s pridanými nasledovnými voµbami
|
||||
(okrem iných, ktoré pou¾ívate):
|
||||
--with-libs-from="-L/usr/local/lib"
|
||||
--with-incs-from="-I/usr/local/include -I/usr/local/include/tiff"
|
||||
Vlo¾te cesty k va¹im grafickým kni¾niciam a zodpovedajúcim hlavièkovým
|
||||
súborom. Mô¾ete vlo¾i» viac ciest do ka¾dej z týchto volieb, ako je to
|
||||
uvedené v príklade --with-incs-from. Len ich oddeµte medzerou.
|
||||
|
||||
|
||||
== configure doesn't detect libXpm.
|
||||
|
||||
* Skontrolujte, èi máte symbolický odkaz z libXpm.so.4.9 na libXpm.so
|
||||
|
||||
|
||||
== Segmentation fault on startup
|
||||
|
||||
* Skontrolujte verziu libXpm, musíte ma» aspoò 4.7
|
||||
|
||||
* Skontrolujte, èi máte upravenú verziu ~/GNUstep/Defaults/WindowMaker
|
||||
|
||||
Ak si nie ste istí, skúste premenova» ~/GNUstep na ~/GNUtmp a spustite
|
||||
wmaker.inst
|
||||
|
||||
|
||||
== "...: your machine is misconfigured. gethostname() returned (none)"
|
||||
|
||||
* Meno va¹eho poèítaèa je nastavené na nieèo nesprávne, èo zaèína
|
||||
úvodzovkami. Preèítajte si man hostname a dozviete sa, ako to nastavi».
|
||||
|
||||
|
||||
== The root menu contains only 2 entries. ("XTerm" and "Exit...")
|
||||
|
||||
* Window Maker nevie nájs» cpp (C preprocesor). Ak sa vá¹ cpp nenachádza
|
||||
v /lib/cpp, upravte src/config.h a vlo¾te správnu cestu do CPP_PATH.
|
||||
|
||||
|
||||
== checking lex output file root... configure: error: cannot find output from true; giving up
|
||||
|
||||
* Preèítajte si èas» PO®IADAVKY v tomto súbore.
|
||||
|
||||
|
||||
MIESTNE NASTAVENIA/INTERNACIONALIZÁCIA
|
||||
======================================
|
||||
|
||||
Window Maker má podporu pre národné jazyky. Aby ste ju povolili, musíte
|
||||
skompilova» Window Maker s niekoµkými prídavnými parametrami.
|
||||
|
||||
|
||||
0 - Musíte ma» nain¹talovaný balík GNU gettext. Mô¾ete ho nájs» na
|
||||
adrese ftp://prep.ai.mit.edu/pub/gnu/gettext-nnn.tar.gz
|
||||
|
||||
Kroky 1 a¾ 3 mô¾ete vynecha», ak pou¾ívate skript Install
|
||||
|
||||
1 - Musíte urèi» jazyky, pre ktoré chcete podporu. Nastavte premennú
|
||||
LINGUAS na zoznam miestnych nastavení, ktoré chcete. Angliètina je
|
||||
podporovaná v¾dy. Príklad:
|
||||
|
||||
setenv LINGUAS "pt ja de"
|
||||
(csh)
|
||||
|
||||
alebo
|
||||
|
||||
export LINGUAS;LINGUAS="pt ja de"
|
||||
(sh)
|
||||
|
||||
Zoznam podporovaných miestnych nastavení nájdete v súbore po/README.
|
||||
Angliètina je implicitným jazykom.
|
||||
|
||||
Ak chcete preklada» a udr¾iava» súbory s miestnymi nastaveniami, preèítajte
|
||||
si súbor po/README.
|
||||
|
||||
2 - Naviac, ak vá¹ jazyk pou¾íva multi-byte znaky, napríklad Japonèina
|
||||
alebo Kórejèina, musíte nastaveniu MultiByteText priradi» YES v súbore
|
||||
~/GNUstep/Defaults/WMGLOBAL
|
||||
|
||||
3 - Konfigurujte, kompilujte a in¹talujte Window Maker ako zvyèajne.
|
||||
|
||||
4 - Urèité miesne nastavenia si zvolíte nastavením premennej LANG na
|
||||
to, ktoré chcete. Napríklad, ak chcete nastavi» slovenské miestne
|
||||
nastavenia, musíte spusti»
|
||||
|
||||
setenv LANG pt
|
||||
|
||||
(csh)
|
||||
|
||||
export LANG; LANG=pt
|
||||
|
||||
(Bourne sh a podobné)
|
||||
|
||||
Pozor: Ak máte nastavenú premennú LC_CTYPE, musíte ju zru¹i» pred
|
||||
spustením wmaker.
|
||||
|
||||
Window Maker hµadá súbory s definíciou menu v nasledovnom poradí
|
||||
(v tomto prípade pre brazílsku portugalèinu):
|
||||
|
||||
menu.pt_BR
|
||||
menu.pt
|
||||
menu
|
||||
|
||||
|
||||
5 - Ak si zvolíte jazyk, ktorý pou¾íva multi-byte znaky, musíte poriadne
|
||||
nastavi» svoje fonty. Preèítajte si manuálovú stránku k XCreateFontSet,
|
||||
kde nájdete viac detailov. Musíte v súbore ~/G/D/WindowMaker upravi» fonty
|
||||
pre horné li¹ty, menu a iné veci. Pre fonty pou¾ité v dialógových oknách
|
||||
upravte súbor ~/G/D/WMGLOBAL. Re»azce %d v menách fontov nesmú by»
|
||||
odstránené. Tie¾ mô¾ete pou¾i» skript wsetfont, ktorý to urobí za vás.
|
||||
|
||||
Napríklad mô¾e zada» v súbore ~/G/D/WindowMaker nasledovné:
|
||||
|
||||
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-*";
|
||||
|
||||
a v ~/G/D/WMGLOBAL:
|
||||
|
||||
SystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
BoldSystemFont = "-*-*-medium-r-normal-*-%d-*-*-*-*-*-*-*";
|
||||
|
||||
Tieto dva fonty sa pou¾ijú len v aplikáciách, ktoré pou¾ívajú WINGs
|
||||
(Window Maker a WPrefs.app)
|
||||
|
||||
Skript wsetfont vám umo¾ní nastavi» fonty jednoduch¹ím spôsobom. Pozrite
|
||||
sa priamo do jeho súboru pre bli¾¹ie informácie.
|
||||
|
||||
210
Install
210
Install
@@ -1,210 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# WindowMaker configuration and compilation script.
|
||||
#
|
||||
# Copyright (c) 1997, 1998 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
|
||||
}
|
||||
|
||||
|
||||
echo
|
||||
echo "========================"
|
||||
echo "WindowMaker Installation"
|
||||
echo "========================"
|
||||
echo
|
||||
echo "NOTE: If the installation procedure fails, read the INSTALL file and do"
|
||||
echo "the installation manually."
|
||||
perai
|
||||
|
||||
if test "$USER" != "root"; then
|
||||
echo "Warning: you must run this script as the root user."
|
||||
perai
|
||||
echo
|
||||
echo "Be sure to specify an installation path where you have"
|
||||
echo "write persmission."
|
||||
echo
|
||||
fi
|
||||
|
||||
|
||||
echo
|
||||
echo "Option Selection"
|
||||
echo "================"
|
||||
|
||||
######################## Sound
|
||||
|
||||
echo
|
||||
echo "Do you want sound support? Note that you need a module distributed"
|
||||
echo "separately to make it work. You can get it at:"
|
||||
echo "http://www.frontiernet.net/~southgat/wmsound"
|
||||
echo -n "<y/n> [y] "
|
||||
read SFX
|
||||
|
||||
if [ "x$SFX" = "x" -o "$SFX" = "y" -o "$SFX" = "Y" ]; then
|
||||
OPTIONS="$OPTIONS --enable-sound"
|
||||
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_LINGUAS]"
|
||||
read foo
|
||||
if test "x$foo" = "x"; 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
|
||||
|
||||
if [ "$MB" = "" -a "$i" = "ja" -o "$i" = "kr" ]; then
|
||||
echo
|
||||
echo "A language you selected needs multi-byte character support"
|
||||
echo "Do you want to enable it?"
|
||||
echo -n "<y/n> [n] "
|
||||
read MB
|
||||
if [ "$MB" = "y" -o "$MB" = "Y" ]; then
|
||||
OPTIONS="$OPTIONS --enable-kanji"
|
||||
fi
|
||||
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 WindowMaker? [$PREFIX]"
|
||||
echo "Don't change it if you don't know what you're doing."
|
||||
echo "(The default path will install WindowMaker in "
|
||||
echo "$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 WindowMaker into \"$foo\""
|
||||
echo
|
||||
else
|
||||
done=1
|
||||
PREFIX=$foo
|
||||
fi
|
||||
else
|
||||
done=1
|
||||
fi
|
||||
echo
|
||||
echo "$PREFIX/bin must be in the PATH environment variable of all users who use WindowMaker"
|
||||
perai
|
||||
done
|
||||
|
||||
OPTIONS="$OPTIONS --prefix=$PREFIX"
|
||||
|
||||
|
||||
###################### Build libPropList
|
||||
|
||||
if [ ! -d libPropList ]; then
|
||||
gzip -d -c libPropList.tar.gz | tar xf -
|
||||
fi
|
||||
|
||||
echo "-----------------------"
|
||||
echo "Building libPropList..."
|
||||
echo "-----------------------"
|
||||
cd libPropList
|
||||
if [ ! -f config.status ]; then
|
||||
./configure
|
||||
fi
|
||||
make
|
||||
cd ..
|
||||
|
||||
if [ ! -f libPropList/libPropList.a ]; then
|
||||
echo "Build of libPropList was not successfull. "
|
||||
exit
|
||||
fi
|
||||
|
||||
|
||||
##################### Configure
|
||||
echo "--------------------------"
|
||||
echo "Configuring WindowMaker..."
|
||||
echo "--------------------------"
|
||||
if [ `uname -s` = "SCO_SV" ]; then
|
||||
echo "CFLAGS=\"$CFLAGS -belf -DANSICPP\" ./configure $OPTIONS"
|
||||
CFLAGS="$CFLAGS -belf -DANSICPP" ./configure $OPTIONS
|
||||
else
|
||||
echo "CFLAGS=\"$CFLAGS $GCCFLAGS\" ./configure $OPTIONS"
|
||||
CFLAGS="$CFLAGS $GCCFLAGS" ./configure $OPTIONS
|
||||
fi
|
||||
|
||||
|
||||
#################### Compile
|
||||
echo "------------------------"
|
||||
echo "Compiling WindowMaker..."
|
||||
echo "------------------------"
|
||||
(cd src; make clean)
|
||||
make
|
||||
|
||||
echo "-------------------------"
|
||||
echo "Installing WindowMaker..."
|
||||
echo "-------------------------"
|
||||
|
||||
make install
|
||||
|
||||
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
|
||||
|
||||
52
MIRRORS
52
MIRRORS
@@ -1,10 +1,10 @@
|
||||
|
||||
WindowMaker FTP Mirror Sites
|
||||
============================
|
||||
Window Maker FTP Mirror Sites
|
||||
=======-=====================
|
||||
|
||||
Official Site (USA):
|
||||
--------------------
|
||||
ftp://ftp.windowmaker.org/
|
||||
ftp://ftp.windowmaker.info/
|
||||
|
||||
|
||||
Australia:
|
||||
@@ -35,20 +35,56 @@ 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 WindowMaker Distribution Packages
|
||||
=============================================
|
||||
Third Party Window Maker Distribution Packages
|
||||
==============================================
|
||||
|
||||
RedHat/RPM
|
||||
----------
|
||||
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.windowmaker.info/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/
|
||||
|
||||
|
||||
|
||||
16
Makefile.am
16
Makefile.am
@@ -1,14 +1,10 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc
|
||||
SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc\
|
||||
contrib
|
||||
|
||||
|
||||
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N MIRRORS Install acconfig.h\
|
||||
libPropList.tar.gz mkpatch
|
||||
|
||||
libPropList.tar.gz:
|
||||
-(cd libPropList; $(MAKE) distclean)
|
||||
-rm -f libPropList.tar.gz
|
||||
tar cf libPropList.tar libPropList
|
||||
gzip -9 libPropList.tar
|
||||
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N FAQ.I18N.cs FAQ.I18N.sk \
|
||||
INSTALL.cs INSTALL.fr INSTALL.es INSTALL.pt INSTALL.sk \
|
||||
README.definable-cursor README.pt MIRRORS COPYING.WTFPL mkpatch
|
||||
# libwmfun-0.0.3.tar.gz
|
||||
|
||||
|
||||
322
Makefile.in
322
Makefile.in
@@ -1,322 +0,0 @@
|
||||
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998 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 = /bin/sh
|
||||
|
||||
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
|
||||
|
||||
DISTDIR =
|
||||
|
||||
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@
|
||||
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@
|
||||
CC = @CC@
|
||||
CPP_PATH = @CPP_PATH@
|
||||
DFLAGS = @DFLAGS@
|
||||
GFXFLAGS = @GFXFLAGS@
|
||||
GFXLIBS = @GFXLIBS@
|
||||
I18N = @I18N@
|
||||
I18N_MB = @I18N_MB@
|
||||
ICONEXT = @ICONEXT@
|
||||
INTLIBS = @INTLIBS@
|
||||
LIBPL_INC_PATH = @LIBPL_INC_PATH@
|
||||
LIBPL_LIBS = @LIBPL_LIBS@
|
||||
LN_S = @LN_S@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MOFILES = @MOFILES@
|
||||
NLSDIR = @NLSDIR@
|
||||
PACKAGE = @PACKAGE@
|
||||
RANLIB = @RANLIB@
|
||||
REDUCE_APPICONS = @REDUCE_APPICONS@
|
||||
SHAPE = @SHAPE@
|
||||
SOUND = @SOUND@
|
||||
VERSION = @VERSION@
|
||||
WPMOFILES = @WPMOFILES@
|
||||
XCFLAGS = @XCFLAGS@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
XLFLAGS = @XLFLAGS@
|
||||
XLIBS = @XLIBS@
|
||||
XSHM = @XSHM@
|
||||
X_EXTRA_LIBS = @X_EXTRA_LIBS@
|
||||
X_LOCALE = @X_LOCALE@
|
||||
pixmapdir = @pixmapdir@
|
||||
wprefsdir = @wprefsdir@
|
||||
|
||||
SUBDIRS = wrlib WINGs src util po WindowMaker wmlib test WPrefs.app doc
|
||||
|
||||
EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N MIRRORS Install acconfig.h\
|
||||
libPropList.tar.gz mkpatch
|
||||
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 aclocal.m4 config.guess config.sub configure \
|
||||
configure.in install-sh missing mkinstalldirs
|
||||
|
||||
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
||||
TAR = tar
|
||||
GZIP = --best
|
||||
all: all-recursive all-am
|
||||
|
||||
.SUFFIXES:
|
||||
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||
cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
|
||||
$(ACLOCAL_M4): configure.in
|
||||
cd $(srcdir) && $(ACLOCAL)
|
||||
|
||||
config.status: $(srcdir)/configure
|
||||
$(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; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
(cd $$subdir && $(MAKE) $$target) \
|
||||
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||
done && test -z "$$fail"
|
||||
|
||||
mostlyclean-recursive clean-recursive distclean-recursive \
|
||||
maintainer-clean-recursive:
|
||||
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||
rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
rev="$$subdir $$rev"; \
|
||||
done; \
|
||||
for subdir in $$rev; do \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
(cd $$subdir && $(MAKE) $$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 \
|
||||
(cd $$subdir && $(MAKE) tags); \
|
||||
done
|
||||
|
||||
tags: TAGS
|
||||
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP)
|
||||
here=`pwd` && cd $(srcdir) \
|
||||
&& mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP)
|
||||
|
||||
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
|
||||
tags=; \
|
||||
here=`pwd`; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
|
||||
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) $(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) \
|
||||
&& $(MAKE) dvi \
|
||||
&& $(MAKE) check \
|
||||
&& $(MAKE) install \
|
||||
&& $(MAKE) installcheck \
|
||||
&& $(MAKE) dist
|
||||
-rm -rf $(distdir)
|
||||
@echo "========================"; \
|
||||
echo "$(distdir).tar.gz is ready for distribution"; \
|
||||
echo "========================"
|
||||
dist: distdir
|
||||
-chmod -R a+r $(distdir)
|
||||
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
|
||||
-rm -rf $(distdir)
|
||||
dist-all: distdir
|
||||
-chmod -R a+r $(distdir)
|
||||
GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir)
|
||||
-rm -rf $(distdir)
|
||||
distdir: $(DISTFILES)
|
||||
-rm -rf $(distdir)
|
||||
mkdir $(distdir)
|
||||
-chmod 777 $(distdir)
|
||||
@for file in $(DISTFILES); do \
|
||||
d=$(srcdir); \
|
||||
test -f $(distdir)/$$file \
|
||||
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||
done
|
||||
for subdir in $(SUBDIRS); do \
|
||||
test -d $(distdir)/$$subdir \
|
||||
|| mkdir $(distdir)/$$subdir \
|
||||
|| exit 1; \
|
||||
chmod 777 $(distdir)/$$subdir; \
|
||||
(cd $$subdir && $(MAKE) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
|
||||
|| exit 1; \
|
||||
done
|
||||
info: info-recursive
|
||||
dvi: dvi-recursive
|
||||
check: all-am
|
||||
$(MAKE) check-recursive
|
||||
installcheck: installcheck-recursive
|
||||
all-am: Makefile
|
||||
|
||||
install-exec: install-exec-recursive
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install-data: install-data-recursive
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install: install-recursive
|
||||
@:
|
||||
|
||||
uninstall: uninstall-recursive
|
||||
|
||||
install-strip:
|
||||
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||
installdirs: installdirs-recursive
|
||||
|
||||
|
||||
mostlyclean-generic:
|
||||
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||
|
||||
clean-generic:
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
-rm -f Makefile $(DISTCLEANFILES)
|
||||
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||
mostlyclean-am: mostlyclean-tags mostlyclean-generic
|
||||
|
||||
clean-am: clean-tags clean-generic mostlyclean-am
|
||||
|
||||
distclean-am: distclean-tags distclean-generic clean-am
|
||||
|
||||
maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
|
||||
distclean-am
|
||||
|
||||
mostlyclean: mostlyclean-recursive mostlyclean-am
|
||||
|
||||
clean: clean-recursive clean-am
|
||||
|
||||
distclean: distclean-recursive distclean-am
|
||||
-rm -f config.status
|
||||
|
||||
maintainer-clean: maintainer-clean-recursive maintainer-clean-am
|
||||
@echo "This command is intended for maintainers to use;"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
-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 dvi \
|
||||
installcheck all-am install-exec install-data install uninstall all \
|
||||
installdirs mostlyclean-generic distclean-generic clean-generic \
|
||||
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
|
||||
|
||||
|
||||
libPropList.tar.gz:
|
||||
-(cd libPropList; $(MAKE) distclean)
|
||||
-rm -f libPropList.tar.gz
|
||||
tar cf libPropList.tar libPropList
|
||||
gzip -9 libPropList.tar
|
||||
|
||||
# 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:
|
||||
401
README
401
README
@@ -1,146 +1,236 @@
|
||||
|
||||
WindowMaker X11 Window Manager
|
||||
|
||||
<http://windowmaker.org>
|
||||
<ftp://ftp.windowmaker.org>
|
||||
|
||||
|
||||
Alfredo K. Kojima
|
||||
<kojima@windowmaker.org>
|
||||
|
||||
Dan Pascu
|
||||
<dan@windowmaker.org>
|
||||
GNU Window Maker
|
||||
X11 Window Manager
|
||||
|
||||
<http://windowmaker.info>
|
||||
<ftp://ftp.windowmaker.info>
|
||||
|
||||
by
|
||||
|
||||
Alfredo K. Kojima
|
||||
|
||||
Dan Pascu
|
||||
|
||||
|
||||
|
||||
Web/FTP Master
|
||||
|
||||
Phillip Smith
|
||||
|
||||
|
||||
|
||||
Congratulations! You have purchased an extremely fine
|
||||
device that would give you thousands of years of trouble-free
|
||||
service, except that you undoubtably will destroy it via some
|
||||
typical bonehead consumer maneuver. Which is why we ask you
|
||||
to PLEASE FOR GOD'S SAKE READ THIS OWNER'S MANUAL CAREFULLY
|
||||
BEFORE YOU UNPACK THE DEVICE. YOU ALREADY UNPACKED IT, DIDN'T
|
||||
YOU? YOU UNPACKED IT AND PLUGGED IT IN AND TURNED IT ON AND
|
||||
FIDDLED WITH THE KNOBS, AND NOW YOUR CHILD, THE SAME CHILD WHO
|
||||
ONCE SHOVED A POLISH SAUSAGE INTO YOUR VIDEOCASSETTE RECORDER
|
||||
AND SET IT ON "FAST FORWARD", THIS CHILD ALSO IS FIDDLING
|
||||
WITH THE KNOBS, RIGHT? AND YOU'RE JUST NOW STARTING TO READ
|
||||
THE INSTRUCTIONS, RIGHT??? WE MIGHT AS WELL JUST BREAK THESE
|
||||
DEVICES RIGHT AT THE FACTORY BEFORE WE SHIP THEM OUT, YOU
|
||||
KNOW THAT?
|
||||
-- Dave Barry, "Read This First!"
|
||||
|
||||
Matthew Hawkins
|
||||
<matt@windowmaker.org>
|
||||
|
||||
Description
|
||||
===========
|
||||
|
||||
WindowMaker is a window manager 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) 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.
|
||||
|
||||
|
||||
User Guide
|
||||
==========
|
||||
Documentation
|
||||
=============
|
||||
|
||||
The WindowMaker User's Guide can be downloaded from the official ftp
|
||||
Read before asking.
|
||||
|
||||
* README files all over the source tree have info related to the stuff
|
||||
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...
|
||||
|
||||
* FAQ: Frequently Asked Questions. READ IT!!! FAQ.I18N is for
|
||||
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
|
||||
|
||||
|
||||
Directories & Files
|
||||
===================
|
||||
|
||||
o INSTALL contains installation instructions and some troubleshooting tips.
|
||||
|
||||
o Install is a script for configuring and compiling WindowMaker in a easy
|
||||
way.
|
||||
|
||||
o ChangeLog contains the changes since the last version
|
||||
|
||||
o BUGS contains a list of the currently known bugs
|
||||
|
||||
o FAQ is a list of frequently asked questions. Read it. I won't answer
|
||||
questions answered in it.
|
||||
|
||||
o NEWS is a list of user visible changes since the last version. Read it if
|
||||
you are upgrading.
|
||||
|
||||
o wmlib/ contains the library necessary to write applications that use
|
||||
WindowMaker specific features, like application defined menus. This library
|
||||
will be merged into WINGs in the future.
|
||||
|
||||
o WINGs/ contain the WINGs (WINGs Is Not GNUstep) tiny widget library. It is
|
||||
used by wmaker, but can be used by standalone programs as well.
|
||||
|
||||
o test/ contains a simple test program that shows some of the things that can
|
||||
be done with WindowMaker and wmlib
|
||||
|
||||
o wrlib/ contains the library used to do image manipulation (loading,
|
||||
dithering etc.) in WindowMaker. It can be used in other applications.
|
||||
|
||||
o util/ contains various utility programs.
|
||||
|
||||
o WPrefs/ contains the source code for the WindowMaker Preferences utility.
|
||||
Read the WPrefs/README file before using it.
|
||||
|
||||
o Configuration options can be found in the ~/GNUstep/Defaults/* files
|
||||
(after installation). The menus can be configured in
|
||||
~/GNUstep/Library/WindowMaker/menu
|
||||
|
||||
o The default configuration files for the system are installed by default in
|
||||
/usr/local/share/WindowMaker, along with some other data files.
|
||||
|
||||
o src/wconfig.h contains various compile time options you can change to
|
||||
select some options/features and things like the path for configuration
|
||||
directory.
|
||||
|
||||
o BUGFORM is a form you should fill to send a bugreport. Please use the
|
||||
form. It makes things easier to me and ensures that you give me a reasonable
|
||||
amount of information. This form should be sent to developers@windowmaker.org
|
||||
The User Guide explains how to use Window Maker, the configuration files
|
||||
and options.
|
||||
|
||||
|
||||
Mailing List
|
||||
============
|
||||
*** man pages
|
||||
|
||||
There is a mailing list for discussing WindowMaker at
|
||||
wmaker@linuxcenter.com To subscribe to it, send a message containing:
|
||||
Type "man wmaker" in the shell prompt to get general help about Window Maker
|
||||
|
||||
|
||||
|
||||
Directories & Files in the Source Tree
|
||||
======================================
|
||||
|
||||
* Install is a script for configuring and compiling Window Maker in a easy
|
||||
way (not that the normal way is difficult, but...).
|
||||
|
||||
* AUTHORS: the credits
|
||||
|
||||
* 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.
|
||||
|
||||
* util/ has various utility programs.
|
||||
|
||||
* WPrefs.app/ is the configuration program.
|
||||
|
||||
* src/wconfig.h has compile time options you can change to select some
|
||||
options/features and other stuff.
|
||||
|
||||
* WINGs/ NEXTSTEP lookalike widget library
|
||||
|
||||
* wrlib/ image processing library
|
||||
|
||||
* po/ has message catalogs wich are the translated versions of the messages
|
||||
displayed by Window Maker.
|
||||
|
||||
* docklib-x.x.tar.gz a library for writing dockapps
|
||||
|
||||
|
||||
HELP ME!!!
|
||||
==========
|
||||
|
||||
There is a mailing list for discussing Window Maker at
|
||||
wm-user@windowmaker.info To subscribe to it, send a message containing:
|
||||
subscribe
|
||||
in the subject and the body of the message to wmaker-request@linuxcenter.com
|
||||
in the subject of the message to wm-user-request@windowmaker.info
|
||||
|
||||
If you have some problem installing or using wmaker, it would be advisable
|
||||
to ask in the mailing list, as the probability of at least one of the 500+
|
||||
users there having the same problem as you (and solving it) is bigger than
|
||||
the three of us. The developers are subscribed to the mailing list, so we
|
||||
will read your post anyway (no need for cc:). For bug reports, fill
|
||||
the BUGFORM and send it to developers@windowmaker.org You can also use
|
||||
the bug tracker page at http://windowmaker.org/cgi-bin/bugs
|
||||
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.
|
||||
|
||||
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. You will
|
||||
be risking having your mail deleted before being read. Not everybody
|
||||
uses a browser to read email, wich makes your message an annoyance.
|
||||
There should be an option in your mail app to disable it.
|
||||
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.
|
||||
|
||||
|
||||
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.
|
||||
|
||||
Running multiple instances of WindowMaker
|
||||
=========================================
|
||||
|
||||
It is not a good idea to run more than one instance of WindowMaker
|
||||
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.
|
||||
|
||||
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 WindowMaker
|
||||
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. You can download it at:
|
||||
http://www.frontiernet.net/~southgat/wmsound
|
||||
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 WindowMaker with the --enable-sound configure
|
||||
Note that you must compile Window Maker with the --enable-sound configure
|
||||
flag and set the DisableSound option to NO.
|
||||
|
||||
|
||||
Performance Tuning
|
||||
==================
|
||||
|
||||
If you want to diminish WindowMaker's memory usage and improve performance,
|
||||
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:
|
||||
|
||||
- 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
|
||||
- turn on DisableAnimations
|
||||
- do not bind many shortcuts in the menu and keep only the essential items
|
||||
in the menu
|
||||
- turn on DisableClip
|
||||
@@ -148,47 +238,116 @@ bellow:
|
||||
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. Also, disable anti-aliased text support in ~/GNUstep/Defaults/WMGLOBAL.
|
||||
|
||||
|
||||
Copyrights
|
||||
==========
|
||||
Keyboard Mouse Control
|
||||
======================
|
||||
|
||||
WindowMaker is copyrighted by Alfredo K. Kojima and is licensed through the
|
||||
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.
|
||||
|
||||
To control the mouse the numeric keypad is used as follows:
|
||||
- 4 (left arrow), 7 (Home), 8 (up arrow), 9 (PgUp), 6 (right arrow),
|
||||
3 (PgDn), 2 (down arrow) and 1 (End) move the mouse to the corresponding
|
||||
direction;
|
||||
- holding one of the above keys and then holding the 5 key will move the
|
||||
pointer faster;
|
||||
- / will select the first mouse button (left button);
|
||||
- * will select the second mouse button (middle button);
|
||||
- - will select the third mouse button (right button);
|
||||
- 5 will do a click with the currently selected mouse button;
|
||||
- + will do a double-click with the currently selected button;
|
||||
- 0 (Ins) will click and hold the currently selected button;
|
||||
- . (Del) will release the currently selected button that was previously
|
||||
clicked with the 0 (Ins) key.
|
||||
|
||||
|
||||
The above key values work in a XFree86 3.2 (X11R6.1) X server but your
|
||||
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.
|
||||
|
||||
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".
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
Authors
|
||||
=======
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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 WindowMaker/README
|
||||
can be found in po/README and Window Maker/README
|
||||
|
||||
If you have any comments, fixes and bug reports (filled BUGFORMs) send them
|
||||
to kojima@windowmaker.org
|
||||
|
||||
|
||||
Musicware
|
||||
=========
|
||||
|
||||
If you use WindowMaker and *really* like it, please consider making my day
|
||||
by sending me a music CD (or a MiniDisc) 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 developers@windowmaker.info
|
||||
|
||||
|
||||
92
README.definable-cursor
Normal file
92
README.definable-cursor
Normal file
@@ -0,0 +1,92 @@
|
||||
|
||||
|
||||
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.
|
||||
|
||||
|
||||
Defining Your Own Cursors
|
||||
-------------------------
|
||||
|
||||
A cursor specification takes one of the following forms in the
|
||||
~/GNUstep/Defaults/WindowMaker file:
|
||||
|
||||
(none)
|
||||
(builtin, <cursor-name>)
|
||||
(bitmap, <bitmap-filename>, <mask-filename>)
|
||||
|
||||
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);
|
||||
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);
|
||||
|
||||
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:
|
||||
|
||||
xdpyinfo
|
||||
|
||||
and in the resulting output look for a line such as:
|
||||
|
||||
largest cursor: 64x64
|
||||
|
||||
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 and
|
||||
masks, see <http://www.pobox.com/~jmknoble/WindowMaker/cursors/>.
|
||||
|
||||
345
README.es
Normal file
345
README.es
Normal file
@@ -0,0 +1,345 @@
|
||||
|
||||
|
||||
|
||||
GNU Window Maker
|
||||
X11 Window Manager
|
||||
|
||||
<http://windowmaker.info>
|
||||
<ftp://ftp.windowmaker.info>
|
||||
|
||||
por
|
||||
|
||||
Alfredo K. Kojima
|
||||
|
||||
Dan Pascu
|
||||
|
||||
]d
|
||||
|
||||
|
||||
Web/FTP Master
|
||||
|
||||
Phillip Smith
|
||||
|
||||
|
||||
|
||||
¡Felicitaciones! Ha adquirido un dispositivo
|
||||
excelentísimo que le proporcionará miles de años de uso sin
|
||||
problemas, si no fuera porque indudablemente lo destruirá a
|
||||
través de alguna maniobra estúpida típica de consumidor. Por
|
||||
eso le pedimos por EL AMOR DE DIOS LEA ESTE MANUAL DEL
|
||||
PROPIETARIO CUIDADOSAMENTE ANTES DE DESEMPAQUETAR EL
|
||||
DISPOSITIVO. ¿YA LO DESEMPAQUETÓ, NO? LO DESEMPAQUETÓ Y LO
|
||||
ENCHUFÓ Y LO ENCENDIÓ Y TOQUETEÓ LAS PERILLAS, Y AHORA SU
|
||||
CHICO, EL MISMO CHICO QUE UNA VEZ METIÓ UNA SALCHICHA EN SU
|
||||
VIDEOCASETERA Y ACCIONÓ "AVANCE RÁPIDO", ESTE CHICO
|
||||
TAMBIÉN ESTÁ TUOQUETEANDO LAS PERILLAS, ¿CIERTO? Y RECIÉN
|
||||
AHORA ESTÁ COMENZANDO A LEER LAS INSTRUCCIONES, ¿¿¿CIERTO???
|
||||
NOSOTROS PODRÍAMOS SIMPLEMENTE ROMPER ESTOS DISPOSITIVOS EN LA
|
||||
FÁBRICA ANTES DE DESPACHARLOS, ¿SABE?
|
||||
-- Dave Barry, "¡Lea Esto Primero!"
|
||||
|
||||
|
||||
Descripción
|
||||
===========
|
||||
|
||||
Window Maker es el gestor de ventanas GNU para el Sistema de Ventanas X. Fue
|
||||
diseñado para emular la apariencia y funcionalidad de parte del GUI de NEXTSTEP(mr).
|
||||
Procura ser relativamente rápido y pequeño, rico en características, fácil de configurar
|
||||
y usar, con una simple y elegante apariencia sacada desde NEXTSTEP(mr).
|
||||
|
||||
Window Maker fue diseñado teniendo en mente la integración con GNUstep y por eso
|
||||
es el gestor de ventanas "oficial". Es también parte del proyecto GNU (www.gnu.org)
|
||||
. Lea mas sobre GNUstep más adelante en este archivo.
|
||||
|
||||
|
||||
Pistas (información dada por las aplicaciones para integrarse bien con el gestor de
|
||||
ventanas) para Motif(tm), OPEN LOOK(tm), KDE y GNOME también son soportados.
|
||||
Entonces puede reemplazar cualquiera de los gestores de ventana para estos entornos
|
||||
con Window Maker manteniendo la mayoría, si no todo, de la funcionalidad del
|
||||
gestor de ventanas nativo.
|
||||
|
||||
Window Maker antes se llamaba WindowMaker.
|
||||
|
||||
Window Maker no tiene relación con Windowmaker, el software para
|
||||
hacer ventanas y puertas.
|
||||
|
||||
|
||||
Documentación
|
||||
=============
|
||||
|
||||
Lea antes de preguntar.
|
||||
|
||||
* Los archivos README distribuidos por todas partes del árbol de fuentes
|
||||
contienen información relacionada al contenido en los directorios.
|
||||
|
||||
* INSTALL tiene instrucciones de instalación y algunos consejos cuando tenga
|
||||
algún problema. Significa que debería leerlo antes de la instalación.
|
||||
No fue escrito solo para ocupar espacio en el paquete...
|
||||
|
||||
* FAQ: Preguntas Frecuentes. LEALO!!! FAQ.I18N es para
|
||||
preguntas relacionadas con la internacionalización.
|
||||
|
||||
* NEWS: lista los cambios visibles por el usuario desde la versión anterior.
|
||||
Léalo si está actualizando.
|
||||
|
||||
* MIRRORS: algunos lugares alternativos donde puede obtener Window Maker,
|
||||
incluyendo paquetes de Window Maker específicos para ciertas plataformas.
|
||||
|
||||
* BUGFORM: uselo para enviar reportes de errores. Por favor uselo.
|
||||
|
||||
* ChangeLog: ¿que cambió desde la versión anterior?
|
||||
|
||||
* BUGS: lista de errores conocidos.
|
||||
|
||||
*** Tutorial
|
||||
|
||||
Hay un tutorial mantenido por Georges Tarbouriech en:
|
||||
|
||||
http://www.linuxfocus.org/~georges.t/
|
||||
|
||||
*** Guía del Usuario
|
||||
|
||||
La Guía del Usuario de Window Maker puede ser bajada desde el ftp oficial
|
||||
o por sitios web.
|
||||
Puede también ser vista en formato HTML en:
|
||||
|
||||
http://people.delphi.com/crc3419/WMUserGuide/index.htm
|
||||
|
||||
La Guía del Usuario explica como usar Window Maker, los archivos de configuración
|
||||
y opciones.
|
||||
|
||||
*** man pages
|
||||
|
||||
Tipee "man wmaker" en el prompt del shell para obtener ayuda general sobre Window Maker.
|
||||
|
||||
|
||||
Directorios y Archivos en el Árbol de Fuentes
|
||||
=============================================
|
||||
|
||||
* Install es un script para configurar y compilar Window Maker de una forma
|
||||
fácil (no es que la forma normal sea difícil, pero...).
|
||||
|
||||
* AUTORES: los créditos
|
||||
|
||||
* TODO: planes para el futuro.
|
||||
|
||||
* contrib/ tiene algunos parches aportados que no están soportados por Window Maker
|
||||
porque entran en conflicto con la filosofía de diseño de los desarrolladores o por
|
||||
alguna otra razón.
|
||||
|
||||
* util/ tiene varios programas utilitarios.
|
||||
|
||||
* WPrefs.app/ es el programa de configuración.
|
||||
|
||||
* src/wconfig.h posee opciones de compilación que puede cambiar para
|
||||
seleccionar algunas opciones/caracteristicas y otras cosas.
|
||||
|
||||
* WINGs/ biblioteca widget para imitación de NEXTSTEP.
|
||||
|
||||
* wrlib/ biblioteca de procesamiento de imagen.
|
||||
|
||||
* po/ posee catálogos de mensajes que son las versiones traducidas de los mensajes
|
||||
mostrados por Window Maker.
|
||||
|
||||
* docklib-x.x.tar.gz es una biblioteca para escribir dockapps.
|
||||
|
||||
SOCORRO!!!
|
||||
==========
|
||||
|
||||
Hay una lista de correo para discutir sobre Window Maker en
|
||||
wm-user@windowmaker.info. Para suscribirse, envie un mensaje que contenga:
|
||||
|
||||
subscribe
|
||||
en el tema del mensaje a wm-user-request@windowmaker.info
|
||||
|
||||
Si tiene algun problema, pregunte aquí (después de leer los docs, por supuesto). Es
|
||||
más probable que las personas de la lista sepan contestar sus preguntas
|
||||
que nosotros. Para reportes de errores use el BUGFORM.
|
||||
|
||||
Si tiene un problema con una versión precompilada de Window Maker
|
||||
(rpm, deb etc), primero pregunte a la persona que hizo el paquete.
|
||||
|
||||
NOTA IMPORTANTE: cuando pida ayuda (en la lista de correo o a los desarrolladores,
|
||||
directamente) *siempre* envie información sobre el sistema que está usando. Puede
|
||||
usar la sección de información del sistema al final del BUGFORM como una guía.
|
||||
Otra cosa: por favor no envie correo HTML.
|
||||
|
||||
También hay un canal de IRC #windowmaker en openprojects. Únase aquí,
|
||||
conecte su cliente de irc a irc.openprojects.net, irc.linux.com o algún otro
|
||||
servidor de esa red.
|
||||
|
||||
GNUstep
|
||||
=======
|
||||
|
||||
GNUStep es un completo sistema de desarrollo orientado a objetos, basado en la
|
||||
especificación OpenStep liberada por NeXT(tm) (ahora Apple(tm) y Sun(tm)). Ello
|
||||
proveerá todo lo que se necesita para producir aplicaciones multiplataforma,
|
||||
orientadas a objetos, gráficas (y no gráficas); suministrando dentro de otras cosas,
|
||||
bibliotecas base del sistema, una estructura de alto nivel para aplicaciones GUI que
|
||||
usan un modelo de imagenes de tipo Display PostScript(tm) (DGS), objetos para acceso
|
||||
a bases de datos relacionales, objetos distribuidos y un entorno de desarrollo gráfico,
|
||||
con herramientas como un modelador de interfaces, un sistema para administración del
|
||||
proyecto (central de proyecto) y otras herramientas.
|
||||
|
||||
El sistema de desarrollo de GNUStep será usado para crear un entorno de usuario,
|
||||
con todo lo necesario para una completa interface gráfica de usuario, tal como
|
||||
un visualizador de archivos, editores de texto y otras aplicaciones. Note que el
|
||||
entorno de usuario (o "entorno de escritorio") es solo un pequeña parte de todo
|
||||
el proyecto GNUStep y por lo tanto no "compite" con otros proyectos como KDE o GNOME,
|
||||
simplemente porque son cosas completamente diferentes.
|
||||
|
||||
Para más información sobre el proyecto GNUStep, visite: http://www.gnustep.org y
|
||||
http://gnustep.current.nu
|
||||
|
||||
|
||||
Ejecutando multiples instancias de Window Maker
|
||||
===============================================
|
||||
|
||||
No es una buena idea eejcutar más de una instancia de Window Maker desde
|
||||
el mismo usuario (ya que wmaker usará los mismos archivos de configuración)
|
||||
al mismo tiempo. Podría obtener un comportamiento inesperado cuando Window
|
||||
Maker actualiza sus archivos de configuración.
|
||||
|
||||
Si de verdad desea hacer esto, intente ejecutar Window Maker con la opción
|
||||
de linea de comando --static ya que así no actualizará o cambiará ninguno de los
|
||||
archivos de configuración.
|
||||
|
||||
Soporte para Sonido
|
||||
===================
|
||||
|
||||
El sonido es soportado por los sistemas Linux y FreeBSD con el uso de
|
||||
un módulo distribuido separadamente llamado WSoundServer. Hay también
|
||||
una herramienta de configuracion gráfica para definir sus sonidos llamada
|
||||
WSoundPref.
|
||||
Puede bajar esto en:
|
||||
http://shadowmere.student.utwente.nl/
|
||||
|
||||
Note que debe compilar Window Maker con el parámetro --enable-sound
|
||||
y definir la opción DisableSound a NO.
|
||||
|
||||
|
||||
Ajuste de Rendimiento.
|
||||
=====================
|
||||
Si quiere disminuir el uso de memoria por parte de Window Maker y mejorar el
|
||||
rendimiento, manteniendo una linda apariencia y buena funcionalidad, siga los
|
||||
items de abajo:
|
||||
|
||||
- use texturas sólidas para todo, principalmente barras de título y menúes.
|
||||
Si quiere un escritorio de aspecto lindo, use el estilo Tradicional.
|
||||
- Apague NewStyle y Superfluous
|
||||
- No una muchos atajos al menú y mantenga solo los items esenciales en el menú.
|
||||
- Active DisableClip
|
||||
- edite wconfig.h y desactive el NUMLOCK_HACK y lo mismo con las características
|
||||
que no use (tenga en mente que algunos de los #defines podrían no funcionar,
|
||||
ya que ellos no están completamente soportados). Asegúrese de mantener siempre
|
||||
Numlock y ScrollLock apagados.
|
||||
- Active DisableAnimations. Puede también #undefine ANIMATIONS en wconfig.h
|
||||
- quite las entradas por defecto IconPath y PixmapPath para contener solo las
|
||||
rutas que en verdad tiene en su sistema.
|
||||
- no use imágenes grandes en el fondo raíz.
|
||||
- quite el soporte para los formatos de imagen que no use.
|
||||
- para reducir el uso de la memoria, desactive el caché de ícono, definiendo
|
||||
la variable de entorno RIMAGE_CACHE a 0. Si quiere aumentar el rendimiento
|
||||
a expensas del uso de la memoria, defina este valor a un valor igual al
|
||||
número de íconos distintos que use.
|
||||
|
||||
Control del Mouse por Teclado
|
||||
=============================
|
||||
|
||||
Muchas personas preguntan sobre agregar control por teclado al mouse, como
|
||||
en fvwm, pero Window Maker no tendrá tal característica. La extensión XKB
|
||||
soporta simulación de mouse desde el teclado, de una manera mucho más poderosa
|
||||
que cualquier otra simulación hecha por un administrador de ventanas.
|
||||
|
||||
Para activarlo, presione la combinación de teclas Control+Shift+NumLock o
|
||||
Shift+NumLock. Debiera escuchar el beep del parlante. Para desactivarlo,
|
||||
haga lo mismo.
|
||||
|
||||
Para controlar el mouse el teclado numérico se usa así:
|
||||
- 4 (flecha izquierda), 7 (Home), 8 (flecha arriba), 9 (PgUP), 6 (flecha derecha),
|
||||
3 (PgDn), 2 (flecha abajo) y 1 (Fin) mueve el mouse a la correspondiente
|
||||
dirección;
|
||||
- sosteniendo una de las teclas de arriba y luego sosteniendo la tecla 5 moverá
|
||||
el puntero más rápido;
|
||||
- / seleccionará el primer botón del mouse (botón izquierdo);
|
||||
- * seleccionará el segundo botón del mouse (botón del medio);
|
||||
- - seleccionará el tercer botón del mouse (botón derecho);
|
||||
- 5 hará un click con el botón actualmente seleccionado del mouse;
|
||||
- + hará un doble click con el botón actualmente seleccionado;
|
||||
- 0 (Ins) cliqueará y mantendrá el botón seleccionado actualmente;
|
||||
- . (Del) liberará el botón seleccionado actualmente que fue anteriormente
|
||||
cliqueado con la tecla 0 (Ins).
|
||||
|
||||
Los valores anteriores de las teclas funcionarán en un servidor X XFree86 3.2
|
||||
(X11R6.1) pero su alcance puede variar.
|
||||
|
||||
Como hacer un gdb backtrace
|
||||
===========================
|
||||
|
||||
Backtraces pueden ayudarnos a arreglar errores que hicieron que Window Maker falle.
|
||||
Si encuentra un bug que hace fallar a Window Maker, por favor envie un backtrace con su
|
||||
reporte de error.
|
||||
|
||||
Para hacer un backtrace útil, necesita un archivo core con información de depuración
|
||||
producida por Window Maker cuando falló. Debería haber sido instalado sin stripping también.
|
||||
|
||||
Para compilar wmaker con información de depuración:
|
||||
|
||||
./configure
|
||||
make CFLAGS=-g
|
||||
|
||||
Si obtiene el cuadro de diálogo que le dice que wmaker falló y le
|
||||
pregunta que hacer, respóndale "Abortar y dejar un archivo core"
|
||||
|
||||
script
|
||||
cd src
|
||||
gdb .libs/wmaker path_to_the_core_file
|
||||
|
||||
Luego, en el prompt gdb escriba "bt". Salga de gdb escribiendo "quit"
|
||||
y luego, en el prompt del shell, scriba "exit"
|
||||
|
||||
El archivo llamado typescript contendrá el backtrace.
|
||||
|
||||
Derechos de Autor y Descargo de Responsabilidad
|
||||
===============================================
|
||||
|
||||
Window Maker está registrado por Alfredo K. Kojima y está licensiado por la
|
||||
Licensia Pública General GNU. Lea el archivo COPYING para leer la licensia
|
||||
completa.
|
||||
|
||||
Los íconos que son distribuidos con este programa y fueron hechos por Marco
|
||||
van Hylckama Vlieg, están licenciados por la Licencia Pública General GNU.
|
||||
Lea el archivo COPYING para leer la licencia completa.
|
||||
|
||||
Los íconos listados en COPYING.WTFPL y son distribuidos en este programa
|
||||
fueron hechos por Banlu Kemiyatorn (]d), están licenciados por la
|
||||
"do What The Fuck you want to Public License". Lea el archivo COPYING.WTFPL
|
||||
para leer la licencia completa.
|
||||
|
||||
NeXT, OpenStep y NEXTSTEP son marcas registradas de NeXT Computer, Inc.
|
||||
Todas las otras marcas registradas son propiedad de sus respectivos dueños.
|
||||
|
||||
Los autores se reservan el derecho de hacer cambios en el software sin previo
|
||||
aviso.
|
||||
|
||||
Autores
|
||||
=======
|
||||
|
||||
Alfredo K. Kojima <kojima@windowmaker.info>
|
||||
Dan Pascu <dan@windowmaker.info>
|
||||
]d <id@windowmaker.info>
|
||||
|
||||
Por favor no nos haga preguntas antes de leer la documentación (especialmente
|
||||
la FAQ, este archivo y los archivos INSTALL) y sobre cosas "cool" que ve en
|
||||
las capturas de pantalla del escritorio de las personas.
|
||||
|
||||
El archivo AUTHORS contiene una lista de las personas que han contribuido
|
||||
con el proyecto. El nombre de las personas que han ayudado con localization
|
||||
(traducción) se puede encontrar en po/README y Window Maker/README
|
||||
|
||||
Si tiene algún comentario, arreglos y reportes de errores (complete BUGFORMs)
|
||||
y enviémelos a developers@windowmaker.info
|
||||
|
||||
|
||||
|
||||
traducido por Efraín Maximiliano Palermo <max_drake2001@yahoo.com.ar>
|
||||
351
README.pt
Normal file
351
README.pt
Normal file
@@ -0,0 +1,351 @@
|
||||
|
||||
|
||||
GNU Window Maker
|
||||
Gerenciador de Janelas X11
|
||||
|
||||
<http://windowmaker.info>
|
||||
<ftp://ftp.windowmaker.info>
|
||||
|
||||
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.info. Para inscrever-se, mande uma mensagem
|
||||
contendo:
|
||||
subscribe
|
||||
no campo de assunto da mensagem para wm-user-request@windowmaker.info
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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.info>
|
||||
Dan Pascu <dan@windowmaker.info>
|
||||
]d <id@windowmaker.info>
|
||||
|
||||
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.info
|
||||
|
||||
|
||||
Traduzido por: Ricardo Sartori <sartori@inf.ufsc.br>
|
||||
73
TODO
73
TODO
@@ -1,50 +1,71 @@
|
||||
remake wrlib rule to not compile with -fomit-frame-pointer and stuff
|
||||
if its added to CFLAGS
|
||||
|
||||
Do ASAP:
|
||||
========
|
||||
- fix bestvisual selection code. Broken.
|
||||
- add a dialog to let user choose if we should restart, restart twm or continue crashing on crash. Do not forget to check if wmaker is already fully running.
|
||||
- fix stacking. buggy again
|
||||
+ ICCCM compliant stuff: find what is missing
|
||||
- WM_COLORMAP_NOTIFY clientmessage
|
||||
- fix RemakeStackList() to account for transient windows
|
||||
- change CommitStacking() on AddToStackingList() to more optimized thing
|
||||
- differential update of appmenu
|
||||
- make unhide app map windows in the same stacking order they were before
|
||||
hiding
|
||||
- blink border of clients with UrgencyHint set between red and black
|
||||
- finish session stuff
|
||||
- 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:
|
||||
===========
|
||||
- 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
|
||||
- support for X11R6.4 extension for getting extra visual info in wrlib's
|
||||
automatic best context guessing
|
||||
- docklet to control AccessX (keyboard accessibility) functions
|
||||
- rewrite all redundant stuff to use WINGs
|
||||
- resizebartexture option
|
||||
- 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.
|
||||
- clickonclientarearaisewindow
|
||||
- edge resistance (with timer)
|
||||
- save client supplied icons in ~/GNUstep/.AppInfo/ClientIcons/ and
|
||||
use them by default
|
||||
- GNUstepWMAttributes update in propertynotify
|
||||
+ investigate memory leaks
|
||||
- make Docked apps with WM_CLIENT_MACHINE be launched from respective
|
||||
machines (also put a marking showing it's remote launched)
|
||||
- handle change of CLIENT_LEADER property
|
||||
- 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 wc?
|
||||
- -statefile cmd arg to specify path for WMState file (multiple instance
|
||||
support)
|
||||
- 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:
|
||||
===============
|
||||
- virtual desktop
|
||||
- virtual workspace
|
||||
- optimize for size
|
||||
- make dithering in 8bpp better
|
||||
|
||||
|
||||
Never: (so, dont even bother to ask)
|
||||
======
|
||||
- different themes for each workspace. Unless you give us a SGI/Power Onyx
|
||||
with 2 CPUs ;). Different workspacebacks for each workspace is being
|
||||
considered, but don't hold your breath.
|
||||
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.
|
||||
somewhere. This is *terrible* behaviour. And it's not just IMO.
|
||||
- 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
|
||||
a relatively new standard and nobody, AFAIK, complies with it (not even
|
||||
twm as people tend to think). It has some neat things, but many of the new
|
||||
stuff is really weird and tricky to implement, not to say unworthy (read the
|
||||
specs and you'll see). This is not bad, since I think it is very unlikely
|
||||
that a client that requires it exists... Anyway, if we get an "official"
|
||||
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
|
||||
- dynamically loadable everything
|
||||
|
||||
|
||||
4
WINGs/.cvsignore
Normal file
4
WINGs/.cvsignore
Normal file
@@ -0,0 +1,4 @@
|
||||
Makefile Makefile.in
|
||||
get-wings-flags get-wutil-flags
|
||||
.libs *.pc
|
||||
.psrc .inslog2 tca.map tca.log pchdir *.rpt
|
||||
3
WINGs/BUGS
Normal file
3
WINGs/BUGS
Normal file
@@ -0,0 +1,3 @@
|
||||
- filepanel does not reread / . If you add new files in / they will not be
|
||||
visible until the program is restarted. Closing and reopening the file
|
||||
panel does not help.
|
||||
557
WINGs/ChangeLog
557
WINGs/ChangeLog
@@ -1,3 +1,560 @@
|
||||
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:
|
||||
............................
|
||||
|
||||
- WARNING: semantic of bags has changed!
|
||||
An index assigned to an item will always keep that index unless
|
||||
you insert an item before it.
|
||||
|
||||
For example:
|
||||
bag = WMCreateBag();
|
||||
WMSetInBag(bag, 10, "bla");
|
||||
That code will put "bla" in index 10, instead of 0, as it used to be.
|
||||
- fixed WMInsertInBag(). It ignored index, and always put the new item at end.
|
||||
- added WMSaveUserDefaults().
|
||||
- rewrote WMPopUpButton to use WMMenuItem
|
||||
- added WMGetPopUpButtonMenuItem(WMPopUpButton *bPtr, int index)
|
||||
- WMSortListItemsWithComparer(WMList *lPtr, (int)(f)(const void*, const void*))
|
||||
- WMSortBrowserColumnWithComparer()
|
||||
- fixed bug with sorting list items.
|
||||
- fixed bug in handling keyboard input associated with selection and
|
||||
notification sending.
|
||||
- filepanel puts dirs on top of list (Wolff <wolff@cybercable.fr>)
|
||||
- added WMReplaceInBag (Wolff <wolff@cybercable.fr>)
|
||||
- added vertical views and multiple views in WMSplitView (Wolff <wolff@cybercable.fr>)
|
||||
- changed values of parameter values of WMSplitViewConstrainProc()
|
||||
- configurable default fontsize patch (Igor P. Roboul <igor@mordor.myip.org>)
|
||||
- fixed a bug that crashed the programm when a popup button was scrolled.
|
||||
- fixed a bug that caused incorrect drawing position of the popup indicator.
|
||||
- fixed a bug that prevented selecting no item (-1) in a popup button.
|
||||
- an assertion will be raised if the program tries to select a popup button
|
||||
item that is beyond the total number of items present in the popup button.
|
||||
- changed names of functions for SplitView to be consistent. Some contained
|
||||
SubView while other Subview. Now all have Subview.
|
||||
- fixed a bug in how input events were posted. Establishing 2 or more input
|
||||
handlers for the same file descriptor, handling different (read/write/except)
|
||||
events, caused wrong handlers to be called.
|
||||
- Reimplemented the input and idle handlers with WMBag to avoid a functional
|
||||
problem with them: inability to remove handlers next to the called one, from
|
||||
the called handler itself. Trying to do this with the old version caused the
|
||||
program to crash.
|
||||
- changed wrealloc behaviour to be like this: new = wrealloc(old, new_size);
|
||||
1. if old is NULL, return wmalloc(new_size).
|
||||
2. if new_size is 0, call wfree(old), and return NULL.
|
||||
3. if both old is a valid pointer and new_size>0, call realloc.
|
||||
- added wstrerror(int errnum) to return the string associated with errnum.
|
||||
- new wsyserrorwithcode(int error, const char* fmt, ...), similar to
|
||||
wsyserror(), but printing the message for the specified error code.
|
||||
- added 3 new classes: WMData, WMHost and WMConnection
|
||||
- fixed a big memory leak in the color panel code (from Pascal Hofstee).
|
||||
- added scrolling to tabview
|
||||
|
||||
changes since wmaker 0.61.0:
|
||||
............................
|
||||
|
||||
- added WMGetTextFieldFont()
|
||||
- escape key in panels (craig nellist <crn@ozemail.com.au>)
|
||||
- applied patch with fixes and enhancements to textfield
|
||||
(Franck Wolff <wolff@cybercable.fr>)
|
||||
- changed WMList to use WMBag internally, instead of a linked list
|
||||
- replaced WMAddSortedListItem() with WMSortListItems()
|
||||
- replaced WMAddSortedBrowserItem() with WMSortBrowserColumn()
|
||||
|
||||
changes since wmaker 0.60.0:
|
||||
............................
|
||||
|
||||
- added WMScreenWidth() and WMScreenHeight() functions.
|
||||
- fixed some problems when compiling with non gcc compilers.
|
||||
- added WMSetTextFieldFont()
|
||||
- added WMSetButtonImageDefault() (craig nellist <crn@ozemail.com.au>)
|
||||
- added WMBag (array/list)
|
||||
- added libWUtil, a library that is a subset of libWINGs. It contains utils
|
||||
that can be used in writing non-GUI programs. They include: hashes,
|
||||
notifications, input/idle/timer handlers, user defaults database handling,
|
||||
memory handling, application resource handling, etc.
|
||||
All the non-GUI stuff from libWINGs is present.
|
||||
Still linWINGs contain all this stuff so if you use libWINGs, you don't
|
||||
need to link against libWUtil too.
|
||||
One notable aspect of libWUtil is that it has a modified version of the
|
||||
event handling function. It is named WHandleEvents() and will handle all
|
||||
input/idle/timer events the app has.
|
||||
If your app has a permanent input handler (as for example a socket a server
|
||||
is listening on), then the main loop of the app can be:
|
||||
while(1) {
|
||||
WHandleEvents();
|
||||
}
|
||||
but if there is no permanent input handler, you need to add some delay to
|
||||
avoid a too high cpu load by your program:
|
||||
while(1) {
|
||||
WHandleEvents();
|
||||
wusleep(5000);
|
||||
}
|
||||
A permanent input handler is one that is established when the program starts
|
||||
and is present until the program exits.
|
||||
One that is deleted and later reinstalled, is not considered permanent.
|
||||
This difference is because if there is some input handler, the function will
|
||||
block until some event appears, while if there is no input handler the
|
||||
function will return almost immediately (after handling the timer/idle
|
||||
stuff).
|
||||
|
||||
Except the stuff declared in WUtil.h, the following functions declared in
|
||||
WINGs.h are also present in libWUtil (you will need to #include <WINGs.h>
|
||||
if you use one of these):
|
||||
WMInitializeApplication(char *applicationName, int *argc, char **argv);
|
||||
WMSetResourcePath(char *path);
|
||||
WMGetApplicationName();
|
||||
WMPathForResourceOfType(char *resource, char *ext);
|
||||
WMAddTimerHandler(int milliseconds, WMCallback *callback, void *cdata);
|
||||
WMDeleteTimerWithClientData(void *cdata);
|
||||
WMDeleteTimerHandler(WMHandlerID handlerID);
|
||||
WMAddIdleHandler(WMCallback *callback, void *cdata);
|
||||
WMDeleteIdleHandler(WMHandlerID handlerID);
|
||||
WMAddInputHandler(int fd, int condition, WMInputProc *proc,
|
||||
void *clientData);
|
||||
WMDeleteInputHandler(WMHandlerID handlerID);
|
||||
- added progress indicator widget
|
||||
- Changed WMSetWindowUPosition() and WMSetWindowUSize() to
|
||||
WMSetWindowInitialPosition() and WMSetWindowInitialSize() respectively,
|
||||
for better naming conventions.
|
||||
|
||||
|
||||
changes since wmaker 0.53.0:
|
||||
............................
|
||||
|
||||
- added balloon help
|
||||
- fixed a bug with setting initial path in browsers.
|
||||
- added WMSetButtonImageDimsWhenDisabled()
|
||||
- changed simple callback/notifications to delegate-like stuff. Affected
|
||||
widgets are:
|
||||
WMBrowser
|
||||
- WMSetBrowserFillProc() was replaced with WMSetBrowserDelegate
|
||||
- WMBrowserDidScrollNotification was replaced with a delegate callback
|
||||
|
||||
WMTextField (not completed yet)
|
||||
The notifications will still work, but using the delegate is preferable
|
||||
|
||||
How to convert old code to delegate callbacks:
|
||||
1 - create a variable (static or dynamic) of the type of the
|
||||
delegate for the widget type.
|
||||
2 - Replace the notification observers with the equivalent
|
||||
delegate callbacks.
|
||||
3 - Put pointers to the callbacks in the delegate variable.
|
||||
|
||||
Take a look in wfilepanel.c to see how it is used there.
|
||||
|
||||
- changed W_ViewProcedureTable to delegates
|
||||
This will only affect user created widgets. If you have a custom
|
||||
widget, you will need to update the callbacks and the declaration
|
||||
of the W_ViewProcedureTable variable to be a W_ViewDelegate,
|
||||
which is declared in WINGsP.h To setup the delegate, assign
|
||||
the delegate variable to view->delegate.
|
||||
|
||||
- WMTextField
|
||||
Removed all the didChange notifications that were sent when the text
|
||||
was changed programmatically. Only changes made by user interaction
|
||||
will be notified now. If you need the old behaviour, send notifications
|
||||
manually when you change the text.
|
||||
|
||||
- added WMTabView
|
||||
- added WMGetColorPanelColor(WMColorPanel *panel)
|
||||
- made WMGetUDStringForKey() to only return a reference to the string, not a
|
||||
wstrdup()'ed copy. DO NOT FREE IT ANYMORE!
|
||||
- added MultiByteText option to userdefaults file to control use of multibyte
|
||||
string drawing functions
|
||||
- renamed WMCreateFont() to WMCreateFontSet()
|
||||
- renamed WMCreateFontInDefaultEncoding() to WMCreateNormalFont()
|
||||
- added WMCreateFont() with different semantics
|
||||
|
||||
|
||||
changes since wmaker 0.52.0:
|
||||
............................
|
||||
|
||||
- added int WMGetBrowserMaxVisibleColumns(WMBrowser *bPtr);
|
||||
|
||||
|
||||
changes since wmaker 0.51.2:
|
||||
............................
|
||||
|
||||
- added WMColorWellDidChangeNotification
|
||||
- added wfindfileinarray()
|
||||
- fixed bug in window title setting
|
||||
(MANOME Tomonori <manome@itlb.te.noda.sut.ac.jp>)
|
||||
|
||||
changes since wmaker 0.51.1:
|
||||
............................
|
||||
|
||||
- wusergnusteppath() will return a statically allocated string now.
|
||||
DO NOT FREE IT ANYMORE!!
|
||||
|
||||
|
||||
|
||||
changes since wmaker 0.51.0:
|
||||
............................
|
||||
|
||||
- applied c++ compat header patch from Martynas Kunigelis <mkunigelis@alna.lt>
|
||||
- added WMSetTextFieldBeveled()
|
||||
- removed W_GC() : use WMColorGC() instead
|
||||
- added WMCreatePixmap()
|
||||
- changed WMSetTextFieldEnabled() to WMSetTextFieldEditable()
|
||||
|
||||
changes since wmaker 0.50.1:
|
||||
............................
|
||||
|
||||
- fixed various bugs
|
||||
- added patch from Franck Wolff <frawolff@club-internet.fr>, with
|
||||
many fixes and enhancements
|
||||
- added notification queues, asynchronous notifications etc.
|
||||
- added WMSetBrowserDoubleAction()
|
||||
- fixed list double click action
|
||||
|
||||
changes since wmaker 0.50.2:
|
||||
............................
|
||||
|
||||
- added wsetabort() - look WUtil.h
|
||||
- fixed bug in WMList resize
|
||||
- added notification sending when changing textfield programatically
|
||||
- removed WMHideWindow()
|
||||
- fixed bug in WMCloseWindow()
|
||||
- added textfield selection patch
|
||||
- added color panel code
|
||||
- added auto name completion for the file panel
|
||||
- added function to select text range, and to set cursor position in text
|
||||
fields programatically
|
||||
|
||||
changes since wmaker 0.20.3:
|
||||
............................
|
||||
|
||||
- added WMSetSliderImage(), WMSetSliderKnobThickness()
|
||||
- added WMGetListItemHeight()
|
||||
- added WMListDidScrollNotification
|
||||
- added WSetColorWellBordered()
|
||||
- added hacky color dragging in colorwell
|
||||
- added poll() support in WMNextEvent. WARNING: the stuff needed for
|
||||
WMAddInputHandler() is not yet implemented for the poll stuff
|
||||
- added WMSetFilePanelAccessoryView(), WMGetFilePanelAccessoryView()
|
||||
- added WMSetPopUpButtonEnabled()
|
||||
- added WMGetLabelImage()
|
||||
- autoscroll for popup button menus
|
||||
- added WMDrawPixmap()
|
||||
- WARNING: changed parameter list for WMListDrawProc
|
||||
|
||||
changes since wmaker 0.20.2:
|
||||
............................
|
||||
|
||||
- WMSetBrowserMaxVisibleColumns() - untested
|
||||
|
||||
|
||||
|
||||
changes since wmaker 0.20.0:
|
||||
............................
|
||||
|
||||
- added generic object field for WMListItem. This is for hanging generic
|
||||
clientdata
|
||||
|
||||
|
||||
changes since wmaker 0.20.0:
|
||||
............................
|
||||
|
||||
|
||||
2
WINGs/Documentation/.cvsignore
Normal file
2
WINGs/Documentation/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile Makefile.in
|
||||
.psrc .inslog2 tca.map tca.log pchdir *.rpt
|
||||
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 = no-dependencies
|
||||
|
||||
EXTRA_DIST = README.connection
|
||||
|
||||
51
WINGs/Documentation/README.connection
Normal file
51
WINGs/Documentation/README.connection
Normal file
@@ -0,0 +1,51 @@
|
||||
Methods of handling WMConnectionDidDieNotification notification events
|
||||
(same for WMConnectionDidTimeoutNotification)
|
||||
----------------------------------------------------------------------
|
||||
|
||||
Once your program got this notification (you need to install an observer for
|
||||
it), there are some ways to handle it:
|
||||
|
||||
1. Make your observer enqueue a new notification in the ASAP queue, and the
|
||||
observer for this new notification (it can be the same function if you
|
||||
arrange to distinguish between the two cases), should remove the connection.
|
||||
You can also close the connection before enqueuing the new notification to
|
||||
the ASAP queue, but is not strictly necessarily, since it will be closed
|
||||
when the observer for the new enqueued notification will be called and you
|
||||
will call the close/remove function there. This is just to make sure your
|
||||
connection will be silent, and won't generate new events until you reach
|
||||
that point.
|
||||
This is by far the best method, since it will assure you that if you
|
||||
enqueue more than one notification to remove the same connection, they will
|
||||
be coalesced, and called only once.
|
||||
|
||||
2. In your observer, put the died/closed connection in an array or bag, and
|
||||
destroy all the connections present in the array/bag, in your main loop,
|
||||
after you call the WHandleEvents()/WMHandleEvent(). Also closing the
|
||||
connection can be done before putting the connection in the array/bag, but
|
||||
is optional as noted above. In this case you need to make sure you don't
|
||||
put in the array/bag the same connection more than once, in case the
|
||||
DieNotification is sent more that once to you. This is automagically solved
|
||||
by method 1.
|
||||
|
||||
3. In case it's your only connection, and you plan to exit if it was closed or
|
||||
died, then you can safely close/remove it, and exit. As long as you no
|
||||
longer access it, there is no problem.
|
||||
|
||||
4. Make you observer remove the connection. Then make sure that after that
|
||||
point your code no longer tries to access that connection (this usually
|
||||
means until your code gets back to the main loop). This is almost always
|
||||
very hard to achive and subject to hidden errors. I do not recommend this
|
||||
way of handling the died notification. It is ugly and very complicated to
|
||||
handle if the program is in a very deeply nested function when it finds out
|
||||
that the connection died. If you use it and get plenty of SIGSEGVs then you
|
||||
know why. This method was not presented here to be used, but to show what
|
||||
should be avoided in dealing with the died notification, in case someone
|
||||
gets the idea to try it this way.
|
||||
|
||||
|
||||
Note: read/write operations means to use our read/write functions (like
|
||||
WMGetMessage()/WMSendMessage()), not the C library ones read()/write().
|
||||
Note2: removing a connection is done by WMDestroyConnection(), while
|
||||
WMCloseConnection() only closes the socket, and removed any pending
|
||||
queues and timers on the connection.
|
||||
|
||||
5
WINGs/Examples/.cvsignore
Normal file
5
WINGs/Examples/.cvsignore
Normal file
@@ -0,0 +1,5 @@
|
||||
Makefile Makefile.in
|
||||
connect server fontl puzzle UserTime.plist
|
||||
colorpick
|
||||
.libs
|
||||
.psrc .inslog2 tca.map tca.log pchdir *.rpt
|
||||
41
WINGs/Examples/Makefile.am
Normal file
41
WINGs/Examples/Makefile.am
Normal file
@@ -0,0 +1,41 @@
|
||||
## automake input file for WINGs - Examples
|
||||
|
||||
AUTOMAKE_OPTIONS = no-dependencies
|
||||
|
||||
|
||||
noinst_PROGRAMS = connect server fontl puzzle colorpick
|
||||
|
||||
|
||||
LDADD= $(top_builddir)/WINGs/libWINGs.a $(top_builddir)/wrlib/libwraster.la \
|
||||
@XFTLIBS@ @INTLIBS@
|
||||
|
||||
colorpick_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a
|
||||
|
||||
fontl_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a
|
||||
|
||||
puzzle_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a
|
||||
|
||||
connect_DEPENDENCIES = $(top_builddir)/WINGs/libWUtil.a
|
||||
|
||||
connect_LDADD = $(top_builddir)/WINGs/libWUtil.a @LIBRARY_SEARCH_PATH@ \
|
||||
@NETLIBS@ @INTLIBS@
|
||||
|
||||
server_DEPENDENCIES = $(top_builddir)/WINGs/libWUtil.a
|
||||
|
||||
server_LDADD = $(top_builddir)/WINGs/libWUtil.a @LIBRARY_SEARCH_PATH@ \
|
||||
@NETLIBS@ @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_srcdir)/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;
|
||||
}
|
||||
172
WINGs/Examples/connect.c
Normal file
172
WINGs/Examples/connect.c
Normal file
@@ -0,0 +1,172 @@
|
||||
/*
|
||||
* WINGs connect.c: example how to create a network client using WMConnection
|
||||
*
|
||||
* Copyright (c) 1999-2003 Dan Pascu
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <WINGs/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, /* canResumeSending */
|
||||
NULL, /* didCatchException */
|
||||
connectionDidDie, /* didDie */
|
||||
didInitialize, /* didInitialize */
|
||||
didReceiveInput, /* didReceiveInput */
|
||||
NULL /* didTimeout */
|
||||
};
|
||||
|
||||
void wAbort(Bool foo)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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 = "34567";
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
98
WINGs/Examples/fontl.c
Normal file
98
WINGs/Examples/fontl.c
Normal file
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
* 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)(uintptr_t) d, (int)(uintptr_t) d, (int)(uintptr_t) 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];
|
||||
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((int)(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;
|
||||
}
|
||||
661
WINGs/Examples/server.c
Normal file
661
WINGs/Examples/server.c
Normal file
@@ -0,0 +1,661 @@
|
||||
/*
|
||||
* WINGs server.c: example how to create a network server using WMConnection
|
||||
*
|
||||
* Copyright (c) 2001-2003 Dan Pascu
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <WINGs/WINGs.h>
|
||||
|
||||
#define _(P) P
|
||||
#define MAXCMD_SIZE 512
|
||||
|
||||
char *SEConnectionShouldBeRemovedNotification = "SEConnectionShouldBeRemovedNotification";
|
||||
|
||||
static void didReceiveInput(ConnectionDelegate * self, WMConnection * cPtr);
|
||||
|
||||
static void connectionDidDie(ConnectionDelegate * self, WMConnection * cPtr);
|
||||
|
||||
static void connectionDidTimeout(ConnectionDelegate * self, WMConnection * cPtr);
|
||||
|
||||
extern char *SEConnectionShouldBeRemovedNotification;
|
||||
|
||||
static WMUserDefaults *timeDB = NULL;
|
||||
static char *ServerAddress = NULL;
|
||||
static char *ServerPort = NULL;
|
||||
static WMArray *allowedHostList = NULL;
|
||||
static WMArray *clientConnections = NULL;
|
||||
static WMConnection *serverPtr = NULL;
|
||||
|
||||
static ConnectionDelegate socketDelegate = {
|
||||
NULL, /* client data */
|
||||
NULL, /* canResumeSending */
|
||||
NULL, /* didCatchException */
|
||||
connectionDidDie, /* didDie */
|
||||
NULL, /* didInitialize */
|
||||
didReceiveInput, /* didReceiveInput */
|
||||
connectionDidTimeout /* didTimeout */
|
||||
};
|
||||
|
||||
void wAbort(Bool foo)
|
||||
{
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void printHelp(char *progname)
|
||||
{
|
||||
printf(_("usage: %s [options]\n\n"), progname);
|
||||
puts(_(" --help print this message"));
|
||||
puts(_(" --listen [address:]port only listen on the specified address/port"));
|
||||
puts(_(" --allow host1[,host2...] only allow connections from listed hosts\n"));
|
||||
puts(_(" By default server listens on all interfaces and port 34567, unless"
|
||||
" something\nelse is specified with the --listen option. If address is"
|
||||
" omitted or the keyword\n'Any' is used, it will listen on all interfaces else"
|
||||
" only on the specified one.\n\nFor example --listen localhost: will"
|
||||
" listen on the default port 34567, but only\non connections comming"
|
||||
" in through the loopback interface.\n\n Also by default the server"
|
||||
" listens to incoming connections from any host,\nunless a list of"
|
||||
" hosts is given with the --allow option, in which case it will\nreject"
|
||||
" connections not comming from those hosts.\nThe list of hosts is comma"
|
||||
" separated and should NOT contain ANY spaces."));
|
||||
}
|
||||
|
||||
static void enqueueConnectionForRemoval(WMConnection * cPtr)
|
||||
{
|
||||
WMNotification *notif;
|
||||
|
||||
/*don't release notif here. it will be released by queue after processing */
|
||||
notif = WMCreateNotification(SEConnectionShouldBeRemovedNotification, cPtr, NULL);
|
||||
WMEnqueueNotification(WMGetDefaultNotificationQueue(), notif, WMPostASAP);
|
||||
}
|
||||
|
||||
static int sendMessage(WMConnection * cPtr, char *message)
|
||||
{
|
||||
WMData *aData;
|
||||
int res;
|
||||
|
||||
if (WMGetConnectionState(cPtr) != WCConnected)
|
||||
return -1;
|
||||
|
||||
aData = WMCreateDataWithBytes(message, strlen(message));
|
||||
res = WMSendConnectionData(cPtr, aData);
|
||||
WMReleaseData(aData);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static Bool enqueueMessage(WMConnection * cPtr, char *message)
|
||||
{
|
||||
WMData *aData;
|
||||
Bool res;
|
||||
|
||||
if (WMGetConnectionState(cPtr) != WCConnected)
|
||||
return False;
|
||||
|
||||
aData = WMCreateDataWithBytes(message, strlen(message));
|
||||
res = WMEnqueueConnectionData(cPtr, aData);
|
||||
WMReleaseData(aData);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static char *findDelimiter(char *data, const char *endPtr)
|
||||
{
|
||||
wassertrv(data < endPtr, NULL);
|
||||
|
||||
while (data < endPtr && *data != '\n' && *data != '\r' && *data != ';' && *data != '\0')
|
||||
data++;
|
||||
|
||||
if (data < endPtr)
|
||||
return data;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static WMArray *getAvailableMessages(WMConnection * cPtr)
|
||||
{
|
||||
char *ptr, *crtPos, *buffer;
|
||||
const char *bytes, *endPtr;
|
||||
WMData *aData, *receivedData, *holdData;
|
||||
WMRange range;
|
||||
WMArray *messages;
|
||||
int length;
|
||||
|
||||
receivedData = WMGetConnectionAvailableData(cPtr);
|
||||
if (!receivedData)
|
||||
return NULL;
|
||||
if ((length = WMGetDataLength(receivedData)) == 0) {
|
||||
WMReleaseData(receivedData);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
holdData = (WMData *) WMGetConnectionClientData(cPtr);
|
||||
if (holdData) {
|
||||
WMAppendData(holdData, receivedData);
|
||||
WMReleaseData(receivedData);
|
||||
WMSetConnectionClientData(cPtr, NULL);
|
||||
aData = holdData;
|
||||
} else {
|
||||
aData = receivedData;
|
||||
}
|
||||
|
||||
length = WMGetDataLength(aData);
|
||||
bytes = (char *)WMDataBytes(aData);
|
||||
endPtr = bytes + length;
|
||||
|
||||
messages = WMCreateArrayWithDestructor(1, wfree);
|
||||
crtPos = (char *)bytes;
|
||||
while (crtPos < endPtr && (ptr = findDelimiter(crtPos, endPtr)) != NULL) {
|
||||
range.position = (crtPos - bytes);
|
||||
range.count = (ptr - crtPos);
|
||||
if (range.count > MAXCMD_SIZE) {
|
||||
/* Hmmm... The message is too long. Possibly that someone is
|
||||
* flooding us, or there is a dumb client which do not know
|
||||
* who is talking to. */
|
||||
sendMessage(cPtr, "Command too long\n\r");
|
||||
WMFreeArray(messages);
|
||||
WMReleaseData(aData);
|
||||
WMCloseConnection(cPtr);
|
||||
enqueueConnectionForRemoval(cPtr);
|
||||
return NULL;
|
||||
}
|
||||
buffer = wmalloc(range.count + 1);
|
||||
WMGetDataBytesWithRange(aData, buffer, range);
|
||||
buffer[range.count] = '\0';
|
||||
WMAddToArray(messages, buffer);
|
||||
crtPos = ptr;
|
||||
while (crtPos < endPtr && (*crtPos == '\n' || *crtPos == '\r' ||
|
||||
*crtPos == '\t' || *crtPos == '\0' ||
|
||||
*crtPos == ';' || *crtPos == ' ')) {
|
||||
crtPos++;
|
||||
}
|
||||
}
|
||||
|
||||
if (crtPos < endPtr) {
|
||||
range.position = (crtPos - bytes);
|
||||
range.count = (endPtr - crtPos);
|
||||
if (range.count > MAXCMD_SIZE) {
|
||||
/* Flooooooding!!!! */
|
||||
sendMessage(cPtr, "Message too long\n\r");
|
||||
WMFreeArray(messages);
|
||||
WMReleaseData(aData);
|
||||
WMCloseConnection(cPtr);
|
||||
enqueueConnectionForRemoval(cPtr);
|
||||
return NULL;
|
||||
}
|
||||
holdData = WMGetSubdataWithRange(aData, range);
|
||||
WMSetConnectionClientData(cPtr, holdData);
|
||||
}
|
||||
WMReleaseData(aData);
|
||||
|
||||
if (WMGetArrayItemCount(messages) == 0) {
|
||||
WMFreeArray(messages);
|
||||
messages = NULL;
|
||||
}
|
||||
return messages;
|
||||
}
|
||||
|
||||
static void complainAboutBadArgs(WMConnection * cPtr, char *cmdName, char *badArgs)
|
||||
{
|
||||
char *buf = wmalloc(strlen(cmdName) + strlen(badArgs) + 100);
|
||||
|
||||
sprintf(buf, _("Invalid parameters '%s' for command %s. Use HELP for"
|
||||
" a list of commands.\n"), badArgs, cmdName);
|
||||
sendMessage(cPtr, buf);
|
||||
wfree(buf);
|
||||
}
|
||||
|
||||
static void sendUpdateMessage(WMConnection * cPtr, char *id, int time)
|
||||
{
|
||||
char *buf = wmalloc(strlen(id) + 100);
|
||||
|
||||
sprintf(buf, "%s has %i minutes left\n", id, time);
|
||||
sendMessage(cPtr, buf);
|
||||
wfree(buf);
|
||||
}
|
||||
|
||||
static void showId(WMConnection * cPtr)
|
||||
{
|
||||
sendMessage(cPtr, "Server example based on WMConnection\n");
|
||||
}
|
||||
|
||||
static void showHelp(WMConnection * cPtr)
|
||||
{
|
||||
char *buf = wmalloc(strlen(WMGetApplicationName()) + 16);
|
||||
|
||||
sprintf(buf, _("%s commands:\n\n"), WMGetApplicationName());
|
||||
|
||||
enqueueMessage(cPtr, _("\n"));
|
||||
enqueueMessage(cPtr, buf);
|
||||
enqueueMessage(cPtr, _("GET <id>\t- return time left (in minutes) " "for user with id <id>\n"));
|
||||
enqueueMessage(cPtr, _("SET <id> <time>\t- set time limit to <time> " "minutes for user with id <id>\n"));
|
||||
enqueueMessage(cPtr, _("ADD <id> <time>\t- add <time> minutes " "for user with id <id>\n"));
|
||||
enqueueMessage(cPtr, _("SUB <id> <time>\t- subtract <time> minutes " "for user with id <id>\n"));
|
||||
enqueueMessage(cPtr, _("REMOVE <id>\t- remove time limitations for " "user with id <id>\n"));
|
||||
enqueueMessage(cPtr, _("LIST\t\t- list all users and their " "corresponding time limit\n"));
|
||||
enqueueMessage(cPtr, _("ID\t\t- returns the Time Manager " "identification string\n"));
|
||||
enqueueMessage(cPtr, _("EXIT\t\t- exits session\n"));
|
||||
enqueueMessage(cPtr, _("QUIT\t\t- exits session\n"));
|
||||
enqueueMessage(cPtr, _("HELP\t\t- show this message\n\n"));
|
||||
/* Just flush the queue we made before */
|
||||
WMFlushConnection(cPtr);
|
||||
wfree(buf);
|
||||
}
|
||||
|
||||
static void listUsers(WMConnection * cPtr)
|
||||
{
|
||||
WMPropList *userList;
|
||||
char *id;
|
||||
int i, time;
|
||||
|
||||
userList = WMGetUDKeys(timeDB);
|
||||
|
||||
for (i = 0; i < WMGetPropListItemCount(userList); i++) {
|
||||
id = WMGetFromPLString(WMGetFromPLArray(userList, i));
|
||||
time = WMGetUDIntegerForKey(timeDB, id);
|
||||
sendUpdateMessage(cPtr, id, time);
|
||||
}
|
||||
|
||||
WMReleasePropList(userList);
|
||||
}
|
||||
|
||||
static void setTimeForUser(WMConnection * cPtr, char *cmdArgs)
|
||||
{
|
||||
char *id;
|
||||
int i, time;
|
||||
|
||||
id = wmalloc(strlen(cmdArgs));
|
||||
if (sscanf(cmdArgs, "%s %d", id, &time) != 2) {
|
||||
complainAboutBadArgs(cPtr, "SET", cmdArgs);
|
||||
wfree(id);
|
||||
return;
|
||||
}
|
||||
if (time < 0)
|
||||
time = 0;
|
||||
|
||||
WMSetUDIntegerForKey(timeDB, time, id);
|
||||
|
||||
for (i = 0; i < WMGetArrayItemCount(clientConnections); i++) {
|
||||
cPtr = WMGetFromArray(clientConnections, i);
|
||||
sendUpdateMessage(cPtr, id, time);
|
||||
}
|
||||
wfree(id);
|
||||
}
|
||||
|
||||
static void addTimeToUser(WMConnection * cPtr, char *cmdArgs)
|
||||
{
|
||||
char *id;
|
||||
int i, time, newTime;
|
||||
|
||||
id = wmalloc(strlen(cmdArgs));
|
||||
if (sscanf(cmdArgs, "%s %d", id, &time) != 2) {
|
||||
complainAboutBadArgs(cPtr, "ADD", cmdArgs);
|
||||
wfree(id);
|
||||
return;
|
||||
}
|
||||
|
||||
newTime = WMGetUDIntegerForKey(timeDB, id) + time;
|
||||
if (newTime < 0)
|
||||
newTime = 0;
|
||||
|
||||
WMSetUDIntegerForKey(timeDB, newTime, id);
|
||||
|
||||
for (i = 0; i < WMGetArrayItemCount(clientConnections); i++) {
|
||||
cPtr = WMGetFromArray(clientConnections, i);
|
||||
sendUpdateMessage(cPtr, id, newTime);
|
||||
}
|
||||
wfree(id);
|
||||
}
|
||||
|
||||
static void subTimeFromUser(WMConnection * cPtr, char *cmdArgs)
|
||||
{
|
||||
char *id;
|
||||
int i, time, newTime;
|
||||
|
||||
id = wmalloc(strlen(cmdArgs));
|
||||
if (sscanf(cmdArgs, "%s %d", id, &time) != 2) {
|
||||
complainAboutBadArgs(cPtr, "SUB", cmdArgs);
|
||||
wfree(id);
|
||||
return;
|
||||
}
|
||||
|
||||
newTime = WMGetUDIntegerForKey(timeDB, id) - time;
|
||||
if (newTime < 0)
|
||||
newTime = 0;
|
||||
|
||||
WMSetUDIntegerForKey(timeDB, newTime, id);
|
||||
|
||||
for (i = 0; i < WMGetArrayItemCount(clientConnections); i++) {
|
||||
cPtr = WMGetFromArray(clientConnections, i);
|
||||
sendUpdateMessage(cPtr, id, newTime);
|
||||
}
|
||||
wfree(id);
|
||||
}
|
||||
|
||||
static void removeTimeForUser(WMConnection * cPtr, char *cmdArgs)
|
||||
{
|
||||
char *ptr;
|
||||
int i;
|
||||
|
||||
if (cmdArgs[0] == '\0') {
|
||||
sendMessage(cPtr, _("Missing parameter for command REMOVE."
|
||||
" Use HELP for a list of commands.\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
ptr = cmdArgs;
|
||||
while (*ptr && *ptr != ' ' && *ptr != '\t')
|
||||
ptr++;
|
||||
*ptr = '\0';
|
||||
|
||||
WMRemoveUDObjectForKey(timeDB, cmdArgs);
|
||||
|
||||
for (i = 0; i < WMGetArrayItemCount(clientConnections); i++) {
|
||||
cPtr = WMGetFromArray(clientConnections, i);
|
||||
sendUpdateMessage(cPtr, cmdArgs, -1);
|
||||
}
|
||||
}
|
||||
|
||||
static void getTimeForUser(WMConnection * cPtr, char *cmdArgs)
|
||||
{
|
||||
char *ptr;
|
||||
int time;
|
||||
|
||||
if (cmdArgs[0] == '\0') {
|
||||
sendMessage(cPtr, _("Missing parameter for command GET." " Use HELP for a list of commands.\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
ptr = cmdArgs;
|
||||
while (*ptr && *ptr != ' ' && *ptr != '\t')
|
||||
ptr++;
|
||||
*ptr = '\0';
|
||||
|
||||
if (WMGetUDObjectForKey(timeDB, cmdArgs) != NULL)
|
||||
time = WMGetUDIntegerForKey(timeDB, cmdArgs);
|
||||
else
|
||||
time = -1;
|
||||
|
||||
sendUpdateMessage(cPtr, cmdArgs, time);
|
||||
}
|
||||
|
||||
static void handleConnection(WMConnection * cPtr)
|
||||
{
|
||||
char *command, *ptr, *cmdArgs, *buffer;
|
||||
WMArray *commands;
|
||||
int i;
|
||||
|
||||
commands = getAvailableMessages(cPtr);
|
||||
if (!commands)
|
||||
return;
|
||||
|
||||
for (i = 0; i < WMGetArrayItemCount(commands); i++) {
|
||||
command = WMGetFromArray(commands, i);
|
||||
while (*command && (*command == ' ' || *command == '\t'))
|
||||
command++;
|
||||
ptr = command;
|
||||
while (*ptr && *ptr != ' ' && *ptr != '\t')
|
||||
ptr++;
|
||||
if (*ptr) {
|
||||
*ptr = '\0';
|
||||
ptr++;
|
||||
}
|
||||
while (*ptr && (*ptr == ' ' || *ptr == '\t'))
|
||||
ptr++;
|
||||
|
||||
cmdArgs = ptr;
|
||||
|
||||
fprintf(stderr, "Command: '%s', args: '%s'\n", command, cmdArgs);
|
||||
|
||||
if (strcasecmp(command, "quit") == 0 || strcasecmp(command, "exit") == 0) {
|
||||
sendMessage(cPtr, "Bye\n");
|
||||
WMCloseConnection(cPtr);
|
||||
enqueueConnectionForRemoval(cPtr);
|
||||
WMFreeArray(commands);
|
||||
return;
|
||||
} else if (strcasecmp(command, "id") == 0) {
|
||||
showId(cPtr);
|
||||
} else if (strcasecmp(command, "help") == 0) {
|
||||
showHelp(cPtr);
|
||||
} else if (strcasecmp(command, "list") == 0) {
|
||||
listUsers(cPtr);
|
||||
} else if (strcasecmp(command, "set") == 0) {
|
||||
setTimeForUser(cPtr, cmdArgs);
|
||||
} else if (strcasecmp(command, "add") == 0) {
|
||||
addTimeToUser(cPtr, cmdArgs);
|
||||
} else if (strcasecmp(command, "sub") == 0) {
|
||||
subTimeFromUser(cPtr, cmdArgs);
|
||||
} else if (strcasecmp(command, "remove") == 0) {
|
||||
removeTimeForUser(cPtr, cmdArgs);
|
||||
} else if (strcasecmp(command, "get") == 0) {
|
||||
getTimeForUser(cPtr, cmdArgs);
|
||||
} else {
|
||||
buffer = wmalloc(strlen(command) + 100);
|
||||
sprintf(buffer, _("Unknown command '%s'. Try HELP for" " a list of commands.\n"), command);
|
||||
sendMessage(cPtr, buffer);
|
||||
wfree(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
WMFreeArray(commands);
|
||||
}
|
||||
|
||||
static Bool isAllowedToConnect(WMConnection * cPtr)
|
||||
{
|
||||
WMHost *hPtr;
|
||||
int i;
|
||||
|
||||
if (allowedHostList == NULL)
|
||||
return True; /* No list. Allow all by default */
|
||||
|
||||
hPtr = WMGetHostWithAddress(WMGetConnectionAddress(cPtr));
|
||||
for (i = 0; i < WMGetArrayItemCount(allowedHostList); i++) {
|
||||
if (WMIsHostEqualToHost(hPtr, WMGetFromArray(allowedHostList, i))) {
|
||||
WMReleaseHost(hPtr);
|
||||
return True;
|
||||
}
|
||||
}
|
||||
|
||||
WMReleaseHost(hPtr);
|
||||
|
||||
return False;
|
||||
}
|
||||
|
||||
static void didReceiveInput(ConnectionDelegate * self, WMConnection * cPtr)
|
||||
{
|
||||
if (cPtr == serverPtr) {
|
||||
WMConnection *newPtr = WMAcceptConnection(cPtr);
|
||||
|
||||
if (newPtr) {
|
||||
if (isAllowedToConnect(newPtr)) {
|
||||
WMSetConnectionDelegate(newPtr, &socketDelegate);
|
||||
WMSetConnectionSendTimeout(newPtr, 120);
|
||||
WMAddToArray(clientConnections, newPtr);
|
||||
} else {
|
||||
sendMessage(newPtr, "Sorry, you are not allowed to connect.\n");
|
||||
WMDestroyConnection(newPtr);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* Data arriving on an already-connected socket */
|
||||
handleConnection(cPtr);
|
||||
}
|
||||
}
|
||||
|
||||
static void connectionDidTimeout(ConnectionDelegate * self, WMConnection * cPtr)
|
||||
{
|
||||
WMHost *hPtr;
|
||||
|
||||
if (cPtr == serverPtr) {
|
||||
wfatal(_("The server listening socket did timeout. Exiting."));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
hPtr = WMGetHostWithAddress(WMGetConnectionAddress(cPtr));
|
||||
wwarning(_("Connection with %s did timeout. Closing connection."), WMGetHostName(hPtr));
|
||||
WMReleaseHost(hPtr);
|
||||
|
||||
enqueueConnectionForRemoval(cPtr);
|
||||
}
|
||||
|
||||
static void connectionDidDie(ConnectionDelegate * self, WMConnection * cPtr)
|
||||
{
|
||||
if (cPtr == serverPtr) {
|
||||
/* trouble. server listening port itself died!!! */
|
||||
wfatal(_("The server listening socket died. Exiting."));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
enqueueConnectionForRemoval(cPtr);
|
||||
}
|
||||
|
||||
static void removeConnection(void *observer, WMNotification * notification)
|
||||
{
|
||||
WMConnection *cPtr = (WMConnection *) WMGetNotificationObject(notification);
|
||||
WMData *data;
|
||||
|
||||
WMRemoveFromArray(clientConnections, cPtr);
|
||||
if ((data = (WMData *) WMGetConnectionClientData(cPtr)) != NULL)
|
||||
WMReleaseData(data);
|
||||
WMDestroyConnection(cPtr);
|
||||
}
|
||||
|
||||
static void updatedDomain(void *observer, WMNotification * notification)
|
||||
{
|
||||
wmessage("defaults domain file changed on disk. synchronizing.");
|
||||
}
|
||||
|
||||
#if 0
|
||||
static Bool isDifferent(char *str1, char *str2)
|
||||
{
|
||||
if ((!str1 && !str2) || (str1 && str2 && strcmp(str1, str2) == 0))
|
||||
return False;
|
||||
|
||||
return True;
|
||||
}
|
||||
#endif
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i;
|
||||
|
||||
wsetabort(wAbort);
|
||||
|
||||
WMInitializeApplication("server", &argc, argv);
|
||||
|
||||
if (argc > 1) {
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (strcmp(argv[i], "--help") == 0) {
|
||||
printHelp(argv[0]);
|
||||
exit(0);
|
||||
} else if (strcmp(argv[i], "--listen") == 0) {
|
||||
char *p;
|
||||
|
||||
if ((p = strchr(argv[++i], ':')) != NULL) {
|
||||
*p = 0;
|
||||
ServerAddress = wstrdup(argv[i]);
|
||||
ServerPort = wstrdup(p + 1);
|
||||
*p = ':';
|
||||
if (ServerAddress[0] == 0) {
|
||||
wfree(ServerAddress);
|
||||
ServerAddress = NULL;
|
||||
}
|
||||
if (ServerPort[0] == 0) {
|
||||
wfree(ServerPort);
|
||||
ServerPort = "34567";
|
||||
}
|
||||
} else if (argv[i][0] != 0) {
|
||||
ServerPort = argv[i];
|
||||
}
|
||||
} else if (strcmp(argv[i], "--allow") == 0) {
|
||||
char *p, *ptr;
|
||||
int done;
|
||||
WMHost *hPtr;
|
||||
|
||||
ptr = argv[++i];
|
||||
done = 0;
|
||||
while (!done) {
|
||||
if ((p = strchr(ptr, ',')) != NULL) {
|
||||
*p = 0;
|
||||
}
|
||||
if (*ptr != 0) {
|
||||
hPtr = WMGetHostWithName(ptr);
|
||||
if (hPtr) {
|
||||
if (!allowedHostList)
|
||||
allowedHostList = WMCreateArray(4);
|
||||
WMAddToArray(allowedHostList, hPtr);
|
||||
} else {
|
||||
wwarning(_("Unknown host '%s'. Ignored."), ptr);
|
||||
}
|
||||
}
|
||||
|
||||
if (p != NULL) {
|
||||
*p = ',';
|
||||
ptr = p + 1;
|
||||
} else {
|
||||
done = 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
printf(_("%s: invalid argument '%s'\n"), argv[0], argv[i]);
|
||||
printf(_("Try '%s --help' for more information\n"), argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
timeDB = WMGetDefaultsFromPath("./UserTime.plist");
|
||||
WMAddNotificationObserver(updatedDomain, NULL, WMUserDefaultsDidChangeNotification, NULL);
|
||||
|
||||
clientConnections = WMCreateArray(4);
|
||||
|
||||
/* A NULL ServerAddress means to listen on any address the host has.
|
||||
* Else if ServerAddress points to a specific address (like "localhost",
|
||||
* "host.domain.com" or "192.168.1.1"), then it will only listen on that
|
||||
* interface and ignore incoming connections on the others. */
|
||||
if (ServerAddress && strcasecmp(ServerAddress, "Any") == 0)
|
||||
ServerAddress = NULL;
|
||||
if (ServerPort == NULL)
|
||||
ServerPort = "34567";
|
||||
|
||||
printf("Server will listen on '%s:%s'\n", ServerAddress ? ServerAddress : "Any", ServerPort);
|
||||
printf("This server will allow connections from:");
|
||||
if (allowedHostList) {
|
||||
int i;
|
||||
char *hName;
|
||||
|
||||
for (i = 0; i < WMGetArrayItemCount(allowedHostList); i++) {
|
||||
hName = WMGetHostName(WMGetFromArray(allowedHostList, i));
|
||||
printf("%s'%s'", i == 0 ? " " : ", ", hName);
|
||||
}
|
||||
printf(".\n");
|
||||
} else {
|
||||
printf(" any host.\n");
|
||||
}
|
||||
|
||||
serverPtr = WMCreateConnectionAsServerAtAddress(ServerAddress, ServerPort, NULL);
|
||||
|
||||
if (!serverPtr) {
|
||||
wfatal("could not create server on `%s:%s`. Exiting.",
|
||||
ServerAddress ? ServerAddress : "localhost", ServerPort);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
WMSetConnectionDelegate(serverPtr, &socketDelegate);
|
||||
|
||||
WMAddNotificationObserver(removeConnection, NULL, SEConnectionShouldBeRemovedNotification, NULL);
|
||||
|
||||
while (1) {
|
||||
/* The ASAP notification queue is called at the end of WHandleEvents()
|
||||
* There's where died connections we get while running through
|
||||
* WHandleEvents() get removed. */
|
||||
WHandleEvents();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
4
WINGs/Extras/.cvsignore
Normal file
4
WINGs/Extras/.cvsignore
Normal file
@@ -0,0 +1,4 @@
|
||||
Makefile Makefile.in
|
||||
.libs
|
||||
test
|
||||
.psrc .inslog2 tca.map tca.log pchdir *.rpt
|
||||
46
WINGs/Extras/Makefile.am
Normal file
46
WINGs/Extras/Makefile.am
Normal file
@@ -0,0 +1,46 @@
|
||||
## automake input file for WINGs
|
||||
|
||||
AUTOMAKE_OPTIONS = no-dependencies
|
||||
|
||||
|
||||
|
||||
# is this a kluge? if so, how should i do it?
|
||||
includedir = @includedir@/WINGs
|
||||
|
||||
include_HEADERS = wtableview.h wtabledelegates.h
|
||||
|
||||
|
||||
lib_LIBRARIES = libExtraWINGs.a
|
||||
|
||||
noinst_PROGRAMS = test
|
||||
|
||||
EXTRA_DIST =
|
||||
|
||||
libExtraWINGs_a_AR = $(QUIET_AR) $(AR) $(ARFLAGS)
|
||||
|
||||
libExtraWINGs_a_SOURCES = \
|
||||
wtableview.c \
|
||||
wtabledelegates.c \
|
||||
wtableview.h \
|
||||
wtabledelegates.h
|
||||
|
||||
AM_CFLAGS = @NOSTRICTALIASING@
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/WINGs \
|
||||
-DRESOURCE_PATH=\"$(datadir)/WINGs\" @HEADER_SEARCH_PATH@ -DDEBUG
|
||||
|
||||
LDADD= $(top_builddir)/WINGs/libWINGs.a $(top_builddir)/wrlib/libwraster.la \
|
||||
@XFTLIBS@ @INTLIBS@
|
||||
|
||||
test_LDADD = wtableview.o wtabledelegates.o $(LDADD)
|
||||
|
||||
LIBTOOL = $(QUIET) $(SHELL) $(top_srcdir)/libtool $(LIBTOOL_ARG)
|
||||
|
||||
.c.o:
|
||||
$(QUIET)$(COMPILE) -c $<
|
||||
|
||||
.c.obj:
|
||||
$(QUIET)$(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
$(QUIET)$(LTCOMPILE) -c -o $@ $<
|
||||
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 ((int)(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 ((int)(uintptr_t) WMGetTableColumnId(column) == 1)
|
||||
col1[row] = data;
|
||||
else
|
||||
col2[row] = (int)(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);
|
||||
int i = (int)(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);
|
||||
int i = (int)(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);
|
||||
int data = (int)(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);
|
||||
int i = (int)(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);
|
||||
int i = (int)(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);
|
||||
int data = (int)(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
|
||||
|
||||
@@ -2,89 +2,141 @@
|
||||
|
||||
AUTOMAKE_OPTIONS = no-dependencies
|
||||
|
||||
SUBDIRS = Resources
|
||||
SUBDIRS = WINGs . po Documentation Resources Examples Extras Tests
|
||||
|
||||
LIBTOOL = $(QUIET) $(SHELL) $(top_srcdir)/libtool $(LIBTOOL_ARG)
|
||||
|
||||
libWINGs_a_AR = $(QUIET_AR) $(AR) $(ARFLAGS)
|
||||
|
||||
libWUtil_a_AR = $(QUIET_AR) $(AR) $(ARFLAGS)
|
||||
|
||||
#libWINGs_la_LDFLAGS = -version-info 1:1:0
|
||||
|
||||
bin_SCRIPTS = get-wings-flags get-wutil-flags
|
||||
|
||||
lib_LIBRARIES = libWINGs.a libWUtil.a
|
||||
|
||||
|
||||
LIBLIST= -L$(top_builddir)/wrlib -lwraster @XLFLAGS@ @GFXLIBS@ @XLIBS@ \
|
||||
-lm @LIBPL_LIBS@
|
||||
LDADD= libWINGs.a $(top_builddir)/wrlib/libwraster.la @INTLIBS@
|
||||
|
||||
|
||||
lib_LIBRARIES = libWINGs.a
|
||||
EXTRA_DIST = BUGS make-rgb python/Makefile python/README python/WINGs.i \
|
||||
python/WINGs.py python/setup.py python/test.py
|
||||
|
||||
include_HEADERS = WINGs.h WUtil.h WINGsP.h
|
||||
|
||||
noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget
|
||||
|
||||
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
|
||||
|
||||
testmywidget_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
fontl_SOURCES = fontl.c
|
||||
|
||||
fontl_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
wtest_SOURCES = wtest.c
|
||||
|
||||
wtest_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
wtest_DEPENDENCIES = libWINGs.a
|
||||
|
||||
wmfile_SOURCES = wmfile.c
|
||||
|
||||
wmfile_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
|
||||
wmquery_SOURCES = wmquery.c
|
||||
|
||||
wmquery_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
|
||||
EXTRA_DIST = logo.xpm
|
||||
|
||||
# wbutton.c
|
||||
libWINGs_a_SOURCES = \
|
||||
WINGs.h \
|
||||
WINGsP.h \
|
||||
array.c \
|
||||
bagtree.c \
|
||||
configuration.c \
|
||||
connection.c \
|
||||
data.c \
|
||||
dragcommon.c \
|
||||
dragdestination.c \
|
||||
dragsource.c \
|
||||
error.c \
|
||||
findfile.c \
|
||||
handlers.c \
|
||||
hashtable.c \
|
||||
host.c \
|
||||
international.c \
|
||||
memory.c \
|
||||
misc.c \
|
||||
notification.c \
|
||||
proplist.c \
|
||||
rgb.h \
|
||||
selection.c \
|
||||
snprintf.c \
|
||||
string.c \
|
||||
tree.c \
|
||||
userdefaults.c \
|
||||
usleep.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 \
|
||||
wmisc.c \
|
||||
wpanel.c \
|
||||
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_a_SOURCES = \
|
||||
array.c \
|
||||
bagtree.c \
|
||||
connection.c \
|
||||
data.c \
|
||||
error.c \
|
||||
findfile.c \
|
||||
handlers.c \
|
||||
hashtable.c \
|
||||
host.c \
|
||||
international.c \
|
||||
memory.c \
|
||||
usleep.c
|
||||
misc.c \
|
||||
notification.c \
|
||||
proplist.c \
|
||||
snprintf.c \
|
||||
string.c \
|
||||
tree.c \
|
||||
userdefaults.c \
|
||||
usleep.c \
|
||||
wapplication.c \
|
||||
wconfig.h \
|
||||
wutil.c
|
||||
|
||||
##
|
||||
## Find a better way than $(GFXFLAGS) to inform widgets.c wich of
|
||||
## tiff or xpm images should be used
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/src @XCFLAGS@ \
|
||||
-DRESOURCE_PATH=\"$(datadir)/WINGs\" $(GFXFLAGS) -DDEBUG \
|
||||
@LIBPL_INC_PATH@
|
||||
AM_CPPFLAGS = -DLOCALEDIR=\"$(NLSDIR)\" -DRESOURCE_PATH=\"$(datadir)/WINGs\" -DDEBUG
|
||||
|
||||
AM_CFLAGS = @NOSTRICTALIASING@
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/WINGs/WINGs -I$(top_srcdir)/wrlib -I$(top_srcdir)/src \
|
||||
@XFTFLAGS@ @HEADER_SEARCH_PATH@
|
||||
|
||||
DISTCLEANFILES = WINGs.pc
|
||||
|
||||
install-exec-local:
|
||||
@$(NORMAL_INSTALL)
|
||||
$(mkinstalldirs) $(DESTDIR)$(libdir)/pkgconfig
|
||||
@list='WINGs.pc'; for p in $$list; do \
|
||||
if test -f $$p; then \
|
||||
echo "$(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/pkgconfig/"; \
|
||||
$(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/pkgconfig/; \
|
||||
else :; fi; \
|
||||
done
|
||||
|
||||
.c.o:
|
||||
$(QUIET)$(COMPILE) -c $<
|
||||
|
||||
.c.obj:
|
||||
$(QUIET)$(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
$(QUIET)$(LTCOMPILE) -c -o $@ $<
|
||||
|
||||
@@ -1,513 +0,0 @@
|
||||
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998 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 = /bin/sh
|
||||
|
||||
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
|
||||
|
||||
DISTDIR =
|
||||
|
||||
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@
|
||||
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@
|
||||
CC = @CC@
|
||||
CPP_PATH = @CPP_PATH@
|
||||
DFLAGS = @DFLAGS@
|
||||
GFXFLAGS = @GFXFLAGS@
|
||||
GFXLIBS = @GFXLIBS@
|
||||
I18N = @I18N@
|
||||
I18N_MB = @I18N_MB@
|
||||
ICONEXT = @ICONEXT@
|
||||
INTLIBS = @INTLIBS@
|
||||
LIBPL_INC_PATH = @LIBPL_INC_PATH@
|
||||
LIBPL_LIBS = @LIBPL_LIBS@
|
||||
LN_S = @LN_S@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MOFILES = @MOFILES@
|
||||
NLSDIR = @NLSDIR@
|
||||
PACKAGE = @PACKAGE@
|
||||
RANLIB = @RANLIB@
|
||||
REDUCE_APPICONS = @REDUCE_APPICONS@
|
||||
SHAPE = @SHAPE@
|
||||
SOUND = @SOUND@
|
||||
VERSION = @VERSION@
|
||||
WPMOFILES = @WPMOFILES@
|
||||
XCFLAGS = @XCFLAGS@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
XLFLAGS = @XLFLAGS@
|
||||
XLIBS = @XLIBS@
|
||||
XSHM = @XSHM@
|
||||
X_EXTRA_LIBS = @X_EXTRA_LIBS@
|
||||
X_LOCALE = @X_LOCALE@
|
||||
pixmapdir = @pixmapdir@
|
||||
wprefsdir = @wprefsdir@
|
||||
|
||||
AUTOMAKE_OPTIONS = no-dependencies
|
||||
|
||||
SUBDIRS = Resources
|
||||
|
||||
LIBLIST= -L$(top_builddir)/wrlib -lwraster @XLFLAGS@ @GFXLIBS@ @XLIBS@ \
|
||||
-lm @LIBPL_LIBS@
|
||||
|
||||
lib_LIBRARIES = libWINGs.a
|
||||
|
||||
include_HEADERS = WINGs.h WUtil.h WINGsP.h
|
||||
|
||||
noinst_PROGRAMS = wtest wmquery wmfile fontl testmywidget
|
||||
|
||||
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
|
||||
|
||||
testmywidget_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
fontl_SOURCES = fontl.c
|
||||
|
||||
fontl_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
wtest_SOURCES = wtest.c
|
||||
|
||||
wtest_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
wtest_DEPENDENCIES = libWINGs.a
|
||||
|
||||
wmfile_SOURCES = wmfile.c
|
||||
|
||||
wmfile_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
wmquery_SOURCES = wmquery.c
|
||||
|
||||
wmquery_LDADD = -L. -lWINGs $(LIBLIST)
|
||||
|
||||
EXTRA_DIST = logo.xpm
|
||||
|
||||
# wbutton.c
|
||||
libWINGs_a_SOURCES = \
|
||||
WINGs.h \
|
||||
WINGsP.h \
|
||||
configuration.c \
|
||||
international.c \
|
||||
notification.c \
|
||||
selection.c \
|
||||
userdefaults.c \
|
||||
wapplication.c \
|
||||
wbrowser.c \
|
||||
wbutton.c \
|
||||
wcolor.c \
|
||||
wcolorwell.c \
|
||||
wevent.c \
|
||||
wfilepanel.c \
|
||||
wframe.c \
|
||||
wfont.c \
|
||||
wfontpanel.c \
|
||||
widgets.c \
|
||||
wlabel.c \
|
||||
wlist.c \
|
||||
wmisc.c \
|
||||
wpanel.c \
|
||||
wpixmap.c \
|
||||
wpopupbutton.c \
|
||||
wscroller.c \
|
||||
wscrollview.c \
|
||||
wslider.c \
|
||||
wsplitview.c \
|
||||
wtextfield.c \
|
||||
wwindow.c \
|
||||
wview.c \
|
||||
error.c \
|
||||
findfile.c \
|
||||
hashtable.c \
|
||||
memory.c \
|
||||
usleep.c
|
||||
|
||||
INCLUDES = -I$(top_srcdir)/wrlib -I$(top_srcdir)/src @XCFLAGS@ \
|
||||
-DRESOURCE_PATH=\"$(datadir)/WINGs\" $(GFXFLAGS) -DDEBUG \
|
||||
@LIBPL_INC_PATH@
|
||||
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
|
||||
CONFIG_HEADER = ../src/config.h
|
||||
CONFIG_CLEAN_FILES =
|
||||
LIBRARIES = $(lib_LIBRARIES)
|
||||
|
||||
|
||||
DEFS = @DEFS@ -I. -I$(srcdir) -I../src
|
||||
CPPFLAGS = @CPPFLAGS@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBS = @LIBS@
|
||||
X_CFLAGS = @X_CFLAGS@
|
||||
X_LIBS = @X_LIBS@
|
||||
X_PRE_LIBS = @X_PRE_LIBS@
|
||||
libWINGs_a_LIBADD =
|
||||
libWINGs_a_OBJECTS = configuration.o international.o notification.o \
|
||||
selection.o userdefaults.o wapplication.o wbrowser.o wbutton.o wcolor.o \
|
||||
wcolorwell.o wevent.o wfilepanel.o wframe.o wfont.o wfontpanel.o \
|
||||
widgets.o wlabel.o wlist.o wmisc.o wpanel.o wpixmap.o wpopupbutton.o \
|
||||
wscroller.o wscrollview.o wslider.o wsplitview.o wtextfield.o wwindow.o \
|
||||
wview.o error.o findfile.o hashtable.o memory.o usleep.o
|
||||
AR = ar
|
||||
PROGRAMS = $(noinst_PROGRAMS)
|
||||
|
||||
wtest_OBJECTS = wtest.o
|
||||
wtest_LDFLAGS =
|
||||
wmquery_OBJECTS = wmquery.o
|
||||
wmquery_DEPENDENCIES =
|
||||
wmquery_LDFLAGS =
|
||||
wmfile_OBJECTS = wmfile.o
|
||||
wmfile_DEPENDENCIES =
|
||||
wmfile_LDFLAGS =
|
||||
fontl_OBJECTS = fontl.o
|
||||
fontl_DEPENDENCIES =
|
||||
fontl_LDFLAGS =
|
||||
testmywidget_OBJECTS = testmywidget.o mywidget.o
|
||||
testmywidget_DEPENDENCIES =
|
||||
testmywidget_LDFLAGS =
|
||||
CFLAGS = @CFLAGS@
|
||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
|
||||
LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@
|
||||
HEADERS = $(include_HEADERS)
|
||||
|
||||
DIST_COMMON = README ChangeLog Makefile.am Makefile.in TODO
|
||||
|
||||
|
||||
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
||||
|
||||
TAR = tar
|
||||
GZIP = --best
|
||||
SOURCES = $(libWINGs_a_SOURCES) $(wtest_SOURCES) $(wmquery_SOURCES) $(wmfile_SOURCES) $(fontl_SOURCES) $(testmywidget_SOURCES)
|
||||
OBJECTS = $(libWINGs_a_OBJECTS) $(wtest_OBJECTS) $(wmquery_OBJECTS) $(wmfile_OBJECTS) $(fontl_OBJECTS) $(testmywidget_OBJECTS)
|
||||
|
||||
all: all-recursive all-am
|
||||
|
||||
.SUFFIXES:
|
||||
.SUFFIXES: .S .c .o .s
|
||||
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||
cd $(top_srcdir) && $(AUTOMAKE) --gnu WINGs/Makefile
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
cd $(top_builddir) \
|
||||
&& CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||
|
||||
|
||||
mostlyclean-libLIBRARIES:
|
||||
|
||||
clean-libLIBRARIES:
|
||||
-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
|
||||
|
||||
distclean-libLIBRARIES:
|
||||
|
||||
maintainer-clean-libLIBRARIES:
|
||||
|
||||
install-libLIBRARIES: $(lib_LIBRARIES)
|
||||
@$(NORMAL_INSTALL)
|
||||
$(mkinstalldirs) $(DESTDIR)$(libdir)
|
||||
list='$(lib_LIBRARIES)'; for p in $$list; do \
|
||||
if test -f $$p; then \
|
||||
echo " $(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/$$p"; \
|
||||
$(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/$$p; \
|
||||
else :; fi; \
|
||||
done
|
||||
@$(POST_INSTALL)
|
||||
@list='$(lib_LIBRARIES)'; for p in $$list; do \
|
||||
if test -f $$p; then \
|
||||
echo " $(RANLIB) $(DESTDIR)$(libdir)/$$p"; \
|
||||
$(RANLIB) $(DESTDIR)$(libdir)/$$p; \
|
||||
else :; fi; \
|
||||
done
|
||||
|
||||
uninstall-libLIBRARIES:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
list='$(lib_LIBRARIES)'; for p in $$list; do \
|
||||
rm -f $(DESTDIR)$(libdir)/$$p; \
|
||||
done
|
||||
|
||||
.c.o:
|
||||
$(COMPILE) -c $<
|
||||
|
||||
.s.o:
|
||||
$(COMPILE) -c $<
|
||||
|
||||
.S.o:
|
||||
$(COMPILE) -c $<
|
||||
|
||||
mostlyclean-compile:
|
||||
-rm -f *.o core *.core
|
||||
|
||||
clean-compile:
|
||||
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
maintainer-clean-compile:
|
||||
|
||||
libWINGs.a: $(libWINGs_a_OBJECTS) $(libWINGs_a_DEPENDENCIES)
|
||||
-rm -f libWINGs.a
|
||||
$(AR) cru libWINGs.a $(libWINGs_a_OBJECTS) $(libWINGs_a_LIBADD)
|
||||
$(RANLIB) libWINGs.a
|
||||
|
||||
mostlyclean-noinstPROGRAMS:
|
||||
|
||||
clean-noinstPROGRAMS:
|
||||
-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
|
||||
|
||||
distclean-noinstPROGRAMS:
|
||||
|
||||
maintainer-clean-noinstPROGRAMS:
|
||||
|
||||
wtest: $(wtest_OBJECTS) $(wtest_DEPENDENCIES)
|
||||
@rm -f wtest
|
||||
$(LINK) $(wtest_LDFLAGS) $(wtest_OBJECTS) $(wtest_LDADD) $(LIBS)
|
||||
|
||||
wmquery: $(wmquery_OBJECTS) $(wmquery_DEPENDENCIES)
|
||||
@rm -f wmquery
|
||||
$(LINK) $(wmquery_LDFLAGS) $(wmquery_OBJECTS) $(wmquery_LDADD) $(LIBS)
|
||||
|
||||
wmfile: $(wmfile_OBJECTS) $(wmfile_DEPENDENCIES)
|
||||
@rm -f wmfile
|
||||
$(LINK) $(wmfile_LDFLAGS) $(wmfile_OBJECTS) $(wmfile_LDADD) $(LIBS)
|
||||
|
||||
fontl: $(fontl_OBJECTS) $(fontl_DEPENDENCIES)
|
||||
@rm -f fontl
|
||||
$(LINK) $(fontl_LDFLAGS) $(fontl_OBJECTS) $(fontl_LDADD) $(LIBS)
|
||||
|
||||
testmywidget: $(testmywidget_OBJECTS) $(testmywidget_DEPENDENCIES)
|
||||
@rm -f testmywidget
|
||||
$(LINK) $(testmywidget_LDFLAGS) $(testmywidget_OBJECTS) $(testmywidget_LDADD) $(LIBS)
|
||||
|
||||
install-includeHEADERS: $(include_HEADERS)
|
||||
@$(NORMAL_INSTALL)
|
||||
$(mkinstalldirs) $(DESTDIR)$(includedir)
|
||||
@list='$(include_HEADERS)'; for p in $$list; do \
|
||||
if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \
|
||||
echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p"; \
|
||||
$(INSTALL_DATA) $$d$$p $(DESTDIR)$(includedir)/$$p; \
|
||||
done
|
||||
|
||||
uninstall-includeHEADERS:
|
||||
@$(NORMAL_UNINSTALL)
|
||||
list='$(include_HEADERS)'; for p in $$list; do \
|
||||
rm -f $(DESTDIR)$(includedir)/$$p; \
|
||||
done
|
||||
|
||||
# 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; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
(cd $$subdir && $(MAKE) $$target) \
|
||||
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
|
||||
done && test -z "$$fail"
|
||||
|
||||
mostlyclean-recursive clean-recursive distclean-recursive \
|
||||
maintainer-clean-recursive:
|
||||
@set fnord $(MAKEFLAGS); amf=$$2; \
|
||||
rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
rev="$$subdir $$rev"; \
|
||||
done; \
|
||||
for subdir in $$rev; do \
|
||||
target=`echo $@ | sed s/-recursive//`; \
|
||||
echo "Making $$target in $$subdir"; \
|
||||
(cd $$subdir && $(MAKE) $$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 \
|
||||
(cd $$subdir && $(MAKE) tags); \
|
||||
done
|
||||
|
||||
tags: TAGS
|
||||
|
||||
ID: $(HEADERS) $(SOURCES) $(LISP)
|
||||
here=`pwd` && cd $(srcdir) \
|
||||
&& mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP)
|
||||
|
||||
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
|
||||
tags=; \
|
||||
here=`pwd`; \
|
||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
||||
test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
|
||||
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 = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
|
||||
|
||||
subdir = WINGs
|
||||
|
||||
distdir: $(DISTFILES)
|
||||
@for file in $(DISTFILES); do \
|
||||
d=$(srcdir); \
|
||||
test -f $(distdir)/$$file \
|
||||
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||
done
|
||||
for subdir in $(SUBDIRS); do \
|
||||
test -d $(distdir)/$$subdir \
|
||||
|| mkdir $(distdir)/$$subdir \
|
||||
|| exit 1; \
|
||||
chmod 777 $(distdir)/$$subdir; \
|
||||
(cd $$subdir && $(MAKE) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
|
||||
|| exit 1; \
|
||||
done
|
||||
info: info-recursive
|
||||
dvi: dvi-recursive
|
||||
check: all-am
|
||||
$(MAKE) check-recursive
|
||||
installcheck: installcheck-recursive
|
||||
all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(HEADERS)
|
||||
|
||||
install-exec-am: install-libLIBRARIES
|
||||
|
||||
install-data-am: install-includeHEADERS
|
||||
|
||||
uninstall-am: uninstall-libLIBRARIES uninstall-includeHEADERS
|
||||
|
||||
install-exec: install-exec-recursive install-exec-am
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install-data: install-data-recursive install-data-am
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install: install-recursive install-exec-am install-data-am
|
||||
@:
|
||||
|
||||
uninstall: uninstall-recursive uninstall-am
|
||||
|
||||
install-strip:
|
||||
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||
installdirs: installdirs-recursive
|
||||
$(mkinstalldirs) $(DATADIR)$(libdir) $(DATADIR)$(includedir)
|
||||
|
||||
|
||||
mostlyclean-generic:
|
||||
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||
|
||||
clean-generic:
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
-rm -f Makefile $(DISTCLEANFILES)
|
||||
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||
mostlyclean-am: mostlyclean-libLIBRARIES mostlyclean-compile \
|
||||
mostlyclean-noinstPROGRAMS mostlyclean-tags \
|
||||
mostlyclean-generic
|
||||
|
||||
clean-am: clean-libLIBRARIES clean-compile clean-noinstPROGRAMS \
|
||||
clean-tags clean-generic mostlyclean-am
|
||||
|
||||
distclean-am: distclean-libLIBRARIES distclean-compile \
|
||||
distclean-noinstPROGRAMS distclean-tags \
|
||||
distclean-generic clean-am
|
||||
|
||||
maintainer-clean-am: maintainer-clean-libLIBRARIES \
|
||||
maintainer-clean-compile \
|
||||
maintainer-clean-noinstPROGRAMS maintainer-clean-tags \
|
||||
maintainer-clean-generic distclean-am
|
||||
|
||||
mostlyclean: mostlyclean-recursive mostlyclean-am
|
||||
|
||||
clean: clean-recursive clean-am
|
||||
|
||||
distclean: distclean-recursive distclean-am
|
||||
-rm -f config.status
|
||||
|
||||
maintainer-clean: maintainer-clean-recursive maintainer-clean-am
|
||||
@echo "This command is intended for maintainers to use;"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
|
||||
.PHONY: mostlyclean-libLIBRARIES distclean-libLIBRARIES \
|
||||
clean-libLIBRARIES maintainer-clean-libLIBRARIES uninstall-libLIBRARIES \
|
||||
install-libLIBRARIES mostlyclean-compile distclean-compile \
|
||||
clean-compile maintainer-clean-compile mostlyclean-noinstPROGRAMS \
|
||||
distclean-noinstPROGRAMS clean-noinstPROGRAMS \
|
||||
maintainer-clean-noinstPROGRAMS uninstall-includeHEADERS \
|
||||
install-includeHEADERS 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 dvi \
|
||||
installcheck all-am install-exec-am install-data-am uninstall-am \
|
||||
install-exec install-data install uninstall 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:
|
||||
293
WINGs/NEWS
Normal file
293
WINGs/NEWS
Normal file
@@ -0,0 +1,293 @@
|
||||
*** 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.
|
||||
|
||||
|
||||
43
WINGs/README
43
WINGs/README
@@ -1,11 +1,11 @@
|
||||
|
||||
WINGs - WINGs Is Not GNUstep
|
||||
WINGs - WINGs Is Not GNUstep
|
||||
|
||||
by
|
||||
by
|
||||
|
||||
Alfredo Kengi Kojima
|
||||
|
||||
kojima@windowmaker.org
|
||||
Alfredo Kengi Kojima
|
||||
|
||||
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
|
||||
@@ -25,9 +25,9 @@ and faster than say, Motif or even Athena. Knowing Xlib will help you to
|
||||
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 WindowMaker window
|
||||
manager (see http://windowmaker.org) In fact, it's primary role is to
|
||||
support WindowMaker. All other uses of it are just an added bonus.
|
||||
Some of it's functions are designed to support the Window Maker window
|
||||
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
|
||||
reference manual, distributed as a PDF by Apple. The function names,
|
||||
@@ -37,9 +37,8 @@ structs and most of the intrinsics are very close to OpenStep classes.
|
||||
Internationalization:
|
||||
---------------------
|
||||
|
||||
WINGs supports display of multibyte characters (kanji etc) without the
|
||||
to specify any flags (ie: there is no way to disable i18n support).
|
||||
Change ~/GNUstep/Defaults/WMGLOBAL to set the desired font set.
|
||||
Change ~/GNUstep/Defaults/WMGLOBAL to set the desired font set and
|
||||
set MultiByteText = YES; to enable support for multibyte text.
|
||||
|
||||
|
||||
Widgets provided by WINGs:
|
||||
@@ -57,24 +56,22 @@ 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
|
||||
|
||||
Planned:
|
||||
--------
|
||||
|
||||
- selection (pasteboard like)
|
||||
- drag&drop
|
||||
- font panel
|
||||
|
||||
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.
|
||||
|
||||
- color panel
|
||||
- font panel (the UI part is done. Might require a rewrite of the font list
|
||||
retrievel code. Might also require a WMFontManager)
|
||||
- input method support (XIM). I have no idea of how to code it. People who use
|
||||
different characters than ASCII will have trouble editing menus without it...
|
||||
|
||||
@@ -84,9 +81,7 @@ 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 file panel, open/save
|
||||
- finish other wigets
|
||||
- optimize list scrolling (XCopyArea() the area that's already drawn)
|
||||
- InterfaceMaker?
|
||||
|
||||
2
WINGs/Resources/.cvsignore
Normal file
2
WINGs/Resources/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile Makefile.in
|
||||
.psrc .inslog2 tca.map tca.log pchdir *.rpt
|
||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,210 +0,0 @@
|
||||
# Makefile.in generated automatically by automake 1.3 from Makefile.am
|
||||
|
||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998 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 = /bin/sh
|
||||
|
||||
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
|
||||
|
||||
DISTDIR =
|
||||
|
||||
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@
|
||||
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@
|
||||
CC = @CC@
|
||||
CPP_PATH = @CPP_PATH@
|
||||
DFLAGS = @DFLAGS@
|
||||
GFXFLAGS = @GFXFLAGS@
|
||||
GFXLIBS = @GFXLIBS@
|
||||
I18N = @I18N@
|
||||
I18N_MB = @I18N_MB@
|
||||
ICONEXT = @ICONEXT@
|
||||
INTLIBS = @INTLIBS@
|
||||
LIBPL_INC_PATH = @LIBPL_INC_PATH@
|
||||
LIBPL_LIBS = @LIBPL_LIBS@
|
||||
LN_S = @LN_S@
|
||||
MAKEINFO = @MAKEINFO@
|
||||
MOFILES = @MOFILES@
|
||||
NLSDIR = @NLSDIR@
|
||||
PACKAGE = @PACKAGE@
|
||||
RANLIB = @RANLIB@
|
||||
REDUCE_APPICONS = @REDUCE_APPICONS@
|
||||
SHAPE = @SHAPE@
|
||||
SOUND = @SOUND@
|
||||
VERSION = @VERSION@
|
||||
WPMOFILES = @WPMOFILES@
|
||||
XCFLAGS = @XCFLAGS@
|
||||
XGETTEXT = @XGETTEXT@
|
||||
XLFLAGS = @XLFLAGS@
|
||||
XLIBS = @XLIBS@
|
||||
XSHM = @XSHM@
|
||||
X_EXTRA_LIBS = @X_EXTRA_LIBS@
|
||||
X_LOCALE = @X_LOCALE@
|
||||
pixmapdir = @pixmapdir@
|
||||
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 = tar
|
||||
GZIP = --best
|
||||
all: Makefile $(DATA)
|
||||
|
||||
.SUFFIXES:
|
||||
$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
|
||||
cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps WINGs/Resources/Makefile
|
||||
|
||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||
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)
|
||||
@for file in $(DISTFILES); do \
|
||||
d=$(srcdir); \
|
||||
test -f $(distdir)/$$file \
|
||||
|| ln $$d/$$file $(distdir)/$$file 2> /dev/null \
|
||||
|| cp -p $$d/$$file $(distdir)/$$file; \
|
||||
done
|
||||
info:
|
||||
dvi:
|
||||
check: all
|
||||
$(MAKE)
|
||||
installcheck:
|
||||
install-exec:
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install-data: install-resdataDATA
|
||||
@$(NORMAL_INSTALL)
|
||||
|
||||
install: install-exec install-data all
|
||||
@:
|
||||
|
||||
uninstall: uninstall-resdataDATA
|
||||
|
||||
install-strip:
|
||||
$(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install
|
||||
installdirs:
|
||||
$(mkinstalldirs) $(DATADIR)$(resdatadir)
|
||||
|
||||
|
||||
mostlyclean-generic:
|
||||
-test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
|
||||
|
||||
clean-generic:
|
||||
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
|
||||
|
||||
distclean-generic:
|
||||
-rm -f Makefile $(DISTCLEANFILES)
|
||||
-rm -f config.cache config.log stamp-h stamp-h[0-9]*
|
||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
||||
|
||||
maintainer-clean-generic:
|
||||
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
|
||||
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
|
||||
mostlyclean: mostlyclean-generic
|
||||
|
||||
clean: clean-generic mostlyclean
|
||||
|
||||
distclean: distclean-generic clean
|
||||
-rm -f config.status
|
||||
|
||||
maintainer-clean: maintainer-clean-generic distclean
|
||||
@echo "This command is intended for maintainers to use;"
|
||||
@echo "it deletes files that may require special tools to rebuild."
|
||||
|
||||
.PHONY: uninstall-resdataDATA install-resdataDATA tags distdir info dvi \
|
||||
installcheck install-exec install-data install uninstall 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
|
||||
|
||||
4
WINGs/Tests/.cvsignore
Normal file
4
WINGs/Tests/.cvsignore
Normal file
@@ -0,0 +1,4 @@
|
||||
Makefile Makefile.in
|
||||
testtext testcolorpanel testmywidget wmfile wmquery wtest
|
||||
.libs
|
||||
.psrc .inslog2 tca.map tca.log pchdir *.rpt
|
||||
31
WINGs/Tests/Makefile.am
Normal file
31
WINGs/Tests/Makefile.am
Normal file
@@ -0,0 +1,31 @@
|
||||
## automake input file for WINGs - Tests
|
||||
|
||||
AUTOMAKE_OPTIONS = no-dependencies
|
||||
|
||||
noinst_PROGRAMS = wtest wmquery wmfile testmywidget
|
||||
|
||||
LDADD= $(top_builddir)/WINGs/libWINGs.a $(top_builddir)/wrlib/libwraster.la \
|
||||
@XFTLIBS@ @INTLIBS@
|
||||
|
||||
|
||||
testmywidget_SOURCES = testmywidget.c mywidget.c mywidget.h
|
||||
|
||||
wtest_DEPENDENCIES = $(top_builddir)/WINGs/libWINGs.a
|
||||
|
||||
|
||||
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
|
||||
|
||||
LIBTOOL = $(QUIET) $(SHELL) $(top_srcdir)/libtool $(LIBTOOL_ARG)
|
||||
|
||||
.c.o:
|
||||
$(QUIET)$(COMPILE) -c $<
|
||||
|
||||
.c.obj:
|
||||
$(QUIET)$(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
$(QUIET)$(LTCOMPILE) -c -o $@ $<
|
||||
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);
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
/*
|
||||
* Header foy demo widget.
|
||||
*
|
||||
* Header for demo widget.
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct W_MyWidget MyWidget;
|
||||
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
1004
WINGs/WINGs.h
1004
WINGs/WINGs.h
File diff suppressed because it is too large
Load Diff
1
WINGs/WINGs/.cvsignore
Normal file
1
WINGs/WINGs/.cvsignore
Normal file
@@ -0,0 +1 @@
|
||||
Makefile Makefile.in
|
||||
17
WINGs/WINGs/Makefile.am
Normal file
17
WINGs/WINGs/Makefile.am
Normal file
@@ -0,0 +1,17 @@
|
||||
## automake input file for WINGs - Headers subdir
|
||||
|
||||
AUTOMAKE_OPTIONS = no-dependencies
|
||||
|
||||
# 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
|
||||
|
||||
.c.o:
|
||||
$(QUIET)$(COMPILE) -c $<
|
||||
|
||||
.c.obj:
|
||||
$(QUIET)$(COMPILE) -c `$(CYGPATH_W) '$<'`
|
||||
|
||||
.c.lo:
|
||||
$(QUIET)$(LTCOMPILE) -c -o $@ $<
|
||||
1853
WINGs/WINGs/WINGs.h
Normal file
1853
WINGs/WINGs/WINGs.h
Normal file
File diff suppressed because it is too large
Load Diff
638
WINGs/WINGs/WINGsP.h
Normal file
638
WINGs/WINGs/WINGsP.h
Normal file
@@ -0,0 +1,638 @@
|
||||
#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 <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 W_DragSourceStateHandler(WMDraggingInfo *info, XClientMessageEvent *event);
|
||||
|
||||
void W_DragDestinationStartTimer(WMDraggingInfo *info);
|
||||
|
||||
void W_DragDestinationStopTimer();
|
||||
|
||||
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_ */
|
||||
|
||||
1037
WINGs/WINGs/WUtil.h
Normal file
1037
WINGs/WINGs/WUtil.h
Normal file
File diff suppressed because it is too large
Load Diff
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, atm)
|
||||
|
||||
|
||||
/* 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
|
||||
394
WINGs/WINGsP.h
394
WINGs/WINGsP.h
@@ -1,394 +0,0 @@
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
|
||||
#include "WINGs.h"
|
||||
#include "WUtil.h"
|
||||
|
||||
#if WINGS_H_VERSION < 980922
|
||||
#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>
|
||||
|
||||
#define DOUBLE_BUFFER
|
||||
|
||||
|
||||
|
||||
#define WC_UserWidget 128
|
||||
|
||||
|
||||
|
||||
#define SCROLLER_WIDTH 20
|
||||
|
||||
/* internal messages */
|
||||
#define WM_UPDATE_COLORWELL 130
|
||||
|
||||
|
||||
#define WM_USER_MESSAGE 1024
|
||||
|
||||
|
||||
#define SETUP_INTERNAL_MESSAGE(event, scrPtr) \
|
||||
event.xclient.type=ClientMessage;\
|
||||
event.xclient.display=scrPtr->display;\
|
||||
event.xclient.send_event=False;\
|
||||
event.xclient.serial=0;\
|
||||
event.xclient.format=32;\
|
||||
event.xclient.message_type=scrPtr->internalMessage;
|
||||
|
||||
|
||||
typedef struct W_Font {
|
||||
struct W_Screen *screen;
|
||||
|
||||
union {
|
||||
XFontSet set;
|
||||
XFontStruct *normal;
|
||||
} font;
|
||||
short height;
|
||||
short y;
|
||||
short refCount;
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
|
||||
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 *homeIcon;
|
||||
|
||||
struct W_Pixmap *defaultObjectIcon;
|
||||
|
||||
Cursor defaultCursor;
|
||||
|
||||
Cursor textCursor;
|
||||
|
||||
Atom internalMessage; /* for ClientMessage */
|
||||
|
||||
Atom attribsAtom; /* GNUstepWindowAttributes */
|
||||
|
||||
Atom deleteWindowAtom; /* WM_DELETE_WINDOW */
|
||||
|
||||
Atom protocolsAtom; /* _XA_WM_PROTOCOLS */
|
||||
|
||||
Atom clipboardAtom; /* CLIPBOARD */
|
||||
|
||||
|
||||
/* 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_View {
|
||||
struct W_Screen *screen;
|
||||
|
||||
WMWidget *self; /* must point to the widget the
|
||||
* view belongs to */
|
||||
|
||||
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 */
|
||||
#if 0
|
||||
struct W_DragSourceProcs *dragSourceProcs;
|
||||
struct W_DragDestinationProcs *dragDestinationProcs;
|
||||
#endif
|
||||
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;
|
||||
} flags;
|
||||
|
||||
int refCount;
|
||||
} W_View;
|
||||
|
||||
|
||||
typedef struct W_EventHandler {
|
||||
unsigned long eventMask;
|
||||
|
||||
WMEventProc *proc;
|
||||
|
||||
void *clientData;
|
||||
|
||||
struct W_EventHandler *nextHandler;
|
||||
} W_EventHandler;
|
||||
|
||||
|
||||
|
||||
typedef struct W_ViewProcedureTable {
|
||||
void (*setBackgroundColor)(WMWidget*, WMColor *color);
|
||||
void (*resize)(WMWidget*, unsigned int, unsigned int);
|
||||
void (*move)(WMWidget*, int, int);
|
||||
} W_ViewProcedureTable;
|
||||
|
||||
|
||||
|
||||
typedef struct _WINGsConfiguration {
|
||||
char *systemFont;
|
||||
char *boldSystemFont;
|
||||
unsigned doubleClickDelay;
|
||||
} _WINGsConfiguration;
|
||||
|
||||
_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_PIXEL(c) (c)->color.pixel
|
||||
#define W_GC(c) (c)->gc
|
||||
|
||||
#define W_FONTID(f) (f)->font->fid
|
||||
|
||||
#define W_DRAWABLE(scr) (scr)->rootWin
|
||||
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
Bool W_CheckInternalMessage(W_Screen *scr, XClientMessageEvent *cev, int 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(W_ViewProcedureTable *procTable);
|
||||
|
||||
void W_RedisplayView(WMView *view);
|
||||
|
||||
Bool W_ApplicationInitialized(void);
|
||||
|
||||
char *W_GetTextSelection(WMScreen *scr, Atom selection);
|
||||
227
WINGs/WUtil.h
227
WINGs/WUtil.h
@@ -1,227 +0,0 @@
|
||||
#ifndef _WUTIL_H_
|
||||
#define _WUTIL_H_
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
||||
|
||||
|
||||
typedef enum {
|
||||
WMPostWhenIdle = 1,
|
||||
WMPostASAP = 2,
|
||||
WMPostNow = 3
|
||||
} WMPostingStyle;
|
||||
|
||||
|
||||
typedef enum {
|
||||
WNCNone = 0,
|
||||
WNCOnName = 1,
|
||||
WNCOnSender = 2
|
||||
} WMNotificationCoalescing;
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct W_HashTable WMHashTable;
|
||||
typedef struct W_UserDefaults WMUserDefaults;
|
||||
typedef struct W_Notification WMNotification;
|
||||
typedef struct W_NotificationQueue WMNotificationQueue;
|
||||
|
||||
|
||||
/* 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 WMNotificationObserverAction(void *observerData,
|
||||
WMNotification *notification);
|
||||
|
||||
|
||||
|
||||
/*......................................................................*/
|
||||
|
||||
|
||||
void wfatal(const char *msg, ...);
|
||||
void wwarning(const char *msg, ...);
|
||||
void wsyserror(const char *msg, ...);
|
||||
|
||||
char *wfindfile(char *paths, char *file);
|
||||
|
||||
char *wfindfileinlist(char **path_list, 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 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);
|
||||
|
||||
/*......................................................................*/
|
||||
|
||||
|
||||
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 */
|
||||
|
||||
/*......................................................................*/
|
||||
|
||||
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, unsigned mask);
|
||||
|
||||
void WMEnqueueNotification(WMNotificationQueue *queue, WMNotification *notification,
|
||||
WMPostingStyle postingStyle);
|
||||
|
||||
void WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
|
||||
WMNotification *notification,
|
||||
WMPostingStyle postingStyle,
|
||||
unsigned coalesceMask);
|
||||
|
||||
|
||||
/*......................................................................*/
|
||||
|
||||
WMUserDefaults *WMGetStandardUserDefaults(void);
|
||||
|
||||
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);
|
||||
|
||||
int 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);
|
||||
|
||||
|
||||
|
||||
#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;
|
||||
}
|
||||
}
|
||||
768
WINGs/bagtree.c
Normal file
768
WINGs/bagtree.c
Normal file
@@ -0,0 +1,768 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
typedef struct W_Node {
|
||||
struct W_Node *parent;
|
||||
struct W_Node *left;
|
||||
struct W_Node *right;
|
||||
int color;
|
||||
|
||||
void *data;
|
||||
int index;
|
||||
} W_Node;
|
||||
|
||||
typedef struct W_Bag {
|
||||
W_Node *root;
|
||||
|
||||
W_Node *nil; /* sentinel */
|
||||
|
||||
int count;
|
||||
|
||||
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_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *node2;
|
||||
|
||||
node2 = node->right;
|
||||
node->right = node2->left;
|
||||
|
||||
node2->left->parent = node;
|
||||
|
||||
node2->parent = node->parent;
|
||||
|
||||
if (node->parent == tree->nil) {
|
||||
tree->root = node2;
|
||||
} else {
|
||||
if (IS_LEFT(node)) {
|
||||
node->parent->left = node2;
|
||||
} else {
|
||||
node->parent->right = node2;
|
||||
}
|
||||
}
|
||||
node2->left = node;
|
||||
node->parent = node2;
|
||||
}
|
||||
|
||||
static void rightRotate(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *node2;
|
||||
|
||||
node2 = node->left;
|
||||
node->left = node2->right;
|
||||
|
||||
node2->right->parent = node;
|
||||
|
||||
node2->parent = node->parent;
|
||||
|
||||
if (node->parent == tree->nil) {
|
||||
tree->root = node2;
|
||||
} else {
|
||||
if (IS_LEFT(node)) {
|
||||
node->parent->left = node2;
|
||||
} else {
|
||||
node->parent->right = node2;
|
||||
}
|
||||
}
|
||||
node2->right = node;
|
||||
node->parent = node2;
|
||||
}
|
||||
|
||||
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)
|
||||
x = x->left;
|
||||
else
|
||||
x = x->right;
|
||||
}
|
||||
node->parent = y;
|
||||
if (y == tree->nil)
|
||||
tree->root = node;
|
||||
else if (node->index <= y->index)
|
||||
y->left = node;
|
||||
else
|
||||
y->right = node;
|
||||
}
|
||||
|
||||
static void rbTreeInsert(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *y;
|
||||
|
||||
treeInsert(tree, node);
|
||||
|
||||
node->color = 'R';
|
||||
|
||||
while (node != tree->root && node->parent->color == 'R') {
|
||||
if (IS_LEFT(node->parent)) {
|
||||
y = node->parent->parent->right;
|
||||
|
||||
if (y->color == 'R') {
|
||||
|
||||
node->parent->color = 'B';
|
||||
y->color = 'B';
|
||||
node->parent->parent->color = 'R';
|
||||
node = node->parent->parent;
|
||||
|
||||
} else {
|
||||
if (IS_RIGHT(node)) {
|
||||
node = node->parent;
|
||||
leftRotate(tree, node);
|
||||
}
|
||||
node->parent->color = 'B';
|
||||
node->parent->parent->color = 'R';
|
||||
rightRotate(tree, node->parent->parent);
|
||||
}
|
||||
} else {
|
||||
y = node->parent->parent->left;
|
||||
|
||||
if (y->color == 'R') {
|
||||
|
||||
node->parent->color = 'B';
|
||||
y->color = 'B';
|
||||
node->parent->parent->color = 'R';
|
||||
node = node->parent->parent;
|
||||
|
||||
} else {
|
||||
if (IS_LEFT(node)) {
|
||||
node = node->parent;
|
||||
rightRotate(tree, node);
|
||||
}
|
||||
node->parent->color = 'B';
|
||||
node->parent->parent->color = 'R';
|
||||
leftRotate(tree, node->parent->parent);
|
||||
}
|
||||
}
|
||||
}
|
||||
tree->root->color = 'B';
|
||||
}
|
||||
|
||||
static void rbDeleteFixup(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *w;
|
||||
|
||||
while (node != tree->root && node->color == 'B') {
|
||||
if (IS_LEFT(node)) {
|
||||
w = node->parent->right;
|
||||
if (w->color == 'R') {
|
||||
w->color = 'B';
|
||||
node->parent->color = 'R';
|
||||
leftRotate(tree, node->parent);
|
||||
w = node->parent->right;
|
||||
}
|
||||
if (w->left->color == 'B' && w->right->color == 'B') {
|
||||
w->color = 'R';
|
||||
node = node->parent;
|
||||
} else {
|
||||
if (w->right->color == 'B') {
|
||||
w->left->color = 'B';
|
||||
w->color = 'R';
|
||||
rightRotate(tree, w);
|
||||
w = node->parent->right;
|
||||
}
|
||||
w->color = node->parent->color;
|
||||
node->parent->color = 'B';
|
||||
w->right->color = 'B';
|
||||
leftRotate(tree, node->parent);
|
||||
node = tree->root;
|
||||
}
|
||||
} else {
|
||||
w = node->parent->left;
|
||||
if (w->color == 'R') {
|
||||
w->color = 'B';
|
||||
node->parent->color = 'R';
|
||||
rightRotate(tree, node->parent);
|
||||
w = node->parent->left;
|
||||
}
|
||||
if (w->left->color == 'B' && w->right->color == 'B') {
|
||||
w->color = 'R';
|
||||
node = node->parent;
|
||||
} else {
|
||||
if (w->left->color == 'B') {
|
||||
w->right->color = 'B';
|
||||
w->color = 'R';
|
||||
leftRotate(tree, w);
|
||||
w = node->parent->left;
|
||||
}
|
||||
w->color = node->parent->color;
|
||||
node->parent->color = 'B';
|
||||
w->left->color = 'B';
|
||||
rightRotate(tree, node->parent);
|
||||
node = tree->root;
|
||||
}
|
||||
}
|
||||
}
|
||||
node->color = 'B';
|
||||
|
||||
}
|
||||
|
||||
static W_Node *treeMinimum(W_Node * node, W_Node * nil)
|
||||
{
|
||||
while (node->left != nil)
|
||||
node = node->left;
|
||||
return node;
|
||||
}
|
||||
|
||||
static W_Node *treeMaximum(W_Node * node, W_Node * nil)
|
||||
{
|
||||
while (node->right != nil)
|
||||
node = node->right;
|
||||
return node;
|
||||
}
|
||||
|
||||
static W_Node *treeSuccessor(W_Node * node, W_Node * nil)
|
||||
{
|
||||
W_Node *y;
|
||||
|
||||
if (node->right != nil) {
|
||||
return treeMinimum(node->right, nil);
|
||||
}
|
||||
y = node->parent;
|
||||
while (y != nil && node == y->right) {
|
||||
node = y;
|
||||
y = y->parent;
|
||||
}
|
||||
return y;
|
||||
}
|
||||
|
||||
static W_Node *treePredecessor(W_Node * node, W_Node * nil)
|
||||
{
|
||||
W_Node *y;
|
||||
|
||||
if (node->left != nil) {
|
||||
return treeMaximum(node->left, nil);
|
||||
}
|
||||
y = node->parent;
|
||||
while (y != nil && node == y->left) {
|
||||
node = y;
|
||||
y = y->parent;
|
||||
}
|
||||
return y;
|
||||
}
|
||||
|
||||
static W_Node *rbTreeDelete(W_Bag * tree, W_Node * node)
|
||||
{
|
||||
W_Node *nil = tree->nil;
|
||||
W_Node *x, *y;
|
||||
|
||||
if (node->left == nil || node->right == nil) {
|
||||
y = node;
|
||||
} else {
|
||||
y = treeSuccessor(node, nil);
|
||||
}
|
||||
|
||||
if (y->left != nil) {
|
||||
x = y->left;
|
||||
} else {
|
||||
x = y->right;
|
||||
}
|
||||
|
||||
x->parent = y->parent;
|
||||
|
||||
if (y->parent == nil) {
|
||||
tree->root = x;
|
||||
} else {
|
||||
if (IS_LEFT(y)) {
|
||||
y->parent->left = x;
|
||||
} else {
|
||||
y->parent->right = x;
|
||||
}
|
||||
}
|
||||
if (y != node) {
|
||||
node->index = y->index;
|
||||
node->data = y->data;
|
||||
}
|
||||
if (y->color == 'B') {
|
||||
rbDeleteFixup(tree, x);
|
||||
}
|
||||
|
||||
return y;
|
||||
}
|
||||
|
||||
static W_Node *treeSearch(W_Node * root, W_Node * nil, int index)
|
||||
{
|
||||
if (root == nil || root->index == index) {
|
||||
return root;
|
||||
}
|
||||
|
||||
if (index < root->index) {
|
||||
return treeSearch(root->left, nil, index);
|
||||
} else {
|
||||
return treeSearch(root->right, nil, index);
|
||||
}
|
||||
}
|
||||
|
||||
static W_Node *treeFind(W_Node * root, W_Node * nil, void *data)
|
||||
{
|
||||
W_Node *tmp;
|
||||
|
||||
if (root == nil || root->data == data)
|
||||
return root;
|
||||
|
||||
tmp = treeFind(root->left, nil, data);
|
||||
if (tmp != nil)
|
||||
return tmp;
|
||||
|
||||
tmp = treeFind(root->right, nil, data);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static char buf[512];
|
||||
|
||||
static void printNodes(W_Node * node, W_Node * nil, int depth)
|
||||
{
|
||||
if (node == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
printNodes(node->left, nil, depth + 1);
|
||||
|
||||
memset(buf, ' ', depth * 2);
|
||||
buf[depth * 2] = 0;
|
||||
if (IS_LEFT(node))
|
||||
printf("%s/(%2i\n", buf, node->index);
|
||||
else
|
||||
printf("%s\\(%2i\n", buf, node->index);
|
||||
|
||||
printNodes(node->right, nil, depth + 1);
|
||||
}
|
||||
|
||||
void PrintTree(WMBag * bag)
|
||||
{
|
||||
W_TreeBag *tree = (W_TreeBag *) bag->data;
|
||||
|
||||
printNodes(tree->root, tree->nil, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
WMBag *WMCreateTreeBag(void)
|
||||
{
|
||||
return WMCreateTreeBagWithDestructor(NULL);
|
||||
}
|
||||
|
||||
WMBag *WMCreateTreeBagWithDestructor(WMFreeDataProc * destructor)
|
||||
{
|
||||
WMBag *bag;
|
||||
|
||||
bag = wmalloc(sizeof(WMBag));
|
||||
|
||||
memset(bag, 0, sizeof(WMBag));
|
||||
|
||||
bag->nil = wmalloc(sizeof(W_Node));
|
||||
memset(bag->nil, 0, 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;
|
||||
|
||||
return bag;
|
||||
}
|
||||
|
||||
int WMGetBagItemCount(WMBag * self)
|
||||
{
|
||||
return self->count;
|
||||
}
|
||||
|
||||
void WMAppendBag(WMBag * self, WMBag * bag)
|
||||
{
|
||||
WMBagIterator ptr;
|
||||
void *data;
|
||||
|
||||
for (data = WMBagFirst(bag, &ptr); data != NULL; data = WMBagNext(bag, &ptr)) {
|
||||
WMPutInBag(self, data);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
rbTreeInsert(self, ptr);
|
||||
|
||||
self->count++;
|
||||
}
|
||||
|
||||
void WMInsertInBag(WMBag * self, int index, void *item)
|
||||
{
|
||||
W_Node *ptr;
|
||||
|
||||
ptr = wmalloc(sizeof(W_Node));
|
||||
|
||||
ptr->data = item;
|
||||
ptr->index = index;
|
||||
ptr->left = self->nil;
|
||||
ptr->right = self->nil;
|
||||
ptr->parent = self->nil;
|
||||
|
||||
rbTreeInsert(self, ptr);
|
||||
|
||||
while ((ptr = treeSuccessor(ptr, self->nil)) != self->nil) {
|
||||
ptr->index++;
|
||||
}
|
||||
|
||||
self->count++;
|
||||
}
|
||||
|
||||
int WMRemoveFromBag(WMBag * self, void *item)
|
||||
{
|
||||
W_Node *ptr = treeFind(self->root, self->nil, item);
|
||||
|
||||
if (ptr != self->nil) {
|
||||
W_Node *tmp;
|
||||
|
||||
self->count--;
|
||||
|
||||
tmp = treeSuccessor(ptr, self->nil);
|
||||
while (tmp != self->nil) {
|
||||
tmp->index--;
|
||||
tmp = treeSuccessor(tmp, self->nil);
|
||||
}
|
||||
|
||||
ptr = rbTreeDelete(self, ptr);
|
||||
if (self->destructor)
|
||||
self->destructor(ptr->data);
|
||||
wfree(ptr);
|
||||
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int WMEraseFromBag(WMBag * self, int index)
|
||||
{
|
||||
W_Node *ptr = treeSearch(self->root, self->nil, index);
|
||||
|
||||
if (ptr != self->nil) {
|
||||
|
||||
self->count--;
|
||||
|
||||
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 {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int WMDeleteFromBag(WMBag * self, int index)
|
||||
{
|
||||
W_Node *ptr = treeSearch(self->root, self->nil, index);
|
||||
|
||||
if (ptr != self->nil) {
|
||||
W_Node *tmp;
|
||||
|
||||
self->count--;
|
||||
|
||||
tmp = treeSuccessor(ptr, self->nil);
|
||||
while (tmp != self->nil) {
|
||||
tmp->index--;
|
||||
tmp = treeSuccessor(tmp, self->nil);
|
||||
}
|
||||
|
||||
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 {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void *WMGetFromBag(WMBag * self, int index)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
node = treeSearch(self->root, self->nil, index);
|
||||
if (node != self->nil)
|
||||
return node->data;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int WMGetFirstInBag(WMBag * self, void *item)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
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;
|
||||
|
||||
if (root == nil)
|
||||
return 0;
|
||||
|
||||
if (root->data == item)
|
||||
count++;
|
||||
|
||||
if (root->left != nil)
|
||||
count += treeCount(root->left, nil, item);
|
||||
|
||||
if (root->right != nil)
|
||||
count += treeCount(root->right, nil, item);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
int WMCountInBag(WMBag * self, void *item)
|
||||
{
|
||||
return treeCount(self->root, self->nil, item);
|
||||
}
|
||||
|
||||
void *WMReplaceInBag(WMBag * self, int index, void *item)
|
||||
{
|
||||
W_Node *ptr = treeSearch(self->root, self->nil, index);
|
||||
void *old = NULL;
|
||||
|
||||
if (item == NULL) {
|
||||
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 {
|
||||
W_Node *ptr;
|
||||
|
||||
ptr = wmalloc(sizeof(W_Node));
|
||||
|
||||
ptr->data = item;
|
||||
ptr->index = index;
|
||||
ptr->left = self->nil;
|
||||
ptr->right = self->nil;
|
||||
ptr->parent = self->nil;
|
||||
|
||||
rbTreeInsert(self, ptr);
|
||||
|
||||
self->count++;
|
||||
}
|
||||
|
||||
return old;
|
||||
}
|
||||
|
||||
void WMSortBag(WMBag * self, WMCompareDataProc * comparer)
|
||||
{
|
||||
void **items;
|
||||
W_Node *tmp;
|
||||
int i;
|
||||
|
||||
if (self->count == 0)
|
||||
return;
|
||||
|
||||
items = wmalloc(sizeof(void *) * self->count);
|
||||
i = 0;
|
||||
|
||||
tmp = treeMinimum(self->root, self->nil);
|
||||
while (tmp != self->nil) {
|
||||
items[i++] = tmp->data;
|
||||
tmp = treeSuccessor(tmp, self->nil);
|
||||
}
|
||||
|
||||
qsort(&items[0], self->count, sizeof(void *), comparer);
|
||||
|
||||
i = 0;
|
||||
tmp = treeMinimum(self->root, self->nil);
|
||||
while (tmp != self->nil) {
|
||||
tmp->index = i;
|
||||
tmp->data = items[i++];
|
||||
tmp = treeSuccessor(tmp, self->nil);
|
||||
}
|
||||
|
||||
wfree(items);
|
||||
}
|
||||
|
||||
static void deleteTree(WMBag * self, W_Node * node)
|
||||
{
|
||||
if (node == self->nil)
|
||||
return;
|
||||
|
||||
deleteTree(self, node->left);
|
||||
|
||||
if (self->destructor)
|
||||
self->destructor(node->data);
|
||||
|
||||
deleteTree(self, node->right);
|
||||
|
||||
wfree(node);
|
||||
}
|
||||
|
||||
void WMEmptyBag(WMBag * self)
|
||||
{
|
||||
deleteTree(self, self->root);
|
||||
self->root = self->nil;
|
||||
self->count = 0;
|
||||
}
|
||||
|
||||
void WMFreeBag(WMBag * self)
|
||||
{
|
||||
WMEmptyBag(self);
|
||||
wfree(self->nil);
|
||||
wfree(self);
|
||||
}
|
||||
|
||||
static void mapTree(W_Bag * tree, W_Node * node, void (*function) (void *, void *), void *data)
|
||||
{
|
||||
if (node == tree->nil)
|
||||
return;
|
||||
|
||||
mapTree(tree, node->left, function, data);
|
||||
|
||||
(*function) (node->data, data);
|
||||
|
||||
mapTree(tree, node->right, function, data);
|
||||
}
|
||||
|
||||
void WMMapBag(WMBag * self, void (*function) (void *, void *), void *data)
|
||||
{
|
||||
mapTree(self, self->root, function, data);
|
||||
}
|
||||
|
||||
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, cdata);
|
||||
if (index != WBNotFound)
|
||||
return index;
|
||||
|
||||
if ((*function) (node->data, cdata)) {
|
||||
return node->index;
|
||||
}
|
||||
|
||||
return findInTree(tree, node->right, function, cdata);
|
||||
}
|
||||
|
||||
int WMFindInBag(WMBag * self, WMMatchDataProc * match, void *cdata)
|
||||
{
|
||||
return findInTree(self, self->root, match, cdata);
|
||||
}
|
||||
|
||||
void *WMBagFirst(WMBag * self, WMBagIterator * ptr)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
node = treeMinimum(self->root, self->nil);
|
||||
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
return NULL;
|
||||
} else {
|
||||
*ptr = node;
|
||||
return node->data;
|
||||
}
|
||||
}
|
||||
|
||||
void *WMBagLast(WMBag * self, WMBagIterator * ptr)
|
||||
{
|
||||
|
||||
W_Node *node;
|
||||
|
||||
node = treeMaximum(self->root, self->nil);
|
||||
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
return NULL;
|
||||
} else {
|
||||
*ptr = node;
|
||||
return node->data;
|
||||
}
|
||||
}
|
||||
|
||||
void *WMBagNext(WMBag * self, WMBagIterator * ptr)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
if (*ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
node = treeSuccessor(*ptr, self->nil);
|
||||
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
return NULL;
|
||||
} else {
|
||||
*ptr = node;
|
||||
return node->data;
|
||||
}
|
||||
}
|
||||
|
||||
void *WMBagPrevious(WMBag * self, WMBagIterator * ptr)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
if (*ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
node = treePredecessor(*ptr, self->nil);
|
||||
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
return NULL;
|
||||
} else {
|
||||
*ptr = node;
|
||||
return node->data;
|
||||
}
|
||||
}
|
||||
|
||||
void *WMBagIteratorAtIndex(WMBag * self, int index, WMBagIterator * ptr)
|
||||
{
|
||||
W_Node *node;
|
||||
|
||||
node = treeSearch(self->root, self->nil, index);
|
||||
|
||||
if (node == self->nil) {
|
||||
*ptr = NULL;
|
||||
return NULL;
|
||||
} else {
|
||||
*ptr = node;
|
||||
return node->data;
|
||||
}
|
||||
}
|
||||
|
||||
int WMBagIndexForIterator(WMBag * bag, WMBagIterator ptr)
|
||||
{
|
||||
return ((W_Node *) ptr)->index;
|
||||
}
|
||||
@@ -1,49 +1,107 @@
|
||||
|
||||
|
||||
#include "WINGsP.h"
|
||||
#include "wconfig.h"
|
||||
|
||||
#include <proplist.h>
|
||||
|
||||
#include <X11/Xlocale.h>
|
||||
|
||||
_WINGsConfiguration WINGsConfiguration;
|
||||
|
||||
#define SYSTEM_FONT "Trebuchet MS,Luxi Sans"
|
||||
#define BOLD_SYSTEM_FONT "Trebuchet MS,Luxi Sans:bold"
|
||||
#define DEFAULT_FONT_SIZE 12
|
||||
|
||||
#define FLOPPY_PATH "/floppy"
|
||||
|
||||
#define SYSTEM_FONT "-*-helvetica-medium-r-normal-*-%d-*-*-*-*-*-*-*"
|
||||
|
||||
#define BOLD_SYSTEM_FONT "-*-helvetica-bold-r-normal-*-%d-*-*-*-*-*-*-*"
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
W_ReadConfigurations(void)
|
||||
static unsigned getButtonWithName(const char *name, unsigned defaultButton)
|
||||
{
|
||||
WMUserDefaults *defaults;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
memset(&WINGsConfiguration, 0, sizeof(_WINGsConfiguration));
|
||||
|
||||
defaults = WMGetStandardUserDefaults();
|
||||
|
||||
if (defaults) {
|
||||
WINGsConfiguration.systemFont =
|
||||
WMGetUDStringForKey(defaults, "SystemFont");
|
||||
|
||||
WINGsConfiguration.boldSystemFont =
|
||||
WMGetUDStringForKey(defaults, "BoldSystemFont");
|
||||
|
||||
WINGsConfiguration.doubleClickDelay =
|
||||
WMGetUDIntegerForKey(defaults, "DoubleClickTime");
|
||||
}
|
||||
|
||||
if (!WINGsConfiguration.systemFont) {
|
||||
WINGsConfiguration.systemFont = SYSTEM_FONT;
|
||||
}
|
||||
if (!WINGsConfiguration.boldSystemFont) {
|
||||
WINGsConfiguration.boldSystemFont = BOLD_SYSTEM_FONT;
|
||||
}
|
||||
if (WINGsConfiguration.doubleClickDelay == 0) {
|
||||
WINGsConfiguration.doubleClickDelay = 250;
|
||||
}
|
||||
return defaultButton;
|
||||
}
|
||||
|
||||
void W_ReadConfigurations(void)
|
||||
{
|
||||
WMUserDefaults *defaults;
|
||||
|
||||
memset(&WINGsConfiguration, 0, sizeof(_WINGsConfiguration));
|
||||
|
||||
defaults = WMGetStandardUserDefaults();
|
||||
|
||||
if (defaults) {
|
||||
char *buttonName;
|
||||
unsigned button;
|
||||
|
||||
WINGsConfiguration.systemFont = WMGetUDStringForKey(defaults, "SystemFont");
|
||||
|
||||
WINGsConfiguration.boldSystemFont = WMGetUDStringForKey(defaults, "BoldSystemFont");
|
||||
|
||||
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;
|
||||
}
|
||||
if (!WINGsConfiguration.boldSystemFont) {
|
||||
WINGsConfiguration.boldSystemFont = BOLD_SYSTEM_FONT;
|
||||
}
|
||||
if (WINGsConfiguration.defaultFontSize == 0) {
|
||||
WINGsConfiguration.defaultFontSize = DEFAULT_FONT_SIZE;
|
||||
}
|
||||
if (!WINGsConfiguration.floppyPath) {
|
||||
WINGsConfiguration.floppyPath = FLOPPY_PATH;
|
||||
}
|
||||
if (WINGsConfiguration.doubleClickDelay == 0) {
|
||||
WINGsConfiguration.doubleClickDelay = 250;
|
||||
}
|
||||
if (WINGsConfiguration.mouseWheelUp == 0) {
|
||||
WINGsConfiguration.mouseWheelUp = Button4;
|
||||
}
|
||||
if (WINGsConfiguration.mouseWheelDown == 0) {
|
||||
WINGsConfiguration.mouseWheelDown = Button5;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
958
WINGs/connection.c
Normal file
958
WINGs/connection.c
Normal file
@@ -0,0 +1,958 @@
|
||||
/*
|
||||
* WINGs WMConnection function library
|
||||
*
|
||||
* 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
|
||||
* 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.
|
||||
* - decide what to do with all wwarning() calls that are still there.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "wconfig.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
|
||||
|
||||
/* For Solaris */
|
||||
#ifndef INADDR_NONE
|
||||
# define INADDR_NONE -1
|
||||
#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;
|
||||
|
||||
static unsigned int DefaultTimeout = DEF_TIMEOUT;
|
||||
static unsigned int OpenTimeout = DEF_TIMEOUT;
|
||||
|
||||
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 */
|
||||
|
||||
WMArray *outputQueue;
|
||||
unsigned bufPos;
|
||||
|
||||
TimeoutData sendTimeout;
|
||||
TimeoutData openTimeout;
|
||||
|
||||
WMConnectionState state;
|
||||
WMConnectionTimeoutState timeoutState;
|
||||
|
||||
char *address;
|
||||
char *service;
|
||||
char *protocol;
|
||||
|
||||
Bool closeOnRelease;
|
||||
Bool shutdownOnClose;
|
||||
Bool wasNonBlocking;
|
||||
Bool isNonBlocking;
|
||||
|
||||
} W_Connection;
|
||||
|
||||
static void clearOutputQueue(WMConnection * cPtr)
|
||||
{
|
||||
cPtr->bufPos = 0;
|
||||
WMEmptyArray(cPtr->outputQueue);
|
||||
}
|
||||
|
||||
static void openTimeout(void *cdata)
|
||||
{
|
||||
WMConnection *cPtr = (WMConnection *) cdata;
|
||||
|
||||
cPtr->openTimeout.handler = NULL;
|
||||
if (cPtr->handler.write) {
|
||||
WMDeleteInputHandler(cPtr->handler.write);
|
||||
cPtr->handler.write = NULL;
|
||||
}
|
||||
if (cPtr->state != WCConnected) {
|
||||
cPtr->state = WCTimedOut;
|
||||
cPtr->timeoutState = WCTWhileOpening;
|
||||
if (cPtr->delegate && cPtr->delegate->didTimeout) {
|
||||
(*cPtr->delegate->didTimeout) (cPtr->delegate, cPtr);
|
||||
} else {
|
||||
WMCloseConnection(cPtr);
|
||||
cPtr->state = WCTimedOut; /* the above set state to WCClosed */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sendTimeout(void *cdata)
|
||||
{
|
||||
WMConnection *cPtr = (WMConnection *) cdata;
|
||||
|
||||
cPtr->sendTimeout.handler = NULL;
|
||||
if (cPtr->handler.write) {
|
||||
WMDeleteInputHandler(cPtr->handler.write);
|
||||
cPtr->handler.write = NULL;
|
||||
}
|
||||
if (WMGetArrayItemCount(cPtr->outputQueue) > 0) {
|
||||
clearOutputQueue(cPtr);
|
||||
cPtr->state = WCTimedOut;
|
||||
cPtr->timeoutState = WCTWhileSending;
|
||||
/* // should we close it no matter what (after calling the didTimeout
|
||||
// delegate)? -Dan */
|
||||
if (cPtr->delegate && cPtr->delegate->didTimeout) {
|
||||
(*cPtr->delegate->didTimeout) (cPtr->delegate, cPtr);
|
||||
} else {
|
||||
WMCloseConnection(cPtr);
|
||||
cPtr->state = WCTimedOut; /* the above set state to WCClosed */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void inputHandler(int fd, int mask, void *clientData)
|
||||
{
|
||||
WMConnection *cPtr = (WMConnection *) clientData;
|
||||
|
||||
if (cPtr->state == WCClosed || cPtr->state == WCDied)
|
||||
return;
|
||||
|
||||
if ((mask & WIWriteMask)) {
|
||||
int result;
|
||||
|
||||
if (cPtr->state == WCInProgress) {
|
||||
Bool failed;
|
||||
socklen_t len = sizeof(result);
|
||||
|
||||
WCErrorCode = 0;
|
||||
if (getsockopt(cPtr->sock, SOL_SOCKET, SO_ERROR,
|
||||
(void *)&result, &len) == 0 && result != 0) {
|
||||
cPtr->state = WCFailed;
|
||||
WCErrorCode = result;
|
||||
failed = True;
|
||||
/* should call wsyserrorwithcode(result, ...) here? */
|
||||
} else {
|
||||
cPtr->state = WCConnected;
|
||||
failed = False;
|
||||
}
|
||||
|
||||
if (cPtr->handler.write) {
|
||||
WMDeleteInputHandler(cPtr->handler.write);
|
||||
cPtr->handler.write = NULL;
|
||||
}
|
||||
|
||||
if (cPtr->openTimeout.handler) {
|
||||
WMDeleteTimerHandler(cPtr->openTimeout.handler);
|
||||
cPtr->openTimeout.handler = NULL;
|
||||
}
|
||||
|
||||
if (cPtr->delegate && cPtr->delegate->didInitialize)
|
||||
(*cPtr->delegate->didInitialize) (cPtr->delegate, cPtr);
|
||||
|
||||
/* we use failed and not cPtr->state here, because cPtr may be
|
||||
* destroyed by the delegate called above if the connection failed
|
||||
*/
|
||||
if (failed)
|
||||
return;
|
||||
} else if (cPtr->state == WCConnected) {
|
||||
result = WMFlushConnection(cPtr);
|
||||
if (result > 0 && cPtr->delegate && cPtr->delegate->canResumeSending) {
|
||||
(*cPtr->delegate->canResumeSending) (cPtr->delegate, 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)
|
||||
{
|
||||
int state;
|
||||
Bool isNonBlock;
|
||||
|
||||
state = fcntl(sock, F_GETFL, 0);
|
||||
|
||||
if (state < 0) {
|
||||
/* set WCErrorCode here? -Dan */
|
||||
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) {
|
||||
/* set WCErrorCode here? -Dan */
|
||||
return False;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
static void setConnectionAddress(WMConnection * cPtr, struct sockaddr_in *socketaddr)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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 void dummyHandler(int signum)
|
||||
{
|
||||
}
|
||||
|
||||
static WMConnection *createConnectionWithSocket(int sock, Bool closeOnRelease)
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
struct sigaction sig_action;
|
||||
|
||||
cPtr = wmalloc(sizeof(WMConnection));
|
||||
wretain(cPtr);
|
||||
memset(cPtr, 0, sizeof(WMConnection));
|
||||
|
||||
fcntl(sock, F_SETFD, FD_CLOEXEC); /* by default close on exec */
|
||||
|
||||
cPtr->sock = sock;
|
||||
cPtr->openTimeout.timeout = OpenTimeout;
|
||||
cPtr->openTimeout.handler = NULL;
|
||||
cPtr->sendTimeout.timeout = DefaultTimeout;
|
||||
cPtr->sendTimeout.handler = NULL;
|
||||
cPtr->closeOnRelease = closeOnRelease;
|
||||
cPtr->shutdownOnClose = 1;
|
||||
cPtr->outputQueue = WMCreateArrayWithDestructor(16, (WMFreeDataProc *) WMReleaseData);
|
||||
cPtr->state = WCNotConnected;
|
||||
cPtr->timeoutState = WCTNone;
|
||||
|
||||
/* ignore dead pipe */
|
||||
if (!SigInitialized) {
|
||||
/* Because POSIX mandates that only signal with handlers are reset
|
||||
* accross an exec*(), we do not want to propagate ignoring SIGPIPEs
|
||||
* to children. Hence the dummy handler. Philippe Troin <phil@fifi.org>
|
||||
*/
|
||||
sig_action.sa_handler = &dummyHandler;
|
||||
sig_action.sa_flags = SA_RESTART;
|
||||
sigaction(SIGPIPE, &sig_action, NULL);
|
||||
SigInitialized = True;
|
||||
}
|
||||
|
||||
return cPtr;
|
||||
}
|
||||
|
||||
#if 0
|
||||
WMConnection *WMCreateConnectionWithSocket(int sock, Bool closeOnRelease)
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
struct sockaddr_in clientname;
|
||||
int size;
|
||||
int 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)
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
struct sockaddr_in *socketaddr;
|
||||
socklen_t size;
|
||||
int sock, on;
|
||||
|
||||
WCErrorCode = 0;
|
||||
|
||||
if ((socketaddr = getSocketAddress(host, service, protocol)) == NULL) {
|
||||
wwarning(_("Bad address-service-protocol combination"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create the actual socket */
|
||||
sock = socket(PF_INET, SOCK_STREAM, 0);
|
||||
if (sock < 0) {
|
||||
WCErrorCode = errno;
|
||||
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;
|
||||
close(sock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (listen(sock, 10) < 0) {
|
||||
WCErrorCode = errno;
|
||||
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;
|
||||
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)
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
struct sockaddr_in *socketaddr;
|
||||
int sock;
|
||||
|
||||
WCErrorCode = 0;
|
||||
|
||||
wassertrv(service != NULL && service[0] != 0, NULL);
|
||||
|
||||
if (host == NULL || host[0] == 0)
|
||||
host = "localhost";
|
||||
|
||||
if ((socketaddr = getSocketAddress(host, service, protocol)) == NULL) {
|
||||
wwarning(_("Bad address-service-protocol combination"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create the actual socket */
|
||||
sock = socket(PF_INET, SOCK_STREAM, 0);
|
||||
if (sock < 0) {
|
||||
WCErrorCode = errno;
|
||||
return NULL;
|
||||
}
|
||||
/* make socket blocking while we connect. */
|
||||
setSocketNonBlocking(sock, False);
|
||||
if (connect(sock, (struct sockaddr *)socketaddr, sizeof(*socketaddr)) < 0) {
|
||||
WCErrorCode = errno;
|
||||
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)
|
||||
{
|
||||
WMConnection *cPtr;
|
||||
struct sockaddr_in *socketaddr;
|
||||
int sock;
|
||||
Bool isNonBlocking;
|
||||
|
||||
WCErrorCode = 0;
|
||||
|
||||
wassertrv(service != NULL && service[0] != 0, NULL);
|
||||
|
||||
if (host == NULL || host[0] == 0)
|
||||
host = "localhost";
|
||||
|
||||
if ((socketaddr = getSocketAddress(host, service, protocol)) == NULL) {
|
||||
wwarning(_("Bad address-service-protocol combination"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create the actual socket */
|
||||
sock = socket(PF_INET, SOCK_STREAM, 0);
|
||||
if (sock < 0) {
|
||||
WCErrorCode = errno;
|
||||
return NULL;
|
||||
}
|
||||
isNonBlocking = setSocketNonBlocking(sock, True);
|
||||
if (connect(sock, (struct sockaddr *)socketaddr, sizeof(*socketaddr)) < 0) {
|
||||
if (errno != EINPROGRESS) {
|
||||
WCErrorCode = errno;
|
||||
close(sock);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
cPtr = createConnectionWithSocket(sock, True);
|
||||
cPtr->state = WCInProgress;
|
||||
cPtr->isNonBlocking = isNonBlocking;
|
||||
|
||||
cPtr->handler.write = WMAddInputHandler(cPtr->sock, WIWriteMask, inputHandler, cPtr);
|
||||
|
||||
cPtr->openTimeout.handler = WMAddTimerHandler(cPtr->openTimeout.timeout * 1000, openTimeout, cPtr);
|
||||
|
||||
setConnectionAddress(cPtr, socketaddr);
|
||||
|
||||
return cPtr;
|
||||
}
|
||||
|
||||
static void removeAllHandlers(WMConnection * cPtr)
|
||||
{
|
||||
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->openTimeout.handler)
|
||||
WMDeleteTimerHandler(cPtr->openTimeout.handler);
|
||||
if (cPtr->sendTimeout.handler)
|
||||
WMDeleteTimerHandler(cPtr->sendTimeout.handler);
|
||||
|
||||
cPtr->handler.read = NULL;
|
||||
cPtr->handler.write = NULL;
|
||||
cPtr->handler.exception = NULL;
|
||||
cPtr->openTimeout.handler = NULL;
|
||||
cPtr->sendTimeout.handler = NULL;
|
||||
}
|
||||
|
||||
void WMDestroyConnection(WMConnection * cPtr)
|
||||
{
|
||||
if (cPtr->closeOnRelease && cPtr->sock >= 0) {
|
||||
if (cPtr->shutdownOnClose) {
|
||||
shutdown(cPtr->sock, SHUT_RDWR);
|
||||
}
|
||||
close(cPtr->sock);
|
||||
}
|
||||
|
||||
removeAllHandlers(cPtr);
|
||||
WMFreeArray(cPtr->outputQueue); /* will also free the items with the destructor */
|
||||
|
||||
if (cPtr->address) {
|
||||
wfree(cPtr->address);
|
||||
wfree(cPtr->service);
|
||||
wfree(cPtr->protocol);
|
||||
}
|
||||
|
||||
wrelease(cPtr);
|
||||
}
|
||||
|
||||
void WMCloseConnection(WMConnection * cPtr)
|
||||
{
|
||||
if (cPtr->sock >= 0) {
|
||||
if (cPtr->shutdownOnClose) {
|
||||
shutdown(cPtr->sock, SHUT_RDWR);
|
||||
}
|
||||
close(cPtr->sock);
|
||||
cPtr->sock = -1;
|
||||
}
|
||||
|
||||
removeAllHandlers(cPtr);
|
||||
clearOutputQueue(cPtr);
|
||||
|
||||
cPtr->state = WCClosed;
|
||||
}
|
||||
|
||||
WMConnection *WMAcceptConnection(WMConnection * listener)
|
||||
{
|
||||
struct sockaddr_in clientname;
|
||||
socklen_t size;
|
||||
int newSock;
|
||||
WMConnection *newConnection;
|
||||
|
||||
WCErrorCode = 0;
|
||||
wassertrv(listener && listener->state == WCListening, NULL);
|
||||
|
||||
size = sizeof(clientname);
|
||||
newSock = accept(listener->sock, (struct sockaddr *)&clientname, &size);
|
||||
if (newSock < 0) {
|
||||
WCErrorCode = ((errno != EAGAIN && errno != EWOULDBLOCK) ? errno : 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
newConnection = createConnectionWithSocket(newSock, True);
|
||||
WMSetConnectionNonBlocking(newConnection, True);
|
||||
newConnection->state = WCConnected;
|
||||
setConnectionAddress(newConnection, &clientname);
|
||||
|
||||
return newConnection;
|
||||
}
|
||||
|
||||
char *WMGetConnectionAddress(WMConnection * cPtr)
|
||||
{
|
||||
return cPtr->address;
|
||||
}
|
||||
|
||||
char *WMGetConnectionService(WMConnection * cPtr)
|
||||
{
|
||||
return cPtr->service;
|
||||
}
|
||||
|
||||
char *WMGetConnectionProtocol(WMConnection * cPtr)
|
||||
{
|
||||
return cPtr->protocol;
|
||||
}
|
||||
|
||||
int WMGetConnectionSocket(WMConnection * cPtr)
|
||||
{
|
||||
return cPtr->sock;
|
||||
}
|
||||
|
||||
WMConnectionState WMGetConnectionState(WMConnection * cPtr)
|
||||
{
|
||||
return cPtr->state;
|
||||
}
|
||||
|
||||
WMConnectionTimeoutState WMGetConnectionTimeoutState(WMConnection * cPtr)
|
||||
{
|
||||
return cPtr->timeoutState;
|
||||
}
|
||||
|
||||
Bool WMEnqueueConnectionData(WMConnection * cPtr, WMData * data)
|
||||
{
|
||||
wassertrv(cPtr->state != WCNotConnected && cPtr->state != WCListening, False);
|
||||
wassertrv(cPtr->state != WCInProgress && cPtr->state != WCFailed, False);
|
||||
|
||||
if (cPtr->state != WCConnected)
|
||||
return False;
|
||||
|
||||
WMAddToArray(cPtr->outputQueue, WMRetainData(data));
|
||||
return True;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return value:
|
||||
* -1 - not connected or connection died while sending
|
||||
* 0 - couldn't send the data (or part of it). data is saved in a queue
|
||||
* and will be sent when possible. after it is sent the canResumeSending
|
||||
* callback will be called.
|
||||
* 1 - data was succesfully sent
|
||||
*/
|
||||
int WMSendConnectionData(WMConnection * cPtr, WMData * data)
|
||||
{
|
||||
int bytes, pos, len;
|
||||
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) {
|
||||
WMAddToArray(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 (WMGetArrayItemCount(cPtr->outputQueue) > 1 && cPtr->handler.write)
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (WMGetArrayItemCount(cPtr->outputQueue) > 0) {
|
||||
data = WMGetFromArray(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 0;
|
||||
default:
|
||||
WCErrorCode = errno;
|
||||
cPtr->state = WCDied;
|
||||
removeAllHandlers(cPtr);
|
||||
if (cPtr->delegate && cPtr->delegate->didDie)
|
||||
(*cPtr->delegate->didDie) (cPtr->delegate, cPtr);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
pos += bytes;
|
||||
}
|
||||
WMDeleteFromArray(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;
|
||||
} */
|
||||
}
|
||||
|
||||
if (cPtr->handler.write) {
|
||||
WMDeleteInputHandler(cPtr->handler.write);
|
||||
cPtr->handler.write = NULL;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
#if 1
|
||||
int state;
|
||||
|
||||
state = fcntl(cPtr->sock, F_GETFL, 0);
|
||||
|
||||
if (state < 0) {
|
||||
/* 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
|
||||
|
||||
Bool WMSetConnectionNonBlocking(WMConnection * cPtr, Bool flag)
|
||||
{
|
||||
wassertrv(cPtr != NULL && cPtr->sock >= 0, False);
|
||||
|
||||
flag = ((flag == 0) ? 0 : 1);
|
||||
|
||||
if (cPtr->isNonBlocking == flag)
|
||||
return True;
|
||||
|
||||
if (setSocketNonBlocking(cPtr->sock, flag) == True) {
|
||||
cPtr->isNonBlocking = flag;
|
||||
return True;
|
||||
}
|
||||
|
||||
return False;
|
||||
}
|
||||
|
||||
Bool WMSetConnectionCloseOnExec(WMConnection * cPtr, Bool flag)
|
||||
{
|
||||
wassertrv(cPtr != NULL && cPtr->sock >= 0, False);
|
||||
|
||||
if (fcntl(cPtr->sock, F_SETFD, ((flag == 0) ? 0 : FD_CLOEXEC)) < 0) {
|
||||
return False;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
void WMSetConnectionShutdownOnClose(WMConnection * cPtr, Bool flag)
|
||||
{
|
||||
cPtr->shutdownOnClose = ((flag == 0) ? 0 : 1);
|
||||
}
|
||||
|
||||
void *WMGetConnectionClientData(WMConnection * cPtr)
|
||||
{
|
||||
return cPtr->clientData;
|
||||
}
|
||||
|
||||
void WMSetConnectionClientData(WMConnection * cPtr, void *data)
|
||||
{
|
||||
cPtr->clientData = data;
|
||||
}
|
||||
|
||||
unsigned int WMGetConnectionFlags(WMConnection * cPtr)
|
||||
{
|
||||
return cPtr->uflags;
|
||||
}
|
||||
|
||||
void WMSetConnectionFlags(WMConnection * cPtr, unsigned int flags)
|
||||
{
|
||||
cPtr->uflags = flags;
|
||||
}
|
||||
|
||||
WMArray *WMGetConnectionUnsentData(WMConnection * cPtr)
|
||||
{
|
||||
return cPtr->outputQueue;
|
||||
}
|
||||
|
||||
void WMSetConnectionDefaultTimeout(unsigned int timeout)
|
||||
{
|
||||
if (timeout == 0) {
|
||||
DefaultTimeout = DEF_TIMEOUT;
|
||||
} else {
|
||||
DefaultTimeout = timeout;
|
||||
}
|
||||
}
|
||||
|
||||
void WMSetConnectionOpenTimeout(unsigned int timeout)
|
||||
{
|
||||
if (timeout == 0) {
|
||||
OpenTimeout = DefaultTimeout;
|
||||
} else {
|
||||
OpenTimeout = timeout;
|
||||
}
|
||||
}
|
||||
|
||||
void WMSetConnectionSendTimeout(WMConnection * cPtr, unsigned int timeout)
|
||||
{
|
||||
if (timeout == 0) {
|
||||
cPtr->sendTimeout.timeout = DefaultTimeout;
|
||||
} else {
|
||||
cPtr->sendTimeout.timeout = timeout;
|
||||
}
|
||||
}
|
||||
289
WINGs/data.c
Normal file
289
WINGs/data.c
Normal file
@@ -0,0 +1,289 @@
|
||||
/*
|
||||
* WINGs WMData function library
|
||||
*
|
||||
* 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
|
||||
* 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 <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;
|
||||
WMFreeDataProc *destructor;
|
||||
int format; /* 0, 8, 16 or 32 */
|
||||
} W_Data;
|
||||
|
||||
/* Creating and destroying data objects */
|
||||
|
||||
WMData *WMCreateDataWithCapacity(unsigned capacity)
|
||||
{
|
||||
WMData *aData;
|
||||
|
||||
aData = (WMData *) wmalloc(sizeof(WMData));
|
||||
|
||||
if (capacity > 0)
|
||||
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->format = 0;
|
||||
aData->destructor = wfree;
|
||||
|
||||
return aData;
|
||||
}
|
||||
|
||||
WMData *WMCreateDataWithLength(unsigned length)
|
||||
{
|
||||
WMData *aData;
|
||||
|
||||
aData = WMCreateDataWithCapacity(length);
|
||||
if (length > 0) {
|
||||
memset(aData->bytes, 0, length);
|
||||
aData->length = length;
|
||||
}
|
||||
|
||||
return aData;
|
||||
}
|
||||
|
||||
WMData *WMCreateDataWithBytes(void *bytes, unsigned length)
|
||||
{
|
||||
WMData *aData;
|
||||
|
||||
aData = WMCreateDataWithCapacity(length);
|
||||
aData->length = length;
|
||||
memcpy(aData->bytes, bytes, length);
|
||||
|
||||
return aData;
|
||||
}
|
||||
|
||||
WMData *WMCreateDataWithBytesNoCopy(void *bytes, unsigned length, WMFreeDataProc * destructor)
|
||||
{
|
||||
WMData *aData;
|
||||
|
||||
aData = (WMData *) wmalloc(sizeof(WMData));
|
||||
aData->length = length;
|
||||
aData->capacity = length;
|
||||
aData->growth = length / 2 > 0 ? length / 2 : 1;
|
||||
aData->bytes = bytes;
|
||||
aData->retainCount = 1;
|
||||
aData->format = 0;
|
||||
aData->destructor = destructor;
|
||||
|
||||
return aData;
|
||||
}
|
||||
|
||||
WMData *WMCreateDataWithData(WMData * aData)
|
||||
{
|
||||
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)
|
||||
{
|
||||
aData->retainCount++;
|
||||
return aData;
|
||||
}
|
||||
|
||||
void WMReleaseData(WMData * aData)
|
||||
{
|
||||
aData->retainCount--;
|
||||
if (aData->retainCount > 0)
|
||||
return;
|
||||
if (aData->bytes != NULL && aData->destructor != NULL) {
|
||||
aData->destructor(aData->bytes);
|
||||
}
|
||||
wfree(aData);
|
||||
}
|
||||
|
||||
/* Adjusting capacity */
|
||||
|
||||
void WMSetDataCapacity(WMData * aData, unsigned capacity)
|
||||
{
|
||||
if (aData->capacity != capacity) {
|
||||
aData->bytes = wrealloc(aData->bytes, capacity);
|
||||
aData->capacity = capacity;
|
||||
aData->growth = capacity / 2 > 0 ? capacity / 2 : 1;
|
||||
}
|
||||
if (aData->length > capacity) {
|
||||
aData->length = capacity;
|
||||
}
|
||||
}
|
||||
|
||||
void WMSetDataLength(WMData * aData, unsigned length)
|
||||
{
|
||||
if (length > aData->capacity) {
|
||||
WMSetDataCapacity(aData, length);
|
||||
}
|
||||
if (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)
|
||||
{
|
||||
WMSetDataLength(aData, aData->length + extraLength);
|
||||
}
|
||||
|
||||
/* Accessing data */
|
||||
|
||||
const void *WMDataBytes(WMData * aData)
|
||||
{
|
||||
return aData->bytes;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
wassertr(aData->length > 0);
|
||||
wassertr(length <= aData->length);
|
||||
|
||||
memcpy(buffer, aData->bytes, length);
|
||||
}
|
||||
|
||||
void WMGetDataBytesWithRange(WMData * aData, void *buffer, WMRange aRange)
|
||||
{
|
||||
wassertr(aRange.position < aData->length);
|
||||
wassertr(aRange.count <= aData->length - aRange.position);
|
||||
|
||||
memcpy(buffer, (unsigned char *)aData->bytes + aRange.position, aRange.count);
|
||||
}
|
||||
|
||||
WMData *WMGetSubdataWithRange(WMData * aData, WMRange aRange)
|
||||
{
|
||||
void *buffer;
|
||||
WMData *newData;
|
||||
|
||||
if (aRange.count <= 0)
|
||||
return WMCreateDataWithCapacity(0);
|
||||
|
||||
buffer = wmalloc(aRange.count);
|
||||
WMGetDataBytesWithRange(aData, buffer, aRange);
|
||||
newData = WMCreateDataWithBytesNoCopy(buffer, aRange.count, wfree);
|
||||
newData->format = aData->format;
|
||||
|
||||
return newData;
|
||||
}
|
||||
|
||||
/* Testing data */
|
||||
|
||||
Bool WMIsDataEqualToData(WMData * aData, WMData * anotherData)
|
||||
{
|
||||
if (aData->length != anotherData->length)
|
||||
return False;
|
||||
else if (!aData->bytes && !anotherData->bytes) /* both are empty */
|
||||
return True;
|
||||
else if (!aData->bytes || !anotherData->bytes) /* one of them is empty */
|
||||
return False;
|
||||
return (memcmp(aData->bytes, anotherData->bytes, aData->length) == 0);
|
||||
}
|
||||
|
||||
unsigned WMGetDataLength(WMData * aData)
|
||||
{
|
||||
return aData->length;
|
||||
}
|
||||
|
||||
/* Adding data */
|
||||
void WMAppendDataBytes(WMData * aData, void *bytes, unsigned length)
|
||||
{
|
||||
unsigned oldLength = aData->length;
|
||||
unsigned newLength = oldLength + length;
|
||||
|
||||
if (newLength > aData->capacity) {
|
||||
unsigned nextCapacity = aData->capacity + aData->growth;
|
||||
unsigned nextGrowth = aData->capacity ? aData->capacity : 1;
|
||||
|
||||
while (nextCapacity < newLength) {
|
||||
unsigned tmp = nextCapacity + nextGrowth;
|
||||
|
||||
nextGrowth = nextCapacity;
|
||||
nextCapacity = tmp;
|
||||
}
|
||||
WMSetDataCapacity(aData, nextCapacity);
|
||||
aData->growth = nextGrowth;
|
||||
}
|
||||
memcpy((unsigned char *)aData->bytes + oldLength, bytes, length);
|
||||
aData->length = newLength;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
wassertr(aRange.position < aData->length);
|
||||
wassertr(aRange.count <= aData->length - aRange.position);
|
||||
|
||||
memcpy((unsigned char *)aData->bytes + aRange.position, bytes, aRange.count);
|
||||
}
|
||||
|
||||
void WMResetDataBytesInRange(WMData * aData, WMRange aRange)
|
||||
{
|
||||
wassertr(aRange.position < aData->length);
|
||||
wassertr(aRange.count <= aData->length - aRange.position);
|
||||
|
||||
memset((unsigned char *)aData->bytes + aRange.position, 0, aRange.count);
|
||||
}
|
||||
|
||||
void WMSetData(WMData * aData, WMData * anotherData)
|
||||
{
|
||||
unsigned length = anotherData->length;
|
||||
|
||||
WMSetDataCapacity(aData, length);
|
||||
if (length > 0)
|
||||
memcpy(aData->bytes, anotherData->bytes, length);
|
||||
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 %d 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);
|
||||
}
|
||||
978
WINGs/dragdestination.c
Normal file
978
WINGs/dragdestination.c
Normal file
@@ -0,0 +1,978 @@
|
||||
|
||||
#include "WINGsP.h"
|
||||
#include <X11/Xatom.h>
|
||||
|
||||
#define XDND_SOURCE_RESPONSE_MAX_DELAY 3000
|
||||
|
||||
#define XDND_PROPERTY_FORMAT 32
|
||||
#define XDND_ACTION_DESCRIPTION_FORMAT 8
|
||||
|
||||
#define XDND_SOURCE_VERSION(dragInfo) dragInfo->protocolVersion
|
||||
#define XDND_DEST_INFO(dragInfo) dragInfo->destInfo
|
||||
#define XDND_AWARE_VIEW(dragInfo) dragInfo->destInfo->xdndAwareView
|
||||
#define XDND_SOURCE_WIN(dragInfo) dragInfo->destInfo->sourceWindow
|
||||
#define XDND_DEST_VIEW(dragInfo) dragInfo->destInfo->destView
|
||||
#define XDND_DEST_STATE(dragInfo) dragInfo->destInfo->state
|
||||
#define XDND_SOURCE_ACTION_CHANGED(dragInfo) dragInfo->destInfo->sourceActionChanged
|
||||
#define XDND_SOURCE_TYPES(dragInfo) dragInfo->destInfo->sourceTypes
|
||||
#define XDND_TYPE_LIST_AVAILABLE(dragInfo) dragInfo->destInfo->typeListAvailable
|
||||
#define XDND_REQUIRED_TYPES(dragInfo) dragInfo->destInfo->requiredTypes
|
||||
#define XDND_SOURCE_ACTION(dragInfo) dragInfo->sourceAction
|
||||
#define XDND_DEST_ACTION(dragInfo) dragInfo->destinationAction
|
||||
#define XDND_SOURCE_OPERATIONS(dragInfo) dragInfo->destInfo->sourceOperations
|
||||
#define XDND_DROP_DATAS(dragInfo) dragInfo->destInfo->dropDatas
|
||||
#define XDND_DROP_DATA_COUNT(dragInfo) dragInfo->destInfo->dropDataCount
|
||||
#define XDND_DEST_VIEW_IS_REGISTERED(dragInfo) ((dragInfo->destInfo) != NULL)\
|
||||
&& ((dragInfo->destInfo->destView->dragDestinationProcs) != NULL)
|
||||
|
||||
static unsigned char XDNDversion = XDND_VERSION;
|
||||
static WMHandlerID dndDestinationTimer = NULL;
|
||||
|
||||
static void *idleState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info);
|
||||
static void *waitEnterState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info);
|
||||
static void *inspectDropDataState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info);
|
||||
static void *dropAllowedState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info);
|
||||
static void *dropNotAllowedState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info);
|
||||
static void *waitForDropDataState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info);
|
||||
|
||||
/* ----- Types & datas list ----- */
|
||||
static void freeSourceTypeArrayItem(void *type)
|
||||
{
|
||||
XFree(type);
|
||||
}
|
||||
|
||||
static WMArray *createSourceTypeArray(int initialSize)
|
||||
{
|
||||
return WMCreateArrayWithDestructor(initialSize, freeSourceTypeArrayItem);
|
||||
}
|
||||
|
||||
static void freeDropDataArrayItem(void *data)
|
||||
{
|
||||
if (data != NULL)
|
||||
WMReleaseData((WMData *) data);
|
||||
}
|
||||
|
||||
static WMArray *createDropDataArray(WMArray * requiredTypes)
|
||||
{
|
||||
if (requiredTypes != NULL)
|
||||
return WMCreateArrayWithDestructor(WMGetArrayItemCount(requiredTypes), freeDropDataArrayItem);
|
||||
|
||||
else
|
||||
return WMCreateArray(0);
|
||||
}
|
||||
|
||||
static WMArray *getTypesFromTypeList(WMScreen * scr, Window sourceWin)
|
||||
{
|
||||
Atom dataType;
|
||||
Atom *typeAtomList;
|
||||
WMArray *typeList;
|
||||
int i, format;
|
||||
unsigned long count, remaining;
|
||||
unsigned char *data = NULL;
|
||||
|
||||
XGetWindowProperty(scr->display, sourceWin, scr->xdndTypeListAtom,
|
||||
0, 0x8000000L, False, XA_ATOM, &dataType, &format, &count, &remaining, &data);
|
||||
|
||||
if (dataType != XA_ATOM || format != XDND_PROPERTY_FORMAT || count == 0 || !data) {
|
||||
if (data) {
|
||||
XFree(data);
|
||||
}
|
||||
return createSourceTypeArray(0);
|
||||
}
|
||||
|
||||
typeList = createSourceTypeArray(count);
|
||||
typeAtomList = (Atom *) data;
|
||||
for (i = 0; i < count; i++) {
|
||||
WMAddToArray(typeList, XGetAtomName(scr->display, typeAtomList[i]));
|
||||
}
|
||||
|
||||
XFree(data);
|
||||
|
||||
return typeList;
|
||||
}
|
||||
|
||||
static WMArray *getTypesFromThreeTypes(WMScreen * scr, XClientMessageEvent * event)
|
||||
{
|
||||
WMArray *typeList;
|
||||
Atom atom;
|
||||
int i;
|
||||
|
||||
typeList = createSourceTypeArray(3);
|
||||
for (i = 2; i < 5; i++) {
|
||||
if (event->data.l[i] != None) {
|
||||
atom = (Atom) event->data.l[i];
|
||||
WMAddToArray(typeList, XGetAtomName(scr->display, atom));
|
||||
}
|
||||
}
|
||||
|
||||
return typeList;
|
||||
}
|
||||
|
||||
void storeRequiredTypeList(WMDraggingInfo * info)
|
||||
{
|
||||
WMView *destView = XDND_DEST_VIEW(info);
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
WMArray *requiredTypes;
|
||||
|
||||
/* First, see if the stored source types are enough for dest requirements */
|
||||
requiredTypes = destView->dragDestinationProcs->requiredDataTypes(destView,
|
||||
W_ActionToOperation(scr,
|
||||
XDND_SOURCE_ACTION
|
||||
(info)),
|
||||
XDND_SOURCE_TYPES(info));
|
||||
|
||||
if (requiredTypes == NULL && XDND_TYPE_LIST_AVAILABLE(info)) {
|
||||
/* None of the stored source types fits, but the whole type list
|
||||
hasn't been retrieved yet. */
|
||||
WMFreeArray(XDND_SOURCE_TYPES(info));
|
||||
XDND_SOURCE_TYPES(info) = getTypesFromTypeList(scr, XDND_SOURCE_WIN(info));
|
||||
/* Don't retrieve the type list again */
|
||||
XDND_TYPE_LIST_AVAILABLE(info) = False;
|
||||
|
||||
requiredTypes =
|
||||
destView->dragDestinationProcs->requiredDataTypes(destView,
|
||||
W_ActionToOperation(scr,
|
||||
XDND_SOURCE_ACTION
|
||||
(info)),
|
||||
XDND_SOURCE_TYPES(info));
|
||||
}
|
||||
|
||||
XDND_REQUIRED_TYPES(info) = requiredTypes;
|
||||
}
|
||||
|
||||
char *getNextRequestedDataType(WMDraggingInfo * info)
|
||||
{
|
||||
/* get the type of the first data not yet retrieved from selection */
|
||||
int nextTypeIndex;
|
||||
|
||||
if (XDND_REQUIRED_TYPES(info) != NULL) {
|
||||
nextTypeIndex = WMGetArrayItemCount(XDND_DROP_DATAS(info));
|
||||
return WMGetFromArray(XDND_REQUIRED_TYPES(info), nextTypeIndex);
|
||||
/* NULL if no more type */
|
||||
} else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* ----- Action list ----- */
|
||||
|
||||
WMArray *sourceOperationList(WMScreen * scr, Window sourceWin)
|
||||
{
|
||||
Atom dataType, *actionList;
|
||||
int i, size;
|
||||
unsigned long count, remaining;
|
||||
unsigned char *actionDatas = NULL;
|
||||
unsigned char *descriptionList = NULL;
|
||||
WMArray *operationArray;
|
||||
WMDragOperationItem *operationItem;
|
||||
char *description;
|
||||
|
||||
remaining = 0;
|
||||
XGetWindowProperty(scr->display, sourceWin, scr->xdndActionListAtom,
|
||||
0, 0x8000000L, False, XA_ATOM, &dataType, &size, &count, &remaining, &actionDatas);
|
||||
|
||||
if (dataType != XA_ATOM || size != XDND_PROPERTY_FORMAT || count == 0 || !actionDatas) {
|
||||
wwarning("Cannot read action list");
|
||||
if (actionDatas) {
|
||||
XFree(actionDatas);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
actionList = (Atom *) actionDatas;
|
||||
|
||||
XGetWindowProperty(scr->display, sourceWin, scr->xdndActionDescriptionAtom,
|
||||
0, 0x8000000L, False, XA_STRING, &dataType, &size,
|
||||
&count, &remaining, &descriptionList);
|
||||
|
||||
if (dataType != XA_STRING || size != XDND_ACTION_DESCRIPTION_FORMAT || count == 0 || !descriptionList) {
|
||||
wwarning("Cannot read action description list");
|
||||
if (actionList) {
|
||||
XFree(actionList);
|
||||
}
|
||||
if (descriptionList) {
|
||||
XFree(descriptionList);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
operationArray = WMCreateDragOperationArray(count);
|
||||
description = (char *)descriptionList;
|
||||
|
||||
for (i = 0; count > 0; i++) {
|
||||
size = strlen(description);
|
||||
operationItem = WMCreateDragOperationItem(W_ActionToOperation(scr, actionList[i]),
|
||||
wstrdup(description));
|
||||
|
||||
WMAddToArray(operationArray, operationItem);
|
||||
count -= (size + 1); /* -1 : -NULL char */
|
||||
|
||||
/* next description */
|
||||
description = &(description[size + 1]);
|
||||
}
|
||||
|
||||
XFree(actionList);
|
||||
XFree(descriptionList);
|
||||
|
||||
return operationArray;
|
||||
}
|
||||
|
||||
/* ----- Dragging Info ----- */
|
||||
static void updateSourceWindow(WMDraggingInfo * info, XClientMessageEvent * event)
|
||||
{
|
||||
XDND_SOURCE_WIN(info) = (Window) event->data.l[0];
|
||||
}
|
||||
|
||||
static WMView *findChildInView(WMView * parent, int x, int y)
|
||||
{
|
||||
if (parent->childrenList == NULL)
|
||||
return parent;
|
||||
else {
|
||||
WMView *child = parent->childrenList;
|
||||
|
||||
while (child != NULL
|
||||
&& (!child->flags.mapped
|
||||
|| x < WMGetViewPosition(child).x
|
||||
|| x > WMGetViewPosition(child).x + WMGetViewSize(child).width
|
||||
|| y < WMGetViewPosition(child).y
|
||||
|| y > WMGetViewPosition(child).y + WMGetViewSize(child).height))
|
||||
|
||||
child = child->nextSister;
|
||||
|
||||
if (child == NULL)
|
||||
return parent;
|
||||
else
|
||||
return findChildInView(child,
|
||||
x - WMGetViewPosition(child).x, y - WMGetViewPosition(child).y);
|
||||
}
|
||||
}
|
||||
|
||||
static WMView *findDestinationViewInToplevel(WMView * toplevel, int x, int y)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(toplevel);
|
||||
Window toplevelWin = WMViewXID(toplevel);
|
||||
int xInToplevel, yInToplevel;
|
||||
Window foo;
|
||||
|
||||
XTranslateCoordinates(scr->display, scr->rootWin, toplevelWin, x, y, &xInToplevel, &yInToplevel, &foo);
|
||||
return findChildInView(toplevel, xInToplevel, yInToplevel);
|
||||
}
|
||||
|
||||
/* Clear datas only used by current destination view */
|
||||
static void freeDestinationViewInfos(WMDraggingInfo * info)
|
||||
{
|
||||
if (XDND_SOURCE_TYPES(info) != NULL) {
|
||||
WMFreeArray(XDND_SOURCE_TYPES(info));
|
||||
XDND_SOURCE_TYPES(info) = NULL;
|
||||
}
|
||||
|
||||
if (XDND_DROP_DATAS(info) != NULL) {
|
||||
WMFreeArray(XDND_DROP_DATAS(info));
|
||||
XDND_DROP_DATAS(info) = NULL;
|
||||
}
|
||||
|
||||
XDND_REQUIRED_TYPES(info) = NULL;
|
||||
}
|
||||
|
||||
void W_DragDestinationInfoClear(WMDraggingInfo * info)
|
||||
{
|
||||
W_DragDestinationStopTimer();
|
||||
|
||||
if (XDND_DEST_INFO(info) != NULL) {
|
||||
freeDestinationViewInfos(info);
|
||||
|
||||
wfree(XDND_DEST_INFO(info));
|
||||
XDND_DEST_INFO(info) = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void initDestinationDragInfo(WMDraggingInfo * info, WMView * destView)
|
||||
{
|
||||
wassertr(destView != NULL);
|
||||
|
||||
XDND_DEST_INFO(info) = (W_DragDestinationInfo *) wmalloc(sizeof(W_DragDestinationInfo));
|
||||
|
||||
XDND_DEST_STATE(info) = idleState;
|
||||
XDND_DEST_VIEW(info) = destView;
|
||||
|
||||
XDND_SOURCE_ACTION_CHANGED(info) = False;
|
||||
XDND_SOURCE_TYPES(info) = NULL;
|
||||
XDND_REQUIRED_TYPES(info) = NULL;
|
||||
XDND_DROP_DATAS(info) = NULL;
|
||||
}
|
||||
|
||||
void W_DragDestinationStoreEnterMsgInfo(WMDraggingInfo * info, WMView * toplevel, XClientMessageEvent * event)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(toplevel);
|
||||
|
||||
if (XDND_DEST_INFO(info) == NULL)
|
||||
initDestinationDragInfo(info, toplevel);
|
||||
|
||||
XDND_SOURCE_VERSION(info) = (event->data.l[1] >> 24);
|
||||
XDND_AWARE_VIEW(info) = toplevel;
|
||||
updateSourceWindow(info, event);
|
||||
|
||||
/*
|
||||
if (event->data.l[1] & 1)
|
||||
/* XdndTypeList property is available */
|
||||
/* XDND_SOURCE_TYPES(info) = getTypesFromTypeList(scr, XDND_SOURCE_WIN(info));
|
||||
else
|
||||
XDND_SOURCE_TYPES(info) = getTypesFromThreeTypes(scr, event);
|
||||
*/
|
||||
XDND_SOURCE_TYPES(info) = getTypesFromThreeTypes(scr, event);
|
||||
|
||||
/* to use if the 3 types are not enough */
|
||||
XDND_TYPE_LIST_AVAILABLE(info) = (event->data.l[1] & 1);
|
||||
}
|
||||
|
||||
void W_DragDestinationStorePositionMsgInfo(WMDraggingInfo * info, WMView * toplevel, XClientMessageEvent * event)
|
||||
{
|
||||
int x = event->data.l[2] >> 16;
|
||||
int y = event->data.l[2] & 0xffff;
|
||||
WMView *newDestView;
|
||||
|
||||
newDestView = findDestinationViewInToplevel(toplevel, x, y);
|
||||
|
||||
if (XDND_DEST_INFO(info) == NULL) {
|
||||
initDestinationDragInfo(info, newDestView);
|
||||
XDND_AWARE_VIEW(info) = toplevel;
|
||||
updateSourceWindow(info, event);
|
||||
} else {
|
||||
if (newDestView != XDND_DEST_VIEW(info)) {
|
||||
updateSourceWindow(info, event);
|
||||
XDND_DEST_VIEW(info) = newDestView;
|
||||
XDND_SOURCE_ACTION_CHANGED(info) = False;
|
||||
|
||||
if (XDND_DEST_STATE(info) != waitEnterState)
|
||||
XDND_DEST_STATE(info) = idleState;
|
||||
} else {
|
||||
XDND_SOURCE_ACTION_CHANGED(info) = (XDND_SOURCE_ACTION(info) != event->data.l[4]);
|
||||
}
|
||||
}
|
||||
|
||||
XDND_SOURCE_ACTION(info) = event->data.l[4];
|
||||
|
||||
/* note: source position is not stored */
|
||||
}
|
||||
|
||||
/* ----- End of Dragging Info ----- */
|
||||
|
||||
/* ----- Messages ----- */
|
||||
|
||||
/* send a DnD message to the source window */
|
||||
static void
|
||||
sendDnDClientMessage(WMDraggingInfo * info, Atom message,
|
||||
unsigned long data1, unsigned long data2, unsigned long data3, unsigned long data4)
|
||||
{
|
||||
if (!W_SendDnDClientMessage(W_VIEW_SCREEN(XDND_AWARE_VIEW(info))->display,
|
||||
XDND_SOURCE_WIN(info),
|
||||
message, WMViewXID(XDND_AWARE_VIEW(info)), data1, data2, data3, data4)) {
|
||||
/* drop failed */
|
||||
W_DragDestinationInfoClear(info);
|
||||
}
|
||||
}
|
||||
|
||||
/* send a xdndStatus message to the source, with position and size
|
||||
of the destination if it has no subwidget (requesting a position message
|
||||
on every move otherwise) */
|
||||
static void sendStatusMessage(WMView * destView, WMDraggingInfo * info, Atom action)
|
||||
{
|
||||
unsigned long data1;
|
||||
|
||||
data1 = (action == None) ? 0 : 1;
|
||||
|
||||
if (destView->childrenList == NULL) {
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
int destX, destY;
|
||||
WMSize destSize = WMGetViewSize(destView);
|
||||
Window foo;
|
||||
|
||||
XTranslateCoordinates(scr->display, WMViewXID(destView), scr->rootWin, 0, 0, &destX, &destY, &foo);
|
||||
|
||||
sendDnDClientMessage(info,
|
||||
W_VIEW_SCREEN(destView)->xdndStatusAtom,
|
||||
data1,
|
||||
(destX << 16) | destY, (destSize.width << 16) | destSize.height, action);
|
||||
} else {
|
||||
/* set bit 1 to request explicitly position message on every move */
|
||||
data1 = data1 | 2;
|
||||
|
||||
sendDnDClientMessage(info, W_VIEW_SCREEN(destView)->xdndStatusAtom, data1, 0, 0, action);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
storeDropData(WMView * destView, Atom selection, Atom target, Time timestamp, void *cdata, WMData * data)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
WMDraggingInfo *info = &(scr->dragInfo);
|
||||
WMData *dataToStore = NULL;
|
||||
|
||||
if (data != NULL)
|
||||
dataToStore = WMRetainData(data);
|
||||
|
||||
if (XDND_DEST_INFO(info) != NULL && XDND_DROP_DATAS(info) != NULL) {
|
||||
WMAddToArray(XDND_DROP_DATAS(info), dataToStore);
|
||||
W_SendDnDClientMessage(scr->display, WMViewXID(destView),
|
||||
scr->xdndSelectionAtom, WMViewXID(destView), 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Bool requestDropDataInSelection(WMView * destView, char *type)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
|
||||
if (type != NULL) {
|
||||
if (!WMRequestSelection(destView,
|
||||
scr->xdndSelectionAtom,
|
||||
XInternAtom(scr->display, type, False),
|
||||
CurrentTime, storeDropData, NULL)) {
|
||||
wwarning("could not request data for dropped data");
|
||||
return False;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
return False;
|
||||
}
|
||||
|
||||
Bool requestDropData(WMDraggingInfo * info)
|
||||
{
|
||||
WMView *destView = XDND_DEST_VIEW(info);
|
||||
char *nextType = getNextRequestedDataType(info);
|
||||
|
||||
while ((nextType != NULL)
|
||||
&& (!requestDropDataInSelection(destView, nextType))) {
|
||||
/* store NULL if request failed, and try with next type */
|
||||
WMAddToArray(XDND_DROP_DATAS(info), NULL);
|
||||
nextType = getNextRequestedDataType(info);
|
||||
}
|
||||
|
||||
/* remains types to retrieve ? */
|
||||
return (nextType != NULL);
|
||||
}
|
||||
|
||||
static void concludeDrop(WMView * destView)
|
||||
{
|
||||
destView->dragDestinationProcs->concludeDragOperation(destView);
|
||||
}
|
||||
|
||||
/* send cancel message to the source */
|
||||
static void cancelDrop(WMView * destView, WMDraggingInfo * info)
|
||||
{
|
||||
sendStatusMessage(destView, info, None);
|
||||
concludeDrop(destView);
|
||||
freeDestinationViewInfos(info);
|
||||
}
|
||||
|
||||
/* suspend drop, when dragged icon enter an unregistered view
|
||||
or a register view that doesn't accept the drop */
|
||||
static void suspendDropAuthorization(WMView * destView, WMDraggingInfo * info)
|
||||
{
|
||||
sendStatusMessage(destView, info, None);
|
||||
|
||||
/* Free datas that depend on destination behaviour */
|
||||
if (XDND_DROP_DATAS(info) != NULL) {
|
||||
WMFreeArray(XDND_DROP_DATAS(info));
|
||||
XDND_DROP_DATAS(info) = NULL;
|
||||
}
|
||||
|
||||
XDND_REQUIRED_TYPES(info) = NULL;
|
||||
}
|
||||
|
||||
/* cancel drop on Enter message, if protocol version is nok */
|
||||
void W_DragDestinationCancelDropOnEnter(WMView * toplevel, WMDraggingInfo * info)
|
||||
{
|
||||
if (XDND_DEST_VIEW_IS_REGISTERED(info))
|
||||
cancelDrop(XDND_DEST_VIEW(info), info);
|
||||
else
|
||||
sendStatusMessage(toplevel, info, None);
|
||||
|
||||
W_DragDestinationInfoClear(info);
|
||||
}
|
||||
|
||||
static void finishDrop(WMView * destView, WMDraggingInfo * info)
|
||||
{
|
||||
sendDnDClientMessage(info, W_VIEW_SCREEN(destView)->xdndFinishedAtom, 0, 0, 0, 0);
|
||||
concludeDrop(destView);
|
||||
W_DragDestinationInfoClear(info);
|
||||
}
|
||||
|
||||
static Atom getAllowedAction(WMView * destView, WMDraggingInfo * info)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
|
||||
return W_OperationToAction(scr,
|
||||
destView->dragDestinationProcs->allowedOperation(destView,
|
||||
W_ActionToOperation(scr,
|
||||
XDND_SOURCE_ACTION
|
||||
(info)),
|
||||
XDND_SOURCE_TYPES(info)));
|
||||
}
|
||||
|
||||
static void *checkActionAllowed(WMView * destView, WMDraggingInfo * info)
|
||||
{
|
||||
XDND_DEST_ACTION(info) = getAllowedAction(destView, info);
|
||||
|
||||
if (XDND_DEST_ACTION(info) == None) {
|
||||
suspendDropAuthorization(destView, info);
|
||||
return dropNotAllowedState;
|
||||
}
|
||||
|
||||
sendStatusMessage(destView, info, XDND_DEST_ACTION(info));
|
||||
return dropAllowedState;
|
||||
}
|
||||
|
||||
static void *checkDropAllowed(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info)
|
||||
{
|
||||
storeRequiredTypeList(info);
|
||||
|
||||
if (destView->dragDestinationProcs->inspectDropData != NULL) {
|
||||
XDND_DROP_DATAS(info) = createDropDataArray(XDND_REQUIRED_TYPES(info));
|
||||
|
||||
/* store first available data */
|
||||
if (requestDropData(info))
|
||||
return inspectDropDataState;
|
||||
|
||||
/* no data retrieved, but inspect can allow it */
|
||||
if (destView->dragDestinationProcs->inspectDropData(destView, XDND_DROP_DATAS(info)))
|
||||
return checkActionAllowed(destView, info);
|
||||
|
||||
suspendDropAuthorization(destView, info);
|
||||
return dropNotAllowedState;
|
||||
}
|
||||
|
||||
return checkActionAllowed(destView, info);
|
||||
}
|
||||
|
||||
static WMPoint *getDropLocationInView(WMView * view)
|
||||
{
|
||||
Window rootWin, childWin;
|
||||
int rootX, rootY;
|
||||
unsigned int mask;
|
||||
WMPoint *location;
|
||||
|
||||
location = (WMPoint *) wmalloc(sizeof(WMPoint));
|
||||
|
||||
XQueryPointer(W_VIEW_SCREEN(view)->display,
|
||||
WMViewXID(view), &rootWin, &childWin, &rootX, &rootY, &(location->x), &(location->y), &mask);
|
||||
|
||||
return location;
|
||||
}
|
||||
|
||||
static void callPerformDragOperation(WMView * destView, WMDraggingInfo * info)
|
||||
{
|
||||
WMArray *operationList = NULL;
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
WMPoint *dropLocation;
|
||||
|
||||
if (XDND_SOURCE_ACTION(info) == scr->xdndActionAsk)
|
||||
operationList = sourceOperationList(scr, XDND_SOURCE_WIN(info));
|
||||
|
||||
dropLocation = getDropLocationInView(destView);
|
||||
destView->dragDestinationProcs->performDragOperation(destView,
|
||||
XDND_DROP_DATAS(info), operationList, dropLocation);
|
||||
|
||||
wfree(dropLocation);
|
||||
if (operationList != NULL)
|
||||
WMFreeArray(operationList);
|
||||
}
|
||||
|
||||
/* ----- Destination timer ----- */
|
||||
static void dragSourceResponseTimeOut(void *destView)
|
||||
{
|
||||
WMView *view = (WMView *) destView;
|
||||
WMDraggingInfo *info;
|
||||
|
||||
wwarning("delay for drag source response expired");
|
||||
info = &(W_VIEW_SCREEN(view)->dragInfo);
|
||||
if (XDND_DEST_VIEW_IS_REGISTERED(info))
|
||||
cancelDrop(view, info);
|
||||
else {
|
||||
sendStatusMessage(view, info, None);
|
||||
}
|
||||
|
||||
W_DragDestinationInfoClear(info);
|
||||
}
|
||||
|
||||
void W_DragDestinationStopTimer()
|
||||
{
|
||||
if (dndDestinationTimer != NULL) {
|
||||
WMDeleteTimerHandler(dndDestinationTimer);
|
||||
dndDestinationTimer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void W_DragDestinationStartTimer(WMDraggingInfo * info)
|
||||
{
|
||||
W_DragDestinationStopTimer();
|
||||
|
||||
if (XDND_DEST_STATE(info) != idleState)
|
||||
dndDestinationTimer = WMAddTimerHandler(XDND_SOURCE_RESPONSE_MAX_DELAY,
|
||||
dragSourceResponseTimeOut, XDND_DEST_VIEW(info));
|
||||
}
|
||||
|
||||
/* ----- End of Destination timer ----- */
|
||||
|
||||
/* ----- Destination states ----- */
|
||||
|
||||
#ifdef XDND_DEBUG
|
||||
static const char *stateName(W_DndState * state)
|
||||
{
|
||||
if (state == NULL)
|
||||
return "no state defined";
|
||||
|
||||
if (state == idleState)
|
||||
return "idleState";
|
||||
|
||||
if (state == waitEnterState)
|
||||
return "waitEnterState";
|
||||
|
||||
if (state == inspectDropDataState)
|
||||
return "inspectDropDataState";
|
||||
|
||||
if (state == dropAllowedState)
|
||||
return "dropAllowedState";
|
||||
|
||||
if (state == dropNotAllowedState)
|
||||
return "dropNotAllowedState";
|
||||
|
||||
if (state == waitForDropDataState)
|
||||
return "waitForDropDataState";
|
||||
|
||||
return "unknown state";
|
||||
}
|
||||
#endif
|
||||
|
||||
static void *idleState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info)
|
||||
{
|
||||
WMScreen *scr;
|
||||
Atom sourceMsg;
|
||||
|
||||
if (destView->dragDestinationProcs != NULL) {
|
||||
scr = W_VIEW_SCREEN(destView);
|
||||
sourceMsg = event->message_type;
|
||||
|
||||
if (sourceMsg == scr->xdndPositionAtom) {
|
||||
destView->dragDestinationProcs->prepareForDragOperation(destView);
|
||||
|
||||
if (XDND_SOURCE_TYPES(info) != NULL) {
|
||||
/* enter message infos are available */
|
||||
return checkDropAllowed(destView, event, info);
|
||||
}
|
||||
|
||||
/* waiting for enter message */
|
||||
return waitEnterState;
|
||||
}
|
||||
}
|
||||
|
||||
suspendDropAuthorization(destView, info);
|
||||
return idleState;
|
||||
}
|
||||
|
||||
/* Source position and action are stored,
|
||||
waiting for xdnd protocol version and source type */
|
||||
static void *waitEnterState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
Atom sourceMsg = event->message_type;
|
||||
|
||||
if (sourceMsg == scr->xdndEnterAtom) {
|
||||
W_DragDestinationStoreEnterMsgInfo(info, destView, event);
|
||||
return checkDropAllowed(destView, event, info);
|
||||
}
|
||||
|
||||
return waitEnterState;
|
||||
}
|
||||
|
||||
/* We have requested a data, and have received it */
|
||||
static void *inspectDropDataState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info)
|
||||
{
|
||||
WMScreen *scr;
|
||||
Atom sourceMsg;
|
||||
|
||||
scr = W_VIEW_SCREEN(destView);
|
||||
sourceMsg = event->message_type;
|
||||
|
||||
if (sourceMsg == scr->xdndSelectionAtom) {
|
||||
/* a data has been retrieved, store next available */
|
||||
if (requestDropData(info))
|
||||
return inspectDropDataState;
|
||||
|
||||
/* all required (and available) datas are stored */
|
||||
if (destView->dragDestinationProcs->inspectDropData(destView, XDND_DROP_DATAS(info)))
|
||||
return checkActionAllowed(destView, info);
|
||||
|
||||
suspendDropAuthorization(destView, info);
|
||||
return dropNotAllowedState;
|
||||
}
|
||||
|
||||
return inspectDropDataState;
|
||||
}
|
||||
|
||||
static void *dropNotAllowedState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
Atom sourceMsg = event->message_type;
|
||||
|
||||
if (sourceMsg == scr->xdndDropAtom) {
|
||||
finishDrop(destView, info);
|
||||
return idleState;
|
||||
}
|
||||
|
||||
if (sourceMsg == scr->xdndPositionAtom) {
|
||||
if (XDND_SOURCE_ACTION_CHANGED(info)) {
|
||||
return checkDropAllowed(destView, event, info);
|
||||
} else {
|
||||
sendStatusMessage(destView, info, None);
|
||||
return dropNotAllowedState;
|
||||
}
|
||||
}
|
||||
|
||||
return dropNotAllowedState;
|
||||
}
|
||||
|
||||
static void *dropAllowedState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
Atom sourceMsg = event->message_type;
|
||||
|
||||
if (sourceMsg == scr->xdndDropAtom) {
|
||||
if (XDND_DROP_DATAS(info) != NULL) {
|
||||
/* drop datas were cached with inspectDropData call */
|
||||
callPerformDragOperation(destView, info);
|
||||
} else {
|
||||
XDND_DROP_DATAS(info) = createDropDataArray(XDND_REQUIRED_TYPES(info));
|
||||
|
||||
/* store first available data */
|
||||
if (requestDropData(info))
|
||||
return waitForDropDataState;
|
||||
|
||||
/* no data retrieved */
|
||||
callPerformDragOperation(destView, info);
|
||||
}
|
||||
|
||||
finishDrop(destView, info);
|
||||
return idleState;
|
||||
}
|
||||
|
||||
if (sourceMsg == scr->xdndPositionAtom) {
|
||||
if (XDND_SOURCE_ACTION_CHANGED(info)) {
|
||||
return checkDropAllowed(destView, event, info);
|
||||
} else {
|
||||
sendStatusMessage(destView, info, XDND_DEST_ACTION(info));
|
||||
return dropAllowedState;
|
||||
}
|
||||
}
|
||||
|
||||
return dropAllowedState;
|
||||
}
|
||||
|
||||
static void *waitForDropDataState(WMView * destView, XClientMessageEvent * event, WMDraggingInfo * info)
|
||||
{
|
||||
WMScreen *scr = W_VIEW_SCREEN(destView);
|
||||
Atom sourceMsg = event->message_type;
|
||||
|
||||
if (sourceMsg == scr->xdndSelectionAtom) {
|
||||
/* store next data */
|
||||
if (requestDropData(info))
|
||||
return waitForDropDataState;
|
||||
|
||||
/* all required (and available) datas are stored */
|
||||
callPerformDragOperation(destView, info);
|
||||
|
||||
finishDrop(destView, info);
|
||||
return idleState;
|
||||
}
|
||||
|
||||
return waitForDropDataState;
|
||||
}
|
||||
|
||||
/* ----- End of Destination states ----- */
|
||||
|
||||
void W_DragDestinationStateHandler(WMDraggingInfo * info, XClientMessageEvent * event)
|
||||
{
|
||||
WMView *destView;
|
||||
W_DndState *newState;
|
||||
|
||||
wassertr(XDND_DEST_INFO(info) != NULL);
|
||||
wassertr(XDND_DEST_VIEW(info) != NULL);
|
||||
|
||||
destView = XDND_DEST_VIEW(info);
|
||||
if (XDND_DEST_STATE(info) == NULL)
|
||||
XDND_DEST_STATE(info) = idleState;
|
||||
|
||||
#ifdef XDND_DEBUG
|
||||
|
||||
printf("current dest state: %s\n", stateName(XDND_DEST_STATE(info)));
|
||||
#endif
|
||||
|
||||
newState = (W_DndState *) XDND_DEST_STATE(info) (destView, event, info);
|
||||
|
||||
#ifdef XDND_DEBUG
|
||||
|
||||
printf("new dest state: %s\n", stateName(newState));
|
||||
#endif
|
||||
|
||||
if (XDND_DEST_INFO(info) != NULL) {
|
||||
XDND_DEST_STATE(info) = newState;
|
||||
if (XDND_DEST_STATE(info) != idleState)
|
||||
W_DragDestinationStartTimer(info);
|
||||
}
|
||||
}
|
||||
|
||||
static void realizedObserver(void *self, WMNotification * notif)
|
||||
{
|
||||
WMView *view = (WMView *) WMGetNotificationObject(notif);
|
||||
WMScreen *scr = W_VIEW_SCREEN(view);
|
||||
|
||||
XChangeProperty(scr->display, W_VIEW_DRAWABLE(view),
|
||||
scr->xdndAwareAtom, XA_ATOM, XDND_PROPERTY_FORMAT, PropModeReplace, &XDNDversion, 1);
|
||||
|
||||
WMRemoveNotificationObserver(self);
|
||||
}
|
||||
|
||||
void W_SetXdndAwareProperty(WMScreen * scr, WMView * view, Atom * types, int typeCount)
|
||||
{
|
||||
WMView *toplevel = W_TopLevelOfView(view);
|
||||
|
||||
if (!toplevel->flags.xdndHintSet) {
|
||||
toplevel->flags.xdndHintSet = 1;
|
||||
|
||||
if (toplevel->flags.realized) {
|
||||
XChangeProperty(scr->display, W_VIEW_DRAWABLE(toplevel),
|
||||
scr->xdndAwareAtom, XA_ATOM, XDND_PROPERTY_FORMAT,
|
||||
PropModeReplace, &XDNDversion, 1);
|
||||
} else {
|
||||
WMAddNotificationObserver(realizedObserver,
|
||||
/* just use as an id */
|
||||
&view->dragDestinationProcs,
|
||||
WMViewRealizedNotification, toplevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WMRegisterViewForDraggedTypes(WMView * view, WMArray * acceptedTypes)
|
||||
{
|
||||
Atom *types;
|
||||
int typeCount;
|
||||
int i;
|
||||
|
||||
typeCount = WMGetArrayItemCount(acceptedTypes);
|
||||
types = wmalloc(sizeof(Atom) * (typeCount + 1));
|
||||
|
||||
for (i = 0; i < typeCount; i++) {
|
||||
types[i] = XInternAtom(W_VIEW_SCREEN(view)->display, WMGetFromArray(acceptedTypes, i), False);
|
||||
}
|
||||
types[i] = 0;
|
||||
|
||||
view->droppableTypes = types;
|
||||
/* WMFreeArray(acceptedTypes); */
|
||||
|
||||
W_SetXdndAwareProperty(W_VIEW_SCREEN(view), view, types, typeCount);
|
||||
}
|
||||
|
||||
void WMUnregisterViewDraggedTypes(WMView * view)
|
||||
{
|
||||
if (view->droppableTypes != NULL)
|
||||
wfree(view->droppableTypes);
|
||||
view->droppableTypes = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
requestedOperation: operation requested by the source
|
||||
sourceDataTypes: data types (mime-types strings) supported by the source
|
||||
(never NULL, destroyed when drop ends)
|
||||
return operation allowed by destination (self)
|
||||
*/
|
||||
static WMDragOperationType
|
||||
defAllowedOperation(WMView * self, WMDragOperationType requestedOperation, WMArray * sourceDataTypes)
|
||||
{
|
||||
/* no operation allowed */
|
||||
return WDOperationNone;
|
||||
}
|
||||
|
||||
/*
|
||||
requestedOperation: operation requested by the source
|
||||
sourceDataTypes: data types (mime-types strings) supported by the source
|
||||
(never NULL, destroyed when drop ends)
|
||||
return data types (mime-types strings) required by destination (self)
|
||||
or NULL if no suitable data type is available (force
|
||||
to 2nd pass with full source type list).
|
||||
*/
|
||||
static WMArray *defRequiredDataTypes(WMView * self,
|
||||
WMDragOperationType requestedOperation, WMArray * sourceDataTypes)
|
||||
{
|
||||
/* no data type allowed (NULL even at 2nd pass) */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
Executed when the drag enters destination (self)
|
||||
*/
|
||||
static void defPrepareForDragOperation(WMView * self)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
Checks datas to be dropped (optional).
|
||||
dropDatas: datas (WMData*) required by destination (self)
|
||||
(given in same order as returned by requiredDataTypes).
|
||||
A NULL data means it couldn't be retreived.
|
||||
Destroyed when drop ends.
|
||||
return true if data array is ok
|
||||
*/
|
||||
/* Bool (*inspectDropData)(WMView *self, WMArray *dropDatas); */
|
||||
|
||||
/*
|
||||
Process drop
|
||||
dropDatas: datas (WMData*) required by destination (self)
|
||||
(given in same order as returned by requiredDataTypes).
|
||||
A NULL data means it couldn't be retrieved.
|
||||
Destroyed when drop ends.
|
||||
operationList: if source operation is WDOperationAsk, contains
|
||||
operations (and associated texts) that can be asked
|
||||
to source. (destroyed after performDragOperation call)
|
||||
Otherwise this parameter is NULL.
|
||||
*/
|
||||
static void
|
||||
defPerformDragOperation(WMView * self, WMArray * dropDatas, WMArray * operationList, WMPoint * dropLocation)
|
||||
{
|
||||
}
|
||||
|
||||
/* Executed after drop */
|
||||
static void defConcludeDragOperation(WMView * self)
|
||||
{
|
||||
}
|
||||
|
||||
void WMSetViewDragDestinationProcs(WMView * view, WMDragDestinationProcs * procs)
|
||||
{
|
||||
if (view->dragDestinationProcs == NULL) {
|
||||
view->dragDestinationProcs = wmalloc(sizeof(WMDragDestinationProcs));
|
||||
} else {
|
||||
free(view->dragDestinationProcs);
|
||||
}
|
||||
|
||||
*view->dragDestinationProcs = *procs;
|
||||
|
||||
/*XXX fill in non-implemented stuffs */
|
||||
if (procs->allowedOperation == NULL) {
|
||||
view->dragDestinationProcs->allowedOperation = defAllowedOperation;
|
||||
}
|
||||
if (procs->allowedOperation == NULL) {
|
||||
view->dragDestinationProcs->requiredDataTypes = defRequiredDataTypes;
|
||||
}
|
||||
|
||||
/* note: inspectDropData can be NULL, if data consultation is not needed
|
||||
to give drop permission */
|
||||
|
||||
if (procs->prepareForDragOperation == NULL) {
|
||||
view->dragDestinationProcs->prepareForDragOperation = defPrepareForDragOperation;
|
||||
}
|
||||
if (procs->performDragOperation == NULL) {
|
||||
view->dragDestinationProcs->performDragOperation = defPerformDragOperation;
|
||||
}
|
||||
if (procs->concludeDragOperation == NULL) {
|
||||
view->dragDestinationProcs->concludeDragOperation = defConcludeDragOperation;
|
||||
}
|
||||
}
|
||||
1147
WINGs/dragsource.c
Normal file
1147
WINGs/dragsource.c
Normal file
File diff suppressed because it is too large
Load Diff
206
WINGs/error.c
206
WINGs/error.c
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* WindowMaker miscelaneous function library
|
||||
*
|
||||
* Copyright (c) 1997 Alfredo K. Kojima
|
||||
*
|
||||
* Window Maker miscelaneous function library
|
||||
*
|
||||
* 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
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
@@ -18,8 +18,7 @@
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
|
||||
#include "../src/config.h"
|
||||
#include "wconfig.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -27,92 +26,161 @@
|
||||
#include <string.h>
|
||||
#include <errno.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];
|
||||
|
||||
snprintf(buf, sizeof(buf), _("Unknown error %d"), errnum);
|
||||
return buf;
|
||||
#else /* no strerror() and no sys_errlist[] */
|
||||
static char buf[] = "Error 12345678901234567890";
|
||||
|
||||
snprintf(buf, sizeof(buf), _("Error %d"), errnum);
|
||||
return buf;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* Prints a message with variable arguments
|
||||
*
|
||||
* msg - message to print with optional formatting
|
||||
* ... - arguments to use on formatting
|
||||
*********************************************************************/
|
||||
void wmessage(const char *msg, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
|
||||
va_start(args, msg);
|
||||
|
||||
vsnprintf(buf, MAXLINE - 3, msg, args);
|
||||
strcat(buf, "\n");
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
|
||||
fputs(": ", stderr);
|
||||
fputs(buf, stderr);
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* 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);
|
||||
|
||||
vsnprintf(buf, MAXLINE - 3, msg, args);
|
||||
strcat(buf, "\n");
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
|
||||
fputs(_(" warning: "), stderr);
|
||||
fputs(buf, stderr);
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* Prints a fatal error message with variable arguments and terminates
|
||||
*
|
||||
*
|
||||
* msg - message to print with optional formatting
|
||||
* ... - arguments to use on formatting
|
||||
* ... - arguments to use on formatting
|
||||
**************************************************************************/
|
||||
void
|
||||
wfatal(const char *msg, ...)
|
||||
void wfatal(const char *msg, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
|
||||
va_start(args, msg);
|
||||
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(NULL);
|
||||
vsnprintf(buf, MAXLINE - 3, msg, args);
|
||||
strcat(buf, "\n");
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
|
||||
fputs(_(" fatal error: "), stderr);
|
||||
fputs(buf, stderr);
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
va_end(args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************
|
||||
* Prints a warning message with variable arguments
|
||||
*
|
||||
* Prints a system error message with variable arguments
|
||||
*
|
||||
* msg - message to print with optional formatting
|
||||
* ... - arguments to use on formatting
|
||||
*********************************************************************/
|
||||
void
|
||||
wwarning(const char *msg, ...)
|
||||
void wsyserror(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(NULL);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
int error = errno;
|
||||
|
||||
va_start(args, msg);
|
||||
vsnprintf(buf, MAXLINE - 3, msg, args);
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
|
||||
fputs(_(" error: "), stderr);
|
||||
fputs(buf, stderr);
|
||||
fputs(": ", stderr);
|
||||
fputs(wstrerror(error), stderr);
|
||||
fputs("\n", stderr);
|
||||
fflush(stderr);
|
||||
fflush(stdout);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* Prints a system error message with variable arguments
|
||||
*
|
||||
* msg - message to print with optional formatting
|
||||
* ... - arguments to use on formatting
|
||||
* 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
|
||||
wsyserror(const char *msg, ...)
|
||||
void wsyserrorwithcode(int error, const char *msg, ...)
|
||||
{
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
#ifdef HAVE_STRERROR
|
||||
int error=errno;
|
||||
#endif
|
||||
va_start(args, msg);
|
||||
vsprintf(buf, msg, args);
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname, stderr);
|
||||
fputs(" error: ", stderr);
|
||||
strcat(buf, ": ");
|
||||
#ifdef HAVE_STRERROR
|
||||
strcat(buf, strerror(error));
|
||||
strcat(buf,"\n");
|
||||
fputs(buf, stderr);
|
||||
fflush(NULL);
|
||||
#else
|
||||
perror(buf);
|
||||
#endif
|
||||
va_end(args);
|
||||
}
|
||||
va_list args;
|
||||
char buf[MAXLINE];
|
||||
|
||||
va_start(args, msg);
|
||||
vsnprintf(buf, MAXLINE - 3, msg, args);
|
||||
fflush(stdout);
|
||||
fputs(_WINGS_progname ? _WINGS_progname : "WINGs", stderr);
|
||||
fputs(_(" error: "), stderr);
|
||||
fputs(buf, stderr);
|
||||
fputs(": ", stderr);
|
||||
fputs(wstrerror(error), stderr);
|
||||
fputs("\n", stderr);
|
||||
fflush(stderr);
|
||||
fflush(stdout);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
534
WINGs/findfile.c
534
WINGs/findfile.c
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* WindowMaker miscelaneous function library
|
||||
*
|
||||
* Copyright (c) 1997 Alfredo K. Kojima
|
||||
*
|
||||
* Window Maker miscelaneous function library
|
||||
*
|
||||
* 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
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
@@ -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,253 +33,343 @@
|
||||
#define PATH_MAX 1024
|
||||
#endif
|
||||
|
||||
|
||||
char*
|
||||
wgethomedir()
|
||||
char *wgethomedir()
|
||||
{
|
||||
char *home = getenv("HOME");
|
||||
struct passwd *user;
|
||||
char *home = getenv("HOME");
|
||||
struct passwd *user;
|
||||
|
||||
if (home)
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (home)
|
||||
return home;
|
||||
|
||||
|
||||
static char*
|
||||
getuserhomedir(char *username)
|
||||
{
|
||||
struct passwd *user;
|
||||
|
||||
user = getpwnam(username);
|
||||
if (!user) {
|
||||
wsyserror("could not get password entry for user %s", username);
|
||||
return NULL;
|
||||
}
|
||||
if (!user->pw_dir) {
|
||||
return "/";
|
||||
} else {
|
||||
return user->pw_dir;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
char*
|
||||
wexpandpath(char *path)
|
||||
{
|
||||
char buffer2[PATH_MAX+2];
|
||||
char buffer[PATH_MAX+2];
|
||||
int i;
|
||||
|
||||
memset(buffer, 0, PATH_MAX+2);
|
||||
|
||||
if (*path=='~') {
|
||||
char *home;
|
||||
|
||||
path++;
|
||||
if (*path=='/' || *path==0) {
|
||||
home = wgethomedir();
|
||||
strcat(buffer, home);
|
||||
user = getpwuid(getuid());
|
||||
if (!user) {
|
||||
wsyserror(_("could not get password entry for UID %i"), getuid());
|
||||
return "/";
|
||||
}
|
||||
if (!user->pw_dir) {
|
||||
return "/";
|
||||
} else {
|
||||
int j;
|
||||
j = 0;
|
||||
while (*path!=0 && *path!='/') {
|
||||
buffer2[j++] = *path;
|
||||
buffer2[j] = 0;
|
||||
path++;
|
||||
}
|
||||
home = getuserhomedir(buffer2);
|
||||
if (!home)
|
||||
return user->pw_dir;
|
||||
}
|
||||
}
|
||||
|
||||
static char *getuserhomedir(char *username)
|
||||
{
|
||||
struct passwd *user;
|
||||
|
||||
user = getpwnam(username);
|
||||
if (!user) {
|
||||
wsyserror(_("could not get password entry for user %s"), username);
|
||||
return NULL;
|
||||
strcat(buffer, home);
|
||||
}
|
||||
}
|
||||
|
||||
i = strlen(buffer);
|
||||
|
||||
while (*path!=0) {
|
||||
char *tmp;
|
||||
|
||||
if (*path=='$') {
|
||||
int j = 0;
|
||||
path++;
|
||||
/* expand $(HOME) or $HOME style environment variables */
|
||||
if (*path=='(') {
|
||||
path++;
|
||||
while (*path!=0 && *path!=')') {
|
||||
buffer2[j++] = *(path++);
|
||||
buffer2[j] = 0;
|
||||
}
|
||||
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);
|
||||
}
|
||||
} else {
|
||||
while (*path!=0 && *path!='/') {
|
||||
buffer2[j++] = *(path++);
|
||||
buffer2[j] = 0;
|
||||
}
|
||||
tmp = getenv(buffer2);
|
||||
if (!tmp) {
|
||||
strcat(buffer, "$");
|
||||
strcat(buffer, buffer2);
|
||||
i += strlen(buffer2)+1;
|
||||
} else {
|
||||
strcat(buffer, tmp);
|
||||
i += strlen(tmp);
|
||||
}
|
||||
}
|
||||
if (!user->pw_dir) {
|
||||
return "/";
|
||||
} else {
|
||||
buffer[i++] = *path;
|
||||
path++;
|
||||
return user->pw_dir;
|
||||
}
|
||||
}
|
||||
|
||||
return wstrdup(buffer);
|
||||
}
|
||||
|
||||
char *wexpandpath(char *path)
|
||||
{
|
||||
char *origpath = path;
|
||||
char buffer2[PATH_MAX + 2];
|
||||
char buffer[PATH_MAX + 2];
|
||||
int i;
|
||||
|
||||
memset(buffer, 0, PATH_MAX + 2);
|
||||
|
||||
if (*path == '~') {
|
||||
char *home;
|
||||
|
||||
path++;
|
||||
if (*path == '/' || *path == 0) {
|
||||
home = wgethomedir();
|
||||
if (strlen(home) > PATH_MAX)
|
||||
goto error;
|
||||
strcat(buffer, home);
|
||||
} 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 || strlen(home) > PATH_MAX)
|
||||
goto error;
|
||||
strcat(buffer, home);
|
||||
}
|
||||
}
|
||||
|
||||
i = strlen(buffer);
|
||||
|
||||
while (*path != 0 && i <= PATH_MAX) {
|
||||
char *tmp;
|
||||
|
||||
if (*path == '$') {
|
||||
int j = 0;
|
||||
path++;
|
||||
/* expand $(HOME) or $HOME style environment variables */
|
||||
if (*path == '(') {
|
||||
path++;
|
||||
while (*path != 0 && *path != ')') {
|
||||
if (j > PATH_MAX)
|
||||
goto error;
|
||||
buffer2[j++] = *(path++);
|
||||
buffer2[j] = 0;
|
||||
}
|
||||
if (*path == ')') {
|
||||
path++;
|
||||
tmp = getenv(buffer2);
|
||||
} else {
|
||||
tmp = NULL;
|
||||
}
|
||||
if (!tmp) {
|
||||
if ((i += strlen(buffer2) + 2) > PATH_MAX)
|
||||
goto error;
|
||||
buffer[i] = 0;
|
||||
strcat(buffer, "$(");
|
||||
strcat(buffer, buffer2);
|
||||
if (*(path-1)==')') {
|
||||
if (++i > PATH_MAX)
|
||||
goto error;
|
||||
strcat(buffer, ")");
|
||||
}
|
||||
} else {
|
||||
if ((i += strlen(tmp)) > PATH_MAX)
|
||||
goto error;
|
||||
strcat(buffer, tmp);
|
||||
}
|
||||
} else {
|
||||
while (*path != 0 && *path != '/') {
|
||||
if (j > PATH_MAX)
|
||||
goto error;
|
||||
buffer2[j++] = *(path++);
|
||||
buffer2[j] = 0;
|
||||
}
|
||||
tmp = getenv(buffer2);
|
||||
if (!tmp) {
|
||||
if ((i += strlen(buffer2) + 1) > PATH_MAX)
|
||||
goto error;
|
||||
strcat(buffer, "$");
|
||||
strcat(buffer, buffer2);
|
||||
} else {
|
||||
if ((i += strlen(tmp)) > PATH_MAX)
|
||||
goto error;
|
||||
strcat(buffer, tmp);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
buffer[i++] = *path;
|
||||
path++;
|
||||
}
|
||||
}
|
||||
|
||||
if (*path!=0)
|
||||
goto error;
|
||||
|
||||
return wstrdup(buffer);
|
||||
|
||||
error:
|
||||
errno = ENAMETOOLONG;
|
||||
wsyserror(_("could not expand %s"), origpath);
|
||||
/* FIXME: too many functions handle a return value of NULL incorrectly */
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
* findfile--
|
||||
* Finds a file in a : separated list of paths. ~ expansion is also
|
||||
* Finds a file in a : separated list of paths. ~ expansion is also
|
||||
* done.
|
||||
*
|
||||
*
|
||||
* Returns:
|
||||
* The complete path for the file (in a newly allocated string) or
|
||||
* NULL if the file was not found.
|
||||
*
|
||||
*
|
||||
* Side effects:
|
||||
* A new string is allocated. It must be freed later.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
char*
|
||||
wfindfile(char *paths, char *file)
|
||||
char *wfindfile(char *paths, char *file)
|
||||
{
|
||||
char *path;
|
||||
char *tmp;
|
||||
int done;
|
||||
int len, flen;
|
||||
char *fullpath;
|
||||
char *path;
|
||||
char *tmp, *tmp2;
|
||||
int len, flen;
|
||||
char *fullpath;
|
||||
|
||||
if (!file)
|
||||
return NULL;
|
||||
|
||||
if (*file == '/' || *file == '~' || *file == '$' || !paths || *paths == 0) {
|
||||
if (access(file, F_OK) < 0) {
|
||||
fullpath = wexpandpath(file);
|
||||
if (!fullpath)
|
||||
return NULL;
|
||||
|
||||
if (access(fullpath, F_OK) < 0) {
|
||||
wfree(fullpath);
|
||||
return NULL;
|
||||
} else {
|
||||
return fullpath;
|
||||
}
|
||||
} else {
|
||||
return wstrdup(file);
|
||||
}
|
||||
}
|
||||
|
||||
flen = strlen(file);
|
||||
tmp = paths;
|
||||
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;
|
||||
if (path[len - 1] != '/')
|
||||
strcat(path, "/");
|
||||
strcat(path, file);
|
||||
fullpath = wexpandpath(path);
|
||||
wfree(path);
|
||||
if (fullpath) {
|
||||
if (access(fullpath, F_OK) == 0) {
|
||||
return fullpath;
|
||||
}
|
||||
wfree(fullpath);
|
||||
}
|
||||
tmp = tmp2;
|
||||
}
|
||||
|
||||
if (!file)
|
||||
return NULL;
|
||||
|
||||
if (*file=='/' || *file=='~' || *file=='$' || !paths) {
|
||||
if (access(file, R_OK)<0) {
|
||||
fullpath = wexpandpath(file);
|
||||
if (!fullpath)
|
||||
return NULL;
|
||||
|
||||
if (access(fullpath, R_OK)<0) {
|
||||
free(fullpath);
|
||||
return NULL;
|
||||
} else {
|
||||
return fullpath;
|
||||
}
|
||||
} else {
|
||||
return wstrdup(file);
|
||||
}
|
||||
}
|
||||
|
||||
flen = strlen(file);
|
||||
tmp = paths;
|
||||
done = 0;
|
||||
while (!done) {
|
||||
len = strcspn(tmp, ":");
|
||||
if (len==0) done=1;
|
||||
path = wmalloc(len+flen+2);
|
||||
path = memcpy(path, tmp, len);
|
||||
path[len]=0;
|
||||
strcat(path, "/");
|
||||
strcat(path, file);
|
||||
fullpath = wexpandpath(path);
|
||||
free(path);
|
||||
if (fullpath) {
|
||||
if (access(fullpath, R_OK)==0) {
|
||||
return fullpath;
|
||||
}
|
||||
free(fullpath);
|
||||
}
|
||||
tmp=&(tmp[len+1]);
|
||||
if (*tmp==0) break;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
wfindfileinlist(char **path_list, char *file)
|
||||
char *wfindfileinlist(char **path_list, char *file)
|
||||
{
|
||||
int i;
|
||||
char *path;
|
||||
int len, flen;
|
||||
char *fullpath;
|
||||
int i;
|
||||
char *path;
|
||||
int len, flen;
|
||||
char *fullpath;
|
||||
|
||||
if (!file)
|
||||
if (!file)
|
||||
return NULL;
|
||||
|
||||
if (*file == '/' || *file == '~' || !path_list) {
|
||||
if (access(file, F_OK) < 0) {
|
||||
fullpath = wexpandpath(file);
|
||||
if (!fullpath)
|
||||
return NULL;
|
||||
|
||||
if (access(fullpath, F_OK) < 0) {
|
||||
wfree(fullpath);
|
||||
return NULL;
|
||||
} else {
|
||||
return fullpath;
|
||||
}
|
||||
} else {
|
||||
return wstrdup(file);
|
||||
}
|
||||
}
|
||||
|
||||
flen = strlen(file);
|
||||
for (i = 0; path_list[i] != NULL; i++) {
|
||||
len = strlen(path_list[i]);
|
||||
path = wmalloc(len + flen + 2);
|
||||
path = memcpy(path, path_list[i], len);
|
||||
path[len] = 0;
|
||||
strcat(path, "/");
|
||||
strcat(path, file);
|
||||
/* expand tilde */
|
||||
fullpath = wexpandpath(path);
|
||||
wfree(path);
|
||||
if (fullpath) {
|
||||
/* check if file exists */
|
||||
if (access(fullpath, F_OK) == 0) {
|
||||
return fullpath;
|
||||
}
|
||||
wfree(fullpath);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
|
||||
if (*file=='/' || *file=='~' || !path_list) {
|
||||
if (access(file, R_OK)<0) {
|
||||
fullpath = wexpandpath(file);
|
||||
if (!fullpath)
|
||||
return NULL;
|
||||
|
||||
if (access(fullpath, R_OK)<0) {
|
||||
free(fullpath);
|
||||
return NULL;
|
||||
} else {
|
||||
return fullpath;
|
||||
}
|
||||
} else {
|
||||
return wstrdup(file);
|
||||
}
|
||||
}
|
||||
|
||||
flen = strlen(file);
|
||||
for (i=0; path_list[i]!=NULL; i++) {
|
||||
len = strlen(path_list[i]);
|
||||
path = wmalloc(len+flen+2);
|
||||
path = memcpy(path, path_list[i], len);
|
||||
path[len]=0;
|
||||
strcat(path, "/");
|
||||
strcat(path, file);
|
||||
/* expand tilde */
|
||||
fullpath = wexpandpath(path);
|
||||
free(path);
|
||||
if (fullpath) {
|
||||
/* check if file is readable */
|
||||
if (access(fullpath, R_OK)==0) {
|
||||
return fullpath;
|
||||
}
|
||||
free(fullpath);
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *wfindfileinarray(WMPropList * array, char *file)
|
||||
{
|
||||
int i;
|
||||
char *path;
|
||||
int len, flen;
|
||||
char *fullpath;
|
||||
|
||||
if (!file)
|
||||
return NULL;
|
||||
|
||||
if (*file == '/' || *file == '~' || !array) {
|
||||
if (access(file, F_OK) < 0) {
|
||||
fullpath = wexpandpath(file);
|
||||
if (!fullpath)
|
||||
return NULL;
|
||||
|
||||
if (access(fullpath, F_OK) < 0) {
|
||||
wfree(fullpath);
|
||||
return NULL;
|
||||
} else {
|
||||
return fullpath;
|
||||
}
|
||||
} else {
|
||||
return wstrdup(file);
|
||||
}
|
||||
}
|
||||
|
||||
flen = strlen(file);
|
||||
for (i = 0; i < WMGetPropListItemCount(array); i++) {
|
||||
WMPropList *prop;
|
||||
char *p;
|
||||
|
||||
prop = WMGetFromPLArray(array, i);
|
||||
if (!prop)
|
||||
continue;
|
||||
p = WMGetFromPLString(prop);
|
||||
|
||||
len = strlen(p);
|
||||
path = wmalloc(len + flen + 2);
|
||||
path = memcpy(path, p, len);
|
||||
path[len] = 0;
|
||||
strcat(path, "/");
|
||||
strcat(path, file);
|
||||
/* expand tilde */
|
||||
fullpath = wexpandpath(path);
|
||||
wfree(path);
|
||||
if (fullpath) {
|
||||
/* check if file exists */
|
||||
if (access(fullpath, F_OK) == 0) {
|
||||
return fullpath;
|
||||
}
|
||||
wfree(fullpath);
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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,400 +6,433 @@
|
||||
|
||||
#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;
|
||||
|
||||
struct HashItem *next; /* collided item list */
|
||||
const void *key;
|
||||
const void *data;
|
||||
|
||||
struct HashItem *next; /* collided item list */
|
||||
} HashItem;
|
||||
|
||||
|
||||
typedef struct W_HashTable {
|
||||
WMHashTableCallbacks callbacks;
|
||||
WMHashTableCallbacks callbacks;
|
||||
|
||||
unsigned itemCount;
|
||||
unsigned size; /* table size */
|
||||
unsigned itemCount;
|
||||
unsigned size; /* table size */
|
||||
|
||||
HashItem **table;
|
||||
HashItem **table;
|
||||
} HashTable;
|
||||
|
||||
|
||||
|
||||
|
||||
#define HASH(table, key) (((table)->callbacks.hash ? \
|
||||
(*(table)->callbacks.hash)(key) : hashPtr(key)) % (table)->size)
|
||||
(*(table)->callbacks.hash)(key) : hashPtr(key)) % (table)->size)
|
||||
|
||||
#define DUPKEY(table, key) ((table)->callbacks.retainKey ? \
|
||||
(*(table)->callbacks.retainKey)(key) : (key))
|
||||
(*(table)->callbacks.retainKey)(key) : (key))
|
||||
|
||||
#define RELKEY(table, key) if ((table)->callbacks.releaseKey) \
|
||||
(*(table)->callbacks.releaseKey)(key)
|
||||
(*(table)->callbacks.releaseKey)(key)
|
||||
|
||||
|
||||
|
||||
|
||||
static INLINE unsigned
|
||||
hashString(const char *key)
|
||||
static INLINE unsigned hashString(const char *key)
|
||||
{
|
||||
unsigned ret = 0;
|
||||
unsigned ctr = 0;
|
||||
unsigned ret = 0;
|
||||
unsigned ctr = 0;
|
||||
|
||||
while (*key) {
|
||||
ret ^= *(char*)key++ << ctr;
|
||||
ctr = (ctr + 1) % sizeof (char *);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static INLINE unsigned
|
||||
hashPtr(const void *key)
|
||||
{
|
||||
return ((size_t)key / sizeof(char*));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void
|
||||
rellocateItem(WMHashTable *table, HashItem *item)
|
||||
{
|
||||
unsigned h;
|
||||
|
||||
h = HASH(table, item->key);
|
||||
|
||||
item->next = table->table[h];
|
||||
table->table[h] = item;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
rebuildTable(WMHashTable *table)
|
||||
{
|
||||
HashItem *next;
|
||||
HashItem **oldArray;
|
||||
int i;
|
||||
int oldSize;
|
||||
int newSize;
|
||||
|
||||
oldArray = table->table;
|
||||
oldSize = table->size;
|
||||
|
||||
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++) {
|
||||
while (oldArray[i]!=NULL) {
|
||||
next = oldArray[i]->next;
|
||||
rellocateItem(table, oldArray[i]);
|
||||
oldArray[i] = next;
|
||||
while (*key) {
|
||||
ret ^= *(char *)key++ << ctr;
|
||||
ctr = (ctr + 1) % sizeof(char *);
|
||||
}
|
||||
}
|
||||
free(oldArray);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
WMHashTable*
|
||||
WMCreateHashTable(WMHashTableCallbacks callbacks)
|
||||
static INLINE unsigned hashPtr(const void *key)
|
||||
{
|
||||
HashTable *table;
|
||||
|
||||
table = wmalloc(sizeof(HashTable));
|
||||
memset(table, 0, sizeof(HashTable));
|
||||
|
||||
table->callbacks = callbacks;
|
||||
|
||||
table->size = INITIAL_CAPACITY;
|
||||
|
||||
table->table = wmalloc(sizeof(HashItem*)*table->size);
|
||||
memset(table->table, 0, sizeof(HashItem*)*table->size);
|
||||
|
||||
return table;
|
||||
return ((size_t) key / sizeof(char *));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMResetHashTable(WMHashTable *table)
|
||||
static void rellocateItem(WMHashTable * table, HashItem * item)
|
||||
{
|
||||
HashItem *item, *tmp;
|
||||
int i;
|
||||
unsigned h;
|
||||
|
||||
for (i = 0; i < table->size; i++) {
|
||||
item = table->table[i];
|
||||
while (item) {
|
||||
tmp = item->next;
|
||||
RELKEY(table, item);
|
||||
free(item);
|
||||
item = tmp;
|
||||
h = HASH(table, item->key);
|
||||
|
||||
item->next = table->table[h];
|
||||
table->table[h] = item;
|
||||
}
|
||||
|
||||
static void rebuildTable(WMHashTable * table)
|
||||
{
|
||||
HashItem *next;
|
||||
HashItem **oldArray;
|
||||
int i;
|
||||
int oldSize;
|
||||
int newSize;
|
||||
|
||||
oldArray = table->table;
|
||||
oldSize = table->size;
|
||||
|
||||
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++) {
|
||||
while (oldArray[i] != NULL) {
|
||||
next = oldArray[i]->next;
|
||||
rellocateItem(table, oldArray[i]);
|
||||
oldArray[i] = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
wfree(oldArray);
|
||||
}
|
||||
|
||||
WMHashTable *WMCreateHashTable(WMHashTableCallbacks callbacks)
|
||||
{
|
||||
HashTable *table;
|
||||
|
||||
table = wmalloc(sizeof(HashTable));
|
||||
memset(table, 0, sizeof(HashTable));
|
||||
|
||||
table->callbacks = callbacks;
|
||||
|
||||
table->itemCount = 0;
|
||||
|
||||
if (table->size > INITIAL_CAPACITY) {
|
||||
free(table->table);
|
||||
table->size = INITIAL_CAPACITY;
|
||||
table->table = wmalloc(sizeof(HashItem*)*table->size);
|
||||
}
|
||||
memset(table->table, 0, sizeof(HashItem*)*table->size);
|
||||
|
||||
table->table = wmalloc(sizeof(HashItem *) * table->size);
|
||||
memset(table->table, 0, sizeof(HashItem *) * table->size);
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMFreeHashTable(WMHashTable *table)
|
||||
void WMResetHashTable(WMHashTable * table)
|
||||
{
|
||||
HashItem *item, *tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < table->size; i++) {
|
||||
item = table->table[i];
|
||||
while (item) {
|
||||
tmp = item->next;
|
||||
RELKEY(table, item);
|
||||
free(item);
|
||||
item = tmp;
|
||||
HashItem *item, *tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < table->size; i++) {
|
||||
item = table->table[i];
|
||||
while (item) {
|
||||
tmp = item->next;
|
||||
RELKEY(table, item->key);
|
||||
wfree(item);
|
||||
item = tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
free(table->table);
|
||||
free(table);
|
||||
|
||||
table->itemCount = 0;
|
||||
|
||||
if (table->size > INITIAL_CAPACITY) {
|
||||
wfree(table->table);
|
||||
table->size = INITIAL_CAPACITY;
|
||||
table->table = wmalloc(sizeof(HashItem *) * table->size);
|
||||
}
|
||||
memset(table->table, 0, sizeof(HashItem *) * table->size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void*
|
||||
WMHashGet(WMHashTable *table, const void *key)
|
||||
void WMFreeHashTable(WMHashTable * table)
|
||||
{
|
||||
unsigned h;
|
||||
HashItem *item;
|
||||
|
||||
h = HASH(table, key);
|
||||
item = table->table[h];
|
||||
|
||||
if (table->callbacks.keyIsEqual) {
|
||||
while (item) {
|
||||
if ((*table->callbacks.keyIsEqual)(key, item->key)) {
|
||||
break;
|
||||
}
|
||||
item = item->next;
|
||||
HashItem *item, *tmp;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < table->size; i++) {
|
||||
item = table->table[i];
|
||||
while (item) {
|
||||
tmp = item->next;
|
||||
RELKEY(table, item->key);
|
||||
wfree(item);
|
||||
item = tmp;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
while (item) {
|
||||
if (key == item->key) {
|
||||
break;
|
||||
}
|
||||
item = item->next;
|
||||
wfree(table->table);
|
||||
wfree(table);
|
||||
}
|
||||
|
||||
unsigned WMCountHashTable(WMHashTable * table)
|
||||
{
|
||||
return table->itemCount;
|
||||
}
|
||||
|
||||
void *WMHashGet(WMHashTable * table, const void *key)
|
||||
{
|
||||
unsigned h;
|
||||
HashItem *item;
|
||||
|
||||
h = HASH(table, key);
|
||||
item = table->table[h];
|
||||
|
||||
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)
|
||||
return item->data;
|
||||
else
|
||||
if (item)
|
||||
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];
|
||||
|
||||
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;
|
||||
int replacing = 0;
|
||||
|
||||
h = HASH(table, key);
|
||||
/* look for the entry */
|
||||
item = table->table[h];
|
||||
if (table->callbacks.keyIsEqual) {
|
||||
while (item) {
|
||||
if ((*table->callbacks.keyIsEqual) (key, item->key)) {
|
||||
replacing = 1;
|
||||
break;
|
||||
}
|
||||
item = item->next;
|
||||
}
|
||||
} else {
|
||||
while (item) {
|
||||
if (key == item->key) {
|
||||
replacing = 1;
|
||||
break;
|
||||
}
|
||||
item = item->next;
|
||||
}
|
||||
}
|
||||
|
||||
if (replacing) {
|
||||
const void *old;
|
||||
|
||||
old = item->data;
|
||||
item->data = data;
|
||||
RELKEY(table, item->key);
|
||||
item->key = DUPKEY(table, key);
|
||||
|
||||
return (void *)old;
|
||||
} else {
|
||||
HashItem *nitem;
|
||||
|
||||
nitem = wmalloc(sizeof(HashItem));
|
||||
nitem->key = DUPKEY(table, key);
|
||||
nitem->data = data;
|
||||
nitem->next = table->table[h];
|
||||
table->table[h] = nitem;
|
||||
|
||||
table->itemCount++;
|
||||
}
|
||||
|
||||
/* OPTIMIZE: put this in an idle handler. */
|
||||
if (table->itemCount > table->size) {
|
||||
#ifdef DEBUG0
|
||||
printf("rebuilding hash table...\n");
|
||||
#endif
|
||||
rebuildTable(table);
|
||||
#ifdef DEBUG0
|
||||
printf("finished rebuild.\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void*
|
||||
WMHashInsert(WMHashTable *table, void *key, void *data)
|
||||
static HashItem *deleteFromList(HashTable * table, HashItem * item, const void *key)
|
||||
{
|
||||
unsigned h;
|
||||
HashItem *item;
|
||||
int replacing = 0;
|
||||
|
||||
h = HASH(table, key);
|
||||
/* look for the entry */
|
||||
item = table->table[h];
|
||||
if (table->callbacks.keyIsEqual) {
|
||||
while (item) {
|
||||
if ((*table->callbacks.keyIsEqual)(key, item->key)) {
|
||||
replacing = 1;
|
||||
break;
|
||||
}
|
||||
item = item->next;
|
||||
HashItem *next;
|
||||
|
||||
if (item == NULL)
|
||||
return NULL;
|
||||
|
||||
if ((table->callbacks.keyIsEqual && (*table->callbacks.keyIsEqual) (key, item->key))
|
||||
|| (!table->callbacks.keyIsEqual && key == item->key)) {
|
||||
|
||||
next = item->next;
|
||||
RELKEY(table, item->key);
|
||||
wfree(item);
|
||||
|
||||
table->itemCount--;
|
||||
|
||||
return next;
|
||||
}
|
||||
} else {
|
||||
while (item) {
|
||||
if (key == item->key) {
|
||||
replacing = 1;
|
||||
break;
|
||||
}
|
||||
item = item->next;
|
||||
|
||||
item->next = deleteFromList(table, item->next, key);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
void WMHashRemove(WMHashTable * table, const void *key)
|
||||
{
|
||||
unsigned h;
|
||||
|
||||
h = HASH(table, key);
|
||||
|
||||
table->table[h] = deleteFromList(table, table->table[h], key);
|
||||
}
|
||||
|
||||
WMHashEnumerator WMEnumerateHashTable(WMHashTable * table)
|
||||
{
|
||||
WMHashEnumerator enumerator;
|
||||
|
||||
enumerator.table = table;
|
||||
enumerator.index = 0;
|
||||
enumerator.nextItem = table->table[0];
|
||||
|
||||
return enumerator;
|
||||
}
|
||||
|
||||
void *WMNextHashEnumeratorItem(WMHashEnumerator * enumerator)
|
||||
{
|
||||
const void *data = NULL;
|
||||
|
||||
/* this assumes the table doesn't change between
|
||||
* WMEnumerateHashTable() and WMNextHashEnumeratorItem() 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 (replacing) {
|
||||
void *old;
|
||||
|
||||
old = item->data;
|
||||
item->data = data;
|
||||
RELKEY(table, item->key);
|
||||
item->key = DUPKEY(table, key);
|
||||
|
||||
return old;
|
||||
} else {
|
||||
HashItem *nitem;
|
||||
|
||||
nitem = wmalloc(sizeof(HashItem));
|
||||
nitem->key = DUPKEY(table, key);
|
||||
nitem->data = data;
|
||||
nitem->next = table->table[h];
|
||||
table->table[h] = nitem;
|
||||
|
||||
table->itemCount++;
|
||||
}
|
||||
|
||||
/* OPTIMIZE: put this in an idle handler.*/
|
||||
if (table->itemCount > table->size) {
|
||||
#ifdef DEBUG0
|
||||
printf("rebuilding hash table...\n");
|
||||
#endif
|
||||
rebuildTable(table);
|
||||
#ifdef DEBUG0
|
||||
printf("finished rebuild.\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
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))
|
||||
|| (!table->callbacks.keyIsEqual && key==item->key)) {
|
||||
|
||||
next = item->next;
|
||||
RELKEY(table, item->key);
|
||||
free(item);
|
||||
|
||||
table->itemCount--;
|
||||
|
||||
return next;
|
||||
}
|
||||
|
||||
item->next = deleteFromList(table, item->next, key);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMHashRemove(WMHashTable *table, const void *key)
|
||||
{
|
||||
unsigned h;
|
||||
|
||||
h = HASH(table, key);
|
||||
|
||||
table->table[h] = deleteFromList(table, table->table[h], key);
|
||||
}
|
||||
|
||||
|
||||
WMHashEnumerator
|
||||
WMEnumerateHashTable(WMHashTable *table)
|
||||
{
|
||||
WMHashEnumerator enumerator;
|
||||
|
||||
enumerator.table = table;
|
||||
enumerator.index = 0;
|
||||
enumerator.nextItem = table->table[0];
|
||||
|
||||
return enumerator;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void*
|
||||
WMNextHashEnumeratorItem(WMHashEnumerator *enumerator)
|
||||
{
|
||||
void *data = NULL;
|
||||
|
||||
/* this assumes the table doesn't change between
|
||||
* WMEnumerateHashTable() and WMNextHashEnumeratorItem() 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) {
|
||||
data = ((HashItem *) enumerator->nextItem)->data;
|
||||
enumerator->nextItem = ((HashItem *) enumerator->nextItem)->next;
|
||||
}
|
||||
}
|
||||
|
||||
if (enumerator->nextItem) {
|
||||
data = ((HashItem*)enumerator->nextItem)->data;
|
||||
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;
|
||||
}
|
||||
|
||||
return (void *)key;
|
||||
}
|
||||
|
||||
|
||||
static Bool
|
||||
compareStrings(const char *key1, const char *key2)
|
||||
Bool WMNextHashEnumeratorItemAndKey(WMHashEnumerator * enumerator, void **item, void **key)
|
||||
{
|
||||
return strcmp(key1, key2)==0;
|
||||
/* 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*);
|
||||
|
||||
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,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
const WMHashTableCallbacks WMStringHashCallbacks = {
|
||||
(hashFunc)hashString,
|
||||
(isEqualFunc)compareStrings,
|
||||
(retainFunc)wstrdup,
|
||||
(releaseFunc)free
|
||||
(hashFunc) hashString,
|
||||
(isEqualFunc) compareStrings,
|
||||
(retainFunc) wstrdup,
|
||||
(releaseFunc) wfree
|
||||
};
|
||||
|
||||
|
||||
|
||||
const WMHashTableCallbacks WMStringPointerHashCallbacks = {
|
||||
(hashFunc)hashString,
|
||||
(isEqualFunc)compareStrings,
|
||||
(hashFunc) hashString,
|
||||
(isEqualFunc) compareStrings,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
265
WINGs/host.c
Normal file
265
WINGs/host.c
Normal file
@@ -0,0 +1,265 @@
|
||||
/*
|
||||
* WINGs WMHost function library
|
||||
*
|
||||
* 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
|
||||
* 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 "wconfig.h"
|
||||
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
/* For Solaris */
|
||||
#ifndef INADDR_NONE
|
||||
# define INADDR_NONE (-1)
|
||||
#endif
|
||||
|
||||
/* Max hostname length (RFC 1123) */
|
||||
#define W_MAXHOSTNAMELEN 255
|
||||
|
||||
typedef struct W_Host {
|
||||
char *name;
|
||||
|
||||
WMArray *names;
|
||||
WMArray *addresses;
|
||||
|
||||
int refCount;
|
||||
} W_Host;
|
||||
|
||||
static WMHashTable *hostCache = NULL;
|
||||
|
||||
static Bool hostCacheEnabled = True;
|
||||
|
||||
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 = WMCreateArrayWithDestructor(1, wfree);
|
||||
hPtr->addresses = WMCreateArrayWithDestructor(1, wfree);
|
||||
|
||||
WMAddToArray(hPtr->names, wstrdup(host->h_name));
|
||||
|
||||
for (i = 0; host->h_aliases[i] != NULL; i++) {
|
||||
WMAddToArray(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);
|
||||
WMAddToArray(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;
|
||||
|
||||
wassertrv(name != NULL, 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;
|
||||
|
||||
wassertrv(address != NULL, 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) == 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)
|
||||
{
|
||||
hPtr->refCount--;
|
||||
|
||||
if (hPtr->refCount > 0)
|
||||
return;
|
||||
|
||||
WMFreeArray(hPtr->names);
|
||||
WMFreeArray(hPtr->addresses);
|
||||
|
||||
if (hPtr->name) {
|
||||
WMHashRemove(hostCache, hPtr->name);
|
||||
wfree(hPtr->name);
|
||||
}
|
||||
|
||||
wfree(hPtr);
|
||||
}
|
||||
|
||||
void WMSetHostCacheEnabled(Bool flag)
|
||||
{
|
||||
hostCacheEnabled = ((flag == 0) ? 0 : 1);
|
||||
}
|
||||
|
||||
Bool WMIsHostCacheEnabled()
|
||||
{
|
||||
return hostCacheEnabled;
|
||||
}
|
||||
|
||||
void WMFlushHostCache()
|
||||
{
|
||||
if (hostCache && WMCountHashTable(hostCache) > 0) {
|
||||
WMArray *hostArray = WMCreateArray(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. */
|
||||
WMAddToArray(hostArray, hPtr);
|
||||
}
|
||||
for (i = 0; i < WMGetArrayItemCount(hostArray); i++)
|
||||
WMReleaseHost(WMGetFromArray(hostArray, i));
|
||||
WMFreeArray(hostArray);
|
||||
WMResetHashTable(hostCache);
|
||||
}
|
||||
}
|
||||
|
||||
static int matchAddress(void *item, void *cdata)
|
||||
{
|
||||
return (strcmp((char *)item, (char *)cdata) == 0);
|
||||
}
|
||||
|
||||
Bool WMIsHostEqualToHost(WMHost * hPtr, WMHost * aPtr)
|
||||
{
|
||||
char *adr;
|
||||
int i;
|
||||
|
||||
wassertrv(hPtr != NULL && aPtr != NULL, False);
|
||||
|
||||
if (hPtr == aPtr)
|
||||
return True;
|
||||
|
||||
for (i = 0; i < WMGetArrayItemCount(aPtr->addresses); i++) {
|
||||
adr = WMGetFromArray(aPtr->addresses, i);
|
||||
if (WMFindInArray(hPtr->addresses, matchAddress, adr) != WANotFound) {
|
||||
return True;
|
||||
}
|
||||
}
|
||||
|
||||
return False;
|
||||
}
|
||||
|
||||
char *WMGetHostName(WMHost * hPtr)
|
||||
{
|
||||
return (WMGetArrayItemCount(hPtr->names) > 0 ? WMGetFromArray(hPtr->names, 0) : NULL);
|
||||
/*return WMGetFromArray(hPtr->names, 0); */
|
||||
}
|
||||
|
||||
WMArray *WMGetHostNames(WMHost * hPtr)
|
||||
{
|
||||
return hPtr->names;
|
||||
}
|
||||
|
||||
char *WMGetHostAddress(WMHost * hPtr)
|
||||
{
|
||||
return (WMGetArrayItemCount(hPtr->addresses) > 0 ? WMGetFromArray(hPtr->addresses, 0) : NULL);
|
||||
}
|
||||
|
||||
WMArray *WMGetHostAddresses(WMHost * hPtr)
|
||||
{
|
||||
return hPtr->addresses;
|
||||
}
|
||||
@@ -1,12 +1,9 @@
|
||||
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include "WINGsP.h"
|
||||
|
||||
|
||||
void
|
||||
InitI18n(Display *dpy)
|
||||
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
|
||||
'''
|
||||
|
||||
255
WINGs/memory.c
255
WINGs/memory.c
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* WindowMaker miscelaneous function library
|
||||
*
|
||||
* Copyright (c) 1997 Alfredo K. Kojima
|
||||
*
|
||||
* Window Maker miscelaneous function library
|
||||
*
|
||||
* 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
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
@@ -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>
|
||||
@@ -29,6 +27,11 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include <signal.h>
|
||||
|
||||
#ifdef TEST_WITH_GC
|
||||
#include <gc/gc.h>
|
||||
#endif
|
||||
|
||||
#ifndef False
|
||||
# define False 0
|
||||
@@ -37,133 +40,169 @@
|
||||
# define True 1
|
||||
#endif
|
||||
|
||||
extern void wAbort(int);
|
||||
static void defaultHandler(int bla)
|
||||
{
|
||||
if (bla)
|
||||
kill(getpid(), SIGABRT);
|
||||
else
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static int Aborting=0; /* if we're in the middle of an emergency exit */
|
||||
static waborthandler *aborthandler = (waborthandler *) defaultHandler;
|
||||
|
||||
#define wAbort(a) (*aborthandler)(a)
|
||||
|
||||
waborthandler *wsetabort(waborthandler * handler)
|
||||
{
|
||||
waborthandler *old = aborthandler;
|
||||
|
||||
aborthandler = 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;
|
||||
|
||||
tmp = malloc(size);
|
||||
if (tmp == NULL) {
|
||||
wwarning("malloc() failed. Retrying after 2s.");
|
||||
sleep(2);
|
||||
void *tmp;
|
||||
|
||||
assert(size > 0);
|
||||
|
||||
#ifdef TEST_WITH_GC
|
||||
tmp = GC_malloc(size);
|
||||
#else
|
||||
tmp = malloc(size);
|
||||
#endif
|
||||
if (tmp == NULL) {
|
||||
if (Aborting) {
|
||||
puts("Real Bad Error: recursive malloc() failure.");
|
||||
exit(-1);
|
||||
} else {
|
||||
wfatal("virtual memory exhausted");
|
||||
Aborting=1;
|
||||
wAbort(False);
|
||||
}
|
||||
wwarning("malloc() failed. Retrying after 2s.");
|
||||
sleep(2);
|
||||
#ifdef TEST_WITH_GC
|
||||
tmp = GC_malloc(size);
|
||||
#else
|
||||
tmp = malloc(size);
|
||||
#endif
|
||||
if (tmp == NULL) {
|
||||
if (Aborting) {
|
||||
fputs("Really Bad Error: recursive malloc() failure.", stderr);
|
||||
exit(-1);
|
||||
} else {
|
||||
wfatal("virtual memory exhausted");
|
||||
Aborting = 1;
|
||||
wAbort(False);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return tmp;
|
||||
return tmp;
|
||||
}
|
||||
|
||||
void *wmalloc0(size_t size)
|
||||
{
|
||||
void *ptr = wmalloc(size);
|
||||
if (!ptr)
|
||||
return NULL;
|
||||
|
||||
memset(ptr, 0, size);
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void *wrealloc(void *ptr, size_t newsize)
|
||||
{
|
||||
void *nptr;
|
||||
void *nptr;
|
||||
|
||||
if (!ptr) {
|
||||
nptr = malloc(newsize);
|
||||
} else {
|
||||
nptr=realloc(ptr, newsize);
|
||||
}
|
||||
if (nptr==NULL) {
|
||||
printf("Could not do realloc");
|
||||
return NULL;
|
||||
}
|
||||
return nptr;
|
||||
}
|
||||
|
||||
|
||||
void*
|
||||
wretain(void *ptr)
|
||||
{
|
||||
int *refcount;
|
||||
|
||||
if (!table) {
|
||||
table = WMCreateHashTable(WMIntHashCallbacks);
|
||||
}
|
||||
|
||||
refcount = WMHashGet(table, ptr);
|
||||
if (!refcount) {
|
||||
refcount = wmalloc(sizeof(int));
|
||||
*refcount = 1;
|
||||
WMHashInsert(table, ptr, refcount);
|
||||
#ifdef VERBOSE
|
||||
printf("== %i (%p)\n", *refcount, ptr);
|
||||
if (!ptr) {
|
||||
nptr = wmalloc(newsize);
|
||||
} else if (newsize == 0) {
|
||||
wfree(ptr);
|
||||
nptr = NULL;
|
||||
} else {
|
||||
#ifdef TEST_WITH_GC
|
||||
nptr = GC_realloc(ptr, newsize);
|
||||
#else
|
||||
nptr = realloc(ptr, newsize);
|
||||
#endif
|
||||
} else {
|
||||
(*refcount)++;
|
||||
#ifdef VERBOSE
|
||||
printf("+ %i (%p)\n", *refcount, ptr);
|
||||
if (nptr == NULL) {
|
||||
wwarning("realloc() failed. Retrying after 2s.");
|
||||
sleep(2);
|
||||
#ifdef TEST_WITH_GC
|
||||
nptr = GC_realloc(ptr, newsize);
|
||||
#else
|
||||
nptr = realloc(ptr, newsize);
|
||||
#endif
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
wrelease(void *ptr)
|
||||
{
|
||||
int *refcount;
|
||||
|
||||
refcount = WMHashGet(table, ptr);
|
||||
if (!refcount) {
|
||||
wwarning("trying to release unexisting data %p", ptr);
|
||||
} else {
|
||||
(*refcount)--;
|
||||
if (*refcount < 1) {
|
||||
#ifdef VERBOSE
|
||||
printf("RELEASING %p\n", ptr);
|
||||
#endif
|
||||
WMHashRemove(table, ptr);
|
||||
free(refcount);
|
||||
free(ptr);
|
||||
if (nptr == NULL) {
|
||||
if (Aborting) {
|
||||
fputs("Really Bad Error: recursive realloc() failure.", stderr);
|
||||
exit(-1);
|
||||
} else {
|
||||
wfatal("virtual memory exhausted");
|
||||
Aborting = 1;
|
||||
wAbort(False);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef VERBOSE
|
||||
else {
|
||||
printf("- %i (%p)\n", *refcount, ptr);
|
||||
return nptr;
|
||||
}
|
||||
|
||||
void *wretain(void *ptr)
|
||||
{
|
||||
int *refcount;
|
||||
|
||||
if (!table) {
|
||||
table = WMCreateHashTable(WMIntHashCallbacks);
|
||||
}
|
||||
|
||||
refcount = WMHashGet(table, ptr);
|
||||
if (!refcount) {
|
||||
refcount = wmalloc(sizeof(int));
|
||||
*refcount = 1;
|
||||
WMHashInsert(table, ptr, refcount);
|
||||
#ifdef VERBOSE
|
||||
printf("== %i (%p)\n", *refcount, ptr);
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
(*refcount)++;
|
||||
#ifdef VERBOSE
|
||||
printf("+ %i (%p)\n", *refcount, ptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
wstrdup(char *str)
|
||||
void wfree(void *ptr)
|
||||
{
|
||||
assert(str!=NULL);
|
||||
|
||||
return strcpy(wmalloc(strlen(str)+1), str);
|
||||
#ifdef TEST_WITH_GC
|
||||
GC_free(ptr);
|
||||
#else
|
||||
free(ptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
char*
|
||||
wstrappend(char *dst, char *src)
|
||||
void wrelease(void *ptr)
|
||||
{
|
||||
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);
|
||||
int *refcount;
|
||||
|
||||
return str;
|
||||
refcount = WMHashGet(table, ptr);
|
||||
if (!refcount) {
|
||||
wwarning("trying to release unexisting data %p", ptr);
|
||||
} else {
|
||||
(*refcount)--;
|
||||
if (*refcount < 1) {
|
||||
#ifdef VERBOSE
|
||||
printf("RELEASING %p\n", ptr);
|
||||
#endif
|
||||
WMHashRemove(table, ptr);
|
||||
wfree(refcount);
|
||||
wfree(ptr);
|
||||
}
|
||||
#ifdef VERBOSE
|
||||
else {
|
||||
printf("- %i (%p)\n", *refcount, ptr);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
221
WINGs/mywidget.c
221
WINGs/mywidget.c
@@ -1,221 +0,0 @@
|
||||
/*
|
||||
* Demo user widget for WINGs.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 1998 Alfredo K. Kojima
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* 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);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Some procedures you might want to override. Don't forget to call
|
||||
* the equivalent view procedure after (or before) doing your stuff.
|
||||
* 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_ViewProcedureTable _MyWidgetViewProcedures = {
|
||||
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(&_MyWidgetViewProcedures);
|
||||
}
|
||||
|
||||
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) {
|
||||
free(mPtr);
|
||||
return NULL;
|
||||
}
|
||||
/* always do this */
|
||||
mPtr->view->self = mPtr;
|
||||
|
||||
/*
|
||||
* 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, W_GC(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)
|
||||
free(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)
|
||||
free(mPtr->text);
|
||||
|
||||
free(mPtr);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,409 +6,466 @@
|
||||
|
||||
#include "WUtil.h"
|
||||
|
||||
|
||||
typedef struct W_Notification {
|
||||
char *name;
|
||||
void *object;
|
||||
void *clientData;
|
||||
int refCount;
|
||||
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;
|
||||
return notification->name;
|
||||
}
|
||||
|
||||
|
||||
void*
|
||||
WMGetNotificationObject(WMNotification *notification)
|
||||
void *WMGetNotificationObject(WMNotification * notification)
|
||||
{
|
||||
return notification->object;
|
||||
return notification->object;
|
||||
}
|
||||
|
||||
|
||||
void*
|
||||
WMGetNotificationClientData(WMNotification *notification)
|
||||
void *WMGetNotificationClientData(WMNotification * notification)
|
||||
{
|
||||
return notification->clientData;
|
||||
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;
|
||||
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--;
|
||||
|
||||
if (notification->refCount < 1) {
|
||||
free(notification);
|
||||
}
|
||||
notification->refCount--;
|
||||
|
||||
if (notification->refCount < 1) {
|
||||
wfree(notification);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
WMNotification*
|
||||
WMRetainNotification(WMNotification *notification)
|
||||
WMNotification *WMRetainNotification(WMNotification * notification)
|
||||
{
|
||||
notification->refCount++;
|
||||
|
||||
return notification;
|
||||
}
|
||||
notification->refCount++;
|
||||
|
||||
return notification;
|
||||
}
|
||||
|
||||
/***************** Notification Center *****************/
|
||||
|
||||
typedef struct NotificationObserver {
|
||||
WMNotificationObserverAction *observerAction;
|
||||
void *observer;
|
||||
WMNotificationObserverAction *observerAction;
|
||||
void *observer;
|
||||
|
||||
char *name;
|
||||
void *object;
|
||||
const char *name;
|
||||
void *object;
|
||||
|
||||
struct NotificationObserver *prev; /* for tables */
|
||||
struct NotificationObserver *next;
|
||||
struct NotificationObserver *nextAction; /* for observerTable */
|
||||
struct NotificationObserver *prev; /* for tables */
|
||||
struct NotificationObserver *next;
|
||||
struct NotificationObserver *nextAction; /* for observerTable */
|
||||
} NotificationObserver;
|
||||
|
||||
|
||||
typedef struct W_NotificationCenter {
|
||||
WMHashTable *nameTable; /* names -> observer lists */
|
||||
WMHashTable *objectTable; /* object -> observer lists */
|
||||
NotificationObserver *nilList; /* obervers that catch everything */
|
||||
|
||||
WMHashTable *observerTable; /* observer -> NotificationObserver */
|
||||
} NotificationCenter;
|
||||
WMHashTable *nameTable; /* names -> observer lists */
|
||||
WMHashTable *objectTable; /* object -> observer lists */
|
||||
NotificationObserver *nilList; /* obervers that catch everything */
|
||||
|
||||
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);
|
||||
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)
|
||||
WMAddNotificationObserver(WMNotificationObserverAction * observerAction,
|
||||
void *observer, const char *name, void *object)
|
||||
{
|
||||
NotificationObserver *oRec, *rec;
|
||||
|
||||
oRec = wmalloc(sizeof(NotificationObserver));
|
||||
oRec->observerAction = observerAction;
|
||||
oRec->observer = observer;
|
||||
oRec->name = name;
|
||||
oRec->object = object;
|
||||
oRec->next = NULL;
|
||||
oRec->prev = NULL;
|
||||
|
||||
|
||||
/* put this action in the list of actions for this observer */
|
||||
rec = WMHashInsert(notificationCenter->observerTable, observer, oRec);
|
||||
|
||||
if (rec) {
|
||||
/* if this is not the first action for the observer */
|
||||
oRec->nextAction = rec;
|
||||
} else {
|
||||
oRec->nextAction = NULL;
|
||||
}
|
||||
NotificationObserver *oRec, *rec;
|
||||
|
||||
oRec = wmalloc(sizeof(NotificationObserver));
|
||||
oRec->observerAction = observerAction;
|
||||
oRec->observer = observer;
|
||||
oRec->name = name;
|
||||
oRec->object = object;
|
||||
oRec->next = NULL;
|
||||
oRec->prev = NULL;
|
||||
|
||||
/* put this action in the list of actions for this observer */
|
||||
rec = (NotificationObserver *) WMHashInsert(notificationCenter->observerTable, observer, oRec);
|
||||
|
||||
if (!name && !object) {
|
||||
/* catch-all */
|
||||
oRec->next = notificationCenter->nilList;
|
||||
if (notificationCenter->nilList) {
|
||||
notificationCenter->nilList->prev = oRec;
|
||||
}
|
||||
notificationCenter->nilList = oRec;
|
||||
} else if (!name) {
|
||||
/* any message coming from object */
|
||||
rec = WMHashInsert(notificationCenter->objectTable, object, oRec);
|
||||
oRec->next = rec;
|
||||
if (rec) {
|
||||
rec->prev = oRec;
|
||||
}
|
||||
} else {
|
||||
/* name && (object || !object) */
|
||||
rec = WMHashInsert(notificationCenter->nameTable, name, oRec);
|
||||
oRec->next = rec;
|
||||
if (rec) {
|
||||
rec->prev = oRec;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
|
||||
while (orec) {
|
||||
tmp = orec->next;
|
||||
|
||||
if (!orec->object || orec->object == notification->object) {
|
||||
/* tell the observer */
|
||||
if (orec->observerAction) {
|
||||
(*orec->observerAction)(orec->observer, notification);
|
||||
}
|
||||
}
|
||||
|
||||
orec = tmp;
|
||||
}
|
||||
|
||||
/* tell the observers that want to know about an object */
|
||||
orec = WMHashGet(notificationCenter->objectTable, notification->object);
|
||||
|
||||
while (orec) {
|
||||
tmp = orec->next;
|
||||
|
||||
/* tell the observer */
|
||||
if (orec->observerAction) {
|
||||
(*orec->observerAction)(orec->observer, notification);
|
||||
}
|
||||
orec = tmp;
|
||||
}
|
||||
|
||||
/* tell the catch all observers */
|
||||
orec = notificationCenter->nilList;
|
||||
while (orec) {
|
||||
tmp = orec->next;
|
||||
|
||||
/* tell the observer */
|
||||
if (orec->observerAction) {
|
||||
(*orec->observerAction)(orec->observer, notification);
|
||||
}
|
||||
orec = tmp;
|
||||
}
|
||||
|
||||
WMReleaseNotification(notification);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void
|
||||
WMRemoveNotificationObserver(void *observer)
|
||||
{
|
||||
NotificationObserver *orec, *tmp, *rec;
|
||||
|
||||
|
||||
/* get the list of actions the observer is doing */
|
||||
orec = WMHashGet(notificationCenter->observerTable, observer);
|
||||
|
||||
/*
|
||||
* FOREACH orec IN actionlist for observer
|
||||
* DO
|
||||
* remove from respective lists/tables
|
||||
* free
|
||||
* END
|
||||
*/
|
||||
while (orec) {
|
||||
tmp = orec->nextAction;
|
||||
|
||||
if (!orec->name && !orec->object) {
|
||||
/* catch-all */
|
||||
if (notificationCenter->nilList==orec)
|
||||
notificationCenter->nilList = orec->next;
|
||||
} else if (!orec->name) {
|
||||
/* any message coming from object */
|
||||
rec = WMHashGet(notificationCenter->objectTable, orec->object);
|
||||
if (rec==orec) {
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->objectTable, orec->object,
|
||||
orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->objectTable, orec->object);
|
||||
}
|
||||
}
|
||||
/* if this is not the first action for the observer */
|
||||
oRec->nextAction = rec;
|
||||
} else {
|
||||
/* name && (object || !object) */
|
||||
rec = WMHashGet(notificationCenter->nameTable, orec->name);
|
||||
if (rec==orec) {
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->nameTable, orec->name,
|
||||
orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->nameTable, orec->name);
|
||||
}
|
||||
}
|
||||
oRec->nextAction = NULL;
|
||||
}
|
||||
if (orec->prev)
|
||||
orec->prev->next = orec->next;
|
||||
if (orec->next)
|
||||
orec->next->prev = orec->prev;
|
||||
|
||||
free(orec);
|
||||
|
||||
orec = tmp;
|
||||
}
|
||||
|
||||
WMHashRemove(notificationCenter->observerTable, observer);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMRemoveNotificationObserverWithName(void *observer, char *name, void *object)
|
||||
{
|
||||
NotificationObserver *orec, *tmp, *rec;
|
||||
|
||||
/* get the list of actions the observer is doing */
|
||||
orec = WMHashGet(notificationCenter->observerTable, observer);
|
||||
|
||||
while (orec) {
|
||||
tmp = orec->nextAction;
|
||||
if (orec->name == name && orec->object == object) {
|
||||
if (!name && !object) {
|
||||
if (notificationCenter->nilList == orec)
|
||||
notificationCenter->nilList = orec->next;
|
||||
} else if (!name) {
|
||||
rec = WMHashGet(notificationCenter->objectTable, orec->object);
|
||||
if (rec==orec) {
|
||||
assert(rec->prev==NULL);
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->objectTable, orec->object,
|
||||
orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->objectTable,
|
||||
orec->object);
|
||||
}
|
||||
if (!name && !object) {
|
||||
/* catch-all */
|
||||
oRec->next = notificationCenter->nilList;
|
||||
if (notificationCenter->nilList) {
|
||||
notificationCenter->nilList->prev = oRec;
|
||||
}
|
||||
} else {
|
||||
rec = WMHashGet(notificationCenter->nameTable, orec->name);
|
||||
if (rec==orec) {
|
||||
assert(rec->prev==NULL);
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->nameTable, orec->name,
|
||||
orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->nameTable, orec->name);
|
||||
}
|
||||
notificationCenter->nilList = oRec;
|
||||
} else if (!name) {
|
||||
/* any message coming from object */
|
||||
rec = (NotificationObserver *) WMHashInsert(notificationCenter->objectTable, object, oRec);
|
||||
oRec->next = rec;
|
||||
if (rec) {
|
||||
rec->prev = oRec;
|
||||
}
|
||||
}
|
||||
|
||||
/* update the action list for the observer */
|
||||
rec = WMHashGet(notificationCenter->observerTable, observer);
|
||||
|
||||
if (rec == orec) {
|
||||
if (orec->nextAction) {
|
||||
WMHashInsert(notificationCenter->nameTable, observer,
|
||||
orec->nextAction);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->nameTable, observer);
|
||||
} else {
|
||||
/* name && (object || !object) */
|
||||
rec = (NotificationObserver *) WMHashInsert(notificationCenter->nameTable, name, oRec);
|
||||
oRec->next = rec;
|
||||
if (rec) {
|
||||
rec->prev = oRec;
|
||||
}
|
||||
}
|
||||
|
||||
if (orec->prev)
|
||||
orec->prev->next = orec->next;
|
||||
if (orec->next)
|
||||
orec->next->prev = orec->prev;
|
||||
free(orec);
|
||||
}
|
||||
orec = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMPostNotificationName(char *name, void *object, void *clientData)
|
||||
void WMPostNotification(WMNotification * notification)
|
||||
{
|
||||
WMNotification *notification;
|
||||
NotificationObserver *orec, *tmp;
|
||||
|
||||
notification = WMCreateNotification(name, object, clientData);
|
||||
|
||||
WMPostNotification(notification);
|
||||
WMRetainNotification(notification);
|
||||
|
||||
WMReleaseNotification(notification);
|
||||
/* tell the observers that want to know about a particular message */
|
||||
orec = (NotificationObserver *) WMHashGet(notificationCenter->nameTable, notification->name);
|
||||
|
||||
while (orec) {
|
||||
tmp = orec->next;
|
||||
|
||||
if (!orec->object || !notification->object || orec->object == notification->object) {
|
||||
/* tell the observer */
|
||||
if (orec->observerAction) {
|
||||
(*orec->observerAction) (orec->observer, notification);
|
||||
}
|
||||
}
|
||||
|
||||
orec = tmp;
|
||||
}
|
||||
|
||||
/* tell the observers that want to know about an object */
|
||||
orec = (NotificationObserver *) WMHashGet(notificationCenter->objectTable, notification->object);
|
||||
|
||||
while (orec) {
|
||||
tmp = orec->next;
|
||||
|
||||
/* tell the observer */
|
||||
if (orec->observerAction) {
|
||||
(*orec->observerAction) (orec->observer, notification);
|
||||
}
|
||||
orec = tmp;
|
||||
}
|
||||
|
||||
/* tell the catch all observers */
|
||||
orec = notificationCenter->nilList;
|
||||
while (orec) {
|
||||
tmp = orec->next;
|
||||
|
||||
/* tell the observer */
|
||||
if (orec->observerAction) {
|
||||
(*orec->observerAction) (orec->observer, notification);
|
||||
}
|
||||
orec = tmp;
|
||||
}
|
||||
|
||||
WMReleaseNotification(notification);
|
||||
}
|
||||
|
||||
void WMRemoveNotificationObserver(void *observer)
|
||||
{
|
||||
NotificationObserver *orec, *tmp, *rec;
|
||||
|
||||
/* get the list of actions the observer is doing */
|
||||
orec = (NotificationObserver *) WMHashGet(notificationCenter->observerTable, observer);
|
||||
|
||||
/*
|
||||
* FOREACH orec IN actionlist for observer
|
||||
* DO
|
||||
* remove from respective lists/tables
|
||||
* free
|
||||
* END
|
||||
*/
|
||||
while (orec) {
|
||||
tmp = orec->nextAction;
|
||||
|
||||
if (!orec->name && !orec->object) {
|
||||
/* catch-all */
|
||||
if (notificationCenter->nilList == orec)
|
||||
notificationCenter->nilList = orec->next;
|
||||
} else if (!orec->name) {
|
||||
/* any message coming from object */
|
||||
rec = (NotificationObserver *) WMHashGet(notificationCenter->objectTable, orec->object);
|
||||
if (rec == orec) {
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->objectTable, orec->object, orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->objectTable, orec->object);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* name && (object || !object) */
|
||||
rec = (NotificationObserver *) WMHashGet(notificationCenter->nameTable, orec->name);
|
||||
if (rec == orec) {
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->nameTable, orec->name, orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->nameTable, orec->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (orec->prev)
|
||||
orec->prev->next = orec->next;
|
||||
if (orec->next)
|
||||
orec->next->prev = orec->prev;
|
||||
|
||||
wfree(orec);
|
||||
|
||||
orec = tmp;
|
||||
}
|
||||
|
||||
WMHashRemove(notificationCenter->observerTable, observer);
|
||||
}
|
||||
|
||||
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 = (NotificationObserver *) WMHashGet(notificationCenter->observerTable, observer);
|
||||
|
||||
WMHashRemove(notificationCenter->observerTable, observer);
|
||||
|
||||
/* rebuild the list of actions for the observer */
|
||||
|
||||
while (orec) {
|
||||
tmp = orec->nextAction;
|
||||
if (orec->name == name && orec->object == object) {
|
||||
if (!name && !object) {
|
||||
if (notificationCenter->nilList == orec)
|
||||
notificationCenter->nilList = orec->next;
|
||||
} else if (!name) {
|
||||
rec =
|
||||
(NotificationObserver *) WMHashGet(notificationCenter->objectTable,
|
||||
orec->object);
|
||||
if (rec == orec) {
|
||||
assert(rec->prev == NULL);
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->objectTable,
|
||||
orec->object, orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->objectTable, orec->object);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
rec = (NotificationObserver *) WMHashGet(notificationCenter->nameTable,
|
||||
orec->name);
|
||||
if (rec == orec) {
|
||||
assert(rec->prev == NULL);
|
||||
/* replace table entry */
|
||||
if (orec->next) {
|
||||
WMHashInsert(notificationCenter->nameTable,
|
||||
orec->name, orec->next);
|
||||
} else {
|
||||
WMHashRemove(notificationCenter->nameTable, orec->name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (orec->prev)
|
||||
orec->prev->next = orec->next;
|
||||
if (orec->next)
|
||||
orec->next->prev = orec->prev;
|
||||
wfree(orec);
|
||||
} else {
|
||||
/* append this action in the new action list */
|
||||
orec->nextAction = NULL;
|
||||
if (!newList) {
|
||||
newList = orec;
|
||||
} else {
|
||||
NotificationObserver *p;
|
||||
|
||||
p = newList;
|
||||
while (p->nextAction) {
|
||||
p = p->nextAction;
|
||||
}
|
||||
p->nextAction = orec;
|
||||
}
|
||||
}
|
||||
orec = tmp;
|
||||
}
|
||||
|
||||
/* reinsert the list to the table */
|
||||
if (newList) {
|
||||
WMHashInsert(notificationCenter->observerTable, observer, newList);
|
||||
}
|
||||
}
|
||||
|
||||
void WMPostNotificationName(const char *name, void *object, void *clientData)
|
||||
{
|
||||
WMNotification *notification;
|
||||
|
||||
notification = WMCreateNotification(name, object, clientData);
|
||||
|
||||
WMPostNotification(notification);
|
||||
|
||||
WMReleaseNotification(notification);
|
||||
}
|
||||
|
||||
/**************** Notification Queues ****************/
|
||||
|
||||
|
||||
typedef struct W_NotificationQueue {
|
||||
NotificationCenter *center;
|
||||
void *asapQueue;
|
||||
void *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)
|
||||
{
|
||||
return notificationQueue;
|
||||
if (!notificationQueue)
|
||||
notificationQueue = WMCreateNotificationQueue();
|
||||
|
||||
return notificationQueue;
|
||||
}
|
||||
|
||||
|
||||
WMNotificationQueue*
|
||||
WMCreateNotificationQueue(void)
|
||||
WMNotificationQueue *WMCreateNotificationQueue(void)
|
||||
{
|
||||
return NULL;
|
||||
NotificationQueue *queue;
|
||||
|
||||
queue = wmalloc(sizeof(NotificationQueue));
|
||||
|
||||
queue->asapQueue = WMCreateArrayWithDestructor(8, (WMFreeDataProc *) WMReleaseNotification);
|
||||
queue->idleQueue = WMCreateArrayWithDestructor(8, (WMFreeDataProc *) WMReleaseNotification);
|
||||
queue->next = notificationQueueList;
|
||||
|
||||
notificationQueueList = queue;
|
||||
|
||||
return queue;
|
||||
}
|
||||
|
||||
void WMEnqueueNotification(WMNotificationQueue * queue, WMNotification * notification, WMPostingStyle postingStyle)
|
||||
{
|
||||
WMEnqueueCoalesceNotification(queue, notification, postingStyle, WNCOnName | WNCOnSender);
|
||||
}
|
||||
|
||||
#define NOTIF ((WMNotification*)cdata)
|
||||
#define ITEM ((WMNotification*)item)
|
||||
|
||||
static int matchSenderAndName(void *item, void *cdata)
|
||||
{
|
||||
return (NOTIF->object == ITEM->object && strcmp(NOTIF->name, ITEM->name) == 0);
|
||||
}
|
||||
|
||||
static int matchSender(void *item, void *cdata)
|
||||
{
|
||||
return (NOTIF->object == ITEM->object);
|
||||
}
|
||||
|
||||
static int matchName(void *item, 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
|
||||
WMDequeueNotificationMatching(WMNotificationQueue *queue, unsigned mask)
|
||||
WMEnqueueCoalesceNotification(WMNotificationQueue * queue,
|
||||
WMNotification * notification, WMPostingStyle postingStyle, unsigned coalesceMask)
|
||||
{
|
||||
if (coalesceMask != WNCNone)
|
||||
WMDequeueNotificationMatching(queue, notification, coalesceMask);
|
||||
|
||||
switch (postingStyle) {
|
||||
case WMPostNow:
|
||||
WMPostNotification(notification);
|
||||
WMReleaseNotification(notification);
|
||||
break;
|
||||
|
||||
case WMPostASAP:
|
||||
WMAddToArray(queue->asapQueue, notification);
|
||||
break;
|
||||
|
||||
case WMPostWhenIdle:
|
||||
WMAddToArray(queue->idleQueue, notification);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMEnqueueNotification(WMNotificationQueue *queue, WMNotification *notification,
|
||||
WMPostingStyle postingStyle)
|
||||
void W_FlushASAPNotificationQueue()
|
||||
{
|
||||
WMNotificationQueue *queue = notificationQueueList;
|
||||
|
||||
while (queue) {
|
||||
while (WMGetArrayItemCount(queue->asapQueue)) {
|
||||
WMPostNotification(WMGetFromArray(queue->asapQueue, 0));
|
||||
WMDeleteFromArray(queue->asapQueue, 0);
|
||||
}
|
||||
|
||||
queue = queue->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
WMEnqueueCoalesceNotification(WMNotificationQueue *queue,
|
||||
WMNotification *notification,
|
||||
WMPostingStyle postingStyle,
|
||||
unsigned coalesceMask)
|
||||
void W_FlushIdleNotificationQueue()
|
||||
{
|
||||
WMNotificationQueue *queue = notificationQueueList;
|
||||
|
||||
while (queue) {
|
||||
while (WMGetArrayItemCount(queue->idleQueue)) {
|
||||
WMPostNotification(WMGetFromArray(queue->idleQueue, 0));
|
||||
WMDeleteFromArray(queue->idleQueue, 0);
|
||||
}
|
||||
|
||||
queue = queue->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user