From: adam Date: Sun, 9 Jan 2005 11:00:52 +0000 (+0000) Subject: reference updates X-Git-Tag: 01-July-2005~28 X-Git-Url: http://git.megacz.com/?p=org.ibex.core.git;a=commitdiff_plain;h=c73e5d8c4f7487b4b1fef34c0b70521f033882fb reference updates darcs-hash:20050109110052-5007d-2fd07791070233621ccfdf9e3fc9e6a1a90dda5b.gz --- diff --git a/doc/ibex-doc.xml b/doc/ibex-doc.xml index 05e49d9..6d4df4f 100644 --- a/doc/ibex-doc.xml +++ b/doc/ibex-doc.xml @@ -132,6 +132,7 @@ **italics** __boldface__ ||typewriter|| + ==nonstructural heading== blank lines become paragraph breaks @@ -151,6 +152,12 @@ \quot \apos + wiki plugins: page topology (who points here, orphaned pages, statistics, document upload, etc) + http://en.wikipedia.org/wiki/Special:Specialpages + + structured ebnf content? + http://www.docbook.org/tdg/en/html/docbook.html + diff --git a/doc/reference/ibex-logo.pdf b/doc/reference/ibex-logo.pdf new file mode 100644 index 0000000..cc178bc --- /dev/null +++ b/doc/reference/ibex-logo.pdf @@ -0,0 +1,47 @@ +%PDF-1.4 %âãÏÓ +1 0 obj<> endobj 2 0 obj<> endobj 3 0 obj<> endobj 5 0 obj null endobj 6 0 obj<>/Properties<>>>>>>> endobj 7 0 obj<> endobj 8 0 obj 14920 endobj 9 0 obj<>stream +/Layer /MC0 BDC 1 0 0 -1 0 0 cm 0 0 0 1 k 0 i /GS0 gs 56.13184 -157.37939 m 56.72656 -185.70264 95.53955 -209.16553 119.54199 -213.87158 c 69.36621 -221.03857 0.31396 -167.31885 37.35547 -115.41846 c 41.23438 -115.06982 56.92822 -117.90527 62.21387 -120.68066 c 58.48828 -127.44043 52.84668 -141.06055 56.13184 -157.37939 c f 56.13184 -157.37939 m 56.72656 -185.70264 95.53955 -209.16553 119.54199 -213.87158 c 69.36621 -221.03857 0.31396 -167.31885 37.35547 -115.41846 c 41.23438 -115.06982 56.92822 -117.90527 62.21387 -120.68066 c 58.48828 -127.44043 52.84668 -141.06055 56.13184 -157.37939 c f 0 0 0 0 K 1 w 4 M 0 j 0 J []0 d 56.13184 -157.37939 m 56.72656 -185.70264 95.53955 -209.16553 119.54199 -213.87158 c 69.36621 -221.03857 0.31396 -167.31885 37.35547 -115.41846 c 41.23438 -115.06982 56.92822 -117.90527 62.21387 -120.68066 c 58.48828 -127.44043 52.84668 -141.06055 56.13184 -157.37939 c S 145.86621 -184.11328 m 142.31152 -185.41455 138.5332 -186.14502 134.65527 -186.39795 c 156.23242 -168.72803 166.46582 -127.32227 145.51074 -105.37109 c 126.62891 -85.58984 96.10938 -75.66211 70.55713 -67.99609 c 97.55029 -74.76172 124.80078 -81.09277 152.12012 -86.4375 c 151.18359 -86.26758 142.32129 -84.61328 142.37891 -86.15234 c 142.46387 -88.3584 153.94629 -95.12598 155.91406 -97.41504 c 163.5332 -106.27637 167.03906 -109.69727 170.37598 -120.73535 c 174.27832 -133.63574 175.87793 -152.98779 171.55371 -165.83936 c 164.54199 -174.4707 155.41309 -180.61719 145.86621 -184.11328 c f 145.86621 -184.11328 m 142.31152 -185.41455 138.5332 -186.14502 134.65527 -186.39795 c 156.23242 -168.72803 166.46582 -127.32227 145.51074 -105.37109 c 126.62891 -85.58984 96.10938 -75.66211 70.55713 -67.99609 c 97.55029 -74.76172 124.80078 -81.09277 152.12012 -86.4375 c 151.18359 -86.26758 142.32129 -84.61328 142.37891 -86.15234 c 142.46387 -88.3584 153.94629 -95.12598 155.91406 -97.41504 c 163.5332 -106.27637 167.03906 -109.69727 170.37598 -120.73535 c 174.27832 -133.63574 175.87793 -152.98779 171.55371 -165.83936 c 164.54199 -174.4707 155.41309 -180.61719 145.86621 -184.11328 c f 145.86621 -184.11328 m 142.31152 -185.41455 138.5332 -186.14502 134.65527 -186.39795 c 156.23242 -168.72803 166.46582 -127.32227 145.51074 -105.37109 c 126.62891 -85.58984 96.10938 -75.66211 70.55713 -67.99609 c 97.55029 -74.76172 124.80078 -81.09277 152.12012 -86.4375 c 151.18359 -86.26758 142.32129 -84.61328 142.37891 -86.15234 c 142.46387 -88.3584 153.94629 -95.12598 155.91406 -97.41504 c 163.5332 -106.27637 167.03906 -109.69727 170.37598 -120.73535 c 174.27832 -133.63574 175.87793 -152.98779 171.55371 -165.83936 c 164.54199 -174.4707 155.41309 -180.61719 145.86621 -184.11328 c S 175.57422 -56.73828 m 176.0498 -55.29004 176.2959 -54.125 176.40332 -53.24609 c 176.5957 -54.22852 176.29883 -55.44336 175.57422 -56.73828 c h f 175.57422 -56.73828 m 176.0498 -55.29004 176.2959 -54.125 176.40332 -53.24609 c 176.5957 -54.22852 176.29883 -55.44336 175.57422 -56.73828 c h f 175.57422 -56.73828 m 176.0498 -55.29004 176.2959 -54.125 176.40332 -53.24609 c 176.5957 -54.22852 176.29883 -55.44336 175.57422 -56.73828 c h S 176.40332 -53.24609 m 176.40039 -53.22754 176.39746 -53.20703 176.3916 -53.18555 c 175.81543 -50.54492 176.73145 -50.5791 176.40332 -53.24609 c h f 176.40332 -53.24609 m 176.40039 -53.22754 176.39746 -53.20703 176.3916 -53.18555 c 175.81543 -50.54492 176.73145 -50.5791 176.40332 -53.24609 c h f 176.40332 -53.24609 m 176.40039 -53.22754 176.39746 -53.20703 176.3916 -53.18555 c 175.81543 -50.54492 176.73145 -50.5791 176.40332 -53.24609 c h S 109.72656 -115.14746 m 106.53516 -114.98682 107.25 -112.95947 109.72656 -115.14746 c 109.72656 -115.14746 109.72656 -115.14746 109.72656 -115.14746 c h f 109.72656 -115.14746 m 106.53516 -114.98682 107.25 -112.95947 109.72656 -115.14746 c 109.72656 -115.14746 109.72656 -115.14746 109.72656 -115.14746 c h f 109.72656 -115.14746 m 106.53516 -114.98682 107.25 -112.95947 109.72656 -115.14746 c 109.72656 -115.14746 109.72656 -115.14746 109.72656 -115.14746 c h S 180.67383 -74.25 m 181.40527 -74.38086 181.55762 -74.42188 180.67383 -74.25 c 180.67383 -74.25 180.67383 -74.25 180.67383 -74.25 c h f 180.67383 -74.25 m 181.40527 -74.38086 181.55762 -74.42188 180.67383 -74.25 c 180.67383 -74.25 180.67383 -74.25 180.67383 -74.25 c h f 180.67383 -74.25 m 181.40527 -74.38086 181.55762 -74.42188 180.67383 -74.25 c 180.67383 -74.25 180.67383 -74.25 180.67383 -74.25 c h S 99.10938 -55.81055 m 84.30566 -52.09961 87.70215 -52.38672 99.10938 -55.81055 c 99.10938 -55.81055 99.10938 -55.81055 99.10938 -55.81055 c h f 99.10938 -55.81055 m 84.30566 -52.09961 87.70215 -52.38672 99.10938 -55.81055 c 99.10938 -55.81055 99.10938 -55.81055 99.10938 -55.81055 c h f 99.10938 -55.81055 m 84.30566 -52.09961 87.70215 -52.38672 99.10938 -55.81055 c 99.10938 -55.81055 99.10938 -55.81055 99.10938 -55.81055 c h S 70.55713 -67.99609 m 55.75293 -64.28711 59.14893 -64.57422 70.55713 -67.99609 c 70.55713 -67.99609 70.55713 -67.99609 70.55713 -67.99609 c h f 70.55713 -67.99609 m 55.75293 -64.28711 59.14893 -64.57422 70.55713 -67.99609 c 70.55713 -67.99609 70.55713 -67.99609 70.55713 -67.99609 c h f 70.55713 -67.99609 m 55.75293 -64.28711 59.14893 -64.57422 70.55713 -67.99609 c 70.55713 -67.99609 70.55713 -67.99609 70.55713 -67.99609 c h S 152.12012 -86.4375 m 152.85059 -86.56836 153.00488 -86.60938 152.12012 -86.4375 c 152.12012 -86.4375 152.12012 -86.4375 152.12012 -86.4375 c h f 152.12012 -86.4375 m 152.85059 -86.56836 153.00488 -86.60938 152.12012 -86.4375 c 152.12012 -86.4375 152.12012 -86.4375 152.12012 -86.4375 c h f 152.12012 -86.4375 m 152.85059 -86.56836 153.00488 -86.60938 152.12012 -86.4375 c 152.12012 -86.4375 152.12012 -86.4375 152.12012 -86.4375 c h S 66.59131 -91.49023 m 64.96582 -89.86621 61.02002 -86.15039 56.37695 -88.00879 c 51.73438 -89.86621 52.43018 -89.16797 55.68115 -92.88281 c 58.93066 -96.59766 62.64453 -94.50781 63.57275 -93.81152 c 64.50195 -93.11621 68.2168 -93.11621 66.59131 -91.49023 c h 145.98145 -93.5791 m 124.3877 -112.47607 113.82813 -115.354 109.72656 -115.14746 c 107.25 -112.95947 106.53516 -114.98682 109.72656 -115.14746 c 109.81641 -115.22656 109.90625 -115.31104 110.00195 -115.40039 c 116.03711 -121.20361 116.26855 -127.23975 117.19727 -132.11377 c 118.12695 -136.98926 116.26855 -143.72119 114.64355 -144.64941 c 113.01758 -145.57813 111.85742 -146.2749 110.46484 -145.11377 c 109.07227 -143.95361 109.53711 -135.82861 105.59033 -134.20361 c 101.64355 -132.57959 96.53711 -123.06104 89.34082 -120.73926 c 82.14453 -118.41797 81.6792 -116.79297 81.91211 -119.81055 c 82.14453 -122.82813 83.07275 -123.75684 79.35791 -129.09766 c 75.64453 -134.43506 76.57324 -132.57959 74.94824 -132.34619 c 73.32275 -132.11377 71.2334 -117.49023 71.46582 -115.40039 c 71.69873 -113.31152 38.50244 -114.70361 36.41357 -116.3291 c 34.32422 -117.95361 41.75293 -104.25781 38.03809 -102.40039 c 34.32422 -100.54297 39.89551 -103.09668 35.7168 -100.54297 c 31.53857 -97.99121 39.89551 -94.74023 38.50244 -91.49023 c 37.10938 -88.24023 28.98486 -72.45605 28.28809 -72.45605 c 27.5918 -72.45605 18.53857 -52.72461 18.07471 -50.63477 c 17.61035 -48.54492 19.4668 -46.22266 19.4668 -42.97363 c 19.4668 -39.72168 19.23486 -36.70605 20.16406 -34.84863 c 21.09229 -32.99316 23.18164 -34.38477 23.18164 -34.38477 c 23.18164 -34.38477 23.41357 -33.9209 23.41357 -33.9209 c 23.41357 -33.9209 37.57373 -33.22461 25.50244 -32.99316 c 13.43115 -32.75879 36.87793 -29.97266 41.52002 -34.38477 c 46.1626 -38.79395 44.07324 -32.0625 54.28809 -34.15234 c 64.50195 -36.24219 47.09131 -30.20508 88.41211 -60.15137 c 129.73242 -90.09863 90.26953 -52.72461 101.64355 -17.20703 c 113.01758 18.31055 94.67969 -8.38379 122.76855 -45.29297 c 147.11426 -77.28516 170.76074 -65.33203 175.57422 -56.73828 c 173.42578 -63.26953 166.54883 -75.58105 145.98145 -93.5791 c h f 66.59131 -91.49023 m 64.96582 -89.86621 61.02002 -86.15039 56.37695 -88.00879 c 51.73438 -89.86621 52.43018 -89.16797 55.68115 -92.88281 c 58.93066 -96.59766 62.64453 -94.50781 63.57275 -93.81152 c 64.50195 -93.11621 68.2168 -93.11621 66.59131 -91.49023 c h 145.98145 -93.5791 m 124.3877 -112.47607 113.82813 -115.354 109.72656 -115.14746 c 107.25 -112.95947 106.53516 -114.98682 109.72656 -115.14746 c 109.81641 -115.22656 109.90625 -115.31104 110.00195 -115.40039 c 116.03711 -121.20361 116.26855 -127.23975 117.19727 -132.11377 c 118.12695 -136.98926 116.26855 -143.72119 114.64355 -144.64941 c 113.01758 -145.57813 111.85742 -146.2749 110.46484 -145.11377 c 109.07227 -143.95361 109.53711 -135.82861 105.59033 -134.20361 c 101.64355 -132.57959 96.53711 -123.06104 89.34082 -120.73926 c 82.14453 -118.41797 81.6792 -116.79297 81.91211 -119.81055 c 82.14453 -122.82813 83.07275 -123.75684 79.35791 -129.09766 c 75.64453 -134.43506 76.57324 -132.57959 74.94824 -132.34619 c 73.32275 -132.11377 71.2334 -117.49023 71.46582 -115.40039 c 71.69873 -113.31152 38.50244 -114.70361 36.41357 -116.3291 c 34.32422 -117.95361 41.75293 -104.25781 38.03809 -102.40039 c 34.32422 -100.54297 39.89551 -103.09668 35.7168 -100.54297 c 31.53857 -97.99121 39.89551 -94.74023 38.50244 -91.49023 c 37.10938 -88.24023 28.98486 -72.45605 28.28809 -72.45605 c 27.5918 -72.45605 18.53857 -52.72461 18.07471 -50.63477 c 17.61035 -48.54492 19.4668 -46.22266 19.4668 -42.97363 c 19.4668 -39.72168 19.23486 -36.70605 20.16406 -34.84863 c 21.09229 -32.99316 23.18164 -34.38477 23.18164 -34.38477 c 23.18164 -34.38477 23.41357 -33.9209 23.41357 -33.9209 c 23.41357 -33.9209 37.57373 -33.22461 25.50244 -32.99316 c 13.43115 -32.75879 36.87793 -29.97266 41.52002 -34.38477 c 46.1626 -38.79395 44.07324 -32.0625 54.28809 -34.15234 c 64.50195 -36.24219 47.09131 -30.20508 88.41211 -60.15137 c 129.73242 -90.09863 90.26953 -52.72461 101.64355 -17.20703 c 113.01758 18.31055 94.67969 -8.38379 122.76855 -45.29297 c 147.11426 -77.28516 170.76074 -65.33203 175.57422 -56.73828 c 173.42578 -63.26953 166.54883 -75.58105 145.98145 -93.5791 c h f 66.59131 -91.49023 m 64.96582 -89.86621 61.02002 -86.15039 56.37695 -88.00879 c 51.73438 -89.86621 52.43018 -89.16797 55.68115 -92.88281 c 58.93066 -96.59766 62.64453 -94.50781 63.57275 -93.81152 c 64.50195 -93.11621 68.2168 -93.11621 66.59131 -91.49023 c h 145.98145 -93.5791 m 124.3877 -112.47607 113.82813 -115.354 109.72656 -115.14746 c 107.25 -112.95947 106.53516 -114.98682 109.72656 -115.14746 c 109.81641 -115.22656 109.90625 -115.31104 110.00195 -115.40039 c 116.03711 -121.20361 116.26855 -127.23975 117.19727 -132.11377 c 118.12695 -136.98926 116.26855 -143.72119 114.64355 -144.64941 c 113.01758 -145.57813 111.85742 -146.2749 110.46484 -145.11377 c 109.07227 -143.95361 109.53711 -135.82861 105.59033 -134.20361 c 101.64355 -132.57959 96.53711 -123.06104 89.34082 -120.73926 c 82.14453 -118.41797 81.6792 -116.79297 81.91211 -119.81055 c 82.14453 -122.82813 83.07275 -123.75684 79.35791 -129.09766 c 75.64453 -134.43506 76.57324 -132.57959 74.94824 -132.34619 c 73.32275 -132.11377 71.2334 -117.49023 71.46582 -115.40039 c 71.69873 -113.31152 38.50244 -114.70361 36.41357 -116.3291 c 34.32422 -117.95361 41.75293 -104.25781 38.03809 -102.40039 c 34.32422 -100.54297 39.89551 -103.09668 35.7168 -100.54297 c 31.53857 -97.99121 39.89551 -94.74023 38.50244 -91.49023 c 37.10938 -88.24023 28.98486 -72.45605 28.28809 -72.45605 c 27.5918 -72.45605 18.53857 -52.72461 18.07471 -50.63477 c 17.61035 -48.54492 19.4668 -46.22266 19.4668 -42.97363 c 19.4668 -39.72168 19.23486 -36.70605 20.16406 -34.84863 c 21.09229 -32.99316 23.18164 -34.38477 23.18164 -34.38477 c 23.18164 -34.38477 23.41357 -33.9209 23.41357 -33.9209 c 23.41357 -33.9209 37.57373 -33.22461 25.50244 -32.99316 c 13.43115 -32.75879 36.87793 -29.97266 41.52002 -34.38477 c 46.1626 -38.79395 44.07324 -32.0625 54.28809 -34.15234 c 64.50195 -36.24219 47.09131 -30.20508 88.41211 -60.15137 c 129.73242 -90.09863 90.26953 -52.72461 101.64355 -17.20703 c 113.01758 18.31055 94.67969 -8.38379 122.76855 -45.29297 c 147.11426 -77.28516 170.76074 -65.33203 175.57422 -56.73828 c 173.42578 -63.26953 166.54883 -75.58105 145.98145 -93.5791 c h S 196.70313 -163.91699 m 182.1748 -199.03125 140.87012 -218.39355 107.91357 -211.46973 c 63.04688 -202.04297 35.12695 -159.54883 45.11816 -114.5874 c 51.96143 -110.54395 64.71875 -108.27539 72.52344 -109.51123 c 76.92529 -110.20801 73.47949 -113.81055 73.05176 -116.55811 c 71.73535 -125.00439 73.95361 -134.27393 75.86621 -142.45313 c 79.95117 -159.92432 85.72998 -170.91064 102.35303 -179.1875 c 118.72754 -187.34131 137.46875 -189.42969 153.90723 -180.47119 c 181.68652 -165.33203 198.34961 -118.62598 174.06445 -93.18457 c 155.18359 -73.40234 124.66309 -63.47461 99.10938 -55.81055 c 126.10352 -62.57422 179.16602 -72.13477 206.48535 -77.47656 c 205.5498 -77.30664 170.875 -72.42871 170.93164 -73.96484 c 171.01563 -76.13477 184.25977 -84.7998 186.29883 -87.5166 c 194.0752 -97.87793 198.00879 -104.87598 200.4082 -117.51855 c 202.24707 -127.19922 201.95703 -132.20117 201.83887 -137.53809 c 201.6123 -147.77393 199.51563 -154.43164 196.70313 -163.91699 c f 196.70313 -163.91699 m 182.1748 -199.03125 140.87012 -218.39355 107.91357 -211.46973 c 63.04688 -202.04297 35.12695 -159.54883 45.11816 -114.5874 c 51.96143 -110.54395 64.71875 -108.27539 72.52344 -109.51123 c 76.92529 -110.20801 73.47949 -113.81055 73.05176 -116.55811 c 71.73535 -125.00439 73.95361 -134.27393 75.86621 -142.45313 c 79.95117 -159.92432 85.72998 -170.91064 102.35303 -179.1875 c 118.72754 -187.34131 137.46875 -189.42969 153.90723 -180.47119 c 181.68652 -165.33203 198.34961 -118.62598 174.06445 -93.18457 c 155.18359 -73.40234 124.66309 -63.47461 99.10938 -55.81055 c 126.10352 -62.57422 179.16602 -72.13477 206.48535 -77.47656 c 205.5498 -77.30664 170.875 -72.42871 170.93164 -73.96484 c 171.01563 -76.13477 184.25977 -84.7998 186.29883 -87.5166 c 194.0752 -97.87793 198.00879 -104.87598 200.4082 -117.51855 c 202.24707 -127.19922 201.95703 -132.20117 201.83887 -137.53809 c 201.6123 -147.77393 199.51563 -154.43164 196.70313 -163.91699 c f 196.70313 -163.91699 m 182.1748 -199.03125 140.87012 -218.39355 107.91357 -211.46973 c 63.04688 -202.04297 35.12695 -159.54883 45.11816 -114.5874 c 51.96143 -110.54395 64.71875 -108.27539 72.52344 -109.51123 c 76.92529 -110.20801 73.47949 -113.81055 73.05176 -116.55811 c 71.73535 -125.00439 73.95361 -134.27393 75.86621 -142.45313 c 79.95117 -159.92432 85.72998 -170.91064 102.35303 -179.1875 c 118.72754 -187.34131 137.46875 -189.42969 153.90723 -180.47119 c 181.68652 -165.33203 198.34961 -118.62598 174.06445 -93.18457 c 155.18359 -73.40234 124.66309 -63.47461 99.10938 -55.81055 c 126.10352 -62.57422 179.16602 -72.13477 206.48535 -77.47656 c 205.5498 -77.30664 170.875 -72.42871 170.93164 -73.96484 c 171.01563 -76.13477 184.25977 -84.7998 186.29883 -87.5166 c 194.0752 -97.87793 198.00879 -104.87598 200.4082 -117.51855 c 202.24707 -127.19922 201.95703 -132.20117 201.83887 -137.53809 c 201.6123 -147.77393 199.51563 -154.43164 196.70313 -163.91699 c S EMC endstream endobj 10 0 obj<>stream + + + + + +JPEG228256/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADkAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYqk3mPzj5W8tWn1vXtVtdNgNeDXEqRl+JoQgYguR4LU4q8b81f85k/lzpjPFodrd67Mp+GRE+r W7D/AIyTUlBr/wAVHFXnM/8Azlt+bPmS9/R3lHy5biaWpSCKK4v7oD/JMZiWg/4x4qh9V8+/nvU/ 4y8/ab5Ti2LWDC2lvFH/ADC2ENxcKaj/AHaVxVJX/OOzsCRJ57846/MDU/VHh0i2Pshka9elf+Kl +jFUdYf85ZarpQU6dos1xKop62sapc6ixPiQVhQf7BVxVGj/AJzZ8/D/AKUWlfdc/wDVXFUbYf8A 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 + + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj xref 0 11 0000000004 65535 f +0000000016 00000 n +0000000076 00000 n +0000000126 00000 n +0000000000 00001 f +0000000270 00000 n +0000000290 00000 n +0000000649 00000 n +0000000760 00000 n +0000000781 00000 n +0000015751 00000 n +trailer <<3096410896ab11d891f8000a956e58ec>]>> startxref 35522 %%EOF \ No newline at end of file diff --git a/doc/reference/lifecycle.pdf b/doc/reference/lifecycle.pdf index 940e482..b704b39 100644 Binary files a/doc/reference/lifecycle.pdf and b/doc/reference/lifecycle.pdf differ diff --git a/doc/reference/reference.xml b/doc/reference/reference.xml index 28f8a34..37148d6 100644 --- a/doc/reference/reference.xml +++ b/doc/reference/reference.xml @@ -1,34 +1,120 @@ - +
- ** - If you are reading the html version of this document and are - thinking of printing it out, you might be interested in the nicely - typeset produced - with LaTeX. - ** + + ** If you are reading the html version of this document and are ** + ** thinking of printing it out, you might be interested in the nicely ** + ** typeset produced ** + ** with LaTeX. ** + + Ibex is a software platform based on the philosophy that the most + useful systems consist of both **statically typed** and + **dynamically typed** languages, working in concert. + + + + - Statically typed languages (such as Java) are well suited for + high-performance, reliable, reusable code. Unfortunately + programs written in statically typed languages often take + longer to develop, and their commitment to a specific type + system makes interoperating with other languages cumbersome. - This document is a __reference__. It is not a - __specification__ or a - __tutorial__. + - Dynamically typed languages (such as JavaScript) typically + perform poorly (due to runtime checks and inadequate static + information for optimization), tend to admit more errors (due + to less static checking), and export APIs which are not + precisely defined (due to the huge number of possible + type/method combinations). However, writing programs in + dynamically typed languages is a much more rapid process, and + the implicit coercions in such languages make interoperability + between similar languages very easy. + + - This document does not guide the user gently through examples (as a - tutorial would), and it doesn't provide enough detail and formality - for a third party to construct a compatible re-implementation of the - Ibex Core (as a specification would). + The architectural incarnation of this philosophy is the Ibex Object + Model, a universal interface to dynamically typed languages. The + IOM serves as a common interface between statically typed languages + and dynamically typed languages both locally and over the network. + +
+ + The Ibex Object Model consists of three primitive types: - Rather, the goal of this document is to completely describe every - aspect of the environment that the Ibex Core provides to client - applications, from the bottom up. If you want to be an Ibex expert, - this is the right document to read. It is assumed that you are already - familiar with XML and with either JavaScript or ECMAscript. + + - __number__ -- a floating point number + - __string__ -- a unicode string + - __boolean__ -- either [[true]] or [[false]] + + + From these primitives, more complex structures can be built from + two aggregate types: - If you need to use or rely on some behavior you notice in the Ibex - Core, but which is not clearly defined here, please post to . + + - __array__ -- a collection of objects indexed by a non-negative integer + - __hash__ -- a collection of objects indexed by objects (often strings) + + + Any of the following actions can be performed on an object: + + + - __get(key)__ -- attempts to retrieve the object indexed by + [[key]]. Returns an object. + - __put(key, val)__ -- attempts to add object [[val]] with key + [[key]] to an object. Does not return a value. + + - __call(args)__ -- attempts to call the object as if it were a + function. The [[args]] value is a list of arguments. May or + may not return a value. + + + The keys of some objects may be enumerated by attempting to "call" + the object; the return value will be an array of the object's keys. + + Finally, an object may be **coerced** to any of the three + primitive types, although this coercion may fail. Objects may + also be coerced to the **bytestream** type, which represents an + unbounded stream of octets. Dynamically typed code may not + explicitly manipulate bytestreams, although it can pass objects + to statically typed code which in turn coerces those objects to + bytestreams. + + Any of the above operations may **throw** an exception, which is + itself an object. + + Any entity in the statically typed world which supports these + operations may expose itself to the dynamically typed world. + Furthermore, it can expect that any values passed to it will support + all of the operations shown above. +
+ +
+ - relation to XML + - cover templates here with David's isomorphism? +
+ +
+ + The remainder of this document describes the three major + systems founded on the Ibex Object Model: + + + - The Ibex User Interface + - The Ibex Persistent Storage Service + - The Ibex Mail Server + - IbexDoc + + + Currently, all four of these systems use Java as the statically + typed language and IbexScript (a derivitave of JavaScript) as + the dynamically typed language. However, since they interact + strictly via the Ibex Object Model, either component can be + rewritten in a different language. + +
+
@@ -80,32 +166,34 @@
+
+
A user typically begins an Ibex session by clicking on a link to - an Ibex application. This link serves the {\tt launch.html} file - to the user's browser, which in turn downloads the appropriate - {\it Wildebeest} -- currently either an ActiveX Control + an Ibex application. This link serves the [[launch.html]] file + to the user's browser (1), which in turn downloads the appropriate + **Wildebeest** (2)-- currently either an ActiveX Control (Win32/MSIE), XPInstaller (Mozilla), or Signed Applet (all others). The Wildebeest downloads the appropriate core for the user's - machine and verifies its digital signature. It then launches the - core, which downloads the UI (an [[.ibex]] archive), loads it, - applies the [[main.t]] template (found in the archive), and - renders it onto the screen, running any associated JavaScript - code. + machine and verifies its digital signature (3). It then launches + the core, which downloads the UI (4), (an [[.ibex]] archive), + loads it, applies the [[main.t]] template (found in the archive), + and renders it onto the screen, running any associated JavaScript + code (5). The user interacts with the application by clicking and moving the - mouse, and by pressing keys on the keyboard. These actions trigger - fragments of JavaScript code which are designated to handle events. - This JavaScript code can then relay important information back to the - server using XML-RPC or SOAP, or it can modify the structure and - properties of the user interface to change its appearance, thereby - giving feedback to the user. + mouse, and by pressing keys on the keyboard (5). These actions + trigger fragments of JavaScript code which are designated to + handle events. This JavaScript code can then relay important + information back to the server using XML-RPC or SOAP (5), or it + can modify the structure and properties of the user interface to + change its appearance, thereby giving feedback to the user. The Ibex core quits when the last remaining surface has been destroyed. @@ -164,16 +252,15 @@ of Ibex.
-
A template (discussed in the next section) is an XML file which acts as a blueprint for constructing a tree of boxes. We call this - construction process **applying**, since unlike - **instantiation** in object-oriented programming systems, you - always apply a template to a pre-existing box, and you can apply - multiple templates to the same box. + construction process **applying**, since unlike **instantiation** in + object-oriented programming systems, you always apply a template to + a pre-existing box, and you can apply multiple templates to the same + box. Each XML tag corresponds to a single box, or to another template which will be applied to that box. For example, a [[scrollbar]] @@ -399,63 +486,317 @@
-
- - Each box occupies a rectangular region on the surface. The visual - appearance of a surface is created by rendering each box in its tree. - Unless the [[clip]] attribute is [[false]], each box will - clip its childrens' visual representations to its own, so that the - children appear "confined to" the parent. Children are rendered after - their parents so they appear "on top of" their parents. - - Each box has two major visual components, each with subcomponents: +
+ + FIXME: needs way, way, way more diagrams of nonrectangular boxes. + + Each box occupies a region on the surface. The visual + appearance of a surface is created by rendering each box in its + tree. Unless the [[clip]] attribute is [[false]], each box will + clip its childrens' visual representations to its own, so that + the children appear "confined to" the parent. Children are + rendered after their parents so they appear "on top of" their + parents. - FIXME: diagram + + + Until now we've tactily assumed that boxes are rectangular. In + fact, unlike its predecessor (XWT), Ibex boxes can be **any + shape at all**. We refer to the outline of a box as its path, + which may be composed of lines and curves (arcs and splines). + If the path is not set (or set to [[null]]), the box's path is + **implicitly** a rectangle. + + A key step in understanding how Ibex works, and understanding + how operations on rectangular boxes generalize to arbitrary + boxes is to realize that "the path **is** the box". Just as a + rectangular box clips its children to the inside of the + rectangle, a circular box will clip its children to the inside + of the circle. + + In fact, Ibex's integration of vector graphics with + constraint-based user interface layout runs quite deep -- boxes + which "contain" text are actually boxes whose outline path + **is** the actual letters of the text. This means that you can + assign children to a text-shaped box, and the children's + appearance will be cliped to the **inside** of the text letters. + + The only time rectangular and non-rectangular boxes act + differently is when box packing takes place; when packing boxes, + Ibex only looks at the **bounding box** of a path (the smallest + rectangle that completely encloses the box's path). In the case + of rectangular boxes (which have not been rotated or sheared), + this bounding box happens to be exactly the same as the box's + path. So Ibex is actually treating these boxes the same, but + the chosen treatment favors rectangular boxes. + +
+ + The appearance of a box consists of three visual elements: its + path, stroke, and fill. - - - A box's [[path]] consists of zero or more lines and curves. - The path may be filled with a color, gradient, or texture, and - may be stroked with a line of a given thickness and color. If - the path is not specified, it defaults to the perimiter of the - box. [**Note: Vector Graphics support (including the ability - to set the [[path]] property to anything other than the - default) is currently not implemented**]. - - A path also has: - - - an associated [[strokecolor]], which is a color - - an associated [[strokewidth]], which is a number - specifying the width of the stroke. [**Note: Vector - Graphics support (including the [[strokewidth]] - property) is currently not implemented**] - - a [[fill]], which is either a color, gradient, or - texture - - - - - - Each box also has a single line of [[text]], whose - appearance is determined by its: - - - associated [[font]], which can be any font supported by - the - library. - - an associated [[fontsize]] in **pixels** - - an associated [[textcolor]] - - + + A box's [[path]] consists of zero or more contours, each of + which consists of one or more lines, bezier curves (cubic or + quadradic), or generalized elliptic arcs. The grammar and + feature set supported are identical to that specified in . + + One of the most common sources of frustration when working with + text representations of vector paths, or programs that manipulate + them, is making a mistake when setting a transform which causes + the entire path to be off the screen. Since no part of the path + is visible, you have no idea which direction it went! To minimize + the chance of this happening, and generally make dealing with + vectors a more enjoyable experience, Ibex always **recenters** a + path. When you set a box's path (either by writing to its + [[path]] or [[text]] properties), Ibex translates the entire path + so that it is lined up with the X and Y axes, as close to the + origin as possible, in the positive-X, positive-Y quadrant. Ibex + will note this translation by setting the box's [[transform]] to + the transformation used to do this. If you do not desire this + behavior, just set the [[transform]] back to the identity + transform. + + + + The color with which to stroke the path. Ibex paths may + only be stroked with a single color, solid line (not + dashed), of "hairline width" (meaning that the line is never more than one + antialiased pixel wide no matter what magnification it is + viewed at). + + This property can be set to a 5-character hex string + ([[#RGB]]), 7-character hex string ([[#RRGGBB]]), + 9-character hex string ([[#AARRGGBB]]), specifying the box's + hexadecimal color. Any other string is compared against the + colors (the same set of color names supported + by SVG). If this property is set to [[null]], the stroke + color will be set to clear ([[#00000000]]). + + Other vector formats (notably SVG and PDF) support "thick" + lines, dashed lines, lines stroked with a gradient or + texture, and an assortment of special caps and joins for + these thick lines (hairline lines do not need joins or + caps). Fortunately, all of these constructs can be + converted into **filled** paths rather easily, making it + possible for Ibex to support the same functionality with a + much simpler API (and more efficient rendering engine). + + + + The graphic element with which to fill the path. This + property can be set to any of the values specified for + [[stroke]], as well as to a texture (an image) or a + gradient. Paths which self-intersect are filled according + to the SVG guidelines. + + When an image (texture) is written to this property, the + box's [[minwidth]] and [[minheight]] properties will be + automatically set to the dimensions of the image (they can + be changed later if desired). + +
+ +
+ + Ibex treats text exactly the same way it treats other paths. + Writing to the [[text]] property actually sets the box's path to + the outline of the rendered form of the text, and text is + subject to the same rotation, shearing, and scaling + transformations as all other boxes. You can even **read back** + the curves from which the text is composed by reading from the + [[path]] property (the string returned will be in SVG Path + syntax), modify it, and write it to the [[path]] property of + another box. + + + The box's text; writing [[null]] to this property sets it to + [[""]]. In order to help eliminate common chores when working + with text, Ibex will automatically take the following actions + when you write to the [[text]] property: + + + + The text is converted to curves using the Freetype library, + and the resulting curve becomes the box's path. + + If the box's [[strokecolor]] is [[null]], it is set to black + ([[#FF000000]]). When first created, a box has an invisible + stroke; automatically setting the stroke to a visible color + helps eliminate confusing errors. You can change the stroke + color back to clear after writing to the [[text]] property. + + The box's [[aspect]] property is automatically set to the + correct aspect ratio for the chosen string in the chosen + font. This ensures that resizing will not warp the text. + + + + Fonts are rendered using the [[stroke]] assigned to the box, + using the font assigned to the [[font]] property. When an + object is written to this property, it is coerced to a stream which is interpreted using + the , and the resulting font is used to render the box's + [[text]]. + + To choose the size of a font, just set the box's [[height]] + property to the desired height **in pixels**. Conversion + functions from points to pixels are available. + +
+ +
+ The [[transform]] property allows the user to specify an + arbitrary affine transformation to be applied to the box's path, + text, and children. The syntax and features supported are + identical to those described in , and include rotation, shearing, scaling, and + translation. + + + FIXME + + + One tricky part about transformations is their interaction with + box packing and dimension properties. A box's size properties + (such as [[minwidth]] or [[height]]) are **always** measured in + the box's own coordinate space (ie after applying the box's + [[transform]]). This means that the sum of the [[width]]s of a + box's children may not be equal to the parent box's [[width]], + even if the children appear (on screen) to completely fill its + width. + + One other consequence of combining transformations with + constraint-based layout is that when a box is rotated, its width + and height are no longer completely independent (remember, the + box's width is measured in the rotated coordinate space). If a + box is turned at a 45 degree angle and then forced into a space + 10 pixels wide, enlarging the box's width will force a reduction + in its height (in order to cram it in the 10 pixel space). In + situations like this, Ibex will first look to the box's + [[aspect]], if explicitly set, and obey that. If the box's + [[aspect]] is unspecified, Ibex will use the ratio between the + box's [[minwidth]] and [[minheight]] to guide the tradeoff. If + either of these properties is [[0]], Ibex will simply attempt to + make the ratio as close to [[1:1]] as possible. + + When we talk about a box's **bounding box**, we are referring to + the smallest rectangle in the **parent's** coordinate space + which completely encloses the child box's path. This is the + only time we will deal with the size of a child using a + coordinate space other than its own. +
+ +
+ + We will cover the layout algorithm in detail in the next section, + but we introduce the properties at play here and give an intuition + about their purpose. + + + The layout strategy for this box. If set to [[true]], the + box occupies no cells and is laid out independently of its + siblings. + + + + This property controls the strategy Ibex uses for changing the + box's width and height in response to layout constraints. + + If [[zoom]] is set to [[false]] (the default), then the box's + [[path]] will be altered by multiplying all the vertices by a + scaling factor in order to make the path's bounding box meet + the required constraints. The box's [[transform]] will not be + affected, and the scaling of the box's children will not be + affected. + + If [[zoom]] is set to [[true]], the box's [[path]] will not be + altered in response to layout constraints; rather, its + [[transform]] will be altered in order to "zoom in" or "zoom + out" and bring all of the path's vertices within the desired + region. Since the box's [[transform]] also applies to its + descendants, they too will be magnified or reduced. + + + + If set to [[true]], this box will shrink + (horizontally/vertically/both) to the smallest size allowed by + its children and the bounding box of its path. + + + + If the box is a root box, writing to these properties moves + the surface; reading from them returns the position of the + surface. + + On non-root boxes, writing to these properties is a shorthand + for adding a [["translate(x, y)"]] to the box's [[transform]]. + Reading from these properties will return FIXME. + + + + The desired minimum width and height. See the [[zoom]] + property for a description of how the box is altered to meet + these constraints. + + + + The desired maximum width and height. See the [[zoom]] + property for a description of how the box is altered to meet + these constraints. + + + + When read, this is the current (width/height) of this box. + Writing to this property is equivalent to writing to + **both** the minimum and maximum (width/height). + + + + The number of (columns/rows) in which to lay out the children of this + box. If set to zero, the number of (columns/rows) is unconstrained. + Either [[rows]] or [[cols]] must be zero. If + [[0]] is written to [[cols]] when [[rows]] is + [[0]], the write is ignored. If a nonzero value is + written to [[cols]] when [[rows]] is nonzero, + [[rows]] is set to [[0]], and vice versa. + + + + The number of (columns/rows) that this box spans within its parent. + + + + The width-to-height ratio constraint for this box; can be set + either as a floating point number ([[0.5]]) or a ratio + ([["1:2"]]). Setting this to [[0.0]] disables the ratio + constraint. + + Note packed boxes always **shrink** in order to satisfy aspect + constraints, while unpacked boxes always **grow** in order to + satisfy them -- even if this means growing larger than the box's + parent. + + + + If set to [[false]], this box will be rendered as if its + width and height were zero. If this is a root box, the + associated surface will be hidden. + + When reading from this property, the value [[false]] will + be returned if this box **or any of its ancestors** is not + visible. Thus it is possible to write [[true]] to a box's + [[visible]] property and then read back [[false]]. + +
+ +
- These eight components plus the size of a box fully specify its - appearance. Every single box you see in Ibex is drawn only on the - basis of these components and its size. +
The size and position of every box is determined by its properties, its childrens' sizes, and its parent's size and @@ -475,38 +816,6 @@ not the same thing as the property [[minwidth]], although they are closely related. - - - When the user resizes a window, Ibex changes the root box's - [[maxwidth]] and [[maxheight]] to match the size chosen by - the user and then determines the root box's size using the same sizing - rules it uses for other boxes. - - Ibex will always attempt to prevent the - user from making the surface smaller than the root box's - [[minwidth]] and [[minheight]]. If the [[hshrink]] or - [[vshrink]] flag is set, Ibex will try to prevent the user from - resizing the surface at all. However, not all platforms give Ibex - enough control to do this. - - - - When talking about positioning, we will often refer to the - **alignment point**. - - If the [[align]] property is "[[center]]", then the - alignment point is the center of the box. - - If the [[align]] property is "[[topleft]]", - "[[bottomleft]]", "[[topright]]", or - "[[bottomright]]", then the alignment point is - corresponding corner of the box. - - If the [[align]] property is "[[top]]", - "[[bottom]]", "[[right]]", or "[[left]]", then - the alignment point is middle of the corresponding edge of the - box. -
A grid of **cells** is created within the parent. If the @@ -514,22 +823,47 @@ infinite number of columns. Either [[cols]] or [[rows]] must be zero, but not both. - If a child's [[visible]] property is [[false]], it does - not occupy any cells (and is not rendered). Otherwise, each child - occupies a rectangular set of cells [[child.colspan]] cells - wide and [[child.rowspan]] cells high. + + + A box's target region is the portion of its parent which the + layout algorithm has determined that the box should occupy. A + box's target region is determined mainly by the value of its + [[pinned]] property: + + + If a box's [[pinned]] property is [[null]], it is said to be + "unpinned" or "not pinned". In this case, the box's target + region will be the set of cells in its parent which it + occupies. + + If a box's [[pinned]] region is set to some other box, then + this box's target region will be the projection of that + other box's actual dimensions and position, projected onto + this box's parent. The net effect is that the pinned box + will "track" the size and position of the box it is pinned + to. A box may not be pinned to one of its descendants, nor + may boxes be pinned in a cycle (A is pinned to B, B is + pinned to C, and C is pinned to A). + + + If a child's [[visible]] property is [[false]], it does not + occupy any cells (and is not rendered). If a box's [[pinned]] + property (described below) is non-[[null]], it does not occupy + any cells and is exempt from the packing process. Otherwise, + each child occupies a rectangular set of cells [[child.colspan]] + cells wide and [[child.rowspan]] cells high. The Core iterates over the cells in the grid in the following order: if [[rows]] is 0, the Core iterates across each column before proceeding to the next row; otherwise rows come before columns. At each cell, the Core attempts to place the **first - remaining unplaced child's** top-left corner in that cell - (with the child occupying some set of cells extending down and - to the right of that cell). If the parent has a fixed number of - columns and the child's [[colspan]] exceeds that limit, the - child is placed in column zero regardless, but only occupies the - available set of cells (it does not "hang off the end" of the - box). + remaining unplaced, packed child's** top-left corner in that + cell (with the child occupying some set of cells extending down + and to the right of that cell). If the parent has a fixed + number of columns and the child's [[colspan]] exceeds that + limit, the child is placed in column zero regardless, but only + occupies the available set of cells (it does not "hang off the + end" of the box).
       
@@ -544,51 +878,99 @@
       
- Each box's minimum width is computed recursively as the maximum of: Its [[minwidth]] - The width of the box's [[text]] (after applying the - box's [[transform]]) [**Note: Vector Graphics support - (including the [[transform]] property) is currently not - implemented**]. + The width of its [[path]] - The width of the box's path (after applying the box's - [[transform]]) **if the box is [[packed]]**. - - The minimum width of the children in each row. + The sum of the widths of the bounding boxes enclosing its + children, when those children are sized to **their own** + minimum widths. + + The box's minimum **height** multiplied by its [[aspect]], + if its aspect is not [[0]] (unspecified). - + If a box's [[hshrink]] property is set to [[true]], the box's maximum width is the same as its minimum width; otherwise it is the box's [[maxwidth]]. -
- - - Each non-packed box is transformed according to the parent's - [[transform]] property and then positioned so that its alignment - point is [[(child.x, child.y)]] pixels from the corresponding - edge/corner/center of its parent. + + + Once the box's size and the size and position of its target + region have been computed, the box is placed relative to its + **target origin**, which is determined by by the [[origin]] + property: + + + Determines which corner of the box's target region should be + treated as the origin for layout purposes. + + If the [[origin]] property is "[[center]]", then the + target origin is at the center of the target region. + + If the [[origin]] property is "[[topleft]]", + "[[bottomleft]]", "[[topright]]", or "[[bottomright]]", then + the target origin is at the corresponding corner of the + target region. + + If the [[origin]] property is "[[top]]", "[[bottom]]", + "[[right]]", or "[[left]]", then the target origin is middle + of the corresponding edge of the target region. + + + + Determines the offset from the box's origin at which it will + be placed. + + + If the box's [[hshrink]] property is not set, it is expanded to + its maximum width, but no larger than its parent's width. + + Finally, if the child has a nonzero [[aspect]], one of its + dimensions (either width or height) will **grow** in order to + ensure that [[width == height * aspect]]. This may cause the + child to exceed the paren't size. + + + + First, the coordinate space in which the child is positioned is + translated so that the origin coincides with the + corner/edge/center of the box's parent corresponding to the + child's [[align]] property. The child's [[transform]] attribute + is applied to the coordinate space, and the child is positioned + in this transformed space with its aligment point at the origin. + + The following diagram may be helpful: + + FIXME: diagram + Thoughout this section, when we refer to the [[minwidth]], + [[maxwidth]], or minimum width of a child box, we are referring + to the corresponding dimension of the child's **bounding box** + -- the smallest rectangle **in the parent's coordinate space** + that completely encloses the child's path. + Ibex formulates a set of constraints for placing a box's **packed** children as follows: - - A box's width can be no greater than the sum of the + A box's width can be no greater than the sum of the columns it occupies - - The sum of a set of colums cannot be smaller than the + + The sum of a set of colums cannot be smaller than the minimum width of a box that spans them. - - The sum of the widths of the parents' columns will be at + + The sum of the widths of the parents' columns will be at least as large as the parent's width is (but possibly larger). @@ -598,59 +980,39 @@ prioritized from most important to least important: - - (__Most Important__) The sum of all columns will be a close + (__Most Important__) The sum of all columns will be a close to the parent's with as possible (ie as small as possible) - - Ibex will attempt to make a set of columns no wider than + + Ibex will attempt to make a set of columns no wider than the [[maxwidth]] of a box spanning them. - - (__Least Important__) Ibex will attempt to make all - columns the same width. + + Ibex will attempt to make all + columns the same width. (**least important**) Each packed box is then placed within the set of cells that it spans. Usually the box will exactly fill this rectangle; if it - does not (due to [[maxwidth]] or minimum width constraints), the - box's will be placed so that its alignment point coincides with - the alignment point of that rectangle of cells. + does not (due to [[maxwidth]], minimum width, or aspect + constraints), the box's will be placed so that its alignment + point coincides with the alignment point of that rectangle of + cells. + + + When the user resizes a window, Ibex changes the root box's + [[maxwidth]] and [[maxheight]] to match the size chosen by + the user and then determines the root box's size using the same sizing + rules it uses for other boxes. + + Ibex will always attempt to prevent the + user from making the surface smaller than the root box's + [[minwidth]] and [[minheight]]. If the [[hshrink]] or + [[vshrink]] flag is set, Ibex will try to prevent the user from + resizing the surface at all. However, not all platforms give Ibex + enough control to do this. +
-
- - Boxes are rendered in a depth-first, pre-order traversal. Note that - this may cause a non-packed box to overlap its siblings. - - - - If the box's [[transform]] property is non-null, the - coordinate space is transformed accordingly for the rest of - this phase and for the rendering of all children. [**Note: - Vector Graphics support (including the [[transform]] - property) is currently not implemented**]. - - If the box is packed and has a non-[[null]] path, the - path is translated such that the alignment point of the path's - bounding box coincides with the box's alignment point (both - alignment points are determined by the box's [[align]] - property). - - If a box has a path, that path is filled with the color, - gradient, or image specified by the [[fill]] property and - stroked with the color and width specified by the - [[strokecolor]] and [[strokewidth]] properties. - - If the box has a non-null [[text]] attribute, - the text is rendered in [[font]] with size - [[fontsize]] and color [[textcolor]]. The text is - then translated such that the alignment point of the text's - bounding box coincides with the box's alignment point (both - alignment points are determined by the box's [[align]] - property). - - The box's children are rendered (pre-order traversal). - - - -
@@ -661,139 +1023,6 @@ meaning, which will be explained later. Each box's numeric properties hold its **child boxes**. -
- - Every box has several special properties which control how it is - drawn. In general, if you put an - invalid value to a special property, no action will be taken -- the - put will be ignored. - - - - If the value is a 5-character hex string ([[#RGB]]), - 7-character hex string ([[#RRGGBB]]), 9-character hex - string ([[#AARRGGBB]]), the box's stroke color will be set - to that color. - - If the value is one of the colors (the same set of color names - supported by SVG), the stroke color be set to that color. - - If the value is [[null]], the stroke color will be set - to clear ([[#00000000]]). - - - - The width (in pixels) to stroke the path with. - - - - This property can be set to any of the values specified for - [[strokecolor]]. - Alternatively, if the value written is an object, its stream - will be read and interpreted as a PNG, GIF, or JPEG image, - which will become the texture for this box, and the box's - [[minwidth]] and [[minheight]] properties will be - automatically set to the dimensions of the image. - - - - The box's path. The grammar and feature set supported are - identical to that specified in . - - - - The box's text; writing [[null]] to this property sets it - to [[""]]. - - - - The color in which to render the font; accepts the same values as [[strokecolor]]. - - - - When an object is written to this property, its stream is read - using the , - and the resulting font is used to render the - box's [[text]]. - - - - The size (in points) to render the text. - - -
- -
- - - If set to [[true]], this box will shrink - (horizontally/vertically/both) to the smallest size allowed by - its children and the bounding box of its path. - - - - If the box is a root box, this is the (x/y)-coordinate of the - surface; otherwise it is the distance between the parent's - alignment point and the corresponding corner/edge/center of - its parent. - - - - The desired minimum width and height. - - - - The desired maximum width and height. - - - - When read, this is the current (width/height) of this box. - Writing to this property is equivalent to writing to - **both** the minimum and maximum (width/height). - - - - The number of (columns/rows) in which to lay out the children of this - box. If set to zero, the number of (columns/rows) is unconstrained. - Either [[rows]] or [[cols]] must be zero. If - [[0]] is written to [[cols]] when [[rows]] is - [[0]], the write is ignored. If a nonzero value is - written to [[cols]] when [[rows]] is nonzero, - [[rows]] is set to [[0]], and vice versa. - - - - The number of (columns/rows) that this box spans within its parent. - - - - Determines the box's alignment point for positioning its text, - texture, path, and children. - - - - If set to [[false]], this box will be rendered as if its - width and height were zero. If this is a root box, the - associated surface will be hidden. - - When reading from this property, the value [[false]] will - be returned if this box **or any of its ancestors** is not - visible. Thus it is possible to write [[true]] to a box's - [[visible]] property and then read back [[false]]. - - - - The layout strategy for this box. If set to [[true]], the - box occupies no cells and is laid out independently of its - siblings. - - -
-
@@ -842,7 +1071,6 @@ - FIXME If this box has a parent, this property returns [[**parent**.surface]]; otherwise it returns null. This property is a simple building block that the widget @@ -920,26 +1148,18 @@ windows. - + The value [[true]] is put to this property on the root box - when the surface is maximized, and [[false]] when the surface - is un-maximized. Reading from this value will return [[true]] - if the surface is maximized and [[false]] if it is - not. Putting [[true]] to this property will maximize the - window, and putting [[false]] to this property will - unmaximize the window. + when the surface is maximized/minimized, and [[false]] when + the surface is un-maximized/minimized. Reading from this value + will return [[true]] if the surface is maximized/minimized and + [[false]] if it is not. Putting [[true]] to this property will + maximize/minimize the window, and putting [[false]] to this + property will unmaximize/unminimize the window. + Note that not all platforms support maximization. - - The value [[true]] is put to this property on the root box - when the surface is minimized, and [[false]] when the surface - is unminimized. Reading from this value will return [[true]] - if the surface is minimized and [[false]] if it is - not. Putting [[true]] to this property will minimize the - window, and putting [[false]] will unminimize it. - - When the user attempts to close a surface, the value [[true]] will be put to this property. Scripts may trap @@ -950,21 +1170,243 @@ property. - - The surface's icon. This is usually displayed on the titlebar of a - window. The value should be an object whose stream is a PNG image. Note - that not all platforms support this property. + + The surface's titlebar text and icon. If a string is written + to this property, the surface's titlebar text is set to that + string; if a stream yielding an image is written, the + surface's icon is set to that image. Note that not all + platforms support this property. Only ASCII characters + 0x20-0x7F are permitted. - - The surface's titlebar text. Note that not all platforms support - this property. Only ASCII characters 0x20-0x7F are permitted. +
+ +
+ + +
+ + Every execution of the Event Context begins with an event, which + consists of a key/value pair, and a mouse position, which consists of + an x and y coordinate. The possible keys are [[_Press[1-3]]], + [[_Release[1-3]]], [[_Click[1-3]]], [[_DoubleClick[1-3]]], + [[_Move]], [[_KeyPressed]], and [[_KeyReleased]]. + + Here are two example events: + + An event is triggered by writing the key to the value on a box. This + triggers any trap handlers which may be present. Once these handlers + have executed, Ibex figures out which child of the current box contains + the mouse (taking into account that some boxes may cover up others) + and writes the key and value to that box. If none of the box's + children contain the mouse position, Ibex removes the leading + underscore from the key name and writes the value to + **that** property. Once all the traps on that property have + executed, the value is written to the box's parent. + + Intuitively, Ibex delivers the underscored event to every box from the + root to the target, and then delivers the non-underscored event to + that same set of boxes in reverse order. So the event travels down + the tree to the target, and then back up to the root. The following + example prints out "first second third fourth" in that order. + +
+    
+        _Press1 ++= function(b) { ibex.log.info("first"); }
+         Press1 ++= function(b) { ibex.log.info("fourth"); }
+        
+          _Press1 ++= function(b) { ibex.log.info("second"); }
+           Press1 ++= function(b) { ibex.log.info("third"); }
+        
+    
+    
+ + In general, you should use the **non-underscore** names to respond + to user input and use the underscored names when you want to override + child boxes' behavior or route events to particular boxes (for + example, when implementing a focus protocol). This is why the + underscored elements are delivered to parents before children (so + parents can override their childrens' behavior), but non-underscored + events are delivered to children before parents (since, visually, a + mouse click is usually "intended" for the leaf box underneath the + cursor). + + + + At any point in this sequence, a trap handler can choose not to + cascade (by returning [[true]] from the trap handler function). + This will immediately cease the propagation of the event. This is how + you would indicate that an event has been "handled". + + + + Ibex uses the following events to notify a box about changes that + only matter to that particular box. These events do not propagate + either up or down the tree. + + + The value [[true]] is written to this property when the mouse (enters/leaves) the box. + + + + The value [[true]] is put to this property after the size + of this box changes. + + + + When a child is added or removed, that child is written to + this property. The write is always performed **after** the + addition or removal, so these two cases can be distinguished + by checking [[indexof(child)]]. + + Note that if the parent's redirect target is set to another + box, this trap will only be invoked when children are + manipulated by reading and writing to the parent. Reads and + writes directly to the redirect target will **not** trigger + this trap. + + Note also that this traps is still triggered if a box's + [[redirect]] target is **null**. This is useful for + boxes that need to accept children and then relocate them + elsewhere. + + +
+ + + Indicates that the use has pressed a mouse button. On + platforms with three mouse buttons, the **middle** button + is button 3 -- this ensures that applications written to only + use two buttons (1 and 2) will work intuitively on three button + platforms. + + + + Indicates that the use has released a mouse button. + + + + Indicates that the user has pressed and released the + mouse button without moving the mouse much (exactly how + much is platform-dependent). + + + + Indicates that the user has clicked the + mouse button twice within a short period of time (exactly how long is platform-dependent). + + Indicates that the mouse has moved while within this box, or that + the mouse while outside this box **if a button was pressed while within this box and has not yet been released** + + + + + A string is written to this property when a key is pressed or + released If the key was any other key, a multi-character + string describing the key will be put. For simplicity, we use + the VK_ constants in the . When a + key is pressed or released, the string put will be the portion + of its VK_ constant after the underscore, all in lower case. + + + If the shift key was depressed immediately before the + event took place, then the string will be capitalized. Special + keynames are also capitalized; shift+home is reported as + "[[HOME]]". Symbols are capitalized as they appear on the + keyboard; for example, on an American QWERTY keyboard, shift+2 + is reported as "[[@]]". + + If the alt, meta, or command key was depressed immediately + before this key was pressed, then the string will be prefixed + with the string "[[A-]]". If the control key was depressed + while this key was pressed, then the string will be prefixed + with the string "[[C-]]". If both alt and control are + depressed, the string is prefixed with "[[C-A-]]". + + Ibex does not distinguish between a key press resulting from + the user physically pushing down a key, and a 'key press' + resulting from the keyboard's typematic repeat. In the rare + case that an application needs to distinguish between these + two events, it should watch for KeyReleased messages and + maintain an internal key-state vector. + + +
+
+ + At any point in the Event Context, you can write to the [[mouse]] + property on any box. The value written should be an object with two + properties, [[x]] and [[y]]. For example: + +
+    _Press1 ++= function(p) {
+        mouse = { x: 32, y: 77 };
+    }
+    
+ + The coordinates specified are relative to the box whose [[mouse]] + property is being written to. There is no need to supply the + [[inside]] property; it is computed automatically. Writing to + the [[mouse]] property causes Ibex to recompute the eventual + target box, and also alter the values returned by [[mouse.x]], + [[mouse.y]], and [[mouse.inside]] for any **descendants** + of the current box. Writing to the [[mouse]] property also + automatically prevents the event from returning to the box's parents + -- it is equivalent to not cascading on the non-underscored event. + This ensures that child boxes cannot trick their parent boxes into + thinking that the mouse has moved. + + If you want the event to "skip over" the boxes between the trapee + and the target, or if you want to re-route an event to a box which + is not a descendant of the current box, simply write the value to + the proper key on the target box. + +
+    
+        _KeyPressed = function(k) { ibex.log.info("first"); }
+         KeyPressed = function(k) { ibex.log.info("sixth"); }
+        $recipient.target = $target;
+        
+            _KeyPressed = function(k) {
+                ibex.log.info("second");
+                thisbox.target.KeyPressed = k;
+                // inhibit cascade; keep event from going to $excluded
+                return true;
+            }
+             KeyPressed = function(k) { ibex.log.info("fifth"); }
+            
+                _KeyPressed = function(k) {
+                   ibex.log.info("this never happens");
+                }
+            
+        
+         
+            _KeyPressed = function(k) { ibex.log.info("third"); }
+             KeyPressed = function(k) { ibex.log.info("fourth"); }
+        
+    
+    
+ +
+ +
+ + You can create "fake events" by simply writing to the [[mouse]] + property and then writing a value to one of the underscored properties + on a box. This will have exactly the same effect as if the use had + actually pressed a key, clicked a button, or moved the mouse -- they + are indistinguishable. +
+
- + +
@@ -1489,9 +1931,6 @@
- -
-
From the perspective of an application writer, Ibex is strictly @@ -1555,165 +1994,6 @@
- -
- - Every execution of the Event Context begins with an event, which - consists of a key/value pair, and a mouse position, which consists of - an x and y coordinate. The possible keys are [[_Press[1-3]]], - [[_Release[1-3]]], [[_Click[1-3]]], [[_DoubleClick[1-3]]], - [[_Move]], [[_KeyPressed]], and [[_KeyReleased]]. - - Here are two example events: - - An event is triggered by writing the key to the value on a box. This - triggers any trap handlers which may be present. Once these handlers - have executed, Ibex figures out which child of the current box contains - the mouse (taking into account that some boxes may cover up others) - and writes the key and value to that box. If none of the box's - children contain the mouse position, Ibex removes the leading - underscore from the key name and writes the value to - **that** property. Once all the traps on that property have - executed, the value is written to the box's parent. - - Intuitively, Ibex delivers the underscored event to every box from the - root to the target, and then delivers the non-underscored event to - that same set of boxes in reverse order. So the event travels down - the tree to the target, and then back up to the root. The following - example prints out "first second third fourth" in that order. - -
-    
-        _Press1 ++= function(b) { ibex.log.info("first"); }
-         Press1 ++= function(b) { ibex.log.info("fourth"); }
-        
-          _Press1 ++= function(b) { ibex.log.info("second"); }
-           Press1 ++= function(b) { ibex.log.info("third"); }
-        
-    
-    
- - In general, you should use the **non-underscore** names to respond - to user input and use the underscored names when you want to override - child boxes' behavior or route events to particular boxes (for - example, when implementing a focus protocol). This is why the - underscored elements are delivered to parents before children (so - parents can override their childrens' behavior), but non-underscored - events are delivered to children before parents (since, visually, a - mouse click is usually "intended" for the leaf box underneath the - cursor). - -
- - - - At any point in this sequence, a trap handler can choose not to - cascade (by returning [[true]] from the trap handler function). - This will immediately cease the propagation of the event. This is how - you would indicate that an event has been "handled". - - - - Ibex uses the following events to notify a box about changes that - only matter to that particular box. These events do not propagate - either up or down the tree. - - - The value [[true]] is written to this property when the mouse (enters/leaves) the box. - - - - The value [[true]] is put to this property after the size - of this box changes. - - - - When a child is added or removed, that child is written to - this property. The write is always performed **after** the - addition or removal, so these two cases can be distinguished - by checking [[indexof(child)]]. - - Note that if the parent's redirect target is set to another - box, this trap will only be invoked when children are - manipulated by reading and writing to the parent. Reads and - writes directly to the redirect target will **not** trigger - this trap. - - Note also that this traps is still triggered if a box's - [[redirect]] target is **null**. This is useful for - boxes that need to accept children and then relocate them - elsewhere. - - -
- - - Indicates that the use has pressed a mouse button. On - platforms with three mouse buttons, the **middle** button - is button 3 -- this ensures that applications written to only - use two buttons (1 and 2) will work intuitively on three button - platforms. - - - - Indicates that the use has released a mouse button. - - - - Indicates that the user has pressed and released the - mouse button without moving the mouse much (exactly how - much is platform-dependent). - - - - Indicates that the user has clicked the - mouse button twice within a short period of time (exactly how long is platform-dependent). - - - - Indicates that the mouse has moved while within this box, or that - the mouse while outside this box **if a button was pressed while within this box and has not yet been released** - - - - - A string is written to this property when a key is pressed or - released If the key was any other key, a multi-character - string describing the key will be put. For simplicity, we use - the VK_ constants in the . When a - key is pressed or released, the string put will be the portion - of its VK_ constant after the underscore, all in lower case. - - - If the shift key was depressed immediately before the - event took place, then the string will be capitalized. Special - keynames are also capitalized; shift+home is reported as - "[[HOME]]". Symbols are capitalized as they appear on the - keyboard; for example, on an American QWERTY keyboard, shift+2 - is reported as "[[@]]". - - If the alt, meta, or command key was depressed immediately - before this key was pressed, then the string will be prefixed - with the string "[[A-]]". If the control key was depressed - while this key was pressed, then the string will be prefixed - with the string "[[C-]]". If both alt and control are - depressed, the string is prefixed with "[[C-A-]]". - - Ibex does not distinguish between a key press resulting from - the user physically pushing down a key, and a 'key press' - resulting from the keyboard's typematic repeat. In the rare - case that an application needs to distinguish between these - two events, it should watch for KeyReleased messages and - maintain an internal key-state vector. - - - -
- -
-
@@ -1934,75 +2214,6 @@
- -
- -
- - At any point in the Event Context, you can write to the [[mouse]] - property on any box. The value written should be an object with two - properties, [[x]] and [[y]]. For example: - -
-    _Press1 ++= function(p) {
-        mouse = { x: 32, y: 77 };
-    }
-    
- - The coordinates specified are relative to the box whose [[mouse]] - property is being written to. There is no need to supply the - [[inside]] property; it is computed automatically. Writing to - the [[mouse]] property causes Ibex to recompute the eventual - target box, and also alter the values returned by [[mouse.x]], - [[mouse.y]], and [[mouse.inside]] for any **descendants** - of the current box. Writing to the [[mouse]] property also - automatically prevents the event from returning to the box's parents - -- it is equivalent to not cascading on the non-underscored event. - This ensures that child boxes cannot trick their parent boxes into - thinking that the mouse has moved. - - If you want the event to "skip over" the boxes between the trapee - and the target, or if you want to re-route an event to a box which - is not a descendant of the current box, simply write the value to - the proper key on the target box. - -
-    
-        _KeyPressed = function(k) { ibex.log.info("first"); }
-         KeyPressed = function(k) { ibex.log.info("sixth"); }
-        $recipient.target = $target;
-        
-            _KeyPressed = function(k) {
-                ibex.log.info("second");
-                thisbox.target.KeyPressed = k;
-                // inhibit cascade; keep event from going to $excluded
-                return true;
-            }
-             KeyPressed = function(k) { ibex.log.info("fifth"); }
-            
-                _KeyPressed = function(k) {
-                   ibex.log.info("this never happens");
-                }
-            
-        
-         
-            _KeyPressed = function(k) { ibex.log.info("third"); }
-             KeyPressed = function(k) { ibex.log.info("fourth"); }
-        
-    
-    
- -
- -
- - You can create "fake events" by simply writing to the [[mouse]] - property and then writing a value to one of the underscored properties - on a box. This will have exactly the same effect as if the use had - actually pressed a key, clicked a button, or moved the mouse -- they - are indistinguishable. - -
@@ -2071,7 +2282,7 @@ new_ibex.load ++= function() { return newLoadFunction; } ibex.apply(ibex.box, .main, new_ibex); -
+