Compare commits
797 Commits
3.22.22
...
test-revealer
| Author | SHA1 | Date | |
|---|---|---|---|
| 4c64df1245 | |||
| e0807fcf54 | |||
| 8fd5b567dc | |||
| a6de3ed7b4 | |||
| 3658b8f709 | |||
| c0b03564f5 | |||
| 8535610b19 | |||
| 0e7228b267 | |||
| 5b527d6910 | |||
| eb3fd5e941 | |||
| ca192a87c2 | |||
| fa77925da2 | |||
| 172dc3e79a | |||
| cb39169ba7 | |||
| 577dfb9e2f | |||
| db7f085315 | |||
| de18859249 | |||
| 5fb999010c | |||
| 2c3a7c63ef | |||
| 078870f604 | |||
| c52d9cfc14 | |||
| e37e1dfcb0 | |||
| 2e5307daea | |||
| cb4ea3fc65 | |||
| 56033a8d27 | |||
| f7f3939b04 | |||
| 13a36e81dc | |||
| affb4ff5f4 | |||
| ee22277f18 | |||
| cc73241c7b | |||
| ac358d2507 | |||
| 9ee60777e7 | |||
| effdf3af74 | |||
| a8463953a4 | |||
| 7793aab5f0 | |||
| ecf9fa65b8 | |||
| a32933b056 | |||
| e0f3e8a7e5 | |||
| 1f9de707f7 | |||
| 8b2c3a8c1a | |||
| e7af3410cf | |||
| 84d3bfb6fd | |||
| 448551f31c | |||
| 7b8c036f8f | |||
| 747be0f499 | |||
| 9008f7702d | |||
| df0454236c | |||
| 8373b906d4 | |||
| 4b4ae4464c | |||
| 0bca6969d4 | |||
| 660087db42 | |||
| 927004178f | |||
| 1b8de2d5fa | |||
| 483d25f418 | |||
| 1d30ada735 | |||
| 8a00551871 | |||
| 0ed3a77d29 | |||
| 29b61176bb | |||
| 174c4fa7ee | |||
| 08adcb6318 | |||
| 504eb89155 | |||
| b75b5e900a | |||
| ca4ec52c54 | |||
| 908d4f1d1f | |||
| 62573f299c | |||
| c0bf48c8ab | |||
| 26f35fb941 | |||
| d49335c59a | |||
| f62c92783a | |||
| f3f4d40b89 | |||
| b0bfe606aa | |||
| 32ae97f13a | |||
| 3354d91090 | |||
| b6db96cd1a | |||
| b2ea707614 | |||
| af66faf604 | |||
| 5afc01d995 | |||
| f353ba3acb | |||
| eebf151f2a | |||
| e8d3899461 | |||
| e7bb83988f | |||
| b9b62fca0c | |||
| 03c1c604dd | |||
| 504574b6be | |||
| efb934c07f | |||
| 69adcc46c9 | |||
| 593edacb48 | |||
| f05865ad3a | |||
| e2efc165d1 | |||
| 0997ffbc5b | |||
| 9156908a3a | |||
| 934b40f4f3 | |||
| 7dbd3da2dd | |||
| 848a524d95 | |||
| 7f91af2516 | |||
| 3f48bba79b | |||
| b1997c96ea | |||
| 4c61ff2a3a | |||
| 0a37b564d4 | |||
| 5265514c66 | |||
| 3ebcc5a7d5 | |||
| 380ec086eb | |||
| 004b24a818 | |||
| 70d035ae95 | |||
| 055c1b2faa | |||
| 01d1bc3c75 | |||
| defbbb95e9 | |||
| aa76abbbeb | |||
| a0b0cbe98d | |||
| f23bfc6b69 | |||
| 61f37b2b0d | |||
| c0ba041c73 | |||
| 2c8b95a518 | |||
| f62ee9f74a | |||
| a7eb696314 | |||
| f7cee65268 | |||
| 81878617c7 | |||
| 5591076361 | |||
| 37ec227dc1 | |||
| c3737ca316 | |||
| a1ef678ee7 | |||
| 3200c0390d | |||
| 7e0b9704ed | |||
| daecee75b4 | |||
| 700d167b9e | |||
| f6a0dfeb4d | |||
| 8500b1209a | |||
| 018be97e30 | |||
| 9b3c745fc4 | |||
| 91748d1aa3 | |||
| c7168f48d5 | |||
| 51aa16346e | |||
| dfe04d0c9a | |||
| 71acf23697 | |||
| 19b9659cce | |||
| 83159ffabf | |||
| d4feb8929e | |||
| 7951f0e9a9 | |||
| 1f37cbfbfd | |||
| f595791492 | |||
| 09e3529d0e | |||
| 65bb238a3f | |||
| 7e9ae85dd4 | |||
| d0f7364260 | |||
| a628e03042 | |||
| f1d9ccd6c7 | |||
| d6a29e1b8c | |||
| 1918fefbd4 | |||
| cbc8d39887 | |||
| 866050d015 | |||
| 9ac7f906aa | |||
| e0206cafcd | |||
| 7e0db63601 | |||
| a73fa04e92 | |||
| 929a19ca89 | |||
| 83c53369a1 | |||
| f040918ffa | |||
| f888b4958e | |||
| 38b796d2c3 | |||
| 8a9d78ccc5 | |||
| eac2f9b622 | |||
| bd82962e21 | |||
| 6ff7fdfdc4 | |||
| 2d12660916 | |||
| cc4dd0d343 | |||
| c8b0a0dea5 | |||
| 3bb6670f9c | |||
| d354000680 | |||
| a7cd20823d | |||
| abcc477317 | |||
| 6b30de9487 | |||
| f3fa34e850 | |||
| 4c39e06f45 | |||
| 87f454ebd3 | |||
| f30ecaa22f | |||
| 6271326718 | |||
| d60cd1f49f | |||
| b57e10ad60 | |||
| cc35a35752 | |||
| 90c9a4ba05 | |||
| 2f58c7c060 | |||
| 08f31f8f4a | |||
| f2868f5cf3 | |||
| 0caa3dbccf | |||
| d219596212 | |||
| 26b6071db8 | |||
| 7886c645c4 | |||
| a8363a9887 | |||
| 87aed887be | |||
| 0dde06124e | |||
| 1d02739992 | |||
| a8262c7581 | |||
| 1517acee55 | |||
| 7b3129ad4f | |||
| 95e6a0650b | |||
| 7edd465f6d | |||
| cd5502ddf4 | |||
| 828f634d5c | |||
| 85fa6ba631 | |||
| 893fc1dec4 | |||
| 96774e8b5c | |||
| f443dbe8c1 | |||
| 133e8fc03f | |||
| 2ce63a86ba | |||
| 609cb85f3a | |||
| cb56bbe430 | |||
| 8fc72c902d | |||
| a9f0704ae1 | |||
| 33bec5a4fb | |||
| 279d7bb2f5 | |||
| c926b28d96 | |||
| ff47cb0c51 | |||
| b9bb63b1ab | |||
| 9ca3bacddf | |||
| f5482e6954 | |||
| fff08fa319 | |||
| d20101e878 | |||
| af350b20b1 | |||
| 8535e2e417 | |||
| 88b08c05c0 | |||
| dad773b129 | |||
| 07124b5e99 | |||
| ba883b55ee | |||
| d35ecbb5a4 | |||
| a3cb26cad7 | |||
| 1ee80fa4c6 | |||
| db85e888c7 | |||
| 2ba118c961 | |||
| 476d3ea170 | |||
| 8cdee69a82 | |||
| 2c2ea83333 | |||
| c2672b4f05 | |||
| 2d02854685 | |||
| 9ae6d09234 | |||
| 21fddc3994 | |||
| ecc612b1a2 | |||
| 1945c7a1a8 | |||
| 2ee5aee4a9 | |||
| cfbbcf5fc4 | |||
| 7ff9222600 | |||
| 9b011081c5 | |||
| 0c46d94ec3 | |||
| a7a4a459ea | |||
| 30405ee68c | |||
| b5cc0d8fcd | |||
| a53bdcd222 | |||
| 1d1405edd8 | |||
| 8e24626c49 | |||
| bcc539ca07 | |||
| 60b4a3869a | |||
| 7f846ce7d8 | |||
| 2e21a2256e | |||
| bbcfc261e0 | |||
| 4ccbe10571 | |||
| b48fbcbb7c | |||
| c2da6fc299 | |||
| 2ba6dcbce5 | |||
| b19c524a83 | |||
| 16a6c39a9b | |||
| 8da5111edd | |||
| 2e7ac262be | |||
| cb71d083ab | |||
| b47bdda271 | |||
| 9e926f9a28 | |||
| 5a0759bc1b | |||
| d92df4ff2c | |||
| 22fd5b5766 | |||
| b685eb1779 | |||
| 5ee381a596 | |||
| 59136773b8 | |||
| 7a75b89efe | |||
| b2caaaa3f9 | |||
| b7e5a2dd10 | |||
| e52aa73b36 | |||
| 2d415d9354 | |||
| e6e306ae8e | |||
| 79d8c9dff0 | |||
| ba307aa35e | |||
| fa520c5769 | |||
| e193cd1cf1 | |||
| 1bf354aec8 | |||
| 31cb0fee9c | |||
| b0b2992165 | |||
| 48e40762c7 | |||
| fa6994d033 | |||
| 209f908a03 | |||
| 8e74e515c7 | |||
| 46dac1aba4 | |||
| 4b95d74068 | |||
| 34bcc71f4e | |||
| 7751001ff1 | |||
| e42d8598ca | |||
| 7a11fcf054 | |||
| 154fa9817d | |||
| 6e8cc589f2 | |||
| 56d44fd10c | |||
| 0102e0f914 | |||
| f12b44d697 | |||
| b5e959b6ff | |||
| 314531640f | |||
| a0f273465e | |||
| 3dbeab2b4a | |||
| f38d8f8c1b | |||
| a36c564b54 | |||
| 323d86b6e4 | |||
| 3a7fbb3b30 | |||
| a09df57a5f | |||
| b0f8426c29 | |||
| dbaaa701ad | |||
| ef3fe9ead3 | |||
| 6551ddd8e0 | |||
| 332d41792d | |||
| 240cb0bb5a | |||
| 5c8bb51a58 | |||
| 68fce76faf | |||
| b88bffac23 | |||
| 4f78abddfc | |||
| 6e2d14037c | |||
| 9781ffae51 | |||
| d65a4c2e0a | |||
| 92bef46b4c | |||
| f4bb394d60 | |||
| e0befe02fa | |||
| 3e68abddbc | |||
| 84ff404a17 | |||
| 9604eb5c53 | |||
| 9c8e53b968 | |||
| eb01ba8573 | |||
| 7fd9f2d31e | |||
| 3bd7b379c8 | |||
| 0454a1cace | |||
| a46bc8b5a3 | |||
| 5d27915aa4 | |||
| cac2845bd6 | |||
| 3ee7604d6e | |||
| 0fa391cc24 | |||
| 0a0323813e | |||
| fcfabb2fd3 | |||
| bb16f1a0ff | |||
| c179d5eb6e | |||
| ba83a2c46b | |||
| fc9a71abae | |||
| 600003e83f | |||
| b485cf91b5 | |||
| 577f1a992e | |||
| a2efd3f3dc | |||
| 98afaed718 | |||
| 491e696226 | |||
| 9f6deab88c | |||
| 0f3396d742 | |||
| 9d8fadee97 | |||
| 0e01668683 | |||
| bcd920c288 | |||
| 6c4261338a | |||
| a2f81d83bb | |||
| cbb22b2916 | |||
| 41f6c469e3 | |||
| e4e2b7687d | |||
| f08eeecae6 | |||
| f7a47a632c | |||
| 1122508e1c | |||
| 6b4d95e86d | |||
| e9d84e2653 | |||
| 45aa018839 | |||
| f0bea1ab1d | |||
| 04ff9b58f1 | |||
| 72ed0c9539 | |||
| 4e2f59ad23 | |||
| cc967849f7 | |||
| add3592809 | |||
| b202c44fd8 | |||
| 8c09b3994a | |||
| b9b2f7711b | |||
| d465d790f0 | |||
| 46828f8e0a | |||
| 23b91856e1 | |||
| e36b629c36 | |||
| fa47667df9 | |||
| bb498ba554 | |||
| 5fc27126f5 | |||
| cccb66afb4 | |||
| 5d258bf314 | |||
| 464888a2da | |||
| 91498c7db3 | |||
| 119d8f996f | |||
| 81c4fa5d50 | |||
| 5ca21f6dbb | |||
| 7a15bf56a0 | |||
| 3000384b90 | |||
| fd71badf16 | |||
| ead2c3f38f | |||
| 3059df0d4d | |||
| f0d5b9561b | |||
| b13362b369 | |||
| b68256f7a1 | |||
| 342aee304a | |||
| abc171c93a | |||
| 5c0d242ea3 | |||
| d76c7c82fc | |||
| 5d3ccfe21e | |||
| 44e7df2a14 | |||
| 9f84e9a2c5 | |||
| 9112ca7f88 | |||
| 4c43e8468a | |||
| d41dfcab35 | |||
| 80458ff586 | |||
| 4fe6cba27a | |||
| 5b328804ec | |||
| f3f75f62e8 | |||
| 68eb897900 | |||
| 5cd21e5579 | |||
| bc3a939f90 | |||
| 2246a1e3c9 | |||
| af9f458bc9 | |||
| e3fb265b90 | |||
| 57f6f8307d | |||
| ab628e365d | |||
| 4107e670d0 | |||
| 57a4558691 | |||
| 796245ca30 | |||
| 146b1e0d42 | |||
| c96be5a00b | |||
| 92711d7f79 | |||
| 8f82b06676 | |||
| 2946ca859c | |||
| 49e3c10575 | |||
| 8e540f2f62 | |||
| 5aa939dc93 | |||
| bd13a5a5ce | |||
| d2a4febfa7 | |||
| 688426f57f | |||
| 9bf8449a2e | |||
| b6343a1f4d | |||
| c830834170 | |||
| 2760b020a8 | |||
| ff40208857 | |||
| c60ea284c5 | |||
| 238239c00d | |||
| fb79115314 | |||
| 8cc04e8337 | |||
| 9f142161e4 | |||
| 463ee95136 | |||
| e8bffe0c56 | |||
| 3146f29d3a | |||
| c6901a8b95 | |||
| 3274f3a6cc | |||
| f82a6421f4 | |||
| 97f3a4397a | |||
| 7ea53087ca | |||
| af2d039717 | |||
| af8b247b45 | |||
| cbf118c285 | |||
| 4b1c02560f | |||
| 8dc234717e | |||
| 79995748e0 | |||
| 12913d1a35 | |||
| ade22d00f2 | |||
| c03ce68c38 | |||
| 4e5ef1a377 | |||
| 81c0e7af0e | |||
| 3067fb8c24 | |||
| 382d6c1bcb | |||
| 299a91bd46 | |||
| 9c6ae95ece | |||
| 855e4cb88e | |||
| c229716796 | |||
| 80e5f28ca0 | |||
| 2de14479b2 | |||
| d219bd4d5a | |||
| 255e2dd704 | |||
| 10d2e44ae2 | |||
| 25afe278e3 | |||
| 4f962c6dbf | |||
| 6e4c6ce6c3 | |||
| 7130656d37 | |||
| 5c85f2cccc | |||
| 0e5964ce27 | |||
| ff43627167 | |||
| 6c36eaea98 | |||
| cacd8e6254 | |||
| 08f60dbcf6 | |||
| 63f534f4b3 | |||
| 6ff326a82f | |||
| 8af082f3c7 | |||
| 07324131b3 | |||
| 67274f7d9d | |||
| 9b69fe7a7e | |||
| c94993e29b | |||
| 60750b3ffd | |||
| 136b88534c | |||
| 4c8f7c4aca | |||
| 0cbf45a663 | |||
| b8e2430486 | |||
| 814c55d473 | |||
| beed1f660e | |||
| e6be9a2a4d | |||
| 51220e3a31 | |||
| 5ab5a5166e | |||
| 5b19d6b1b8 | |||
| ef72f3cbce | |||
| 5f675181ce | |||
| e10f616065 | |||
| 6b85162f43 | |||
| 53bc2566b3 | |||
| e1aeb73a62 | |||
| bb844e44b6 | |||
| 9e3b814580 | |||
| bcd3c42b92 | |||
| b5e4a9d716 | |||
| fe220402cb | |||
| e75d91e7b1 | |||
| b68e55ecce | |||
| 2a8e1745cf | |||
| 8ed4b48b4c | |||
| d96a7c9e87 | |||
| 856486fea8 | |||
| a9499dbe48 | |||
| 081488f8f2 | |||
| 7de01b31ef | |||
| d15fbee353 | |||
| fda98ba562 | |||
| c006c2fdbc | |||
| 6e197ffac9 | |||
| e00de3814e | |||
| a443b525c3 | |||
| 456ca1062b | |||
| e5240de5bc | |||
| a65ae5fb40 | |||
| af1d5362ab | |||
| 9cf48ec3f8 | |||
| 6f26d0dc0c | |||
| 43433f3ccd | |||
| 01c349995c | |||
| cb935d947c | |||
| 31f7b55306 | |||
| 1e7982212f | |||
| 9b2e487a7f | |||
| 4a371de393 | |||
| 084db132e9 | |||
| 489d0db6d1 | |||
| 352f678ac1 | |||
| ce79fac68d | |||
| ceec7e9cb8 | |||
| 46b38c00ad | |||
| ad536f333b | |||
| bdb3a4d505 | |||
| 7dfb99c2ca | |||
| 53eb42338a | |||
| b4b9aa1e5f | |||
| 5fef3ff971 | |||
| 308796628a | |||
| bd9ed01839 | |||
| 176c1046cb | |||
| 6fa63bd92c | |||
| 87e1615610 | |||
| ed0600e8c0 | |||
| 0e338d31a4 | |||
| 4d18a346c1 | |||
| 09c94c27e1 | |||
| 5f022cbc12 | |||
| a41e0ce4a4 | |||
| b49502c167 | |||
| 0eaa76a032 | |||
| 32332b3a03 | |||
| f44af2e6ae | |||
| 7d23b33ac5 | |||
| 11bfce3f36 | |||
| e834a2b089 | |||
| 7e253f4bd3 | |||
| c9a54ba1c2 | |||
| 4e0adbc8dc | |||
| d69f998c26 | |||
| 05e4e7fe87 | |||
| c4ff07025b | |||
| 75768a4d00 | |||
| 492469a94a | |||
| ecc9946566 | |||
| 25dc32c1a1 | |||
| dee5142c91 | |||
| 279b81d202 | |||
| 86dd1e37a7 | |||
| 6d0b0cb99b | |||
| 4c2f3e3105 | |||
| 3c40b217b9 | |||
| e7e047fc3f | |||
| 8df7f88b66 | |||
| c329940cf1 | |||
| 3fd23fcfd1 | |||
| 56074fbf3c | |||
| 6ab1ab9f46 | |||
| 706c80be51 | |||
| 7d18f2fd3c | |||
| 8af29e3756 | |||
| beb2caacb9 | |||
| 91ef88f77f | |||
| 9ce824d360 | |||
| 8397f22762 | |||
| 2b6f3f7867 | |||
| b0fb67eabc | |||
| 03f2eaf23a | |||
| f95cecba2d | |||
| f3328330b6 | |||
| 3a1a7135a2 | |||
| c6c13bd66b | |||
| 934ac3f6ef | |||
| 7b6efc29cc | |||
| 0ee453a45b | |||
| 8caba9536c | |||
| 41026987be | |||
| 022cf4252f | |||
| 2cc7a9c034 | |||
| 87103b9a14 | |||
| 87673af98c | |||
| 30ddb3e1a4 | |||
| 2c9072314a | |||
| f922aee5e2 | |||
| bd56e0d918 | |||
| 42c3b91fa7 | |||
| c490ac4ed8 | |||
| f1b812731d | |||
| 260a6aaa71 | |||
| 55e8736613 | |||
| d3eacaf840 | |||
| 6b126a70e2 | |||
| f301b7874e | |||
| 19670f9fe6 | |||
| 65457e6d12 | |||
| f8cb3fc3a8 | |||
| 38e68815c6 | |||
| 4de0e4b1ed | |||
| 29d2a45641 | |||
| 29a590014d | |||
| 6675451cea | |||
| 47435d0e6b | |||
| 2157b69f1f | |||
| 4ffdf917bb | |||
| e3f84e9bf4 | |||
| 20c2d6c992 | |||
| 4c44ffda17 | |||
| 7e49a02acf | |||
| e672c02441 | |||
| b654130bd7 | |||
| d46c072c4d | |||
| 15acb4c340 | |||
| efaa6524ac | |||
| b2877605cf | |||
| a4e1d01649 | |||
| e09c103187 | |||
| 5835cb2bc2 | |||
| 77a4e2ec37 | |||
| 4ac7db34f7 | |||
| 8e84eff355 | |||
| d42559bf2f | |||
| 4bc58f03b6 | |||
| 0ba60b7703 | |||
| 5a86b78493 | |||
| 01b29a16ff | |||
| ab4cc2540b | |||
| 4c5279c956 | |||
| a12ae1411a | |||
| e57891fd6b | |||
| bb1e8e47f5 | |||
| 14cda4839a | |||
| f7f4ecf006 | |||
| 7f6365cf9f | |||
| d38a148f0e | |||
| 46459f66f9 | |||
| 40302a5268 | |||
| a03a3c3af9 | |||
| 55210ae464 | |||
| f3408d89d5 | |||
| a0327e521e | |||
| 58c0418418 | |||
| 2b509a34d4 | |||
| 5b8a3bac70 | |||
| c255ba68fc | |||
| 72a45366e2 | |||
| 6c39e2f2f1 | |||
| 74720117c9 | |||
| 81d1aaa062 | |||
| 3509918e39 | |||
| 268d150d0f | |||
| 8ef20c0e2f | |||
| 72045a1a2d | |||
| 8ad40a49ee | |||
| 465ef50554 | |||
| f2adaba237 | |||
| 30e7215406 | |||
| 5ad9ecaff0 | |||
| 5ee34ec72a | |||
| fc741adbbb | |||
| 1c3aff5101 | |||
| 9c1a0b80ae | |||
| d6e011afa6 | |||
| 26ff667901 | |||
| 9b874a40ac | |||
| 29c4d0a3ee | |||
| 45198d2312 | |||
| 6a4be7f56b | |||
| 8aa6d59b7a | |||
| ebb67175e2 | |||
| 6018f9098e | |||
| a2d78a2de7 | |||
| 8db9776875 | |||
| 9106436003 | |||
| 2575a500be | |||
| 841b879aed | |||
| 7fe07ea906 | |||
| 81b7f76cb8 | |||
| 567ef528e5 | |||
| c4b75b0fff | |||
| 1c38646122 | |||
| 8281c57d28 | |||
| 491eea5680 | |||
| b1cb34cbbb | |||
| 694686d2ed | |||
| 5b2cae6703 | |||
| ca4efb0080 | |||
| 7525a11a30 | |||
| 8169d6703a | |||
| 413d548edd | |||
| a54550db7b | |||
| b0fe89d85f | |||
| 3973da4c65 | |||
| 7961e61c3b | |||
| 112a61a782 | |||
| b21bb316bd | |||
| ff6b31da23 | |||
| 8439f06500 | |||
| f50f3e2a90 | |||
| e06bce7631 | |||
| de03dc969e | |||
| c832ee7092 | |||
| e0e57191f2 | |||
| 030eb106df | |||
| 7f120279de | |||
| 38892b6341 | |||
| b6829dea0f | |||
| 52e3c095bf | |||
| f29007c177 | |||
| cbe009fe90 | |||
| 0f805d1bd9 | |||
| 8dfce0eacb | |||
| 233f49ddcb | |||
| 4515c72706 | |||
| 30effaf7fc | |||
| 26046c2afd | |||
| c0c23f7d44 | |||
| 08187aeec5 | |||
| 7997a722a1 | |||
| 13c6310688 | |||
| b45aa63b75 | |||
| b94bfb1678 | |||
| b3f4da0439 | |||
| 183c23d710 | |||
| fa04eb26d7 | |||
| 61137ae163 | |||
| 7fc09f18a3 | |||
| 6c3d17b867 | |||
| 3a0ea4e0d2 | |||
| d9df5dfa74 | |||
| 8abdbfee16 | |||
| acab79040a | |||
| 070af44fc7 | |||
| 18b8b2b8e8 | |||
| ee5b762246 | |||
| 34cd1e3e5e | |||
| b0e18d676e | |||
| 512a33fee1 | |||
| 367ff368f2 | |||
| a8df958c07 | |||
| 6c5b284615 | |||
| b92234be08 | |||
| a20ff44b09 | |||
| 628ff776d1 | |||
| 73155e3988 | |||
| 7ab6dd64de | |||
| 77401118c2 | |||
| e72d54c8a7 | |||
| 899cfb3c50 | |||
| 223a709403 | |||
| b9989e554b | |||
| fa4d814462 | |||
| 3783934436 | |||
| 4163a53630 | |||
| 7559eaf5f9 | |||
| a5c2472941 | |||
| c91a4f31f0 | |||
| b4371728de | |||
| 79bf5b8592 | |||
| c415bef5de | |||
| 3bae80dfc1 | |||
| d73c49ecef | |||
| f1a3bc2f2c | |||
| 66767adc63 | |||
| 93fc2a8edd | |||
| 1d80453e47 |
@@ -0,0 +1,18 @@
|
||||
image: registry.gitlab.gnome.org/gnome/gtk/gtk-3-24:v1
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
before_script:
|
||||
- mkdir -p _ccache
|
||||
- export CCACHE_BASEDIR=${PWD}
|
||||
- export CCACHE_DIR=${PWD}/_ccache
|
||||
|
||||
cache:
|
||||
paths:
|
||||
- _ccache/
|
||||
|
||||
build:
|
||||
stage: build
|
||||
script:
|
||||
- bash -x ./.gitlab-ci/test-docker.sh
|
||||
@@ -0,0 +1,60 @@
|
||||
FROM fedora:28
|
||||
|
||||
RUN dnf -y install \
|
||||
adwaita-icon-theme \
|
||||
atk-devel \
|
||||
at-spi2-atk-devel \
|
||||
avahi-gobject-devel \
|
||||
cairo-devel \
|
||||
cairo-gobject-devel \
|
||||
ccache \
|
||||
colord-devel \
|
||||
cups-devel \
|
||||
fribidi-devel \
|
||||
gcc \
|
||||
gcc-c++ \
|
||||
gdk-pixbuf2-devel \
|
||||
gdk-pixbuf2-modules \
|
||||
gettext \
|
||||
gettext-devel \
|
||||
git \
|
||||
glib2-devel \
|
||||
gobject-introspection-devel \
|
||||
graphene-devel \
|
||||
gtk-doc \
|
||||
hicolor-icon-theme \
|
||||
itstool \
|
||||
json-glib-devel \
|
||||
libepoxy-devel \
|
||||
libmount-devel \
|
||||
librsvg2 \
|
||||
libXcomposite-devel \
|
||||
libXcursor-devel \
|
||||
libXcursor-devel \
|
||||
libXdamage-devel \
|
||||
libXfixes-devel \
|
||||
libXi-devel \
|
||||
libXinerama-devel \
|
||||
libxkbcommon-devel \
|
||||
libXrandr-devel \
|
||||
libXrender-devel \
|
||||
make \
|
||||
mesa-libEGL-devel \
|
||||
mesa-libwayland-egl-devel \
|
||||
meson \
|
||||
pango-devel \
|
||||
redhat-rpm-config \
|
||||
vulkan-devel \
|
||||
wayland-devel \
|
||||
wayland-protocols-devel \
|
||||
xorg-x11-server-Xvfb
|
||||
|
||||
ARG HOST_USER_ID=5555
|
||||
ENV HOST_USER_ID ${HOST_USER_ID}
|
||||
RUN useradd -u $HOST_USER_ID -ms /bin/bash user
|
||||
|
||||
USER user
|
||||
WORKDIR /home/user
|
||||
|
||||
ENV LANG C.utf8
|
||||
ENV PATH="/usr/lib64/ccache:${PATH}"
|
||||
Executable
+19
@@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# This script builds an image from the Dockerfile, starts a container with
|
||||
# the parent directory mounted as working directory and start a bash session
|
||||
# there so you can test things.
|
||||
# Once you are happy you can push it to the docker hub:
|
||||
# sudo docker push "${TAG}"
|
||||
|
||||
set -e
|
||||
|
||||
TAG="registry.gitlab.gnome.org/gnome/gtk/gtk-3-24:v1"
|
||||
|
||||
# HOST_USER_ID gets used to create a user with the same ID so that files
|
||||
# created in the mounted volume have the same owner
|
||||
sudo docker build \
|
||||
--build-arg HOST_USER_ID="$UID" --tag "${TAG}" --file "Dockerfile" .
|
||||
sudo docker run --security-opt label=disable \
|
||||
--rm --volume "$(pwd)/..:/home/user/app" --workdir "/home/user/app" \
|
||||
--tty --interactive "${TAG}" bash
|
||||
Executable
+6
@@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
./autogen.sh
|
||||
make -j8
|
||||
@@ -1,3 +1,382 @@
|
||||
Overview of Changes in GTK+ 3.23.1
|
||||
==================================
|
||||
|
||||
* Backported event controllers from GTK+ 4:
|
||||
- GtkEventControllerScroll
|
||||
- GtkEventControllerMotion
|
||||
- GtkEventControllerKey
|
||||
- GtkGestureStylus
|
||||
|
||||
* Support markup in GtkModelButtons
|
||||
|
||||
* Themes
|
||||
- The Raleigh theme has been removed
|
||||
- Expander size in HighContrast has been increased
|
||||
|
||||
* Wayland
|
||||
- Update cursor scale when needed
|
||||
- Decoration negotiation protocol fixes
|
||||
|
||||
* Windows
|
||||
- Add an EGL renderer based on ANGLE
|
||||
|
||||
* Translation updates:
|
||||
- Brazilian Portuguese
|
||||
- German
|
||||
- Hungarian
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.23.0
|
||||
==================================
|
||||
|
||||
* Dependency bumps:
|
||||
- Require libepoxy 1.4
|
||||
- Require pango 1.41
|
||||
|
||||
* New font chooser features:
|
||||
- Allow setting OpenType font features
|
||||
- Show examples for OpenType font features
|
||||
- Allow selecting OpenType font variations
|
||||
- Support levels of details for selection
|
||||
|
||||
* New Emoji features:
|
||||
- Support a completion popup for Emoji
|
||||
- Drop Ctrl-Shift-e shortcut
|
||||
|
||||
* Other new apis:
|
||||
- gdk_window_move_to_rect
|
||||
|
||||
* Wayland:
|
||||
- Use anonymous shared memory on FreeBSD
|
||||
|
||||
* Bugs fixed:
|
||||
#85 widgetDragDestFindTarget introspection data does not show nullable...
|
||||
#154 Documentation: Lifecycle of Editables inside GtkCellRenderers is no...
|
||||
#193 Document that GtkUIManager is deprecated by GtkBuilder
|
||||
#199 MenuButton not notified when its Popover is destroyed, still access...
|
||||
#292 GtkRanges should send ::change-value even if not realized
|
||||
#450 Menu navigation triangle doesn't work anymore
|
||||
#792 Focus events are not always matched
|
||||
#898 emoji-chooser: search for flags doesn't work
|
||||
#997 gdk: Make gdk_window_move_to_rect public
|
||||
#1053 Scroll cursor gets left behind if a child widget steals the scroll
|
||||
#1059 -Wparentheses warnings in GTK+ headers when compiling C++ code with...
|
||||
#1065 GtkScrollbar horizontal mouse wheel scroll direction is wrong
|
||||
#1069 Thread 1 "glade" received signal SIGFPE, Arithmetic exception.
|
||||
#1088 CssGadget: Round px values up for min-width|height
|
||||
#1115 gtk icon theme searches system dirs before user dirs
|
||||
#1134 x11: Always set None pixmap for no background
|
||||
#1160 a11y/entry: Fix copy-pasteo re 2ndary icon tooltip
|
||||
#1165 InfoBar: Fix wrong type in copy-pasted param doc
|
||||
#1166 EmojiCompletion: Use Box:spacing instead of CSS
|
||||
!125 HC: Avoid same BG/FG colors in flat treeview entry
|
||||
!157 wayland: Implement 'gtk-fontconfig-timestamp' & 'gtk-modules'
|
||||
!181 W32: Don't forget to check VK_MENU and set MK_ALT
|
||||
!206 searchenginetracker: Don't leak the hits' GFiles
|
||||
407242 GtkScale: Up/Down keys decrease/increase value, which is opposite...
|
||||
686109 gtk_print_context_get_hard_margins should return page size specif...
|
||||
765327 GtkPlug scaled to half the expected size on HiDPI screens
|
||||
772817 File Chooser: Path arrow button frames are reversed and detached ...
|
||||
773299 gtk/language-names.c: Fix build on non-GCC/CLang
|
||||
775279 early calls to libepoxy cause all gtk3 programs to abort when the...
|
||||
786524 ocument GTK_OVERLAY_SCROLLING environment variable
|
||||
787867 OSX macports pango text size appears to vary between version 1.40...
|
||||
789215 GtkScrolledWindow and GtkIconView atk objects can cause a segfaul...
|
||||
791542 GDK 3 Selections documentation makes references to X
|
||||
791802 Fix direction value moves on scroll/keypress over RTL/inverted ra...
|
||||
|
||||
* Translation updates:
|
||||
Catalan
|
||||
Finnish
|
||||
Polish
|
||||
Russian
|
||||
Spanish
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.22.30
|
||||
===================================
|
||||
|
||||
* gtk-demo has a new 'Widgetbowl' demo
|
||||
|
||||
* The wayland backend now supports the stable xdg-shell protocol
|
||||
|
||||
* Bugs fixed:
|
||||
#28 Adwaita: Selection mode styling flickers
|
||||
#83 Completion popup on non-default GdkDisplay freezes GtkFileChooserDialog
|
||||
#88 GtkSpinButton: Buttons aren't de/sensitised as they were in GTK+ 3
|
||||
#114 All Wayland apps crash when focused (gtk_gesture_multi_press_end→...
|
||||
#129 Segfault in `wl_proxy_marshal()`
|
||||
#132 GtkTextView auto-scrolling to insert mark upon focus changes due to...
|
||||
#141 GtkEntry: add a way to set the font to monospace
|
||||
#146 GtkExpander arrow is not dimmed when the Expander is not :sensitive
|
||||
#156 Transfer annotation for gtk_gl_area_new is incorrect
|
||||
#157 Crashes in gdkdisplay-wayland when clicking any button/menu item
|
||||
#163 Unable to explicitly set GtkModelButton role
|
||||
705509 notebook popup window on tabs shows underscores
|
||||
745128 Search is useless for translated app names
|
||||
748784 GtkProgressBar text cannot be superimposed on the progress bar
|
||||
791939 Add xdg-shell (stable) support
|
||||
792632 Emoji Chooser: section buttons have no tooltips
|
||||
793062 Crash under gdk_wayland_window_attach_image()
|
||||
|
||||
* Translation updates:
|
||||
Brazilian Portuguese
|
||||
Catalan
|
||||
Chinese
|
||||
Chinese (Taiwan)
|
||||
Dutch
|
||||
French
|
||||
German
|
||||
Hungarian
|
||||
Indonesian
|
||||
Italian
|
||||
Latvian
|
||||
Serbian
|
||||
Slovak
|
||||
Slovenian
|
||||
Turkish
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.22.29
|
||||
====================================
|
||||
|
||||
* Wayland
|
||||
- add an input method based on the text protocol
|
||||
|
||||
* File chooser
|
||||
- Stop activating without double-click
|
||||
|
||||
* Bugs fixed:
|
||||
710888 GtkInfoBar not shown after calling gtk_widget_show
|
||||
743975 Better deprecation information for GtkStatusIcon
|
||||
775546 gdkscreen-x11: Don't try to calculate a refresh rate for RandR 1.3...
|
||||
794008 GtkListBoxRow signal poorly documented
|
||||
|
||||
* Translation updates:
|
||||
Brazilian Portuguese
|
||||
British English
|
||||
Catalan
|
||||
Croatian
|
||||
Czech
|
||||
Danish
|
||||
Dutch
|
||||
Esperanto
|
||||
Estonian
|
||||
French
|
||||
Friulian
|
||||
Galician
|
||||
German
|
||||
Hungarian
|
||||
Icelandic
|
||||
Indonesian
|
||||
Italian
|
||||
Kazakh
|
||||
Korean
|
||||
Latvian
|
||||
Lithuanian
|
||||
Polish
|
||||
Russian
|
||||
Scottish Gaelic
|
||||
Serbian
|
||||
Serbian Latin
|
||||
Slovak
|
||||
Swedish
|
||||
Turkish
|
||||
|
||||
|
||||
2Overview of Changes in GTK+ 3.22.28
|
||||
===================================
|
||||
|
||||
* Fix the build
|
||||
|
||||
* Improve frame clock accuracy (#787665)
|
||||
|
||||
|
||||
2Overview of Changes in GTK+ 3.22.27
|
||||
===================================
|
||||
|
||||
* Require libcloudproviders 0.2.0
|
||||
|
||||
* The Emoji chooser can now be used with GtkTextView as well
|
||||
|
||||
* The Emoji chooser avoids fallback sequences that break the grid
|
||||
|
||||
* GTK+ is now using ~/.config/gtk-3.0/settings.ini when using
|
||||
Wayland without dconf
|
||||
|
||||
* Make fuse-mounted network filesystems show up in Other Locations
|
||||
|
||||
* The font chooser dialog supports search now
|
||||
|
||||
* Bugs fixed:
|
||||
737175 most horizontal sliders are inverted when scrolled with mouse wheel
|
||||
741633 GtkListBoxRow should implement GtkActionable
|
||||
771986 Inconsistent 'row-activated' signal emission before drag'n'drop, 'acti...
|
||||
774248 Desktop-wide text scaling factor is ignored by gtk_widget_override_fon...
|
||||
779009 Missing property-change::accessible-description events when the toolti...
|
||||
786123 GtkPlacesSidebar: Add support for libcloudproviders
|
||||
786509 GDK W32: OLE2 DnD is completely broken
|
||||
786528 Please make the output deterministic
|
||||
787089 win32: GtkWindow of type GTK_WINDOW_POPUP/GDK_WINDOW_TEMP leaks memory...
|
||||
787128 Re-add FUSE network mounts in local-only mode
|
||||
789054 Firefox crashes @gdk_window_begin_move_drag() on WM without _NET_WM_MO...
|
||||
789160 Add Windows compatible emoji shortcuts
|
||||
789268 Keyboard grab by popup window causes a session-modal shortcut-inhibiti...
|
||||
790029 GtkTextView: Support gtk 3.22.19's emoji chooser
|
||||
790031 GtkClipboardClearFunc is not being called
|
||||
790033 Add support for third stylus button on Wacom's new Pro Pen 3D
|
||||
790201 Settings in ~/.config/gtk-3.0/settings.ini ignored with GDK_BACKEND=wa...
|
||||
790270 avoid copy of CSS data from resources
|
||||
790862 Addition of insert_emoji breaks ABI on gtk-3-22
|
||||
790963 Thread safety issue in gtk_application_impl_dbus_startup
|
||||
791039 Emit enter+motion after GDK_CROSSING_TOUCH_END leave
|
||||
791062 Fix mapping window with complete xdg-foreign state
|
||||
791234 autocleanups: allow g_autoptr() usage with GtkTreePath
|
||||
791281 Backport size allocation optimization from master to 3.22
|
||||
791363 Shadow vertical offset is wrong when scaling is > 2
|
||||
791549 gtklistbox: Crash on page-up on GtkListBox
|
||||
791650 Do not warn about missing colord systemd service unit
|
||||
791710 css documentation, non-breaking spaces/hyphens, and other details
|
||||
791943 gnome-shell built with meson hangs when opening more than one window
|
||||
792279 Use portable sed syntax in gdk/wayland/Makefile.am
|
||||
792459 gtk_tree_model_sort_set_sort_column_id() ignores change to sort order
|
||||
792624 Critical due to gtk_widget_reset_controllers() passing NULL to gtk_e...
|
||||
|
||||
* Translation updates:
|
||||
Africaans
|
||||
Catalan
|
||||
Chinese (Taiwan)
|
||||
Esperanto
|
||||
Finnish
|
||||
Friulian
|
||||
Galician
|
||||
Hebrew
|
||||
Hungarian
|
||||
Icelandic
|
||||
Indonesian
|
||||
Italian
|
||||
Lithuanian
|
||||
Norwegian bokmål
|
||||
Polish
|
||||
Russian
|
||||
Serbian
|
||||
Slovenian
|
||||
Spanish
|
||||
Turkish
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.22.26
|
||||
===================================
|
||||
|
||||
* Bugs fixed:
|
||||
789630 Distribute protocol/server-decoration.xml in tarballs
|
||||
787142 input/IME: Defer the emit of the "commit" signal
|
||||
789134 icon-browser: Centre Copy button in dialog again
|
||||
789678 AboutDialog: Fix accepting GTK_LICENSE_AGPL_3_0
|
||||
788898 Inspector: better default split of CSS nodes/props
|
||||
789733 Fix GtkEntry:has-frame not working
|
||||
789213 gdk/win32: Fix Win32 GL Context switching
|
||||
785176 placessidebar: add starred location item
|
||||
|
||||
* Translation updates:
|
||||
Arabic
|
||||
Brazilian Portuguese
|
||||
Czech
|
||||
Dutch
|
||||
German
|
||||
Norwegian bokmål
|
||||
Polish
|
||||
Slovak
|
||||
Swedish
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.22.25
|
||||
===================================
|
||||
|
||||
* The HighContrast theme has received numerous improvements
|
||||
|
||||
* Middle-click on scrollbars jumps to the position again
|
||||
|
||||
* Wayland:
|
||||
- Terminal sizing problems are fixed
|
||||
- The Wayland backend now implemented the KDE server-side decorations protocol
|
||||
|
||||
* X11:
|
||||
- Problems with menus on several X servers are fixed
|
||||
|
||||
* Bugs fixed:
|
||||
701296 gtkfixed accepts toplevel windows into its children list after gtk_w...
|
||||
728452 gtk_tree_view_column_create_button creates button which is leaked
|
||||
738387 ComboBox in appears-as-list-mode: popup is not hidden when focus is ...
|
||||
763517 Selected then unselected Label in ListBox gets wrong colour until ho...
|
||||
769877 [HighContrast(|Inverse)] dual-headerbars broken
|
||||
769879 [HighContrast(|Inverse)] tooltips problems
|
||||
771279 Segfault due to gtk_event_controller_get_widget() returning NULL but...
|
||||
775217 Warning message "gdkcursor-wayland.c:170: Unable to load blank_curso...
|
||||
776793 GtkComboBox with appears-as-list doesn't receive mouse events from a...
|
||||
777072 window shrinks when restored from maximized
|
||||
778811 Enter submenus when activating their parent item
|
||||
778930 gtk3-icon-browser: Add scalable icons to icon detail modal window
|
||||
780101 Menus do not display over remote X11
|
||||
781909 Implement KDE's server-decoration protocol
|
||||
782396 Inconsistent deprecation documentation for gtk_paint_spinner
|
||||
783995 Monitor API inconsistencies across X11 & Wayland
|
||||
784314 entry completion regression on wayland
|
||||
784509 wrong coordinates given to at-spi layer from GTK3 entries
|
||||
786220 Sometimes the volume icon is replaced with image-missing
|
||||
786794 Print dialogue has a printer called "printer"
|
||||
787274 ComboBox in appears-as-list-mode: Gtk-CRITICAL when popping down wit...
|
||||
787669 Middle mouse click on scrollbar is ignored
|
||||
787866 Untranslated key labels in the Keyboard panel of Settings
|
||||
788053 Window position wrong in HiDPI mode
|
||||
788458 (style) Array index 'i' is used before limits check.
|
||||
788496 HighContrast/win32: CSD Windows have missing border and shadows floa...
|
||||
788505 ComboBox in appears-as-list mode: Clicking a TreeView expander also ...
|
||||
788516 dialogs in gtk+ 3.22.24 have square borders.
|
||||
788573 HighContrast: titlebar separator is too wide and joined to buttons, ...
|
||||
788574 HighContrast: Ugly solid black corners at bottom of MessageDialog
|
||||
788575 HighContrastInverse: Windows lack visible borders, merge into each o...
|
||||
788577 Global -GtkComboBox-appears-as-list breaks opening menu-mode CBs by ...
|
||||
788580 HighContrast: .flat buttons become non-flat when their window is :ba...
|
||||
788614 Trying to reuse a TreeViewColumn causes criticals and a segfault (e....
|
||||
788841 Fix gtk_actionable_set_detailed_action_name API inconsistency
|
||||
788905 GtkRange horizontal scrolling causes movement in the wrong direction
|
||||
789141 Segmentation fault when adding Google online account
|
||||
789149 GtkGestureZoom leaks the list of sequences while calculating the dis...
|
||||
789327 appchooserwidget: Don't limit application list unconditionally
|
||||
789357 Regression in 3.22.23: GDK_WINDOW_STATE_TILED flag is never set
|
||||
|
||||
* Translation updates:
|
||||
Brazilian Portuguese
|
||||
Catalan (Valencian)
|
||||
Croatian
|
||||
Czech
|
||||
German
|
||||
Hungarian
|
||||
Italian
|
||||
Indonesian
|
||||
Lithuanian
|
||||
Polish
|
||||
Slovak
|
||||
Slovenian
|
||||
Swedish
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.22.24
|
||||
===================================
|
||||
|
||||
* Bugs fixed:
|
||||
Combobox: Don't try to remove grabs on NULL devices
|
||||
Fix some issues with the new resizable tiling
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.22.23
|
||||
===================================
|
||||
|
||||
* Bugs fixed:
|
||||
783669 Allow resizing tiled windows
|
||||
784562 "Printer Details" dialog has no title bar...
|
||||
|
||||
Overview of Changes in GTK+ 3.22.22
|
||||
===================================
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"app-id": "org.gtk.WidgetFactory",
|
||||
"runtime": "org.gnome.Platform",
|
||||
"runtime-version": "master",
|
||||
"sdk": "org.gnome.Sdk",
|
||||
"command": "gtk3-widget-factory",
|
||||
"tags": ["devel", "development", "nightly"],
|
||||
"rename-desktop-file": "gtk3-widget-factory.desktop",
|
||||
"rename-icon": "gtk3-widget-factory",
|
||||
"finish-args": [
|
||||
"--device=dri",
|
||||
"--share=ipc",
|
||||
"--socket=x11",
|
||||
"--socket=wayland",
|
||||
"--talk-name=org.gtk.vfs", "--talk-name=org.gtk.vfs.*",
|
||||
"--talk-name=ca.desrt.conf", "--env=DCONF_USER_CONFIG_DIR=.config/dconf"
|
||||
],
|
||||
"cleanup": [
|
||||
"/include",
|
||||
"/lib/pkgconfig", "/share/pkgconfig",
|
||||
"/share/aclocal",
|
||||
"/man", "/share/man", "/share/gtk-doc",
|
||||
"*.la", ".a",
|
||||
"/lib/girepository-1.0",
|
||||
"/share/gir-1.0",
|
||||
"/share/doc"
|
||||
],
|
||||
"modules": [
|
||||
{
|
||||
"name": "gtk",
|
||||
"buildsystem": "autotools",
|
||||
"builddir": true,
|
||||
"config-opts": [
|
||||
"--libdir=/app/lib"
|
||||
],
|
||||
"sources": [
|
||||
{
|
||||
"type": "git",
|
||||
"branch": "gtk-3-24",
|
||||
"url": "https://gitlab.gnome.org/GNOME/gtk.git"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -36,11 +36,13 @@ SUBDIRS = \
|
||||
|
||||
EXTRA_DIST += \
|
||||
detectenv-msvc.mak \
|
||||
introspection-msvc.mak \
|
||||
gentypefuncs.py \
|
||||
gtk-introspection-msvc.mak \
|
||||
introspection-msvc.mak \
|
||||
replace.py \
|
||||
pc_base.py \
|
||||
gtkpc.py \
|
||||
README_EGL_MSVC.txt \
|
||||
$(GENERATED_ITEMS)
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
Notes on enabling EGL (ANGLE/D3D support) for Windows/Visual Studio builds
|
||||
==========================================================================
|
||||
There is now support in the GL context creation code for Windows in GDK for
|
||||
creating and using EGL (OpenGL ES 3) contexts, which can be used instead of
|
||||
the existing OpenGL (Desktop) support, especially when the graphics drivers
|
||||
do not support OpenGL adequately.
|
||||
|
||||
This support is not enabled by default in the project files. In order to do
|
||||
so, please do the following:
|
||||
|
||||
-Obtain or compile a build of recent version of ANGLE. The one that comes
|
||||
with QT 5.10.x is sufficiently recent, but not the one that comes with QT-
|
||||
5.6.x. Note that Visual Studio 2013 or later is required for building
|
||||
ANGLE from QT-5.10.x, but the Visual Studio 2013-built ANGLE DLLs does work
|
||||
without problems with GTK+ built with Visual Studio 2008~2013. You may
|
||||
need to obtain D3Dcompiler_[47|43|42].dll if it does not come with the
|
||||
system (which is part of the DirectX runtimes). Its headers and .lib
|
||||
needs to be set to be found by the compiler and linker respectively before
|
||||
building libepoxy.
|
||||
-Build libepoxy with EGL support, which has to be enabled explicitly on
|
||||
Windows builds. Pass in -Degl=yes when building libepoxy using Meson.
|
||||
Build and install, making sure the headers and .lib can be located by the
|
||||
compiler and linker respectively.
|
||||
-Open the vsX/gtk+.sln, and open the project properties in the "gdk3-win32"
|
||||
project. Under "C/C++", add GDK_WIN32_ENABLE_EGL in the "Preprocessor
|
||||
Definitions" to the existing definitions in there for the configuration
|
||||
that is being built. Then build the solution.
|
||||
-To force the use of the EGL code, set the envvar GDK_GL=(...,)gles , where (...,)
|
||||
are the other GDK_GL options desired.
|
||||
@@ -0,0 +1,53 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import sys
|
||||
import re
|
||||
import os
|
||||
|
||||
debug = os.getenv('GTK_GENTYPEFUNCS_DEBUG') is not None
|
||||
|
||||
out_file = sys.argv[1]
|
||||
in_file = sys.argv[2]
|
||||
|
||||
funcs = []
|
||||
|
||||
|
||||
if debug: print ('Output file: ', out_file)
|
||||
|
||||
# if debug: print (len(in_files), 'input files')
|
||||
|
||||
def open_file(filename, mode):
|
||||
if sys.version_info[0] < 3:
|
||||
return open(filename, mode=mode)
|
||||
else:
|
||||
return open(filename, mode=mode, encoding='utf-8')
|
||||
|
||||
with open(in_file, 'r') as f:
|
||||
for line in f:
|
||||
line = line.rstrip('\n').rstrip('\r')
|
||||
# print line
|
||||
match = re.search(r'\bg[td]k_[a-zA-Z0-9_]*_get_type\b', line)
|
||||
if match:
|
||||
func = match.group(0)
|
||||
if not func in funcs:
|
||||
funcs.append(func)
|
||||
if debug: print ('Found ', func)
|
||||
|
||||
file_output = 'G_GNUC_BEGIN_IGNORE_DEPRECATIONS\n'
|
||||
|
||||
funcs = sorted(funcs)
|
||||
|
||||
for f in funcs:
|
||||
if f.startswith('gdk_x11') or f.startswith('gtk_socket') or f.startswith('gtk_plug'):
|
||||
file_output += '#ifdef GDK_WINDOWING_X11\n'
|
||||
file_output += '*tp++ = {0}();\n'.format(f)
|
||||
file_output += '#endif\n'
|
||||
else:
|
||||
file_output += '*tp++ = {0}();\n'.format(f)
|
||||
|
||||
if debug: print (len(funcs), 'functions')
|
||||
|
||||
ofile = open(out_file, "w")
|
||||
ofile.write(file_output)
|
||||
ofile.close()
|
||||
@@ -31,9 +31,9 @@ def main(argv):
|
||||
cairo_min_ver = '1.14.0'
|
||||
gdk_pixbuf_min_ver = '2.30.0'
|
||||
gdk_win32_sys_libs = '-lgdi32 -limm32 -lshell32 -lole32 -lwinmm -ldwmapi'
|
||||
cairo_libs = '-lcairo-gobject -lcairo '
|
||||
glib_min_ver = '2.45.8'
|
||||
|
||||
cairo_backends = 'cairo-win32'
|
||||
gdk_backends = 'win32'
|
||||
gio_package = 'gio-2.0 >= ' + glib_min_ver
|
||||
broadway_extra_libs = ''
|
||||
@@ -43,20 +43,17 @@ def main(argv):
|
||||
# On Visual Studio, we link to zlib1.lib
|
||||
broadway_extra_libs = ' -lzlib1'
|
||||
gdk_backends += ' broadway'
|
||||
cairo_backends += ' cairo'
|
||||
|
||||
pkg_replace_items = {'@GTK_API_VERSION@': '3.0',
|
||||
'@GDK_BACKENDS@': gdk_backends}
|
||||
|
||||
pkg_required_packages = 'gdk-pixbuf-2.0 >= ' + gdk_pixbuf_min_ver + ' ' + \
|
||||
'cairo >= ' + cairo_min_ver + ' ' + \
|
||||
'cairo-gobject >= ' + cairo_min_ver
|
||||
pkg_required_packages = 'gdk-pixbuf-2.0 >= ' + gdk_pixbuf_min_ver
|
||||
|
||||
gdk_pc_replace_items = {'@GDK_PACKAGES@': gio_package + ' ' + \
|
||||
'pangowin32 pangocairo' + ' ' + \
|
||||
pkg_required_packages,
|
||||
'@GDK_PRIVATE_PACKAGES@': gio_package + ' ' + cairo_backends,
|
||||
'@GDK_EXTRA_LIBS@': gdk_win32_sys_libs + broadway_extra_libs,
|
||||
'@GDK_PRIVATE_PACKAGES@': gio_package,
|
||||
'@GDK_EXTRA_LIBS@': cairo_libs + gdk_win32_sys_libs + broadway_extra_libs,
|
||||
'@GDK_EXTRA_CFLAGS@': '',
|
||||
'gdk-3': 'gdk-3.0'}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<CustomBuild Include="..\..\..\gtk\gtkdbusinterfaces.xml"><Filter>Resource Files</Filter></CustomBuild>
|
||||
<CustomBuild Include="..\..\..\gtk\gtk-win32.rc.body"><Filter>Resource Files</Filter></CustomBuild>
|
||||
<CustomBuild Include="..\..\..\gtk\libgtk3.manifest.in"><Filter>Resource Files</Filter></CustomBuild>
|
||||
<CustomBuild Include="..\gentypefuncs.py"><Filter>Resource Files</Filter></CustomBuild>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
#include "gtk-3.vs10.sourcefiles.filters"
|
||||
|
||||
@@ -164,46 +164,24 @@
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<CustomBuild Include="..\..\..\gtk\gtkdbusinterfaces.xml">
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating GTK+ DBus Sources...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(GenerateGtkDbusBuiltSources)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Generating GTK+ DBus Sources...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(GenerateGtkDbusBuiltSourcesX64)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Generating GTK+ DBus Sources...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(GenerateGtkDbusBuiltSources)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Generating GTK+ DBus Sources...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(GenerateGtkDbusBuiltSourcesX64)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
|
||||
<Message>Generating GTK+ DBus Sources...</Message>
|
||||
<Command>$(GenerateGtkDbusBuiltSources)</Command>
|
||||
<Outputs>..\..\..\gtk\gtkdbusgenerated.c;..\..\..\gtk\gtkdbusgenerated.h;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\..\..\gtk\gtk-win32.rc.body">
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copying GTK+ Win32 Version Resource...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(CopyGtkWin32RC)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\gtk\gtk-win32.rc;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Copying GTK+ Win32 Version Resource...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(CopyGtkWin32RC)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\gtk\gtk-win32.rc;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copying GTK+ Win32 Version Resource...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(CopyGtkWin32RC)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\gtk\gtk-win32.rc;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Copying GTK+ Win32 Version Resource...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(CopyGtkWin32RC)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\gtk\gtk-win32.rc;%(Outputs)</Outputs>
|
||||
<Message>Copying GTK+ Win32 Version Resource...</Message>
|
||||
<Command>$(CopyGtkWin32RC)</Command>
|
||||
<Outputs>..\..\..\gtk\gtk-win32.rc;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\..\..\gtk\libgtk3.manifest.in">
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating GTK+ Win32 Manifest...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(GenerateGtkWin32Manifest)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">..\..\..\gtk\libgtk3.manifest;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Generating GTK+ Win32 Manifest...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(GenerateGtkWin32Manifest)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">..\..\..\gtk\libgtk3.manifest;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Generating GTK+ Win32 Manifest...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(GenerateGtkWin32Manifest)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">..\..\..\gtk\libgtk3.manifest;%(Outputs)</Outputs>
|
||||
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Generating GTK+ Win32 Manifest...</Message>
|
||||
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(GenerateGtkWin32Manifest)</Command>
|
||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">..\..\..\gtk\libgtk3.manifest;%(Outputs)</Outputs>
|
||||
<Message>Generating GTK+ Win32 Manifest...</Message>
|
||||
<Command>$(GenerateGtkWin32Manifest)</Command>
|
||||
<Outputs>..\..\..\gtk\libgtk3.manifest;%(Outputs)</Outputs>
|
||||
</CustomBuild>
|
||||
<CustomBuild Include="..\gentypefuncs.py">
|
||||
<Message>Generating ..\..\..\gtk\gtktypefuncs.c</Message>
|
||||
<Command>$(GenerateTypeFuncs)</Command>
|
||||
<Outputs>..\..\..\gtk\gtktypefuncs.c</Outputs>
|
||||
</CustomBuild>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -35,6 +35,10 @@ nmake -f gtk-introspection-msvc.mak CFG=$(Configuration) PREFIX=$(GlibEtcInstall
|
||||
<Link>
|
||||
<AdditionalDependencies>pangocairo-1.0.lib;cairo.lib;cairo-gobject.lib;pango-1.0.lib;gdk_pixbuf-2.0.lib;gio-2.0.lib;gmodule-2.0.lib;gobject-2.0.lib;glib-2.0.lib;intl.lib;epoxy.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>$(GlibEtcInstallRoot)\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<AdditionalOptions Condition="'$(VisualStudioVersion)|$(Platform)'=='11.0|x64'">/HIGHENTROPYVA %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalOptions Condition="'$(VisualStudioVersion)|$(Platform)'=='12.0|x64'">/HIGHENTROPYVA %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalOptions Condition="'$(VisualStudioVersion)|$(Platform)'=='14.0|x64'">/HIGHENTROPYVA %(AdditionalOptions)</AdditionalOptions>
|
||||
<AdditionalOptions Condition="'$(VisualStudioVersion)|$(Platform)'=='15.0|x64'">/HIGHENTROPYVA %(AdditionalOptions)</AdditionalOptions>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
@@ -114,7 +113,6 @@
|
||||
<FunctionLevelLinking>false</FunctionLevelLinking>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>MachineX86</TargetMachine>
|
||||
@@ -138,7 +136,6 @@
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
@@ -162,7 +159,6 @@
|
||||
<FunctionLevelLinking>false</FunctionLevelLinking>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<RandomizedBaseAddress>false</RandomizedBaseAddress>
|
||||
<DataExecutionPrevention>
|
||||
</DataExecutionPrevention>
|
||||
<TargetMachine>MachineX64</TargetMachine>
|
||||
|
||||
@@ -40,10 +40,16 @@ echo $(Configuration) > ..\..\..\MSVC_$(Configuration)_Broadway
|
||||
</GenGdkConfigHBroadway>
|
||||
<GDbusCodeGenCmd>$(GlibEtcInstallRoot)\bin\gdbus-codegen --interface-prefix org.Gtk. --c-namespace _Gtk --generate-c-code gtkdbusgenerated ./gtkdbusinterfaces.xml</GDbusCodeGenCmd>
|
||||
<GenerateGtkDbusBuiltSources>cd ..\..\..\gtk & $(PythonDir)\python $(GDbusCodeGenCmd) & cd $(SolutionDir)</GenerateGtkDbusBuiltSources>
|
||||
<GenerateGtkDbusBuiltSourcesX64>cd ..\..\..\gtk & $(PythonDirX64)\python $(GDbusCodeGenCmd) & cd $(SolutionDir)</GenerateGtkDbusBuiltSourcesX64>
|
||||
<CopyGtkWin32RC>copy ..\..\..\gtk\gtk-win32.rc.body ..\..\..\gtk\gtk-win32.rc</CopyGtkWin32RC>
|
||||
<GenerateGtkWin32Manifest>$(PythonDir)\python ..\replace.py --action=replace-var --input=..\..\..\gtk\libgtk3.manifest.in --output=..\..\..\gtk\libgtk3.manifest --var=EXE_MANIFEST_ARCHITECTURE --outstring=*</GenerateGtkWin32Manifest>
|
||||
<CopyDemosH>copy ..\..\..\demos\gtk-demo\demos.h.win32 ..\..\..\demos\gtk-demo\demos.h</CopyDemosH>
|
||||
<GenerateTypeFuncs>
|
||||
echo #undef GTK_COMPILATION > ..\..\..\gtk\gtktypefuncs.preproc.c
|
||||
echo #include "gtkx.h" >> ..\..\..\gtk\gtktypefuncs.preproc.c
|
||||
cl /EP /I..\..\..\gtk /I..\..\..\gdk /I..\..\..\gdk\win32 /I..\..\.. /I$(GlibEtcInstallRoot)\include\gdk-pixbuf-2.0 /I$(GlibEtcInstallRoot)\include\pango-1.0 /I$(GlibEtcInstallRoot)\include\atk-1.0 /I$(GlibEtcInstallRoot)\include\cairo /I$(GlibEtcInstallRoot)\include\gio-win32-2.0 /I$(GlibEtcInstallRoot)\include\glib-2.0 /I$(GlibEtcInstallRoot)\lib\glib-2.0\include /I$(GlibEtcInstallRoot)\include /DHAVE_CONFIG_H /DG_DISABLE_SINGLE_INCLUDES /DATK_DISABLE_SINGLE_INCLUDES /DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES /DGTK_DISABLE_SINGLE_INCLUDES /D_USE_MATH_DEFINES /DINCLUDE_IM_am_et /DINCLUDE_IM_cedilla /DINCLUDE_IM_cyrillic_translit /DINCLUDE_IM_ime /DINCLUDE_IM_inuktitut /DINCLUDE_IM_ipa /DINCLUDE_IM_multipress /DINCLUDE_IM_thai /DINCLUDE_IM_ti_er /DINCLUDE_IM_ti_et /DINCLUDE_IM_viqr /DGTK_COMPILATION /DG_LOG_DOMAIN=\"Gtk\" /DGTK_HOST=\"i686-pc-vs$(VSVer)\" /DGTK_PRINT_BACKENDS=\"file\" /DGTK_PRINT_BACKEND_ENABLE_UNSUPPORTED /D$(GtkIncludedImmodulesDefines) /DGTK_LIBDIR=\"$(GtkDummyPrefix)/lib\" /DGTK_DATADIR=\"$(GtkDummyPrefix)/share\" /DGTK_DATA_PREFIX=\"$(GtkDummyPrefix)\" /DGTK_SYSCONFDIR=\"$(GtkDummyPrefix)/etc\" /DMULTIPRESS_CONFDIR=\"$(GtkDummyPrefix)/etc/gtk-$(ApiVersion)\" /DMULTIPRESS_LOCALEDIR=\"$(GtkDummyPrefix)/share/locale\" /DGTK_VERSION=\"$(GtkVersion)\" /DGTK_BINARY_VERSION=\"$(GtkBinaryVersion)\" /DGDK_DISABLE_DEPRECATED /DISOLATION_AWARE_ENABLED ..\..\..\gtk\gtktypefuncs.preproc.c > ..\..\..\gtk\gtktypefuncs.combined.c
|
||||
$(PythonDir)\python ..\gentypefuncs.py ..\..\..\gtk\gtktypefuncs.c ..\..\..\gtk\gtktypefuncs.combined.c
|
||||
del ..\..\..\gtk\gtktypefuncs.combined.c ..\..\..\gtk\gtktypefuncs.preproc.c
|
||||
</GenerateTypeFuncs>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<_PropertySheetDisplayName>gtk3gensrcsprops</_PropertySheetDisplayName>
|
||||
@@ -64,9 +70,6 @@ echo $(Configuration) > ..\..\..\MSVC_$(Configuration)_Broadway
|
||||
<BuildMacro Include="GenerateGtkDbusBuiltSources">
|
||||
<Value>$(GenerateGtkDbusBuiltSources)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="GenerateGtkDbusBuiltSourcesX64">
|
||||
<Value>$(GenerateGtkDbusBuiltSourcesX64)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="CopyGtkWin32RC">
|
||||
<Value>$(CopyGtkWin32RC)</Value>
|
||||
</BuildMacro>
|
||||
@@ -76,5 +79,8 @@ echo $(Configuration) > ..\..\..\MSVC_$(Configuration)_Broadway
|
||||
<BuildMacro Include="CopyDemosH">
|
||||
<Value>$(CopyDemosH)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="GenerateTypeFuncs">
|
||||
<Value>$(GenerateTypeFuncs)</Value>
|
||||
</BuildMacro>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,534 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="gtk3-build-defines.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<BinDir>$(SolutionDir)$(Configuration)\$(Platform)\bin</BinDir>
|
||||
<GtkDoInstallBin>
|
||||
mkdir $(CopyDir)\bin
|
||||
mkdir $(CopyDir)\lib\pkgconfig
|
||||
copy "$(BinDir)\$(GtkDllPrefix)gdk-3$(GtkDllSuffix).dll" $(CopyDir)\bin
|
||||
copy "$(BinDir)\$(GtkDllPrefix)gdk-3$(GtkDllSuffix).pdb" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gdk-$(ApiVersion).lib" $(CopyDir)\lib
|
||||
if "$(Configuration)" == "Release_Broadway" goto DO_BROADWAY_BIN
|
||||
if "$(Configuration)" == "Debug_Broadway" goto DO_BROADWAY_BIN
|
||||
copy "$(BinDir)\$(GtkDllPrefix)gtk-3$(GtkDllSuffix).dll" $(CopyDir)\bin
|
||||
copy "$(BinDir)\$(GtkDllPrefix)gtk-3$(GtkDllSuffix).pdb" $(CopyDir)\bin
|
||||
copy "$(BinDir)\$(GtkDllPrefix)gailutil-3$(GtkDllSuffix).dll" $(CopyDir)\bin
|
||||
copy "$(BinDir)\$(GtkDllPrefix)gailutil-3$(GtkDllSuffix).pdb" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk-$(ApiVersion).lib" $(CopyDir)\lib
|
||||
copy "$(BinDir)\gailutil-$(ApiVersion).lib" $(CopyDir)\lib
|
||||
copy "$(BinDir)\gtk3-demo.exe" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk3-demo.pdb" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk3-demo-application.exe" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk3-demo-application.pdb" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk3-icon-browser.exe" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk3-icon-browser.pdb" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk-encode-symbolic-svg.exe" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk-encode-symbolic-svg.pdb" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk-update-icon-cache.exe" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk-update-icon-cache.pdb" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk-query-settings.exe" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk-query-settings.pdb" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk-builder-tool.exe" $(CopyDir)\bin
|
||||
copy "$(BinDir)\gtk-builder-tool.pdb" $(CopyDir)\bin
|
||||
goto DONE_BIN
|
||||
:DO_BROADWAY_BIN
|
||||
copy "$(BinDir)\broadwayd.exe" $(CopyDir)\bin
|
||||
copy "$(BinDir)\broadwayd.pdb" $(CopyDir)\bin
|
||||
if "$(Configuration)" == "Release_Broadway" goto DO_BROADWAY_RELEASE
|
||||
if "$(Configuration)" == "Debug_Broadway" goto DO_BROADWAY_DEBUG
|
||||
:DO_BROADWAY_RELEASE
|
||||
copy .\Release\$(Platform)\bin\$(GtkDllPrefix)gtk-3$(GtkDllSuffix).dll $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\$(GtkDllPrefix)gtk-3$(GtkDllSuffix).pdb $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\$(GtkDllPrefix)gailutil-3$(GtkDllSuffix).dll $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\$(GtkDllPrefix)gailutil-3$(GtkDllSuffix).pdb $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk-$(ApiVersion).lib $(CopyDir)\lib
|
||||
copy .\Release\$(Platform)\bin\gailutil-$(ApiVersion).lib $(CopyDir)\lib
|
||||
copy .\Release\$(Platform)\bin\gtk3-demo.exe $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk3-demo.pdb $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk3-demo-application.exe $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk3-demo-application.pdb $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk3-icon-browser.exe $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk3-icon-browser.pdb $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk-encode-symbolic-svg.exe $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk-encode-symbolic-svg.pdb $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk-update-icon-cache.exe $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk-update-icon-cache.pdb $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk-query-settings.exe $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk-query-settings.pdb $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk-builder-tool.exe $(CopyDir)\bin
|
||||
copy .\Release\$(Platform)\bin\gtk-builder-tool.pdb $(CopyDir)\bin
|
||||
goto DONE_BIN
|
||||
:DO_BROADWAY_DEBUG
|
||||
copy .\Debug\$(Platform)\bin\$(GtkDllPrefix)gtk-3$(GtkDllSuffix).dll $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\$(GtkDllPrefix)gtk-3$(GtkDllSuffix).pdb $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\$(GtkDllPrefix)gailutil-3$(GtkDllSuffix).dll $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\$(GtkDllPrefix)gailutil-3$(GtkDllSuffix).pdb $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk-$(ApiVersion).lib $(CopyDir)\lib
|
||||
copy .\Debug\$(Platform)\bin\gailutil-$(ApiVersion).lib $(CopyDir)\lib
|
||||
copy .\Debug\$(Platform)\bin\gtk3-demo.exe $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk3-demo.pdb $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk3-demo-application.exe $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk3-demo-application.pdb $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk3-icon-browser.exe $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk3-icon-browser.pdb $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk-encode-symbolic-svg.exe $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk-encode-symbolic-svg.pdb $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk-update-icon-cache.exe $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk-update-icon-cache.pdb $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk-query-settings.exe $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk-query-settings.pdb $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk-builder-tool.exe $(CopyDir)\bin
|
||||
copy .\Debug\$(Platform)\bin\gtk-builder-tool.pdb $(CopyDir)\bin
|
||||
:DONE_BIN
|
||||
copy ..\gdk-3.0.pc $(CopyDir)\lib\pkgconfig
|
||||
copy ..\gdk-3.0.pc $(CopyDir)\lib\pkgconfig\gdk-win32-3.0.pc
|
||||
copy "..\gtk+-3.0.pc" $(CopyDir)\lib\pkgconfig
|
||||
copy "..\gtk+-3.0.pc" "$(CopyDir)\lib\pkgconfig\gtk+-3.0.pc"
|
||||
copy ..\gail-3.0.pc $(CopyDir)\lib\pkgconfig
|
||||
</GtkDoInstallBin>
|
||||
<GtkDoInstall>
|
||||
echo off
|
||||
mkdir $(CopyDir)\include\gtk-$(ApiVersion)\gdk\win32
|
||||
mkdir $(CopyDir)\include\gtk-$(ApiVersion)\gdk\deprecated
|
||||
copy ..\..\..\gdk\win32\gdkwin32.h $(CopyDir)\include\gtk-$(ApiVersion)\gdk
|
||||
copy ..\..\..\gdk\gdk.h $(CopyDir)\include\gtk-3.0\gdk\gdk.h
|
||||
copy ..\..\..\gdk\gdk-autocleanup.h $(CopyDir)\include\gtk-3.0\gdk\gdk-autocleanup.h
|
||||
copy ..\..\..\gdk\gdkapplaunchcontext.h $(CopyDir)\include\gtk-3.0\gdk\gdkapplaunchcontext.h
|
||||
copy ..\..\..\gdk\gdkcairo.h $(CopyDir)\include\gtk-3.0\gdk\gdkcairo.h
|
||||
copy ..\..\..\gdk\gdkcursor.h $(CopyDir)\include\gtk-3.0\gdk\gdkcursor.h
|
||||
copy ..\..\..\gdk\gdkdevice.h $(CopyDir)\include\gtk-3.0\gdk\gdkdevice.h
|
||||
copy ..\..\..\gdk\gdkdevicepad.h $(CopyDir)\include\gtk-3.0\gdk\gdkdevicepad.h
|
||||
copy ..\..\..\gdk\gdkdevicetool.h $(CopyDir)\include\gtk-3.0\gdk\gdkdevicetool.h
|
||||
copy ..\..\..\gdk\gdkdevicemanager.h $(CopyDir)\include\gtk-3.0\gdk\gdkdevicemanager.h
|
||||
copy ..\..\..\gdk\gdkdisplay.h $(CopyDir)\include\gtk-3.0\gdk\gdkdisplay.h
|
||||
copy ..\..\..\gdk\gdkdisplaymanager.h $(CopyDir)\include\gtk-3.0\gdk\gdkdisplaymanager.h
|
||||
copy ..\..\..\gdk\gdkdnd.h $(CopyDir)\include\gtk-3.0\gdk\gdkdnd.h
|
||||
copy ..\..\..\gdk\gdkdrawingcontext.h $(CopyDir)\include\gtk-3.0\gdk\gdkdrawingcontext.h
|
||||
copy ..\..\..\gdk\gdkevents.h $(CopyDir)\include\gtk-3.0\gdk\gdkevents.h
|
||||
copy ..\..\..\gdk\gdkframetimings.h $(CopyDir)\include\gtk-3.0\gdk\gdkframetimings.h
|
||||
copy ..\..\..\gdk\gdkglcontext.h $(CopyDir)\include\gtk-3.0\gdk\gdkglcontext.h
|
||||
copy ..\..\..\gdk\gdkkeys.h $(CopyDir)\include\gtk-3.0\gdk\gdkkeys.h
|
||||
copy ..\..\..\gdk\gdkkeysyms.h $(CopyDir)\include\gtk-3.0\gdk\gdkkeysyms.h
|
||||
copy ..\..\..\gdk\gdkkeysyms-compat.h $(CopyDir)\include\gtk-3.0\gdk\gdkkeysyms-compat.h
|
||||
copy ..\..\..\gdk\gdkmain.h $(CopyDir)\include\gtk-3.0\gdk\gdkmain.h
|
||||
copy ..\..\..\gdk\gdkmonitor.h $(CopyDir)\include\gtk-3.0\gdk\gdkmonitor.h
|
||||
copy ..\..\..\gdk\gdkpango.h $(CopyDir)\include\gtk-3.0\gdk\gdkpango.h
|
||||
copy ..\..\..\gdk\gdkframeclock.h $(CopyDir)\include\gtk-3.0\gdk\gdkframeclock.h
|
||||
copy ..\..\..\gdk\gdkpixbuf.h $(CopyDir)\include\gtk-3.0\gdk\gdkpixbuf.h
|
||||
copy ..\..\..\gdk\gdkprivate.h $(CopyDir)\include\gtk-3.0\gdk\gdkprivate.h
|
||||
copy ..\..\..\gdk\gdkproperty.h $(CopyDir)\include\gtk-3.0\gdk\gdkproperty.h
|
||||
copy ..\..\..\gdk\gdkrectangle.h $(CopyDir)\include\gtk-3.0\gdk\gdkrectangle.h
|
||||
copy ..\..\..\gdk\gdkrgba.h $(CopyDir)\include\gtk-3.0\gdk\gdkrgba.h
|
||||
copy ..\..\..\gdk\gdkscreen.h $(CopyDir)\include\gtk-3.0\gdk\gdkscreen.h
|
||||
copy ..\..\..\gdk\gdkseat.h $(CopyDir)\include\gtk-3.0\gdk\gdkseat.h
|
||||
copy ..\..\..\gdk\gdkselection.h $(CopyDir)\include\gtk-3.0\gdk\gdkselection.h
|
||||
copy ..\..\..\gdk\gdktestutils.h $(CopyDir)\include\gtk-3.0\gdk\gdktestutils.h
|
||||
copy ..\..\..\gdk\gdkthreads.h $(CopyDir)\include\gtk-3.0\gdk\gdkthreads.h
|
||||
copy ..\..\..\gdk\gdktypes.h $(CopyDir)\include\gtk-3.0\gdk\gdktypes.h
|
||||
copy ..\..\..\gdk\gdkvisual.h $(CopyDir)\include\gtk-3.0\gdk\gdkvisual.h
|
||||
copy ..\..\..\gdk\gdkwindow.h $(CopyDir)\include\gtk-3.0\gdk\gdkwindow.h
|
||||
copy ..\..\..\gdk\deprecated\gdkcolor.h $(CopyDir)\include\gtk-3.0\gdk\deprecated\gdkcolor.h
|
||||
copy ..\..\..\gdk\gdkconfig.h $(CopyDir)\include\gtk-3.0\gdk\gdkconfig.h
|
||||
copy ..\..\..\gdk\gdkenumtypes.h $(CopyDir)\include\gtk-3.0\gdk\gdkenumtypes.h
|
||||
copy ..\..\..\gdk\gdkversionmacros.h $(CopyDir)\include\gtk-3.0\gdk\gdkversionmacros.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32cursor.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32cursor.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32display.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32display.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32displaymanager.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32displaymanager.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32dnd.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32dnd.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32glcontext.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32glcontext.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32keys.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32keys.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32misc.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32misc.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32monitor.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32monitor.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32screen.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32screen.h
|
||||
copy ..\..\..\gdk\win32\gdkwin32window.h $(CopyDir)\include\gtk-3.0\gdk\win32\gdkwin32window.h
|
||||
mkdir $(CopyDir)\include\gtk-$(ApiVersion)\gtk\a11y
|
||||
mkdir $(CopyDir)\include\gtk-$(ApiVersion)\gtk\deprecated
|
||||
copy ..\..\..\gtk\gtk.h $(CopyDir)\include\gtk-3.0\gtk\gtk.h
|
||||
copy ..\..\..\gtk\gtk-autocleanups.h $(CopyDir)\include\gtk-3.0\gtk\gtk-autocleanups.h
|
||||
copy ..\..\..\gtk\gtkx.h $(CopyDir)\include\gtk-3.0\gtk\gtkx.h
|
||||
copy ..\..\..\gtk\gtkx-autocleanups.h $(CopyDir)\include\gtk-3.0\gtk\gtkx-autocleanups.h
|
||||
copy ..\..\..\gtk\gtk-a11y.h $(CopyDir)\include\gtk-3.0\gtk\gtk-a11y.h
|
||||
copy ..\..\..\gtk\gtkaboutdialog.h $(CopyDir)\include\gtk-3.0\gtk\gtkaboutdialog.h
|
||||
copy ..\..\..\gtk\gtkaccelgroup.h $(CopyDir)\include\gtk-3.0\gtk\gtkaccelgroup.h
|
||||
copy ..\..\..\gtk\gtkaccellabel.h $(CopyDir)\include\gtk-3.0\gtk\gtkaccellabel.h
|
||||
copy ..\..\..\gtk\gtkaccelmap.h $(CopyDir)\include\gtk-3.0\gtk\gtkaccelmap.h
|
||||
copy ..\..\..\gtk\gtkaccessible.h $(CopyDir)\include\gtk-3.0\gtk\gtkaccessible.h
|
||||
copy ..\..\..\gtk\gtkactionable.h $(CopyDir)\include\gtk-3.0\gtk\gtkactionable.h
|
||||
copy ..\..\..\gtk\gtkactionbar.h $(CopyDir)\include\gtk-3.0\gtk\gtkactionbar.h
|
||||
copy ..\..\..\gtk\gtkadjustment.h $(CopyDir)\include\gtk-3.0\gtk\gtkadjustment.h
|
||||
copy ..\..\..\gtk\gtkappchooser.h $(CopyDir)\include\gtk-3.0\gtk\gtkappchooser.h
|
||||
copy ..\..\..\gtk\gtkappchooserbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkappchooserbutton.h
|
||||
copy ..\..\..\gtk\gtkappchooserdialog.h $(CopyDir)\include\gtk-3.0\gtk\gtkappchooserdialog.h
|
||||
copy ..\..\..\gtk\gtkappchooserwidget.h $(CopyDir)\include\gtk-3.0\gtk\gtkappchooserwidget.h
|
||||
copy ..\..\..\gtk\gtkapplication.h $(CopyDir)\include\gtk-3.0\gtk\gtkapplication.h
|
||||
copy ..\..\..\gtk\gtkapplicationwindow.h $(CopyDir)\include\gtk-3.0\gtk\gtkapplicationwindow.h
|
||||
copy ..\..\..\gtk\gtkaspectframe.h $(CopyDir)\include\gtk-3.0\gtk\gtkaspectframe.h
|
||||
copy ..\..\..\gtk\gtkassistant.h $(CopyDir)\include\gtk-3.0\gtk\gtkassistant.h
|
||||
copy ..\..\..\gtk\gtkbbox.h $(CopyDir)\include\gtk-3.0\gtk\gtkbbox.h
|
||||
copy ..\..\..\gtk\gtkbin.h $(CopyDir)\include\gtk-3.0\gtk\gtkbin.h
|
||||
copy ..\..\..\gtk\gtkbindings.h $(CopyDir)\include\gtk-3.0\gtk\gtkbindings.h
|
||||
copy ..\..\..\gtk\gtkborder.h $(CopyDir)\include\gtk-3.0\gtk\gtkborder.h
|
||||
copy ..\..\..\gtk\gtkbox.h $(CopyDir)\include\gtk-3.0\gtk\gtkbox.h
|
||||
copy ..\..\..\gtk\gtkbuilder.h $(CopyDir)\include\gtk-3.0\gtk\gtkbuilder.h
|
||||
copy ..\..\..\gtk\gtkbuildable.h $(CopyDir)\include\gtk-3.0\gtk\gtkbuildable.h
|
||||
copy ..\..\..\gtk\gtkbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkbutton.h
|
||||
copy ..\..\..\gtk\gtkcalendar.h $(CopyDir)\include\gtk-3.0\gtk\gtkcalendar.h
|
||||
copy ..\..\..\gtk\gtkcellarea.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellarea.h
|
||||
copy ..\..\..\gtk\gtkcellareacontext.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellareacontext.h
|
||||
copy ..\..\..\gtk\gtkcellareabox.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellareabox.h
|
||||
copy ..\..\..\gtk\gtkcelleditable.h $(CopyDir)\include\gtk-3.0\gtk\gtkcelleditable.h
|
||||
copy ..\..\..\gtk\gtkcelllayout.h $(CopyDir)\include\gtk-3.0\gtk\gtkcelllayout.h
|
||||
copy ..\..\..\gtk\gtkcellrenderer.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellrenderer.h
|
||||
copy ..\..\..\gtk\gtkcellrendereraccel.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellrendereraccel.h
|
||||
copy ..\..\..\gtk\gtkcellrenderercombo.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellrenderercombo.h
|
||||
copy ..\..\..\gtk\gtkcellrendererpixbuf.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellrendererpixbuf.h
|
||||
copy ..\..\..\gtk\gtkcellrendererprogress.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellrendererprogress.h
|
||||
copy ..\..\..\gtk\gtkcellrendererspin.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellrendererspin.h
|
||||
copy ..\..\..\gtk\gtkcellrendererspinner.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellrendererspinner.h
|
||||
copy ..\..\..\gtk\gtkcellrenderertext.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellrenderertext.h
|
||||
copy ..\..\..\gtk\gtkcellrenderertoggle.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellrenderertoggle.h
|
||||
copy ..\..\..\gtk\gtkcellview.h $(CopyDir)\include\gtk-3.0\gtk\gtkcellview.h
|
||||
copy ..\..\..\gtk\gtkcheckbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkcheckbutton.h
|
||||
copy ..\..\..\gtk\gtkcheckmenuitem.h $(CopyDir)\include\gtk-3.0\gtk\gtkcheckmenuitem.h
|
||||
copy ..\..\..\gtk\gtkclipboard.h $(CopyDir)\include\gtk-3.0\gtk\gtkclipboard.h
|
||||
copy ..\..\..\gtk\gtkcolorbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkcolorbutton.h
|
||||
copy ..\..\..\gtk\gtkcolorchooser.h $(CopyDir)\include\gtk-3.0\gtk\gtkcolorchooser.h
|
||||
copy ..\..\..\gtk\gtkcolorchooserwidget.h $(CopyDir)\include\gtk-3.0\gtk\gtkcolorchooserwidget.h
|
||||
copy ..\..\..\gtk\gtkcolorchooserdialog.h $(CopyDir)\include\gtk-3.0\gtk\gtkcolorchooserdialog.h
|
||||
copy ..\..\..\gtk\gtkcolorutils.h $(CopyDir)\include\gtk-3.0\gtk\gtkcolorutils.h
|
||||
copy ..\..\..\gtk\gtkcombobox.h $(CopyDir)\include\gtk-3.0\gtk\gtkcombobox.h
|
||||
copy ..\..\..\gtk\gtkcomboboxtext.h $(CopyDir)\include\gtk-3.0\gtk\gtkcomboboxtext.h
|
||||
copy ..\..\..\gtk\gtkcontainer.h $(CopyDir)\include\gtk-3.0\gtk\gtkcontainer.h
|
||||
copy ..\..\..\gtk\gtkcssprovider.h $(CopyDir)\include\gtk-3.0\gtk\gtkcssprovider.h
|
||||
copy ..\..\..\gtk\gtkcsssection.h $(CopyDir)\include\gtk-3.0\gtk\gtkcsssection.h
|
||||
copy ..\..\..\gtk\gtkdebug.h $(CopyDir)\include\gtk-3.0\gtk\gtkdebug.h
|
||||
copy ..\..\..\gtk\gtkdialog.h $(CopyDir)\include\gtk-3.0\gtk\gtkdialog.h
|
||||
copy ..\..\..\gtk\gtkdnd.h $(CopyDir)\include\gtk-3.0\gtk\gtkdnd.h
|
||||
copy ..\..\..\gtk\gtkdragdest.h $(CopyDir)\include\gtk-3.0\gtk\gtkdragdest.h
|
||||
copy ..\..\..\gtk\gtkdragsource.h $(CopyDir)\include\gtk-3.0\gtk\gtkdragsource.h
|
||||
copy ..\..\..\gtk\gtkdrawingarea.h $(CopyDir)\include\gtk-3.0\gtk\gtkdrawingarea.h
|
||||
copy ..\..\..\gtk\gtkeditable.h $(CopyDir)\include\gtk-3.0\gtk\gtkeditable.h
|
||||
copy ..\..\..\gtk\gtkentry.h $(CopyDir)\include\gtk-3.0\gtk\gtkentry.h
|
||||
copy ..\..\..\gtk\gtkentrybuffer.h $(CopyDir)\include\gtk-3.0\gtk\gtkentrybuffer.h
|
||||
copy ..\..\..\gtk\gtkentrycompletion.h $(CopyDir)\include\gtk-3.0\gtk\gtkentrycompletion.h
|
||||
copy ..\..\..\gtk\gtkenums.h $(CopyDir)\include\gtk-3.0\gtk\gtkenums.h
|
||||
copy ..\..\..\gtk\gtkeventbox.h $(CopyDir)\include\gtk-3.0\gtk\gtkeventbox.h
|
||||
copy ..\..\..\gtk\gtkeventcontroller.h $(CopyDir)\include\gtk-3.0\gtk\gtkeventcontroller.h
|
||||
copy ..\..\..\gtk\gtkexpander.h $(CopyDir)\include\gtk-3.0\gtk\gtkexpander.h
|
||||
copy ..\..\..\gtk\gtkfilechooser.h $(CopyDir)\include\gtk-3.0\gtk\gtkfilechooser.h
|
||||
copy ..\..\..\gtk\gtkfilechooserbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkfilechooserbutton.h
|
||||
copy ..\..\..\gtk\gtkfilechooserdialog.h $(CopyDir)\include\gtk-3.0\gtk\gtkfilechooserdialog.h
|
||||
copy ..\..\..\gtk\gtkfilechoosernative.h $(CopyDir)\include\gtk-3.0\gtk\gtkfilechoosernative.h
|
||||
copy ..\..\..\gtk\gtkfilechooserwidget.h $(CopyDir)\include\gtk-3.0\gtk\gtkfilechooserwidget.h
|
||||
copy ..\..\..\gtk\gtkfilefilter.h $(CopyDir)\include\gtk-3.0\gtk\gtkfilefilter.h
|
||||
copy ..\..\..\gtk\gtkfixed.h $(CopyDir)\include\gtk-3.0\gtk\gtkfixed.h
|
||||
copy ..\..\..\gtk\gtkflowbox.h $(CopyDir)\include\gtk-3.0\gtk\gtkflowbox.h
|
||||
copy ..\..\..\gtk\gtkfontbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkfontbutton.h
|
||||
copy ..\..\..\gtk\gtkfontchooser.h $(CopyDir)\include\gtk-3.0\gtk\gtkfontchooser.h
|
||||
copy ..\..\..\gtk\gtkfontchooserdialog.h $(CopyDir)\include\gtk-3.0\gtk\gtkfontchooserdialog.h
|
||||
copy ..\..\..\gtk\gtkfontchooserwidget.h $(CopyDir)\include\gtk-3.0\gtk\gtkfontchooserwidget.h
|
||||
copy ..\..\..\gtk\gtkframe.h $(CopyDir)\include\gtk-3.0\gtk\gtkframe.h
|
||||
copy ..\..\..\gtk\gtkgesture.h $(CopyDir)\include\gtk-3.0\gtk\gtkgesture.h
|
||||
copy ..\..\..\gtk\gtkgesturedrag.h $(CopyDir)\include\gtk-3.0\gtk\gtkgesturedrag.h
|
||||
copy ..\..\..\gtk\gtkgesturelongpress.h $(CopyDir)\include\gtk-3.0\gtk\gtkgesturelongpress.h
|
||||
copy ..\..\..\gtk\gtkgesturemultipress.h $(CopyDir)\include\gtk-3.0\gtk\gtkgesturemultipress.h
|
||||
copy ..\..\..\gtk\gtkgesturepan.h $(CopyDir)\include\gtk-3.0\gtk\gtkgesturepan.h
|
||||
copy ..\..\..\gtk\gtkgesturerotate.h $(CopyDir)\include\gtk-3.0\gtk\gtkgesturerotate.h
|
||||
copy ..\..\..\gtk\gtkgesturesingle.h $(CopyDir)\include\gtk-3.0\gtk\gtkgesturesingle.h
|
||||
copy ..\..\..\gtk\gtkgestureswipe.h $(CopyDir)\include\gtk-3.0\gtk\gtkgestureswipe.h
|
||||
copy ..\..\..\gtk\gtkgesturezoom.h $(CopyDir)\include\gtk-3.0\gtk\gtkgesturezoom.h
|
||||
copy ..\..\..\gtk\gtkglarea.h $(CopyDir)\include\gtk-3.0\gtk\gtkglarea.h
|
||||
copy ..\..\..\gtk\gtkgrid.h $(CopyDir)\include\gtk-3.0\gtk\gtkgrid.h
|
||||
copy ..\..\..\gtk\gtkheaderbar.h $(CopyDir)\include\gtk-3.0\gtk\gtkheaderbar.h
|
||||
copy ..\..\..\gtk\gtkicontheme.h $(CopyDir)\include\gtk-3.0\gtk\gtkicontheme.h
|
||||
copy ..\..\..\gtk\gtkiconview.h $(CopyDir)\include\gtk-3.0\gtk\gtkiconview.h
|
||||
copy ..\..\..\gtk\gtkimage.h $(CopyDir)\include\gtk-3.0\gtk\gtkimage.h
|
||||
copy ..\..\..\gtk\gtkimcontext.h $(CopyDir)\include\gtk-3.0\gtk\gtkimcontext.h
|
||||
copy ..\..\..\gtk\gtkimcontextinfo.h $(CopyDir)\include\gtk-3.0\gtk\gtkimcontextinfo.h
|
||||
copy ..\..\..\gtk\gtkimcontextsimple.h $(CopyDir)\include\gtk-3.0\gtk\gtkimcontextsimple.h
|
||||
copy ..\..\..\gtk\gtkimmodule.h $(CopyDir)\include\gtk-3.0\gtk\gtkimmodule.h
|
||||
copy ..\..\..\gtk\gtkimmulticontext.h $(CopyDir)\include\gtk-3.0\gtk\gtkimmulticontext.h
|
||||
copy ..\..\..\gtk\gtkinfobar.h $(CopyDir)\include\gtk-3.0\gtk\gtkinfobar.h
|
||||
copy ..\..\..\gtk\gtkinvisible.h $(CopyDir)\include\gtk-3.0\gtk\gtkinvisible.h
|
||||
copy ..\..\..\gtk\gtklabel.h $(CopyDir)\include\gtk-3.0\gtk\gtklabel.h
|
||||
copy ..\..\..\gtk\gtklayout.h $(CopyDir)\include\gtk-3.0\gtk\gtklayout.h
|
||||
copy ..\..\..\gtk\gtklevelbar.h $(CopyDir)\include\gtk-3.0\gtk\gtklevelbar.h
|
||||
copy ..\..\..\gtk\gtklinkbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtklinkbutton.h
|
||||
copy ..\..\..\gtk\gtklistbox.h $(CopyDir)\include\gtk-3.0\gtk\gtklistbox.h
|
||||
copy ..\..\..\gtk\gtkliststore.h $(CopyDir)\include\gtk-3.0\gtk\gtkliststore.h
|
||||
copy ..\..\..\gtk\gtklockbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtklockbutton.h
|
||||
copy ..\..\..\gtk\gtkmain.h $(CopyDir)\include\gtk-3.0\gtk\gtkmain.h
|
||||
copy ..\..\..\gtk\gtkmenu.h $(CopyDir)\include\gtk-3.0\gtk\gtkmenu.h
|
||||
copy ..\..\..\gtk\gtkmenubar.h $(CopyDir)\include\gtk-3.0\gtk\gtkmenubar.h
|
||||
copy ..\..\..\gtk\gtkmenubutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkmenubutton.h
|
||||
copy ..\..\..\gtk\gtkmenuitem.h $(CopyDir)\include\gtk-3.0\gtk\gtkmenuitem.h
|
||||
copy ..\..\..\gtk\gtkmenushell.h $(CopyDir)\include\gtk-3.0\gtk\gtkmenushell.h
|
||||
copy ..\..\..\gtk\gtkmenutoolbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkmenutoolbutton.h
|
||||
copy ..\..\..\gtk\gtkmessagedialog.h $(CopyDir)\include\gtk-3.0\gtk\gtkmessagedialog.h
|
||||
copy ..\..\..\gtk\gtkmodelbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkmodelbutton.h
|
||||
copy ..\..\..\gtk\gtkmodules.h $(CopyDir)\include\gtk-3.0\gtk\gtkmodules.h
|
||||
copy ..\..\..\gtk\gtkmountoperation.h $(CopyDir)\include\gtk-3.0\gtk\gtkmountoperation.h
|
||||
copy ..\..\..\gtk\gtknativedialog.h $(CopyDir)\include\gtk-3.0\gtk\gtknativedialog.h
|
||||
copy ..\..\..\gtk\gtknotebook.h $(CopyDir)\include\gtk-3.0\gtk\gtknotebook.h
|
||||
copy ..\..\..\gtk\gtkoffscreenwindow.h $(CopyDir)\include\gtk-3.0\gtk\gtkoffscreenwindow.h
|
||||
copy ..\..\..\gtk\gtkorientable.h $(CopyDir)\include\gtk-3.0\gtk\gtkorientable.h
|
||||
copy ..\..\..\gtk\gtkoverlay.h $(CopyDir)\include\gtk-3.0\gtk\gtkoverlay.h
|
||||
copy ..\..\..\gtk\gtkpadcontroller.h $(CopyDir)\include\gtk-3.0\gtk\gtkpadcontroller.h
|
||||
copy ..\..\..\gtk\gtkpagesetup.h $(CopyDir)\include\gtk-3.0\gtk\gtkpagesetup.h
|
||||
copy ..\..\..\gtk\gtkpaned.h $(CopyDir)\include\gtk-3.0\gtk\gtkpaned.h
|
||||
copy ..\..\..\gtk\gtkpapersize.h $(CopyDir)\include\gtk-3.0\gtk\gtkpapersize.h
|
||||
copy ..\..\..\gtk\gtkplacessidebar.h $(CopyDir)\include\gtk-3.0\gtk\gtkplacessidebar.h
|
||||
copy ..\..\..\gtk\gtkplug.h $(CopyDir)\include\gtk-3.0\gtk\gtkplug.h
|
||||
copy ..\..\..\gtk\gtkpopover.h $(CopyDir)\include\gtk-3.0\gtk\gtkpopover.h
|
||||
copy ..\..\..\gtk\gtkpopovermenu.h $(CopyDir)\include\gtk-3.0\gtk\gtkpopovermenu.h
|
||||
copy ..\..\..\gtk\gtkprintcontext.h $(CopyDir)\include\gtk-3.0\gtk\gtkprintcontext.h
|
||||
copy ..\..\..\gtk\gtkprintoperation.h $(CopyDir)\include\gtk-3.0\gtk\gtkprintoperation.h
|
||||
copy ..\..\..\gtk\gtkprintoperationpreview.h $(CopyDir)\include\gtk-3.0\gtk\gtkprintoperationpreview.h
|
||||
copy ..\..\..\gtk\gtkprintsettings.h $(CopyDir)\include\gtk-3.0\gtk\gtkprintsettings.h
|
||||
copy ..\..\..\gtk\gtkprogressbar.h $(CopyDir)\include\gtk-3.0\gtk\gtkprogressbar.h
|
||||
copy ..\..\..\gtk\gtkradiobutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkradiobutton.h
|
||||
copy ..\..\..\gtk\gtkradiomenuitem.h $(CopyDir)\include\gtk-3.0\gtk\gtkradiomenuitem.h
|
||||
copy ..\..\..\gtk\gtkradiotoolbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkradiotoolbutton.h
|
||||
copy ..\..\..\gtk\gtkrange.h $(CopyDir)\include\gtk-3.0\gtk\gtkrange.h
|
||||
copy ..\..\..\gtk\gtkrecentchooser.h $(CopyDir)\include\gtk-3.0\gtk\gtkrecentchooser.h
|
||||
copy ..\..\..\gtk\gtkrecentchooserdialog.h $(CopyDir)\include\gtk-3.0\gtk\gtkrecentchooserdialog.h
|
||||
copy ..\..\..\gtk\gtkrecentchoosermenu.h $(CopyDir)\include\gtk-3.0\gtk\gtkrecentchoosermenu.h
|
||||
copy ..\..\..\gtk\gtkrecentchooserwidget.h $(CopyDir)\include\gtk-3.0\gtk\gtkrecentchooserwidget.h
|
||||
copy ..\..\..\gtk\gtkrecentfilter.h $(CopyDir)\include\gtk-3.0\gtk\gtkrecentfilter.h
|
||||
copy ..\..\..\gtk\gtkrecentmanager.h $(CopyDir)\include\gtk-3.0\gtk\gtkrecentmanager.h
|
||||
copy ..\..\..\gtk\gtkrender.h $(CopyDir)\include\gtk-3.0\gtk\gtkrender.h
|
||||
copy ..\..\..\gtk\gtkrevealer.h $(CopyDir)\include\gtk-3.0\gtk\gtkrevealer.h
|
||||
copy ..\..\..\gtk\gtkscale.h $(CopyDir)\include\gtk-3.0\gtk\gtkscale.h
|
||||
copy ..\..\..\gtk\gtkscalebutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkscalebutton.h
|
||||
copy ..\..\..\gtk\gtkscrollable.h $(CopyDir)\include\gtk-3.0\gtk\gtkscrollable.h
|
||||
copy ..\..\..\gtk\gtkscrollbar.h $(CopyDir)\include\gtk-3.0\gtk\gtkscrollbar.h
|
||||
copy ..\..\..\gtk\gtkscrolledwindow.h $(CopyDir)\include\gtk-3.0\gtk\gtkscrolledwindow.h
|
||||
copy ..\..\..\gtk\gtksearchbar.h $(CopyDir)\include\gtk-3.0\gtk\gtksearchbar.h
|
||||
copy ..\..\..\gtk\gtksearchentry.h $(CopyDir)\include\gtk-3.0\gtk\gtksearchentry.h
|
||||
copy ..\..\..\gtk\gtkselection.h $(CopyDir)\include\gtk-3.0\gtk\gtkselection.h
|
||||
copy ..\..\..\gtk\gtkseparator.h $(CopyDir)\include\gtk-3.0\gtk\gtkseparator.h
|
||||
copy ..\..\..\gtk\gtkseparatormenuitem.h $(CopyDir)\include\gtk-3.0\gtk\gtkseparatormenuitem.h
|
||||
copy ..\..\..\gtk\gtkseparatortoolitem.h $(CopyDir)\include\gtk-3.0\gtk\gtkseparatortoolitem.h
|
||||
copy ..\..\..\gtk\gtksettings.h $(CopyDir)\include\gtk-3.0\gtk\gtksettings.h
|
||||
copy ..\..\..\gtk\gtkshortcutlabel.h $(CopyDir)\include\gtk-3.0\gtk\gtkshortcutlabel.h
|
||||
copy ..\..\..\gtk\gtkshortcutsgroup.h $(CopyDir)\include\gtk-3.0\gtk\gtkshortcutsgroup.h
|
||||
copy ..\..\..\gtk\gtkshortcutssection.h $(CopyDir)\include\gtk-3.0\gtk\gtkshortcutssection.h
|
||||
copy ..\..\..\gtk\gtkshortcutsshortcut.h $(CopyDir)\include\gtk-3.0\gtk\gtkshortcutsshortcut.h
|
||||
copy ..\..\..\gtk\gtkshortcutswindow.h $(CopyDir)\include\gtk-3.0\gtk\gtkshortcutswindow.h
|
||||
copy ..\..\..\gtk\gtkshow.h $(CopyDir)\include\gtk-3.0\gtk\gtkshow.h
|
||||
copy ..\..\..\gtk\gtkstacksidebar.h $(CopyDir)\include\gtk-3.0\gtk\gtkstacksidebar.h
|
||||
copy ..\..\..\gtk\gtksizegroup.h $(CopyDir)\include\gtk-3.0\gtk\gtksizegroup.h
|
||||
copy ..\..\..\gtk\gtksizerequest.h $(CopyDir)\include\gtk-3.0\gtk\gtksizerequest.h
|
||||
copy ..\..\..\gtk\gtksocket.h $(CopyDir)\include\gtk-3.0\gtk\gtksocket.h
|
||||
copy ..\..\..\gtk\gtkspinbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkspinbutton.h
|
||||
copy ..\..\..\gtk\gtkspinner.h $(CopyDir)\include\gtk-3.0\gtk\gtkspinner.h
|
||||
copy ..\..\..\gtk\gtkstack.h $(CopyDir)\include\gtk-3.0\gtk\gtkstack.h
|
||||
copy ..\..\..\gtk\gtkstackswitcher.h $(CopyDir)\include\gtk-3.0\gtk\gtkstackswitcher.h
|
||||
copy ..\..\..\gtk\gtkstatusbar.h $(CopyDir)\include\gtk-3.0\gtk\gtkstatusbar.h
|
||||
copy ..\..\..\gtk\gtkstylecontext.h $(CopyDir)\include\gtk-3.0\gtk\gtkstylecontext.h
|
||||
copy ..\..\..\gtk\gtkstyleprovider.h $(CopyDir)\include\gtk-3.0\gtk\gtkstyleprovider.h
|
||||
copy ..\..\..\gtk\gtkswitch.h $(CopyDir)\include\gtk-3.0\gtk\gtkswitch.h
|
||||
copy ..\..\..\gtk\gtktestutils.h $(CopyDir)\include\gtk-3.0\gtk\gtktestutils.h
|
||||
copy ..\..\..\gtk\gtktextattributes.h $(CopyDir)\include\gtk-3.0\gtk\gtktextattributes.h
|
||||
copy ..\..\..\gtk\gtktextbuffer.h $(CopyDir)\include\gtk-3.0\gtk\gtktextbuffer.h
|
||||
copy ..\..\..\gtk\gtktextbufferrichtext.h $(CopyDir)\include\gtk-3.0\gtk\gtktextbufferrichtext.h
|
||||
copy ..\..\..\gtk\gtktextchild.h $(CopyDir)\include\gtk-3.0\gtk\gtktextchild.h
|
||||
copy ..\..\..\gtk\gtktextdisplay.h $(CopyDir)\include\gtk-3.0\gtk\gtktextdisplay.h
|
||||
copy ..\..\..\gtk\gtktextiter.h $(CopyDir)\include\gtk-3.0\gtk\gtktextiter.h
|
||||
copy ..\..\..\gtk\gtktextmark.h $(CopyDir)\include\gtk-3.0\gtk\gtktextmark.h
|
||||
copy ..\..\..\gtk\gtktexttag.h $(CopyDir)\include\gtk-3.0\gtk\gtktexttag.h
|
||||
copy ..\..\..\gtk\gtktexttagtable.h $(CopyDir)\include\gtk-3.0\gtk\gtktexttagtable.h
|
||||
copy ..\..\..\gtk\gtktextview.h $(CopyDir)\include\gtk-3.0\gtk\gtktextview.h
|
||||
copy ..\..\..\gtk\gtktogglebutton.h $(CopyDir)\include\gtk-3.0\gtk\gtktogglebutton.h
|
||||
copy ..\..\..\gtk\gtktoggletoolbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtktoggletoolbutton.h
|
||||
copy ..\..\..\gtk\gtktoolbar.h $(CopyDir)\include\gtk-3.0\gtk\gtktoolbar.h
|
||||
copy ..\..\..\gtk\gtktoolbutton.h $(CopyDir)\include\gtk-3.0\gtk\gtktoolbutton.h
|
||||
copy ..\..\..\gtk\gtktoolitem.h $(CopyDir)\include\gtk-3.0\gtk\gtktoolitem.h
|
||||
copy ..\..\..\gtk\gtktoolitemgroup.h $(CopyDir)\include\gtk-3.0\gtk\gtktoolitemgroup.h
|
||||
copy ..\..\..\gtk\gtktoolpalette.h $(CopyDir)\include\gtk-3.0\gtk\gtktoolpalette.h
|
||||
copy ..\..\..\gtk\gtktoolshell.h $(CopyDir)\include\gtk-3.0\gtk\gtktoolshell.h
|
||||
copy ..\..\..\gtk\gtktooltip.h $(CopyDir)\include\gtk-3.0\gtk\gtktooltip.h
|
||||
copy ..\..\..\gtk\gtktreednd.h $(CopyDir)\include\gtk-3.0\gtk\gtktreednd.h
|
||||
copy ..\..\..\gtk\gtktreemodel.h $(CopyDir)\include\gtk-3.0\gtk\gtktreemodel.h
|
||||
copy ..\..\..\gtk\gtktreemodelfilter.h $(CopyDir)\include\gtk-3.0\gtk\gtktreemodelfilter.h
|
||||
copy ..\..\..\gtk\gtktreemodelsort.h $(CopyDir)\include\gtk-3.0\gtk\gtktreemodelsort.h
|
||||
copy ..\..\..\gtk\gtktreeselection.h $(CopyDir)\include\gtk-3.0\gtk\gtktreeselection.h
|
||||
copy ..\..\..\gtk\gtktreesortable.h $(CopyDir)\include\gtk-3.0\gtk\gtktreesortable.h
|
||||
copy ..\..\..\gtk\gtktreestore.h $(CopyDir)\include\gtk-3.0\gtk\gtktreestore.h
|
||||
copy ..\..\..\gtk\gtktreeview.h $(CopyDir)\include\gtk-3.0\gtk\gtktreeview.h
|
||||
copy ..\..\..\gtk\gtktreeviewcolumn.h $(CopyDir)\include\gtk-3.0\gtk\gtktreeviewcolumn.h
|
||||
copy ..\..\..\gtk\gtktypes.h $(CopyDir)\include\gtk-3.0\gtk\gtktypes.h
|
||||
copy ..\..\..\gtk\gtkviewport.h $(CopyDir)\include\gtk-3.0\gtk\gtkviewport.h
|
||||
copy ..\..\..\gtk\gtkvolumebutton.h $(CopyDir)\include\gtk-3.0\gtk\gtkvolumebutton.h
|
||||
copy ..\..\..\gtk\gtkwidget.h $(CopyDir)\include\gtk-3.0\gtk\gtkwidget.h
|
||||
copy ..\..\..\gtk\gtkwidgetpath.h $(CopyDir)\include\gtk-3.0\gtk\gtkwidgetpath.h
|
||||
copy ..\..\..\gtk\gtkwindow.h $(CopyDir)\include\gtk-3.0\gtk\gtkwindow.h
|
||||
copy ..\..\..\gtk\gtkwindowgroup.h $(CopyDir)\include\gtk-3.0\gtk\gtkwindowgroup.h
|
||||
copy ..\..\..\gtk\gtktextlayout.h $(CopyDir)\include\gtk-3.0\gtk\gtktextlayout.h
|
||||
copy ..\..\..\gtk\gtktypebuiltins.h $(CopyDir)\include\gtk-3.0\gtk\gtktypebuiltins.h
|
||||
copy ..\..\..\gtk\gtkversion.h $(CopyDir)\include\gtk-3.0\gtk\gtkversion.h
|
||||
copy ..\..\..\gtk\a11y\gtk-a11y-autocleanups.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtk-a11y-autocleanups.h
|
||||
copy ..\..\..\gtk\a11y\gtkarrowaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkarrowaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkbooleancellaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkbooleancellaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkbuttonaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkbuttonaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkcellaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkcellaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkcellaccessibleparent.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkcellaccessibleparent.h
|
||||
copy ..\..\..\gtk\a11y\gtkcheckmenuitemaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkcheckmenuitemaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkcomboboxaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkcomboboxaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkcontaineraccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkcontaineraccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkcontainercellaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkcontainercellaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkentryaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkentryaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkexpanderaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkexpanderaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkflowboxaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkflowboxaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkflowboxchildaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkflowboxchildaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkframeaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkframeaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkiconviewaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkiconviewaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkimageaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkimageaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkimagecellaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkimagecellaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtklabelaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtklabelaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtklevelbaraccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtklevelbaraccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtklinkbuttonaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtklinkbuttonaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtklistboxaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtklistboxaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtklistboxrowaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtklistboxrowaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtklockbuttonaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtklockbuttonaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkmenuaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkmenuaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkmenubuttonaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkmenubuttonaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkmenuitemaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkmenuitemaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkmenushellaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkmenushellaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtknotebookaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtknotebookaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtknotebookpageaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtknotebookpageaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkpanedaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkpanedaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkpopoveraccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkpopoveraccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkprogressbaraccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkprogressbaraccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkradiobuttonaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkradiobuttonaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkradiomenuitemaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkradiomenuitemaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkrangeaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkrangeaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkrenderercellaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkrenderercellaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkscaleaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkscaleaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkscalebuttonaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkscalebuttonaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkscrolledwindowaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkscrolledwindowaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkspinbuttonaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkspinbuttonaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkspinneraccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkspinneraccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkstatusbaraccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkstatusbaraccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkstackaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkstackaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkswitchaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkswitchaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtktextcellaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtktextcellaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtktextviewaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtktextviewaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtktogglebuttonaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtktogglebuttonaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtktoplevelaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtktoplevelaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtktreeviewaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtktreeviewaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkwidgetaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkwidgetaccessible.h
|
||||
copy ..\..\..\gtk\a11y\gtkwindowaccessible.h $(CopyDir)\include\gtk-3.0\gtk\a11y\gtkwindowaccessible.h
|
||||
copy ..\..\..\gtk\deprecated\gtkactivatable.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkactivatable.h
|
||||
copy ..\..\..\gtk\deprecated\gtkaction.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkaction.h
|
||||
copy ..\..\..\gtk\deprecated\gtkactiongroup.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkactiongroup.h
|
||||
copy ..\..\..\gtk\deprecated\gtkalignment.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkalignment.h
|
||||
copy ..\..\..\gtk\deprecated\gtkarrow.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkarrow.h
|
||||
copy ..\..\..\gtk\deprecated\gtkcolorsel.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkcolorsel.h
|
||||
copy ..\..\..\gtk\deprecated\gtkcolorseldialog.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkcolorseldialog.h
|
||||
copy ..\..\..\gtk\deprecated\gtkfontsel.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkfontsel.h
|
||||
copy ..\..\..\gtk\deprecated\gtkgradient.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkgradient.h
|
||||
copy ..\..\..\gtk\deprecated\gtkhandlebox.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkhandlebox.h
|
||||
copy ..\..\..\gtk\deprecated\gtkhbbox.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkhbbox.h
|
||||
copy ..\..\..\gtk\deprecated\gtkhbox.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkhbox.h
|
||||
copy ..\..\..\gtk\deprecated\gtkhpaned.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkhpaned.h
|
||||
copy ..\..\..\gtk\deprecated\gtkhscale.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkhscale.h
|
||||
copy ..\..\..\gtk\deprecated\gtkhscrollbar.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkhscrollbar.h
|
||||
copy ..\..\..\gtk\deprecated\gtkhseparator.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkhseparator.h
|
||||
copy ..\..\..\gtk\deprecated\gtkhsv.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkhsv.h
|
||||
copy ..\..\..\gtk\deprecated\gtkiconfactory.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkiconfactory.h
|
||||
copy ..\..\..\gtk\deprecated\gtkimagemenuitem.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkimagemenuitem.h
|
||||
copy ..\..\..\gtk\deprecated\gtkmisc.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkmisc.h
|
||||
copy ..\..\..\gtk\deprecated\gtknumerableicon.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtknumerableicon.h
|
||||
copy ..\..\..\gtk\deprecated\gtkradioaction.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkradioaction.h
|
||||
copy ..\..\..\gtk\deprecated\gtkrc.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkrc.h
|
||||
copy ..\..\..\gtk\deprecated\gtkrecentaction.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkrecentaction.h
|
||||
copy ..\..\..\gtk\deprecated\gtkstatusicon.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkstatusicon.h
|
||||
copy ..\..\..\gtk\deprecated\gtkstock.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkstock.h
|
||||
copy ..\..\..\gtk\deprecated\gtkstyle.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkstyle.h
|
||||
copy ..\..\..\gtk\deprecated\gtkstyleproperties.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkstyleproperties.h
|
||||
copy ..\..\..\gtk\deprecated\gtksymboliccolor.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtksymboliccolor.h
|
||||
copy ..\..\..\gtk\deprecated\gtktable.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtktable.h
|
||||
copy ..\..\..\gtk\deprecated\gtktearoffmenuitem.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtktearoffmenuitem.h
|
||||
copy ..\..\..\gtk\deprecated\gtkthemingengine.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkthemingengine.h
|
||||
copy ..\..\..\gtk\deprecated\gtktoggleaction.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtktoggleaction.h
|
||||
copy ..\..\..\gtk\deprecated\gtkuimanager.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkuimanager.h
|
||||
copy ..\..\..\gtk\deprecated\gtkvbbox.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkvbbox.h
|
||||
copy ..\..\..\gtk\deprecated\gtkvbox.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkvbox.h
|
||||
copy ..\..\..\gtk\deprecated\gtkvscale.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkvscale.h
|
||||
copy ..\..\..\gtk\deprecated\gtkvscrollbar.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkvscrollbar.h
|
||||
copy ..\..\..\gtk\deprecated\gtkvseparator.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkvseparator.h
|
||||
copy ..\..\..\gtk\deprecated\gtkvpaned.h $(CopyDir)\include\gtk-3.0\gtk\deprecated\gtkvpaned.h
|
||||
mkdir $(CopyDir)\include\gail-$(ApiVersion)\libgail-util
|
||||
copy ..\..\..\libgail-util\gailmisc.h $(CopyDir)\include\gail-3.0\libgail-util\gailmisc.h
|
||||
copy ..\..\..\libgail-util\gailtextutil.h $(CopyDir)\include\gail-3.0\libgail-util\gailtextutil.h
|
||||
copy ..\..\..\libgail-util\gail-util.h $(CopyDir)\include\gail-3.0\libgail-util\gail-util.h
|
||||
for %%s in (16 22 24 32 48 256) do ((mkdir $(CopyDir)\share\icons\hicolor\%%sx%%s\apps) & (copy /b ..\..\..\demos\gtk-demo\data\%%sx%%s\gtk3-demo.png $(CopyDir)\share\icons\hicolor\%%sx%%s\apps))
|
||||
mkdir $(CopyDir)\share\glib-2.0\schemas
|
||||
copy ..\..\..\gtk\org.gtk.Settings.ColorChooser.gschema.xml $(CopyDir)\share\glib-2.0\schemas
|
||||
copy ..\..\..\gtk\org.gtk.Settings.Debug.gschema.xml $(CopyDir)\share\glib-2.0\schemas
|
||||
copy ..\..\..\gtk\org.gtk.Settings.EmojiChooser.gschema.xml $(CopyDir)\share\glib-2.0\schemas
|
||||
copy ..\..\..\gtk\org.gtk.Settings.FileChooser.gschema.xml $(CopyDir)\share\glib-2.0\schemas
|
||||
copy ..\..\..\demos\gtk-demo\org.gtk.Demo.gschema.xml $(CopyDir)\share\glib-2.0\schemas
|
||||
</GtkDoInstall>
|
||||
<GtkDoInstallBroadwayHeaders>
|
||||
copy ..\..\..\gdk\broadway\gdkbroadway.h $(CopyDir)\include\gtk-$(ApiVersion)\gdk
|
||||
mkdir $(CopyDir)\include\gtk-$(ApiVersion)\gdk\broadway
|
||||
copy ..\..\..\gdk\broadway\gdkbroadwaydisplay.h $(CopyDir)\include\gtk-3.0\gdk\broadway\gdkbroadwaydisplay.h
|
||||
copy ..\..\..\gdk\broadway\gdkbroadwaywindow.h $(CopyDir)\include\gtk-3.0\gdk\broadway\gdkbroadwaywindow.h
|
||||
copy ..\..\..\gdk\broadway\gdkbroadwaycursor.h $(CopyDir)\include\gtk-3.0\gdk\broadway\gdkbroadwaycursor.h
|
||||
copy ..\..\..\gdk\broadway\gdkbroadwaymonitor.h $(CopyDir)\include\gtk-3.0\gdk\broadway\gdkbroadwaymonitor.h
|
||||
copy ..\..\..\gdk\broadway\gdkbroadwayvisual.h $(CopyDir)\include\gtk-3.0\gdk\broadway\gdkbroadwayvisual.h
|
||||
</GtkDoInstallBroadwayHeaders>
|
||||
<GtkPostInstall>
|
||||
echo "Compiling gsettings XML Files..."
|
||||
$(GlibEtcInstallRoot)\bin\glib-compile-schemas.exe $(CopyDir)\share\glib-2.0\schemas
|
||||
echo "Generating icon cache......"
|
||||
$(CopyDir)\bin\gtk-update-icon-cache.exe --ignore-theme-index --force "$(CopyDir)\share\icons\hicolor"
|
||||
</GtkPostInstall>
|
||||
<GenerateGtkPC>$(PythonDir)\python ..\gtkpc.py --prefix=$(CopyDir) --version=$(GtkVersion) --host=i686-pc-vs$(VSVer)</GenerateGtkPC>
|
||||
<GenerateGtkPCX64>$(PythonDir)\python ..\gtkpc.py --prefix=$(CopyDir) --version=$(GtkVersion) --host=x86_64-pc-vs$(VSVer)</GenerateGtkPCX64>
|
||||
<GtkPCFiles>..\gdk-3.0.pc;..\gtk+-3.0.pc;..\gail-3.0.pc</GtkPCFiles>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<_PropertySheetDisplayName>gtk3installsprops</_PropertySheetDisplayName>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<BuildMacro Include="BinDir">
|
||||
<Value>$(BinDir)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="InstalledDlls">
|
||||
<Value>$(InstalledDlls)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="InstalledBins">
|
||||
<Value>$(InstalledBins)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="InstalledBroadwayBins">
|
||||
<Value>$(InstalledBroadwayBins)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="GtkDoInstallBin">
|
||||
<Value>$(GtkDoInstallBin)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="GtkDoInstall">
|
||||
<Value>$(GtkDoInstall)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="GtkDoInstallBroadwayHeaders">
|
||||
<Value>$(GtkDoInstallBroadwayHeaders)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="GtkPostInstall">
|
||||
<Value>$(GtkPostInstall)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="GenerateGtkPC">
|
||||
<Value>$(GenerateGtkPC)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="GenerateGtkPCX64">
|
||||
<Value>$(GenerateGtkPCX64)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="GtkPCFiles">
|
||||
<Value>$(GtkPCFiles)</Value>
|
||||
</BuildMacro>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -135,7 +135,7 @@ echo "Generating icon cache......"
|
||||
$(CopyDir)\bin\gtk-update-icon-cache.exe --ignore-theme-index --force "$(CopyDir)\share\icons\hicolor"
|
||||
</GtkPostInstall>
|
||||
<GenerateGtkPC>$(PythonDir)\python ..\gtkpc.py --prefix=$(CopyDir) --version=$(GtkVersion) --host=i686-pc-vs$(VSVer)</GenerateGtkPC>
|
||||
<GenerateGtkPCX64>$(PythonDirX64)\python ..\gtkpc.py --prefix=$(CopyDir) --version=$(GtkVersion) --host=x86_64-pc-vs$(VSVer)</GenerateGtkPCX64>
|
||||
<GenerateGtkPCX64>$(PythonDir)\python ..\gtkpc.py --prefix=$(CopyDir) --version=$(GtkVersion) --host=x86_64-pc-vs$(VSVer)</GenerateGtkPCX64>
|
||||
<GtkPCFiles>..\gdk-3.0.pc;..\gtk+-3.0.pc;..\gail-3.0.pc</GtkPCFiles>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
|
||||
@@ -80,15 +80,15 @@
|
||||
<NMakeOutput>$(GtkIntrospectBuiltFiles)</NMakeOutput>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<NMakeBuildCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParamX64) install-introspection</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParamX64) clean install-introspection</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParamX64) clean</NMakeCleanCommandLine>
|
||||
<NMakeBuildCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParam) install-introspection</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParam) clean install-introspection</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParam) clean</NMakeCleanCommandLine>
|
||||
<NMakeOutput>$(GtkIntrospectBuiltFiles)</NMakeOutput>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<NMakeBuildCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParamX64) install-introspection</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParamX64) clean install-introspection</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParamX64) clean</NMakeCleanCommandLine>
|
||||
<NMakeBuildCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParam) install-introspection</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParam) clean install-introspection</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(GtkIntrospectNMakeCmd) $(IntrospectPythonParam) clean</NMakeCleanCommandLine>
|
||||
<NMakeOutput>$(GtkIntrospectBuiltFiles)</NMakeOutput>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -12,14 +12,17 @@
|
||||
<GtkSeparateVSDllSuffix>-vs$(VSVer)</GtkSeparateVSDllSuffix>
|
||||
<GtkDllPrefix>$(GtkSeparateVSDllPrefix)</GtkDllPrefix>
|
||||
<GtkDllSuffix>$(GtkSeparateVSDllSuffix)</GtkDllSuffix>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)' == '10.0'">c:\python34</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)' == '11.0'">c:\python34</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)' == '12.0'">c:\python34</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)' == '14.0'">c:\python36</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)' == '15.0'">c:\python36</PythonDir>
|
||||
<PythonDirX64>$(PythonDir).x64</PythonDirX64>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '10.0|Win32'">c:\python34</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '11.0|Win32'">c:\python34</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '12.0|Win32'">c:\python34</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '14.0|Win32'">c:\python36</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '15.0|Win32'">c:\python36</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '10.0|x64'">c:\python34.x64</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '11.0|x64'">c:\python34.x64</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '12.0|x64'">c:\python34.x64</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '14.0|x64'">c:\python36.x64</PythonDir>
|
||||
<PythonDir Condition="'$(VisualStudioVersion)|$(Platform)' == '15.0|x64'">c:\python36.x64</PythonDir>
|
||||
<IntrospectPythonParam>PYTHON=$(PythonDir)\python.exe</IntrospectPythonParam>
|
||||
<IntrospectPythonParamX64>PYTHON=$(PythonDirX64)\python.exe</IntrospectPythonParamX64>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<_PropertySheetDisplayName>gtk3versionpathsprops</_PropertySheetDisplayName>
|
||||
@@ -61,14 +64,8 @@
|
||||
<BuildMacro Include="PythonDir">
|
||||
<Value>$(PythonDir)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="PythonDirX64">
|
||||
<Value>$(PythonDirX64)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="IntrospectPythonParam">
|
||||
<Value>$(IntrospectPythonParam)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="IntrospectPythonParamX64">
|
||||
<Value>$(IntrospectPythonParamX64)</Value>
|
||||
</BuildMacro>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -252,6 +252,36 @@
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\gentypefuncs.py">
|
||||
<FileConfiguration Name="Debug|Win32">
|
||||
<Tool Name="VCCustomBuildTool"
|
||||
Description="Generating ..\..\..\gtk\gtktypefuncs.c..."
|
||||
CommandLine="$(GenerateTypeFuncs)"
|
||||
Outputs="..\..\..\gtk\gtktypefuncs.c"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration Name="Release|Win32">
|
||||
<Tool Name="VCCustomBuildTool"
|
||||
Description="Generating ..\..\..\gtk\gtktypefuncs.c..."
|
||||
CommandLine="$(GenerateTypeFuncs)"
|
||||
Outputs="..\..\..\gtk\gtktypefuncs.c"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration Name="Debug|x64">
|
||||
<Tool Name="VCCustomBuildTool"
|
||||
Description="Generating ..\..\..\gtk\gtktypefuncs.c..."
|
||||
CommandLine="$(GenerateTypeFuncsX64)"
|
||||
Outputs="..\..\..\gtk\gtktypefuncs.c"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
<FileConfiguration Name="Release|x64">
|
||||
<Tool Name="VCCustomBuildTool"
|
||||
Description="Generating ..\..\..\gtk\gtktypefuncs.c..."
|
||||
CommandLine="$(GenerateTypeFuncsX64)"
|
||||
Outputs="..\..\..\gtk\gtktypefuncs.c"
|
||||
/>
|
||||
</FileConfiguration>
|
||||
</File>
|
||||
<File RelativePath="..\..\..\gtk\gtk-win32.rc" />
|
||||
<File RelativePath="..\..\..\gtk\libgtk3.manifest" />
|
||||
</Filter>
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
@@ -80,7 +79,6 @@
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="1"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
@@ -113,7 +111,6 @@
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
TargetMachine="1"
|
||||
/>
|
||||
@@ -146,7 +143,6 @@
|
||||
SubSystem="1"
|
||||
OptimizeReferences="2"
|
||||
EnableCOMDATFolding="2"
|
||||
RandomizedBaseAddress="1"
|
||||
DataExecutionPrevention="0"
|
||||
TargetMachine="17"
|
||||
/>
|
||||
|
||||
@@ -78,4 +78,24 @@ echo $(ConfigurationName) > ..\..\..\MSVC_$(ConfigurationName)_Broadway
|
||||
Name="CopyDemosH"
|
||||
Value="copy ..\..\..\demos\gtk-demo\demos.h.win32 ..\..\..\demos\gtk-demo\demos.h"
|
||||
/>
|
||||
<UserMacro
|
||||
Name="GenerateTypeFuncs"
|
||||
Value="
|
||||
echo #undef GTK_COMPILATION > ..\..\..\gtk\gtktypefuncs.preproc.c

|
||||
echo #include "gtkx.h" >> ..\..\..\gtk\gtktypefuncs.preproc.c

|
||||
cl /EP /I..\..\..\gtk /I..\..\..\gdk /I..\..\..\gdk\win32 /I..\..\.. /I$(GlibEtcInstallRoot)\include\gdk-pixbuf-2.0 /I$(GlibEtcInstallRoot)\include\pango-1.0 /I$(GlibEtcInstallRoot)\include\atk-1.0 /I$(GlibEtcInstallRoot)\include\cairo /I$(GlibEtcInstallRoot)\include\gio-win32-2.0 /I$(GlibEtcInstallRoot)\include\glib-2.0 /I$(GlibEtcInstallRoot)\lib\glib-2.0\include /I$(GlibEtcInstallRoot)\include /DHAVE_CONFIG_H /DG_DISABLE_SINGLE_INCLUDES /DATK_DISABLE_SINGLE_INCLUDES /DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES /DGTK_DISABLE_SINGLE_INCLUDES /D_USE_MATH_DEFINES /DINCLUDE_IM_am_et /DINCLUDE_IM_cedilla /DINCLUDE_IM_cyrillic_translit /DINCLUDE_IM_ime /DINCLUDE_IM_inuktitut /DINCLUDE_IM_ipa /DINCLUDE_IM_multipress /DINCLUDE_IM_thai /DINCLUDE_IM_ti_er /DINCLUDE_IM_ti_et /DINCLUDE_IM_viqr /DGTK_COMPILATION /DG_LOG_DOMAIN=\"Gtk\" /DGTK_HOST=\"i686-pc-vs$(VSVer)\" /DGTK_PRINT_BACKENDS=\"file\" /DGTK_PRINT_BACKEND_ENABLE_UNSUPPORTED /D$(GtkIncludedImmodulesDefines) /DGTK_LIBDIR=\"$(GtkDummyPrefix)/lib\" /DGTK_DATADIR=\"$(GtkDummyPrefix)/share\" /DGTK_DATA_PREFIX=\"$(GtkDummyPrefix)\" /DGTK_SYSCONFDIR=\"$(GtkDummyPrefix)/etc\" /DMULTIPRESS_CONFDIR=\"$(GtkDummyPrefix)/etc/gtk-$(ApiVersion)\" /DMULTIPRESS_LOCALEDIR=\"$(GtkDummyPrefix)/share/locale\" /DGTK_VERSION=\"$(GtkVersion)\" /DGTK_BINARY_VERSION=\"$(GtkBinaryVersion)\" /DGDK_DISABLE_DEPRECATED /DISOLATION_AWARE_ENABLED ..\..\..\gtk\gtktypefuncs.preproc.c > ..\..\..\gtk\gtktypefuncs.combined.c

|
||||
$(PythonDir)\python ..\gentypefuncs.py ..\..\..\gtk\gtktypefuncs.c ..\..\..\gtk\gtktypefuncs.combined.c

|
||||
del ..\..\..\gtk\gtktypefuncs.combined.c ..\..\..\gtk\gtktypefuncs.preproc.c

|
||||
"
|
||||
/>
|
||||
<UserMacro
|
||||
Name="GenerateTypeFuncsX64"
|
||||
Value="
|
||||
echo #undef GTK_COMPILATION > ..\..\..\gtk\gtktypefuncs.preproc.c

|
||||
echo #include "gtkx.h" >> ..\..\..\gtk\gtktypefuncs.preproc.c

|
||||
cl /EP /I..\..\..\gtk /I..\..\..\gdk /I..\..\..\gdk\win32 /I..\..\.. /I$(GlibEtcInstallRoot)\include\gdk-pixbuf-2.0 /I$(GlibEtcInstallRoot)\include\pango-1.0 /I$(GlibEtcInstallRoot)\include\atk-1.0 /I$(GlibEtcInstallRoot)\include\cairo /I$(GlibEtcInstallRoot)\include\gio-win32-2.0 /I$(GlibEtcInstallRoot)\include\glib-2.0 /I$(GlibEtcInstallRoot)\lib\glib-2.0\include /I$(GlibEtcInstallRoot)\include /DHAVE_CONFIG_H /DG_DISABLE_SINGLE_INCLUDES /DATK_DISABLE_SINGLE_INCLUDES /DGDK_PIXBUF_DISABLE_SINGLE_INCLUDES /DGTK_DISABLE_SINGLE_INCLUDES /D_USE_MATH_DEFINES /DINCLUDE_IM_am_et /DINCLUDE_IM_cedilla /DINCLUDE_IM_cyrillic_translit /DINCLUDE_IM_ime /DINCLUDE_IM_inuktitut /DINCLUDE_IM_ipa /DINCLUDE_IM_multipress /DINCLUDE_IM_thai /DINCLUDE_IM_ti_er /DINCLUDE_IM_ti_et /DINCLUDE_IM_viqr /DGTK_COMPILATION /DG_LOG_DOMAIN=\"Gtk\" /DGTK_HOST=\"i686-pc-vs$(VSVer)\" /DGTK_PRINT_BACKENDS=\"file\" /DGTK_PRINT_BACKEND_ENABLE_UNSUPPORTED /D$(GtkIncludedImmodulesDefines) /DGTK_LIBDIR=\"$(GtkDummyPrefix)/lib\" /DGTK_DATADIR=\"$(GtkDummyPrefix)/share\" /DGTK_DATA_PREFIX=\"$(GtkDummyPrefix)\" /DGTK_SYSCONFDIR=\"$(GtkDummyPrefix)/etc\" /DMULTIPRESS_CONFDIR=\"$(GtkDummyPrefix)/etc/gtk-$(ApiVersion)\" /DMULTIPRESS_LOCALEDIR=\"$(GtkDummyPrefix)/share/locale\" /DGTK_VERSION=\"$(GtkVersion)\" /DGTK_BINARY_VERSION=\"$(GtkBinaryVersion)\" /DGDK_DISABLE_DEPRECATED /DISOLATION_AWARE_ENABLED ..\..\..\gtk\gtktypefuncs.preproc.c > ..\..\..\gtk\gtktypefuncs.combined.c

|
||||
$(PythonDirX64)\python ..\gentypefuncs.py ..\..\..\gtk\gtktypefuncs.c ..\..\..\gtk\gtktypefuncs.combined.c

|
||||
del ..\..\..\gtk\gtktypefuncs.combined.c ..\..\..\gtk\gtktypefuncs.preproc.c

|
||||
"
|
||||
/>
|
||||
</VisualStudioPropertySheet>
|
||||
|
||||
+61
-11
@@ -9,9 +9,9 @@
|
||||
# set GTK_BINARY_AGE and GTK_INTERFACE_AGE to 0.
|
||||
|
||||
m4_define([gtk_major_version], [3])
|
||||
m4_define([gtk_minor_version], [22])
|
||||
m4_define([gtk_micro_version], [22])
|
||||
m4_define([gtk_interface_age], [22])
|
||||
m4_define([gtk_minor_version], [23])
|
||||
m4_define([gtk_micro_version], [1])
|
||||
m4_define([gtk_interface_age], [0])
|
||||
m4_define([gtk_binary_age],
|
||||
[m4_eval(100 * gtk_minor_version + gtk_micro_version)])
|
||||
m4_define([gtk_version],
|
||||
@@ -54,17 +54,17 @@ m4_define([glib_min_required_version], m4_join([_], [GLIB_VERSION], glib_require
|
||||
m4_define([glib_max_allowed_version], m4_join([_], [GLIB_VERSION], glib_required_major, glib_max_allowed_minor))
|
||||
GLIB_VERSION_CFLAGS="-DGLIB_MIN_REQUIRED_VERSION=glib_min_required_version -DGLIB_MAX_ALLOWED_VERSION=glib_max_allowed_version"
|
||||
|
||||
m4_define([pango_required_version], [1.37.3])
|
||||
m4_define([pango_required_version], [1.41.0])
|
||||
m4_define([atk_required_version], [2.15.1])
|
||||
m4_define([cairo_required_version], [1.14.0])
|
||||
m4_define([gdk_pixbuf_required_version], [2.30.0])
|
||||
m4_define([introspection_required_version], [1.39.0])
|
||||
m4_define([wayland_required_version], [1.9.91])
|
||||
m4_define([wayland_protocols_required_version], [1.9])
|
||||
m4_define([wayland_protocols_required_version], [1.12])
|
||||
m4_define([mirclient_required_version], [0.22.0])
|
||||
m4_define([mircookie_required_version], [0.17.0])
|
||||
m4_define([epoxy_required_version], [1.0])
|
||||
m4_define([cloudproviders_required_version], [0.2.0])
|
||||
m4_define([epoxy_required_version], [1.4])
|
||||
m4_define([cloudproviders_required_version], [0.2.5])
|
||||
GLIB_REQUIRED_VERSION=glib_required_version
|
||||
PANGO_REQUIRED_VERSION=pango_required_version
|
||||
ATK_REQUIRED_VERSION=atk_required_version
|
||||
@@ -459,6 +459,7 @@ if test "$enable_wayland_backend" = "yes"; then
|
||||
GDK_BACKENDS="$GDK_BACKENDS wayland"
|
||||
GDK_WINDOWING="$GDK_WINDOWING
|
||||
#define GDK_WINDOWING_WAYLAND"
|
||||
backend_immodules="$backend_immodules,wayland"
|
||||
WAYLAND_PACKAGES="$WAYLAND_DEPENDENCIES"
|
||||
AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no])
|
||||
AS_IF([test "x$WAYLAND_SCANNER" = "xno"],
|
||||
@@ -818,7 +819,13 @@ LIBS=$gtk_save_LIBS
|
||||
|
||||
AC_CHECK_HEADERS(linux/memfd.h,
|
||||
AC_DEFINE(HAVE_LINUX_MEMFD_H, 1,
|
||||
[Define to 1 if memfd.h is available]))
|
||||
[Define to 1 if linux/memfd.h is available]))
|
||||
AC_CHECK_HEADERS(linux/input.h,
|
||||
AC_DEFINE(HAVE_LINUX_INPUT_H, 1,
|
||||
[Define to 1 if linux/input.h is available]))
|
||||
AC_CHECK_HEADERS(dev/evdev/input.h,
|
||||
AC_DEFINE(HAVE_DEV_EVDEV_INPUT_H, 1,
|
||||
[Define to 1 if dev/evdev/input.h is available]))
|
||||
AC_CHECK_HEADERS(sys/mman.h,
|
||||
AC_DEFINE(HAVE_SYS_MMAN_H, 1,
|
||||
[Define to 1 if mman.h is available]))
|
||||
@@ -990,6 +997,7 @@ AM_CONDITIONAL(INCLUDE_IM_TI_ER, [test x"$INCLUDE_ti_er" = xyes])
|
||||
AM_CONDITIONAL(INCLUDE_IM_TI_ET, [test x"$INCLUDE_ti_et" = xyes])
|
||||
AM_CONDITIONAL(INCLUDE_IM_VIQR, [test x"$INCLUDE_viqr" = xyes])
|
||||
AM_CONDITIONAL(INCLUDE_IM_XIM, [test x"$INCLUDE_xim" = xyes])
|
||||
AM_CONDITIONAL(INCLUDE_IM_WAYLAND, [test x"$INCLUDE_wayland" = xyes])
|
||||
|
||||
# Checks to see whether we should include mediaLib
|
||||
# support.
|
||||
@@ -1426,10 +1434,48 @@ else
|
||||
X11_PREFIX="$ac_default_prefix"
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(win32-gles,
|
||||
[AS_HELP_STRING([--enable-win32-gles],
|
||||
[enable OpenGL ES rendering in Win32 backend, disabled by default])],
|
||||
[win32_gles=yes],
|
||||
[win32_gles=no])
|
||||
|
||||
if test x"$enable_win32_backend" = xyes; then
|
||||
AC_MSG_CHECKING(WGL support in epoxy)
|
||||
WGL_SUPPORT="`$PKG_CONFIG --variable=epoxy_has_wgl epoxy`"
|
||||
if test x"$WGL_SUPPORT" = x1; then
|
||||
AC_MSG_RESULT([supported])
|
||||
else
|
||||
AC_MSG_ERROR([
|
||||
*** epoxy was not built with WGL support or epoxy version is too old.
|
||||
*** WGL support in epoxy is enabled by default for all Windows builds,
|
||||
*** and is used by GTK+ uncondititonally. If it is not there, then
|
||||
*** something is very wrong.
|
||||
])
|
||||
fi
|
||||
if test x"$win32_gles" = xyes; then
|
||||
AC_MSG_CHECKING(EGL support in epoxy)
|
||||
EGL_SUPPORT="`$PKG_CONFIG --variable=epoxy_has_egl epoxy`"
|
||||
if test x"$EGL_SUPPORT" = x1; then
|
||||
AC_MSG_RESULT([supported])
|
||||
else
|
||||
AC_MSG_ERROR([
|
||||
*** epoxy was not built with EGL support or epoxy version is too old.
|
||||
*** EGL support in epoxy is disabled by default in Windows builds,
|
||||
*** you might need to rebuild epoxy with explicit --enable-egl=yes.
|
||||
*** EGL support is needed for OpenGL ES rendering.
|
||||
])
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(WIN32_GLES, test x"$platform_win32" = xyes -a x"$win32_gles" = xyes)
|
||||
|
||||
GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
|
||||
ATK_PREFIX="`$PKG_CONFIG --variable=prefix atk`"
|
||||
PANGO_PREFIX="`$PKG_CONFIG --variable=prefix pango`"
|
||||
CAIRO_PREFIX="`$PKG_CONFIG --variable=prefix cairo`"
|
||||
ISO_CODES_PREFIX="`$PKG_CONFIG --variable=prefix iso-codes`"
|
||||
|
||||
AC_SUBST(GTK_PACKAGES)
|
||||
AC_SUBST(GTK_PRIVATE_PACKAGES)
|
||||
@@ -1443,6 +1489,7 @@ AC_SUBST(GLIB_PREFIX)
|
||||
AC_SUBST(ATK_PREFIX)
|
||||
AC_SUBST(PANGO_PREFIX)
|
||||
AC_SUBST(CAIRO_PREFIX)
|
||||
AC_SUBST(ISO_CODES_PREFIX)
|
||||
|
||||
AC_SUBST(GTK_DEBUG_FLAGS)
|
||||
AC_SUBST(GTK_XIM_FLAGS)
|
||||
@@ -1738,6 +1785,10 @@ PKG_CHECK_MODULES(FONTDEMO, harfbuzz >= 0.9 pangoft2, build_font_demo=yes, build
|
||||
AC_SUBST(FONTDEMO_CFLAGS)
|
||||
AC_SUBST(FONTDEMO_LIBS)
|
||||
AM_CONDITIONAL(BUILD_FONT_DEMO, [ test "x$build_font_demo" = xyes ])
|
||||
if test "x$build_font_demo" = xyes; then
|
||||
AC_DEFINE([HAVE_HARFBUZZ], 1, [defines whether we have HarfBuzz])
|
||||
AC_DEFINE([HAVE_PANGOFT], 1, [defines whether we have pangoft2])
|
||||
fi
|
||||
|
||||
##################################################
|
||||
# Checks for gtk-doc and docbook-tools
|
||||
@@ -1820,7 +1871,7 @@ case "$host" in
|
||||
SAVED_CFLAGS="${CFLAGS}"
|
||||
CFLAGS="-fvisibility=hidden"
|
||||
AC_MSG_CHECKING([for -fvisibility=hidden compiler flag])
|
||||
AC_TRY_COMPILE([], [int main (void) { return 0; }],
|
||||
AC_TRY_COMPILE([], [return 0],
|
||||
AC_MSG_RESULT(yes)
|
||||
enable_fvisibility_hidden=yes,
|
||||
AC_MSG_RESULT(no)
|
||||
@@ -1901,8 +1952,7 @@ AC_ARG_ENABLE(Bsymbolic,
|
||||
[SAVED_LDFLAGS="${LDFLAGS}"
|
||||
AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
|
||||
LDFLAGS=-Wl,-Bsymbolic-functions
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
|
||||
[[int main (void) { return 0; }]])],
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[return 0]])],
|
||||
[AC_MSG_RESULT(yes)
|
||||
enable_Bsymbolic=yes],
|
||||
[AC_MSG_RESULT(no)
|
||||
|
||||
@@ -48,6 +48,7 @@ demos_base = \
|
||||
offscreen_window2.c \
|
||||
overlay.c \
|
||||
overlay2.c \
|
||||
paint.c \
|
||||
panes.c \
|
||||
pickers.c \
|
||||
pixbufs.c \
|
||||
|
||||
@@ -151,7 +151,7 @@ query_for_toplevel (GdkScreen *screen,
|
||||
|
||||
g_object_unref (cursor);
|
||||
gtk_widget_destroy (popup);
|
||||
gdk_flush (); /* Really release the grab */
|
||||
gdk_display_flush (display); /* Really release the grab */
|
||||
|
||||
return toplevel;
|
||||
}
|
||||
|
||||
@@ -177,6 +177,7 @@
|
||||
<file>offscreen_window2.c</file>
|
||||
<file>overlay.c</file>
|
||||
<file>overlay2.c</file>
|
||||
<file>paint.c</file>
|
||||
<file>pagesetup.c</file>
|
||||
<file>panes.c</file>
|
||||
<file>pickers.c</file>
|
||||
|
||||
+203
-112
@@ -9,163 +9,254 @@
|
||||
|
||||
#include "gtkfishbowl.h"
|
||||
|
||||
GtkWidget *allow_changes;
|
||||
const char *const css =
|
||||
".blurred-button {"
|
||||
" box-shadow: 0px 0px 5px 10px rgba(0, 0, 0, 0.5);"
|
||||
"}"
|
||||
"";
|
||||
|
||||
#define N_STATS 5
|
||||
char **icon_names = NULL;
|
||||
gsize n_icon_names = 0;
|
||||
|
||||
#define STATS_UPDATE_TIME G_USEC_PER_SEC
|
||||
static void
|
||||
init_icon_names (GtkIconTheme *theme)
|
||||
{
|
||||
GPtrArray *icons;
|
||||
GList *l, *icon_list;
|
||||
|
||||
typedef struct _Stats Stats;
|
||||
struct _Stats {
|
||||
gint64 last_stats;
|
||||
gint64 last_frame;
|
||||
gint last_suggestion;
|
||||
guint frame_counter_max;
|
||||
if (icon_names)
|
||||
return;
|
||||
|
||||
guint stats_index;
|
||||
guint frame_counter[N_STATS];
|
||||
guint item_counter[N_STATS];
|
||||
icon_list = gtk_icon_theme_list_icons (theme, NULL);
|
||||
icons = g_ptr_array_new ();
|
||||
|
||||
for (l = icon_list; l; l = l->next)
|
||||
{
|
||||
if (g_str_has_suffix (l->data, "symbolic"))
|
||||
continue;
|
||||
|
||||
g_ptr_array_add (icons, g_strdup (l->data));
|
||||
}
|
||||
|
||||
n_icon_names = icons->len;
|
||||
g_ptr_array_add (icons, NULL); /* NULL-terminate the array */
|
||||
icon_names = (char **) g_ptr_array_free (icons, FALSE);
|
||||
|
||||
/* don't free strings, we assigned them to the array */
|
||||
g_list_free_full (icon_list, g_free);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_random_icon_name (GtkIconTheme *theme)
|
||||
{
|
||||
init_icon_names (theme);
|
||||
|
||||
return icon_names[g_random_int_range(0, n_icon_names)];
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
create_icon (void)
|
||||
{
|
||||
GtkWidget *image;
|
||||
|
||||
image = gtk_image_new_from_icon_name (get_random_icon_name (gtk_icon_theme_get_default ()), GTK_ICON_SIZE_DND);
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
create_button (void)
|
||||
{
|
||||
return gtk_button_new_with_label ("Button");
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
create_blurred_button (void)
|
||||
{
|
||||
GtkWidget *w = gtk_button_new ();
|
||||
|
||||
gtk_style_context_add_class (gtk_widget_get_style_context (w), "blurred-button");
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
create_font_button (void)
|
||||
{
|
||||
return gtk_font_button_new ();
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
create_level_bar (void)
|
||||
{
|
||||
GtkWidget *w = gtk_level_bar_new_for_interval (0, 100);
|
||||
|
||||
gtk_level_bar_set_value (GTK_LEVEL_BAR (w), 50);
|
||||
|
||||
/* Force them to be a bit larger */
|
||||
gtk_widget_set_size_request (w, 200, -1);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
create_spinner (void)
|
||||
{
|
||||
GtkWidget *w = gtk_spinner_new ();
|
||||
|
||||
gtk_spinner_start (GTK_SPINNER (w));
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
create_spinbutton (void)
|
||||
{
|
||||
GtkWidget *w = gtk_spin_button_new_with_range (0, 10, 1);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
create_label (void)
|
||||
{
|
||||
GtkWidget *w = gtk_label_new ("pLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.");
|
||||
|
||||
gtk_label_set_line_wrap (GTK_LABEL (w), TRUE);
|
||||
gtk_label_set_max_width_chars (GTK_LABEL (w), 100);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static GtkWidget *
|
||||
create_gears (void)
|
||||
{
|
||||
GtkWidget *w = gtk_gears_new ();
|
||||
|
||||
gtk_widget_set_size_request (w, 100, 100);
|
||||
|
||||
return w;
|
||||
}
|
||||
#endif
|
||||
|
||||
static GtkWidget *
|
||||
create_switch (void)
|
||||
{
|
||||
GtkWidget *w = gtk_switch_new ();
|
||||
|
||||
gtk_switch_set_state (GTK_SWITCH (w), TRUE);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
static const struct {
|
||||
const char *name;
|
||||
GtkWidget * (*create_func) (void);
|
||||
} widget_types[] = {
|
||||
{ "Icon", create_icon },
|
||||
{ "Button", create_button },
|
||||
{ "Blurbutton", create_blurred_button },
|
||||
{ "Fontbutton", create_font_button },
|
||||
{ "Levelbar", create_level_bar },
|
||||
{ "Label", create_label },
|
||||
{ "Spinner", create_spinner },
|
||||
{ "Spinbutton", create_spinbutton },
|
||||
// { "Gears", create_gears },
|
||||
{ "Switch", create_switch },
|
||||
};
|
||||
|
||||
static Stats *
|
||||
get_stats (GtkWidget *widget)
|
||||
{
|
||||
static GQuark stats_quark = 0;
|
||||
Stats *stats;
|
||||
|
||||
if (G_UNLIKELY (stats_quark == 0))
|
||||
stats_quark = g_quark_from_static_string ("stats");
|
||||
|
||||
stats = g_object_get_qdata (G_OBJECT (widget), stats_quark);
|
||||
if (stats == NULL)
|
||||
{
|
||||
stats = g_new0 (Stats, 1);
|
||||
g_object_set_qdata_full (G_OBJECT (widget), stats_quark, stats, g_free);
|
||||
stats->last_frame = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (widget));
|
||||
stats->last_stats = stats->last_frame;
|
||||
}
|
||||
|
||||
return stats;
|
||||
}
|
||||
static int selected_widget_type = -1;
|
||||
static const int N_WIDGET_TYPES = G_N_ELEMENTS (widget_types);
|
||||
|
||||
static void
|
||||
do_stats (GtkWidget *widget,
|
||||
GtkWidget *info_label,
|
||||
gint *suggested_change)
|
||||
set_widget_type (GtkFishbowl *fishbowl,
|
||||
int widget_type_index)
|
||||
{
|
||||
Stats *stats;
|
||||
gint64 frame_time;
|
||||
GtkWidget *window, *headerbar;
|
||||
|
||||
stats = get_stats (widget);
|
||||
frame_time = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (widget));
|
||||
if (widget_type_index == selected_widget_type)
|
||||
return;
|
||||
|
||||
if (stats->last_stats + STATS_UPDATE_TIME < frame_time)
|
||||
{
|
||||
char *new_label;
|
||||
guint i, n_frames;
|
||||
selected_widget_type = widget_type_index;
|
||||
|
||||
n_frames = 0;
|
||||
for (i = 0; i < N_STATS; i++)
|
||||
{
|
||||
n_frames += stats->frame_counter[i];
|
||||
}
|
||||
|
||||
new_label = g_strdup_printf ("icons - %.1f fps",
|
||||
(double) G_USEC_PER_SEC * n_frames
|
||||
/ (N_STATS * STATS_UPDATE_TIME));
|
||||
gtk_label_set_label (GTK_LABEL (info_label), new_label);
|
||||
g_free (new_label);
|
||||
gtk_fishbowl_set_creation_func (fishbowl,
|
||||
widget_types[selected_widget_type].create_func);
|
||||
|
||||
if (stats->frame_counter[stats->stats_index] >= 19 * stats->frame_counter_max / 20)
|
||||
{
|
||||
if (stats->last_suggestion > 0)
|
||||
stats->last_suggestion *= 2;
|
||||
else
|
||||
stats->last_suggestion = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (stats->last_suggestion < 0)
|
||||
stats->last_suggestion--;
|
||||
else
|
||||
stats->last_suggestion = -1;
|
||||
stats->last_suggestion = MAX (stats->last_suggestion, 1 - (int) stats->item_counter[stats->stats_index]);
|
||||
}
|
||||
window = gtk_widget_get_toplevel (GTK_WIDGET (fishbowl));
|
||||
headerbar = gtk_window_get_titlebar (GTK_WINDOW (window));
|
||||
gtk_header_bar_set_title (GTK_HEADER_BAR (headerbar),
|
||||
widget_types[selected_widget_type].name);
|
||||
}
|
||||
|
||||
stats->stats_index = (stats->stats_index + 1) % N_STATS;
|
||||
stats->frame_counter[stats->stats_index] = 0;
|
||||
stats->item_counter[stats->stats_index] = stats->item_counter[(stats->stats_index + N_STATS - 1) % N_STATS];
|
||||
stats->last_stats = frame_time;
|
||||
|
||||
if (suggested_change)
|
||||
*suggested_change = stats->last_suggestion;
|
||||
else
|
||||
stats->last_suggestion = 0;
|
||||
}
|
||||
void
|
||||
next_button_clicked_cb (GtkButton *source,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkFishbowl *fishbowl = user_data;
|
||||
int new_index;
|
||||
|
||||
if (selected_widget_type + 1 >= N_WIDGET_TYPES)
|
||||
new_index = 0;
|
||||
else
|
||||
{
|
||||
if (suggested_change)
|
||||
*suggested_change = 0;
|
||||
}
|
||||
new_index = selected_widget_type + 1;
|
||||
|
||||
stats->last_frame = frame_time;
|
||||
stats->frame_counter[stats->stats_index]++;
|
||||
stats->frame_counter_max = MAX (stats->frame_counter_max, stats->frame_counter[stats->stats_index]);
|
||||
set_widget_type (fishbowl, new_index);
|
||||
}
|
||||
|
||||
static void
|
||||
stats_update (GtkWidget *widget)
|
||||
void
|
||||
prev_button_clicked_cb (GtkButton *source,
|
||||
gpointer user_data)
|
||||
{
|
||||
Stats *stats;
|
||||
GtkFishbowl *fishbowl = user_data;
|
||||
int new_index;
|
||||
|
||||
stats = get_stats (widget);
|
||||
if (selected_widget_type - 1 < 0)
|
||||
new_index = N_WIDGET_TYPES - 1;
|
||||
else
|
||||
new_index = selected_widget_type - 1;
|
||||
|
||||
stats->item_counter[stats->stats_index] = gtk_fishbowl_get_count (GTK_FISHBOWL (widget));
|
||||
set_widget_type (fishbowl, new_index);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
move_fish (GtkWidget *bowl,
|
||||
GdkFrameClock *frame_clock,
|
||||
gpointer info_label)
|
||||
{
|
||||
gint suggested_change = 0;
|
||||
|
||||
do_stats (bowl,
|
||||
info_label,
|
||||
!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (allow_changes)) ? &suggested_change : NULL);
|
||||
|
||||
gtk_fishbowl_set_count (GTK_FISHBOWL (bowl),
|
||||
gtk_fishbowl_get_count (GTK_FISHBOWL (bowl)) + suggested_change);
|
||||
stats_update (bowl);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_fishbowl (GtkWidget *do_widget)
|
||||
{
|
||||
static GtkWidget *window = NULL;
|
||||
static GtkCssProvider *provider = NULL;
|
||||
|
||||
if (provider == NULL)
|
||||
{
|
||||
provider = gtk_css_provider_new ();
|
||||
gtk_css_provider_load_from_data (provider, css, -1, NULL);
|
||||
gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
|
||||
GTK_STYLE_PROVIDER (provider),
|
||||
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
|
||||
}
|
||||
|
||||
if (!window)
|
||||
{
|
||||
GtkBuilder *builder;
|
||||
GtkWidget *bowl, *info_label;
|
||||
GtkWidget *bowl;
|
||||
|
||||
g_type_ensure (GTK_TYPE_FISHBOWL);
|
||||
|
||||
builder = gtk_builder_new_from_resource ("/fishbowl/fishbowl.ui");
|
||||
gtk_builder_add_callback_symbols (builder,
|
||||
"next_button_clicked_cb", G_CALLBACK (next_button_clicked_cb),
|
||||
"prev_button_clicked_cb", G_CALLBACK (prev_button_clicked_cb),
|
||||
NULL);
|
||||
gtk_builder_connect_signals (builder, NULL);
|
||||
window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
|
||||
bowl = GTK_WIDGET (gtk_builder_get_object (builder, "bowl"));
|
||||
info_label = GTK_WIDGET (gtk_builder_get_object (builder, "info_label"));
|
||||
allow_changes = GTK_WIDGET (gtk_builder_get_object (builder, "changes_allow"));
|
||||
set_widget_type (GTK_FISHBOWL (bowl), 0);
|
||||
gtk_window_set_screen (GTK_WINDOW (window),
|
||||
gtk_widget_get_screen (do_widget));
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
|
||||
gtk_widget_realize (window);
|
||||
gtk_widget_add_tick_callback (bowl, move_fish, info_label, NULL);
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
|
||||
@@ -8,27 +8,76 @@
|
||||
<property name="visible">True</property>
|
||||
<property name="show-close-button">True</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="info_label">
|
||||
<object class="GtkBox">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">icons - 0 fps</property>
|
||||
<style>
|
||||
<class name="linked"/>
|
||||
</style>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="icon-name">pan-start-symbolic</property>
|
||||
<property name="visible">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<signal name="clicked" handler="prev_button_clicked_cb" object="bowl" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="icon-name">pan-end-symbolic</property>
|
||||
<property name="visible">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<signal name="clicked" handler="next_button_clicked_cb" object="bowl" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">fps</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="pack-type">end</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" bind-source="bowl" bind-property="count">0</property>
|
||||
<property name="label" bind-source="bowl" bind-property="framerate"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="pack-type">end</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="label">Icons, </property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="pack-type">end</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" bind-source="bowl" bind-property="count"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="pack-type">end</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkToggleButton" id="changes_allow">
|
||||
<property name="active">False</property>
|
||||
<property name="visible" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean">True</property>
|
||||
<property name="visible" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean"/>
|
||||
<property name="relief">none</property>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
@@ -38,7 +87,7 @@
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="pack-type">end</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
@@ -54,7 +103,7 @@
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="pack-type">end</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
@@ -63,6 +112,7 @@
|
||||
<object class="GtkFishbowl" id="bowl">
|
||||
<property name="visible">True</property>
|
||||
<property name="animating">True</property>
|
||||
<property name="benchmark" bind-source="changes_allow" bind-property="active" bind-flags="invert-boolean">True</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
||||
+280
-147
@@ -26,11 +26,18 @@ typedef struct _GtkFishbowlChild GtkFishbowlChild;
|
||||
|
||||
struct _GtkFishbowlPrivate
|
||||
{
|
||||
GtkFishCreationFunc creation_func;
|
||||
GList *children;
|
||||
guint count;
|
||||
|
||||
gint64 last_frame_time;
|
||||
gint64 update_delay;
|
||||
guint tick_id;
|
||||
|
||||
double framerate;
|
||||
int last_benchmark_change;
|
||||
|
||||
guint benchmark : 1;
|
||||
};
|
||||
|
||||
struct _GtkFishbowlChild
|
||||
@@ -45,7 +52,10 @@ struct _GtkFishbowlChild
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_ANIMATING,
|
||||
PROP_BENCHMARK,
|
||||
PROP_COUNT,
|
||||
PROP_FRAMERATE,
|
||||
PROP_UPDATE_DELAY,
|
||||
NUM_PROPERTIES
|
||||
};
|
||||
|
||||
@@ -56,7 +66,11 @@ G_DEFINE_TYPE_WITH_PRIVATE (GtkFishbowl, gtk_fishbowl, GTK_TYPE_CONTAINER)
|
||||
static void
|
||||
gtk_fishbowl_init (GtkFishbowl *fishbowl)
|
||||
{
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
|
||||
gtk_widget_set_has_window (GTK_WIDGET (fishbowl), FALSE);
|
||||
|
||||
priv->update_delay = G_USEC_PER_SEC;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -73,48 +87,9 @@ gtk_fishbowl_new (void)
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_widget_measure (GtkWidget *widget,
|
||||
GtkOrientation orientation,
|
||||
gint size,
|
||||
gint *minimum,
|
||||
gint *natural,
|
||||
gint *minimum_baseline,
|
||||
gint *natural_baseline)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_WIDGET (widget));
|
||||
g_return_if_fail (size >= -1);
|
||||
|
||||
if (orientation == GTK_ORIENTATION_HORIZONTAL)
|
||||
{
|
||||
if (size < 0)
|
||||
gtk_widget_get_preferred_width (widget, minimum, natural);
|
||||
else
|
||||
gtk_widget_get_preferred_width_for_height (widget, size, minimum, natural);
|
||||
|
||||
if (minimum_baseline)
|
||||
*minimum_baseline = -1;
|
||||
if (natural_baseline)
|
||||
*natural_baseline = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_widget_get_preferred_height_and_baseline_for_width (widget,
|
||||
size,
|
||||
minimum,
|
||||
natural,
|
||||
minimum_baseline,
|
||||
natural_baseline);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_fishbowl_measure (GtkWidget *widget,
|
||||
GtkOrientation orientation,
|
||||
int for_size,
|
||||
int *minimum,
|
||||
int *natural,
|
||||
int *minimum_baseline,
|
||||
int *natural_baseline)
|
||||
gtk_fishbowl_get_preferred_width (GtkWidget *widget,
|
||||
int *minimum,
|
||||
int *natural)
|
||||
{
|
||||
GtkFishbowl *fishbowl = GTK_FISHBOWL (widget);
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
@@ -132,47 +107,42 @@ gtk_fishbowl_measure (GtkWidget *widget,
|
||||
if (!gtk_widget_get_visible (child->widget))
|
||||
continue;
|
||||
|
||||
gtk_widget_measure (child->widget, orientation, -1, &child_min, &child_nat, NULL, NULL);
|
||||
gtk_widget_get_preferred_width (child->widget, &child_min, &child_nat);
|
||||
|
||||
*minimum = MAX (*minimum, child_min);
|
||||
*natural = MAX (*natural, child_nat);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_fishbowl_get_preferred_width (GtkWidget *widget,
|
||||
int *minimum,
|
||||
int *natural)
|
||||
{
|
||||
gtk_fishbowl_measure (widget, GTK_ORIENTATION_HORIZONTAL, -1, minimum, natural, NULL, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_fishbowl_get_preferred_height (GtkWidget *widget,
|
||||
int *minimum,
|
||||
int *natural)
|
||||
{
|
||||
gtk_fishbowl_measure (widget, GTK_ORIENTATION_VERTICAL, -1, minimum, natural, NULL, NULL);
|
||||
}
|
||||
GtkFishbowl *fishbowl = GTK_FISHBOWL (widget);
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
GtkFishbowlChild *child;
|
||||
GList *children;
|
||||
gint child_min, child_nat;
|
||||
|
||||
static void
|
||||
gtk_fishbowl_get_preferred_width_for_height (GtkWidget *widget,
|
||||
int for_size,
|
||||
int *minimum,
|
||||
int *natural)
|
||||
{
|
||||
gtk_fishbowl_measure (widget, GTK_ORIENTATION_HORIZONTAL, for_size, minimum, natural, NULL, NULL);
|
||||
}
|
||||
*minimum = 0;
|
||||
*natural = 0;
|
||||
|
||||
static void
|
||||
gtk_fishbowl_get_preferred_height_and_baseline_for_width (GtkWidget *widget,
|
||||
int for_size,
|
||||
int *minimum,
|
||||
int *natural,
|
||||
int *minimum_baseline,
|
||||
int *natural_baseline)
|
||||
{
|
||||
gtk_fishbowl_measure (widget, GTK_ORIENTATION_VERTICAL, for_size, minimum, natural, minimum_baseline, natural_baseline);
|
||||
for (children = priv->children; children; children = children->next)
|
||||
{
|
||||
int min_width;
|
||||
|
||||
child = children->data;
|
||||
|
||||
if (!gtk_widget_get_visible (child->widget))
|
||||
continue;
|
||||
|
||||
gtk_widget_get_preferred_width (child->widget, &min_width, NULL);
|
||||
gtk_widget_get_preferred_height_for_width (child->widget, min_width, &child_min, &child_nat);
|
||||
|
||||
*minimum = MAX (*minimum, child_min);
|
||||
*natural = MAX (*natural, child_nat);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -186,8 +156,6 @@ gtk_fishbowl_size_allocate (GtkWidget *widget,
|
||||
GtkRequisition child_requisition;
|
||||
GList *children;
|
||||
|
||||
gtk_widget_set_allocation (widget, allocation);
|
||||
|
||||
for (children = priv->children; children; children = children->next)
|
||||
{
|
||||
child = children->data;
|
||||
@@ -244,7 +212,7 @@ gtk_fishbowl_remove (GtkContainer *container,
|
||||
GtkFishbowl *fishbowl = GTK_FISHBOWL (container);
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
GtkFishbowlChild *child;
|
||||
GtkWidget *widget_container = GTK_WIDGET (container);
|
||||
GtkWidget *widget_bowl = GTK_WIDGET (fishbowl);
|
||||
GList *children;
|
||||
|
||||
for (children = priv->children; children; children = children->next)
|
||||
@@ -261,8 +229,8 @@ gtk_fishbowl_remove (GtkContainer *container,
|
||||
g_list_free (children);
|
||||
g_free (child);
|
||||
|
||||
if (was_visible && gtk_widget_get_visible (widget_container))
|
||||
gtk_widget_queue_resize (widget_container);
|
||||
if (was_visible && gtk_widget_get_visible (widget_bowl))
|
||||
gtk_widget_queue_resize (widget_bowl);
|
||||
|
||||
priv->count--;
|
||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_COUNT]);
|
||||
@@ -271,6 +239,7 @@ gtk_fishbowl_remove (GtkContainer *container,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gtk_fishbowl_forall (GtkContainer *container,
|
||||
gboolean include_internals,
|
||||
@@ -295,29 +264,6 @@ gtk_fishbowl_forall (GtkContainer *container,
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_fishbowl_draw (GtkWidget *widget,
|
||||
cairo_t *cr)
|
||||
{
|
||||
GtkFishbowl *fishbowl = GTK_FISHBOWL (widget);
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
GtkFishbowlChild *child;
|
||||
GList *list;
|
||||
|
||||
for (list = priv->children;
|
||||
list;
|
||||
list = list->next)
|
||||
{
|
||||
child = list->data;
|
||||
|
||||
gtk_container_propagate_draw (GTK_CONTAINER (fishbowl),
|
||||
child->widget,
|
||||
cr);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_fishbowl_dispose (GObject *object)
|
||||
{
|
||||
@@ -343,10 +289,18 @@ gtk_fishbowl_set_property (GObject *object,
|
||||
gtk_fishbowl_set_animating (fishbowl, g_value_get_boolean (value));
|
||||
break;
|
||||
|
||||
case PROP_BENCHMARK:
|
||||
gtk_fishbowl_set_benchmark (fishbowl, g_value_get_boolean (value));
|
||||
break;
|
||||
|
||||
case PROP_COUNT:
|
||||
gtk_fishbowl_set_count (fishbowl, g_value_get_uint (value));
|
||||
break;
|
||||
|
||||
case PROP_UPDATE_DELAY:
|
||||
gtk_fishbowl_set_update_delay (fishbowl, g_value_get_int64 (value));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@@ -367,10 +321,22 @@ gtk_fishbowl_get_property (GObject *object,
|
||||
g_value_set_boolean (value, gtk_fishbowl_get_animating (fishbowl));
|
||||
break;
|
||||
|
||||
case PROP_BENCHMARK:
|
||||
g_value_set_boolean (value, gtk_fishbowl_get_benchmark (fishbowl));
|
||||
break;
|
||||
|
||||
case PROP_COUNT:
|
||||
g_value_set_uint (value, gtk_fishbowl_get_count (fishbowl));
|
||||
break;
|
||||
|
||||
case PROP_FRAMERATE:
|
||||
g_value_set_double (value, gtk_fishbowl_get_framerate (fishbowl));
|
||||
break;
|
||||
|
||||
case PROP_UPDATE_DELAY:
|
||||
g_value_set_int64 (value, gtk_fishbowl_get_update_delay (fishbowl));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
@@ -390,10 +356,7 @@ gtk_fishbowl_class_init (GtkFishbowlClass *klass)
|
||||
|
||||
widget_class->get_preferred_width = gtk_fishbowl_get_preferred_width;
|
||||
widget_class->get_preferred_height = gtk_fishbowl_get_preferred_height;
|
||||
widget_class->get_preferred_width_for_height = gtk_fishbowl_get_preferred_width_for_height;
|
||||
widget_class->get_preferred_height_and_baseline_for_width = gtk_fishbowl_get_preferred_height_and_baseline_for_width;
|
||||
widget_class->size_allocate = gtk_fishbowl_size_allocate;
|
||||
widget_class->draw = gtk_fishbowl_draw;
|
||||
|
||||
container_class->add = gtk_fishbowl_add;
|
||||
container_class->remove = gtk_fishbowl_remove;
|
||||
@@ -406,13 +369,36 @@ gtk_fishbowl_class_init (GtkFishbowlClass *klass)
|
||||
FALSE,
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
props[PROP_BENCHMARK] =
|
||||
g_param_spec_boolean ("benchmark",
|
||||
"Benchmark",
|
||||
"Adapt the count property to hit the maximum framerate",
|
||||
FALSE,
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
props[PROP_COUNT] =
|
||||
g_param_spec_uint ("count",
|
||||
"Count",
|
||||
"Number of widgets",
|
||||
0, G_MAXUINT,
|
||||
0,
|
||||
G_PARAM_READABLE);
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
props[PROP_FRAMERATE] =
|
||||
g_param_spec_double ("framerate",
|
||||
"Framerate",
|
||||
"Framerate of this widget in frames per second",
|
||||
0, G_MAXDOUBLE,
|
||||
0,
|
||||
G_PARAM_READABLE);
|
||||
|
||||
props[PROP_UPDATE_DELAY] =
|
||||
g_param_spec_int64 ("update-delay",
|
||||
"Update delay",
|
||||
"Number of usecs between updates",
|
||||
0, G_MAXINT64,
|
||||
G_USEC_PER_SEC,
|
||||
G_PARAM_READWRITE);
|
||||
|
||||
g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
|
||||
}
|
||||
@@ -425,72 +411,60 @@ gtk_fishbowl_get_count (GtkFishbowl *fishbowl)
|
||||
return priv->count;
|
||||
}
|
||||
|
||||
char **icon_names = NULL;
|
||||
gsize n_icon_names = 0;
|
||||
|
||||
static void
|
||||
init_icon_names (GtkIconTheme *theme)
|
||||
{
|
||||
GPtrArray *icons;
|
||||
GList *l, *icon_list;
|
||||
|
||||
if (icon_names)
|
||||
return;
|
||||
|
||||
icon_list = gtk_icon_theme_list_icons (theme, NULL);
|
||||
icons = g_ptr_array_new ();
|
||||
|
||||
for (l = icon_list; l; l = l->next)
|
||||
{
|
||||
if (g_str_has_suffix (l->data, "symbolic"))
|
||||
continue;
|
||||
|
||||
g_ptr_array_add (icons, g_strdup (l->data));
|
||||
}
|
||||
|
||||
n_icon_names = icons->len;
|
||||
g_ptr_array_add (icons, NULL); /* NULL-terminate the array */
|
||||
icon_names = (char **) g_ptr_array_free (icons, FALSE);
|
||||
|
||||
/* don't free strings, we assigned them to the array */
|
||||
g_list_free_full (icon_list, g_free);
|
||||
}
|
||||
|
||||
static const char *
|
||||
get_random_icon_name (GtkIconTheme *theme)
|
||||
{
|
||||
init_icon_names (theme);
|
||||
|
||||
return icon_names[g_random_int_range(0, n_icon_names)];
|
||||
}
|
||||
|
||||
void
|
||||
gtk_fishbowl_set_count (GtkFishbowl *fishbowl,
|
||||
guint count)
|
||||
{
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
|
||||
if (priv->count == count)
|
||||
return;
|
||||
|
||||
g_object_freeze_notify (G_OBJECT (fishbowl));
|
||||
|
||||
while (priv->count > count)
|
||||
{
|
||||
gtk_container_remove (GTK_CONTAINER (fishbowl),
|
||||
((GtkFishbowlChild *) priv->children->data)->widget);
|
||||
gtk_fishbowl_remove (GTK_CONTAINER (fishbowl), ((GtkFishbowlChild *) priv->children->data)->widget);
|
||||
}
|
||||
|
||||
while (priv->count < count)
|
||||
{
|
||||
GtkWidget *new_widget;
|
||||
|
||||
new_widget = gtk_image_new_from_icon_name (get_random_icon_name (gtk_icon_theme_get_default ()),
|
||||
GTK_ICON_SIZE_DIALOG);
|
||||
|
||||
new_widget = priv->creation_func ();
|
||||
|
||||
gtk_widget_show (new_widget);
|
||||
gtk_container_add (GTK_CONTAINER (fishbowl), new_widget);
|
||||
|
||||
gtk_fishbowl_add (GTK_CONTAINER (fishbowl), new_widget);
|
||||
}
|
||||
|
||||
g_object_thaw_notify (G_OBJECT (fishbowl));
|
||||
}
|
||||
|
||||
gboolean
|
||||
gtk_fishbowl_get_benchmark (GtkFishbowl *fishbowl)
|
||||
{
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
|
||||
return priv->benchmark;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_fishbowl_set_benchmark (GtkFishbowl *fishbowl,
|
||||
gboolean benchmark)
|
||||
{
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
|
||||
if (priv->benchmark == benchmark)
|
||||
return;
|
||||
|
||||
priv->benchmark = benchmark;
|
||||
if (!benchmark)
|
||||
priv->last_benchmark_change = 0;
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_BENCHMARK]);
|
||||
}
|
||||
|
||||
gboolean
|
||||
gtk_fishbowl_get_animating (GtkFishbowl *fishbowl)
|
||||
{
|
||||
@@ -499,6 +473,111 @@ gtk_fishbowl_get_animating (GtkFishbowl *fishbowl)
|
||||
return priv->tick_id != 0;
|
||||
}
|
||||
|
||||
static gint64
|
||||
guess_refresh_interval (GdkFrameClock *frame_clock)
|
||||
{
|
||||
gint64 interval;
|
||||
gint64 i;
|
||||
|
||||
interval = G_MAXINT64;
|
||||
|
||||
for (i = gdk_frame_clock_get_history_start (frame_clock);
|
||||
i < gdk_frame_clock_get_frame_counter (frame_clock);
|
||||
i++)
|
||||
{
|
||||
GdkFrameTimings *t, *before;
|
||||
gint64 ts, before_ts;
|
||||
|
||||
t = gdk_frame_clock_get_timings (frame_clock, i);
|
||||
before = gdk_frame_clock_get_timings (frame_clock, i - 1);
|
||||
if (t == NULL || before == NULL)
|
||||
continue;
|
||||
|
||||
ts = gdk_frame_timings_get_frame_time (t);
|
||||
before_ts = gdk_frame_timings_get_frame_time (before);
|
||||
if (ts == 0 || before_ts == 0)
|
||||
continue;
|
||||
|
||||
interval = MIN (interval, ts - before_ts);
|
||||
}
|
||||
|
||||
if (interval == G_MAXINT64)
|
||||
return 0;
|
||||
|
||||
return interval;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_fishbowl_do_update (GtkFishbowl *fishbowl)
|
||||
{
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
GdkFrameClock *frame_clock;
|
||||
GdkFrameTimings *start, *end;
|
||||
gint64 start_counter, end_counter;
|
||||
gint64 n_frames, expected_frames;
|
||||
gint64 start_timestamp, end_timestamp;
|
||||
gint64 interval;
|
||||
|
||||
frame_clock = gtk_widget_get_frame_clock (GTK_WIDGET (fishbowl));
|
||||
if (frame_clock == NULL)
|
||||
return;
|
||||
|
||||
start_counter = gdk_frame_clock_get_history_start (frame_clock);
|
||||
end_counter = gdk_frame_clock_get_frame_counter (frame_clock);
|
||||
start = gdk_frame_clock_get_timings (frame_clock, start_counter);
|
||||
for (end = gdk_frame_clock_get_timings (frame_clock, end_counter);
|
||||
end_counter > start_counter && end != NULL && !gdk_frame_timings_get_complete (end);
|
||||
end = gdk_frame_clock_get_timings (frame_clock, end_counter))
|
||||
end_counter--;
|
||||
if (end_counter - start_counter < 4)
|
||||
return;
|
||||
|
||||
start_timestamp = gdk_frame_timings_get_presentation_time (start);
|
||||
end_timestamp = gdk_frame_timings_get_presentation_time (end);
|
||||
if (start_timestamp == 0 || end_timestamp == 0)
|
||||
{
|
||||
start_timestamp = gdk_frame_timings_get_frame_time (start);
|
||||
end_timestamp = gdk_frame_timings_get_frame_time (end);
|
||||
}
|
||||
|
||||
n_frames = end_counter - start_counter;
|
||||
priv->framerate = ((double) n_frames) * G_USEC_PER_SEC / (end_timestamp - start_timestamp);
|
||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]);
|
||||
|
||||
if (!priv->benchmark)
|
||||
return;
|
||||
|
||||
interval = gdk_frame_timings_get_refresh_interval (end);
|
||||
if (interval == 0)
|
||||
{
|
||||
interval = guess_refresh_interval (frame_clock);
|
||||
if (interval == 0)
|
||||
return;
|
||||
}
|
||||
expected_frames = round ((double) (end_timestamp - start_timestamp) / interval);
|
||||
|
||||
if (n_frames >= expected_frames)
|
||||
{
|
||||
if (priv->last_benchmark_change > 0)
|
||||
priv->last_benchmark_change *= 2;
|
||||
else
|
||||
priv->last_benchmark_change = 1;
|
||||
}
|
||||
else if (n_frames + 1 < expected_frames)
|
||||
{
|
||||
if (priv->last_benchmark_change < 0)
|
||||
priv->last_benchmark_change--;
|
||||
else
|
||||
priv->last_benchmark_change = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
priv->last_benchmark_change = 0;
|
||||
}
|
||||
|
||||
gtk_fishbowl_set_count (fishbowl, MAX (1, (int) priv->count + priv->last_benchmark_change));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_fishbowl_tick (GtkWidget *widget,
|
||||
GdkFrameClock *frame_clock,
|
||||
@@ -509,9 +588,11 @@ gtk_fishbowl_tick (GtkWidget *widget,
|
||||
GtkFishbowlChild *child;
|
||||
GList *l;
|
||||
gint64 frame_time, elapsed;
|
||||
gboolean do_update;
|
||||
|
||||
frame_time = gdk_frame_clock_get_frame_time (gtk_widget_get_frame_clock (widget));
|
||||
elapsed = frame_time - priv->last_frame_time;
|
||||
do_update = frame_time / priv->update_delay != priv->last_frame_time / priv->update_delay;
|
||||
priv->last_frame_time = frame_time;
|
||||
|
||||
/* last frame was 0, so we're just starting to animate */
|
||||
@@ -550,6 +631,9 @@ gtk_fishbowl_tick (GtkWidget *widget,
|
||||
|
||||
gtk_widget_queue_allocate (widget);
|
||||
|
||||
if (do_update)
|
||||
gtk_fishbowl_do_update (fishbowl);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -574,8 +658,57 @@ gtk_fishbowl_set_animating (GtkFishbowl *fishbowl,
|
||||
priv->last_frame_time = 0;
|
||||
gtk_widget_remove_tick_callback (GTK_WIDGET (fishbowl), priv->tick_id);
|
||||
priv->tick_id = 0;
|
||||
priv->framerate = 0;
|
||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_FRAMERATE]);
|
||||
}
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_ANIMATING]);
|
||||
}
|
||||
|
||||
double
|
||||
gtk_fishbowl_get_framerate (GtkFishbowl *fishbowl)
|
||||
{
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
|
||||
return priv->framerate;
|
||||
}
|
||||
|
||||
gint64
|
||||
gtk_fishbowl_get_update_delay (GtkFishbowl *fishbowl)
|
||||
{
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
|
||||
return priv->update_delay;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_fishbowl_set_update_delay (GtkFishbowl *fishbowl,
|
||||
gint64 update_delay)
|
||||
{
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
|
||||
if (priv->update_delay == update_delay)
|
||||
return;
|
||||
|
||||
priv->update_delay = update_delay;
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (fishbowl), props[PROP_UPDATE_DELAY]);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_fishbowl_set_creation_func (GtkFishbowl *fishbowl,
|
||||
GtkFishCreationFunc creation_func)
|
||||
{
|
||||
GtkFishbowlPrivate *priv = gtk_fishbowl_get_instance_private (fishbowl);
|
||||
|
||||
g_object_freeze_notify (G_OBJECT (fishbowl));
|
||||
|
||||
gtk_fishbowl_set_count (fishbowl, 0);
|
||||
priv->last_benchmark_change = 0;
|
||||
|
||||
priv->creation_func = creation_func;
|
||||
|
||||
gtk_fishbowl_set_count (fishbowl, 1);
|
||||
|
||||
g_object_thaw_notify (G_OBJECT (fishbowl));
|
||||
}
|
||||
|
||||
@@ -32,9 +32,11 @@ G_BEGIN_DECLS
|
||||
typedef struct _GtkFishbowl GtkFishbowl;
|
||||
typedef struct _GtkFishbowlClass GtkFishbowlClass;
|
||||
|
||||
typedef GtkWidget * (* GtkFishCreationFunc) (void);
|
||||
|
||||
struct _GtkFishbowl
|
||||
{
|
||||
GtkContainer container;
|
||||
GtkContainer parent;
|
||||
};
|
||||
|
||||
struct _GtkFishbowlClass
|
||||
@@ -52,6 +54,15 @@ void gtk_fishbowl_set_count (GtkFishbowl *fishbowl,
|
||||
gboolean gtk_fishbowl_get_animating (GtkFishbowl *fishbowl);
|
||||
void gtk_fishbowl_set_animating (GtkFishbowl *fishbowl,
|
||||
gboolean animating);
|
||||
gboolean gtk_fishbowl_get_benchmark (GtkFishbowl *fishbowl);
|
||||
void gtk_fishbowl_set_benchmark (GtkFishbowl *fishbowl,
|
||||
gboolean animating);
|
||||
double gtk_fishbowl_get_framerate (GtkFishbowl *fishbowl);
|
||||
gint64 gtk_fishbowl_get_update_delay (GtkFishbowl *fishbowl);
|
||||
void gtk_fishbowl_set_update_delay (GtkFishbowl *fishbowl,
|
||||
gint64 update_delay);
|
||||
void gtk_fishbowl_set_creation_func (GtkFishbowl *fishbowl,
|
||||
GtkFishCreationFunc creation_func);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
@@ -0,0 +1,255 @@
|
||||
/* Paint
|
||||
*
|
||||
* Demonstrates practical handling of drawing tablets in a real world
|
||||
* usecase.
|
||||
*/
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GtkEventBox parent_instance;
|
||||
cairo_surface_t *surface;
|
||||
cairo_t *cr;
|
||||
GdkRGBA draw_color;
|
||||
|
||||
GtkGesture *stylus_gesture;
|
||||
} DrawingArea;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GtkEventBoxClass parent_class;
|
||||
} DrawingAreaClass;
|
||||
|
||||
G_DEFINE_TYPE (DrawingArea, drawing_area, GTK_TYPE_EVENT_BOX)
|
||||
|
||||
static void
|
||||
drawing_area_ensure_surface (DrawingArea *area,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
if (!area->surface ||
|
||||
cairo_image_surface_get_width (area->surface) != width ||
|
||||
cairo_image_surface_get_height (area->surface) != height)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
|
||||
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
|
||||
width, height);
|
||||
if (area->surface)
|
||||
{
|
||||
cairo_t *cr;
|
||||
|
||||
cr = cairo_create (surface);
|
||||
cairo_set_source_surface (cr, area->surface, 0, 0);
|
||||
cairo_paint (cr);
|
||||
|
||||
cairo_surface_destroy (area->surface);
|
||||
cairo_destroy (area->cr);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
area->surface = surface;
|
||||
area->cr = cairo_create (surface);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
drawing_area_size_allocate (GtkWidget *widget,
|
||||
GtkAllocation *allocation)
|
||||
{
|
||||
DrawingArea *area = (DrawingArea *) widget;
|
||||
|
||||
drawing_area_ensure_surface (area, allocation->width, allocation->height);
|
||||
|
||||
GTK_WIDGET_CLASS (drawing_area_parent_class)->size_allocate (widget, allocation);
|
||||
}
|
||||
|
||||
static void
|
||||
drawing_area_map (GtkWidget *widget)
|
||||
{
|
||||
GtkAllocation allocation;
|
||||
|
||||
GTK_WIDGET_CLASS (drawing_area_parent_class)->map (widget);
|
||||
|
||||
gdk_window_set_event_compression (gtk_widget_get_window (widget), TRUE);
|
||||
|
||||
gtk_widget_get_allocation (widget, &allocation);
|
||||
drawing_area_ensure_surface ((DrawingArea *) widget,
|
||||
allocation.width, allocation.height);
|
||||
}
|
||||
|
||||
static void
|
||||
drawing_area_unmap (GtkWidget *widget)
|
||||
{
|
||||
DrawingArea *area = (DrawingArea *) widget;
|
||||
|
||||
g_clear_pointer (&area->cr, cairo_destroy);
|
||||
g_clear_pointer (&area->surface, cairo_surface_destroy);
|
||||
|
||||
GTK_WIDGET_CLASS (drawing_area_parent_class)->unmap (widget);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
drawing_area_draw (GtkWidget *widget,
|
||||
cairo_t *cr)
|
||||
{
|
||||
DrawingArea *area = (DrawingArea *) widget;
|
||||
GtkAllocation allocation;
|
||||
|
||||
gtk_widget_get_allocation (widget, &allocation);
|
||||
|
||||
cairo_set_source_rgb (cr, 1, 1, 1);
|
||||
cairo_paint (cr);
|
||||
|
||||
cairo_set_source_surface (cr, area->surface, 0, 0);
|
||||
cairo_paint (cr);
|
||||
|
||||
cairo_set_source_rgb (cr, 0.6, 0.6, 0.6);
|
||||
cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
|
||||
cairo_stroke (cr);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
drawing_area_class_init (DrawingAreaClass *klass)
|
||||
{
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
widget_class->size_allocate = drawing_area_size_allocate;
|
||||
widget_class->draw = drawing_area_draw;
|
||||
widget_class->map = drawing_area_map;
|
||||
widget_class->unmap = drawing_area_unmap;
|
||||
}
|
||||
|
||||
static void
|
||||
drawing_area_apply_stroke (DrawingArea *area,
|
||||
GdkDeviceTool *tool,
|
||||
gdouble x,
|
||||
gdouble y,
|
||||
gdouble pressure)
|
||||
{
|
||||
if (gdk_device_tool_get_tool_type (tool) == GDK_DEVICE_TOOL_TYPE_ERASER)
|
||||
{
|
||||
cairo_set_line_width (area->cr, 10 * pressure);
|
||||
cairo_set_operator (area->cr, CAIRO_OPERATOR_DEST_OUT);
|
||||
}
|
||||
else
|
||||
{
|
||||
cairo_set_line_width (area->cr, 4 * pressure);
|
||||
cairo_set_operator (area->cr, CAIRO_OPERATOR_SATURATE);
|
||||
}
|
||||
|
||||
cairo_set_source_rgba (area->cr, area->draw_color.red,
|
||||
area->draw_color.green, area->draw_color.blue,
|
||||
area->draw_color.alpha * pressure);
|
||||
|
||||
//cairo_set_source_rgba (area->cr, 0, 0, 0, pressure);
|
||||
|
||||
cairo_line_to (area->cr, x, y);
|
||||
cairo_stroke (area->cr);
|
||||
cairo_move_to (area->cr, x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
stylus_gesture_down (GtkGestureStylus *gesture,
|
||||
gdouble x,
|
||||
gdouble y,
|
||||
DrawingArea *area)
|
||||
{
|
||||
cairo_new_path (area->cr);
|
||||
}
|
||||
|
||||
static void
|
||||
stylus_gesture_motion (GtkGestureStylus *gesture,
|
||||
gdouble x,
|
||||
gdouble y,
|
||||
DrawingArea *area)
|
||||
{
|
||||
GdkDeviceTool *tool;
|
||||
gdouble pressure;
|
||||
|
||||
tool = gtk_gesture_stylus_get_device_tool (gesture);
|
||||
|
||||
if (!gtk_gesture_stylus_get_axis (gesture, GDK_AXIS_PRESSURE, &pressure))
|
||||
pressure = 1;
|
||||
|
||||
drawing_area_apply_stroke (area, tool, x, y, pressure);
|
||||
gtk_widget_queue_draw (GTK_WIDGET (area));
|
||||
}
|
||||
|
||||
static void
|
||||
drawing_area_init (DrawingArea *area)
|
||||
{
|
||||
gtk_event_box_set_visible_window (GTK_EVENT_BOX (area), TRUE);
|
||||
|
||||
area->stylus_gesture = gtk_gesture_stylus_new (GTK_WIDGET (area));
|
||||
g_signal_connect (area->stylus_gesture, "down",
|
||||
G_CALLBACK (stylus_gesture_down), area);
|
||||
g_signal_connect (area->stylus_gesture, "motion",
|
||||
G_CALLBACK (stylus_gesture_motion), area);
|
||||
|
||||
area->draw_color = (GdkRGBA) { 0, 0, 0, 1 };
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
drawing_area_new (void)
|
||||
{
|
||||
return g_object_new (drawing_area_get_type (), NULL);
|
||||
}
|
||||
|
||||
void
|
||||
drawing_area_set_color (DrawingArea *area,
|
||||
GdkRGBA *color)
|
||||
{
|
||||
area->draw_color = *color;
|
||||
}
|
||||
|
||||
static void
|
||||
color_button_color_set (GtkColorButton *button,
|
||||
DrawingArea *draw_area)
|
||||
{
|
||||
GdkRGBA color;
|
||||
|
||||
gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color);
|
||||
drawing_area_set_color (draw_area, &color);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_paint (GtkWidget *toplevel)
|
||||
{
|
||||
static GtkWidget *window = NULL;
|
||||
|
||||
if (!window)
|
||||
{
|
||||
GtkWidget *draw_area, *headerbar, *colorbutton;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
|
||||
draw_area = drawing_area_new ();
|
||||
gtk_container_add (GTK_CONTAINER (window), draw_area);
|
||||
|
||||
headerbar = gtk_header_bar_new ();
|
||||
gtk_header_bar_set_title (GTK_HEADER_BAR (headerbar), "Paint");
|
||||
gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (headerbar), TRUE);
|
||||
|
||||
colorbutton = gtk_color_button_new ();
|
||||
g_signal_connect (colorbutton, "color-set",
|
||||
G_CALLBACK (color_button_color_set), draw_area);
|
||||
gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (colorbutton),
|
||||
&(GdkRGBA) { 0, 0, 0, 1 });
|
||||
|
||||
gtk_header_bar_pack_end (GTK_HEADER_BAR (headerbar), colorbutton);
|
||||
gtk_window_set_titlebar (GTK_WINDOW (window), headerbar);
|
||||
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
gtk_widget_show_all (window);
|
||||
else
|
||||
gtk_widget_destroy (window);
|
||||
|
||||
return window;
|
||||
}
|
||||
@@ -287,7 +287,6 @@ emblem-system=The icon used as an emblem for directories that contain system lib
|
||||
avatar-default=The generic avatar icon, which is used to represent a user that doesn't have a personalized avatar
|
||||
emblem-synchronizing=The icon used as an emblem to indicate that a a synchronizing operation is in process
|
||||
emblem-shared=The icon used as an emblem for files and directories that are shared to other users
|
||||
folder-download=The icon representing the location in the file system where downloaded files are stored
|
||||
help-browser=The icon used for the desktop's help browsing application
|
||||
|
||||
[other]
|
||||
@@ -429,10 +428,9 @@ emblem-urgent=
|
||||
emblem-videos=
|
||||
emblem-web=
|
||||
folder-documents=
|
||||
folder-download=
|
||||
folder-download=The icon representing the location in the file system where downloaded files are stored
|
||||
folder-music=
|
||||
folder-pictures=
|
||||
folder-documents=
|
||||
folder-publicshare=
|
||||
folder-remote=The icon used for normal directories on a remote filesystem
|
||||
folder-saved-search=
|
||||
|
||||
@@ -4,6 +4,11 @@
|
||||
#include "iconstore.h"
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
/* Drag 'n Drop */
|
||||
static GtkTargetEntry target_table[] = {
|
||||
{ "text/uri-list", 0, 0 },
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
gchar *id;
|
||||
@@ -46,6 +51,8 @@ struct _IconBrowserWindow
|
||||
GtkWidget *image3;
|
||||
GtkWidget *image4;
|
||||
GtkWidget *image5;
|
||||
GtkWidget *image6;
|
||||
GtkWidget *label6;
|
||||
GtkWidget *description;
|
||||
};
|
||||
|
||||
@@ -127,6 +134,19 @@ item_activated (GtkIconView *icon_view, GtkTreePath *path, IconBrowserWindow *wi
|
||||
set_image (win->image3, name, 32);
|
||||
set_image (win->image4, name, 48);
|
||||
set_image (win->image5, name, 64);
|
||||
if (win->symbolic)
|
||||
{
|
||||
gtk_widget_show (win->image6);
|
||||
gtk_widget_show (win->label6);
|
||||
gtk_widget_show (gtk_widget_get_parent (win->image6));
|
||||
set_image (win->image6, name, 64);
|
||||
}
|
||||
else
|
||||
{
|
||||
gtk_widget_hide (win->image6);
|
||||
gtk_widget_hide (win->label6);
|
||||
gtk_widget_hide (gtk_widget_get_parent (win->image6));
|
||||
}
|
||||
if (description && description[0])
|
||||
{
|
||||
gtk_label_set_text (GTK_LABEL (win->description), description);
|
||||
@@ -380,6 +400,35 @@ get_image_data (GtkWidget *widget,
|
||||
g_object_unref (pixbuf);
|
||||
}
|
||||
|
||||
static void
|
||||
get_scalable_image_data (GtkWidget *widget,
|
||||
GdkDragContext *context,
|
||||
GtkSelectionData *selection,
|
||||
guint target_info,
|
||||
guint time,
|
||||
gpointer data)
|
||||
{
|
||||
gchar *uris[2];
|
||||
GtkIconInfo *info;
|
||||
GtkWidget *image;
|
||||
GFile *file;
|
||||
const gchar *name;
|
||||
|
||||
image = gtk_bin_get_child (GTK_BIN (widget));
|
||||
gtk_image_get_icon_name (GTK_IMAGE (image), &name, NULL);
|
||||
|
||||
info = gtk_icon_theme_lookup_icon (gtk_icon_theme_get_default (), name, -1, 0);
|
||||
file = g_file_new_for_path (gtk_icon_info_get_filename (info));
|
||||
uris[0] = g_file_get_uri (file);
|
||||
uris[1] = NULL;
|
||||
|
||||
gtk_selection_data_set_uris (selection, uris);
|
||||
|
||||
g_free (uris[0]);
|
||||
g_object_unref (info);
|
||||
g_object_unref (file);
|
||||
}
|
||||
|
||||
static void
|
||||
setup_image_dnd (GtkWidget *image)
|
||||
{
|
||||
@@ -391,6 +440,19 @@ setup_image_dnd (GtkWidget *image)
|
||||
g_signal_connect (parent, "drag-data-get", G_CALLBACK (get_image_data), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
setup_scalable_image_dnd (GtkWidget *image)
|
||||
{
|
||||
GtkWidget *parent;
|
||||
|
||||
parent = gtk_widget_get_parent (image);
|
||||
gtk_drag_source_set (parent, GDK_BUTTON1_MASK,
|
||||
target_table, G_N_ELEMENTS (target_table),
|
||||
GDK_ACTION_COPY);
|
||||
|
||||
g_signal_connect (parent, "drag-data-get", G_CALLBACK (get_scalable_image_data), NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
icon_browser_window_init (IconBrowserWindow *win)
|
||||
{
|
||||
@@ -417,6 +479,7 @@ icon_browser_window_init (IconBrowserWindow *win)
|
||||
setup_image_dnd (win->image3);
|
||||
setup_image_dnd (win->image4);
|
||||
setup_image_dnd (win->image5);
|
||||
setup_scalable_image_dnd (win->image6);
|
||||
|
||||
win->contexts = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, context_free);
|
||||
|
||||
@@ -456,6 +519,8 @@ icon_browser_window_class_init (IconBrowserWindowClass *class)
|
||||
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, image3);
|
||||
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, image4);
|
||||
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, image5);
|
||||
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, image6);
|
||||
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, label6);
|
||||
gtk_widget_class_bind_template_child (GTK_WIDGET_CLASS (class), IconBrowserWindow, description);
|
||||
|
||||
gtk_widget_class_bind_template_callback (GTK_WIDGET_CLASS (class), search_text_changed);
|
||||
|
||||
@@ -150,6 +150,7 @@
|
||||
<property name="margin">10</property>
|
||||
<property name="row-spacing">18</property>
|
||||
<property name="column-spacing">18</property>
|
||||
<property name="halign">center</property>
|
||||
<child>
|
||||
<object class="GtkEventBox">
|
||||
<property name="visible">True</property>
|
||||
@@ -230,6 +231,22 @@
|
||||
<property name="top-attach">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEventBox">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="image6">
|
||||
<property name="visible">True</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">end</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">5</property>
|
||||
<property name="top-attach">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
|
||||
<child>
|
||||
<object class="GtkLabel" id="label1">
|
||||
@@ -307,36 +324,41 @@
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="description">
|
||||
<object class="GtkLabel" id="label6">
|
||||
<property name="visible">True</property>
|
||||
<property name="wrap">True</property>
|
||||
<property name="max-width-chars">60</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="valign">start</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">0</property>
|
||||
<property name="top-attach">3</property>
|
||||
<property name="width">5</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Copy to Clipboard</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="margin">20</property>
|
||||
<signal name="clicked" handler="copy_to_clipboard"/>
|
||||
<property name="valign">baseline</property>
|
||||
<property name="label">scalable</property>
|
||||
<style>
|
||||
<class name="dim-label"/>
|
||||
</style>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left-attach">0</property>
|
||||
<property name="top-attach">4</property>
|
||||
<property name="width">5</property>
|
||||
<property name="left-attach">5</property>
|
||||
<property name="top-attach">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="visible">True</property>
|
||||
<property name="label" translatable="yes">Copy to Clipboard</property>
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="margin">20</property>
|
||||
<signal name="clicked" handler="copy_to_clipboard"/>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="description">
|
||||
<property name="margin">10</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="wrap">True</property>
|
||||
<property name="max-width-chars">60</property>
|
||||
<property name="valign">start</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
||||
@@ -1728,12 +1728,14 @@ activate (GApplication *app)
|
||||
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "statusbar");
|
||||
gtk_statusbar_push (GTK_STATUSBAR (widget), 0, "All systems are operating normally.");
|
||||
g_action_map_add_action (G_ACTION_MAP (window),
|
||||
G_ACTION (g_property_action_new ("statusbar", widget, "visible")));
|
||||
action = G_ACTION (g_property_action_new ("statusbar", widget, "visible"));
|
||||
g_action_map_add_action (G_ACTION_MAP (window), action);
|
||||
g_object_unref (G_OBJECT (action));
|
||||
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "toolbar");
|
||||
g_action_map_add_action (G_ACTION_MAP (window),
|
||||
G_ACTION (g_property_action_new ("toolbar", widget, "visible")));
|
||||
action = G_ACTION (g_property_action_new ("toolbar", widget, "visible"));
|
||||
g_action_map_add_action (G_ACTION_MAP (window), action);
|
||||
g_object_unref (G_OBJECT (action));
|
||||
|
||||
adj = (GtkAdjustment *)gtk_builder_get_object (builder, "adjustment1");
|
||||
|
||||
|
||||
@@ -2,3 +2,25 @@
|
||||
padding: 0;
|
||||
outline-width: 0;
|
||||
}
|
||||
|
||||
frame.border-inset > border {
|
||||
border-style: inset;
|
||||
}
|
||||
|
||||
frame.border-outset > border {
|
||||
border-style: outset;
|
||||
}
|
||||
|
||||
frame.border-groove > border {
|
||||
border-style: groove;
|
||||
}
|
||||
|
||||
frame.border-ridge > border {
|
||||
border-style: ridge;
|
||||
}
|
||||
|
||||
/* These effects use 2 lines, so show them */
|
||||
frame.border-groove > border,
|
||||
frame.border-ridge > border {
|
||||
border-width: 2px;
|
||||
}
|
||||
|
||||
@@ -493,6 +493,7 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
<object class="GtkEntry" id="entry1">
|
||||
<property name="visible">1</property>
|
||||
<property name="can_focus">1</property>
|
||||
<property name="enable-emoji-completion">1</property>
|
||||
<property name="invisible_char">•</property>
|
||||
<property name="placeholder-text" translatable="yes">Click icon to change mode</property>
|
||||
<property name="secondary_icon_name">view-refresh-symbolic</property>
|
||||
@@ -1301,11 +1302,13 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame1">
|
||||
<property name="visible">1</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<style>
|
||||
<class name="border-inset"/>
|
||||
</style>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label1">
|
||||
<property name="visible">1</property>
|
||||
<property name="label" translatable="yes"><b>Shadow</b></property>
|
||||
<property name="label" translatable="yes"><b>Inset</b></property>
|
||||
<property name="use_markup">1</property>
|
||||
</object>
|
||||
</child>
|
||||
@@ -1317,11 +1320,13 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame2">
|
||||
<property name="visible">1</property>
|
||||
<property name="shadow_type">none</property>
|
||||
<style>
|
||||
<class name="border-outset"/>
|
||||
</style>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label2">
|
||||
<property name="visible">1</property>
|
||||
<property name="label" translatable="yes"><b>No shadow</b></property>
|
||||
<property name="label" translatable="yes"><b>Outset</b></property>
|
||||
<property name="use_markup">1</property>
|
||||
</object>
|
||||
</child>
|
||||
@@ -1331,6 +1336,44 @@ Suspendisse feugiat quam quis dolor accumsan cursus.</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame3">
|
||||
<property name="visible">1</property>
|
||||
<style>
|
||||
<class name="border-groove"/>
|
||||
</style>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label17">
|
||||
<property name="visible">1</property>
|
||||
<property name="label" translatable="yes"><b>Groove</b></property>
|
||||
<property name="use_markup">1</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">1</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkFrame" id="frame4">
|
||||
<property name="visible">1</property>
|
||||
<style>
|
||||
<class name="border-ridge"/>
|
||||
</style>
|
||||
<child type="label">
|
||||
<object class="GtkLabel" id="label18">
|
||||
<property name="visible">1</property>
|
||||
<property name="label" translatable="yes"><b>Ridge</b></property>
|
||||
<property name="use_markup">1</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">1</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">1</property>
|
||||
|
||||
@@ -113,6 +113,10 @@
|
||||
<title>Index of new symbols in 3.22</title>
|
||||
<xi:include href="xml/api-index-3.22.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
<index id="api-index-3-24" role="3.24">
|
||||
<title>Index of new symbols in 3.24</title>
|
||||
<xi:include href="xml/api-index-3.24.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
|
||||
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
||||
|
||||
|
||||
@@ -386,6 +386,7 @@ gdk_window_move
|
||||
gdk_window_resize
|
||||
gdk_window_move_resize
|
||||
gdk_window_scroll
|
||||
gdk_window_move_to_rect
|
||||
gdk_window_move_region
|
||||
gdk_window_flush
|
||||
gdk_window_has_native
|
||||
@@ -1270,6 +1271,7 @@ gdk_wayland_device_get_wl_seat
|
||||
gdk_wayland_display_get_wl_compositor
|
||||
gdk_wayland_display_get_wl_display
|
||||
gdk_wayland_display_get_xdg_shell
|
||||
gdk_wayland_display_query_registry
|
||||
gdk_wayland_window_get_wl_surface
|
||||
gdk_wayland_window_set_use_custom_surface
|
||||
GdkWaylandWindowExported
|
||||
|
||||
@@ -4,13 +4,13 @@
|
||||
]>
|
||||
<refentry id="chap-css-overview">
|
||||
<refmeta>
|
||||
<refentrytitle>GTK+ CSS</refentrytitle>
|
||||
<refentrytitle>GTK+ CSS Overview</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
<refmiscinfo>GTK Library</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>GTK+ CSS</refname>
|
||||
<refname>GTK+ CSS Overview</refname>
|
||||
<refpurpose>
|
||||
Overview of CSS in GTK+
|
||||
</refpurpose>
|
||||
@@ -21,12 +21,6 @@ Overview of CSS in GTK+
|
||||
Formatting conventions:
|
||||
We use
|
||||
|
||||
‑ U+2011 Non-breaking Hyphen
|
||||
U+00A0 No-break Space
|
||||
|
||||
to control line breaks in the Name and Value columns.
|
||||
We use
|
||||
|
||||
〈 U+2329 Left-pointing Angle Bracket
|
||||
〉 U+232A Right-pointing Angle Bracket
|
||||
|
||||
@@ -123,7 +117,7 @@ scale[.fine-tune]
|
||||
<programlisting><![CDATA[
|
||||
button, entry {
|
||||
color: #ff00ea;
|
||||
font: 12px "Comic Sans"
|
||||
font: 12px "Comic Sans";
|
||||
}
|
||||
]]></programlisting>
|
||||
</example>
|
||||
@@ -142,8 +136,8 @@ button, entry {
|
||||
The syntax for @import rules is as follows:
|
||||
</para>
|
||||
|
||||
<literallayout><code>〈import rule〉 = @import [ 〈url〉 | 〈string〉] ;</code>
|
||||
<code>〈url〉 = url( 〈string〉)</code>
|
||||
<literallayout><code>〈import rule〉 = @import [ 〈url〉 | 〈string〉 ]</code>
|
||||
<code>〈url〉 = url( 〈string〉 )</code>
|
||||
</literallayout>
|
||||
|
||||
<example><title>An example for using the @import rule</title>
|
||||
@@ -187,7 +181,7 @@ button, entry {
|
||||
<title>Theme labels that are descendants of a window</title>
|
||||
<programlisting><![CDATA[
|
||||
window label {
|
||||
background-color: #898989
|
||||
background-color: #898989;
|
||||
}
|
||||
]]></programlisting>
|
||||
</example>
|
||||
@@ -196,7 +190,7 @@ window label {
|
||||
<title>Theme notebooks, and anything within</title>
|
||||
<programlisting><![CDATA[
|
||||
notebook {
|
||||
background-color: #a939f0
|
||||
background-color: #a939f0;
|
||||
}
|
||||
]]></programlisting>
|
||||
</example>
|
||||
@@ -207,7 +201,7 @@ notebook {
|
||||
combobox,
|
||||
notebook > entry {
|
||||
color: @fg_color;
|
||||
background-color: #1209a2
|
||||
background-color: #1209a2;
|
||||
}
|
||||
]]></programlisting>
|
||||
</example>
|
||||
@@ -216,7 +210,7 @@ notebook > entry {
|
||||
<title>Theme any widget within a GtkBox</title>
|
||||
<programlisting><![CDATA[
|
||||
box * {
|
||||
font: 20px Sans
|
||||
font: 20px Sans;
|
||||
}
|
||||
]]></programlisting>
|
||||
</example>
|
||||
@@ -225,7 +219,7 @@ box * {
|
||||
<title>Theme a label named title-label</title>
|
||||
<programlisting><![CDATA[
|
||||
label#title-label {
|
||||
font: 15px Sans
|
||||
font: 15px Sans;
|
||||
}
|
||||
]]></programlisting>
|
||||
</example>
|
||||
@@ -234,7 +228,7 @@ label#title-label {
|
||||
<title>Theme any widget named main-entry</title>
|
||||
<programlisting><![CDATA[
|
||||
#main-entry {
|
||||
background-color: #f0a810
|
||||
background-color: #f0a810;
|
||||
}
|
||||
]]></programlisting>
|
||||
</example>
|
||||
@@ -252,7 +246,7 @@ label#title-label {
|
||||
<title>Theme the entry of a GtkSpinButton</title>
|
||||
<programlisting><![CDATA[
|
||||
spinbutton entry {
|
||||
color: 900185;
|
||||
color: #900185;
|
||||
}
|
||||
]]></programlisting>
|
||||
</example>
|
||||
@@ -358,134 +352,134 @@ checkbutton:indeterminate {
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>*</entry>
|
||||
<entry><phrase role="nowrap">*</phrase></entry>
|
||||
<entry>any node</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#universal-selector">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E</entry>
|
||||
<entry><phrase role="nowrap">E</phrase></entry>
|
||||
<entry>any node with name E</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#type-selectors">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E.class</entry>
|
||||
<entry><phrase role="nowrap">E.class</phrase></entry>
|
||||
<entry>any E node with the given style class</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#class-html">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E#id</entry>
|
||||
<entry><phrase role="nowrap">E#id</phrase></entry>
|
||||
<entry>any E node with the given ID</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#id-selectors">CSS</ulink></entry>
|
||||
<entry>GTK+ uses the widget name as ID</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:nth‑child(〈nth‑child〉)</entry>
|
||||
<entry><phrase role="nowrap">E:nth-child(〈nth-child〉)</phrase></entry>
|
||||
<entry>any E node which is the n-th child of its parent node</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#structural-pseudos">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:nth‑last‑child(〈nth‑child〉)</entry>
|
||||
<entry><phrase role="nowrap">E:nth-last-child(〈nth-child〉)</phrase></entry>
|
||||
<entry>any E node which is the n-th child of its parent node, counting from the end</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#structural-pseudos">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:first‑child</entry>
|
||||
<entry><phrase role="nowrap">E:first-child</phrase></entry>
|
||||
<entry>any E node which is the first child of its parent node</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#structural-pseudos">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:last‑child</entry>
|
||||
<entry><phrase role="nowrap">E:last-child</phrase></entry>
|
||||
<entry>any E node which is the last child of its parent node</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#structural-pseudos">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:only‑child</entry>
|
||||
<entry><phrase role="nowrap">E:only-child</phrase></entry>
|
||||
<entry>any E node which is the only child of its parent node</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#structural-pseudos">CSS</ulink></entry>
|
||||
<entry>Equivalent to E:first-child:last-child</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:link, E:visited</entry>
|
||||
<entry><phrase role="nowrap">E:link, E:visited</phrase></entry>
|
||||
<entry>any E node which represents a hyperlink, not yet visited (:link) or already visited (:visited)</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#link">CSS</ulink></entry>
|
||||
<entry>Corresponds to GTK_STATE_FLAG_LINK and GTK_STATE_FLAGS_VISITED</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:active, E:hover, E:focus</entry>
|
||||
<entry><phrase role="nowrap">E:active, E:hover, E:focus</phrase></entry>
|
||||
<entry>any E node which is part of a widget with the corresponding state</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#useraction-pseudos">CSS</ulink></entry>
|
||||
<entry>Corresponds to GTK_STATE_FLAG_ACTIVE, GTK_STATE_FLAG_PRELIGHT and GTK_STATE_FLAGS_FOCUSED; GTK+ also allows E:prelight and E:focused</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:disabled</entry>
|
||||
<entry><phrase role="nowrap">E:disabled</phrase></entry>
|
||||
<entry>any E node which is part of a widget which is disabled</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#UIstates">CSS</ulink></entry>
|
||||
<entry>Corresponds to GTK_STATE_FLAG_INSENSITIVE; GTK+ also allows E:insensitive</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:checked</entry>
|
||||
<entry><phrase role="nowrap">E:checked</phrase></entry>
|
||||
<entry>any E node which is part of a widget (e.g. radio- or checkbuttons) which is checked</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#UIstates">CSS</ulink></entry>
|
||||
<entry>Corresponds to GTK_STATE_FLAG_CHECKED</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:indeterminate</entry>
|
||||
<entry>any E node which is part of a widget (e.g. radio- or checkbuttons) which is in an inconsistent state</entry>
|
||||
<entry><phrase role="nowrap">E:indeterminate</phrase></entry>
|
||||
<entry>any E node which is part of a widget (e.g. radio- or checkbuttons) which is in an indeterminate state</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#indeterminate">CSS3</ulink>,
|
||||
<ulink url="https://drafts.csswg.org/selectors/#indeterminate">CSS4</ulink></entry>
|
||||
<entry>Corresponds to GTK_STATE_FLAG_INCONSISTENT; GTK+ also allows E:inconsistent</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:backdrop, E:selected</entry>
|
||||
<entry><phrase role="nowrap">E:backdrop, E:selected</phrase></entry>
|
||||
<entry>any E node which is part of a widget with the corresponding state</entry>
|
||||
<entry></entry>
|
||||
<entry>Corresponds to GTK_STATE_FLAG_BACKDROP, GTK_STATE_FLAG_SELECTED</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:not(〈selector〉)</entry>
|
||||
<entry><phrase role="nowrap">E:not(〈selector〉)</phrase></entry>
|
||||
<entry>any E node which does not match the simple selector 〈selector〉</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#negation">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:dir(ltr), E:dir(rtl)</entry>
|
||||
<entry><phrase role="nowrap">E:dir(ltr), E:dir(rtl)</phrase></entry>
|
||||
<entry>any E node that has the corresponding text direction</entry>
|
||||
<entry><ulink url="https://drafts.csswg.org/selectors/#the-dir-pseudo">CSS4</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E:drop(active)</entry>
|
||||
<entry><phrase role="nowrap">E:drop(active)</phrase></entry>
|
||||
<entry>any E node that is an active drop target for a current DND operation</entry>
|
||||
<entry><ulink url="https://drafts.csswg.org/selectors/#drag-pseudos">CSS4</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E F</entry>
|
||||
<entry><phrase role="nowrap">E F</phrase></entry>
|
||||
<entry>any F node which is a descendent of an E node</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#descendent-combinators">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E > F</entry>
|
||||
<entry><phrase role="nowrap">E > F</phrase></entry>
|
||||
<entry>any F node which is a child of an E node</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#child-combinators">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E ~ F</entry>
|
||||
<entry><phrase role="nowrap">E ~ F</phrase></entry>
|
||||
<entry>any F node which is preceded by an E node</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#general-sibling-combinators">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>E + F</entry>
|
||||
<entry><phrase role="nowrap">E + F</phrase></entry>
|
||||
<entry>any F node which is immediately preceded by an E node</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-selectors/#adjacent-sibling-combinators">CSS</ulink></entry>
|
||||
<entry></entry>
|
||||
@@ -514,8 +508,8 @@ checkbutton:indeterminate {
|
||||
</para>
|
||||
|
||||
<literallayout><code>〈color〉 = currentColor | transparent | 〈color name〉 | 〈rgb color〉 | 〈rgba color〉 | 〈hex color〉 | 〈gtk color〉</code>
|
||||
<code>〈rgb color 〉 = rgb( 〈number〉, 〈number〉, 〈number〉 ) | rgb( 〈percentage〉, 〈percentage〉, 〈percentage〉 )</code>
|
||||
<code>〈rgba color 〉 = rgba(〈number〉, 〈number〉, 〈number〉, 〈alpha value〉) | rgba( 〈percentage〉, 〈percentage〉, 〈percentage〉, 〈alpha value〉 )</code>
|
||||
<code>〈rgb color〉 = rgb( 〈number〉, 〈number〉, 〈number〉 ) | rgb( 〈percentage〉, 〈percentage〉, 〈percentage〉 )</code>
|
||||
<code>〈rgba color〉 = rgba( 〈number〉, 〈number〉, 〈number〉, 〈alpha value〉 ) | rgba( 〈percentage〉, 〈percentage〉, 〈percentage〉, 〈alpha value〉 )</code>
|
||||
<code>〈hex color〉 = #〈hex digits〉</code>
|
||||
<code>〈alpha value〉 = 〈number〉</code>, clamped to values between 0 and 1
|
||||
</literallayout>
|
||||
@@ -552,7 +546,7 @@ checkbutton:indeterminate {
|
||||
GTK+ adds several additional ways to specify colors.
|
||||
</para>
|
||||
|
||||
<literallayout><code>〈gtk color〉 = 〈symbolic color〉 | 〈color expression〉| 〈win32 color〉</code>
|
||||
<literallayout><code>〈gtk color〉 = 〈symbolic color〉 | 〈color expression〉 | 〈win32 color〉</code>
|
||||
</literallayout>
|
||||
|
||||
<para>
|
||||
@@ -576,7 +570,7 @@ checkbutton:indeterminate {
|
||||
@define-color bg_color #f9a039;
|
||||
|
||||
* {
|
||||
background-color: @bg_color;
|
||||
background-color: @bg_color;
|
||||
}
|
||||
]]></programlisting>
|
||||
</example>
|
||||
@@ -596,14 +590,15 @@ background-color: @bg_color;
|
||||
number from 0 to 1 and applies that as the opacity of the supplied color.
|
||||
</para>
|
||||
|
||||
<literallayout><code>〈color expression〉 = lighter(〈color〉) | darker(〈color〉) | shade(〈color〉,〈number〉) | alpha(〈color〉,〈number〉) | mix(〈color〉,〈color〉,〈number〉)</code>
|
||||
<literallayout><code>〈color expression〉 = lighter( 〈color〉 ) | darker( 〈color〉 ) | shade( 〈color〉, 〈number〉 ) |</code>
|
||||
<code> alpha( 〈color〉, 〈number〉 ) | mix( 〈color〉, 〈color〉, 〈number〉 )</code>
|
||||
</literallayout>
|
||||
|
||||
<para>
|
||||
On Windows, GTK+ allows to refer to system colors, as follows:
|
||||
</para>
|
||||
|
||||
<literallayout><code>〈win32 color〉 = -gtk-win32-color( 〈name〉, 〈integer〉)</code>
|
||||
<literallayout><code>〈win32 color〉 = -gtk-win32-color( 〈name〉, 〈integer〉 )</code>
|
||||
</literallayout>
|
||||
|
||||
</refsect2>
|
||||
@@ -617,17 +612,17 @@ background-color: @bg_color;
|
||||
</para>
|
||||
|
||||
<literallayout><code>〈image〉 = 〈url〉 | 〈crossfade〉 | 〈alternatives〉 | 〈gradient〉 | 〈gtk image〉</code>
|
||||
<code>〈crossfade〉 = cross-fade( 〈percentage〉, 〈image〉, 〈image〉)</code>
|
||||
<code>〈alternatives〉 = image([ 〈image〉, ]* [ 〈image〉 | 〈color〉 ])</code>
|
||||
<code>〈crossfade〉 = cross-fade( 〈percentage〉, 〈image〉, 〈image〉 )</code>
|
||||
<code>〈alternatives〉 = image([ 〈image〉, ]* [ 〈image〉 | 〈color〉 ] )</code>
|
||||
<code>〈gradient〉 = 〈linear gradient〉 | 〈radial gradient〉</code>
|
||||
<code>〈linear gradient〉 = [ linear-gradient | repeating-linear-gradient ] (</code>
|
||||
<code> [ [ 〈angle〉 | to 〈side or corner〉 ] , ]?</code>
|
||||
<code> 〈color stops〉 )</code>
|
||||
<code>〈radial gradient〉 = [ radial‑gradient | repeating‑radial‑gradient ] (</code>
|
||||
<code>〈radial gradient〉 = [ radial-gradient | repeating-radial-gradient ] (</code>
|
||||
<code> [ [ 〈shape〉 || 〈size〉 ] [ at 〈position〉 ]? , | at 〈position〉, ]?</code>
|
||||
<code> 〈color stops〉 )</code>
|
||||
<code>〈side or corner〉 = [ left | right ] || [ top | bottom ]</code>
|
||||
<code>〈color stops〉 = 〈color stop〉 [ , 〈color stop〉]+</code>
|
||||
<code>〈color stops〉 = 〈color stop〉 [ , 〈color stop〉 ]+</code>
|
||||
<code>〈color stop〉 = 〈color〉 [ 〈percentage〉 | 〈length〉 ]?</code>
|
||||
<code>〈shape〉 = circle | ellipse</code>
|
||||
<code>〈size〉 = 〈extent keyword〉 | 〈length〉 | [ 〈length〉 | 〈percentage〉 ]{1,2}</code>
|
||||
@@ -848,7 +843,7 @@ arrow.fancy {
|
||||
CSS, this can be done with the -gtk-scaled syntax.
|
||||
</para>
|
||||
|
||||
<literallayout><code>〈scaled image〉 = -gtk-scaled( 〈image〉[, 〈image〉]* )</code>
|
||||
<literallayout><code>〈scaled image〉 = -gtk-scaled( 〈image〉[ , 〈image〉 ]* )</code>
|
||||
</literallayout>
|
||||
|
||||
<para>
|
||||
@@ -867,7 +862,7 @@ arrow {
|
||||
]]></programlisting>
|
||||
</example>
|
||||
|
||||
<literallayout><code>〈recolored image〉 = -gtk-recolored( 〈url〉[, 〈color palette〉] )</code>
|
||||
<literallayout><code>〈recolored image〉 = -gtk-recolor( 〈url〉 [ , 〈color palette〉 ] )</code>
|
||||
</literallayout>
|
||||
|
||||
<para>
|
||||
@@ -893,7 +888,7 @@ arrow {
|
||||
</para>
|
||||
|
||||
<literallayout><code>〈win32 theme part〉 = -gtk-win32-theme-part( 〈name〉, 〈integer〉 〈integer〉</code>
|
||||
<code> [, [ over( 〈integer〉 〈integer〉 [ , 〈alpha value〉]? ) | margins( 〈integer〉{1,4} ) ] ]* )</code>
|
||||
<code> [ , [ over( 〈integer〉 〈integer〉 [ , 〈alpha value〉 ]? ) | margins( 〈integer〉{1,4} ) ] ]* )</code>
|
||||
</literallayout>
|
||||
|
||||
</refsect2>
|
||||
@@ -944,7 +939,7 @@ arrow {
|
||||
|
||||
<literallayout><code>〈keyframe rule〉 = @keyframes 〈name〉 { 〈animation rule〉 }</code>
|
||||
<code>〈animation rule〉 = 〈animation selector〉 { 〈declaration〉* }</code>
|
||||
<code>〈animation selector〉 = 〈single animation selector〉 [ , 〈single animation selector ]*</code>
|
||||
<code>〈animation selector〉 = 〈single animation selector〉 [ , 〈single animation selector〉 ]*</code>
|
||||
<code>〈single animation selector〉 = from | to | 〈percentage〉</code>
|
||||
</literallayout>
|
||||
|
||||
@@ -994,10 +989,10 @@ spinner {
|
||||
The syntax for @binding-set rules is as follows:
|
||||
</para>
|
||||
|
||||
<literallayout><code>〈binding set rule〉 = @binding-set 〈binding name〉{ [ [ 〈binding〉 | 〈unbinding〉] ; ]* }</code>
|
||||
<literallayout><code>〈binding set rule〉 = @binding-set 〈binding name〉 { [ [ 〈binding〉 | 〈unbinding〉 ] ; ]* }</code>
|
||||
<code>〈binding〉 = bind "〈accelerator〉" { 〈signal emission〉* }</code>
|
||||
<code>〈signal emission〉 = "〈signal name〉" ( [ 〈argument〉[ , 〈argument〉]* ]? }</code>
|
||||
<code>〈unbinding〉 = unbind "〈accelerator〉" ;</code>
|
||||
<code>〈signal emission〉 = "〈signal name〉" ( [ 〈argument〉 [ , 〈argument〉 ]* ]? }</code>
|
||||
<code>〈unbinding〉 = unbind "〈accelerator〉"</code>
|
||||
</literallayout>
|
||||
|
||||
<para>
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
]>
|
||||
<refentry id="chap-css-properties">
|
||||
<refmeta>
|
||||
<refentrytitle>GTK+ CSS</refentrytitle>
|
||||
<refentrytitle>GTK+ CSS Properties</refentrytitle>
|
||||
<manvolnum>3</manvolnum>
|
||||
<refmiscinfo>GTK Library</refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname>GTK+ CSS</refname>
|
||||
<refname>GTK+ CSS Properties</refname>
|
||||
<refpurpose>
|
||||
GTK+ CSS Properties
|
||||
CSS Properties in GTK+
|
||||
</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
@@ -21,12 +21,6 @@ GTK+ CSS Properties
|
||||
Formatting conventions:
|
||||
We use
|
||||
|
||||
‑ U+2011 Non-breaking Hyphen
|
||||
U+00A0 No-break Space
|
||||
|
||||
to control line breaks in the Name and Value columns.
|
||||
We use
|
||||
|
||||
〈 U+2329 Left-pointing Angle Bracket
|
||||
〉 U+232A Right-pointing Angle Bracket
|
||||
|
||||
@@ -77,11 +71,12 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</para>
|
||||
|
||||
<literallayout>
|
||||
<code>〈win32 theme size〉 = 〈win32 size〉| 〈win32 part size〉</code>
|
||||
<code>〈win32 theme size〉 = 〈win32 size〉 | 〈win32 part size〉</code>
|
||||
<code>〈win32 size〉 = -gtk-win32-size ( 〈theme name〉, 〈metric id〉 )</code>
|
||||
<code>〈win32 part size〉 = [ -gtk-win32-part-width | -gtk-win32-part-height |</code>
|
||||
<code> -gtk-win32-part-border-top | -gtk-win32-part-border-right |</code>
|
||||
<code> -gtk-win32-part-border-bottom | -gtk-win32-part-border-left ] ( 〈theme name〉 , 〈integer〉 , 〈integer〉 )</code>
|
||||
<code> -gtk-win32-part-border-top | -gtk-win32-part-border-right |</code>
|
||||
<code> -gtk-win32-part-border-bottom | -gtk-win32-part-border-left ]</code>
|
||||
<code> ( 〈theme name〉 , 〈integer〉 , 〈integer〉 )</code>
|
||||
</literallayout>
|
||||
|
||||
<literallayout><code>〈calc expression〉 = calc( 〈calc sum〉 )</code>
|
||||
@@ -129,7 +124,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>color</entry>
|
||||
<entry><phrase role="nowrap">color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>rgba(1,1,1,1)</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -139,7 +134,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>opacity</entry>
|
||||
<entry><phrase role="nowrap">opacity</phrase></entry>
|
||||
<entry><code>〈alpha value〉</code></entry>
|
||||
<entry><code>1</code></entry>
|
||||
<entry></entry>
|
||||
@@ -167,7 +162,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>font‑family</entry>
|
||||
<entry><phrase role="nowrap">font-family</phrase></entry>
|
||||
<entry><code>〈family name〉 [ , 〈family name〉 ]*</code></entry>
|
||||
<entry>gtk-font-name setting</entry>
|
||||
<entry>✓</entry>
|
||||
@@ -177,7 +172,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>font‑size</entry>
|
||||
<entry><phrase role="nowrap">font-size</phrase></entry>
|
||||
<entry><code>〈absolute size〉 | 〈relative size〉 | 〈length〉 | 〈percentage〉</code></entry>
|
||||
<entry>gtk-font-name setting</entry>
|
||||
<entry>✓</entry>
|
||||
@@ -187,7 +182,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>font‑style</entry>
|
||||
<entry><phrase role="nowrap">font-style</phrase></entry>
|
||||
<entry><code>normal | oblique | italic</code></entry>
|
||||
<entry><code>normal</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -197,7 +192,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>font‑variant</entry>
|
||||
<entry><phrase role="nowrap">font-variant</phrase></entry>
|
||||
<entry><code>normal | small-caps</code></entry>
|
||||
<entry><code>normal</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -207,7 +202,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>only CSS2 values supported</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>font‑weight</entry>
|
||||
<entry><phrase role="nowrap">font-weight</phrase></entry>
|
||||
<entry><code>normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900</code></entry>
|
||||
<entry><code>normal</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -217,7 +212,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>normal is synonymous with 400, bold with 700</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>font‑stretch</entry>
|
||||
<entry><phrase role="nowrap">font-stretch</phrase></entry>
|
||||
<entry><code>ultra-condensed | extra-condensed | condensed | semi-condensed | normal | semi-expanded | expanded | extra-expanded | ultra-expanded</code></entry>
|
||||
<entry><code>normal</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -226,7 +221,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑dpi</entry>
|
||||
<entry><phrase role="nowrap">-gtk-dpi</phrase></entry>
|
||||
<entry><code>〈number〉</code></entry>
|
||||
<entry>screen resolution</entry>
|
||||
<entry>✓</entry>
|
||||
@@ -242,7 +237,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>font</entry>
|
||||
<entry><phrase role="nowrap">font</phrase></entry>
|
||||
<entry><code>[ 〈font-style〉 || 〈font-variant〉 || 〈font-weight〉 || 〈font-stretch〉 ]? 〈font-size〉 〈font-family〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/fonts.html#font-shorthand">CSS2</ulink>,
|
||||
@@ -273,7 +268,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>caret-color</entry>
|
||||
<entry><phrase role="nowrap">caret-color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>currentColor</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -282,7 +277,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows an auto value</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>-gtk-secondary-caret-color</entry>
|
||||
<entry><phrase role="nowrap">-gtk-secondary-caret-color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>currentColor</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -309,7 +304,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>letter‑spacing</entry>
|
||||
<entry><phrase role="nowrap">letter-spacing</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -318,7 +313,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>text‑decoration‑line</entry>
|
||||
<entry><phrase role="nowrap">text-decoration-line</phrase></entry>
|
||||
<entry><code>none | underline | line-through</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
@@ -328,7 +323,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows overline</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>text‑decoration‑color</entry>
|
||||
<entry><phrase role="nowrap">text-decoration-color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>currentColor</code></entry>
|
||||
<entry></entry>
|
||||
@@ -337,7 +332,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>text‑decoration‑style</entry>
|
||||
<entry><phrase role="nowrap">text-decoration-style</phrase></entry>
|
||||
<entry><code>solid | double | wavy</code></entry>
|
||||
<entry><code>solid</code></entry>
|
||||
<entry></entry>
|
||||
@@ -346,7 +341,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows dashed and dotted</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>text‑shadow</entry>
|
||||
<entry><phrase role="nowrap">text-shadow</phrase></entry>
|
||||
<entry><code>none | 〈shadow〉</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -362,7 +357,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>text‑decoration</entry>
|
||||
<entry><phrase role="nowrap">text-decoration</phrase></entry>
|
||||
<entry><code>〈text-decoration-line〉 || 〈text-decoration-style〉 || 〈text-decoration-color〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css-text-decor-3/#text-decoration-property">CSS3</ulink></entry>
|
||||
@@ -390,7 +385,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>‑gtk‑icon‑source</entry>
|
||||
<entry><phrase role="nowrap">-gtk-icon-source</phrase></entry>
|
||||
<entry><code>builtin | 〈image〉 | none</code></entry>
|
||||
<entry><code>builtin</code></entry>
|
||||
<entry></entry>
|
||||
@@ -399,7 +394,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑icon‑transform</entry>
|
||||
<entry><phrase role="nowrap">-gtk-icon-transform</phrase></entry>
|
||||
<entry><code>none | 〈transform〉+</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
@@ -408,7 +403,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑icon‑style</entry>
|
||||
<entry><phrase role="nowrap">-gtk-icon-style</phrase></entry>
|
||||
<entry><code>requested | regular | symbolic</code></entry>
|
||||
<entry><code>requested</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -417,7 +412,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>Determines the preferred style for application-loaded icons</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑icon‑theme</entry>
|
||||
<entry><phrase role="nowrap">-gtk-icon-theme</phrase></entry>
|
||||
<entry><code>〈name〉</code></entry>
|
||||
<entry>current icon theme</entry>
|
||||
<entry>✓</entry>
|
||||
@@ -426,7 +421,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>The icon theme to use with -gtk-icontheme(). Since 3.20</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑icon‑palette</entry>
|
||||
<entry><phrase role="nowrap">-gtk-icon-palette</phrase></entry>
|
||||
<entry><code>〈color palette〉</code></entry>
|
||||
<entry><code>default</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -435,7 +430,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>Used to recolor symbolic icons (both application-loaded and from -gtk-icontheme()). Since 3.20</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑icon‑shadow</entry>
|
||||
<entry><phrase role="nowrap">-gtk-icon-shadow</phrase></entry>
|
||||
<entry><code>none | 〈shadow〉</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -444,7 +439,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑icon‑effect</entry>
|
||||
<entry><phrase role="nowrap">-gtk-icon-effect</phrase></entry>
|
||||
<entry><code>none | highlight | dim</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -457,7 +452,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</table>
|
||||
|
||||
<literallayout><code>〈transform〉 = matrix( 〈number〉 [ , 〈number〉 ]{5} ) | translate( 〈length〉, 〈length〉 ) | translateX( 〈length〉 ) | translateY( 〈length〉 ) |</code>
|
||||
<code> scale( 〈number〉[ , 〈number〉 ]? ) | scaleX( 〈number〉 ) | scaleY( 〈number〉 ) | rotate( 〈angle〉 ) | skew( 〈angle〉 [ , 〈angle〉 ]? ) |</code>
|
||||
<code> scale( 〈number〉 [ , 〈number〉 ]? ) | scaleX( 〈number〉 ) | scaleY( 〈number〉 ) | rotate( 〈angle〉 ) | skew( 〈angle〉 [ , 〈angle〉 ]? ) |</code>
|
||||
<code> skewX( 〈angle〉 ) | skewY( 〈angle〉 )</code>
|
||||
<code>〈color palette〉 = default | 〈name〉 〈color〉 [ , 〈name〉 〈color〉 ]*</code>
|
||||
</literallayout>
|
||||
@@ -495,7 +490,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>min‑width</entry>
|
||||
<entry><phrase role="nowrap">min-width</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -505,7 +500,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows percentages</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>min‑height</entry>
|
||||
<entry><phrase role="nowrap">min-height</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -515,7 +510,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows percentages</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>margin‑top</entry>
|
||||
<entry><phrase role="nowrap">margin-top</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -525,7 +520,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows percentages or auto</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>margin‑right</entry>
|
||||
<entry><phrase role="nowrap">margin-right</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -535,7 +530,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows percentages or auto</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>margin‑bottom</entry>
|
||||
<entry><phrase role="nowrap">margin-bottom</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -545,7 +540,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows percentages or auto</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>margin‑left</entry>
|
||||
<entry><phrase role="nowrap">margin-left</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -555,7 +550,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows percentages or auto</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>padding‑top</entry>
|
||||
<entry><phrase role="nowrap">padding-top</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -565,7 +560,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows percentages</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>padding‑right</entry>
|
||||
<entry><phrase role="nowrap">padding-right</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -575,7 +570,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows percentages</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>padding‑bottom</entry>
|
||||
<entry><phrase role="nowrap">padding-bottom</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -585,7 +580,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows percentages</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>padding‑left</entry>
|
||||
<entry><phrase role="nowrap">padding-left</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -602,7 +597,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>margin</entry>
|
||||
<entry><phrase role="nowrap">margin</phrase></entry>
|
||||
<entry><code>〈length〉{1,4}</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-margin">CSS2</ulink>,
|
||||
@@ -610,7 +605,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>a 'four sides' shorthand</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>padding</entry>
|
||||
<entry><phrase role="nowrap">padding</phrase></entry>
|
||||
<entry><code>〈length〉{1,4}</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-padding">CSS2</ulink>,
|
||||
@@ -631,7 +626,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>border‑top‑width</entry>
|
||||
<entry><phrase role="nowrap">border-top-width</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -641,7 +636,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows other values</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑right‑width</entry>
|
||||
<entry><phrase role="nowrap">border-right-width</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -651,7 +646,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows other values</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑bottom‑width</entry>
|
||||
<entry><phrase role="nowrap">border-bottom-width</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -661,17 +656,17 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>CSS allows other values</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑right‑width</entry>
|
||||
<entry><phrase role="nowrap">border-left-width</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
<entry>✓</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-right-width">CSS2</ulink>,
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-left-width">CSS2</ulink>,
|
||||
<ulink url="https://www.w3.org/TR/css3-background/#the-border-width">CSS3</ulink></entry>
|
||||
<entry>CSS allows other values</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑top‑style</entry>
|
||||
<entry><phrase role="nowrap">border-top-style</phrase></entry>
|
||||
<entry><code>〈border style〉</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
@@ -681,7 +676,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑right‑style</entry>
|
||||
<entry><phrase role="nowrap">border-right-style</phrase></entry>
|
||||
<entry><code>〈border style〉</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
@@ -691,7 +686,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑bottom‑style</entry>
|
||||
<entry><phrase role="nowrap">border-bottom-style</phrase></entry>
|
||||
<entry><code>〈border style〉</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
@@ -701,7 +696,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑left‑style</entry>
|
||||
<entry><phrase role="nowrap">border-left-style</phrase></entry>
|
||||
<entry><code>〈border style〉</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
@@ -711,7 +706,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑top‑right‑radius</entry>
|
||||
<entry><phrase role="nowrap">border-top-right-radius</phrase></entry>
|
||||
<entry><code>〈corner radius〉</code></entry>
|
||||
<entry><code>0</code></entry>
|
||||
<entry></entry>
|
||||
@@ -721,7 +716,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑bottom‑right‑radius</entry>
|
||||
<entry><phrase role="nowrap">border-bottom-right-radius</phrase></entry>
|
||||
<entry><code>〈corner radius〉</code></entry>
|
||||
<entry><code>0</code></entry>
|
||||
<entry></entry>
|
||||
@@ -731,7 +726,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑bottom‑left‑radius</entry>
|
||||
<entry><phrase role="nowrap">border-bottom-left-radius</phrase></entry>
|
||||
<entry><code>〈corner radius〉</code></entry>
|
||||
<entry><code>0</code></entry>
|
||||
<entry></entry>
|
||||
@@ -741,7 +736,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑top‑left‑radius</entry>
|
||||
<entry><phrase role="nowrap">border-top-left-radius</phrase></entry>
|
||||
<entry><code>〈corner radius〉</code></entry>
|
||||
<entry><code>0</code></entry>
|
||||
<entry></entry>
|
||||
@@ -751,7 +746,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑top‑color</entry>
|
||||
<entry><phrase role="nowrap">border-top-color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>currentColor</code></entry>
|
||||
<entry></entry>
|
||||
@@ -761,7 +756,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑right‑color</entry>
|
||||
<entry><phrase role="nowrap">border-right-color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>currentColor</code></entry>
|
||||
<entry></entry>
|
||||
@@ -771,7 +766,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑bottom‑color</entry>
|
||||
<entry><phrase role="nowrap">border-bottom-color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>currentColor</code></entry>
|
||||
<entry></entry>
|
||||
@@ -781,7 +776,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑left‑color</entry>
|
||||
<entry><phrase role="nowrap">border-left-color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>currentColor</code></entry>
|
||||
<entry></entry>
|
||||
@@ -791,7 +786,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑image‑source</entry>
|
||||
<entry><phrase role="nowrap">border-image-source</phrase></entry>
|
||||
<entry><code>〈image〉 | none</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
@@ -800,7 +795,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑image‑repeat</entry>
|
||||
<entry><phrase role="nowrap">border-image-repeat</phrase></entry>
|
||||
<entry><code>〈border repeat〉{1,2}</code></entry>
|
||||
<entry><code>stretch</code></entry>
|
||||
<entry></entry>
|
||||
@@ -809,7 +804,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑image‑slice</entry>
|
||||
<entry><phrase role="nowrap">border-image-slice</phrase></entry>
|
||||
<entry><code>[ 〈number〉 | 〈percentage〉 ]{1,4} && fill?</code></entry>
|
||||
<entry><code>100%</code></entry>
|
||||
<entry></entry>
|
||||
@@ -818,8 +813,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>a 'four sides' shorthand</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑image‑width</entry>
|
||||
<entry><code>[ 〈length〉 | 〈number〉 | 〈percentage〉 | auto ]{1,4}</code></entry>
|
||||
<entry><phrase role="nowrap">border-image-width</phrase></entry>
|
||||
<entry><code>[ 〈length〉 | 〈number〉 | 〈percentage〉 | auto ]{1,4}</code></entry>
|
||||
<entry><code>1</code></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -835,7 +830,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>border‑width</entry>
|
||||
<entry><phrase role="nowrap">border-width</phrase></entry>
|
||||
<entry><code>〈length〉{1,4}</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-width">CSS2</ulink>,
|
||||
@@ -843,7 +838,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>a 'four sides' shorthand</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑style</entry>
|
||||
<entry><phrase role="nowrap">border-style</phrase></entry>
|
||||
<entry><code>〈border style〉{1,4}</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-style">CSS2</ulink>,
|
||||
@@ -851,14 +846,14 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>a 'four sides' shorthand</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑color</entry>
|
||||
<entry><phrase role="nowrap">border-color</phrase></entry>
|
||||
<entry><code>〈color〉{1,4}</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-background/#border-color">CSS3</ulink></entry>
|
||||
<entry>a 'four sides' shorthand</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑top</entry>
|
||||
<entry><phrase role="nowrap">border-top</phrase></entry>
|
||||
<entry><code>〈length〉 || 〈border style〉 || 〈color〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-top">CSS2</ulink>,
|
||||
@@ -866,23 +861,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑left</entry>
|
||||
<entry><code>〈length〉 || 〈border style〉 || 〈color〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-left">CSS2</ulink>,
|
||||
<ulink url="https://www.w3.org/TR/css3-background/#border-left">CSS3</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑bottom</entry>
|
||||
<entry><code>〈length〉 || 〈border style〉 || 〈color〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-bottom">CSS2</ulink>,
|
||||
<ulink url="https://www.w3.org/TR/css3-background/#border-bottom">CSS3</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑right</entry>
|
||||
<entry><phrase role="nowrap">border-right</phrase></entry>
|
||||
<entry><code>〈length〉 || 〈border style〉 || 〈color〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-right">CSS2</ulink>,
|
||||
@@ -890,7 +869,23 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border</entry>
|
||||
<entry><phrase role="nowrap">border-bottom</phrase></entry>
|
||||
<entry><code>〈length〉 || 〈border style〉 || 〈color〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-bottom">CSS2</ulink>,
|
||||
<ulink url="https://www.w3.org/TR/css3-background/#border-bottom">CSS3</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><phrase role="nowrap">border-left</phrase></entry>
|
||||
<entry><code>〈length〉 || 〈border style〉 || 〈color〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-left">CSS2</ulink>,
|
||||
<ulink url="https://www.w3.org/TR/css3-background/#border-left">CSS3</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry><phrase role="nowrap">border</phrase></entry>
|
||||
<entry><code>〈length〉 || 〈border style〉 || 〈color〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/box.html#propdef-border-right">CSS2</ulink>,
|
||||
@@ -898,14 +893,14 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑radius</entry>
|
||||
<entry><code>[ 〈length〉 | 〈percentage〉 ]{1,4} [ / [ 〈length〉 | 〈percentage> ]{1,4} ]?</code></entry>
|
||||
<entry><phrase role="nowrap">border-radius</phrase></entry>
|
||||
<entry><code>[ 〈length〉 | 〈percentage〉 ]{1,4} [ / [ 〈length〉 | 〈percentage〉 ]{1,4} ]?</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-background/#border-radius">CSS3</ulink></entry>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>border‑image</entry>
|
||||
<entry><phrase role="nowrap">border-image</phrase></entry>
|
||||
<entry><code>〈border-image-source〉 || 〈border-image-slice〉 [ / 〈border-image-width〉 | / 〈border-image-width〉? / 〈border-image-outset〉 ]? || 〈border-image-repeat〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-background/#border-image">CSS3</ulink></entry>
|
||||
@@ -929,7 +924,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>outline‑style</entry>
|
||||
<entry><phrase role="nowrap">outline-style</phrase></entry>
|
||||
<entry><code>none | solid | inset | outset | hidden | dotted | dashed | double | groove | ridge</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
@@ -939,7 +934,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>outline‑width</entry>
|
||||
<entry><phrase role="nowrap">outline-width</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -949,7 +944,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>outline‑color</entry>
|
||||
<entry><phrase role="nowrap">outline-color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>currentColor</code></entry>
|
||||
<entry></entry>
|
||||
@@ -959,7 +954,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>outline‑offset</entry>
|
||||
<entry><phrase role="nowrap">outline-offset</phrase></entry>
|
||||
<entry><code>〈length〉</code></entry>
|
||||
<entry><code>0px</code></entry>
|
||||
<entry></entry>
|
||||
@@ -968,7 +963,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑outline‑top‑left‑radius</entry>
|
||||
<entry><phrase role="nowrap">-gtk-outline-top-left-radius</phrase></entry>
|
||||
<entry><code>〈corner radius〉</code></entry>
|
||||
<entry><code>0</code></entry>
|
||||
<entry></entry>
|
||||
@@ -977,7 +972,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑outline‑top‑right‑radius</entry>
|
||||
<entry><phrase role="nowrap">-gtk-outline-top-right-radius</phrase></entry>
|
||||
<entry><code>〈corner radius〉</code></entry>
|
||||
<entry><code>0</code></entry>
|
||||
<entry></entry>
|
||||
@@ -986,7 +981,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑outline‑bottom‑right‑radius</entry>
|
||||
<entry><phrase role="nowrap">-gtk-outline-bottom-right-radius</phrase></entry>
|
||||
<entry><code>〈corner radius〉</code></entry>
|
||||
<entry><code>0</code></entry>
|
||||
<entry></entry>
|
||||
@@ -995,7 +990,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑outline‑bottom‑left‑radius</entry>
|
||||
<entry><phrase role="nowrap">-gtk-outline-bottom-left-radius</phrase></entry>
|
||||
<entry><code>〈corner radius〉</code></entry>
|
||||
<entry><code>0</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1011,7 +1006,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>outline</entry>
|
||||
<entry><phrase role="nowrap">outline</phrase></entry>
|
||||
<entry><code>〈outline-color〉 || 〈outline-style〉 || 〈outline-width〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/ui.html#propdef-outline">CSS2</ulink>,
|
||||
@@ -1019,8 +1014,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>‑gtk‑outline‑radius</entry>
|
||||
<entry><code>[ 〈length〉|〈percentage〉 ]{1,4} [ / [〈length〉 | 〈percentage> ]{1,4} ]?</code></entry>
|
||||
<entry><phrase role="nowrap">-gtk-outline-radius</phrase></entry>
|
||||
<entry><code>[ 〈length〉 | 〈percentage〉 ]{1,4} [ / [ 〈length〉 | 〈percentage〉 ]{1,4} ]?</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -1043,7 +1038,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>background‑color</entry>
|
||||
<entry><phrase role="nowrap">background-color</phrase></entry>
|
||||
<entry><code>〈color〉</code></entry>
|
||||
<entry><code>rgba(0,0,0,0)</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1053,7 +1048,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>background‑clip</entry>
|
||||
<entry><phrase role="nowrap">background-clip</phrase></entry>
|
||||
<entry><code>〈box〉 [ , 〈box〉 ]*</code></entry>
|
||||
<entry><code>border-box</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1062,7 +1057,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>background‑origin</entry>
|
||||
<entry><phrase role="nowrap">background-origin</phrase></entry>
|
||||
<entry><code>〈box〉 [ , 〈box〉 ]*</code></entry>
|
||||
<entry><code>padding-box</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1071,7 +1066,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>background‑size</entry>
|
||||
<entry><phrase role="nowrap">background-size</phrase></entry>
|
||||
<entry><code>〈bg-size〉 [ , 〈bg-size〉 ]*</code></entry>
|
||||
<entry><code>auto</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1080,8 +1075,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>background‑position</entry>
|
||||
<entry><code>〈position〉 [ , 〈position〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">background-position</phrase></entry>
|
||||
<entry><code>〈position〉 [ , 〈position〉 ]*</code></entry>
|
||||
<entry><code>0</code></entry>
|
||||
<entry></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -1090,8 +1085,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>background‑repeat</entry>
|
||||
<entry><code>〈bg-repeat 〉[ , 〈bg-repeat〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">background-repeat</phrase></entry>
|
||||
<entry><code>〈bg-repeat〉 [ , 〈bg-repeat〉 ]*</code></entry>
|
||||
<entry><code>repeat</code></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -1100,8 +1095,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>background‑image</entry>
|
||||
<entry><code>〈bg-image〉[ , 〈bg-image〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">background-image</phrase></entry>
|
||||
<entry><code>〈bg-image〉 [ , 〈bg-image〉 ]*</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -1110,8 +1105,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>not supported: urls without quotes, CSS radial gradients, colors in crossfades</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>background-blend-mode</entry>
|
||||
<entry><code>〈blend-mode〉 [ , 〈blend-mode〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">background-blend-mode</phrase></entry>
|
||||
<entry><code>〈blend-mode〉 [ , 〈blend-mode〉 ]*</code></entry>
|
||||
<entry><code>normal</code></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -1119,8 +1114,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry>only affects multiple backgrounds</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>box‑shadow</entry>
|
||||
<entry><code>none | 〈box shadow〉 [ , 〈box shadow〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">box-shadow</phrase></entry>
|
||||
<entry><code>none | 〈box shadow〉 [ , 〈box shadow〉 ]*</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
<entry>✓</entry>
|
||||
@@ -1135,7 +1130,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry><para>background</para></entry>
|
||||
<entry>background</entry>
|
||||
<entry><code>[ 〈bg-layer〉 , ]* 〈final-bg-layer〉</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/2011/REC-CSS2-20110607/colors.html#propdef-background">CSS2</ulink>,
|
||||
@@ -1152,8 +1147,10 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<code>〈bg-repeat〉 = repeat-x | repeat-y | [ no-repeat | repeat | round | space ]{1,2}</code>
|
||||
<code>〈bg-image〉 = 〈image〉 | none</code>
|
||||
<code>〈bg-layer〉 = 〈bg-image〉 || 〈position〉 [ / 〈bg-size〉 ]? || 〈bg-repeat〉 || 〈box〉 || 〈box〉</code>
|
||||
<code>〈final-bg-layer〉 = 〈bg-image〉 || 〈position〉 [ / 〈bg-size〉 ]? || 〈bg-repeat〉 || 〈box〉 || 〈box〉|| 〈color〉</code>
|
||||
<code>〈blend-mode〉 = color || color-burn || color-dodge || darken || difference || exclusion || hard-light || hue || lighten || luminosity || multiply || normal || overlay || saturate || screen || soft-light</code>
|
||||
<code>〈final-bg-layer〉 = 〈bg-image〉 || 〈position〉 [ / 〈bg-size〉 ]? || 〈bg-repeat〉 || 〈box〉 || 〈box〉 || 〈color〉</code>
|
||||
<code>〈blend-mode〉 = color || color-burn || color-dodge || darken || difference || exclusion ||</code>
|
||||
<code> hard-light || hue || lighten || luminosity || multiply || normal || overlay ||</code>
|
||||
<code> saturate || screen || soft-light</code>
|
||||
<code>〈box shadow〉 = inset? && 〈length〉{2,4}? && 〈color〉?</code>
|
||||
</literallayout>
|
||||
|
||||
@@ -1176,7 +1173,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>transition‑property</entry>
|
||||
<entry><phrase role="nowrap">transition-property</phrase></entry>
|
||||
<entry><code>none | all | 〈property name〉 [ , 〈property name〉 ]*</code></entry>
|
||||
<entry><code>all</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1185,7 +1182,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>transition‑duration</entry>
|
||||
<entry><phrase role="nowrap">transition-duration</phrase></entry>
|
||||
<entry><code>〈time〉 [ , 〈time〉 ]*</code></entry>
|
||||
<entry><code>0s</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1194,8 +1191,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>transition‑timing‑function</entry>
|
||||
<entry><code>〈single‑timing‑function〉[ , 〈single‑timing‑function〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">transition-timing-function</phrase></entry>
|
||||
<entry><code>〈single-timing-function〉 [ , 〈single-timing-function〉 ]*</code></entry>
|
||||
<entry><code>ease</code></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -1203,7 +1200,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>transition‑delay</entry>
|
||||
<entry><phrase role="nowrap">transition-delay</phrase></entry>
|
||||
<entry><code>〈time〉 [ , 〈time〉 ]*</code></entry>
|
||||
<entry><code>0s</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1219,7 +1216,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>transition</entry>
|
||||
<entry><phrase role="nowrap">transition</phrase></entry>
|
||||
<entry><code>〈single-transition〉 [ , 〈single-transition〉 ]*</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-transitions/#transition">CSS3</ulink></entry>
|
||||
@@ -1230,8 +1227,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</table>
|
||||
|
||||
<literallayout><code>〈single-timing-function〉 = ease | linear | ease-in | ease-out | ease-in-out |</code>
|
||||
<code> step-start | step-end | steps( 〈integer〉 [ , [ start | end ] ]? ) |</code>
|
||||
<code> cubic-bezier( 〈number〉, 〈number〉, 〈number〉, 〈number〉 )</code>
|
||||
<code> step-start | step-end | steps( 〈integer〉 [ , [ start | end ] ]? ) |</code>
|
||||
<code> cubic-bezier( 〈number〉, 〈number〉, 〈number〉, 〈number〉 )</code>
|
||||
<code>〈single-transition〉 = [ none | 〈property name〉 ] || 〈time〉 || 〈single-transition-timing-function〉 || 〈time〉</code>
|
||||
</literallayout>
|
||||
|
||||
@@ -1245,7 +1242,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>animation‑name</entry>
|
||||
<entry><phrase role="nowrap">animation-name</phrase></entry>
|
||||
<entry><code>〈single-animation-name〉 [ , 〈single-animation-name〉 ]*</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1254,7 +1251,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>animation‑duration</entry>
|
||||
<entry><phrase role="nowrap">animation-duration</phrase></entry>
|
||||
<entry><code>〈time〉 [ , 〈time〉 ]*</code></entry>
|
||||
<entry><code>0s</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1263,8 +1260,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>animation‑timing‑function</entry>
|
||||
<entry><code>〈single‑timing‑function〉 [ , 〈single‑timing‑function〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">animation-timing-function</phrase></entry>
|
||||
<entry><code>〈single-timing-function〉 [ , 〈single-timing-function〉 ]*</code></entry>
|
||||
<entry><code>ease</code></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -1272,8 +1269,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>animation‑iteration-count</entry>
|
||||
<entry><code>〈single‑animation‑iteration‑count〉 [ , 〈single‑animation‑iteration‑count〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">animation-iteration-count</phrase></entry>
|
||||
<entry><code>〈single-animation-iteration-count〉 [ , 〈single-animation-iteration-count〉 ]*</code></entry>
|
||||
<entry><code>1</code></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -1281,8 +1278,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>animation‑direction</entry>
|
||||
<entry><code>〈single‑animation‑direction〉 [ , 〈single‑animation‑direction〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">animation-direction</phrase></entry>
|
||||
<entry><code>〈single-animation-direction〉 [ , 〈single-animation-direction〉 ]*</code></entry>
|
||||
<entry><code>normal</code></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -1290,8 +1287,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>animation‑play‑state</entry>
|
||||
<entry><code>〈single‑animation‑play‑state〉 [ , 〈single‑animation‑play‑state〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">animation-play-state</phrase></entry>
|
||||
<entry><code>〈single-animation-play-state〉 [ , 〈single-animation-play-state〉 ]*</code></entry>
|
||||
<entry><code>running</code></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -1299,7 +1296,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>animation‑delay</entry>
|
||||
<entry><phrase role="nowrap">animation-delay</phrase></entry>
|
||||
<entry><code>〈time〉 [ , 〈time〉 ]*</code></entry>
|
||||
<entry><code>0s</code></entry>
|
||||
<entry></entry>
|
||||
@@ -1308,8 +1305,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<entry></entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>animation‑fill‑mode</entry>
|
||||
<entry><code>〈single‑animation‑fill‑mode〉 [ , 〈single‑animation‑fill‑mode〉 ]*</code></entry>
|
||||
<entry><phrase role="nowrap">animation-fill-mode</phrase></entry>
|
||||
<entry><code>〈single-animation-fill-mode〉 [ , 〈single-animation-fill-mode〉 ]*</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
<entry></entry>
|
||||
@@ -1324,8 +1321,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>animation</entry>
|
||||
<entry><code>〈single‑animation〉 [ , 〈single‑animation〉]*</code></entry>
|
||||
<entry><phrase role="nowrap">animation</phrase></entry>
|
||||
<entry><code>〈single-animation〉 [ , 〈single-animation〉 ]*</code></entry>
|
||||
<entry>see individual properties</entry>
|
||||
<entry><ulink url="https://www.w3.org/TR/css3-animations/#animation">CSS3</ulink></entry>
|
||||
<entry></entry>
|
||||
@@ -1340,7 +1337,8 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
<code>〈single-animation-play-state〉 = running | paused</code>
|
||||
<code>〈single-animation-fill-mode〉 = none | forwards | backwards | both</code>
|
||||
<code>〈single-animation〉 = 〈single-animation-name〉 || 〈time〉 || 〈single-timing-function〉 || 〈time〉 ||</code>
|
||||
<code> 〈single-animation-iteration-count〉 || 〈single-animation-direction〉 || 〈single-animation-play-state〉 || 〈single-animation-fill-mode〉</code>
|
||||
<code> 〈single-animation-iteration-count〉 || 〈single-animation-direction〉 ||</code>
|
||||
<code> 〈single-animation-play-state〉 || 〈single-animation-fill-mode〉</code>
|
||||
</literallayout>
|
||||
|
||||
<table pgwide="1">
|
||||
@@ -1353,7 +1351,7 @@ We use <literallayout> for syntax productions, and each line is put in a <code>
|
||||
</thead>
|
||||
<tbody>
|
||||
<row>
|
||||
<entry>‑gtk‑key‑bindings</entry>
|
||||
<entry><phrase role="nowrap">-gtk-key-bindings</phrase></entry>
|
||||
<entry><code>none | 〈binding name〉 [ , 〈binding name〉 ]*</code></entry>
|
||||
<entry><code>none</code></entry>
|
||||
<entry></entry>
|
||||
|
||||
@@ -450,13 +450,13 @@ example_app_window_class_init (ExampleAppWindowClass *class)
|
||||
|
||||
...
|
||||
]]></programlisting>
|
||||
<para>(<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application2/exampleappwin.c">full source</ulink>)</para>
|
||||
<para>(<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application2/exampleappwin.c">full source</ulink>)</para>
|
||||
</informalexample>
|
||||
|
||||
<para>You may have noticed that we used the <literal>_from_resource(<!-- -->)</literal> variant
|
||||
of the function that sets a template. Now we need to use GLib's resource
|
||||
functionality to include the ui file in the binary. This is commonly
|
||||
done by listing all resources in a .gresource.xml file, such as this:
|
||||
of the function that sets a template. Now we need to use <ulink url="https://developer.gnome.org/gio/stable/GResource.html">GLib's resource functionality</ulink>
|
||||
to include the ui file in the binary. This is commonly done by listing
|
||||
all resources in a .gresource.xml file, such as this:
|
||||
</para>
|
||||
|
||||
<informalexample>
|
||||
@@ -518,7 +518,7 @@ example_app_window_class_init (ExampleAppWindowClass *class)
|
||||
|
||||
...
|
||||
]]></programlisting>
|
||||
<para>(<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application3/exampleappwin.c">full source</ulink>)</para>
|
||||
<para>(<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application3/exampleappwin.c">full source</ulink>)</para>
|
||||
</informalexample>
|
||||
|
||||
<para>Now we revisit the example_app_window_open() function that
|
||||
@@ -567,7 +567,7 @@ example_app_window_open (ExampleAppWindow *win,
|
||||
|
||||
...
|
||||
]]></programlisting>
|
||||
<para>(<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application3/exampleappwin.c">full source</ulink>)</para>
|
||||
<para>(<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application3/exampleappwin.c">full source</ulink>)</para>
|
||||
</informalexample>
|
||||
|
||||
<para>Note that we did not have to touch the stack switcher
|
||||
@@ -665,7 +665,7 @@ example_app_class_init (ExampleAppClass *class)
|
||||
|
||||
...
|
||||
</programlisting>
|
||||
<para>(<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application4/exampleapp.c">full source</ulink>)</para>
|
||||
<para>(<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application4/exampleapp.c">full source</ulink>)</para>
|
||||
</informalexample>
|
||||
|
||||
<para>Our preferences menu item does not do anything yet,
|
||||
@@ -731,7 +731,7 @@ example_app_window_init (ExampleAppWindow *win)
|
||||
|
||||
...
|
||||
]]></programlisting>
|
||||
<para>(<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application5/exampleappwin.c">full source</ulink>)</para>
|
||||
<para>(<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application5/exampleappwin.c">full source</ulink>)</para>
|
||||
</informalexample>
|
||||
|
||||
<para>The code to connect the font setting is a little more involved,
|
||||
@@ -780,7 +780,7 @@ preferences_activated (GSimpleAction *action,
|
||||
|
||||
...
|
||||
]]></programlisting>
|
||||
<para>(<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application6/exampleapp.c">full source</ulink>)</para>
|
||||
<para>(<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application6/exampleapp.c">full source</ulink>)</para>
|
||||
</informalexample>
|
||||
|
||||
<para>After all this work, our application can now show
|
||||
@@ -866,7 +866,7 @@ example_app_window_init (ExampleAppWindow *win)
|
||||
|
||||
...
|
||||
]]></programlisting>
|
||||
<para>(<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application7/exampleappwin.c">full source</ulink>)</para>
|
||||
<para>(<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application7/exampleappwin.c">full source</ulink>)</para>
|
||||
</informalexample>
|
||||
|
||||
<para>With the search bar, our application now looks like this:</para>
|
||||
@@ -926,7 +926,7 @@ example_app_window_init (ExampleAppWindow *win)
|
||||
|
||||
...
|
||||
]]></programlisting>
|
||||
<para>(<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application8/exampleappwin.c">full source</ulink>)</para>
|
||||
<para>(<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application8/exampleappwin.c">full source</ulink>)</para>
|
||||
</informalexample>
|
||||
|
||||
<para>What our application looks like now:</para>
|
||||
@@ -989,12 +989,12 @@ example_app_window_init (ExampleAppWindow *win)
|
||||
|
||||
...
|
||||
</programlisting>
|
||||
<para>(<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application9/exampleappwin.c">full source</ulink>)</para>
|
||||
<para>(<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application9/exampleappwin.c">full source</ulink>)</para>
|
||||
</informalexample>
|
||||
|
||||
<para>We also need a function that counts the lines of the currently
|
||||
active tab, and updates the @lines label. See the
|
||||
<ulink url="https://git.gnome.org/browse/gtk+/tree/examples/application9/exampleappwin.c">full source</ulink>
|
||||
<ulink url="https://gitlab.gnome.org/GNOME/gtk/blob/gtk-3-22/examples/application9/exampleappwin.c">full source</ulink>
|
||||
if you are interested in the details.</para>
|
||||
|
||||
<para>This brings our example application to this appearance:</para>
|
||||
|
||||
@@ -301,6 +301,9 @@
|
||||
<chapter id="Gestures">
|
||||
<title>Gestures and event handling</title>
|
||||
<xi:include href="xml/gtkeventcontroller.xml" />
|
||||
<xi:include href="xml/gtkeventcontrollerkey.xml" />
|
||||
<xi:include href="xml/gtkeventcontrollerscroll.xml" />
|
||||
<xi:include href="xml/gtkeventcontrollermotion.xml" />
|
||||
<xi:include href="xml/gtkgesture.xml" />
|
||||
<xi:include href="xml/gtkgesturesingle.xml" />
|
||||
<xi:include href="xml/gtkgesturedrag.xml" />
|
||||
@@ -310,6 +313,7 @@
|
||||
<xi:include href="xml/gtkgestureswipe.xml" />
|
||||
<xi:include href="xml/gtkgesturerotate.xml" />
|
||||
<xi:include href="xml/gtkgesturezoom.xml" />
|
||||
<xi:include href="xml/gtkgesturestylus.xml" />
|
||||
<xi:include href="xml/gtkpadcontroller.xml" />
|
||||
</chapter>
|
||||
|
||||
@@ -494,6 +498,10 @@
|
||||
<title>Index of new symbols in 3.22</title>
|
||||
<xi:include href="xml/api-index-3.22.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
<index id="api-index-3-24" role="3.24">
|
||||
<title>Index of new symbols in 3.24</title>
|
||||
<xi:include href="xml/api-index-3.24.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
|
||||
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
||||
|
||||
|
||||
@@ -1665,6 +1665,11 @@ GtkFontFilterFunc
|
||||
gtk_font_chooser_set_filter_func
|
||||
gtk_font_chooser_set_font_map
|
||||
gtk_font_chooser_get_font_map
|
||||
gtk_font_chooser_set_level
|
||||
gtk_font_chooser_get_level
|
||||
gtk_font_chooser_get_font_features
|
||||
gtk_font_chooser_set_language
|
||||
gtk_font_chooser_get_language
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GtkFontChooserIface
|
||||
@@ -2488,6 +2493,8 @@ gtk_info_bar_get_action_area
|
||||
gtk_info_bar_get_content_area
|
||||
gtk_info_bar_get_show_close_button
|
||||
gtk_info_bar_set_show_close_button
|
||||
gtk_info_bar_get_revealed
|
||||
gtk_info_bar_set_revealed
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_INFO_BAR
|
||||
@@ -8259,6 +8266,63 @@ GtkEventControllerPriv
|
||||
gtk_event_controller_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkeventcontrollerscroll</FILE>
|
||||
<TITLE>GtkEventControllerScroll</TITLE>
|
||||
GtkEventControllerScroll
|
||||
GtkEventControllerScrollFlags
|
||||
gtk_event_controller_scroll_new
|
||||
gtk_event_controller_scroll_set_flags
|
||||
gtk_event_controller_scroll_get_flags
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_EVENT_CONTROLLER_SCROLL
|
||||
GTK_EVENT_CONTROLLER_SCROLL
|
||||
GTK_EVENT_CONTROLLER_SCROLL_CLASS
|
||||
GTK_IS_EVENT_CONTROLLER_SCROLL
|
||||
GTK_IS_EVENT_CONTROLLER_SCROLL_CLASS
|
||||
GTK_EVENT_CONTROLLER_SCROLL_GET_CLASS
|
||||
|
||||
<SUBSECTION Private>
|
||||
gtk_event_controller_scroll_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkeventcontrollermotion</FILE>
|
||||
<TITLE>GtkEventControllerMotion</TITLE>
|
||||
GtkEventControllerMotion
|
||||
gtk_event_controller_motion_new
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_EVENT_CONTROLLER_MOTION
|
||||
GTK_EVENT_CONTROLLER_MOTION
|
||||
GTK_EVENT_CONTROLLER_MOTION_CLASS
|
||||
GTK_IS_EVENT_CONTROLLER_MOTION
|
||||
GTK_IS_EVENT_CONTROLLER_MOTION_CLASS
|
||||
GTK_EVENT_CONTROLLER_MOTION_GET_CLASS
|
||||
|
||||
<SUBSECTION Private>
|
||||
gtk_event_controller_motion_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkeventcontrollerkey</FILE>
|
||||
<TITLE>GtkEventControllerKey</TITLE>
|
||||
GtkEventControllerKey
|
||||
gtk_event_controller_key_new
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_EVENT_CONTROLLER_KEY
|
||||
GTK_EVENT_CONTROLLER_KEY
|
||||
GTK_EVENT_CONTROLLER_KEY_CLASS
|
||||
GTK_IS_EVENT_CONTROLLER_KEY
|
||||
GTK_IS_EVENT_CONTROLLER_KEY_CLASS
|
||||
GTK_EVENT_CONTROLLER_KEY_GET_CLASS
|
||||
|
||||
<SUBSECTION Private>
|
||||
gtk_event_controller_key_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkgesture</FILE>
|
||||
<TITLE>GtkGesture</TITLE>
|
||||
@@ -8483,6 +8547,30 @@ GTK_PAD_CONTROLLER_GET_CLASS
|
||||
gtk_pad_controller_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkgesturestylus</FILE>
|
||||
<TITLE>GtkGestureStylus</TITLE>
|
||||
GtkGestureStylus
|
||||
|
||||
gtk_gesture_stylus_new
|
||||
gtk_gesture_stylus_get_axis
|
||||
gtk_gesture_stylus_get_axes
|
||||
gtk_gesture_stylus_get_backlog
|
||||
gtk_gesture_stylus_get_device_tool
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_GESTURE_STYLUS
|
||||
GTK_GESTURE_STYLUS
|
||||
GTK_GESTURE_STYLUS_CLASS
|
||||
GTK_IS_GESTURE_STYLUS
|
||||
GTK_IS_GESTURE_STYLUS_CLASS
|
||||
GTK_GESTURE_STYLUS_GET_CLASS
|
||||
GtkGestureStylusClass
|
||||
|
||||
<SUBSECTION Private>
|
||||
gtk_gesture_stylus_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkstacksidebar</FILE>
|
||||
GtkStackSidebar
|
||||
|
||||
@@ -65,6 +65,9 @@ gtk_entry_completion_get_type
|
||||
gtk_entry_get_type
|
||||
gtk_event_box_get_type
|
||||
gtk_event_controller_get_type
|
||||
gtk_event_controller_key_get_type
|
||||
gtk_event_controller_motion_get_type
|
||||
gtk_event_controller_scroll_get_type
|
||||
gtk_expander_get_type
|
||||
gtk_file_chooser_button_get_type
|
||||
gtk_file_chooser_dialog_get_type
|
||||
@@ -88,6 +91,7 @@ gtk_gesture_multi_press_get_type
|
||||
gtk_gesture_pan_get_type
|
||||
gtk_gesture_rotate_get_type
|
||||
gtk_gesture_single_get_type
|
||||
gtk_gesture_stylus_get_type
|
||||
gtk_gesture_swipe_get_type
|
||||
gtk_gesture_zoom_get_type
|
||||
gtk_gl_area_get_type
|
||||
|
||||
@@ -537,6 +537,18 @@ nevertheless.
|
||||
</para>
|
||||
</formalpara>
|
||||
|
||||
<formalpara>
|
||||
<title><envar>GTK_OVERLAY_SCROLLING</envar></title>
|
||||
|
||||
<para>
|
||||
The default value of this environment variable is 1, which means that each
|
||||
instance of GtkScrolledWindow will choose whether to use overlay or full-
|
||||
size scrollbars via its own GtkScrolledWindow:overlay-scrolling property,
|
||||
which defaults to <literal>TRUE</literal>. If this variable is set to 0,
|
||||
all GtkScrolledWindow instances are made to use full/non-overlay scrollbars.
|
||||
</para>
|
||||
</formalpara>
|
||||
|
||||
<formalpara>
|
||||
<title><envar>XDG_DATA_HOME</envar>, <envar>XDG_DATA_DIRS</envar></title>
|
||||
|
||||
|
||||
+7
-1
@@ -14,12 +14,18 @@ main (int argc,
|
||||
GtkBuilder *builder;
|
||||
GObject *window;
|
||||
GObject *button;
|
||||
GError *error = NULL;
|
||||
|
||||
gtk_init (&argc, &argv);
|
||||
|
||||
/* Construct a GtkBuilder instance and load our UI description */
|
||||
builder = gtk_builder_new ();
|
||||
gtk_builder_add_from_file (builder, "builder.ui", NULL);
|
||||
if (gtk_builder_add_from_file (builder, "builder.ui", &error) == 0)
|
||||
{
|
||||
g_printerr ("Error loading file: %s\n", error->message);
|
||||
g_clear_error (&error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Connect signal handlers to the constructed widgets. */
|
||||
window = gtk_builder_get_object (builder, "window");
|
||||
|
||||
@@ -1267,7 +1267,7 @@ handle_incoming_connection (GSocketService *service,
|
||||
}
|
||||
else
|
||||
{
|
||||
request->connection = g_object_ref (connection);
|
||||
request->connection = G_IO_STREAM (g_object_ref (connection));
|
||||
}
|
||||
|
||||
in = g_io_stream_get_input_stream (request->connection);
|
||||
|
||||
@@ -17,7 +17,6 @@ gdk__private__ (void)
|
||||
gdk_display_set_rendering_mode,
|
||||
gdk_display_get_debug_updates,
|
||||
gdk_display_set_debug_updates,
|
||||
gdk_window_move_to_rect
|
||||
};
|
||||
|
||||
return &table;
|
||||
|
||||
+2
-16
@@ -31,14 +31,6 @@ gboolean gdk_display_get_debug_updates (GdkDisplay *display);
|
||||
void gdk_display_set_debug_updates (GdkDisplay *display,
|
||||
gboolean debug_updates);
|
||||
|
||||
void gdk_window_move_to_rect (GdkWindow *window,
|
||||
const GdkRectangle *rect,
|
||||
GdkGravity rect_anchor,
|
||||
GdkGravity window_anchor,
|
||||
GdkAnchorHints anchor_hints,
|
||||
gint rect_anchor_dx,
|
||||
gint rect_anchor_dy);
|
||||
|
||||
typedef struct {
|
||||
/* add all private functions here, initialize them in gdk-private.c */
|
||||
gboolean (* gdk_device_grab_info) (GdkDisplay *display,
|
||||
@@ -64,17 +56,11 @@ typedef struct {
|
||||
gboolean (* gdk_display_get_debug_updates) (GdkDisplay *display);
|
||||
void (* gdk_display_set_debug_updates) (GdkDisplay *display,
|
||||
gboolean debug_updates);
|
||||
|
||||
void (* gdk_window_move_to_rect) (GdkWindow *window,
|
||||
const GdkRectangle *rect,
|
||||
GdkGravity rect_anchor,
|
||||
GdkGravity window_anchor,
|
||||
GdkAnchorHints anchor_hints,
|
||||
gint rect_anchor_dx,
|
||||
gint rect_anchor_dy);
|
||||
} GdkPrivateVTable;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkPrivateVTable * gdk__private__ (void);
|
||||
|
||||
gboolean gdk_running_in_sandbox (void);
|
||||
|
||||
#endif /* __GDK__PRIVATE_H__ */
|
||||
|
||||
@@ -468,6 +468,19 @@ gdk_display_open_default (void)
|
||||
return display;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gdk_running_in_sandbox (void)
|
||||
{
|
||||
char *path;
|
||||
gboolean ret;
|
||||
|
||||
path = g_build_filename (g_get_user_runtime_dir (), "flatpak-info", NULL);
|
||||
ret = g_file_test (path, G_FILE_TEST_EXISTS);
|
||||
g_free (path);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_display_open_default_libgtk_only:
|
||||
*
|
||||
@@ -601,7 +614,6 @@ gdk_init (int *argc, char ***argv)
|
||||
* management for you.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* gdk_threads_enter:
|
||||
*
|
||||
|
||||
@@ -300,7 +300,7 @@ gdk_device_manager_get_property (GObject *object,
|
||||
* Gets the #GdkDisplay associated to @device_manager.
|
||||
*
|
||||
* Returns: (nullable) (transfer none): the #GdkDisplay to which
|
||||
* @device_manager is associated to, or #NULL. This memory is
|
||||
* @device_manager is associated to, or %NULL. This memory is
|
||||
* owned by GDK and must not be freed or unreferenced.
|
||||
*
|
||||
* Since: 3.0
|
||||
|
||||
+2
-2
@@ -166,7 +166,7 @@ gdk_drag_context_get_source_window (GdkDragContext *context)
|
||||
* gdk_drag_context_get_dest_window:
|
||||
* @context: a #GdkDragContext
|
||||
*
|
||||
* Returns the destination windw for the DND operation.
|
||||
* Returns the destination window for the DND operation.
|
||||
*
|
||||
* Returns: (transfer none): a #GdkWindow
|
||||
*
|
||||
@@ -184,7 +184,7 @@ gdk_drag_context_get_dest_window (GdkDragContext *context)
|
||||
* gdk_drag_context_get_protocol:
|
||||
* @context: a #GdkDragContext
|
||||
*
|
||||
* Returns the drag protocol thats used by this context.
|
||||
* Returns the drag protocol that is used by this context.
|
||||
*
|
||||
* Returns: the drag protocol
|
||||
*
|
||||
|
||||
+29
-12
@@ -520,21 +520,38 @@ typedef enum
|
||||
* @GDK_WINDOW_STATE_ABOVE: the window is kept above other windows.
|
||||
* @GDK_WINDOW_STATE_BELOW: the window is kept below other windows.
|
||||
* @GDK_WINDOW_STATE_FOCUSED: the window is presented as focused (with active decorations).
|
||||
* @GDK_WINDOW_STATE_TILED: the window is in a tiled state, Since 3.10
|
||||
* @GDK_WINDOW_STATE_TILED: the window is in a tiled state, Since 3.10. Since 3.22.23, this
|
||||
* is deprecated in favor of per-edge information.
|
||||
* @GDK_WINDOW_STATE_TOP_TILED: whether the top edge is tiled, Since 3.22.23
|
||||
* @GDK_WINDOW_STATE_TOP_RESIZABLE: whether the top edge is resizable, Since 3.22.23
|
||||
* @GDK_WINDOW_STATE_RIGHT_TILED: whether the right edge is tiled, Since 3.22.23
|
||||
* @GDK_WINDOW_STATE_RIGHT_RESIZABLE: whether the right edge is resizable, Since 3.22.23
|
||||
* @GDK_WINDOW_STATE_BOTTOM_TILED: whether the bottom edge is tiled, Since 3.22.23
|
||||
* @GDK_WINDOW_STATE_BOTTOM_RESIZABLE: whether the bottom edge is resizable, Since 3.22.23
|
||||
* @GDK_WINDOW_STATE_LEFT_TILED: whether the left edge is tiled, Since 3.22.23
|
||||
* @GDK_WINDOW_STATE_LEFT_RESIZABLE: whether the left edge is resizable, Since 3.22.23
|
||||
*
|
||||
* Specifies the state of a toplevel window.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
GDK_WINDOW_STATE_WITHDRAWN = 1 << 0,
|
||||
GDK_WINDOW_STATE_ICONIFIED = 1 << 1,
|
||||
GDK_WINDOW_STATE_MAXIMIZED = 1 << 2,
|
||||
GDK_WINDOW_STATE_STICKY = 1 << 3,
|
||||
GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
|
||||
GDK_WINDOW_STATE_ABOVE = 1 << 5,
|
||||
GDK_WINDOW_STATE_BELOW = 1 << 6,
|
||||
GDK_WINDOW_STATE_FOCUSED = 1 << 7,
|
||||
GDK_WINDOW_STATE_TILED = 1 << 8
|
||||
GDK_WINDOW_STATE_WITHDRAWN = 1 << 0,
|
||||
GDK_WINDOW_STATE_ICONIFIED = 1 << 1,
|
||||
GDK_WINDOW_STATE_MAXIMIZED = 1 << 2,
|
||||
GDK_WINDOW_STATE_STICKY = 1 << 3,
|
||||
GDK_WINDOW_STATE_FULLSCREEN = 1 << 4,
|
||||
GDK_WINDOW_STATE_ABOVE = 1 << 5,
|
||||
GDK_WINDOW_STATE_BELOW = 1 << 6,
|
||||
GDK_WINDOW_STATE_FOCUSED = 1 << 7,
|
||||
GDK_WINDOW_STATE_TILED = 1 << 8,
|
||||
GDK_WINDOW_STATE_TOP_TILED = 1 << 9,
|
||||
GDK_WINDOW_STATE_TOP_RESIZABLE = 1 << 10,
|
||||
GDK_WINDOW_STATE_RIGHT_TILED = 1 << 11,
|
||||
GDK_WINDOW_STATE_RIGHT_RESIZABLE = 1 << 12,
|
||||
GDK_WINDOW_STATE_BOTTOM_TILED = 1 << 13,
|
||||
GDK_WINDOW_STATE_BOTTOM_RESIZABLE = 1 << 14,
|
||||
GDK_WINDOW_STATE_LEFT_TILED = 1 << 15,
|
||||
GDK_WINDOW_STATE_LEFT_RESIZABLE = 1 << 16
|
||||
} GdkWindowState;
|
||||
|
||||
/**
|
||||
@@ -1183,7 +1200,7 @@ struct _GdkEventDND {
|
||||
* @type: the type of the event (%GDK_TOUCHPAD_SWIPE)
|
||||
* @window: the window which received the event
|
||||
* @send_event: %TRUE if the event was sent explicitly
|
||||
* @phase: (type GdkTouchpadGesturePhase): the current phase of the gesture
|
||||
* @phase: the current phase of the gesture
|
||||
* @n_fingers: The number of fingers triggering the swipe
|
||||
* @time: the time of the event in milliseconds
|
||||
* @x: The X coordinate of the pointer
|
||||
@@ -1220,7 +1237,7 @@ struct _GdkEventTouchpadSwipe {
|
||||
* @type: the type of the event (%GDK_TOUCHPAD_PINCH)
|
||||
* @window: the window which received the event
|
||||
* @send_event: %TRUE if the event was sent explicitly
|
||||
* @phase: (type GdkTouchpadGesturePhase): the current phase of the gesture
|
||||
* @phase: the current phase of the gesture
|
||||
* @n_fingers: The number of fingers triggering the pinch
|
||||
* @time: the time of the event in milliseconds
|
||||
* @x: The X coordinate of the pointer
|
||||
|
||||
+5
-5
@@ -477,7 +477,7 @@ gdk_frame_clock_get_timings (GdkFrameClock *frame_clock,
|
||||
*
|
||||
* Returns: (nullable): the #GdkFrameTimings for the frame currently
|
||||
* being processed, or even no frame is being processed, for the
|
||||
* previous frame. Before any frames have been procesed, returns
|
||||
* previous frame. Before any frames have been processed, returns
|
||||
* %NULL.
|
||||
* Since: 3.8
|
||||
*/
|
||||
@@ -541,10 +541,10 @@ _gdk_frame_clock_debug_print_timings (GdkFrameClock *clock,
|
||||
* gdk_frame_clock_get_refresh_info:
|
||||
* @frame_clock: a #GdkFrameClock
|
||||
* @base_time: base time for determining a presentaton time
|
||||
* @refresh_interval_return: a location to store the determined refresh
|
||||
* interval, or %NULL. A default refresh interval of 1/60th of
|
||||
* a second will be stored if no history is present.
|
||||
* @presentation_time_return: a location to store the next
|
||||
* @refresh_interval_return: (out) (optional): a location to store the
|
||||
* determined refresh interval, or %NULL. A default refresh interval of
|
||||
* 1/60th of a second will be stored if no history is present.
|
||||
* @presentation_time_return: (out): a location to store the next
|
||||
* candidate presentation time after the given base time.
|
||||
* 0 will be will be stored if no history is present.
|
||||
*
|
||||
|
||||
+30
-1
@@ -123,6 +123,7 @@ gdk_frame_clock_idle_init (GdkFrameClockIdle *frame_clock_idle)
|
||||
frame_clock_idle->priv = priv =
|
||||
gdk_frame_clock_idle_get_instance_private (frame_clock_idle);
|
||||
|
||||
priv->frame_time = g_get_monotonic_time (); /* more sane than zero */
|
||||
priv->freeze_count = 0;
|
||||
}
|
||||
|
||||
@@ -350,9 +351,37 @@ gdk_frame_clock_paint_idle (void *data)
|
||||
case GDK_FRAME_CLOCK_PHASE_BEFORE_PAINT:
|
||||
if (priv->freeze_count == 0)
|
||||
{
|
||||
priv->frame_time = compute_frame_time (clock_idle);
|
||||
gint64 frame_interval = FRAME_INTERVAL;
|
||||
gint64 reset_frame_time;
|
||||
gint64 smoothest_frame_time;
|
||||
gint64 frame_time_error;
|
||||
GdkFrameTimings *prev_timings =
|
||||
gdk_frame_clock_get_current_timings (clock);
|
||||
|
||||
if (prev_timings && prev_timings->refresh_interval)
|
||||
frame_interval = prev_timings->refresh_interval;
|
||||
|
||||
/* We are likely not getting precisely even callbacks in real
|
||||
* time, particularly if the event loop is busy.
|
||||
* This is a documented limitation in the precision of
|
||||
* gdk_threads_add_timeout_full and g_timeout_add_full.
|
||||
*
|
||||
* In order to avoid this imprecision from compounding between
|
||||
* frames and affecting visual smoothness, we correct frame_time
|
||||
* to more precisely match the even refresh interval of the
|
||||
* physical display. This also means we proactively avoid (most)
|
||||
* missed frames before they occur.
|
||||
*/
|
||||
smoothest_frame_time = priv->frame_time + frame_interval;
|
||||
reset_frame_time = compute_frame_time (clock_idle);
|
||||
frame_time_error = ABS (reset_frame_time - smoothest_frame_time);
|
||||
if (frame_time_error >= frame_interval)
|
||||
priv->frame_time = reset_frame_time;
|
||||
else
|
||||
priv->frame_time = smoothest_frame_time;
|
||||
|
||||
_gdk_frame_clock_begin_frame (clock);
|
||||
/* Note "current" is different now so timings != prev_timings */
|
||||
timings = gdk_frame_clock_get_current_timings (clock);
|
||||
|
||||
timings->frame_time = priv->frame_time;
|
||||
|
||||
+12
-1
@@ -22,6 +22,10 @@
|
||||
|
||||
#include "gdkinternals.h"
|
||||
|
||||
#ifdef GDK_WINDOWING_WIN32
|
||||
# include "win32/gdkwin32.h"
|
||||
#endif
|
||||
|
||||
#include <epoxy/gl.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
@@ -641,6 +645,13 @@ gdk_cairo_draw_from_gl (cairo_t *cr,
|
||||
{
|
||||
/* Software fallback */
|
||||
int major, minor, version;
|
||||
gboolean es_read_bgra = FALSE;
|
||||
|
||||
#ifdef GDK_WINDOWING_WIN32
|
||||
/* on ANGLE GLES, we need to set the glReadPixel() format as GL_BGRA instead */
|
||||
if (GDK_WIN32_IS_GL_CONTEXT(paint_context))
|
||||
es_read_bgra = TRUE;
|
||||
#endif
|
||||
|
||||
gdk_gl_context_get_version (paint_context, &major, &minor);
|
||||
version = major * 100 + minor;
|
||||
@@ -683,7 +694,7 @@ gdk_cairo_draw_from_gl (cairo_t *cr,
|
||||
glReadPixels (x, y, width, height, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
|
||||
cairo_image_surface_get_data (image));
|
||||
else
|
||||
glReadPixels (x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
|
||||
glReadPixels (x, y, width, height, es_read_bgra ? GL_BGRA : GL_RGBA, GL_UNSIGNED_BYTE,
|
||||
cairo_image_surface_get_data (image));
|
||||
|
||||
glPixelStorei (GL_PACK_ROW_LENGTH, 0);
|
||||
|
||||
+9
-3
@@ -340,7 +340,7 @@ gdk_gl_context_class_init (GdkGLContextClass *klass)
|
||||
/**
|
||||
* GdkGLContext:shared-context:
|
||||
*
|
||||
* The #GdkGLContext that this context is sharing data with, or #NULL
|
||||
* The #GdkGLContext that this context is sharing data with, or %NULL
|
||||
*
|
||||
* Since: 3.16
|
||||
*/
|
||||
@@ -793,11 +793,17 @@ gdk_gl_context_check_extensions (GdkGLContext *context)
|
||||
has_npot = priv->gl_version >= 20;
|
||||
has_texture_rectangle = FALSE;
|
||||
|
||||
/* This should check for GL_NV_framebuffer_blit - see extension at:
|
||||
/* This should check for GL_NV_framebuffer_blit as well - see extension at:
|
||||
*
|
||||
* https://www.khronos.org/registry/gles/extensions/NV/NV_framebuffer_blit.txt
|
||||
*
|
||||
* for ANGLE, we can enable bit blitting if we have the
|
||||
* GL_ANGLE_framebuffer_blit extension
|
||||
*/
|
||||
priv->has_gl_framebuffer_blit = FALSE;
|
||||
if (epoxy_has_gl_extension ("GL_ANGLE_framebuffer_blit"))
|
||||
priv->has_gl_framebuffer_blit = TRUE;
|
||||
else
|
||||
priv->has_gl_framebuffer_blit = FALSE;
|
||||
|
||||
/* No OES version */
|
||||
priv->has_frame_terminator = FALSE;
|
||||
|
||||
@@ -277,6 +277,8 @@ gdk_keyval_is_lower (guint keyval)
|
||||
* Returns the #GdkKeymap attached to the default display.
|
||||
*
|
||||
* Returns: (transfer none): the #GdkKeymap attached to the default display.
|
||||
*
|
||||
* Deprecated: 3.22: Use gdk_keymap_get_for_display() instead
|
||||
*/
|
||||
GdkKeymap*
|
||||
gdk_keymap_get_default (void)
|
||||
|
||||
+1
-1
@@ -80,7 +80,7 @@ struct _GdkKeymapKey
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gdk_keymap_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GDK_DEPRECATED_IN_3_22_FOR(gdk_keymap_get_for_display)
|
||||
GdkKeymap* gdk_keymap_get_default (void);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkKeymap* gdk_keymap_get_for_display (GdkDisplay *display);
|
||||
|
||||
+6
-6
@@ -66,12 +66,12 @@ void gdk_notify_startup_complete_with_id (const gchar* startup_
|
||||
|
||||
/* Push and pop error handlers for X errors
|
||||
*/
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GDK_DEPRECATED_IN_3_22_FOR(gdk_x11_display_error_trap_push)
|
||||
void gdk_error_trap_push (void);
|
||||
/* warn unused because you could use pop_ignored otherwise */
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GDK_DEPRECATED_IN_3_22_FOR(gdk_x11_display_error_trap_pop)
|
||||
G_GNUC_WARN_UNUSED_RESULT gint gdk_error_trap_pop (void);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GDK_DEPRECATED_IN_3_22_FOR(gdk_x11_display_error_trap_pop_ignored)
|
||||
void gdk_error_trap_pop_ignored (void);
|
||||
|
||||
|
||||
@@ -114,13 +114,13 @@ gint gdk_screen_width_mm (void) G_GNUC_CONST;
|
||||
GDK_DEPRECATED_IN_3_22
|
||||
gint gdk_screen_height_mm (void) G_GNUC_CONST;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GDK_DEPRECATED_IN_3_22_FOR(gdk_display_set_double_click_time)
|
||||
void gdk_set_double_click_time (guint msec);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GDK_DEPRECATED_IN_3_22_FOR(gdk_display_beep)
|
||||
void gdk_beep (void);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GDK_DEPRECATED_IN_3_22_FOR(gdk_display_flush)
|
||||
void gdk_flush (void);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
|
||||
+4
-4
@@ -32,8 +32,8 @@
|
||||
*
|
||||
* GdkMonitor objects represent the individual outputs that are
|
||||
* associated with a #GdkDisplay. GdkDisplay has APIs to enumerate
|
||||
* monitors with gdk_display_get_monitors() and to find particular
|
||||
* monitors with gdk_display_get_primary_monitor() or
|
||||
* monitors with gdk_display_get_n_monitors() and gdk_display_get_monitor(), and
|
||||
* to find particular monitors with gdk_display_get_primary_monitor() or
|
||||
* gdk_display_get_monitor_at_window().
|
||||
*
|
||||
* GdkMonitor was introduced in GTK+ 3.22 and supersedes earlier
|
||||
@@ -267,7 +267,7 @@ gdk_monitor_get_display (GdkMonitor *monitor)
|
||||
/**
|
||||
* gdk_monitor_get_geometry:
|
||||
* @monitor: a #GdkMonitor
|
||||
* @geometry: (out): a #GdkRectangle to be filled wiht the monitor geometry
|
||||
* @geometry: (out): a #GdkRectangle to be filled with the monitor geometry
|
||||
*
|
||||
* Retrieves the size and position of an individual monitor within the
|
||||
* display coordinate space. The returned geometry is in ”application pixels”,
|
||||
@@ -404,7 +404,7 @@ gdk_monitor_get_model (GdkMonitor *monitor)
|
||||
int
|
||||
gdk_monitor_get_scale_factor (GdkMonitor *monitor)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_MONITOR (monitor), 0);
|
||||
g_return_val_if_fail (GDK_IS_MONITOR (monitor), 1);
|
||||
|
||||
return monitor->scale_factor;
|
||||
}
|
||||
|
||||
+1
-1
@@ -55,7 +55,7 @@ G_DEFINE_BOXED_TYPE (GdkRGBA, gdk_rgba,
|
||||
* 1.0 for opaque
|
||||
*
|
||||
* A #GdkRGBA is used to represent a (possibly translucent)
|
||||
* color, in a way that is compatible with cairos notion of color.
|
||||
* color, in a way that is compatible with cairo’s notion of color.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
||||
+1
-2
@@ -902,8 +902,7 @@ gdk_screen_get_monitor_workarea (GdkScreen *screen,
|
||||
|
||||
g_return_if_fail (monitor != NULL);
|
||||
|
||||
/* FIXME */
|
||||
gdk_monitor_get_geometry (monitor, dest);
|
||||
gdk_monitor_get_workarea (monitor, dest);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -115,8 +115,10 @@ gdk_seat_default_grab (GdkSeat *seat,
|
||||
GdkSeatDefaultPrivate *priv;
|
||||
guint32 evtime = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME;
|
||||
GdkGrabStatus status = GDK_GRAB_SUCCESS;
|
||||
gboolean was_visible;
|
||||
|
||||
priv = gdk_seat_default_get_instance_private (GDK_SEAT_DEFAULT (seat));
|
||||
was_visible = gdk_window_is_visible (window);
|
||||
|
||||
if (prepare_func)
|
||||
(prepare_func) (seat, window, prepare_func_data);
|
||||
@@ -163,10 +165,12 @@ gdk_seat_default_grab (GdkSeat *seat,
|
||||
{
|
||||
if (capabilities & ~GDK_SEAT_CAPABILITY_KEYBOARD)
|
||||
gdk_device_ungrab (priv->master_pointer, evtime);
|
||||
gdk_window_hide (window);
|
||||
}
|
||||
}
|
||||
|
||||
if (status != GDK_GRAB_SUCCESS && !was_visible)
|
||||
gdk_window_hide (window);
|
||||
|
||||
G_GNUC_END_IGNORE_DEPRECATIONS;
|
||||
|
||||
return status;
|
||||
|
||||
+9
-3
@@ -32,10 +32,12 @@
|
||||
|
||||
/**
|
||||
* SECTION:selections
|
||||
* @Short_description: Functions for transfering data via the X selection mechanism
|
||||
* @Short_description: Functions for transferring data between programs
|
||||
* @Title: Selections
|
||||
*
|
||||
* The X selection mechanism provides a way to transfer arbitrary chunks of
|
||||
* GDK’s selection functions, based on the [X selection mechanism](
|
||||
* https://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html),
|
||||
* provide a way to transfer arbitrary chunks of
|
||||
* data between programs. A “selection” is a essentially
|
||||
* a named clipboard, identified by a string interned as a #GdkAtom. By
|
||||
* claiming ownership of a selection, an application indicates that it will
|
||||
@@ -57,7 +59,11 @@
|
||||
* `gtkselection.h` and programmers should use those functions
|
||||
* instead of the ones presented here. If you plan to implement selection
|
||||
* handling directly on top of the functions here, you should refer to the
|
||||
* X Inter-client Communication Conventions Manual (ICCCM).
|
||||
* [X Inter-Client Communication Conventions Manual (ICCCM)](
|
||||
* https://www.x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html).
|
||||
*
|
||||
* Note that although much of the selection API design is based on that of X,
|
||||
* it will work on other GDK backends too.
|
||||
*/
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -451,7 +451,7 @@ typedef enum
|
||||
GDK_SMOOTH_SCROLL_MASK = 1 << 23,
|
||||
GDK_TOUCHPAD_GESTURE_MASK = 1 << 24,
|
||||
GDK_TABLET_PAD_MASK = 1 << 25,
|
||||
GDK_ALL_EVENTS_MASK = 0xFFFFFE
|
||||
GDK_ALL_EVENTS_MASK = 0x3FFFFFE
|
||||
} GdkEventMask;
|
||||
|
||||
/**
|
||||
|
||||
@@ -172,6 +172,16 @@
|
||||
*/
|
||||
#define GDK_VERSION_3_22 (G_ENCODE_VERSION (3, 22))
|
||||
|
||||
/**
|
||||
* GDK_VERSION_3_24:
|
||||
*
|
||||
* A macro that evaluates to the 3.24 version of GDK, in a format
|
||||
* that can be used by the C pre-processor.
|
||||
*
|
||||
* Since: 3.24
|
||||
*/
|
||||
#define GDK_VERSION_3_24 (G_ENCODE_VERSION (3, 24))
|
||||
|
||||
/* evaluates to the current stable version; for development cycles,
|
||||
* this means the next stable target
|
||||
*/
|
||||
@@ -412,5 +422,19 @@
|
||||
# define GDK_AVAILABLE_IN_3_22 _GDK_EXTERN
|
||||
#endif
|
||||
|
||||
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_3_24
|
||||
# define GDK_DEPRECATED_IN_3_24 GDK_DEPRECATED
|
||||
# define GDK_DEPRECATED_IN_3_24_FOR(f) GDK_DEPRECATED_FOR(f)
|
||||
#else
|
||||
# define GDK_DEPRECATED_IN_3_24 _GDK_EXTERN
|
||||
# define GDK_DEPRECATED_IN_3_24_FOR(f) _GDK_EXTERN
|
||||
#endif
|
||||
|
||||
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_3_24
|
||||
# define GDK_AVAILABLE_IN_3_24 GDK_UNAVAILABLE(3, 24)
|
||||
#else
|
||||
# define GDK_AVAILABLE_IN_3_24 _GDK_EXTERN
|
||||
#endif
|
||||
|
||||
#endif /* __GDK_VERSION_MACROS_H__ */
|
||||
|
||||
|
||||
+11
-5
@@ -4164,7 +4164,7 @@ static void
|
||||
gdk_window_process_updates_with_mode (GdkWindow *window,
|
||||
int recurse_mode)
|
||||
{
|
||||
GPtrArray *list = g_ptr_array_new_with_free_func (g_object_unref);
|
||||
GPtrArray *list;
|
||||
int i;
|
||||
|
||||
g_return_if_fail (GDK_IS_WINDOW (window));
|
||||
@@ -4172,6 +4172,7 @@ gdk_window_process_updates_with_mode (GdkWindow *window,
|
||||
if (GDK_WINDOW_DESTROYED (window))
|
||||
return;
|
||||
|
||||
list = g_ptr_array_new_with_free_func (g_object_unref);
|
||||
find_impl_windows_to_update (list, window, recurse_mode);
|
||||
|
||||
if (window->impl_window != window)
|
||||
@@ -5744,6 +5745,7 @@ gdk_window_withdraw (GdkWindow *window)
|
||||
{
|
||||
GdkWindowImplClass *impl_class;
|
||||
gboolean was_mapped;
|
||||
GdkGLContext *current_context;
|
||||
|
||||
g_return_if_fail (GDK_IS_WINDOW (window));
|
||||
|
||||
@@ -5768,6 +5770,10 @@ gdk_window_withdraw (GdkWindow *window)
|
||||
_gdk_synthesize_crossing_events_for_geometry_change (window->parent);
|
||||
}
|
||||
|
||||
current_context = gdk_gl_context_get_current ();
|
||||
if (current_context != NULL && gdk_gl_context_get_window (current_context) == window)
|
||||
gdk_gl_context_clear_current ();
|
||||
|
||||
recompute_visible_regions (window, FALSE);
|
||||
gdk_window_clear_old_updated_area (window);
|
||||
}
|
||||
@@ -6227,8 +6233,7 @@ gdk_window_move_resize (GdkWindow *window,
|
||||
* Connect to the #GdkWindow::moved-to-rect signal to find out how it was
|
||||
* actually positioned.
|
||||
*
|
||||
* Since: 3.22
|
||||
* Stability: Private
|
||||
* Since: 3.24
|
||||
*/
|
||||
void
|
||||
gdk_window_move_to_rect (GdkWindow *window,
|
||||
@@ -9289,8 +9294,9 @@ proxy_pointer_event (GdkDisplay *display,
|
||||
serial, non_linear);
|
||||
_gdk_display_set_window_under_pointer (display, device, pointer_window);
|
||||
}
|
||||
else if (source_event->type == GDK_MOTION_NOTIFY ||
|
||||
source_event->type == GDK_TOUCH_UPDATE)
|
||||
|
||||
if (source_event->type == GDK_MOTION_NOTIFY ||
|
||||
source_event->type == GDK_TOUCH_UPDATE)
|
||||
{
|
||||
GdkWindow *event_win;
|
||||
guint evmask;
|
||||
|
||||
@@ -550,6 +550,15 @@ void gdk_window_move_resize (GdkWindow *window,
|
||||
gint y,
|
||||
gint width,
|
||||
gint height);
|
||||
|
||||
GDK_AVAILABLE_IN_3_24
|
||||
void gdk_window_move_to_rect (GdkWindow *window,
|
||||
const GdkRectangle *rect,
|
||||
GdkGravity rect_anchor,
|
||||
GdkGravity window_anchor,
|
||||
GdkAnchorHints anchor_hints,
|
||||
gint rect_anchor_dx,
|
||||
gint rect_anchor_dy);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gdk_window_reparent (GdkWindow *window,
|
||||
GdkWindow *new_parent,
|
||||
|
||||
+10
-3
@@ -1,6 +1,6 @@
|
||||
/* keyname-table.h: Generated by gen-keyname-table.pl from keynames.txt
|
||||
*
|
||||
* Date: Thu Oct 17 18:16:31 2013
|
||||
* Date: Sat Oct 7 23:00:42 2017
|
||||
*
|
||||
* Do not edit.
|
||||
*/
|
||||
@@ -6832,7 +6832,7 @@ static const gdk_key gdk_keys_by_name[] = {
|
||||
/*
|
||||
* Translators, the strings in the “keyboard label” context are
|
||||
* display names for keyboard keys. Some of them have prefixes like
|
||||
* XF86 or ISO_ - these should be removed in the translation. Similarly,
|
||||
* XF86 or ISO_ — these should be removed in the translation. Similarly,
|
||||
* underscores should be replaced by spaces. The prefix “KP_” stands
|
||||
* for “key pad” and you may want to include that in your translation.
|
||||
* Here are some examples of English translations:
|
||||
@@ -6860,7 +6860,7 @@ NC_("keyboard label", "Begin")
|
||||
NC_("keyboard label", "Print")
|
||||
NC_("keyboard label", "Insert")
|
||||
NC_("keyboard label", "Num_Lock")
|
||||
/* Translators: KP_ means 'key pad' here */
|
||||
/* Translators: KP_ means “key pad” here */
|
||||
NC_("keyboard label", "KP_Space")
|
||||
NC_("keyboard label", "KP_Tab")
|
||||
NC_("keyboard label", "KP_Enter")
|
||||
@@ -6894,6 +6894,13 @@ NC_("keyboard label", "AudioRecord")
|
||||
NC_("keyboard label", "AudioPause")
|
||||
NC_("keyboard label", "AudioRewind")
|
||||
NC_("keyboard label", "AudioMedia")
|
||||
NC_("keyboard label", "Eject")
|
||||
NC_("keyboard label", "Explorer")
|
||||
NC_("keyboard label", "Calculator")
|
||||
NC_("keyboard label", "Mail")
|
||||
NC_("keyboard label", "WWW")
|
||||
NC_("keyboard label", "Search")
|
||||
NC_("keyboard label", "Tools")
|
||||
NC_("keyboard label", "ScreenSaver")
|
||||
NC_("keyboard label", "Battery")
|
||||
NC_("keyboard label", "Launch1")
|
||||
|
||||
@@ -51,6 +51,13 @@ AudioRecord
|
||||
AudioPause
|
||||
AudioRewind
|
||||
AudioMedia
|
||||
Eject
|
||||
Explorer
|
||||
Calculator
|
||||
Mail
|
||||
WWW
|
||||
Search
|
||||
Tools
|
||||
ScreenSaver
|
||||
Battery
|
||||
Launch1
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#import "GdkQuartzNSWindow.h"
|
||||
#include "gdkquartzwindow.h"
|
||||
#include "gdkdnd-quartz.h"
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#import "GdkQuartzView.h"
|
||||
#include "gdkquartzwindow.h"
|
||||
#include "gdkprivate-quartz.h"
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "gdkdnd.h"
|
||||
#include "gdkquartzdnd.h"
|
||||
#include "gdkprivate-quartz.h"
|
||||
@@ -27,7 +28,7 @@ G_DEFINE_TYPE (GdkQuartzDragContext, gdk_quartz_drag_context, GDK_TYPE_DRAG_CONT
|
||||
GdkDragContext *_gdk_quartz_drag_source_context = NULL;
|
||||
|
||||
GdkDragContext *
|
||||
gdk_quartz_drag_source_context ()
|
||||
gdk_quartz_drag_source_context_libgtk_only ()
|
||||
{
|
||||
return _gdk_quartz_drag_source_context;
|
||||
}
|
||||
|
||||
@@ -60,8 +60,11 @@ typedef enum
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkOSXVersion gdk_quartz_osx_version (void);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkAtom gdk_quartz_pasteboard_type_to_atom_libgtk_only (NSString *type);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
NSString *gdk_quartz_target_to_pasteboard_type_libgtk_only (const gchar *target);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
NSString *gdk_quartz_atom_to_pasteboard_type_libgtk_only (GdkAtom atom);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
@@ -48,6 +48,9 @@ GType gdk_quartz_drag_context_get_type (void);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
id gdk_quartz_drag_context_get_dragging_info_libgtk_only (GdkDragContext *context);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkDragContext *gdk_quartz_drag_source_context_libgtk_only (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GDK_QUARTZ_DRAG_CONTEXT_H__ */
|
||||
|
||||
@@ -67,7 +67,7 @@ static void gdk_quartz_screen_calculate_layout (GdkQuartzScreen *screen);
|
||||
static void display_reconfiguration_callback (CGDirectDisplayID display,
|
||||
CGDisplayChangeSummaryFlags flags,
|
||||
void *userInfo);
|
||||
|
||||
static const double dpi = 96.0;
|
||||
static gint get_mm_from_pixels (NSScreen *screen, int pixels);
|
||||
|
||||
G_DEFINE_TYPE (GdkQuartzScreen, gdk_quartz_screen, GDK_TYPE_SCREEN);
|
||||
@@ -76,10 +76,17 @@ static void
|
||||
gdk_quartz_screen_init (GdkQuartzScreen *quartz_screen)
|
||||
{
|
||||
GdkScreen *screen = GDK_SCREEN (quartz_screen);
|
||||
NSDictionary *dd = [[[NSScreen screens] objectAtIndex:0] deviceDescription];
|
||||
NSSize size = [[dd valueForKey:NSDeviceResolution] sizeValue];
|
||||
/* Screen resolution is used exclusively to pass to Pango for font
|
||||
* scaling. There's a long discussion in
|
||||
* https://bugzilla.gnome.org/show_bug.cgi?id=787867 exploring how
|
||||
* screen resolution and pangocairo-coretext interact. The summary
|
||||
* is that MacOS takes care of scaling fonts for Retina screens and
|
||||
* that while the Apple Documentation goes on about "points" they're
|
||||
* CSS points (96/in), not typeography points (72/in) and
|
||||
* pangocairo-coretext needs to default to that scaling factor.
|
||||
*/
|
||||
|
||||
_gdk_screen_set_resolution (screen, size.width);
|
||||
_gdk_screen_set_resolution (screen, dpi);
|
||||
|
||||
gdk_quartz_screen_calculate_layout (quartz_screen);
|
||||
|
||||
@@ -335,9 +342,6 @@ static gint
|
||||
get_mm_from_pixels (NSScreen *screen, int pixels)
|
||||
{
|
||||
const float mm_per_inch = 25.4;
|
||||
NSDictionary *dd = [[[NSScreen screens] objectAtIndex:0] deviceDescription];
|
||||
NSSize size = [[dd valueForKey:NSDeviceResolution] sizeValue];
|
||||
float dpi = size.width;
|
||||
return (pixels / dpi) * mm_per_inch;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ noinst_LTLIBRARIES = \
|
||||
BUILT_SOURCES = \
|
||||
pointer-gestures-unstable-v1-client-protocol.h \
|
||||
pointer-gestures-unstable-v1-protocol.c \
|
||||
xdg-shell-client-protocol.h \
|
||||
xdg-shell-protocol.c \
|
||||
xdg-shell-unstable-v6-client-protocol.h \
|
||||
xdg-shell-unstable-v6-protocol.c \
|
||||
xdg-foreign-unstable-v1-client-protocol.h \
|
||||
@@ -33,6 +35,8 @@ BUILT_SOURCES = \
|
||||
tablet-unstable-v2-protocol.c \
|
||||
keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h \
|
||||
keyboard-shortcuts-inhibit-unstable-v1-protocol.c \
|
||||
server-decoration-client-protocol.h \
|
||||
server-decoration-protocol.c \
|
||||
gtk-shell-client-protocol.h \
|
||||
gtk-shell-protocol.c
|
||||
|
||||
@@ -78,11 +82,11 @@ libgdkwaylandinclude_HEADERS = \
|
||||
.SECONDEXPANSION:
|
||||
|
||||
define protostability
|
||||
$(shell echo $1 | sed 's/.*\(\<unstable\>\|\<stable\>\).*/\1/')
|
||||
$(if $(findstring unstable,$1),unstable,stable)
|
||||
endef
|
||||
|
||||
define protoname
|
||||
$(shell echo $1 | sed 's/\([a-z\-]\+\)-[a-z]\+-v[0-9]\+/\1/')
|
||||
$(shell echo $1 | sed 's/\([a-z\-]\{1,\}\)-[a-z]\{1,\}-v[0-9]\{1,\}/\1/')
|
||||
endef
|
||||
|
||||
%-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml
|
||||
@@ -102,6 +106,7 @@ endef
|
||||
|
||||
EXTRA_DIST += \
|
||||
protocol/gtk-primary-selection.xml \
|
||||
protocol/gtk-shell.xml
|
||||
protocol/gtk-shell.xml \
|
||||
protocol/server-decoration.xml
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
||||
|
||||
@@ -308,6 +308,10 @@ _gdk_wayland_cursor_set_scale (GdkCursor *cursor,
|
||||
|
||||
wayland_cursor->scale = scale;
|
||||
|
||||
/* Blank cursor case */
|
||||
if (g_strcmp0 (wayland_cursor->name, "none") == 0)
|
||||
return;
|
||||
|
||||
_gdk_wayland_cursor_update (display_wayland, wayland_cursor);
|
||||
}
|
||||
|
||||
@@ -345,12 +349,18 @@ _gdk_wayland_display_get_cursor_for_name_with_scale (GdkDisplay *display,
|
||||
"cursor-type", GDK_CURSOR_IS_PIXMAP,
|
||||
"display", display,
|
||||
NULL);
|
||||
private->name = g_strdup (name);
|
||||
private->scale = scale;
|
||||
|
||||
/* Blank cursor case */
|
||||
if (!name || g_str_equal (name, "none") || g_str_equal (name, "blank_cursor"))
|
||||
return GDK_CURSOR (private);
|
||||
{
|
||||
private->name = g_strdup ("none");
|
||||
private->scale = scale;
|
||||
|
||||
return GDK_CURSOR (private);
|
||||
}
|
||||
|
||||
private->name = g_strdup (name);
|
||||
private->scale = scale;
|
||||
|
||||
if (!_gdk_wayland_cursor_update (display_wayland, private))
|
||||
{
|
||||
|
||||
@@ -38,14 +38,20 @@
|
||||
|
||||
#include <xkbcommon/xkbcommon.h>
|
||||
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <sys/mman.h>
|
||||
#if defined(HAVE_DEV_EVDEV_INPUT_H)
|
||||
#include <dev/evdev/input.h>
|
||||
#elif defined(HAVE_LINUX_INPUT_H)
|
||||
#include <linux/input.h>
|
||||
#endif
|
||||
|
||||
#define BUTTON_BASE (BTN_LEFT - 1) /* Used to translate to 1-indexed buttons */
|
||||
|
||||
#ifndef BTN_STYLUS3
|
||||
#define BTN_STYLUS3 0x149 /* Linux 4.15 */
|
||||
#endif
|
||||
|
||||
typedef struct _GdkWaylandDevicePad GdkWaylandDevicePad;
|
||||
typedef struct _GdkWaylandDevicePadClass GdkWaylandDevicePadClass;
|
||||
|
||||
@@ -304,6 +310,9 @@ struct _GdkWaylandDeviceManagerClass
|
||||
GdkDeviceManagerClass parent_class;
|
||||
};
|
||||
|
||||
static void
|
||||
pointer_surface_update_scale (GdkDevice *device);
|
||||
|
||||
static void deliver_key_event (GdkWaylandSeat *seat,
|
||||
uint32_t time_,
|
||||
uint32_t key,
|
||||
@@ -413,13 +422,16 @@ gdk_wayland_device_update_window_cursor (GdkDevice *device)
|
||||
else
|
||||
{
|
||||
pointer->cursor_timeout_id = 0;
|
||||
return TRUE;
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
if (tablet)
|
||||
{
|
||||
if (!tablet->current_tool)
|
||||
return retval;
|
||||
{
|
||||
pointer->cursor_timeout_id = 0;
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
zwp_tablet_tool_v2_set_cursor (tablet->current_tool->wp_tablet_tool,
|
||||
pointer->enter_serial,
|
||||
@@ -434,7 +446,10 @@ gdk_wayland_device_update_window_cursor (GdkDevice *device)
|
||||
x, y);
|
||||
}
|
||||
else
|
||||
return retval;
|
||||
{
|
||||
pointer->cursor_timeout_id = 0;
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
if (buffer)
|
||||
{
|
||||
@@ -456,7 +471,8 @@ gdk_wayland_device_update_window_cursor (GdkDevice *device)
|
||||
|
||||
if (next_image_index != pointer->cursor_image_index)
|
||||
{
|
||||
if (next_image_delay != pointer->cursor_image_delay)
|
||||
if (next_image_delay != pointer->cursor_image_delay ||
|
||||
pointer->cursor_timeout_id == 0)
|
||||
{
|
||||
guint id;
|
||||
|
||||
@@ -728,6 +744,43 @@ gdk_wayland_device_get_focus (GdkDevice *device)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
device_maybe_emit_grab_crossing (GdkDevice *device,
|
||||
GdkWindow *window,
|
||||
guint32 time)
|
||||
{
|
||||
GdkWindow *native = gdk_wayland_device_get_focus (device);
|
||||
GdkWindow *focus = gdk_window_get_toplevel (window);
|
||||
|
||||
if (focus != native)
|
||||
device_emit_grab_crossing (device, focus, window, GDK_CROSSING_GRAB, time);
|
||||
}
|
||||
|
||||
static GdkWindow*
|
||||
device_maybe_emit_ungrab_crossing (GdkDevice *device,
|
||||
guint32 time)
|
||||
{
|
||||
GdkDeviceGrabInfo *grab;
|
||||
GdkWindow *focus = NULL;
|
||||
GdkWindow *native = NULL;
|
||||
GdkWindow *prev_focus = NULL;
|
||||
|
||||
focus = gdk_wayland_device_get_focus (device);
|
||||
grab = _gdk_display_get_last_device_grab (gdk_device_get_display (device), device);
|
||||
|
||||
if (grab)
|
||||
{
|
||||
grab->serial_end = grab->serial_start;
|
||||
prev_focus = grab->window;
|
||||
native = grab->native_window;
|
||||
}
|
||||
|
||||
if (focus != native)
|
||||
device_emit_grab_crossing (device, prev_focus, focus, GDK_CROSSING_UNGRAB, time);
|
||||
|
||||
return prev_focus;
|
||||
}
|
||||
|
||||
static GdkGrabStatus
|
||||
gdk_wayland_device_grab (GdkDevice *device,
|
||||
GdkWindow *window,
|
||||
@@ -738,7 +791,6 @@ gdk_wayland_device_grab (GdkDevice *device,
|
||||
guint32 time_)
|
||||
{
|
||||
GdkWaylandSeat *wayland_seat = GDK_WAYLAND_SEAT (gdk_device_get_seat (device));
|
||||
GdkWindow *prev_focus = gdk_wayland_device_get_focus (device);
|
||||
GdkWaylandPointerData *pointer = GDK_WAYLAND_DEVICE (device)->pointer;
|
||||
|
||||
if (gdk_window_get_window_type (window) == GDK_WINDOW_TEMP &&
|
||||
@@ -750,14 +802,17 @@ gdk_wayland_device_grab (GdkDevice *device,
|
||||
window);
|
||||
}
|
||||
|
||||
if (prev_focus != window)
|
||||
device_emit_grab_crossing (device, prev_focus, window, GDK_CROSSING_GRAB, time_);
|
||||
device_maybe_emit_grab_crossing (device, window, time_);
|
||||
|
||||
if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
|
||||
{
|
||||
/* Device is a keyboard */
|
||||
gdk_wayland_window_inhibit_shortcuts (window,
|
||||
gdk_device_get_seat (device));
|
||||
if (gdk_window_get_window_type (window) == GDK_WINDOW_TOPLEVEL)
|
||||
{
|
||||
gdk_wayland_window_inhibit_shortcuts (window,
|
||||
gdk_device_get_seat (device));
|
||||
}
|
||||
|
||||
return GDK_GRAB_SUCCESS;
|
||||
}
|
||||
else
|
||||
@@ -792,24 +847,9 @@ gdk_wayland_device_ungrab (GdkDevice *device,
|
||||
guint32 time_)
|
||||
{
|
||||
GdkWaylandPointerData *pointer = GDK_WAYLAND_DEVICE (device)->pointer;
|
||||
GdkDisplay *display;
|
||||
GdkDeviceGrabInfo *grab;
|
||||
GdkWindow *focus, *prev_focus = NULL;
|
||||
GdkWindow *prev_focus;
|
||||
|
||||
display = gdk_device_get_display (device);
|
||||
|
||||
grab = _gdk_display_get_last_device_grab (display, device);
|
||||
|
||||
if (grab)
|
||||
{
|
||||
grab->serial_end = grab->serial_start;
|
||||
prev_focus = grab->window;
|
||||
}
|
||||
|
||||
focus = gdk_wayland_device_get_focus (device);
|
||||
|
||||
if (focus != prev_focus)
|
||||
device_emit_grab_crossing (device, prev_focus, focus, GDK_CROSSING_UNGRAB, time_);
|
||||
prev_focus = device_maybe_emit_ungrab_crossing (device, time_);
|
||||
|
||||
if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
|
||||
{
|
||||
@@ -3815,6 +3855,8 @@ tablet_tool_handle_button (void *data,
|
||||
n_button = GDK_BUTTON_SECONDARY;
|
||||
else if (button == BTN_STYLUS2)
|
||||
n_button = GDK_BUTTON_MIDDLE;
|
||||
else if (button == BTN_STYLUS3)
|
||||
n_button = 8; /* Back */
|
||||
else
|
||||
return;
|
||||
|
||||
@@ -3966,7 +4008,7 @@ tablet_pad_ring_handle_angle (void *data,
|
||||
GdkWaylandTabletPadGroupData *group = data;
|
||||
|
||||
GDK_NOTE (EVENTS,
|
||||
g_message ("tablet pad ring handle angle, %s ring = %p angle = %f",
|
||||
g_message ("tablet pad ring handle angle, ring = %p angle = %f",
|
||||
wp_tablet_pad_ring, wl_fixed_to_double (angle)));
|
||||
|
||||
group->axis_tmp_info.value = wl_fixed_to_double (angle);
|
||||
@@ -4462,10 +4504,18 @@ static const struct zwp_tablet_seat_v2_listener tablet_seat_listener = {
|
||||
tablet_seat_handle_pad_added,
|
||||
};
|
||||
|
||||
static void
|
||||
on_monitors_changed (GdkScreen *screen,
|
||||
GdkWaylandSeat *seat)
|
||||
{
|
||||
pointer_surface_update_scale (seat->master_pointer);
|
||||
}
|
||||
|
||||
static void
|
||||
init_devices (GdkWaylandSeat *seat)
|
||||
{
|
||||
GdkWaylandDeviceManager *device_manager = GDK_WAYLAND_DEVICE_MANAGER (seat->device_manager);
|
||||
GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (seat->display);
|
||||
|
||||
/* pointer */
|
||||
seat->master_pointer = g_object_new (GDK_TYPE_WAYLAND_DEVICE,
|
||||
@@ -4485,6 +4535,9 @@ init_devices (GdkWaylandSeat *seat)
|
||||
g_list_prepend (device_manager->devices, seat->master_pointer);
|
||||
g_signal_emit_by_name (device_manager, "device-added", seat->master_pointer);
|
||||
|
||||
g_signal_connect (display->screen, "monitors-changed",
|
||||
G_CALLBACK (on_monitors_changed), seat);
|
||||
|
||||
/* keyboard */
|
||||
seat->master_keyboard = g_object_new (GDK_TYPE_WAYLAND_DEVICE,
|
||||
"name", "Core Keyboard",
|
||||
@@ -4724,11 +4777,8 @@ gdk_wayland_seat_grab (GdkSeat *seat,
|
||||
if (wayland_seat->master_pointer &&
|
||||
capabilities & GDK_SEAT_CAPABILITY_POINTER)
|
||||
{
|
||||
GdkWindow *prev_focus = gdk_wayland_device_get_focus (wayland_seat->master_pointer);
|
||||
|
||||
if (prev_focus != native)
|
||||
device_emit_grab_crossing (wayland_seat->master_pointer, prev_focus,
|
||||
native, GDK_CROSSING_GRAB, evtime);
|
||||
device_maybe_emit_grab_crossing (wayland_seat->master_pointer,
|
||||
native, evtime);
|
||||
|
||||
_gdk_display_add_device_grab (display,
|
||||
wayland_seat->master_pointer,
|
||||
@@ -4749,11 +4799,8 @@ gdk_wayland_seat_grab (GdkSeat *seat,
|
||||
if (wayland_seat->touch_master &&
|
||||
capabilities & GDK_SEAT_CAPABILITY_TOUCH)
|
||||
{
|
||||
GdkWindow *prev_focus = gdk_wayland_device_get_focus (wayland_seat->touch_master);
|
||||
|
||||
if (prev_focus != native)
|
||||
device_emit_grab_crossing (wayland_seat->touch_master, prev_focus,
|
||||
native, GDK_CROSSING_GRAB, evtime);
|
||||
device_maybe_emit_grab_crossing (wayland_seat->touch_master,
|
||||
native, evtime);
|
||||
|
||||
_gdk_display_add_device_grab (display,
|
||||
wayland_seat->touch_master,
|
||||
@@ -4770,11 +4817,8 @@ gdk_wayland_seat_grab (GdkSeat *seat,
|
||||
if (wayland_seat->master_keyboard &&
|
||||
capabilities & GDK_SEAT_CAPABILITY_KEYBOARD)
|
||||
{
|
||||
GdkWindow *prev_focus = gdk_wayland_device_get_focus (wayland_seat->master_keyboard);
|
||||
|
||||
if (prev_focus != native)
|
||||
device_emit_grab_crossing (wayland_seat->master_keyboard, prev_focus,
|
||||
native, GDK_CROSSING_GRAB, evtime);
|
||||
device_maybe_emit_grab_crossing (wayland_seat->master_keyboard,
|
||||
native, evtime);
|
||||
|
||||
_gdk_display_add_device_grab (display,
|
||||
wayland_seat->master_keyboard,
|
||||
@@ -4787,8 +4831,9 @@ gdk_wayland_seat_grab (GdkSeat *seat,
|
||||
evtime,
|
||||
FALSE);
|
||||
|
||||
/* Inhibit shortcuts if the seat grab is for the keyboard only */
|
||||
if (capabilities == GDK_SEAT_CAPABILITY_KEYBOARD)
|
||||
/* Inhibit shortcuts on toplevels if the seat grab is for the keyboard only */
|
||||
if (capabilities == GDK_SEAT_CAPABILITY_KEYBOARD &&
|
||||
native->window_type == GDK_WINDOW_TOPLEVEL)
|
||||
gdk_wayland_window_inhibit_shortcuts (window, seat);
|
||||
}
|
||||
|
||||
@@ -4798,11 +4843,8 @@ gdk_wayland_seat_grab (GdkSeat *seat,
|
||||
for (l = wayland_seat->tablets; l; l = l->next)
|
||||
{
|
||||
GdkWaylandTabletData *tablet = l->data;
|
||||
GdkWindow *prev_focus = gdk_wayland_device_get_focus (tablet->master);
|
||||
|
||||
if (prev_focus != native)
|
||||
device_emit_grab_crossing (tablet->master, prev_focus,
|
||||
native, GDK_CROSSING_GRAB, evtime);
|
||||
device_maybe_emit_grab_crossing (tablet->master, native, evtime);
|
||||
|
||||
_gdk_display_add_device_grab (display,
|
||||
tablet->master,
|
||||
@@ -4836,36 +4878,20 @@ gdk_wayland_seat_ungrab (GdkSeat *seat)
|
||||
|
||||
if (wayland_seat->master_pointer)
|
||||
{
|
||||
GdkWindow *focus, *prev_focus = NULL;
|
||||
|
||||
grab = _gdk_display_get_last_device_grab (display, wayland_seat->master_pointer);
|
||||
|
||||
if (grab)
|
||||
{
|
||||
grab->serial_end = grab->serial_start;
|
||||
prev_focus = grab->window;
|
||||
}
|
||||
|
||||
focus = gdk_wayland_device_get_focus (wayland_seat->master_pointer);
|
||||
|
||||
if (focus != prev_focus)
|
||||
device_emit_grab_crossing (wayland_seat->master_pointer, prev_focus,
|
||||
focus, GDK_CROSSING_UNGRAB,
|
||||
GDK_CURRENT_TIME);
|
||||
device_maybe_emit_ungrab_crossing (wayland_seat->master_pointer,
|
||||
GDK_CURRENT_TIME);
|
||||
|
||||
gdk_wayland_device_update_window_cursor (wayland_seat->master_pointer);
|
||||
}
|
||||
|
||||
if (wayland_seat->master_keyboard)
|
||||
{
|
||||
grab = _gdk_display_get_last_device_grab (display, wayland_seat->master_keyboard);
|
||||
GdkWindow *prev_focus;
|
||||
|
||||
if (grab)
|
||||
{
|
||||
grab->serial_end = grab->serial_start;
|
||||
if (grab->window)
|
||||
gdk_wayland_window_restore_shortcuts (grab->window, seat);
|
||||
}
|
||||
prev_focus = device_maybe_emit_ungrab_crossing (wayland_seat->master_keyboard,
|
||||
GDK_CURRENT_TIME);
|
||||
if (prev_focus)
|
||||
gdk_wayland_window_restore_shortcuts (prev_focus, seat);
|
||||
}
|
||||
|
||||
if (wayland_seat->touch_master)
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "tablet-unstable-v2-client-protocol.h"
|
||||
#include "xdg-shell-unstable-v6-client-protocol.h"
|
||||
#include "xdg-foreign-unstable-v1-client-protocol.h"
|
||||
#include "server-decoration-client-protocol.h"
|
||||
|
||||
/**
|
||||
* SECTION:wayland_interaction
|
||||
@@ -82,6 +83,8 @@
|
||||
|
||||
#define MIN_SYSTEM_BELL_DELAY_MS 20
|
||||
|
||||
#define GTK_SHELL1_VERSION 2
|
||||
|
||||
static void _gdk_wayland_display_load_cursor_theme (GdkWaylandDisplay *display_wayland);
|
||||
|
||||
G_DEFINE_TYPE (GdkWaylandDisplay, gdk_wayland_display, GDK_TYPE_DISPLAY)
|
||||
@@ -116,9 +119,28 @@ _gdk_wayland_display_async_roundtrip (GdkWaylandDisplay *display_wayland)
|
||||
}
|
||||
|
||||
static void
|
||||
xdg_shell_ping (void *data,
|
||||
struct zxdg_shell_v6 *xdg_shell,
|
||||
uint32_t serial)
|
||||
xdg_wm_base_ping (void *data,
|
||||
struct xdg_wm_base *xdg_wm_base,
|
||||
uint32_t serial)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
|
||||
_gdk_wayland_display_update_serial (display_wayland, serial);
|
||||
|
||||
GDK_NOTE (EVENTS,
|
||||
g_message ("ping, shell %p, serial %u\n", xdg_wm_base, serial));
|
||||
|
||||
xdg_wm_base_pong (xdg_wm_base, serial);
|
||||
}
|
||||
|
||||
static const struct xdg_wm_base_listener xdg_wm_base_listener = {
|
||||
xdg_wm_base_ping,
|
||||
};
|
||||
|
||||
static void
|
||||
zxdg_shell_v6_ping (void *data,
|
||||
struct zxdg_shell_v6 *xdg_shell,
|
||||
uint32_t serial)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
|
||||
@@ -130,8 +152,8 @@ xdg_shell_ping (void *data,
|
||||
zxdg_shell_v6_pong (xdg_shell, serial);
|
||||
}
|
||||
|
||||
static const struct zxdg_shell_v6_listener xdg_shell_listener = {
|
||||
xdg_shell_ping,
|
||||
static const struct zxdg_shell_v6_listener zxdg_shell_v6_listener = {
|
||||
zxdg_shell_v6_ping,
|
||||
};
|
||||
|
||||
static gboolean
|
||||
@@ -331,6 +353,35 @@ static const struct wl_shm_listener wl_shm_listener = {
|
||||
wl_shm_format
|
||||
};
|
||||
|
||||
static void
|
||||
server_decoration_manager_default_mode (void *data,
|
||||
struct org_kde_kwin_server_decoration_manager *manager,
|
||||
uint32_t mode)
|
||||
{
|
||||
g_assert (mode <= ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_SERVER);
|
||||
const char *modes[] = {
|
||||
[ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_NONE] = "none",
|
||||
[ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_CLIENT] = "client",
|
||||
[ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_SERVER] = "server",
|
||||
};
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
g_debug ("Compositor prefers decoration mode '%s'", modes[mode]);
|
||||
display_wayland->server_decoration_mode = mode;
|
||||
}
|
||||
|
||||
static const struct org_kde_kwin_server_decoration_manager_listener server_decoration_listener = {
|
||||
.default_mode = server_decoration_manager_default_mode
|
||||
};
|
||||
|
||||
gboolean
|
||||
gdk_wayland_display_prefers_ssd (GdkDisplay *display)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
if (display_wayland->server_decoration_manager)
|
||||
return display_wayland->server_decoration_mode == ORG_KDE_KWIN_SERVER_DECORATION_MANAGER_MODE_SERVER;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_registry_handle_global (void *data,
|
||||
struct wl_registry *registry,
|
||||
@@ -340,7 +391,6 @@ gdk_registry_handle_global (void *data,
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
struct wl_output *output;
|
||||
gboolean handled = TRUE;
|
||||
|
||||
GDK_NOTE (MISC,
|
||||
g_message ("add global %u, interface %s, version %u", id, interface, version));
|
||||
@@ -357,21 +407,20 @@ gdk_registry_handle_global (void *data,
|
||||
wl_registry_bind (display_wayland->wl_registry, id, &wl_shm_interface, 1);
|
||||
wl_shm_add_listener (display_wayland->shm, &wl_shm_listener, display_wayland);
|
||||
}
|
||||
else if (strcmp (interface, "xdg_wm_base") == 0)
|
||||
{
|
||||
display_wayland->xdg_wm_base_id = id;
|
||||
}
|
||||
else if (strcmp (interface, "zxdg_shell_v6") == 0)
|
||||
{
|
||||
display_wayland->xdg_shell =
|
||||
wl_registry_bind (display_wayland->wl_registry, id,
|
||||
&zxdg_shell_v6_interface, 1);
|
||||
zxdg_shell_v6_add_listener (display_wayland->xdg_shell,
|
||||
&xdg_shell_listener,
|
||||
display_wayland);
|
||||
display_wayland->zxdg_shell_v6_id = id;
|
||||
}
|
||||
else if (strcmp (interface, "gtk_shell1") == 0)
|
||||
{
|
||||
display_wayland->gtk_shell =
|
||||
wl_registry_bind(display_wayland->wl_registry, id,
|
||||
>k_shell1_interface,
|
||||
1);
|
||||
MIN (version, GTK_SHELL1_VERSION));
|
||||
_gdk_wayland_screen_set_has_gtk_shell (display_wayland->screen);
|
||||
display_wayland->gtk_shell_version = version;
|
||||
}
|
||||
@@ -454,12 +503,18 @@ gdk_registry_handle_global (void *data,
|
||||
wl_registry_bind (display_wayland->wl_registry, id,
|
||||
&zwp_keyboard_shortcuts_inhibit_manager_v1_interface, 1);
|
||||
}
|
||||
else
|
||||
handled = FALSE;
|
||||
else if (strcmp (interface, "org_kde_kwin_server_decoration_manager") == 0)
|
||||
{
|
||||
display_wayland->server_decoration_manager =
|
||||
wl_registry_bind (display_wayland->wl_registry, id,
|
||||
&org_kde_kwin_server_decoration_manager_interface, 1);
|
||||
org_kde_kwin_server_decoration_manager_add_listener (display_wayland->server_decoration_manager,
|
||||
&server_decoration_listener,
|
||||
display_wayland);
|
||||
}
|
||||
|
||||
if (handled)
|
||||
g_hash_table_insert (display_wayland->known_globals,
|
||||
GUINT_TO_POINTER (id), g_strdup (interface));
|
||||
g_hash_table_insert (display_wayland->known_globals,
|
||||
GUINT_TO_POINTER (id), g_strdup (interface));
|
||||
|
||||
process_on_globals_closures (display_wayland);
|
||||
}
|
||||
@@ -566,11 +621,32 @@ _gdk_wayland_display_open (const gchar *display_name)
|
||||
}
|
||||
}
|
||||
|
||||
/* Make sure we have xdg_shell at least */
|
||||
if (display_wayland->xdg_shell == NULL)
|
||||
if (display_wayland->xdg_wm_base_id)
|
||||
{
|
||||
g_warning ("Wayland compositor does not support xdg_shell interface,"
|
||||
" not using Wayland display");
|
||||
display_wayland->shell_variant = GDK_WAYLAND_SHELL_VARIANT_XDG_SHELL;
|
||||
display_wayland->xdg_wm_base =
|
||||
wl_registry_bind (display_wayland->wl_registry,
|
||||
display_wayland->xdg_wm_base_id,
|
||||
&xdg_wm_base_interface, 1);
|
||||
xdg_wm_base_add_listener (display_wayland->xdg_wm_base,
|
||||
&xdg_wm_base_listener,
|
||||
display_wayland);
|
||||
}
|
||||
else if (display_wayland->zxdg_shell_v6_id)
|
||||
{
|
||||
display_wayland->shell_variant = GDK_WAYLAND_SHELL_VARIANT_ZXDG_SHELL_V6;
|
||||
display_wayland->zxdg_shell_v6 =
|
||||
wl_registry_bind (display_wayland->wl_registry,
|
||||
display_wayland->zxdg_shell_v6_id,
|
||||
&zxdg_shell_v6_interface, 1);
|
||||
zxdg_shell_v6_add_listener (display_wayland->zxdg_shell_v6,
|
||||
&zxdg_shell_v6_listener,
|
||||
display_wayland);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("The Wayland compositor does not provide any supported shell interface, "
|
||||
"not using Wayland display");
|
||||
g_object_unref (display);
|
||||
|
||||
return NULL;
|
||||
@@ -1200,6 +1276,9 @@ open_shared_memory (void)
|
||||
|
||||
if (force_shm_open)
|
||||
{
|
||||
#if defined (__FreeBSD__)
|
||||
ret = shm_open (SHM_ANON, O_CREAT | O_EXCL | O_RDWR | O_CLOEXEC, 0600);
|
||||
#else
|
||||
char name[NAME_MAX - 1] = "";
|
||||
|
||||
sprintf (name, "/gdk-wayland-%x", g_random_int ());
|
||||
@@ -1210,6 +1289,7 @@ open_shared_memory (void)
|
||||
shm_unlink (name);
|
||||
else if (errno == EEXIST)
|
||||
continue;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
while (ret < 0 && errno == EINTR);
|
||||
@@ -1345,3 +1425,37 @@ gdk_wayland_display_get_selection (GdkDisplay *display)
|
||||
|
||||
return display_wayland->selection;
|
||||
}
|
||||
|
||||
/**
|
||||
* gdk_wayland_display_query_registry:
|
||||
* @display: a wayland #GdkDisplay
|
||||
* @interface: global interface to query in the registry
|
||||
*
|
||||
* Returns %TRUE if the the interface was found in the display
|
||||
* wl_registry.global handler.
|
||||
*
|
||||
* Returns: %TRUE if the global is offered by the compositor
|
||||
*
|
||||
* Since: 3.22.27
|
||||
**/
|
||||
gboolean
|
||||
gdk_wayland_display_query_registry (GdkDisplay *display,
|
||||
const gchar *global)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
GHashTableIter iter;
|
||||
gchar *value;
|
||||
|
||||
g_return_val_if_fail (GDK_IS_WAYLAND_DISPLAY (display), FALSE);
|
||||
g_return_val_if_fail (global != NULL, FALSE);
|
||||
|
||||
g_hash_table_iter_init (&iter, display_wayland->known_globals);
|
||||
|
||||
while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &value))
|
||||
{
|
||||
if (strcmp (value, global) == 0)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -29,9 +29,11 @@
|
||||
#include <wayland-egl.h>
|
||||
#include <gdk/wayland/tablet-unstable-v2-client-protocol.h>
|
||||
#include <gdk/wayland/gtk-shell-client-protocol.h>
|
||||
#include <gdk/wayland/xdg-shell-client-protocol.h>
|
||||
#include <gdk/wayland/xdg-shell-unstable-v6-client-protocol.h>
|
||||
#include <gdk/wayland/xdg-foreign-unstable-v1-client-protocol.h>
|
||||
#include <gdk/wayland/keyboard-shortcuts-inhibit-unstable-v1-client-protocol.h>
|
||||
#include <gdk/wayland/server-decoration-client-protocol.h>
|
||||
|
||||
#include <glib.h>
|
||||
#include <gdk/gdkkeys.h>
|
||||
@@ -45,13 +47,19 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GDK_WAYLAND_MAX_THEME_SCALE 2
|
||||
#define GDK_WAYLAND_MAX_THEME_SCALE 3
|
||||
#define GDK_WAYLAND_THEME_SCALES_COUNT GDK_WAYLAND_MAX_THEME_SCALE
|
||||
|
||||
#define GDK_ZWP_POINTER_GESTURES_V1_VERSION 1
|
||||
|
||||
typedef struct _GdkWaylandSelection GdkWaylandSelection;
|
||||
|
||||
typedef enum _GdkWaylandShellVariant
|
||||
{
|
||||
GDK_WAYLAND_SHELL_VARIANT_XDG_SHELL,
|
||||
GDK_WAYLAND_SHELL_VARIANT_ZXDG_SHELL_V6,
|
||||
} GdkWaylandShellVariant;
|
||||
|
||||
struct _GdkWaylandDisplay
|
||||
{
|
||||
GdkDisplay parent_instance;
|
||||
@@ -63,12 +71,17 @@ struct _GdkWaylandDisplay
|
||||
/* Most recent serial */
|
||||
guint32 serial;
|
||||
|
||||
uint32_t xdg_wm_base_id;
|
||||
uint32_t zxdg_shell_v6_id;
|
||||
GdkWaylandShellVariant shell_variant;
|
||||
|
||||
/* Wayland fields below */
|
||||
struct wl_display *wl_display;
|
||||
struct wl_registry *wl_registry;
|
||||
struct wl_compositor *compositor;
|
||||
struct wl_shm *shm;
|
||||
struct zxdg_shell_v6 *xdg_shell;
|
||||
struct xdg_wm_base *xdg_wm_base;
|
||||
struct zxdg_shell_v6 *zxdg_shell_v6;
|
||||
struct gtk_shell1 *gtk_shell;
|
||||
struct wl_input_device *input_device;
|
||||
struct wl_data_device_manager *data_device_manager;
|
||||
@@ -79,6 +92,7 @@ struct _GdkWaylandDisplay
|
||||
struct zxdg_exporter_v1 *xdg_exporter;
|
||||
struct zxdg_importer_v1 *xdg_importer;
|
||||
struct zwp_keyboard_shortcuts_inhibit_manager_v1 *keyboard_shortcuts_inhibit;
|
||||
struct org_kde_kwin_server_decoration_manager *server_decoration_manager;
|
||||
|
||||
GList *async_roundtrips;
|
||||
|
||||
@@ -106,6 +120,8 @@ struct _GdkWaylandDisplay
|
||||
int data_device_manager_version;
|
||||
int gtk_shell_version;
|
||||
|
||||
uint32_t server_decoration_mode;
|
||||
|
||||
struct xkb_context *xkb_context;
|
||||
|
||||
GdkWaylandSelection *selection;
|
||||
|
||||
@@ -50,6 +50,10 @@ typedef struct {
|
||||
const gchar *hintstyle;
|
||||
} GsdXftSettings;
|
||||
|
||||
typedef struct {
|
||||
guint fontconfig_timestamp;
|
||||
gchar *modules;
|
||||
} GsdExtSettings;
|
||||
|
||||
struct _GdkWaylandScreen
|
||||
{
|
||||
@@ -66,6 +70,11 @@ struct _GdkWaylandScreen
|
||||
|
||||
GHashTable *settings;
|
||||
GsdXftSettings xft_settings;
|
||||
GsdExtSettings dbus_settings;
|
||||
|
||||
GDBusProxy *dbus_proxy;
|
||||
GCancellable *dbus_cancellable;
|
||||
gulong dbus_setting_change_id;
|
||||
|
||||
guint32 shell_capabilities;
|
||||
};
|
||||
@@ -77,6 +86,8 @@ struct _GdkWaylandScreenClass
|
||||
|
||||
#define OUTPUT_VERSION_WITH_DONE 2
|
||||
|
||||
#define GTK_SETTINGS_DBUS_PATH "/org/gtk/Settings"
|
||||
#define GTK_SETTINGS_DBUS_NAME "org.gtk.Settings"
|
||||
|
||||
GType _gdk_wayland_screen_get_type (void);
|
||||
|
||||
@@ -87,6 +98,15 @@ gdk_wayland_screen_dispose (GObject *object)
|
||||
{
|
||||
GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (object);
|
||||
|
||||
if (screen_wayland->dbus_proxy && screen_wayland->dbus_setting_change_id > 0)
|
||||
{
|
||||
g_signal_handler_disconnect (screen_wayland->dbus_proxy,
|
||||
screen_wayland->dbus_setting_change_id);
|
||||
screen_wayland->dbus_setting_change_id = 0;
|
||||
}
|
||||
|
||||
g_cancellable_cancel (screen_wayland->dbus_cancellable);
|
||||
|
||||
if (screen_wayland->root_window)
|
||||
_gdk_window_destroy (screen_wayland->root_window, FALSE);
|
||||
|
||||
@@ -98,6 +118,9 @@ gdk_wayland_screen_finalize (GObject *object)
|
||||
{
|
||||
GdkWaylandScreen *screen_wayland = GDK_WAYLAND_SCREEN (object);
|
||||
|
||||
g_clear_object (&screen_wayland->dbus_proxy);
|
||||
g_clear_object (&screen_wayland->dbus_cancellable);
|
||||
|
||||
if (screen_wayland->root_window)
|
||||
g_object_unref (screen_wayland->root_window);
|
||||
|
||||
@@ -105,6 +128,8 @@ gdk_wayland_screen_finalize (GObject *object)
|
||||
|
||||
g_hash_table_destroy (screen_wayland->settings);
|
||||
|
||||
g_free (screen_wayland->dbus_settings.modules);
|
||||
|
||||
G_OBJECT_CLASS (_gdk_wayland_screen_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
@@ -653,10 +678,14 @@ gdk_wayland_screen_get_setting (GdkScreen *screen,
|
||||
const gchar *name,
|
||||
GValue *value)
|
||||
{
|
||||
GdkWaylandScreen *wayland_screen = GDK_WAYLAND_SCREEN (screen);
|
||||
TranslationEntry *entry;
|
||||
|
||||
g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
|
||||
|
||||
if (g_settings_schema_source_get_default () == NULL)
|
||||
return FALSE;
|
||||
|
||||
entry = find_translation_entry_by_setting (name);
|
||||
if (entry != NULL)
|
||||
{
|
||||
@@ -685,6 +714,18 @@ gdk_wayland_screen_get_setting (GdkScreen *screen,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (strcmp (name, "gtk-fontconfig-timestamp") == 0)
|
||||
{
|
||||
g_value_set_uint (value, wayland_screen->dbus_settings.fontconfig_timestamp);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (strcmp (name, "gtk-modules") == 0)
|
||||
{
|
||||
g_value_set_string (value, wayland_screen->dbus_settings.modules);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -822,6 +863,107 @@ gdk_wayland_visual_new (GdkScreen *screen)
|
||||
return visual;
|
||||
}
|
||||
|
||||
static void
|
||||
dbus_properties_change_cb (GDBusProxy *proxy,
|
||||
GVariant *changed_properties,
|
||||
const gchar* const *invalidated_properties,
|
||||
gpointer user_data)
|
||||
{
|
||||
GdkWaylandScreen *screen_wayland = user_data;
|
||||
GVariant *value;
|
||||
gint64 timestamp;
|
||||
|
||||
if (g_variant_n_children (changed_properties) <= 0)
|
||||
return;
|
||||
|
||||
value = g_variant_lookup_value (changed_properties,
|
||||
"FontconfigTimestamp",
|
||||
G_VARIANT_TYPE_INT64);
|
||||
|
||||
if (value != NULL)
|
||||
{
|
||||
timestamp = g_variant_get_int64 (value);
|
||||
timestamp = timestamp / G_TIME_SPAN_SECOND;
|
||||
|
||||
if (timestamp > 0 && timestamp <= G_MAXUINT)
|
||||
screen_wayland->dbus_settings.fontconfig_timestamp = (guint)timestamp;
|
||||
else if (timestamp > G_MAXUINT)
|
||||
g_warning ("Could not handle fontconfig update: timestamp out of bound");
|
||||
|
||||
notify_setting (GDK_SCREEN (screen_wayland), "gtk-fontconfig-timestamp");
|
||||
|
||||
g_variant_unref (value);
|
||||
}
|
||||
|
||||
value = g_variant_lookup_value (changed_properties,
|
||||
"Modules",
|
||||
G_VARIANT_TYPE_STRING);
|
||||
|
||||
if (value != NULL)
|
||||
{
|
||||
g_free (screen_wayland->dbus_settings.modules);
|
||||
|
||||
screen_wayland->dbus_settings.modules = g_variant_dup_string (value, NULL);
|
||||
|
||||
notify_setting (GDK_SCREEN (screen_wayland), "gtk-modules");
|
||||
|
||||
g_variant_unref (value);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
fontconfig_dbus_proxy_open_cb (GObject *object,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
GdkWaylandScreen *screen_wayland = user_data;
|
||||
GDBusProxy *proxy;
|
||||
GVariant *value;
|
||||
gint64 timestamp;
|
||||
|
||||
proxy = g_dbus_proxy_new_for_bus_finish (result, NULL);
|
||||
|
||||
if (proxy == NULL)
|
||||
return;
|
||||
|
||||
screen_wayland->dbus_proxy = proxy;
|
||||
screen_wayland->dbus_setting_change_id =
|
||||
g_signal_connect (screen_wayland->dbus_proxy,
|
||||
"g-properties-changed",
|
||||
G_CALLBACK (dbus_properties_change_cb),
|
||||
screen_wayland);
|
||||
|
||||
value = g_dbus_proxy_get_cached_property (screen_wayland->dbus_proxy,
|
||||
"FontconfigTimestamp");
|
||||
|
||||
if (value && g_variant_is_of_type (value, G_VARIANT_TYPE_INT64))
|
||||
{
|
||||
timestamp = g_variant_get_int64 (value);
|
||||
timestamp = timestamp / G_TIME_SPAN_SECOND;
|
||||
|
||||
if (timestamp > 0 && timestamp <= G_MAXUINT)
|
||||
screen_wayland->dbus_settings.fontconfig_timestamp = (guint)timestamp;
|
||||
else if (timestamp > G_MAXUINT)
|
||||
g_warning ("Could not handle fontconfig init: timestamp out of bound");
|
||||
}
|
||||
|
||||
if (value != NULL)
|
||||
g_variant_unref (value);
|
||||
|
||||
value = g_dbus_proxy_get_cached_property (screen_wayland->dbus_proxy,
|
||||
"Modules");
|
||||
|
||||
if (value && g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
|
||||
{
|
||||
g_free (screen_wayland->dbus_settings.modules);
|
||||
|
||||
screen_wayland->dbus_settings.modules = g_variant_dup_string (value, NULL);
|
||||
}
|
||||
|
||||
if (value != NULL)
|
||||
g_variant_unref (value);
|
||||
}
|
||||
|
||||
GdkScreen *
|
||||
_gdk_wayland_screen_new (GdkDisplay *display)
|
||||
{
|
||||
@@ -842,6 +984,17 @@ _gdk_wayland_screen_new (GdkDisplay *display)
|
||||
screen_wayland->width,
|
||||
screen_wayland->height);
|
||||
|
||||
screen_wayland->dbus_cancellable = g_cancellable_new ();
|
||||
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
|
||||
G_DBUS_PROXY_FLAGS_NONE,
|
||||
NULL,
|
||||
GTK_SETTINGS_DBUS_NAME,
|
||||
GTK_SETTINGS_DBUS_PATH,
|
||||
GTK_SETTINGS_DBUS_NAME,
|
||||
screen_wayland->dbus_cancellable,
|
||||
fontconfig_dbus_proxy_open_cb,
|
||||
screen_wayland);
|
||||
|
||||
init_settings (screen);
|
||||
|
||||
return screen;
|
||||
@@ -1050,11 +1203,22 @@ output_handle_scale (void *data,
|
||||
int32_t scale)
|
||||
{
|
||||
GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
|
||||
GdkRectangle previous_geometry;
|
||||
int previous_scale;
|
||||
int width;
|
||||
int height;
|
||||
|
||||
GDK_NOTE (MISC,
|
||||
g_message ("handle scale output %d, scale %d", monitor->id, scale));
|
||||
|
||||
gdk_monitor_get_geometry (GDK_MONITOR (monitor), &previous_geometry);
|
||||
previous_scale = gdk_monitor_get_scale_factor (GDK_MONITOR (monitor));
|
||||
|
||||
width = previous_geometry.width * previous_scale;
|
||||
height = previous_geometry.height * previous_scale;
|
||||
|
||||
gdk_monitor_set_scale_factor (GDK_MONITOR (monitor), scale);
|
||||
gdk_monitor_set_size (GDK_MONITOR (monitor), width / scale, height / scale);
|
||||
|
||||
if (GDK_MONITOR (monitor)->geometry.width != 0 && monitor->version < OUTPUT_VERSION_WITH_DONE)
|
||||
{
|
||||
@@ -1072,6 +1236,7 @@ output_handle_mode (void *data,
|
||||
int refresh)
|
||||
{
|
||||
GdkWaylandMonitor *monitor = (GdkWaylandMonitor *)data;
|
||||
int scale;
|
||||
|
||||
GDK_NOTE (MISC,
|
||||
g_message ("handle mode output %d, size %d %d, rate %d",
|
||||
@@ -1080,7 +1245,8 @@ output_handle_mode (void *data,
|
||||
if ((flags & WL_OUTPUT_MODE_CURRENT) == 0)
|
||||
return;
|
||||
|
||||
gdk_monitor_set_size (GDK_MONITOR (monitor), width, height);
|
||||
scale = gdk_monitor_get_scale_factor (GDK_MONITOR (monitor));
|
||||
gdk_monitor_set_size (GDK_MONITOR (monitor), width / scale, height / scale);
|
||||
gdk_monitor_set_refresh_rate (GDK_MONITOR (monitor), refresh);
|
||||
|
||||
if (width != 0 && monitor->version < OUTPUT_VERSION_WITH_DONE)
|
||||
|
||||
@@ -61,12 +61,6 @@ struct _StoredSelection
|
||||
gint fd;
|
||||
};
|
||||
|
||||
struct _DataSourceData
|
||||
{
|
||||
GdkWindow *window;
|
||||
GdkAtom selection;
|
||||
};
|
||||
|
||||
struct _DataOfferData
|
||||
{
|
||||
GDestroyNotify destroy_notify;
|
||||
@@ -119,6 +113,7 @@ struct _GdkWaylandSelection
|
||||
|
||||
static void selection_buffer_read (SelectionBuffer *buffer);
|
||||
static void async_write_data_write (AsyncWriteData *write_data);
|
||||
static void emit_selection_clear (GdkDisplay *display, GdkAtom selection);
|
||||
|
||||
static void
|
||||
selection_buffer_notify (SelectionBuffer *buffer)
|
||||
@@ -250,7 +245,7 @@ selection_buffer_read_cb (GObject *object,
|
||||
|
||||
if (bytes)
|
||||
{
|
||||
finished = g_bytes_get_size (bytes) < get_buffer_size ();
|
||||
finished = g_bytes_get_size (bytes) == 0;
|
||||
selection_buffer_append_data (buffer,
|
||||
g_bytes_get_data (bytes, NULL),
|
||||
g_bytes_get_size (bytes));
|
||||
@@ -927,6 +922,7 @@ data_source_cancelled (void *data,
|
||||
if (context)
|
||||
gdk_drag_context_cancel (context, GDK_DRAG_CANCEL_ERROR);
|
||||
|
||||
emit_selection_clear (display, atom);
|
||||
gdk_selection_owner_set (NULL, atom, GDK_CURRENT_TIME, TRUE);
|
||||
gdk_wayland_selection_unset_data_source (display, atom);
|
||||
}
|
||||
@@ -1037,6 +1033,7 @@ primary_source_cancelled (void *data,
|
||||
display = gdk_display_get_default ();
|
||||
|
||||
atom = atoms[ATOM_PRIMARY];
|
||||
emit_selection_clear (display, atom);
|
||||
gdk_selection_owner_set (NULL, atom, GDK_CURRENT_TIME, TRUE);
|
||||
gdk_wayland_selection_unset_data_source (display, atom);
|
||||
}
|
||||
@@ -1278,6 +1275,28 @@ emit_empty_selection_notify (GdkWindow *requestor,
|
||||
gdk_event_free (event);
|
||||
}
|
||||
|
||||
static void
|
||||
emit_selection_clear (GdkDisplay *display,
|
||||
GdkAtom selection)
|
||||
{
|
||||
GdkEvent *event;
|
||||
GdkWindow *window;
|
||||
|
||||
event = gdk_event_new (GDK_SELECTION_CLEAR);
|
||||
event->selection.selection = selection;
|
||||
event->selection.time = GDK_CURRENT_TIME;
|
||||
|
||||
window = _gdk_wayland_display_get_selection_owner (display, selection);
|
||||
if (window != NULL)
|
||||
{
|
||||
event->selection.window = g_object_ref (window);
|
||||
event->selection.requestor = g_object_ref (window);
|
||||
}
|
||||
|
||||
gdk_event_put (event);
|
||||
gdk_event_free (event);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_display_convert_selection (GdkDisplay *display,
|
||||
GdkWindow *requestor,
|
||||
|
||||
@@ -57,6 +57,13 @@ GDK_AVAILABLE_IN_3_22
|
||||
void gdk_wayland_display_set_startup_notification_id (GdkDisplay *display,
|
||||
const char *startup_id);
|
||||
|
||||
GDK_AVAILABLE_IN_3_22
|
||||
gboolean gdk_wayland_display_prefers_ssd (GdkDisplay *display);
|
||||
|
||||
GDK_AVAILABLE_IN_3_22
|
||||
gboolean gdk_wayland_display_query_registry (GdkDisplay *display,
|
||||
const gchar *global);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GDK_WAYLAND_DISPLAY_H__ */
|
||||
|
||||
@@ -77,6 +77,12 @@ GDK_AVAILABLE_IN_3_22
|
||||
gboolean gdk_wayland_window_set_transient_for_exported (GdkWindow *window,
|
||||
char *parent_handle_str);
|
||||
|
||||
GDK_AVAILABLE_IN_3_22
|
||||
void gdk_wayland_window_announce_csd (GdkWindow *window);
|
||||
|
||||
GDK_AVAILABLE_IN_3_24
|
||||
void gdk_wayland_window_announce_ssd (GdkWindow *window);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GDK_WAYLAND_WINDOW_H__ */
|
||||
|
||||
+991
-224
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
<protocol name="gtk">
|
||||
|
||||
<interface name="gtk_shell1" version="1">
|
||||
<interface name="gtk_shell1" version="2">
|
||||
<description summary="gtk specific extensions">
|
||||
gtk_shell is a protocol extension providing additional features for
|
||||
clients implementing it.
|
||||
@@ -30,7 +30,7 @@
|
||||
</request>
|
||||
</interface>
|
||||
|
||||
<interface name="gtk_surface1" version="1">
|
||||
<interface name="gtk_surface1" version="2">
|
||||
<request name="set_dbus_properties">
|
||||
<arg name="application_id" type="string" allow-null="true"/>
|
||||
<arg name="app_menu_path" type="string" allow-null="true"/>
|
||||
@@ -51,11 +51,27 @@
|
||||
|
||||
<enum name="state">
|
||||
<entry name="tiled" value="1"/>
|
||||
|
||||
<entry name="tiled_top" value="2" since="2" />
|
||||
<entry name="tiled_right" value="3" since="2" />
|
||||
<entry name="tiled_bottom" value="4" since="2" />
|
||||
<entry name="tiled_left" value="5" since="2" />
|
||||
</enum>
|
||||
|
||||
<enum name="edge_constraint" since="2">
|
||||
<entry name="resizable_top" value="1"/>
|
||||
<entry name="resizable_right" value="2"/>
|
||||
<entry name="resizable_bottom" value="3"/>
|
||||
<entry name="resizable_left" value="4"/>
|
||||
</enum>
|
||||
|
||||
<event name="configure">
|
||||
<arg name="states" type="array"/>
|
||||
</event>
|
||||
|
||||
<event name="configure_edges" since="2">
|
||||
<arg name="constraints" type="array"/>
|
||||
</event>
|
||||
</interface>
|
||||
|
||||
</protocol>
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<protocol name="server_decoration">
|
||||
<copyright><![CDATA[
|
||||
Copyright (C) 2015 Martin Gräßlin
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License as published by
|
||||
the Free Software Foundation, either version 2.1 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 Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
]]></copyright>
|
||||
<interface name="org_kde_kwin_server_decoration_manager" version="1">
|
||||
<description summary="Server side window decoration manager">
|
||||
This interface allows to coordinate whether the server should create
|
||||
a server-side window decoration around a wl_surface representing a
|
||||
shell surface (wl_shell_surface or similar). By announcing support
|
||||
for this interface the server indicates that it supports server
|
||||
side decorations.
|
||||
</description>
|
||||
<request name="create">
|
||||
<description summary="Create a server-side decoration object for a given surface">
|
||||
When a client creates a server-side decoration object it indicates
|
||||
that it supports the protocol. The client is supposed to tell the
|
||||
server whether it wants server-side decorations or will provide
|
||||
client-side decorations.
|
||||
|
||||
If the client does not create a server-side decoration object for
|
||||
a surface the server interprets this as lack of support for this
|
||||
protocol and considers it as client-side decorated. Nevertheless a
|
||||
client-side decorated surface should use this protocol to indicate
|
||||
to the server that it does not want a server-side deco.
|
||||
</description>
|
||||
<arg name="id" type="new_id" interface="org_kde_kwin_server_decoration"/>
|
||||
<arg name="surface" type="object" interface="wl_surface"/>
|
||||
</request>
|
||||
<enum name="mode">
|
||||
<description summary="Possible values to use in request_mode and the event mode."/>
|
||||
<entry name="None" value="0" summary="Undecorated: The surface is not decorated at all, neither server nor client-side. An example is a popup surface which should not be decorated."/>
|
||||
<entry name="Client" value="1" summary="Client-side decoration: The decoration is part of the surface and the client."/>
|
||||
<entry name="Server" value="2" summary="Server-side decoration: The server embeds the surface into a decoration frame."/>
|
||||
</enum>
|
||||
<event name="default_mode">
|
||||
<description summary="The default mode used on the server">
|
||||
This event is emitted directly after binding the interface. It contains
|
||||
the default mode for the decoration. When a new server decoration object
|
||||
is created this new object will be in the default mode until the first
|
||||
request_mode is requested.
|
||||
|
||||
The server may change the default mode at any time.
|
||||
</description>
|
||||
<arg name="mode" type="uint" summary="The default decoration mode applied to newly created server decorations."/>
|
||||
</event>
|
||||
</interface>
|
||||
<interface name="org_kde_kwin_server_decoration" version="1">
|
||||
<request name="release" type="destructor">
|
||||
<description summary="release the server decoration object"/>
|
||||
</request>
|
||||
<enum name="mode">
|
||||
<description summary="Possible values to use in request_mode and the event mode."/>
|
||||
<entry name="None" value="0" summary="Undecorated: The surface is not decorated at all, neither server nor client-side. An example is a popup surface which should not be decorated."/>
|
||||
<entry name="Client" value="1" summary="Client-side decoration: The decoration is part of the surface and the client."/>
|
||||
<entry name="Server" value="2" summary="Server-side decoration: The server embeds the surface into a decoration frame."/>
|
||||
</enum>
|
||||
<request name="request_mode">
|
||||
<description summary="The decoration mode the surface wants to use."/>
|
||||
<arg name="mode" type="uint" summary="The mode this surface wants to use."/>
|
||||
</request>
|
||||
<event name="mode">
|
||||
<description summary="The new decoration mode applied by the server">
|
||||
This event is emitted directly after the decoration is created and
|
||||
represents the base decoration policy by the server. E.g. a server
|
||||
which wants all surfaces to be client-side decorated will send Client,
|
||||
a server which wants server-side decoration will send Server.
|
||||
|
||||
The client can request a different mode through the decoration request.
|
||||
The server will acknowledge this by another event with the same mode. So
|
||||
even if a server prefers server-side decoration it's possible to force a
|
||||
client-side decoration.
|
||||
|
||||
The server may emit this event at any time. In this case the client can
|
||||
again request a different mode. It's the responsibility of the server to
|
||||
prevent a feedback loop.
|
||||
</description>
|
||||
<arg name="mode" type="uint" summary="The decoration mode applied to the surface by the server."/>
|
||||
</event>
|
||||
</interface>
|
||||
</protocol>
|
||||
@@ -17,6 +17,10 @@ AM_CPPFLAGS = \
|
||||
$(GDK_WIN32_EXTRA_CFLAGS) \
|
||||
-DGDK_COMPILATION
|
||||
|
||||
if WIN32_GLES
|
||||
AM_CPPFLAGS += "-DGDK_WIN32_ENABLE_EGL=1"
|
||||
endif #WIN32_GLES
|
||||
|
||||
LDADDS = $(GDK_DEP_LIBS)
|
||||
|
||||
noinst_LTLIBRARIES = libgdk-win32.la
|
||||
@@ -54,11 +58,13 @@ libgdk_win32_la_SOURCES = \
|
||||
gdkproperty-win32.c \
|
||||
gdkscreen-win32.c \
|
||||
gdkselection-win32.c \
|
||||
gdkselection-win32.h \
|
||||
gdktestutils-win32.c \
|
||||
gdkwin32cursor.h \
|
||||
gdkwin32display.h \
|
||||
gdkwin32displaymanager.h \
|
||||
gdkwin32dnd.h \
|
||||
gdkwin32dnd-private.h \
|
||||
gdkwin32glcontext.h \
|
||||
gdkwin32.h \
|
||||
gdkwin32id.c \
|
||||
|
||||
@@ -1041,7 +1041,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS;
|
||||
/* Don't produce any button or motion events while a window is being
|
||||
* moved or resized, see bug #151090.
|
||||
*/
|
||||
if (_modal_operation_in_progress)
|
||||
if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_SIZEMOVE_MASK)
|
||||
{
|
||||
GDK_NOTE (EVENTS_OR_INPUT, g_print ("... ignored when moving/sizing\n"));
|
||||
return FALSE;
|
||||
|
||||
@@ -31,6 +31,10 @@
|
||||
#include "gdkmonitor-win32.h"
|
||||
#include "gdkwin32.h"
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
# include <epoxy/egl.h>
|
||||
#endif
|
||||
|
||||
static int debug_indent = 0;
|
||||
|
||||
static GdkMonitor *
|
||||
@@ -551,9 +555,12 @@ inner_clipboard_window_procedure (HWND hwnd,
|
||||
case WM_DRAWCLIPBOARD:
|
||||
{
|
||||
HWND hwnd_owner;
|
||||
HWND stored_hwnd_owner;
|
||||
HWND hwnd_opener;
|
||||
GdkEvent *event;
|
||||
GdkWindow *owner;
|
||||
GdkWindow *stored_owner;
|
||||
GdkWin32Selection *win32_sel = _gdk_win32_selection_get ();
|
||||
|
||||
hwnd_owner = GetClipboardOwner ();
|
||||
|
||||
@@ -568,14 +575,16 @@ inner_clipboard_window_procedure (HWND hwnd,
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
if (_gdk_debug_flags & GDK_DEBUG_DND)
|
||||
{
|
||||
if (OpenClipboard (hwnd))
|
||||
if (win32_sel->clipboard_opened_for != INVALID_HANDLE_VALUE ||
|
||||
OpenClipboard (hwnd))
|
||||
{
|
||||
UINT nFormat = 0;
|
||||
|
||||
while ((nFormat = EnumClipboardFormats (nFormat)) != 0)
|
||||
g_print ("%s ", _gdk_win32_cf_to_string (nFormat));
|
||||
|
||||
CloseClipboard ();
|
||||
if (win32_sel->clipboard_opened_for == INVALID_HANDLE_VALUE)
|
||||
CloseClipboard ();
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -590,6 +599,27 @@ inner_clipboard_window_procedure (HWND hwnd,
|
||||
if (owner == NULL)
|
||||
owner = gdk_win32_window_foreign_new_for_display (_gdk_display, hwnd_owner);
|
||||
|
||||
stored_owner = _gdk_win32_display_get_selection_owner (gdk_display_get_default (),
|
||||
GDK_SELECTION_CLIPBOARD);
|
||||
|
||||
if (stored_owner)
|
||||
stored_hwnd_owner = GDK_WINDOW_HWND (stored_owner);
|
||||
else
|
||||
stored_hwnd_owner = NULL;
|
||||
|
||||
if (stored_hwnd_owner != hwnd_owner)
|
||||
{
|
||||
if (win32_sel->clipboard_opened_for != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
CloseClipboard ();
|
||||
GDK_NOTE (DND, g_print ("Closed clipboard @ %s:%d\n", __FILE__, __LINE__));
|
||||
}
|
||||
|
||||
win32_sel->clipboard_opened_for = INVALID_HANDLE_VALUE;
|
||||
|
||||
_gdk_win32_clear_clipboard_queue ();
|
||||
}
|
||||
|
||||
event = gdk_event_new (GDK_OWNER_CHANGE);
|
||||
event->owner_change.window = gdk_get_default_root_window ();
|
||||
event->owner_change.owner = owner;
|
||||
@@ -686,10 +716,11 @@ gdk_win32_display_request_selection_notification (GdkDisplay *display,
|
||||
{
|
||||
GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (display);
|
||||
gboolean ret = FALSE;
|
||||
gchar *selection_name = gdk_atom_name (selection);
|
||||
|
||||
GDK_NOTE (DND,
|
||||
g_print ("gdk_display_request_selection_notification (..., %s)",
|
||||
gdk_atom_name (selection)));
|
||||
selection_name));
|
||||
|
||||
if (selection == GDK_SELECTION_CLIPBOARD ||
|
||||
selection == GDK_SELECTION_PRIMARY)
|
||||
@@ -709,6 +740,8 @@ gdk_win32_display_request_selection_notification (GdkDisplay *display,
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
g_free (selection_name);
|
||||
|
||||
GDK_NOTE (DND, g_print (" -> %s\n", ret ? "TRUE" : "FALSE"));
|
||||
return ret;
|
||||
}
|
||||
@@ -716,16 +749,30 @@ gdk_win32_display_request_selection_notification (GdkDisplay *display,
|
||||
static gboolean
|
||||
gdk_win32_display_supports_clipboard_persistence (GdkDisplay *display)
|
||||
{
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_win32_display_store_clipboard (GdkDisplay *display,
|
||||
GdkWindow *clipboard_window,
|
||||
guint32 time_,
|
||||
const GdkAtom *targets,
|
||||
gint n_targets)
|
||||
GdkWindow *clipboard_window,
|
||||
guint32 time_,
|
||||
const GdkAtom *targets,
|
||||
gint n_targets)
|
||||
{
|
||||
GdkEvent tmp_event;
|
||||
SendMessage (GDK_WINDOW_HWND (clipboard_window), WM_RENDERALLFORMATS, 0, 0);
|
||||
|
||||
memset (&tmp_event, 0, sizeof (tmp_event));
|
||||
tmp_event.selection.type = GDK_SELECTION_NOTIFY;
|
||||
tmp_event.selection.window = clipboard_window;
|
||||
tmp_event.selection.send_event = FALSE;
|
||||
tmp_event.selection.selection = _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_CLIPBOARD_MANAGER);
|
||||
tmp_event.selection.target = 0;
|
||||
tmp_event.selection.property = GDK_NONE;
|
||||
tmp_event.selection.requestor = 0;
|
||||
tmp_event.selection.time = GDK_CURRENT_TIME;
|
||||
|
||||
gdk_event_put (&tmp_event);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -782,6 +829,14 @@ gdk_win32_display_dispose (GObject *object)
|
||||
|
||||
_gdk_screen_close (display_win32->screen);
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
if (display_win32->egl_disp != EGL_NO_DISPLAY)
|
||||
{
|
||||
eglTerminate (display_win32->egl_disp);
|
||||
display_win32->egl_disp = EGL_NO_DISPLAY;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (display_win32->hwnd != NULL)
|
||||
{
|
||||
DestroyWindow (display_win32->hwnd);
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
|
||||
#include "gdkdisplayprivate.h"
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
# include <epoxy/egl.h>
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DISPLAY__WIN32_H__
|
||||
#define __GDK_DISPLAY__WIN32_H__
|
||||
|
||||
@@ -73,9 +77,16 @@ struct _GdkWin32Display
|
||||
/* WGL/OpenGL Items */
|
||||
guint have_wgl : 1;
|
||||
guint gl_version;
|
||||
HDC gl_hdc;
|
||||
HWND gl_hwnd;
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
/* EGL (Angle) Items */
|
||||
guint have_egl : 1;
|
||||
guint egl_version;
|
||||
EGLDisplay egl_disp;
|
||||
HDC hdc_egl_temp;
|
||||
#endif
|
||||
|
||||
GPtrArray *monitors;
|
||||
|
||||
guint hasWglARBCreateContext : 1;
|
||||
@@ -84,6 +95,12 @@ struct _GdkWin32Display
|
||||
guint hasWglARBPixelFormat : 1;
|
||||
guint hasWglARBmultisample : 1;
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
guint hasEglKHRCreateContext : 1;
|
||||
guint hasEglSurfacelessContext : 1;
|
||||
EGLint egl_min_swap_interval;
|
||||
#endif
|
||||
|
||||
/* HiDPI Items */
|
||||
guint have_at_least_win81 : 1;
|
||||
GdkWin32ProcessDpiAwareness dpi_aware_type;
|
||||
|
||||
+1333
-473
File diff suppressed because it is too large
Load Diff
+131
-51
@@ -51,11 +51,13 @@
|
||||
#include "gdkmonitorprivate.h"
|
||||
#include "gdkwin32.h"
|
||||
#include "gdkkeysyms.h"
|
||||
#include "gdkglcontext-win32.h"
|
||||
#include "gdkdevicemanager-win32.h"
|
||||
#include "gdkdeviceprivate.h"
|
||||
#include "gdkdevice-wintab.h"
|
||||
#include "gdkwin32dnd.h"
|
||||
#include "gdkdisplay-win32.h"
|
||||
#include "gdkselection-win32.h"
|
||||
#include "gdkdndprivate.h"
|
||||
|
||||
#include <windowsx.h>
|
||||
@@ -1736,36 +1738,42 @@ modal_timer_proc (HWND hwnd,
|
||||
{
|
||||
int arbitrary_limit = 10;
|
||||
|
||||
while (_modal_operation_in_progress &&
|
||||
while (_modal_operation_in_progress != GDK_WIN32_MODAL_OP_NONE &&
|
||||
g_main_context_pending (NULL) &&
|
||||
arbitrary_limit--)
|
||||
g_main_context_iteration (NULL, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_win32_begin_modal_call (void)
|
||||
_gdk_win32_begin_modal_call (GdkWin32ModalOpKind kind)
|
||||
{
|
||||
g_assert (!_modal_operation_in_progress);
|
||||
GdkWin32ModalOpKind was = _modal_operation_in_progress;
|
||||
g_assert (!(_modal_operation_in_progress & kind));
|
||||
|
||||
_modal_operation_in_progress = TRUE;
|
||||
_modal_operation_in_progress |= kind;
|
||||
|
||||
modal_timer = SetTimer (NULL, 0, 10, modal_timer_proc);
|
||||
if (modal_timer == 0)
|
||||
WIN32_API_FAILED ("SetTimer");
|
||||
if (was == GDK_WIN32_MODAL_OP_NONE)
|
||||
{
|
||||
modal_timer = SetTimer (NULL, 0, 10, modal_timer_proc);
|
||||
|
||||
if (modal_timer == 0)
|
||||
WIN32_API_FAILED ("SetTimer");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_win32_end_modal_call (void)
|
||||
_gdk_win32_end_modal_call (GdkWin32ModalOpKind kind)
|
||||
{
|
||||
g_assert (_modal_operation_in_progress);
|
||||
g_assert (_modal_operation_in_progress & kind);
|
||||
|
||||
_modal_operation_in_progress = FALSE;
|
||||
_modal_operation_in_progress &= ~kind;
|
||||
|
||||
if (modal_timer != 0)
|
||||
if (_modal_operation_in_progress == GDK_WIN32_MODAL_OP_NONE &&
|
||||
modal_timer != 0)
|
||||
{
|
||||
API_CALL (KillTimer, (NULL, modal_timer));
|
||||
modal_timer = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static VOID CALLBACK
|
||||
@@ -2280,6 +2288,10 @@ gdk_event_translate (MSG *msg,
|
||||
|
||||
int i;
|
||||
|
||||
GdkWin32Selection *win32_sel = NULL;
|
||||
|
||||
STGMEDIUM *property_change_data;
|
||||
|
||||
display = gdk_display_get_default ();
|
||||
window = gdk_win32_handle_table_lookup (msg->hwnd);
|
||||
|
||||
@@ -3139,7 +3151,8 @@ gdk_event_translate (MSG *msg,
|
||||
|
||||
case WM_KILLFOCUS:
|
||||
if (keyboard_grab != NULL &&
|
||||
!GDK_WINDOW_DESTROYED (keyboard_grab->window))
|
||||
!GDK_WINDOW_DESTROYED (keyboard_grab->window) &&
|
||||
(_modal_operation_in_progress & GDK_WIN32_MODAL_OP_DND) == 0)
|
||||
{
|
||||
generate_grab_broken_event (device_manager, keyboard_grab->window, TRUE, NULL);
|
||||
}
|
||||
@@ -3236,6 +3249,9 @@ gdk_event_translate (MSG *msg,
|
||||
case SC_MINIMIZE:
|
||||
case SC_RESTORE:
|
||||
do_show_window (window, msg->wParam == SC_MINIMIZE ? TRUE : FALSE);
|
||||
|
||||
if (msg->wParam == SC_RESTORE)
|
||||
_gdk_win32_window_invalidate_egl_framebuffer (window);
|
||||
break;
|
||||
case SC_MAXIMIZE:
|
||||
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
@@ -3246,30 +3262,54 @@ gdk_event_translate (MSG *msg,
|
||||
break;
|
||||
|
||||
case WM_ENTERSIZEMOVE:
|
||||
case WM_ENTERMENULOOP:
|
||||
if (msg->message == WM_ENTERSIZEMOVE)
|
||||
_modal_move_resize_window = msg->hwnd;
|
||||
|
||||
_gdk_win32_begin_modal_call ();
|
||||
_modal_move_resize_window = msg->hwnd;
|
||||
_gdk_win32_begin_modal_call (GDK_WIN32_MODAL_OP_SIZEMOVE_MASK);
|
||||
break;
|
||||
|
||||
case WM_EXITSIZEMOVE:
|
||||
case WM_EXITMENULOOP:
|
||||
if (_modal_operation_in_progress)
|
||||
if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_SIZEMOVE_MASK)
|
||||
{
|
||||
_modal_move_resize_window = NULL;
|
||||
_gdk_win32_end_modal_call ();
|
||||
_gdk_win32_end_modal_call (GDK_WIN32_MODAL_OP_SIZEMOVE_MASK);
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_ENTERMENULOOP:
|
||||
_gdk_win32_begin_modal_call (GDK_WIN32_MODAL_OP_MENU);
|
||||
break;
|
||||
|
||||
case WM_EXITMENULOOP:
|
||||
if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_MENU)
|
||||
_gdk_win32_end_modal_call (GDK_WIN32_MODAL_OP_MENU);
|
||||
break;
|
||||
|
||||
break;
|
||||
|
||||
/*
|
||||
* Handle WM_CANCELMODE and do nothing in response to it when DnD is
|
||||
* active. Otherwise pass it to DefWindowProc, which will call ReleaseCapture()
|
||||
* on our behalf.
|
||||
* This prevents us from losing mouse capture when alt-tabbing during DnD
|
||||
* (this includes the feature of Windows Explorer where dragging stuff over
|
||||
* a window button in the taskbar causes that window to receive focus, i.e.
|
||||
* keyboardless alt-tabbing).
|
||||
*/
|
||||
case WM_CANCELMODE:
|
||||
if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_DND)
|
||||
{
|
||||
return_val = TRUE;
|
||||
*ret_valp = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_CAPTURECHANGED:
|
||||
/* Sometimes we don't get WM_EXITSIZEMOVE, for instance when you
|
||||
select move/size in the menu and then click somewhere without
|
||||
moving/resizing. We work around this using WM_CAPTURECHANGED. */
|
||||
if (_modal_operation_in_progress)
|
||||
if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_SIZEMOVE_MASK)
|
||||
{
|
||||
_modal_move_resize_window = NULL;
|
||||
_gdk_win32_end_modal_call ();
|
||||
_gdk_win32_end_modal_call (GDK_WIN32_MODAL_OP_SIZEMOVE_MASK);
|
||||
}
|
||||
|
||||
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
@@ -3301,6 +3341,8 @@ gdk_event_translate (MSG *msg,
|
||||
{
|
||||
MINMAXINFO our_mmi;
|
||||
|
||||
_gdk_win32_window_invalidate_egl_framebuffer (window);
|
||||
|
||||
if (_gdk_win32_window_fill_min_max_info (window, &our_mmi))
|
||||
{
|
||||
windowpos = (WINDOWPOS *) msg->lParam;
|
||||
@@ -3425,7 +3467,7 @@ gdk_event_translate (MSG *msg,
|
||||
}
|
||||
|
||||
/* Call modal timer immediate so that we repaint faster after a resize. */
|
||||
if (_modal_operation_in_progress)
|
||||
if (_modal_operation_in_progress & GDK_WIN32_MODAL_OP_SIZEMOVE_MASK)
|
||||
modal_timer_proc (0,0,0,0);
|
||||
|
||||
/* Claim as handled, so that WM_SIZE and WM_MOVE are avoided */
|
||||
@@ -3721,7 +3763,9 @@ gdk_event_translate (MSG *msg,
|
||||
break;
|
||||
|
||||
case WM_DESTROYCLIPBOARD:
|
||||
if (!_ignore_destroy_clipboard)
|
||||
win32_sel = _gdk_win32_selection_get ();
|
||||
|
||||
if (!win32_sel->ignore_destroy_clipboard)
|
||||
{
|
||||
event = gdk_event_new (GDK_SELECTION_CLEAR);
|
||||
event->selection.window = window;
|
||||
@@ -3739,12 +3783,29 @@ gdk_event_translate (MSG *msg,
|
||||
case WM_RENDERFORMAT:
|
||||
GDK_NOTE (EVENTS, g_print (" %s", _gdk_win32_cf_to_string (msg->wParam)));
|
||||
|
||||
if (!(target = g_hash_table_lookup (_format_atom_table, GINT_TO_POINTER (msg->wParam))))
|
||||
{
|
||||
GDK_NOTE (EVENTS, g_print (" (target not found)"));
|
||||
return_val = TRUE;
|
||||
break;
|
||||
}
|
||||
*ret_valp = 0;
|
||||
return_val = TRUE;
|
||||
|
||||
win32_sel = _gdk_win32_selection_get ();
|
||||
|
||||
for (target = NULL, i = 0;
|
||||
i < win32_sel->clipboard_selection_targets->len;
|
||||
i++)
|
||||
{
|
||||
GdkSelTargetFormat target_format = g_array_index (win32_sel->clipboard_selection_targets, GdkSelTargetFormat, i);
|
||||
|
||||
if (target_format.format == msg->wParam)
|
||||
{
|
||||
target = target_format.target;
|
||||
win32_sel->property_change_transmute = target_format.transmute;
|
||||
}
|
||||
}
|
||||
|
||||
if (target == NULL)
|
||||
{
|
||||
GDK_NOTE (EVENTS, g_print (" (target not found)"));
|
||||
break;
|
||||
}
|
||||
|
||||
/* We need to render to clipboard immediately, don't call
|
||||
* _gdk_win32_append_event()
|
||||
@@ -3754,45 +3815,62 @@ gdk_event_translate (MSG *msg,
|
||||
event->selection.send_event = FALSE;
|
||||
event->selection.selection = GDK_SELECTION_CLIPBOARD;
|
||||
event->selection.target = target;
|
||||
event->selection.property = _gdk_selection;
|
||||
event->selection.property = _gdk_win32_selection_atom (GDK_WIN32_ATOM_INDEX_GDK_SELECTION);
|
||||
event->selection.requestor = gdk_win32_handle_table_lookup (msg->hwnd);
|
||||
event->selection.time = msg->time;
|
||||
property_change_data = g_new0 (STGMEDIUM, 1);
|
||||
win32_sel->property_change_data = property_change_data;
|
||||
win32_sel->property_change_format = msg->wParam;
|
||||
win32_sel->property_change_target_atom = target;
|
||||
|
||||
fixup_event (event);
|
||||
GDK_NOTE (EVENTS, g_print (" (calling _gdk_event_emit)"));
|
||||
GDK_NOTE (EVENTS, _gdk_win32_print_event (event));
|
||||
_gdk_event_emit (event);
|
||||
gdk_event_free (event);
|
||||
win32_sel->property_change_format = 0;
|
||||
|
||||
/* Now the clipboard owner should have rendered */
|
||||
if (!_delayed_rendering_data)
|
||||
if (!property_change_data->hGlobal)
|
||||
{
|
||||
GDK_NOTE (EVENTS, g_print (" (no _delayed_rendering_data?)"));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (msg->wParam == CF_DIB)
|
||||
{
|
||||
_delayed_rendering_data =
|
||||
_gdk_win32_selection_convert_to_dib (_delayed_rendering_data,
|
||||
target);
|
||||
if (!_delayed_rendering_data)
|
||||
{
|
||||
g_warning ("Cannot convert to DIB from delayed rendered image");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* The requestor is holding the clipboard, no
|
||||
* OpenClipboard() is required/possible
|
||||
*/
|
||||
GDK_NOTE (DND,
|
||||
g_print (" SetClipboardData(%s,%p)",
|
||||
_gdk_win32_cf_to_string (msg->wParam),
|
||||
_delayed_rendering_data));
|
||||
property_change_data->hGlobal));
|
||||
|
||||
API_CALL (SetClipboardData, (msg->wParam, _delayed_rendering_data));
|
||||
_delayed_rendering_data = NULL;
|
||||
API_CALL (SetClipboardData, (msg->wParam, property_change_data->hGlobal));
|
||||
}
|
||||
|
||||
g_clear_pointer (&property_change_data, g_free);
|
||||
*ret_valp = 0;
|
||||
return_val = TRUE;
|
||||
break;
|
||||
|
||||
case WM_RENDERALLFORMATS:
|
||||
*ret_valp = 0;
|
||||
return_val = TRUE;
|
||||
|
||||
win32_sel = _gdk_win32_selection_get ();
|
||||
|
||||
if (API_CALL (OpenClipboard, (msg->hwnd)))
|
||||
{
|
||||
for (target = NULL, i = 0;
|
||||
i < win32_sel->clipboard_selection_targets->len;
|
||||
i++)
|
||||
{
|
||||
GdkSelTargetFormat target_format = g_array_index (win32_sel->clipboard_selection_targets, GdkSelTargetFormat, i);
|
||||
if (target_format.format != 0)
|
||||
SendMessage (msg->hwnd, WM_RENDERFORMAT, target_format.format, 0);
|
||||
}
|
||||
|
||||
API_CALL (CloseClipboard, ());
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -3962,16 +4040,18 @@ gdk_event_dispatch (GSource *source,
|
||||
|
||||
if (event)
|
||||
{
|
||||
GdkWin32Selection *sel_win32 = _gdk_win32_selection_get ();
|
||||
|
||||
_gdk_event_emit (event);
|
||||
|
||||
gdk_event_free (event);
|
||||
|
||||
/* Do drag & drop if it is still pending */
|
||||
if (_dnd_source_state == GDK_WIN32_DND_PENDING)
|
||||
if (sel_win32->dnd_source_state == GDK_WIN32_DND_PENDING)
|
||||
{
|
||||
_dnd_source_state = GDK_WIN32_DND_DRAGGING;
|
||||
sel_win32->dnd_source_state = GDK_WIN32_DND_DRAGGING;
|
||||
_gdk_win32_dnd_do_dragdrop ();
|
||||
_dnd_source_state = GDK_WIN32_DND_NONE;
|
||||
sel_win32->dnd_source_state = GDK_WIN32_DND_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+625
-158
@@ -41,6 +41,10 @@
|
||||
#include <cairo.h>
|
||||
#include <epoxy/wgl.h>
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
# include <epoxy/egl.h>
|
||||
#endif
|
||||
|
||||
G_DEFINE_TYPE (GdkWin32GLContext, gdk_win32_gl_context, GDK_TYPE_GL_CONTEXT)
|
||||
|
||||
static void
|
||||
@@ -50,6 +54,7 @@ _gdk_win32_gl_context_dispose (GObject *gobject)
|
||||
GdkWin32GLContext *context_win32 = GDK_WIN32_GL_CONTEXT (gobject);
|
||||
GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (gdk_gl_context_get_display (context));
|
||||
GdkWindow *window = gdk_gl_context_get_window (context);
|
||||
GdkWindowImplWin32 *impl = NULL;
|
||||
|
||||
if (context_win32->hglrc != NULL)
|
||||
{
|
||||
@@ -64,9 +69,28 @@ _gdk_win32_gl_context_dispose (GObject *gobject)
|
||||
ReleaseDC (display_win32->gl_hwnd, context_win32->gl_hdc);
|
||||
}
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
if (context_win32->egl_context != EGL_NO_CONTEXT)
|
||||
{
|
||||
if (eglGetCurrentContext () == context_win32->egl_context)
|
||||
eglMakeCurrent(display_win32->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE,
|
||||
EGL_NO_CONTEXT);
|
||||
|
||||
GDK_NOTE (OPENGL, g_message ("Destroying EGL (ANGLE) context"));
|
||||
|
||||
eglDestroyContext (display_win32->egl_disp,
|
||||
context_win32->egl_context);
|
||||
context_win32->egl_context = EGL_NO_CONTEXT;
|
||||
|
||||
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
|
||||
ReleaseDC (display_win32->gl_hwnd, context_win32->gl_hdc);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (window != NULL && window->impl != NULL)
|
||||
{
|
||||
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
|
||||
if (impl->suppress_layered > 0)
|
||||
impl->suppress_layered--;
|
||||
@@ -117,6 +141,35 @@ gdk_gl_blit_region (GdkWindow *window, cairo_region_t *region)
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_get_is_egl_force_redraw (GdkWindow *window)
|
||||
{
|
||||
/* We only need to call gdk_window_invalidate_rect () if necessary */
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
if (window->gl_paint_context != NULL && gdk_gl_context_get_use_es (window->gl_paint_context))
|
||||
{
|
||||
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
|
||||
return impl->egl_force_redraw_all;
|
||||
}
|
||||
#endif
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
_reset_egl_force_redraw (GdkWindow *window)
|
||||
{
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
if (window->gl_paint_context != NULL && gdk_gl_context_get_use_es (window->gl_paint_context))
|
||||
{
|
||||
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
|
||||
if (impl->egl_force_redraw_all)
|
||||
impl->egl_force_redraw_all = FALSE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_win32_gl_context_end_frame (GdkGLContext *context,
|
||||
cairo_region_t *painted,
|
||||
@@ -126,11 +179,12 @@ _gdk_win32_gl_context_end_frame (GdkGLContext *context,
|
||||
GdkWindow *window = gdk_gl_context_get_window (context);
|
||||
GdkWin32Display *display = (GDK_WIN32_DISPLAY (gdk_gl_context_get_display (context)));
|
||||
|
||||
gboolean can_wait = display->hasWglOMLSyncControl;
|
||||
gdk_gl_context_make_current (context);
|
||||
|
||||
if (context_win32->do_frame_sync)
|
||||
if (!gdk_gl_context_get_use_es (context))
|
||||
{
|
||||
gboolean can_wait = display->hasWglOMLSyncControl;
|
||||
|
||||
if (context_win32->do_frame_sync)
|
||||
{
|
||||
glFinish ();
|
||||
@@ -147,21 +201,44 @@ _gdk_win32_gl_context_end_frame (GdkGLContext *context,
|
||||
&ust, &msc, &sbc);
|
||||
}
|
||||
}
|
||||
|
||||
if (context_win32->do_blit_swap)
|
||||
{
|
||||
glDrawBuffer(GL_FRONT);
|
||||
glReadBuffer(GL_BACK);
|
||||
gdk_gl_blit_region (window, painted);
|
||||
glDrawBuffer(GL_BACK);
|
||||
glFlush();
|
||||
|
||||
if (gdk_gl_context_has_frame_terminator (context))
|
||||
glFrameTerminatorGREMEDY ();
|
||||
}
|
||||
else
|
||||
SwapBuffers (context_win32->gl_hdc);
|
||||
}
|
||||
|
||||
if (context_win32->do_blit_swap)
|
||||
{
|
||||
glDrawBuffer(GL_FRONT);
|
||||
glReadBuffer(GL_BACK);
|
||||
gdk_gl_blit_region (window, painted);
|
||||
glDrawBuffer(GL_BACK);
|
||||
glFlush();
|
||||
|
||||
if (gdk_gl_context_has_frame_terminator (context))
|
||||
glFrameTerminatorGREMEDY ();
|
||||
}
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
else
|
||||
SwapBuffers (context_win32->gl_hdc);
|
||||
{
|
||||
EGLSurface egl_surface = _gdk_win32_window_get_egl_surface (window, context_win32->egl_config, FALSE);
|
||||
gboolean force_egl_redraw_all = _get_is_egl_force_redraw (window);
|
||||
|
||||
if (context_win32->do_blit_swap && !force_egl_redraw_all)
|
||||
gdk_gl_blit_region (window, painted);
|
||||
else if (force_egl_redraw_all)
|
||||
{
|
||||
GdkRectangle rect = {0, 0, gdk_window_get_width (window), gdk_window_get_height (window)};
|
||||
|
||||
/* We need to do gdk_window_invalidate_rect() so that we don't get glitches after maximizing or
|
||||
* restoring or using aerosnap
|
||||
*/
|
||||
gdk_window_invalidate_rect (window, &rect, TRUE);
|
||||
_reset_egl_force_redraw (window);
|
||||
}
|
||||
|
||||
eglSwapBuffers (display->egl_disp, egl_surface);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
@@ -215,8 +292,6 @@ _destroy_dummy_gl_context (GdkWGLDummy dummy)
|
||||
{
|
||||
if (dummy.hglrc != NULL)
|
||||
{
|
||||
if (wglGetCurrentContext () == dummy.hglrc)
|
||||
wglMakeCurrent (NULL, NULL);
|
||||
wglDeleteContext (dummy.hglrc);
|
||||
dummy.hglrc = NULL;
|
||||
}
|
||||
@@ -302,6 +377,10 @@ _get_wgl_pfd (HDC hdc,
|
||||
int pixelAttribs[PIXEL_ATTRIBUTES];
|
||||
int alpha_idx = 0;
|
||||
|
||||
/* Save up the HDC and HGLRC that we are currently using, to restore back to it when we are done here */
|
||||
HDC hdc_current = wglGetCurrentDC ();
|
||||
HGLRC hglrc_current = wglGetCurrentContext ();
|
||||
|
||||
if (display->hasWglARBmultisample)
|
||||
{
|
||||
/* 2 pairs of values needed for multisampling/AA support */
|
||||
@@ -355,7 +434,10 @@ _get_wgl_pfd (HDC hdc,
|
||||
best_pf = _gdk_init_dummy_context (&dummy, need_alpha_bits);
|
||||
|
||||
if (best_pf == 0 || !wglMakeCurrent (dummy.hdc, dummy.hglrc))
|
||||
return 0;
|
||||
{
|
||||
wglMakeCurrent (hdc_current, hglrc_current);
|
||||
return 0;
|
||||
}
|
||||
|
||||
wglChoosePixelFormatARB (hdc,
|
||||
pixelAttribs,
|
||||
@@ -384,7 +466,8 @@ _get_wgl_pfd (HDC hdc,
|
||||
}
|
||||
}
|
||||
|
||||
wglMakeCurrent (NULL, NULL);
|
||||
/* Go back to the HDC that we were using, since we are done with the dummy HDC and GL Context */
|
||||
wglMakeCurrent (hdc_current, hglrc_current);
|
||||
_destroy_dummy_gl_context (dummy);
|
||||
}
|
||||
else
|
||||
@@ -447,64 +530,152 @@ _gdk_init_dummy_context (GdkWGLDummy *dummy,
|
||||
return best_idx;
|
||||
}
|
||||
|
||||
gboolean
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
|
||||
#ifndef EGL_PLATFORM_ANGLE_ANGLE
|
||||
#define EGL_PLATFORM_ANGLE_ANGLE 0x3202
|
||||
#endif
|
||||
|
||||
#ifndef EGL_PLATFORM_ANGLE_TYPE_ANGLE
|
||||
#define EGL_PLATFORM_ANGLE_TYPE_ANGLE 0x3203
|
||||
#endif
|
||||
|
||||
#ifndef EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE
|
||||
#define EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE 0x3208
|
||||
#endif
|
||||
|
||||
static EGLDisplay
|
||||
_gdk_win32_get_egl_display (GdkWin32Display *display)
|
||||
{
|
||||
EGLDisplay disp;
|
||||
gboolean success = FALSE;
|
||||
|
||||
if (epoxy_has_egl_extension (NULL, "EGL_EXT_platform_base"))
|
||||
{
|
||||
PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplay = (void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
|
||||
if (getPlatformDisplay)
|
||||
{
|
||||
EGLint disp_attr[] = {EGL_PLATFORM_ANGLE_TYPE_ANGLE, EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE, EGL_NONE};
|
||||
|
||||
disp = getPlatformDisplay (EGL_PLATFORM_ANGLE_ANGLE, display->hdc_egl_temp, disp_attr);
|
||||
|
||||
if (disp != EGL_NO_DISPLAY)
|
||||
return disp;
|
||||
}
|
||||
}
|
||||
return eglGetDisplay (display->hdc_egl_temp);
|
||||
}
|
||||
#endif
|
||||
|
||||
static gboolean
|
||||
_gdk_win32_display_init_gl (GdkDisplay *display,
|
||||
const gboolean need_alpha_bits)
|
||||
{
|
||||
GdkWin32Display *display_win32 = GDK_WIN32_DISPLAY (display);
|
||||
gint best_idx = 0;
|
||||
GdkWGLDummy dummy;
|
||||
gboolean disable_wgl = FALSE;
|
||||
|
||||
if (display_win32->have_wgl)
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
EGLDisplay egl_disp;
|
||||
disable_wgl = (_gdk_gl_flags & GDK_GL_GLES) != 0;
|
||||
#endif
|
||||
|
||||
if (display_win32->have_wgl
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
|| display_win32->have_egl
|
||||
#endif
|
||||
)
|
||||
return TRUE;
|
||||
|
||||
memset (&dummy, 0, sizeof (GdkWGLDummy));
|
||||
if (!disable_wgl)
|
||||
{
|
||||
/* acquire and cache dummy Window (HWND & HDC) and
|
||||
* dummy GL Context, it is used to query functions
|
||||
* and used for other stuff as well
|
||||
*/
|
||||
GdkWGLDummy dummy;
|
||||
memset (&dummy, 0, sizeof (GdkWGLDummy));
|
||||
|
||||
/* acquire and cache dummy Window (HWND & HDC) and
|
||||
* dummy GL Context, it is used to query functions
|
||||
* and used for other stuff as well
|
||||
*/
|
||||
best_idx = _gdk_init_dummy_context (&dummy, need_alpha_bits);
|
||||
best_idx = _gdk_init_dummy_context (&dummy, need_alpha_bits);
|
||||
|
||||
if (best_idx == 0 || !wglMakeCurrent (dummy.hdc, dummy.hglrc))
|
||||
return FALSE;
|
||||
if (best_idx == 0 || !wglMakeCurrent (dummy.hdc, dummy.hglrc))
|
||||
return FALSE;
|
||||
|
||||
display_win32->have_wgl = TRUE;
|
||||
display_win32->gl_version = epoxy_gl_version ();
|
||||
display_win32->have_wgl = TRUE;
|
||||
display_win32->gl_version = epoxy_gl_version ();
|
||||
|
||||
display_win32->hasWglARBCreateContext =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_ARB_create_context");
|
||||
display_win32->hasWglEXTSwapControl =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_EXT_swap_control");
|
||||
display_win32->hasWglOMLSyncControl =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_OML_sync_control");
|
||||
display_win32->hasWglARBPixelFormat =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_ARB_pixel_format");
|
||||
display_win32->hasWglARBmultisample =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_ARB_multisample");
|
||||
|
||||
GDK_NOTE (OPENGL,
|
||||
g_print ("WGL API version %d.%d found\n"
|
||||
" - Vendor: %s\n"
|
||||
" - Checked extensions:\n"
|
||||
"\t* WGL_ARB_pixel_format: %s\n"
|
||||
"\t* WGL_ARB_create_context: %s\n"
|
||||
"\t* WGL_EXT_swap_control: %s\n"
|
||||
"\t* WGL_OML_sync_control: %s\n"
|
||||
"\t* WGL_ARB_multisample: %s\n",
|
||||
display_win32->gl_version / 10,
|
||||
display_win32->gl_version % 10,
|
||||
glGetString (GL_VENDOR),
|
||||
display_win32->hasWglARBPixelFormat ? "yes" : "no",
|
||||
display_win32->hasWglARBCreateContext ? "yes" : "no",
|
||||
display_win32->hasWglEXTSwapControl ? "yes" : "no",
|
||||
display_win32->hasWglOMLSyncControl ? "yes" : "no",
|
||||
display_win32->hasWglARBmultisample ? "yes" : "no"));
|
||||
|
||||
wglMakeCurrent (NULL, NULL);
|
||||
|
||||
_destroy_dummy_gl_context (dummy);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
egl_disp = _gdk_win32_get_egl_display (display_win32);
|
||||
|
||||
if (egl_disp == EGL_NO_DISPLAY ||
|
||||
!eglInitialize (egl_disp, NULL, NULL))
|
||||
{
|
||||
if (egl_disp != EGL_NO_DISPLAY)
|
||||
{
|
||||
eglTerminate (egl_disp);
|
||||
egl_disp = EGL_NO_DISPLAY;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
display_win32->egl_disp = egl_disp;
|
||||
display_win32->have_egl = TRUE;
|
||||
display_win32->egl_version = epoxy_egl_version (egl_disp);
|
||||
|
||||
eglBindAPI(EGL_OPENGL_ES_API);
|
||||
|
||||
display_win32->hasEglSurfacelessContext =
|
||||
epoxy_has_egl_extension (egl_disp, "EGL_KHR_surfaceless_context");
|
||||
|
||||
display_win32->hasWglARBCreateContext =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_ARB_create_context");
|
||||
display_win32->hasWglEXTSwapControl =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_EXT_swap_control");
|
||||
display_win32->hasWglOMLSyncControl =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_OML_sync_control");
|
||||
display_win32->hasWglARBPixelFormat =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_ARB_pixel_format");
|
||||
display_win32->hasWglARBmultisample =
|
||||
epoxy_has_wgl_extension (dummy.hdc, "WGL_ARB_multisample");
|
||||
|
||||
GDK_NOTE (OPENGL,
|
||||
g_print ("WGL API version %d.%d found\n"
|
||||
g_print ("EGL API version %d.%d found\n"
|
||||
" - Vendor: %s\n"
|
||||
" - Checked extensions:\n"
|
||||
"\t* WGL_ARB_pixel_format: %s\n",
|
||||
"\t* WGL_ARB_create_context: %s\n"
|
||||
"\t* WGL_EXT_swap_control: %s\n"
|
||||
"\t* WGL_OML_sync_control: %s\n",
|
||||
"\t* WGL_ARB_multisample: %s\n",
|
||||
display_win32->gl_version / 10,
|
||||
display_win32->gl_version % 10,
|
||||
glGetString (GL_VENDOR),
|
||||
display_win32->hasWglARBPixelFormat ? "yes" : "no",
|
||||
display_win32->hasWglARBCreateContext ? "yes" : "no",
|
||||
display_win32->hasWglEXTSwapControl ? "yes" : "no",
|
||||
display_win32->hasWglOMLSyncControl ? "yes" : "no",
|
||||
display_win32->hasWglARBmultisample ? "yes" : "no"));
|
||||
|
||||
wglMakeCurrent (NULL, NULL);
|
||||
_destroy_dummy_gl_context (dummy);
|
||||
"\t* EGL_KHR_surfaceless_context: %s\n",
|
||||
display_win32->egl_version / 10,
|
||||
display_win32->egl_version % 10,
|
||||
eglQueryString (display_win32->egl_disp, EGL_VENDOR),
|
||||
display_win32->hasEglSurfacelessContext ? "yes" : "no"));
|
||||
|
||||
return TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Setup the legacy context after creating it */
|
||||
@@ -578,11 +749,18 @@ _create_gl_context (HDC hdc,
|
||||
HGLRC hglrc_base = wglCreateContext (hdc);
|
||||
gboolean success = TRUE;
|
||||
|
||||
/* Save up the HDC and HGLRC that we are currently using, to restore back to it when we are done here */
|
||||
HDC hdc_current = wglGetCurrentDC ();
|
||||
HGLRC hglrc_current = wglGetCurrentContext ();
|
||||
|
||||
/* if we have no wglCreateContextAttribsARB(), return the legacy context when all is set */
|
||||
if (*is_legacy && !hasWglARBCreateContext)
|
||||
{
|
||||
if (_ensure_legacy_gl_context (hdc, hglrc_base, share))
|
||||
return hglrc_base;
|
||||
{
|
||||
wglMakeCurrent (hdc_current, hglrc_current);
|
||||
return hglrc_base;
|
||||
}
|
||||
|
||||
success = FALSE;
|
||||
goto gl_fail;
|
||||
@@ -632,17 +810,21 @@ _create_gl_context (HDC hdc,
|
||||
}
|
||||
|
||||
gl_fail:
|
||||
if (!success || hglrc != NULL)
|
||||
|
||||
if (!success)
|
||||
{
|
||||
wglMakeCurrent (NULL, NULL);
|
||||
wglDeleteContext (hglrc_base);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!success)
|
||||
return NULL;
|
||||
wglMakeCurrent (hdc_current, hglrc_current);
|
||||
|
||||
if (hglrc != NULL)
|
||||
return hglrc;
|
||||
{
|
||||
wglDeleteContext (hglrc_base);
|
||||
return hglrc;
|
||||
}
|
||||
|
||||
return hglrc_base;
|
||||
}
|
||||
@@ -671,31 +853,55 @@ _set_pixformat_for_hdc (HDC hdc,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_win32_gl_context_realize (GdkGLContext *context,
|
||||
GError **error)
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
|
||||
#define MAX_EGL_ATTRS 30
|
||||
|
||||
static gboolean
|
||||
find_eglconfig_for_window (GdkWin32Display *display,
|
||||
EGLConfig *egl_config_out,
|
||||
EGLint *min_swap_interval_out,
|
||||
gboolean need_alpha_bits,
|
||||
GError **error)
|
||||
{
|
||||
GdkGLContext *share = gdk_gl_context_get_shared_context (context);
|
||||
GdkWin32GLContext *context_win32 = GDK_WIN32_GL_CONTEXT (context);
|
||||
EGLint attrs[MAX_EGL_ATTRS];
|
||||
EGLint count;
|
||||
EGLConfig *configs, chosen_config;
|
||||
|
||||
/* These are the real WGL context items that we will want to use later */
|
||||
HGLRC hglrc;
|
||||
gint pixel_format;
|
||||
gboolean debug_bit, compat_bit, legacy_bit;
|
||||
int i = 0;
|
||||
|
||||
/* request flags and specific versions for core (3.2+) WGL context */
|
||||
gint flags = 0;
|
||||
gint glver_major = 0;
|
||||
gint glver_minor = 0;
|
||||
EGLDisplay egl_disp = display->egl_disp;
|
||||
|
||||
GdkWindow *window = gdk_gl_context_get_window (context);
|
||||
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
GdkWin32Display *win32_display = GDK_WIN32_DISPLAY (gdk_window_get_display (window));
|
||||
attrs[i++] = EGL_CONFORMANT;
|
||||
attrs[i++] = EGL_OPENGL_ES2_BIT;
|
||||
attrs[i++] = EGL_SURFACE_TYPE;
|
||||
attrs[i++] = EGL_WINDOW_BIT;
|
||||
|
||||
if (!_set_pixformat_for_hdc (context_win32->gl_hdc,
|
||||
&pixel_format,
|
||||
context_win32->need_alpha_bits,
|
||||
win32_display))
|
||||
attrs[i++] = EGL_COLOR_BUFFER_TYPE;
|
||||
attrs[i++] = EGL_RGB_BUFFER;
|
||||
|
||||
attrs[i++] = EGL_RED_SIZE;
|
||||
attrs[i++] = 1;
|
||||
attrs[i++] = EGL_GREEN_SIZE;
|
||||
attrs[i++] = 1;
|
||||
attrs[i++] = EGL_BLUE_SIZE;
|
||||
attrs[i++] = 1;
|
||||
|
||||
if (need_alpha_bits)
|
||||
{
|
||||
attrs[i++] = EGL_ALPHA_SIZE;
|
||||
attrs[i++] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
attrs[i++] = EGL_ALPHA_SIZE;
|
||||
attrs[i++] = EGL_DONT_CARE;
|
||||
}
|
||||
|
||||
attrs[i++] = EGL_NONE;
|
||||
g_assert (i < MAX_EGL_ATTRS);
|
||||
|
||||
if (!eglChooseConfig (display->egl_disp, attrs, NULL, 0, &count) || count < 1)
|
||||
{
|
||||
g_set_error_literal (error, GDK_GL_ERROR,
|
||||
GDK_GL_ERROR_UNSUPPORTED_FORMAT,
|
||||
@@ -703,57 +909,220 @@ _gdk_win32_gl_context_realize (GdkGLContext *context,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gdk_gl_context_get_required_version (context, &glver_major, &glver_minor);
|
||||
debug_bit = gdk_gl_context_get_debug_enabled (context);
|
||||
compat_bit = gdk_gl_context_get_forward_compatible (context);
|
||||
configs = g_new (EGLConfig, count);
|
||||
|
||||
/* if there isn't wglCreateContextAttribsARB(), or if GDK_GL_LEGACY is set, we default to a legacy context */
|
||||
legacy_bit = !win32_display->hasWglARBCreateContext ||
|
||||
g_getenv ("GDK_GL_LEGACY") != NULL;
|
||||
if (!eglChooseConfig (display->egl_disp, attrs, configs, count, &count) || count < 1)
|
||||
{
|
||||
g_set_error_literal (error, GDK_GL_ERROR,
|
||||
GDK_GL_ERROR_UNSUPPORTED_FORMAT,
|
||||
_("No available configurations for the given pixel format"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Pick first valid configuration i guess? */
|
||||
chosen_config = configs[0];
|
||||
|
||||
if (!eglGetConfigAttrib (display->egl_disp, chosen_config,
|
||||
EGL_MIN_SWAP_INTERVAL, min_swap_interval_out))
|
||||
{
|
||||
g_set_error_literal (error, GDK_GL_ERROR,
|
||||
GDK_GL_ERROR_NOT_AVAILABLE,
|
||||
"Could not retrieve the minimum swap interval");
|
||||
g_free (configs);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (egl_config_out != NULL)
|
||||
*egl_config_out = chosen_config;
|
||||
|
||||
g_free (configs);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#define N_EGL_ATTRS 16
|
||||
|
||||
static EGLContext
|
||||
_create_egl_context (EGLDisplay display,
|
||||
EGLConfig config,
|
||||
GdkGLContext *share,
|
||||
int flags,
|
||||
int major,
|
||||
int minor,
|
||||
gboolean *is_legacy)
|
||||
{
|
||||
EGLContext ctx;
|
||||
EGLint context_attribs[N_EGL_ATTRS];
|
||||
int i = 0;
|
||||
|
||||
/* ANGLE does not support the GL_OES_vertex_array_object extension, so we need to use ES3 directly */
|
||||
context_attribs[i++] = EGL_CONTEXT_CLIENT_VERSION;
|
||||
context_attribs[i++] = 3;
|
||||
|
||||
/* Specify the flags */
|
||||
context_attribs[i++] = EGL_CONTEXT_FLAGS_KHR;
|
||||
context_attribs[i++] = flags;
|
||||
|
||||
context_attribs[i++] = EGL_NONE;
|
||||
g_assert (i < N_EGL_ATTRS);
|
||||
|
||||
ctx = eglCreateContext (display,
|
||||
config,
|
||||
share != NULL ? GDK_WIN32_GL_CONTEXT (share)->egl_context
|
||||
: EGL_NO_CONTEXT,
|
||||
context_attribs);
|
||||
|
||||
if (ctx != EGL_NO_CONTEXT)
|
||||
GDK_NOTE (OPENGL, g_message ("Created EGL context[%p]", ctx));
|
||||
|
||||
return ctx;
|
||||
}
|
||||
#endif /* GDK_WIN32_ENABLE_EGL */
|
||||
|
||||
gboolean
|
||||
_gdk_win32_gl_context_realize (GdkGLContext *context,
|
||||
GError **error)
|
||||
{
|
||||
GdkGLContext *share = gdk_gl_context_get_shared_context (context);
|
||||
GdkWin32GLContext *context_win32 = GDK_WIN32_GL_CONTEXT (context);
|
||||
|
||||
/* These are the real WGL/EGL context items that we will want to use later */
|
||||
gboolean debug_bit, compat_bit, legacy_bit;
|
||||
|
||||
/* These are the real WGL context items that we will want to use later */
|
||||
HGLRC hglrc;
|
||||
gint pixel_format;
|
||||
gboolean use_es = FALSE;
|
||||
|
||||
/* request flags and specific versions for core (3.2+) WGL context */
|
||||
gint flags = 0;
|
||||
gint major = 0;
|
||||
gint minor = 0;
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
EGLContext egl_context;
|
||||
#endif
|
||||
|
||||
GdkWindow *window = gdk_gl_context_get_window (context);
|
||||
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
GdkWin32Display *win32_display = GDK_WIN32_DISPLAY (gdk_window_get_display (window));
|
||||
|
||||
/*
|
||||
* A legacy context cannot be shared with core profile ones, so this means we
|
||||
* must stick to a legacy context if the shared context is a legacy context
|
||||
*/
|
||||
if (share != NULL && gdk_gl_context_is_legacy (share))
|
||||
if ((_gdk_gl_flags & GDK_GL_LEGACY) != 0 ||
|
||||
share != NULL && gdk_gl_context_is_legacy (share))
|
||||
legacy_bit = TRUE;
|
||||
|
||||
if (debug_bit)
|
||||
flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
|
||||
if (compat_bit)
|
||||
flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
|
||||
if ((_gdk_gl_flags & GDK_GL_GLES) != 0 ||
|
||||
(share != NULL && gdk_gl_context_get_use_es (share)))
|
||||
use_es = TRUE;
|
||||
|
||||
GDK_NOTE (OPENGL,
|
||||
g_print ("Creating %s WGL context (version:%d.%d, debug:%s, forward:%s, legacy: %s)\n",
|
||||
compat_bit ? "core" : "compat",
|
||||
glver_major,
|
||||
glver_minor,
|
||||
debug_bit ? "yes" : "no",
|
||||
compat_bit ? "yes" : "no",
|
||||
legacy_bit ? "yes" : "no"));
|
||||
gdk_gl_context_get_required_version (context, &major, &minor);
|
||||
debug_bit = gdk_gl_context_get_debug_enabled (context);
|
||||
compat_bit = gdk_gl_context_get_forward_compatible (context);
|
||||
|
||||
hglrc = _create_gl_context (context_win32->gl_hdc,
|
||||
share,
|
||||
flags,
|
||||
glver_major,
|
||||
glver_minor,
|
||||
&legacy_bit,
|
||||
win32_display->hasWglARBCreateContext);
|
||||
|
||||
if (hglrc == NULL)
|
||||
if (win32_display->have_wgl)
|
||||
{
|
||||
g_set_error_literal (error, GDK_GL_ERROR,
|
||||
GDK_GL_ERROR_NOT_AVAILABLE,
|
||||
_("Unable to create a GL context"));
|
||||
return FALSE;
|
||||
if (!_set_pixformat_for_hdc (context_win32->gl_hdc,
|
||||
&pixel_format,
|
||||
context_win32->need_alpha_bits,
|
||||
win32_display))
|
||||
{
|
||||
g_set_error_literal (error, GDK_GL_ERROR,
|
||||
GDK_GL_ERROR_UNSUPPORTED_FORMAT,
|
||||
_("No available configurations for the given pixel format"));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* if there isn't wglCreateContextAttribsARB(), or if GDK_GL_LEGACY is set, we default to a legacy context */
|
||||
legacy_bit = !win32_display->hasWglARBCreateContext ||
|
||||
g_getenv ("GDK_GL_LEGACY") != NULL;
|
||||
|
||||
if (debug_bit)
|
||||
flags |= WGL_CONTEXT_DEBUG_BIT_ARB;
|
||||
if (compat_bit)
|
||||
flags |= WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB;
|
||||
|
||||
GDK_NOTE (OPENGL,
|
||||
g_print ("Creating %s WGL context (version:%d.%d, debug:%s, forward:%s, legacy: %s)\n",
|
||||
compat_bit ? "core" : "compat",
|
||||
major,
|
||||
minor,
|
||||
debug_bit ? "yes" : "no",
|
||||
compat_bit ? "yes" : "no",
|
||||
legacy_bit ? "yes" : "no"));
|
||||
|
||||
hglrc = _create_gl_context (context_win32->gl_hdc,
|
||||
share,
|
||||
flags,
|
||||
major,
|
||||
minor,
|
||||
&legacy_bit,
|
||||
win32_display->hasWglARBCreateContext);
|
||||
|
||||
if (hglrc == NULL)
|
||||
{
|
||||
g_set_error_literal (error, GDK_GL_ERROR,
|
||||
GDK_GL_ERROR_NOT_AVAILABLE,
|
||||
_("Unable to create a GL context"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GDK_NOTE (OPENGL,
|
||||
g_print ("Created WGL context[%p], pixel_format=%d\n",
|
||||
hglrc,
|
||||
pixel_format));
|
||||
|
||||
context_win32->hglrc = hglrc;
|
||||
}
|
||||
|
||||
GDK_NOTE (OPENGL,
|
||||
g_print ("Created WGL context[%p], pixel_format=%d\n",
|
||||
hglrc,
|
||||
pixel_format));
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
if (win32_display->have_egl)
|
||||
{
|
||||
EGLContext ctx;
|
||||
|
||||
context_win32->hglrc = hglrc;
|
||||
if (debug_bit)
|
||||
flags |= EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR;
|
||||
if (compat_bit)
|
||||
flags |= EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR;
|
||||
|
||||
GDK_NOTE (OPENGL, g_message ("Creating EGL context version %d.%d (debug:%s, forward:%s, legacy:%s)",
|
||||
major, minor,
|
||||
debug_bit ? "yes" : "no",
|
||||
compat_bit ? "yes" : "no",
|
||||
legacy_bit ? "yes" : "no"));
|
||||
|
||||
ctx = _create_egl_context (win32_display->egl_disp,
|
||||
context_win32->egl_config,
|
||||
share,
|
||||
flags,
|
||||
major,
|
||||
minor,
|
||||
&legacy_bit);
|
||||
|
||||
if (ctx == EGL_NO_CONTEXT)
|
||||
{
|
||||
g_set_error_literal (error, GDK_GL_ERROR,
|
||||
GDK_GL_ERROR_NOT_AVAILABLE,
|
||||
_("Unable to create a GL context"));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GDK_NOTE (OPENGL,
|
||||
g_print ("Created EGL context[%p]\n",
|
||||
ctx));
|
||||
|
||||
context_win32->egl_context = ctx;
|
||||
use_es = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* set whether we are using GLES */
|
||||
gdk_gl_context_set_use_es(context, use_es);
|
||||
|
||||
/* OpenGL does not work with WS_EX_LAYERED enabled, so we need to
|
||||
* disable WS_EX_LAYERED when we acquire a valid HGLRC
|
||||
@@ -786,9 +1155,21 @@ _gdk_win32_window_create_gl_context (GdkWindow *window,
|
||||
gboolean need_alpha_bits = (visual == gdk_screen_get_rgba_visual (gdk_display_get_default_screen (display)));
|
||||
|
||||
/* Acquire and store up the Windows-specific HWND and HDC */
|
||||
HWND hwnd;
|
||||
HDC hdc;
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
EGLContext egl_context;
|
||||
EGLConfig config;
|
||||
#endif
|
||||
|
||||
display_win32->gl_hwnd = GDK_WINDOW_HWND (window);
|
||||
hdc = GetDC (display_win32->gl_hwnd);
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
/* display_win32->hdc_egl_temp should *not* be destroyed here! It is destroyed at dispose()! */
|
||||
display_win32->hdc_egl_temp = hdc;
|
||||
#endif
|
||||
|
||||
if (!_gdk_win32_display_init_gl (display, need_alpha_bits))
|
||||
{
|
||||
g_set_error_literal (error, GDK_GL_ERROR,
|
||||
@@ -797,11 +1178,12 @@ _gdk_win32_window_create_gl_context (GdkWindow *window,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
hwnd = GDK_WINDOW_HWND (window);
|
||||
hdc = GetDC (hwnd);
|
||||
|
||||
display_win32->gl_hdc = hdc;
|
||||
display_win32->gl_hwnd = hwnd;
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
if (display_win32->have_egl && !find_eglconfig_for_window (display_win32, &config,
|
||||
&display_win32->egl_min_swap_interval, need_alpha_bits,
|
||||
error))
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
context = g_object_new (GDK_TYPE_WIN32_GL_CONTEXT,
|
||||
"display", display,
|
||||
@@ -811,6 +1193,12 @@ _gdk_win32_window_create_gl_context (GdkWindow *window,
|
||||
|
||||
context->need_alpha_bits = need_alpha_bits;
|
||||
context->gl_hdc = hdc;
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
if (display_win32->have_egl)
|
||||
context->egl_config = config;
|
||||
#endif
|
||||
|
||||
context->is_attached = attached;
|
||||
|
||||
return GDK_GL_CONTEXT (context);
|
||||
@@ -825,47 +1213,89 @@ _gdk_win32_display_make_gl_context_current (GdkDisplay *display,
|
||||
GdkWindow *window;
|
||||
GdkScreen *screen;
|
||||
|
||||
#if GDK_WIN32_ENABLE_EGL
|
||||
EGLSurface egl_surface;
|
||||
#endif
|
||||
|
||||
gboolean do_frame_sync = FALSE;
|
||||
|
||||
if (context == NULL)
|
||||
{
|
||||
wglMakeCurrent(NULL, NULL);
|
||||
if (display_win32->have_wgl)
|
||||
wglMakeCurrent(NULL, NULL);
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
else if (display_win32->have_egl)
|
||||
eglMakeCurrent (display_win32->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
||||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
context_win32 = GDK_WIN32_GL_CONTEXT (context);
|
||||
window = gdk_gl_context_get_window (context);
|
||||
|
||||
if (!wglMakeCurrent (display_win32->gl_hdc, context_win32->hglrc))
|
||||
if (!gdk_gl_context_get_use_es (context))
|
||||
{
|
||||
GDK_NOTE (OPENGL,
|
||||
g_print ("Making WGL context current failed\n"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
context_win32->gl_hdc = display_win32->gl_hdc;
|
||||
|
||||
if (context_win32->is_attached && display_win32->hasWglEXTSwapControl)
|
||||
{
|
||||
window = gdk_gl_context_get_window (context);
|
||||
|
||||
/* If there is compositing there is no particular need to delay
|
||||
* the swap when drawing on the offscreen, rendering to the screen
|
||||
* happens later anyway, and its up to the compositor to sync that
|
||||
* to the vblank. */
|
||||
screen = gdk_window_get_screen (window);
|
||||
do_frame_sync = ! gdk_screen_is_composited (screen);
|
||||
|
||||
if (do_frame_sync != context_win32->do_frame_sync)
|
||||
if (!wglMakeCurrent (context_win32->gl_hdc, context_win32->hglrc))
|
||||
{
|
||||
context_win32->do_frame_sync = do_frame_sync;
|
||||
GDK_NOTE (OPENGL,
|
||||
g_print ("Making WGL context current failed\n"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (do_frame_sync)
|
||||
wglSwapIntervalEXT (1);
|
||||
else
|
||||
wglSwapIntervalEXT (0);
|
||||
if (context_win32->is_attached)
|
||||
{
|
||||
if (display_win32->hasWglEXTSwapControl)
|
||||
{
|
||||
/* If there is compositing there is no particular need to delay
|
||||
* the swap when drawing on the offscreen, rendering to the screen
|
||||
* happens later anyway, and its up to the compositor to sync that
|
||||
* to the vblank. */
|
||||
screen = gdk_window_get_screen (window);
|
||||
do_frame_sync = ! gdk_screen_is_composited (screen);
|
||||
|
||||
if (do_frame_sync != context_win32->do_frame_sync)
|
||||
{
|
||||
context_win32->do_frame_sync = do_frame_sync;
|
||||
|
||||
if (do_frame_sync)
|
||||
wglSwapIntervalEXT (1);
|
||||
else
|
||||
wglSwapIntervalEXT (0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
else
|
||||
{
|
||||
if (context_win32->is_attached)
|
||||
egl_surface = _gdk_win32_window_get_egl_surface (window, context_win32->egl_config, FALSE);
|
||||
else
|
||||
{
|
||||
if (display_win32->hasEglSurfacelessContext)
|
||||
egl_surface = EGL_NO_SURFACE;
|
||||
else
|
||||
egl_surface = _gdk_win32_window_get_egl_surface (window, context_win32->egl_config, TRUE);
|
||||
}
|
||||
|
||||
if (!eglMakeCurrent (display_win32->egl_disp,
|
||||
egl_surface,
|
||||
egl_surface,
|
||||
context_win32->egl_context))
|
||||
{
|
||||
g_warning ("eglMakeCurrent failed");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (display_win32->egl_min_swap_interval == 0)
|
||||
eglSwapInterval (display_win32->egl_disp, 0);
|
||||
else
|
||||
g_debug ("Can't disable GL swap interval");
|
||||
}
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -886,18 +1316,55 @@ gdk_win32_display_get_wgl_version (GdkDisplay *display,
|
||||
gint *major,
|
||||
gint *minor)
|
||||
{
|
||||
GdkWin32Display *display_win32 = NULL;
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
||||
|
||||
if (!GDK_IS_WIN32_DISPLAY (display))
|
||||
return FALSE;
|
||||
|
||||
if (!_gdk_win32_display_init_gl (display, FALSE))
|
||||
display_win32 = GDK_WIN32_DISPLAY (display);
|
||||
|
||||
if (!_gdk_win32_display_init_gl (display, FALSE) || !display_win32->have_wgl
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
|| !display_win32->have_egl
|
||||
#endif
|
||||
)
|
||||
return FALSE;
|
||||
|
||||
if (major != NULL)
|
||||
*major = GDK_WIN32_DISPLAY (display)->gl_version / 10;
|
||||
if (minor != NULL)
|
||||
*minor = GDK_WIN32_DISPLAY (display)->gl_version % 10;
|
||||
if (display_win32->have_wgl)
|
||||
{
|
||||
if (major != NULL)
|
||||
*major = GDK_WIN32_DISPLAY (display)->gl_version / 10;
|
||||
if (minor != NULL)
|
||||
*minor = GDK_WIN32_DISPLAY (display)->gl_version % 10;
|
||||
}
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
else if (display_win32->have_egl)
|
||||
{
|
||||
if (major != NULL)
|
||||
*major = GDK_WIN32_DISPLAY (display)->egl_version / 10;
|
||||
if (minor != NULL)
|
||||
*minor = GDK_WIN32_DISPLAY (display)->egl_version % 10;
|
||||
}
|
||||
#endif
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_win32_window_invalidate_egl_framebuffer (GdkWindow *window)
|
||||
{
|
||||
/* If we are using ANGLE, we need to force redraw of the whole Window and its child windows
|
||||
* as we need to re-acquire the EGL surfaces that we rendered to upload to Cairo explicitly,
|
||||
* using gdk_window_invalidate_rect (), when we maximize or restore or use aerosnap
|
||||
*/
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
if (window->gl_paint_context != NULL && gdk_gl_context_get_use_es (window->gl_paint_context))
|
||||
{
|
||||
GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
|
||||
impl->egl_force_redraw_all = TRUE;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -24,6 +24,10 @@
|
||||
#include <epoxy/gl.h>
|
||||
#include <epoxy/wgl.h>
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
# include <epoxy/egl.h>
|
||||
#endif
|
||||
|
||||
#include "gdkglcontextprivate.h"
|
||||
#include "gdkdisplayprivate.h"
|
||||
#include "gdkvisual.h"
|
||||
@@ -46,6 +50,12 @@ struct _GdkWin32GLContext
|
||||
guint is_attached : 1;
|
||||
guint do_frame_sync : 1;
|
||||
guint do_blit_swap : 1;
|
||||
|
||||
#ifdef GDK_WIN32_ENABLE_EGL
|
||||
/* EGL (Angle) Context Items */
|
||||
EGLContext egl_context;
|
||||
EGLConfig egl_config;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct _GdkWin32GLContextClass
|
||||
@@ -76,6 +86,9 @@ gboolean
|
||||
_gdk_win32_gl_context_realize (GdkGLContext *context,
|
||||
GError **error);
|
||||
|
||||
void
|
||||
_gdk_win32_window_invalidate_egl_framebuffer (GdkWindow *window);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GDK_WIN32_GL_CONTEXT__ */
|
||||
|
||||
@@ -41,41 +41,11 @@ HKL _gdk_input_locale;
|
||||
gboolean _gdk_input_locale_is_ime;
|
||||
UINT _gdk_input_codepage;
|
||||
|
||||
GdkAtom _gdk_selection;
|
||||
GdkAtom _wm_transient_for;
|
||||
GdkAtom _targets;
|
||||
GdkAtom _delete;
|
||||
GdkAtom _save_targets;
|
||||
GdkAtom _utf8_string;
|
||||
GdkAtom _text;
|
||||
GdkAtom _compound_text;
|
||||
GdkAtom _text_uri_list;
|
||||
GdkAtom _text_html;
|
||||
GdkAtom _image_png;
|
||||
GdkAtom _image_jpeg;
|
||||
GdkAtom _image_bmp;
|
||||
GdkAtom _image_gif;
|
||||
|
||||
GdkAtom _local_dnd;
|
||||
GdkAtom _gdk_win32_dropfiles;
|
||||
GdkAtom _gdk_ole2_dnd;
|
||||
|
||||
UINT _cf_png;
|
||||
UINT _cf_jfif;
|
||||
UINT _cf_gif;
|
||||
UINT _cf_url;
|
||||
UINT _cf_html_format;
|
||||
UINT _cf_text_html;
|
||||
|
||||
GdkWin32DndState _dnd_target_state = GDK_WIN32_DND_NONE;
|
||||
GdkWin32DndState _dnd_source_state = GDK_WIN32_DND_NONE;
|
||||
|
||||
gint _gdk_input_ignore_wintab = FALSE;
|
||||
gint _gdk_max_colors = 0;
|
||||
|
||||
gboolean _modal_operation_in_progress = FALSE;
|
||||
GdkWin32ModalOpKind _modal_operation_in_progress = GDK_WIN32_MODAL_OP_NONE;
|
||||
HWND _modal_move_resize_window = NULL;
|
||||
gboolean _ignore_destroy_clipboard = FALSE;
|
||||
|
||||
HGLOBAL _delayed_rendering_data = NULL;
|
||||
GHashTable *_format_atom_table = NULL;
|
||||
/* The singleton selection object pointer */
|
||||
GdkWin32Selection *_win32_selection = NULL;
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
#include <wintab.h>
|
||||
#include <imm.h>
|
||||
|
||||
/* for CFSTR_SHELLIDLIST */
|
||||
#include <shlobj.h>
|
||||
|
||||
static gboolean gdk_synchronize = FALSE;
|
||||
|
||||
static gboolean dummy;
|
||||
@@ -98,38 +101,6 @@ _gdk_win32_windowing_init (void)
|
||||
GDK_NOTE (EVENTS, g_print ("input_locale:%p, codepage:%d\n",
|
||||
_gdk_input_locale, _gdk_input_codepage));
|
||||
|
||||
_gdk_selection = gdk_atom_intern_static_string ("GDK_SELECTION");
|
||||
_wm_transient_for = gdk_atom_intern_static_string ("WM_TRANSIENT_FOR");
|
||||
_targets = gdk_atom_intern_static_string ("TARGETS");
|
||||
_delete = gdk_atom_intern_static_string ("DELETE");
|
||||
_save_targets = gdk_atom_intern_static_string ("SAVE_TARGETS");
|
||||
_utf8_string = gdk_atom_intern_static_string ("UTF8_STRING");
|
||||
_text = gdk_atom_intern_static_string ("TEXT");
|
||||
_compound_text = gdk_atom_intern_static_string ("COMPOUND_TEXT");
|
||||
_text_uri_list = gdk_atom_intern_static_string ("text/uri-list");
|
||||
_text_html = gdk_atom_intern_static_string ("text/html");
|
||||
_image_png = gdk_atom_intern_static_string ("image/png");
|
||||
_image_jpeg = gdk_atom_intern_static_string ("image/jpeg");
|
||||
_image_bmp = gdk_atom_intern_static_string ("image/bmp");
|
||||
_image_gif = gdk_atom_intern_static_string ("image/gif");
|
||||
|
||||
_local_dnd = gdk_atom_intern_static_string ("LocalDndSelection");
|
||||
_gdk_win32_dropfiles = gdk_atom_intern_static_string ("DROPFILES_DND");
|
||||
_gdk_ole2_dnd = gdk_atom_intern_static_string ("OLE2_DND");
|
||||
|
||||
/* MS Office 2007, at least, offers images in common file formats
|
||||
* using clipboard format names like "PNG" and "JFIF". So we follow
|
||||
* the lead and map the GDK target name "image/png" to the clipboard
|
||||
* format name "PNG" etc.
|
||||
*/
|
||||
_cf_png = RegisterClipboardFormat ("PNG");
|
||||
_cf_jfif = RegisterClipboardFormat ("JFIF");
|
||||
_cf_gif = RegisterClipboardFormat ("GIF");
|
||||
|
||||
_cf_url = RegisterClipboardFormat ("UniformResourceLocatorW");
|
||||
_cf_html_format = RegisterClipboardFormat ("HTML Format");
|
||||
_cf_text_html = RegisterClipboardFormat ("text/html");
|
||||
|
||||
_gdk_win32_selection_init ();
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user