glimmer-dsl-libui 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +599 -883
- data/VERSION +1 -1
- data/bin/girb +0 -0
- data/examples/area_gallery.rb +19 -19
- data/examples/area_gallery2.rb +91 -89
- data/examples/area_gallery3.rb +19 -19
- data/examples/area_gallery4.rb +91 -89
- data/examples/basic_transform.rb +3 -6
- data/examples/basic_transform2.rb +34 -0
- data/examples/color_the_circles.rb +1 -3
- data/examples/dynamic_area.rb +1 -3
- data/examples/dynamic_area2.rb +5 -7
- data/examples/form_table.rb +4 -0
- data/examples/grid.rb +4 -4
- data/examples/histogram.rb +4 -8
- data/examples/meta_example.rb +50 -10
- data/examples/snake.rb +1 -3
- data/examples/tetris.rb +15 -18
- data/examples/tic_tac_toe/board.rb +4 -2
- data/examples/tic_tac_toe.rb +1 -3
- data/glimmer-dsl-libui.gemspec +0 -0
- data/lib/glimmer/dsl/libui/shape_expression.rb +6 -1
- data/lib/glimmer/libui/shape.rb +44 -1
- metadata +6 -5
    
        data/README.md
    CHANGED
    
    | @@ -1,10 +1,14 @@ | |
| 1 | 
            -
            # [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for LibUI 0.3. | 
| 1 | 
            +
            # [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for LibUI 0.3.3
         | 
| 2 2 | 
             
            ## Prerequisite-Free Ruby Desktop Development GUI Library
         | 
| 3 3 | 
             
            [](http://badge.fury.io/rb/glimmer-dsl-libui)
         | 
| 4 4 | 
             
            [](https://gitter.im/AndyObtiva/glimmer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
         | 
| 5 5 |  | 
| 6 6 | 
             
            [Glimmer](https://github.com/AndyObtiva/glimmer) DSL for [LibUI](https://github.com/kojix2/LibUI) is a prerequisite-free Ruby desktop development GUI library. No need to pre-install any prerequisites. Just install the gem and have platform-independent native GUI that just works!
         | 
| 7 7 |  | 
| 8 | 
            +
            Mac | Windows | Linux
         | 
| 9 | 
            +
            ----|---------|------
         | 
| 10 | 
            +
             |  | 
         | 
| 11 | 
            +
             | 
| 8 12 | 
             
            [LibUI](https://github.com/kojix2/LibUI) is a thin [Ruby](https://www.ruby-lang.org/en/) wrapper around [libui](https://github.com/andlabs/libui), a relatively new C GUI library that renders native controls on every platform (similar to [SWT](https://www.eclipse.org/swt/), but without the heavy weight of the [Java Virtual Machine](https://www.java.com/en/)).
         | 
| 9 13 |  | 
| 10 14 | 
             
            The main trade-off in using [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) as opposed to [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) or [Glimmer DSL for Tk](https://github.com/AndyObtiva/glimmer-dsl-tk) is the fact that [SWT](https://www.eclipse.org/swt/) and [Tk](https://www.tcl.tk/) are more mature than mid-alpha [libui](https://github.com/andlabs/libui) as GUI toolkits. Still, if there is only a need to build a small simple application, [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) could be a good convenient choice due to having zero prerequisites beyond the dependencies included in the [Ruby gem](https://rubygems.org/gems/glimmer-dsl-libui). Also, just like [Glimmer DSL for Tk](https://github.com/AndyObtiva/glimmer-dsl-tk), its apps start instantly and have a small memory footprint. [LibUI](https://github.com/kojix2/LibUI) is a promising new GUI toolkit that might prove quite worthy in the future.
         | 
| @@ -28,17 +32,9 @@ include Glimmer | |
| 28 32 | 
             
            window('hello world').show
         | 
| 29 33 | 
             
            ```
         | 
| 30 34 |  | 
| 31 | 
            -
            Mac
         | 
| 32 | 
            -
             | 
| 33 | 
            -
            
         | 
| 34 | 
            -
             | 
| 35 | 
            -
            Windows
         | 
| 36 | 
            -
             | 
| 37 | 
            -
            
         | 
| 38 | 
            -
             | 
| 39 | 
            -
            Linux
         | 
| 40 | 
            -
             | 
| 41 | 
            -
            
         | 
| 35 | 
            +
            Mac | Windows | Linux
         | 
| 36 | 
            +
            ----|---------|------
         | 
| 37 | 
            +
             |  | 
         | 
| 42 38 |  | 
| 43 39 | 
             
            Basic Table Progress Bar
         | 
| 44 40 |  | 
| @@ -77,17 +73,9 @@ window('Task Progress', 300, 200) { | |
| 77 73 | 
             
            }.show
         | 
| 78 74 | 
             
            ```
         | 
| 79 75 |  | 
| 80 | 
            -
            Mac
         | 
| 81 | 
            -
             | 
| 82 | 
            -
            
         | 
| 83 | 
            -
             | 
| 84 | 
            -
            Windows
         | 
| 85 | 
            -
             | 
| 86 | 
            -
            
         | 
| 87 | 
            -
             | 
| 88 | 
            -
            Linux
         | 
| 89 | 
            -
             | 
| 90 | 
            -
            
         | 
| 76 | 
            +
            Mac | Windows | Linux
         | 
| 77 | 
            +
            ----|---------|------
         | 
| 78 | 
            +
             |  | 
         | 
| 91 79 |  | 
| 92 80 | 
             
            Area Gallery
         | 
| 93 81 |  | 
| @@ -98,50 +86,50 @@ include Glimmer | |
| 98 86 |  | 
| 99 87 | 
             
            window('Area Gallery', 400, 400) {
         | 
| 100 88 | 
             
              area {
         | 
| 101 | 
            -
                path { # declarative stable path
         | 
| 89 | 
            +
                path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
         | 
| 102 90 | 
             
                  square(0, 0, 100)
         | 
| 103 91 | 
             
                  square(100, 100, 400)
         | 
| 104 | 
            -
             | 
| 92 | 
            +
                  
         | 
| 105 93 | 
             
                  fill r: 102, g: 102, b: 204
         | 
| 106 94 | 
             
                }
         | 
| 107 | 
            -
                 | 
| 95 | 
            +
                
         | 
| 96 | 
            +
                path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
         | 
| 108 97 | 
             
                  rectangle(0, 100, 100, 400)
         | 
| 109 98 | 
             
                  rectangle(100, 0, 400, 100)
         | 
| 110 | 
            -
             | 
| 99 | 
            +
                  
         | 
| 111 100 | 
             
                  # linear gradient (has x0, y0, x1, y1, and stops)
         | 
| 112 101 | 
             
                  fill x0: 10, y0: 10, x1: 350, y1: 350, stops: [{pos: 0.25, r: 204, g: 102, b: 204}, {pos: 0.75, r: 102, g: 102, b: 204}]
         | 
| 113 102 | 
             
                }
         | 
| 114 | 
            -
                 | 
| 115 | 
            -
             | 
| 116 | 
            -
                  
         | 
| 103 | 
            +
                
         | 
| 104 | 
            +
                polygon(100, 100, 100, 400, 400, 100, 400, 400) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 117 105 | 
             
                  fill r: 202, g: 102, b: 104, a: 0.5
         | 
| 118 106 | 
             
                  stroke r: 0, g: 0, b: 0
         | 
| 119 107 | 
             
                }
         | 
| 120 | 
            -
                 | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 108 | 
            +
                
         | 
| 109 | 
            +
                polybezier(0, 0,
         | 
| 110 | 
            +
                           200, 100, 100, 200, 400, 100,
         | 
| 111 | 
            +
                           300, 100, 100, 300, 100, 400,
         | 
| 112 | 
            +
                           100, 300, 300, 100, 400, 400) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 123 113 | 
             
                  fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 124 114 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 125 115 | 
             
                }
         | 
| 126 | 
            -
                path { # declarative stable path
         | 
| 127 | 
            -
                  polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
         | 
| 128 116 |  | 
| 117 | 
            +
                polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 129 118 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 130 119 | 
             
                }
         | 
| 131 | 
            -
                 | 
| 132 | 
            -
             | 
| 133 | 
            -
             | 
| 120 | 
            +
                
         | 
| 121 | 
            +
                arc(404, 216, 190, 90, 90, false) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 134 122 | 
             
                  # radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
         | 
| 135 123 | 
             
                  fill outer_radius: 90, x0: 0, y0: 0, x1: 500, y1: 500, stops: [{pos: 0.25, r: 102, g: 102, b: 204, a: 0.5}, {pos: 0.75, r: 204, g: 102, b: 204}]
         | 
| 136 124 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 137 125 | 
             
                }
         | 
| 138 | 
            -
                 | 
| 139 | 
            -
             | 
| 140 | 
            -
             | 
| 126 | 
            +
                
         | 
| 127 | 
            +
                circle(200, 200, 90) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 141 128 | 
             
                  fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 142 129 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 143 130 | 
             
                }
         | 
| 144 | 
            -
                 | 
| 131 | 
            +
                
         | 
| 132 | 
            +
                text(161, 40, 100) { # declarative stable text
         | 
| 145 133 | 
             
                  string('Area Gallery') {
         | 
| 146 134 | 
             
                    font family: 'Arial', size: (OS.mac? ? 14 : 11)
         | 
| 147 135 | 
             
                    color :black
         | 
| @@ -199,20 +187,16 @@ window('Area Gallery', 400, 400) { | |
| 199 187 | 
             
            }.show
         | 
| 200 188 | 
             
            ```
         | 
| 201 189 |  | 
| 202 | 
            -
            Mac
         | 
| 203 | 
            -
             | 
| 204 | 
            -
            
         | 
| 205 | 
            -
             | 
| 206 | 
            -
            Windows
         | 
| 207 | 
            -
             | 
| 208 | 
            -
            
         | 
| 209 | 
            -
             | 
| 210 | 
            -
            Linux
         | 
| 211 | 
            -
             | 
| 212 | 
            -
            
         | 
| 190 | 
            +
            Mac | Windows | Linux
         | 
| 191 | 
            +
            ----|---------|------
         | 
| 192 | 
            +
             |  | 
         | 
| 213 193 |  | 
| 214 194 | 
             
            [Check Out Many More Examples Over Here!](#examples)
         | 
| 215 195 |  | 
| 196 | 
            +
            Mac | Windows | Linux
         | 
| 197 | 
            +
            ----|---------|------
         | 
| 198 | 
            +
             |  | 
         | 
| 199 | 
            +
             | 
| 216 200 | 
             
            NOTE: [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) is feature-complete and in beta mode (though the C [libui](https://github.com/andlabs/libui) is still mid-alpha). Please help make better by contributing, adopting for small or low risk projects, and providing feedback. The more feedback and issues you report the better.
         | 
| 217 201 |  | 
| 218 202 | 
             
            Other [Glimmer](https://rubygems.org/gems/glimmer) DSL gems you might be interested in:
         | 
| @@ -382,7 +366,7 @@ gem install glimmer-dsl-libui | |
| 382 366 | 
             
            Or install via Bundler `Gemfile`:
         | 
| 383 367 |  | 
| 384 368 | 
             
            ```ruby
         | 
| 385 | 
            -
            gem 'glimmer-dsl-libui', '~> 0.3. | 
| 369 | 
            +
            gem 'glimmer-dsl-libui', '~> 0.3.3'
         | 
| 386 370 | 
             
            ```
         | 
| 387 371 |  | 
| 388 372 | 
             
            Add `require 'glimmer-dsl-libui'` at the top, and then `include Glimmer` into the top-level main object for testing or into an actual class for serious usage.
         | 
| @@ -724,7 +708,7 @@ Learn more by checking out [examples](#examples). | |
| 724 708 |  | 
| 725 709 | 
             
            The `area` control is a canvas-like control for drawing paths that can be used in one of two ways:
         | 
| 726 710 | 
             
            - Declaratively via stable paths: useful for stable paths that will not change often later on. Simply nest `path` and figures like `rectangle` and all drawing logic is generated automatically. Path proxy objects are preserved across redraws assuming there would be relatively few stable paths (mostly for decorative reasons).
         | 
| 727 | 
            -
            - Semi-declaratively via on_draw listener dynamic paths: useful for more dynamic paths that will definitely change very often. Open an `on_draw` listener block that receives  | 
| 711 | 
            +
            - Semi-declaratively via on_draw listener dynamic paths: useful for more dynamic paths that will definitely change very often. Open an `on_draw` listener block that receives an [`area_draw_params`](#area-draw-params) argument and nest `path` and figures like `rectangle` and all drawing logic is generated automatically. Path proxy objects are destroyed (thrown-away) at the end of drawing, thus having less memory overhead for drawing thousands of dynamic paths.
         | 
| 728 712 |  | 
| 729 713 | 
             
            Note that when nesting an `area` directly underneath `window` (without a layout control like `vertical_box`), it is automatically reparented with `vertical_box` in between the `window` and `area` since it would not show up on Linux otherwise.
         | 
| 730 714 |  | 
| @@ -750,19 +734,11 @@ window('Basic Area', 400, 400) { | |
| 750 734 | 
             
            }.show
         | 
| 751 735 | 
             
            ```
         | 
| 752 736 |  | 
| 753 | 
            -
            Mac
         | 
| 754 | 
            -
             | 
| 755 | 
            -
            
         | 
| 737 | 
            +
            Mac | Windows | Linux
         | 
| 738 | 
            +
            ----|---------|------
         | 
| 739 | 
            +
             |  | 
         | 
| 756 740 |  | 
| 757 | 
            -
             | 
| 758 | 
            -
             | 
| 759 | 
            -
            
         | 
| 760 | 
            -
             | 
| 761 | 
            -
            Linux
         | 
| 762 | 
            -
             | 
| 763 | 
            -
            
         | 
| 764 | 
            -
             | 
| 765 | 
            -
            Here is the same example using a semi-declarative `area` with `on_draw` listener that receives a `area_draw_params` argument and a dynamic path (you may copy/paste in [`girb`](#girb-glimmer-irb)):
         | 
| 741 | 
            +
            Here is the same example using a semi-declarative `area` with `on_draw` listener that receives a [`area_draw_params`](#area-draw-params) argument and a dynamic path (you may copy/paste in [`girb`](#girb-glimmer-irb)):
         | 
| 766 742 |  | 
| 767 743 | 
             
            ```ruby
         | 
| 768 744 | 
             
            require 'glimmer-dsl-libui'
         | 
| @@ -796,26 +772,19 @@ Available nested `path` shapes: | |
| 796 772 | 
             
            - `rectangle(x as Numeric, y as Numeric, width as Numeric, height as Numeric)`
         | 
| 797 773 | 
             
            - `square(x as Numeric, y as Numeric, length as Numeric)`
         | 
| 798 774 | 
             
            - `arc(x_center as Numeric, y_center as Numeric, radius as Numeric, start_angle as Numeric, sweep as Numeric, is_negative as Boolean)`
         | 
| 799 | 
            -
            - ` | 
| 800 | 
            -
            - ` | 
| 801 | 
            -
            - ` | 
| 802 | 
            -
            - ` | 
| 803 | 
            -
            - ` | 
| 775 | 
            +
            - `circle(x_center as Numeric, y_center as Numeric, radius as Numeric)`
         | 
| 776 | 
            +
            - `line(x as Numeric, y as Numeric)`: must be placed in a figure (check `polyline`/`polygon` alternatives that do not require a `figure`)
         | 
| 777 | 
            +
            - `bezier(c1_x as Numeric, c1_y as Numeric, c2_x as Numeric, c2_y as Numeric, end_x as Numeric, end_y as Numeric)`: must be placed in a figure (check `polybezier` alternative that does not require a `figure`)
         | 
| 778 | 
            +
            - `polygon(point_array as Array of Arrays of Numeric or Array of Numeric)`: shortcut for a closed figure of lines; can receive points as [[x1, y1], [x2, y2], ...] or [x1, y1, x2, y2, ...]
         | 
| 779 | 
            +
            - `polyline(point_array as Array of Arrays of Numeric or Array of Numeric)`: shortcut for an open figure of lines; can receive points as [[x1, y1], [x2, y2], ...] or [x1, y1, x2, y2, ...]
         | 
| 780 | 
            +
            - `polybezier(point_array as Array of Arrays of Numeric or Array of Numeric)`: shortcut for an open figure of beziers; can receive points as [[start_x1, start_y1], [c1_x2, c1_y2, c2_x2, c2_y2, end_x2, end_y2], [c1_x3, c1_y3, c2_x3, c2_y3, end_x3, end_y3], ...] or [start_x1, start_y1, c1_x2, c1_y2, c2_x2, c2_y2, end_x2, end_y2, c1_x3, c1_y3, c2_x3, c2_y3, end_x3, end_y3, ...]
         | 
| 804 781 | 
             
            - `figure(x=nil as Numeric, y=nil as Numeric)` (composite that can contain other shapes) (can set `closed true` to connect last point to first point automatically)
         | 
| 805 782 |  | 
| 806 783 | 
             
            Check [examples/area_gallery.rb](#area-gallery) for an overiew of all `path` shapes.
         | 
| 807 784 |  | 
| 808 | 
            -
            Mac
         | 
| 809 | 
            -
             | 
| 810 | 
            -
            
         | 
| 811 | 
            -
             | 
| 812 | 
            -
            Windows
         | 
| 813 | 
            -
             | 
| 814 | 
            -
            
         | 
| 815 | 
            -
             | 
| 816 | 
            -
            Linux
         | 
| 817 | 
            -
             | 
| 818 | 
            -
            
         | 
| 785 | 
            +
            Mac | Windows | Linux
         | 
| 786 | 
            +
            ----|---------|------
         | 
| 787 | 
            +
             |  | 
         | 
| 819 788 |  | 
| 820 789 | 
             
            #### Area Text
         | 
| 821 790 |  | 
| @@ -870,17 +839,9 @@ window('area text drawing') { | |
| 870 839 |  | 
| 871 840 | 
             
            You may checkout [examples/basic_draw_text.rb](#basic-draw-text) and [examples/custom_draw_text.rb](#custom-draw-text) for examples of using `text` inside `area`.
         | 
| 872 841 |  | 
| 873 | 
            -
            Mac
         | 
| 874 | 
            -
             | 
| 875 | 
            -
            
         | 
| 876 | 
            -
             | 
| 877 | 
            -
            Windows
         | 
| 878 | 
            -
             | 
| 879 | 
            -
            
         | 
| 880 | 
            -
             | 
| 881 | 
            -
            Linux
         | 
| 882 | 
            -
             | 
| 883 | 
            -
            
         | 
| 842 | 
            +
            Mac | Windows | Linux
         | 
| 843 | 
            +
            ----|---------|------
         | 
| 844 | 
            +
             |  | 
         | 
| 884 845 |  | 
| 885 846 | 
             
            #### Area Image
         | 
| 886 847 |  | 
| @@ -897,17 +858,13 @@ Given that it is very new and is not a [libui](https://github.com/andlabs/libui) | |
| 897 858 |  | 
| 898 859 | 
             
            Currently, it is recommended to use `image` with very small `width` and `height` values only.
         | 
| 899 860 |  | 
| 900 | 
            -
            Setting a `transform` `matrix` is supported under `image` just like it is under `path` and `text` inside `area`.
         | 
| 861 | 
            +
            Setting a [`transform` `matrix`](#area-transform-matrix) is supported under `image` just like it is under `path` and `text` inside `area`.
         | 
| 901 862 |  | 
| 902 863 | 
             
            Example of using `image` declaratively (you may copy/paste in [`girb`](#girb-glimmer-irb)):
         | 
| 903 864 |  | 
| 904 | 
            -
            Mac
         | 
| 905 | 
            -
             | 
| 906 | 
            -
            
         | 
| 907 | 
            -
             | 
| 908 | 
            -
            Windows
         | 
| 909 | 
            -
             | 
| 910 | 
            -
            
         | 
| 865 | 
            +
            Mac | Windows | Linux
         | 
| 866 | 
            +
            ----|---------|------
         | 
| 867 | 
            +
             |  | 
         | 
| 911 868 |  | 
| 912 869 | 
             
            ```ruby
         | 
| 913 870 | 
             
            require 'glimmer-dsl-libui'
         | 
| @@ -1374,12 +1331,124 @@ For Linux, simply package your app as a [Ruby Gem](https://guides.rubygems.org/w | |
| 1374 1331 |  | 
| 1375 1332 | 
             
            ## Glimmer Style Guide
         | 
| 1376 1333 |  | 
| 1377 | 
            -
            - Control arguments are always wrapped by parentheses
         | 
| 1378 | 
            -
             | 
| 1379 | 
            -
             | 
| 1380 | 
            -
             | 
| 1381 | 
            -
             | 
| 1382 | 
            -
             | 
| 1334 | 
            +
            **1 - Control arguments are always wrapped by parentheses.**
         | 
| 1335 | 
            +
             | 
| 1336 | 
            +
            Example:
         | 
| 1337 | 
            +
             | 
| 1338 | 
            +
            ```ruby
         | 
| 1339 | 
            +
            label('Name')
         | 
| 1340 | 
            +
            ```
         | 
| 1341 | 
            +
             | 
| 1342 | 
            +
            **2 - Control blocks are always declared with curly braces to clearly visualize hierarchical view code and separate from logic code.**
         | 
| 1343 | 
            +
             | 
| 1344 | 
            +
            Example:
         | 
| 1345 | 
            +
             | 
| 1346 | 
            +
            ```ruby
         | 
| 1347 | 
            +
              group('Basic Controls') {
         | 
| 1348 | 
            +
                vertical_box {
         | 
| 1349 | 
            +
                  button('Button') {
         | 
| 1350 | 
            +
                  }
         | 
| 1351 | 
            +
                }
         | 
| 1352 | 
            +
              }
         | 
| 1353 | 
            +
            ```
         | 
| 1354 | 
            +
             | 
| 1355 | 
            +
            **3 - Control property declarations always have arguments that are never wrapped inside parentheses and never take a block.**
         | 
| 1356 | 
            +
             | 
| 1357 | 
            +
            Example:
         | 
| 1358 | 
            +
             | 
| 1359 | 
            +
            ```ruby
         | 
| 1360 | 
            +
              spinbox(0, 100) {
         | 
| 1361 | 
            +
                stretchy false
         | 
| 1362 | 
            +
                value 42
         | 
| 1363 | 
            +
              }
         | 
| 1364 | 
            +
            ```
         | 
| 1365 | 
            +
             | 
| 1366 | 
            +
            **4 - Control listeners are always declared starting with on_ prefix and affixing listener event method name afterwards in underscored lowercase form. Their multi-line blocks have a `do; end` style.**
         | 
| 1367 | 
            +
             | 
| 1368 | 
            +
            Example:
         | 
| 1369 | 
            +
             | 
| 1370 | 
            +
            ```ruby
         | 
| 1371 | 
            +
              button('Click') {
         | 
| 1372 | 
            +
                on_clicked do
         | 
| 1373 | 
            +
                  msg_box('Information', 'You clicked the button')
         | 
| 1374 | 
            +
                end
         | 
| 1375 | 
            +
              }
         | 
| 1376 | 
            +
            ```
         | 
| 1377 | 
            +
             | 
| 1378 | 
            +
            **5 - Iterator multi-line blocks always have `do; end` style to clearly separate logic code from view code.**
         | 
| 1379 | 
            +
             | 
| 1380 | 
            +
            Example:
         | 
| 1381 | 
            +
             | 
| 1382 | 
            +
            ```ruby
         | 
| 1383 | 
            +
              @field_hash.keys.each do |field|
         | 
| 1384 | 
            +
                label(field) {
         | 
| 1385 | 
            +
                  stretchy false
         | 
| 1386 | 
            +
                }
         | 
| 1387 | 
            +
                
         | 
| 1388 | 
            +
                entry {
         | 
| 1389 | 
            +
                  on_changed do |control|
         | 
| 1390 | 
            +
                    @field_hash[field] = control.text
         | 
| 1391 | 
            +
                  end
         | 
| 1392 | 
            +
                }
         | 
| 1393 | 
            +
              end
         | 
| 1394 | 
            +
            ```
         | 
| 1395 | 
            +
             | 
| 1396 | 
            +
            **6 - In a widget's content block, attributes are declared first, with layout management attributes on top (e.g. `stretchy false`); an empty line separates attributes from nested widgets and listeners following afterwards.**
         | 
| 1397 | 
            +
             | 
| 1398 | 
            +
            Example:
         | 
| 1399 | 
            +
             | 
| 1400 | 
            +
            ```ruby
         | 
| 1401 | 
            +
              group('Numbers') {
         | 
| 1402 | 
            +
                stretchy false
         | 
| 1403 | 
            +
             | 
| 1404 | 
            +
                vertical_box {
         | 
| 1405 | 
            +
                  spinbox(0, 100) {
         | 
| 1406 | 
            +
                    stretchy false
         | 
| 1407 | 
            +
                    value 42
         | 
| 1408 | 
            +
             | 
| 1409 | 
            +
                    on_changed do |s|
         | 
| 1410 | 
            +
                      puts "New Spinbox value: #{s.value}"
         | 
| 1411 | 
            +
                      $stdout.flush # for Windows
         | 
| 1412 | 
            +
                    end
         | 
| 1413 | 
            +
                  }
         | 
| 1414 | 
            +
                }
         | 
| 1415 | 
            +
              }
         | 
| 1416 | 
            +
            ```
         | 
| 1417 | 
            +
             | 
| 1418 | 
            +
            **7 - Unlike attributes, nested widgets with a content block and listeners are always separated from each other by an empty line to make readability easier except where it helps to group two widgets together (e.g. label and described entry).**
         | 
| 1419 | 
            +
             | 
| 1420 | 
            +
            Example:
         | 
| 1421 | 
            +
             | 
| 1422 | 
            +
            ```ruby
         | 
| 1423 | 
            +
              area {
         | 
| 1424 | 
            +
                path { # needs an empty line afterwards
         | 
| 1425 | 
            +
                  square(0, 0, 100) # does not have a content block, so no empty line is needed
         | 
| 1426 | 
            +
                  square(100, 100, 400) # does not have a content block, so no empty line is needed
         | 
| 1427 | 
            +
                  
         | 
| 1428 | 
            +
                  fill r: 102, g: 102, b: 204
         | 
| 1429 | 
            +
                }
         | 
| 1430 | 
            +
                
         | 
| 1431 | 
            +
                path { # needs an empty line afterwards
         | 
| 1432 | 
            +
                  rectangle(0, 100, 100, 400) # does not have a content block, so no empty line is needed
         | 
| 1433 | 
            +
                  rectangle(100, 0, 400, 100) # does not have a content block, so no empty line is needed
         | 
| 1434 | 
            +
                  
         | 
| 1435 | 
            +
                  fill x0: 10, y0: 10, x1: 350, y1: 350, stops: [{pos: 0.25, r: 204, g: 102, b: 204}, {pos: 0.75, r: 102, g: 102, b: 204}]
         | 
| 1436 | 
            +
                }
         | 
| 1437 | 
            +
                
         | 
| 1438 | 
            +
                polygon(100, 100, 100, 400, 400, 100, 400, 400) { # needs an empty line afterwards
         | 
| 1439 | 
            +
                  fill r: 202, g: 102, b: 104, a: 0.5 # attributes do not need an empty line separator
         | 
| 1440 | 
            +
                  stroke r: 0, g: 0, b: 0 # attributes do not need an empty line separator
         | 
| 1441 | 
            +
                }
         | 
| 1442 | 
            +
                
         | 
| 1443 | 
            +
                on_mouse_up do |area_mouse_event| # needs an empty line afterwards
         | 
| 1444 | 
            +
                  puts 'mouse up'
         | 
| 1445 | 
            +
                end
         | 
| 1446 | 
            +
             | 
| 1447 | 
            +
                on_key_up do |area_key_event| # needs an empty line afterwards
         | 
| 1448 | 
            +
                  puts 'key up'
         | 
| 1449 | 
            +
                end
         | 
| 1450 | 
            +
              }
         | 
| 1451 | 
            +
            ```
         | 
| 1383 1452 |  | 
| 1384 1453 | 
             
            ## Examples
         | 
| 1385 1454 |  | 
| @@ -1401,17 +1470,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 1401 1470 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/meta_example'"
         | 
| 1402 1471 | 
             
            ```
         | 
| 1403 1472 |  | 
| 1404 | 
            -
            Mac
         | 
| 1405 | 
            -
             | 
| 1406 | 
            -
            
         | 
| 1407 | 
            -
             | 
| 1408 | 
            -
            Windows
         | 
| 1409 | 
            -
             | 
| 1410 | 
            -
            
         | 
| 1411 | 
            -
             | 
| 1412 | 
            -
            Linux
         | 
| 1413 | 
            -
             | 
| 1414 | 
            -
            
         | 
| 1473 | 
            +
            Mac | Windows | Linux
         | 
| 1474 | 
            +
            ----|---------|------
         | 
| 1475 | 
            +
             |  | 
         | 
| 1415 1476 |  | 
| 1416 1477 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 1417 1478 |  | 
| @@ -1569,17 +1630,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 1569 1630 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_window'"
         | 
| 1570 1631 | 
             
            ```
         | 
| 1571 1632 |  | 
| 1572 | 
            -
            Mac
         | 
| 1573 | 
            -
             | 
| 1574 | 
            -
            
         | 
| 1575 | 
            -
             | 
| 1576 | 
            -
            Windows
         | 
| 1577 | 
            -
             | 
| 1578 | 
            -
            
         | 
| 1579 | 
            -
             | 
| 1580 | 
            -
            Linux
         | 
| 1581 | 
            -
             | 
| 1582 | 
            -
            
         | 
| 1633 | 
            +
            Mac | Windows | Linux
         | 
| 1634 | 
            +
            ----|---------|------
         | 
| 1635 | 
            +
             |  | 
         | 
| 1583 1636 |  | 
| 1584 1637 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 1585 1638 |  | 
| @@ -1652,20 +1705,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 1652 1705 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_button'"
         | 
| 1653 1706 | 
             
            ```
         | 
| 1654 1707 |  | 
| 1655 | 
            -
            Mac
         | 
| 1656 | 
            -
             | 
| 1657 | 
            -
            
         | 
| 1658 | 
            -
            
         | 
| 1659 | 
            -
             | 
| 1660 | 
            -
            Windows
         | 
| 1661 | 
            -
             | 
| 1662 | 
            -
            
         | 
| 1663 | 
            -
            
         | 
| 1664 | 
            -
             | 
| 1665 | 
            -
            Linux
         | 
| 1666 | 
            -
             | 
| 1667 | 
            -
            
         | 
| 1668 | 
            -
            
         | 
| 1708 | 
            +
            Mac | Windows | Linux
         | 
| 1709 | 
            +
            ----|---------|------
         | 
| 1710 | 
            +
              |   |  
         | 
| 1669 1711 |  | 
| 1670 1712 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 1671 1713 |  | 
| @@ -1734,20 +1776,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 1734 1776 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_entry'"
         | 
| 1735 1777 | 
             
            ```
         | 
| 1736 1778 |  | 
| 1737 | 
            -
            Mac
         | 
| 1738 | 
            -
             | 
| 1739 | 
            -
            
         | 
| 1740 | 
            -
            
         | 
| 1741 | 
            -
             | 
| 1742 | 
            -
            Windows
         | 
| 1743 | 
            -
             | 
| 1744 | 
            -
            
         | 
| 1745 | 
            -
            
         | 
| 1746 | 
            -
             | 
| 1747 | 
            -
            Linux
         | 
| 1748 | 
            -
             | 
| 1749 | 
            -
            
         | 
| 1750 | 
            -
            
         | 
| 1779 | 
            +
            Mac | Windows | Linux
         | 
| 1780 | 
            +
            ----|---------|------
         | 
| 1781 | 
            +
              |   |  
         | 
| 1751 1782 |  | 
| 1752 1783 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 1753 1784 |  | 
| @@ -1840,17 +1871,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 1840 1871 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/simple_notepad'"
         | 
| 1841 1872 | 
             
            ```
         | 
| 1842 1873 |  | 
| 1843 | 
            -
            Mac
         | 
| 1844 | 
            -
             | 
| 1845 | 
            -
            
         | 
| 1846 | 
            -
             | 
| 1847 | 
            -
            Windows
         | 
| 1848 | 
            -
             | 
| 1849 | 
            -
            
         | 
| 1850 | 
            -
             | 
| 1851 | 
            -
            Linux
         | 
| 1852 | 
            -
             | 
| 1853 | 
            -
            
         | 
| 1874 | 
            +
            Mac | Windows | Linux
         | 
| 1875 | 
            +
            ----|---------|------
         | 
| 1876 | 
            +
             |  | 
         | 
| 1854 1877 |  | 
| 1855 1878 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 1856 1879 |  | 
| @@ -1916,20 +1939,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 1916 1939 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/midi_player'"
         | 
| 1917 1940 | 
             
            ```
         | 
| 1918 1941 |  | 
| 1919 | 
            -
            Mac
         | 
| 1920 | 
            -
             | 
| 1921 | 
            -
            
         | 
| 1922 | 
            -
            
         | 
| 1923 | 
            -
             | 
| 1924 | 
            -
            Windows
         | 
| 1925 | 
            -
             | 
| 1926 | 
            -
            
         | 
| 1927 | 
            -
            
         | 
| 1928 | 
            -
             | 
| 1929 | 
            -
            Linux
         | 
| 1930 | 
            -
             | 
| 1931 | 
            -
            
         | 
| 1932 | 
            -
            
         | 
| 1942 | 
            +
            Mac | Windows | Linux
         | 
| 1943 | 
            +
            ----|---------|------
         | 
| 1944 | 
            +
              |   |  
         | 
| 1933 1945 |  | 
| 1934 1946 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 1935 1947 |  | 
| @@ -2139,17 +2151,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 2139 2151 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/control_gallery'"
         | 
| 2140 2152 | 
             
            ```
         | 
| 2141 2153 |  | 
| 2142 | 
            -
            Mac
         | 
| 2143 | 
            -
             | 
| 2144 | 
            -
            
         | 
| 2145 | 
            -
             | 
| 2146 | 
            -
            Windows
         | 
| 2147 | 
            -
             | 
| 2148 | 
            -
            
         | 
| 2149 | 
            -
             | 
| 2150 | 
            -
            Linux
         | 
| 2151 | 
            -
             | 
| 2152 | 
            -
            
         | 
| 2154 | 
            +
            Mac | Windows | Linux
         | 
| 2155 | 
            +
            ----|---------|------
         | 
| 2156 | 
            +
             |  | 
         | 
| 2153 2157 |  | 
| 2154 2158 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 2155 2159 |  | 
| @@ -2533,20 +2537,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 2533 2537 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/font_button'"
         | 
| 2534 2538 | 
             
            ```
         | 
| 2535 2539 |  | 
| 2536 | 
            -
            Mac
         | 
| 2537 | 
            -
             | 
| 2538 | 
            -
            
         | 
| 2539 | 
            -
            
         | 
| 2540 | 
            -
             | 
| 2541 | 
            -
            Windows
         | 
| 2542 | 
            -
             | 
| 2543 | 
            -
            
         | 
| 2544 | 
            -
            
         | 
| 2545 | 
            -
             | 
| 2546 | 
            -
            Linux
         | 
| 2547 | 
            -
             | 
| 2548 | 
            -
            
         | 
| 2549 | 
            -
            
         | 
| 2540 | 
            +
            Mac | Windows | Linux
         | 
| 2541 | 
            +
            ----|---------|------
         | 
| 2542 | 
            +
              |   |  
         | 
| 2550 2543 |  | 
| 2551 2544 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 2552 2545 |  | 
| @@ -2622,20 +2615,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 2622 2615 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/color_button'"
         | 
| 2623 2616 | 
             
            ```
         | 
| 2624 2617 |  | 
| 2625 | 
            -
            Mac
         | 
| 2626 | 
            -
             | 
| 2627 | 
            -
            
         | 
| 2628 | 
            -
            
         | 
| 2629 | 
            -
             | 
| 2630 | 
            -
            Windows
         | 
| 2631 | 
            -
             | 
| 2632 | 
            -
            
         | 
| 2633 | 
            -
            
         | 
| 2634 | 
            -
             | 
| 2635 | 
            -
            Linux
         | 
| 2636 | 
            -
             | 
| 2637 | 
            -
            
         | 
| 2638 | 
            -
            
         | 
| 2618 | 
            +
            Mac | Windows | Linux
         | 
| 2619 | 
            +
            ----|---------|------
         | 
| 2620 | 
            +
              |   |  
         | 
| 2639 2621 |  | 
| 2640 2622 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 2641 2623 |  | 
| @@ -2672,17 +2654,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 2672 2654 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/date_time_picker'"
         | 
| 2673 2655 | 
             
            ```
         | 
| 2674 2656 |  | 
| 2675 | 
            -
            Mac
         | 
| 2676 | 
            -
             | 
| 2677 | 
            -
            
         | 
| 2678 | 
            -
             | 
| 2679 | 
            -
            Windows
         | 
| 2680 | 
            -
             | 
| 2681 | 
            -
            
         | 
| 2682 | 
            -
             | 
| 2683 | 
            -
            Linux
         | 
| 2684 | 
            -
             | 
| 2685 | 
            -
            
         | 
| 2657 | 
            +
            Mac | Windows | Linux
         | 
| 2658 | 
            +
            ----|---------|------
         | 
| 2659 | 
            +
             |  | 
         | 
| 2686 2660 |  | 
| 2687 2661 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 2688 2662 |  | 
| @@ -2766,23 +2740,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 2766 2740 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/grid'"
         | 
| 2767 2741 | 
             
            ```
         | 
| 2768 2742 |  | 
| 2769 | 
            -
            Mac
         | 
| 2770 | 
            -
             | 
| 2771 | 
            -
            
         | 
| 2772 | 
            -
            
         | 
| 2773 | 
            -
            
         | 
| 2774 | 
            -
             | 
| 2775 | 
            -
            Windows
         | 
| 2776 | 
            -
             | 
| 2777 | 
            -
            
         | 
| 2778 | 
            -
            
         | 
| 2779 | 
            -
            
         | 
| 2780 | 
            -
             | 
| 2781 | 
            -
            Linux
         | 
| 2782 | 
            -
             | 
| 2783 | 
            -
            
         | 
| 2784 | 
            -
            
         | 
| 2785 | 
            -
            
         | 
| 2743 | 
            +
            Mac | Windows | Linux
         | 
| 2744 | 
            +
            ----|---------|------
         | 
| 2745 | 
            +
               |    |   
         | 
| 2786 2746 |  | 
| 2787 2747 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 2788 2748 |  | 
| @@ -2795,16 +2755,16 @@ window('Grid') { | |
| 2795 2755 | 
             
              tab {
         | 
| 2796 2756 | 
             
                tab_item('Span') {
         | 
| 2797 2757 | 
             
                  grid {
         | 
| 2798 | 
            -
                    4.times  | 
| 2799 | 
            -
                      4.times  | 
| 2758 | 
            +
                    4.times do |top_value|
         | 
| 2759 | 
            +
                      4.times do |left_value|
         | 
| 2800 2760 | 
             
                        label("(#{left_value}, #{top_value}) xspan1\nyspan1") {
         | 
| 2801 2761 | 
             
                          left left_value
         | 
| 2802 2762 | 
             
                          top top_value
         | 
| 2803 2763 | 
             
                          hexpand true
         | 
| 2804 2764 | 
             
                          vexpand true
         | 
| 2805 2765 | 
             
                        }
         | 
| 2806 | 
            -
                       | 
| 2807 | 
            -
                     | 
| 2766 | 
            +
                      end
         | 
| 2767 | 
            +
                    end
         | 
| 2808 2768 | 
             
                    label("(0, 4) xspan2\nyspan1 more text fits horizontally") {
         | 
| 2809 2769 | 
             
                      left 0
         | 
| 2810 2770 | 
             
                      top 4
         | 
| @@ -2911,20 +2871,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 2911 2871 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/form'"
         | 
| 2912 2872 | 
             
            ```
         | 
| 2913 2873 |  | 
| 2914 | 
            -
            Mac
         | 
| 2915 | 
            -
             | 
| 2916 | 
            -
            
         | 
| 2917 | 
            -
            
         | 
| 2918 | 
            -
             | 
| 2919 | 
            -
            Windows
         | 
| 2920 | 
            -
             | 
| 2921 | 
            -
            
         | 
| 2922 | 
            -
            
         | 
| 2923 | 
            -
             | 
| 2924 | 
            -
            Linux
         | 
| 2925 | 
            -
             | 
| 2926 | 
            -
            
         | 
| 2927 | 
            -
            
         | 
| 2874 | 
            +
            Mac | Windows | Linux
         | 
| 2875 | 
            +
            ----|---------|------
         | 
| 2876 | 
            +
              |   |  
         | 
| 2928 2877 |  | 
| 2929 2878 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 2930 2879 |  | 
| @@ -2982,17 +2931,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 2982 2931 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_table'"
         | 
| 2983 2932 | 
             
            ```
         | 
| 2984 2933 |  | 
| 2985 | 
            -
            Mac
         | 
| 2986 | 
            -
             | 
| 2987 | 
            -
            
         | 
| 2988 | 
            -
             | 
| 2989 | 
            -
            Windows
         | 
| 2990 | 
            -
             | 
| 2991 | 
            -
            
         | 
| 2992 | 
            -
             | 
| 2993 | 
            -
            Linux
         | 
| 2994 | 
            -
             | 
| 2995 | 
            -
            
         | 
| 2934 | 
            +
            Mac | Windows | Linux
         | 
| 2935 | 
            +
            ----|---------|------
         | 
| 2936 | 
            +
             |  | 
         | 
| 2996 2937 |  | 
| 2997 2938 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 2998 2939 |  | 
| @@ -3106,23 +3047,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3106 3047 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/editable_table'"
         | 
| 3107 3048 | 
             
            ```
         | 
| 3108 3049 |  | 
| 3109 | 
            -
            Mac
         | 
| 3110 | 
            -
             | 
| 3111 | 
            -
            
         | 
| 3112 | 
            -
            
         | 
| 3113 | 
            -
            
         | 
| 3114 | 
            -
             | 
| 3115 | 
            -
            Windows
         | 
| 3116 | 
            -
             | 
| 3117 | 
            -
            
         | 
| 3118 | 
            -
            
         | 
| 3119 | 
            -
            
         | 
| 3120 | 
            -
             | 
| 3121 | 
            -
            Linux
         | 
| 3122 | 
            -
             | 
| 3123 | 
            -
            
         | 
| 3124 | 
            -
            
         | 
| 3125 | 
            -
            
         | 
| 3050 | 
            +
            Mac | Windows | Linux
         | 
| 3051 | 
            +
            ----|---------|------
         | 
| 3052 | 
            +
               |    |   
         | 
| 3126 3053 |  | 
| 3127 3054 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3128 3055 |  | 
| @@ -3180,20 +3107,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3180 3107 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/editable_column_table'"
         | 
| 3181 3108 | 
             
            ```
         | 
| 3182 3109 |  | 
| 3183 | 
            -
            Mac
         | 
| 3184 | 
            -
             | 
| 3185 | 
            -
            
         | 
| 3186 | 
            -
            
         | 
| 3187 | 
            -
             | 
| 3188 | 
            -
            Windows
         | 
| 3189 | 
            -
             | 
| 3190 | 
            -
            
         | 
| 3191 | 
            -
            
         | 
| 3192 | 
            -
             | 
| 3193 | 
            -
            Linux
         | 
| 3194 | 
            -
             | 
| 3195 | 
            -
            
         | 
| 3196 | 
            -
            
         | 
| 3110 | 
            +
            Mac | Windows | Linux
         | 
| 3111 | 
            +
            ----|---------|------
         | 
| 3112 | 
            +
              |   |  
         | 
| 3197 3113 |  | 
| 3198 3114 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3199 3115 |  | 
| @@ -3247,17 +3163,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3247 3163 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_table_image'"
         | 
| 3248 3164 | 
             
            ```
         | 
| 3249 3165 |  | 
| 3250 | 
            -
            Mac
         | 
| 3251 | 
            -
             | 
| 3252 | 
            -
            
         | 
| 3253 | 
            -
             | 
| 3254 | 
            -
            Windows
         | 
| 3255 | 
            -
             | 
| 3256 | 
            -
            
         | 
| 3257 | 
            -
             | 
| 3258 | 
            -
            Linux
         | 
| 3259 | 
            -
             | 
| 3260 | 
            -
            
         | 
| 3166 | 
            +
            Mac | Windows | Linux
         | 
| 3167 | 
            +
            ----|---------|------
         | 
| 3168 | 
            +
             |  | 
         | 
| 3261 3169 |  | 
| 3262 3170 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 3263 3171 |  | 
| @@ -3438,17 +3346,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3438 3346 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_table_image_text'"
         | 
| 3439 3347 | 
             
            ```
         | 
| 3440 3348 |  | 
| 3441 | 
            -
            Mac
         | 
| 3442 | 
            -
             | 
| 3443 | 
            -
            
         | 
| 3444 | 
            -
             | 
| 3445 | 
            -
            Windows
         | 
| 3446 | 
            -
             | 
| 3447 | 
            -
            
         | 
| 3448 | 
            -
             | 
| 3449 | 
            -
            Linux
         | 
| 3450 | 
            -
             | 
| 3451 | 
            -
            
         | 
| 3349 | 
            +
            Mac | Windows | Linux
         | 
| 3350 | 
            +
            ----|---------|------
         | 
| 3351 | 
            +
             |  | 
         | 
| 3452 3352 |  | 
| 3453 3353 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3454 3354 |  | 
| @@ -3548,20 +3448,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3548 3448 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_table_button'"
         | 
| 3549 3449 | 
             
            ```
         | 
| 3550 3450 |  | 
| 3551 | 
            -
            Mac
         | 
| 3552 | 
            -
             | 
| 3553 | 
            -
            
         | 
| 3554 | 
            -
            
         | 
| 3555 | 
            -
             | 
| 3556 | 
            -
            Windows
         | 
| 3557 | 
            -
             | 
| 3558 | 
            -
            
         | 
| 3559 | 
            -
            
         | 
| 3560 | 
            -
             | 
| 3561 | 
            -
            Linux
         | 
| 3562 | 
            -
             | 
| 3563 | 
            -
            
         | 
| 3564 | 
            -
            
         | 
| 3451 | 
            +
            Mac | Windows | Linux
         | 
| 3452 | 
            +
            ----|---------|------
         | 
| 3453 | 
            +
              |   |  
         | 
| 3565 3454 |  | 
| 3566 3455 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3567 3456 |  | 
| @@ -3615,17 +3504,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3615 3504 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_table_checkbox'"
         | 
| 3616 3505 | 
             
            ```
         | 
| 3617 3506 |  | 
| 3618 | 
            -
            Mac
         | 
| 3619 | 
            -
             | 
| 3620 | 
            -
            
         | 
| 3621 | 
            -
             | 
| 3622 | 
            -
            Windows
         | 
| 3623 | 
            -
             | 
| 3624 | 
            -
            
         | 
| 3625 | 
            -
             | 
| 3626 | 
            -
            Linux
         | 
| 3627 | 
            -
             | 
| 3628 | 
            -
            
         | 
| 3507 | 
            +
            Mac | Windows | Linux
         | 
| 3508 | 
            +
            ----|---------|------
         | 
| 3509 | 
            +
             |  | 
         | 
| 3629 3510 |  | 
| 3630 3511 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3631 3512 |  | 
| @@ -3671,17 +3552,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3671 3552 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_table_checkbox_text'"
         | 
| 3672 3553 | 
             
            ```
         | 
| 3673 3554 |  | 
| 3674 | 
            -
            Mac
         | 
| 3675 | 
            -
             | 
| 3676 | 
            -
            
         | 
| 3677 | 
            -
             | 
| 3678 | 
            -
            Windows
         | 
| 3679 | 
            -
             | 
| 3680 | 
            -
            
         | 
| 3681 | 
            -
             | 
| 3682 | 
            -
            Linux
         | 
| 3683 | 
            -
             | 
| 3684 | 
            -
            
         | 
| 3555 | 
            +
            Mac | Windows | Linux
         | 
| 3556 | 
            +
            ----|---------|------
         | 
| 3557 | 
            +
             |  | 
         | 
| 3685 3558 |  | 
| 3686 3559 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3687 3560 |  | 
| @@ -3727,17 +3600,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3727 3600 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_table_progress_bar'"
         | 
| 3728 3601 | 
             
            ```
         | 
| 3729 3602 |  | 
| 3730 | 
            -
            Mac
         | 
| 3731 | 
            -
             | 
| 3732 | 
            -
            
         | 
| 3733 | 
            -
             | 
| 3734 | 
            -
            Windows
         | 
| 3735 | 
            -
             | 
| 3736 | 
            -
            
         | 
| 3737 | 
            -
             | 
| 3738 | 
            -
            Linux
         | 
| 3739 | 
            -
             | 
| 3740 | 
            -
            
         | 
| 3603 | 
            +
            Mac | Windows | Linux
         | 
| 3604 | 
            +
            ----|---------|------
         | 
| 3605 | 
            +
             |  | 
         | 
| 3741 3606 |  | 
| 3742 3607 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3743 3608 |  | 
| @@ -3792,17 +3657,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3792 3657 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_table_color'"
         | 
| 3793 3658 | 
             
            ```
         | 
| 3794 3659 |  | 
| 3795 | 
            -
            Mac
         | 
| 3796 | 
            -
             | 
| 3797 | 
            -
            
         | 
| 3798 | 
            -
             | 
| 3799 | 
            -
            Windows
         | 
| 3800 | 
            -
             | 
| 3801 | 
            -
            
         | 
| 3802 | 
            -
             | 
| 3803 | 
            -
            Linux
         | 
| 3804 | 
            -
             | 
| 3805 | 
            -
            
         | 
| 3660 | 
            +
            Mac | Windows | Linux
         | 
| 3661 | 
            +
            ----|---------|------
         | 
| 3662 | 
            +
             |  | 
         | 
| 3806 3663 |  | 
| 3807 3664 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3808 3665 |  | 
| @@ -3896,23 +3753,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 3896 3753 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/form_table'"
         | 
| 3897 3754 | 
             
            ```
         | 
| 3898 3755 |  | 
| 3899 | 
            -
            Mac
         | 
| 3900 | 
            -
             | 
| 3901 | 
            -
            
         | 
| 3902 | 
            -
            
         | 
| 3903 | 
            -
            
         | 
| 3904 | 
            -
             | 
| 3905 | 
            -
            Windows
         | 
| 3906 | 
            -
             | 
| 3907 | 
            -
            
         | 
| 3908 | 
            -
            
         | 
| 3909 | 
            -
            
         | 
| 3910 | 
            -
             | 
| 3911 | 
            -
            Linux
         | 
| 3912 | 
            -
             | 
| 3913 | 
            -
            
         | 
| 3914 | 
            -
            
         | 
| 3915 | 
            -
            
         | 
| 3756 | 
            +
            Mac | Windows | Linux
         | 
| 3757 | 
            +
            ----|---------|------
         | 
| 3758 | 
            +
               |    |   
         | 
| 3916 3759 |  | 
| 3917 3760 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3918 3761 |  | 
| @@ -3939,15 +3782,19 @@ window('Contacts', 600, 600) { |w| | |
| 3939 3782 | 
             
                  @name_entry = entry {
         | 
| 3940 3783 | 
             
                    label 'Name'
         | 
| 3941 3784 | 
             
                  }
         | 
| 3785 | 
            +
                  
         | 
| 3942 3786 | 
             
                  @email_entry = entry {
         | 
| 3943 3787 | 
             
                    label 'Email'
         | 
| 3944 3788 | 
             
                  }
         | 
| 3789 | 
            +
                  
         | 
| 3945 3790 | 
             
                  @phone_entry = entry {
         | 
| 3946 3791 | 
             
                    label 'Phone'
         | 
| 3947 3792 | 
             
                  }
         | 
| 3793 | 
            +
                  
         | 
| 3948 3794 | 
             
                  @city_entry = entry {
         | 
| 3949 3795 | 
             
                    label 'City'
         | 
| 3950 3796 | 
             
                  }
         | 
| 3797 | 
            +
                  
         | 
| 3951 3798 | 
             
                  @state_entry = entry {
         | 
| 3952 3799 | 
             
                    label 'State'
         | 
| 3953 3800 | 
             
                  }
         | 
| @@ -4024,17 +3871,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 4024 3871 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_area'"
         | 
| 4025 3872 | 
             
            ```
         | 
| 4026 3873 |  | 
| 4027 | 
            -
            Mac
         | 
| 4028 | 
            -
             | 
| 4029 | 
            -
            
         | 
| 4030 | 
            -
             | 
| 4031 | 
            -
            Windows
         | 
| 4032 | 
            -
             | 
| 4033 | 
            -
            
         | 
| 4034 | 
            -
             | 
| 4035 | 
            -
            Linux
         | 
| 4036 | 
            -
             | 
| 4037 | 
            -
            
         | 
| 3874 | 
            +
            Mac | Windows | Linux
         | 
| 3875 | 
            +
            ----|---------|------
         | 
| 3876 | 
            +
             |  | 
         | 
| 4038 3877 |  | 
| 4039 3878 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 4040 3879 |  | 
| @@ -4150,29 +3989,18 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 4150 3989 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/dynamic_area'"
         | 
| 4151 3990 | 
             
            ```
         | 
| 4152 3991 |  | 
| 4153 | 
            -
            Mac
         | 
| 3992 | 
            +
            Mac | Windows | Linux
         | 
| 3993 | 
            +
            ----|---------|------
         | 
| 3994 | 
            +
              |   |  
         | 
| 4154 3995 |  | 
| 4155 | 
            -
             | 
| 4156 | 
            -
            
         | 
| 4157 | 
            -
             | 
| 4158 | 
            -
            Windows
         | 
| 4159 | 
            -
             | 
| 4160 | 
            -
            
         | 
| 4161 | 
            -
            
         | 
| 4162 | 
            -
             | 
| 4163 | 
            -
            Linux
         | 
| 4164 | 
            -
             | 
| 4165 | 
            -
            
         | 
| 4166 | 
            -
            
         | 
| 4167 | 
            -
             | 
| 4168 | 
            -
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 3996 | 
            +
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 4169 3997 |  | 
| 4170 3998 | 
             
            ```ruby
         | 
| 4171 3999 | 
             
            require 'glimmer-dsl-libui'
         | 
| 4172 4000 |  | 
| 4173 4001 | 
             
            include Glimmer
         | 
| 4174 4002 |  | 
| 4175 | 
            -
            window('Dynamic Area', 240,  | 
| 4003 | 
            +
            window('Dynamic Area', 240, 600) {
         | 
| 4176 4004 | 
             
              margined true
         | 
| 4177 4005 |  | 
| 4178 4006 | 
             
              vertical_box {
         | 
| @@ -4258,9 +4086,7 @@ window('Dynamic Area', 240, 500) { | |
| 4258 4086 |  | 
| 4259 4087 | 
             
                @area = area {
         | 
| 4260 4088 | 
             
                  on_draw do |area_draw_params|
         | 
| 4261 | 
            -
                     | 
| 4262 | 
            -
                      rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value)
         | 
| 4263 | 
            -
                      
         | 
| 4089 | 
            +
                    rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value) { # a dynamic path is added semi-declaratively inside on_draw block
         | 
| 4264 4090 | 
             
                      fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
         | 
| 4265 4091 | 
             
                    }
         | 
| 4266 4092 | 
             
                  end
         | 
| @@ -4328,7 +4154,7 @@ window('Dynamic Area', 240, 600) { | |
| 4328 4154 | 
             
                    value 102
         | 
| 4329 4155 |  | 
| 4330 4156 | 
             
                    on_changed do
         | 
| 4331 | 
            -
                      @ | 
| 4157 | 
            +
                      @rectangle.fill[:r] = @red_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
         | 
| 4332 4158 | 
             
                    end
         | 
| 4333 4159 | 
             
                  }
         | 
| 4334 4160 |  | 
| @@ -4337,7 +4163,7 @@ window('Dynamic Area', 240, 600) { | |
| 4337 4163 | 
             
                    value 102
         | 
| 4338 4164 |  | 
| 4339 4165 | 
             
                    on_changed do
         | 
| 4340 | 
            -
                      @ | 
| 4166 | 
            +
                      @rectangle.fill[:g] = @green_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
         | 
| 4341 4167 | 
             
                    end
         | 
| 4342 4168 | 
             
                  }
         | 
| 4343 4169 |  | 
| @@ -4346,7 +4172,7 @@ window('Dynamic Area', 240, 600) { | |
| 4346 4172 | 
             
                    value 204
         | 
| 4347 4173 |  | 
| 4348 4174 | 
             
                    on_changed do
         | 
| 4349 | 
            -
                      @ | 
| 4175 | 
            +
                      @rectangle.fill[:b] = @blue_spinbox.value # updating hash properties automatically triggers area.queue_redraw_all
         | 
| 4350 4176 | 
             
                    end
         | 
| 4351 4177 | 
             
                  }
         | 
| 4352 4178 |  | 
| @@ -4355,15 +4181,13 @@ window('Dynamic Area', 240, 600) { | |
| 4355 4181 | 
             
                    value 100
         | 
| 4356 4182 |  | 
| 4357 4183 | 
             
                    on_changed do
         | 
| 4358 | 
            -
                      @ | 
| 4184 | 
            +
                      @rectangle.fill[:a] = @alpha_spinbox.value / 100.0 # updating hash properties automatically triggers area.queue_redraw_all
         | 
| 4359 4185 | 
             
                    end
         | 
| 4360 4186 | 
             
                  }
         | 
| 4361 4187 | 
             
                }
         | 
| 4362 4188 |  | 
| 4363 4189 | 
             
                area {
         | 
| 4364 | 
            -
                  @ | 
| 4365 | 
            -
                    @rectangle = rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value)
         | 
| 4366 | 
            -
                    
         | 
| 4190 | 
            +
                  @rectangle = rectangle(@x_spinbox.value, @y_spinbox.value, @width_spinbox.value, @height_spinbox.value) { # stable path
         | 
| 4367 4191 | 
             
                    fill r: @red_spinbox.value, g: @green_spinbox.value, b: @blue_spinbox.value, a: @alpha_spinbox.value / 100.0
         | 
| 4368 4192 | 
             
                  }
         | 
| 4369 4193 | 
             
                }
         | 
| @@ -4387,17 +4211,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 4387 4211 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/area_gallery'"
         | 
| 4388 4212 | 
             
            ```
         | 
| 4389 4213 |  | 
| 4390 | 
            -
            Mac
         | 
| 4391 | 
            -
             | 
| 4392 | 
            -
            
         | 
| 4393 | 
            -
             | 
| 4394 | 
            -
            Windows
         | 
| 4395 | 
            -
             | 
| 4396 | 
            -
            
         | 
| 4397 | 
            -
             | 
| 4398 | 
            -
            Linux
         | 
| 4399 | 
            -
             | 
| 4400 | 
            -
            
         | 
| 4214 | 
            +
            Mac | Windows | Linux
         | 
| 4215 | 
            +
            ----|---------|------
         | 
| 4216 | 
            +
             |  | 
         | 
| 4401 4217 |  | 
| 4402 4218 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 4403 4219 |  | 
| @@ -4408,50 +4224,50 @@ include Glimmer | |
| 4408 4224 |  | 
| 4409 4225 | 
             
            window('Area Gallery', 400, 400) {
         | 
| 4410 4226 | 
             
              area {
         | 
| 4411 | 
            -
                path { # declarative stable path
         | 
| 4227 | 
            +
                path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
         | 
| 4412 4228 | 
             
                  square(0, 0, 100)
         | 
| 4413 4229 | 
             
                  square(100, 100, 400)
         | 
| 4414 | 
            -
             | 
| 4230 | 
            +
                  
         | 
| 4415 4231 | 
             
                  fill r: 102, g: 102, b: 204
         | 
| 4416 4232 | 
             
                }
         | 
| 4417 | 
            -
                 | 
| 4233 | 
            +
                
         | 
| 4234 | 
            +
                path { # declarative stable path (explicit path syntax for multiple shapes sharing attributes)
         | 
| 4418 4235 | 
             
                  rectangle(0, 100, 100, 400)
         | 
| 4419 4236 | 
             
                  rectangle(100, 0, 400, 100)
         | 
| 4420 | 
            -
             | 
| 4237 | 
            +
                  
         | 
| 4421 4238 | 
             
                  # linear gradient (has x0, y0, x1, y1, and stops)
         | 
| 4422 4239 | 
             
                  fill x0: 10, y0: 10, x1: 350, y1: 350, stops: [{pos: 0.25, r: 204, g: 102, b: 204}, {pos: 0.75, r: 102, g: 102, b: 204}]
         | 
| 4423 4240 | 
             
                }
         | 
| 4424 | 
            -
                 | 
| 4425 | 
            -
             | 
| 4426 | 
            -
                  
         | 
| 4241 | 
            +
                
         | 
| 4242 | 
            +
                polygon(100, 100, 100, 400, 400, 100, 400, 400) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 4427 4243 | 
             
                  fill r: 202, g: 102, b: 104, a: 0.5
         | 
| 4428 4244 | 
             
                  stroke r: 0, g: 0, b: 0
         | 
| 4429 4245 | 
             
                }
         | 
| 4430 | 
            -
                 | 
| 4431 | 
            -
             | 
| 4432 | 
            -
             | 
| 4246 | 
            +
                
         | 
| 4247 | 
            +
                polybezier(0, 0,
         | 
| 4248 | 
            +
                           200, 100, 100, 200, 400, 100,
         | 
| 4249 | 
            +
                           300, 100, 100, 300, 100, 400,
         | 
| 4250 | 
            +
                           100, 300, 300, 100, 400, 400) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 4433 4251 | 
             
                  fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 4434 4252 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 4435 4253 | 
             
                }
         | 
| 4436 | 
            -
                path { # declarative stable path
         | 
| 4437 | 
            -
                  polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
         | 
| 4438 4254 |  | 
| 4255 | 
            +
                polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 4439 4256 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 4440 4257 | 
             
                }
         | 
| 4441 | 
            -
                 | 
| 4442 | 
            -
             | 
| 4443 | 
            -
             | 
| 4258 | 
            +
                
         | 
| 4259 | 
            +
                arc(404, 216, 190, 90, 90, false) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 4444 4260 | 
             
                  # radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
         | 
| 4445 4261 | 
             
                  fill outer_radius: 90, x0: 0, y0: 0, x1: 500, y1: 500, stops: [{pos: 0.25, r: 102, g: 102, b: 204, a: 0.5}, {pos: 0.75, r: 204, g: 102, b: 204}]
         | 
| 4446 4262 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 4447 4263 | 
             
                }
         | 
| 4448 | 
            -
                 | 
| 4449 | 
            -
             | 
| 4450 | 
            -
             | 
| 4264 | 
            +
                
         | 
| 4265 | 
            +
                circle(200, 200, 90) { # declarative stable path (implicit path syntax for a single shape nested directly under area)
         | 
| 4451 4266 | 
             
                  fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 4452 4267 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 4453 4268 | 
             
                }
         | 
| 4454 | 
            -
                 | 
| 4269 | 
            +
                
         | 
| 4270 | 
            +
                text(161, 40, 100) { # declarative stable text
         | 
| 4455 4271 | 
             
                  string('Area Gallery') {
         | 
| 4456 4272 | 
             
                    font family: 'Arial', size: (OS.mac? ? 14 : 11)
         | 
| 4457 4273 | 
             
                    color :black
         | 
| @@ -4518,12 +4334,13 @@ include Glimmer | |
| 4518 4334 |  | 
| 4519 4335 | 
             
            window('Area Gallery', 400, 400) {
         | 
| 4520 4336 | 
             
              area {
         | 
| 4521 | 
            -
                path { # declarative stable path
         | 
| 4337 | 
            +
                path { # declarative stable path with explicit attributes (explicit path syntax for multiple shapes sharing attributes)
         | 
| 4522 4338 | 
             
                  square {
         | 
| 4523 4339 | 
             
                    x 0
         | 
| 4524 4340 | 
             
                    y 0
         | 
| 4525 4341 | 
             
                    length 100
         | 
| 4526 4342 | 
             
                  }
         | 
| 4343 | 
            +
                  
         | 
| 4527 4344 | 
             
                  square {
         | 
| 4528 4345 | 
             
                    x 100
         | 
| 4529 4346 | 
             
                    y 100
         | 
| @@ -4532,13 +4349,15 @@ window('Area Gallery', 400, 400) { | |
| 4532 4349 |  | 
| 4533 4350 | 
             
                  fill r: 102, g: 102, b: 204
         | 
| 4534 4351 | 
             
                }
         | 
| 4535 | 
            -
                 | 
| 4352 | 
            +
                
         | 
| 4353 | 
            +
                path { # declarative stable path with explicit attributes (explicit path syntax for multiple shapes sharing attributes)
         | 
| 4536 4354 | 
             
                  rectangle {
         | 
| 4537 4355 | 
             
                    x 0
         | 
| 4538 4356 | 
             
                    y 100
         | 
| 4539 4357 | 
             
                    width 100
         | 
| 4540 4358 | 
             
                    height 400
         | 
| 4541 4359 | 
             
                  }
         | 
| 4360 | 
            +
                  
         | 
| 4542 4361 | 
             
                  rectangle {
         | 
| 4543 4362 | 
             
                    x 100
         | 
| 4544 4363 | 
             
                    y 0
         | 
| @@ -4549,115 +4368,114 @@ window('Area Gallery', 400, 400) { | |
| 4549 4368 | 
             
                  # linear gradient (has x0, y0, x1, y1, and stops)
         | 
| 4550 4369 | 
             
                  fill x0: 10, y0: 10, x1: 350, y1: 350, stops: [{pos: 0.25, r: 204, g: 102, b: 204}, {pos: 0.75, r: 102, g: 102, b: 204}]
         | 
| 4551 4370 | 
             
                }
         | 
| 4552 | 
            -
                 | 
| 4553 | 
            -
             | 
| 4371 | 
            +
                
         | 
| 4372 | 
            +
                figure { # declarative stable path with explicit attributes (implicit path syntax for a single shape nested directly under area)
         | 
| 4373 | 
            +
                  x 100
         | 
| 4374 | 
            +
                  y 100
         | 
| 4375 | 
            +
                  
         | 
| 4376 | 
            +
                  line {
         | 
| 4554 4377 | 
             
                    x 100
         | 
| 4378 | 
            +
                    y 400
         | 
| 4379 | 
            +
                  }
         | 
| 4380 | 
            +
                  
         | 
| 4381 | 
            +
                  line {
         | 
| 4382 | 
            +
                    x 400
         | 
| 4555 4383 | 
             
                    y 100
         | 
| 4556 | 
            -
             | 
| 4557 | 
            -
             | 
| 4558 | 
            -
             | 
| 4559 | 
            -
             | 
| 4560 | 
            -
                     | 
| 4561 | 
            -
                    line {
         | 
| 4562 | 
            -
                      x 400
         | 
| 4563 | 
            -
                      y 100
         | 
| 4564 | 
            -
                    }
         | 
| 4565 | 
            -
                    line {
         | 
| 4566 | 
            -
                      x 400
         | 
| 4567 | 
            -
                      y 400
         | 
| 4568 | 
            -
                    }
         | 
| 4569 | 
            -
             | 
| 4570 | 
            -
                    closed true
         | 
| 4384 | 
            +
                  }
         | 
| 4385 | 
            +
                  
         | 
| 4386 | 
            +
                  line {
         | 
| 4387 | 
            +
                    x 400
         | 
| 4388 | 
            +
                    y 400
         | 
| 4571 4389 | 
             
                  }
         | 
| 4572 4390 |  | 
| 4391 | 
            +
                  closed true # polygon figure is closed (last point forms a line with first point)
         | 
| 4573 4392 | 
             
                  fill r: 202, g: 102, b: 104, a: 0.5
         | 
| 4574 4393 | 
             
                  stroke r: 0, g: 0, b: 0
         | 
| 4575 4394 | 
             
                }
         | 
| 4576 | 
            -
                 | 
| 4577 | 
            -
             | 
| 4578 | 
            -
             | 
| 4579 | 
            -
             | 
| 4580 | 
            -
             | 
| 4581 | 
            -
             | 
| 4582 | 
            -
             | 
| 4583 | 
            -
             | 
| 4584 | 
            -
             | 
| 4585 | 
            -
             | 
| 4586 | 
            -
             | 
| 4587 | 
            -
             | 
| 4588 | 
            -
                    }
         | 
| 4589 | 
            -
                    bezier {
         | 
| 4590 | 
            -
                      c1_x 300
         | 
| 4591 | 
            -
                      c1_y 100
         | 
| 4592 | 
            -
                      c2_x 100
         | 
| 4593 | 
            -
                      c2_y 300
         | 
| 4594 | 
            -
                      end_x 100
         | 
| 4595 | 
            -
                      end_y 400
         | 
| 4596 | 
            -
                    }
         | 
| 4597 | 
            -
                    bezier {
         | 
| 4598 | 
            -
                      c1_x 100
         | 
| 4599 | 
            -
                      c1_y 300
         | 
| 4600 | 
            -
                      c2_x 300
         | 
| 4601 | 
            -
                      c2_y 100
         | 
| 4602 | 
            -
                      end_x 400
         | 
| 4603 | 
            -
                      end_y 400
         | 
| 4604 | 
            -
                    }
         | 
| 4395 | 
            +
                
         | 
| 4396 | 
            +
                figure { # declarative stable path with explicit attributes (implicit path syntax for a single shape nested directly under area)
         | 
| 4397 | 
            +
                  x 0
         | 
| 4398 | 
            +
                  y 0
         | 
| 4399 | 
            +
                  
         | 
| 4400 | 
            +
                  bezier {
         | 
| 4401 | 
            +
                    c1_x 200
         | 
| 4402 | 
            +
                    c1_y 100
         | 
| 4403 | 
            +
                    c2_x 100
         | 
| 4404 | 
            +
                    c2_y 200
         | 
| 4405 | 
            +
                    end_x 400
         | 
| 4406 | 
            +
                    end_y 100
         | 
| 4605 4407 | 
             
                  }
         | 
| 4606 | 
            -
             | 
| 4408 | 
            +
                  
         | 
| 4409 | 
            +
                  bezier {
         | 
| 4410 | 
            +
                    c1_x 300
         | 
| 4411 | 
            +
                    c1_y 100
         | 
| 4412 | 
            +
                    c2_x 100
         | 
| 4413 | 
            +
                    c2_y 300
         | 
| 4414 | 
            +
                    end_x 100
         | 
| 4415 | 
            +
                    end_y 400
         | 
| 4416 | 
            +
                  }
         | 
| 4417 | 
            +
                  
         | 
| 4418 | 
            +
                  bezier {
         | 
| 4419 | 
            +
                    c1_x 100
         | 
| 4420 | 
            +
                    c1_y 300
         | 
| 4421 | 
            +
                    c2_x 300
         | 
| 4422 | 
            +
                    c2_y 100
         | 
| 4423 | 
            +
                    end_x 400
         | 
| 4424 | 
            +
                    end_y 400
         | 
| 4425 | 
            +
                  }
         | 
| 4426 | 
            +
                  
         | 
| 4607 4427 | 
             
                  fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 4608 4428 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 4609 4429 | 
             
                }
         | 
| 4610 | 
            -
                 | 
| 4611 | 
            -
             | 
| 4612 | 
            -
                   | 
| 4613 | 
            -
             | 
| 4430 | 
            +
                
         | 
| 4431 | 
            +
                figure { # declarative stable path with explicit attributes (implicit path syntax for a single shape nested directly under area)
         | 
| 4432 | 
            +
                  x 100
         | 
| 4433 | 
            +
                  y 100
         | 
| 4434 | 
            +
                  
         | 
| 4435 | 
            +
                  line {
         | 
| 4436 | 
            +
                    x 400
         | 
| 4614 4437 | 
             
                    y 100
         | 
| 4615 | 
            -
                    
         | 
| 4616 | 
            -
                    line {
         | 
| 4617 | 
            -
                      x 400
         | 
| 4618 | 
            -
                      y 100
         | 
| 4619 | 
            -
                    }
         | 
| 4620 | 
            -
                    line {
         | 
| 4621 | 
            -
                      x 100
         | 
| 4622 | 
            -
                      y 400
         | 
| 4623 | 
            -
                    }
         | 
| 4624 | 
            -
                    line {
         | 
| 4625 | 
            -
                      x 400
         | 
| 4626 | 
            -
                      y 400
         | 
| 4627 | 
            -
                    }
         | 
| 4628 | 
            -
                    line {
         | 
| 4629 | 
            -
                      x 0
         | 
| 4630 | 
            -
                      y 0
         | 
| 4631 | 
            -
                    }
         | 
| 4632 4438 | 
             
                  }
         | 
| 4633 | 
            -
             | 
| 4439 | 
            +
                  
         | 
| 4440 | 
            +
                  line {
         | 
| 4441 | 
            +
                    x 100
         | 
| 4442 | 
            +
                    y 400
         | 
| 4443 | 
            +
                  }
         | 
| 4444 | 
            +
                  
         | 
| 4445 | 
            +
                  line {
         | 
| 4446 | 
            +
                    x 400
         | 
| 4447 | 
            +
                    y 400
         | 
| 4448 | 
            +
                  }
         | 
| 4449 | 
            +
                  
         | 
| 4450 | 
            +
                  line {
         | 
| 4451 | 
            +
                    x 0
         | 
| 4452 | 
            +
                    y 0
         | 
| 4453 | 
            +
                  }
         | 
| 4454 | 
            +
                  
         | 
| 4634 4455 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 4635 4456 | 
             
                }
         | 
| 4636 | 
            -
                 | 
| 4637 | 
            -
             | 
| 4638 | 
            -
             | 
| 4639 | 
            -
             | 
| 4640 | 
            -
             | 
| 4641 | 
            -
             | 
| 4642 | 
            -
             | 
| 4643 | 
            -
             | 
| 4644 | 
            -
                  }
         | 
| 4645 | 
            -
             | 
| 4457 | 
            +
                
         | 
| 4458 | 
            +
                arc { # declarative stable path with explicit attributes (implicit path syntax for a single shape nested directly under area)
         | 
| 4459 | 
            +
                  x_center 404
         | 
| 4460 | 
            +
                  y_center 216
         | 
| 4461 | 
            +
                  radius 190
         | 
| 4462 | 
            +
                  start_angle 90
         | 
| 4463 | 
            +
                  sweep 90
         | 
| 4464 | 
            +
                  is_negative false
         | 
| 4646 4465 | 
             
                  # radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
         | 
| 4647 4466 | 
             
                  fill outer_radius: 90, x0: 0, y0: 0, x1: 500, y1: 500, stops: [{pos: 0.25, r: 102, g: 102, b: 204, a: 0.5}, {pos: 0.75, r: 204, g: 102, b: 204}]
         | 
| 4648 4467 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 4649 4468 | 
             
                }
         | 
| 4650 | 
            -
                 | 
| 4651 | 
            -
             | 
| 4652 | 
            -
             | 
| 4653 | 
            -
             | 
| 4654 | 
            -
             | 
| 4655 | 
            -
                  }
         | 
| 4656 | 
            -
             | 
| 4469 | 
            +
                
         | 
| 4470 | 
            +
                circle { # declarative stable path with explicit attributes (implicit path syntax for a single shape nested directly under area)
         | 
| 4471 | 
            +
                  x_center 200
         | 
| 4472 | 
            +
                  y_center 200
         | 
| 4473 | 
            +
                  radius 90
         | 
| 4657 4474 | 
             
                  fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 4658 4475 | 
             
                  stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 4659 4476 | 
             
                }
         | 
| 4660 | 
            -
                 | 
| 4477 | 
            +
                
         | 
| 4478 | 
            +
                text { # declarative stable text with explicit attributes
         | 
| 4661 4479 | 
             
                  x 161
         | 
| 4662 4480 | 
             
                  y 40
         | 
| 4663 4481 | 
             
                  width 100
         | 
| @@ -4731,50 +4549,50 @@ include Glimmer | |
| 4731 4549 | 
             
            window('Area Gallery', 400, 400) {
         | 
| 4732 4550 | 
             
              area {
         | 
| 4733 4551 | 
             
                on_draw do |area_draw_params|
         | 
| 4734 | 
            -
                  path { #  | 
| 4552 | 
            +
                  path { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4735 4553 | 
             
                    square(0, 0, 100)
         | 
| 4736 4554 | 
             
                    square(100, 100, 400)
         | 
| 4737 | 
            -
             | 
| 4555 | 
            +
                    
         | 
| 4738 4556 | 
             
                    fill r: 102, g: 102, b: 204
         | 
| 4739 4557 | 
             
                  }
         | 
| 4740 | 
            -
                   | 
| 4558 | 
            +
                  
         | 
| 4559 | 
            +
                  path { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4741 4560 | 
             
                    rectangle(0, 100, 100, 400)
         | 
| 4742 4561 | 
             
                    rectangle(100, 0, 400, 100)
         | 
| 4743 | 
            -
             | 
| 4562 | 
            +
                    
         | 
| 4744 4563 | 
             
                    # linear gradient (has x0, y0, x1, y1, and stops)
         | 
| 4745 4564 | 
             
                    fill x0: 10, y0: 10, x1: 350, y1: 350, stops: [{pos: 0.25, r: 204, g: 102, b: 204}, {pos: 0.75, r: 102, g: 102, b: 204}]
         | 
| 4746 4565 | 
             
                  }
         | 
| 4747 | 
            -
                   | 
| 4748 | 
            -
             | 
| 4749 | 
            -
                    
         | 
| 4566 | 
            +
                  
         | 
| 4567 | 
            +
                  polygon(100, 100, 100, 400, 400, 100, 400, 400) { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4750 4568 | 
             
                    fill r: 202, g: 102, b: 104, a: 0.5
         | 
| 4751 4569 | 
             
                    stroke r: 0, g: 0, b: 0
         | 
| 4752 4570 | 
             
                  }
         | 
| 4753 | 
            -
                   | 
| 4754 | 
            -
             | 
| 4755 | 
            -
             | 
| 4571 | 
            +
                  
         | 
| 4572 | 
            +
                  polybezier(0, 0,
         | 
| 4573 | 
            +
                             200, 100, 100, 200, 400, 100,
         | 
| 4574 | 
            +
                             300, 100, 100, 300, 100, 400,
         | 
| 4575 | 
            +
                             100, 300, 300, 100, 400, 400) { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4756 4576 | 
             
                    fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 4757 4577 | 
             
                    stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 4758 4578 | 
             
                  }
         | 
| 4759 | 
            -
                  path { # a dynamic path is added semi-declaratively inside on_draw block
         | 
| 4760 | 
            -
                    polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0)
         | 
| 4761 4579 |  | 
| 4580 | 
            +
                  polyline(100, 100, 400, 100, 100, 400, 400, 400, 0, 0) { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4762 4581 | 
             
                    stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 4763 4582 | 
             
                  }
         | 
| 4764 | 
            -
                   | 
| 4765 | 
            -
             | 
| 4766 | 
            -
              
         | 
| 4583 | 
            +
                  
         | 
| 4584 | 
            +
                  arc(404, 216, 190, 90, 90, false) { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4767 4585 | 
             
                    # radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
         | 
| 4768 4586 | 
             
                    fill outer_radius: 90, x0: 0, y0: 0, x1: 500, y1: 500, stops: [{pos: 0.25, r: 102, g: 102, b: 204, a: 0.5}, {pos: 0.75, r: 204, g: 102, b: 204}]
         | 
| 4769 4587 | 
             
                    stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 4770 4588 | 
             
                  }
         | 
| 4771 | 
            -
                   | 
| 4772 | 
            -
             | 
| 4773 | 
            -
              
         | 
| 4589 | 
            +
                  
         | 
| 4590 | 
            +
                  circle(200, 200, 90) { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4774 4591 | 
             
                    fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 4775 4592 | 
             
                    stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 4776 4593 | 
             
                  }
         | 
| 4777 | 
            -
                   | 
| 4594 | 
            +
                  
         | 
| 4595 | 
            +
                  text(161, 40, 100) { # dynamic text added semi-declaratively inside on_draw block
         | 
| 4778 4596 | 
             
                    string('Area Gallery') {
         | 
| 4779 4597 | 
             
                      font family: 'Arial', size: (OS.mac? ? 14 : 11)
         | 
| 4780 4598 | 
             
                      color :black
         | 
| @@ -4843,12 +4661,13 @@ include Glimmer | |
| 4843 4661 | 
             
            window('Area Gallery', 400, 400) {
         | 
| 4844 4662 | 
             
              area {
         | 
| 4845 4663 | 
             
                on_draw do |area_draw_params|
         | 
| 4846 | 
            -
                  path { #  | 
| 4664 | 
            +
                  path { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4847 4665 | 
             
                    square {
         | 
| 4848 4666 | 
             
                      x 0
         | 
| 4849 4667 | 
             
                      y 0
         | 
| 4850 4668 | 
             
                      length 100
         | 
| 4851 4669 | 
             
                    }
         | 
| 4670 | 
            +
                    
         | 
| 4852 4671 | 
             
                    square {
         | 
| 4853 4672 | 
             
                      x 100
         | 
| 4854 4673 | 
             
                      y 100
         | 
| @@ -4857,13 +4676,15 @@ window('Area Gallery', 400, 400) { | |
| 4857 4676 |  | 
| 4858 4677 | 
             
                    fill r: 102, g: 102, b: 204
         | 
| 4859 4678 | 
             
                  }
         | 
| 4860 | 
            -
                   | 
| 4679 | 
            +
                  
         | 
| 4680 | 
            +
                  path { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4861 4681 | 
             
                    rectangle {
         | 
| 4862 4682 | 
             
                      x 0
         | 
| 4863 4683 | 
             
                      y 100
         | 
| 4864 4684 | 
             
                      width 100
         | 
| 4865 4685 | 
             
                      height 400
         | 
| 4866 4686 | 
             
                    }
         | 
| 4687 | 
            +
                    
         | 
| 4867 4688 | 
             
                    rectangle {
         | 
| 4868 4689 | 
             
                      x 100
         | 
| 4869 4690 | 
             
                      y 0
         | 
| @@ -4874,115 +4695,114 @@ window('Area Gallery', 400, 400) { | |
| 4874 4695 | 
             
                    # linear gradient (has x0, y0, x1, y1, and stops)
         | 
| 4875 4696 | 
             
                    fill x0: 10, y0: 10, x1: 350, y1: 350, stops: [{pos: 0.25, r: 204, g: 102, b: 204}, {pos: 0.75, r: 102, g: 102, b: 204}]
         | 
| 4876 4697 | 
             
                  }
         | 
| 4877 | 
            -
                   | 
| 4878 | 
            -
             | 
| 4698 | 
            +
                  
         | 
| 4699 | 
            +
                  figure { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4700 | 
            +
                    x 100
         | 
| 4701 | 
            +
                    y 100
         | 
| 4702 | 
            +
                    
         | 
| 4703 | 
            +
                    line {
         | 
| 4879 4704 | 
             
                      x 100
         | 
| 4705 | 
            +
                      y 400
         | 
| 4706 | 
            +
                    }
         | 
| 4707 | 
            +
                    
         | 
| 4708 | 
            +
                    line {
         | 
| 4709 | 
            +
                      x 400
         | 
| 4880 4710 | 
             
                      y 100
         | 
| 4881 | 
            -
             | 
| 4882 | 
            -
             | 
| 4883 | 
            -
             | 
| 4884 | 
            -
             | 
| 4885 | 
            -
                       | 
| 4886 | 
            -
                      line {
         | 
| 4887 | 
            -
                        x 400
         | 
| 4888 | 
            -
                        y 100
         | 
| 4889 | 
            -
                      }
         | 
| 4890 | 
            -
                      line {
         | 
| 4891 | 
            -
                        x 400
         | 
| 4892 | 
            -
                        y 400
         | 
| 4893 | 
            -
                      }
         | 
| 4894 | 
            -
              
         | 
| 4895 | 
            -
                      closed true
         | 
| 4711 | 
            +
                    }
         | 
| 4712 | 
            +
                    
         | 
| 4713 | 
            +
                    line {
         | 
| 4714 | 
            +
                      x 400
         | 
| 4715 | 
            +
                      y 400
         | 
| 4896 4716 | 
             
                    }
         | 
| 4897 4717 |  | 
| 4718 | 
            +
                    closed true # polygon figure is closed (last point forms a line with first point)
         | 
| 4898 4719 | 
             
                    fill r: 202, g: 102, b: 104, a: 0.5
         | 
| 4899 4720 | 
             
                    stroke r: 0, g: 0, b: 0
         | 
| 4900 4721 | 
             
                  }
         | 
| 4901 | 
            -
                   | 
| 4902 | 
            -
             | 
| 4903 | 
            -
             | 
| 4904 | 
            -
             | 
| 4905 | 
            -
             | 
| 4906 | 
            -
             | 
| 4907 | 
            -
             | 
| 4908 | 
            -
             | 
| 4909 | 
            -
             | 
| 4910 | 
            -
             | 
| 4911 | 
            -
             | 
| 4912 | 
            -
             | 
| 4913 | 
            -
                      }
         | 
| 4914 | 
            -
                      bezier {
         | 
| 4915 | 
            -
                        c1_x 300
         | 
| 4916 | 
            -
                        c1_y 100
         | 
| 4917 | 
            -
                        c2_x 100
         | 
| 4918 | 
            -
                        c2_y 300
         | 
| 4919 | 
            -
                        end_x 100
         | 
| 4920 | 
            -
                        end_y 400
         | 
| 4921 | 
            -
                      }
         | 
| 4922 | 
            -
                      bezier {
         | 
| 4923 | 
            -
                        c1_x 100
         | 
| 4924 | 
            -
                        c1_y 300
         | 
| 4925 | 
            -
                        c2_x 300
         | 
| 4926 | 
            -
                        c2_y 100
         | 
| 4927 | 
            -
                        end_x 400
         | 
| 4928 | 
            -
                        end_y 400
         | 
| 4929 | 
            -
                      }
         | 
| 4722 | 
            +
                  
         | 
| 4723 | 
            +
                  figure { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4724 | 
            +
                    x 0
         | 
| 4725 | 
            +
                    y 0
         | 
| 4726 | 
            +
                    
         | 
| 4727 | 
            +
                    bezier {
         | 
| 4728 | 
            +
                      c1_x 200
         | 
| 4729 | 
            +
                      c1_y 100
         | 
| 4730 | 
            +
                      c2_x 100
         | 
| 4731 | 
            +
                      c2_y 200
         | 
| 4732 | 
            +
                      end_x 400
         | 
| 4733 | 
            +
                      end_y 100
         | 
| 4930 4734 | 
             
                    }
         | 
| 4931 | 
            -
             | 
| 4735 | 
            +
                    
         | 
| 4736 | 
            +
                    bezier {
         | 
| 4737 | 
            +
                      c1_x 300
         | 
| 4738 | 
            +
                      c1_y 100
         | 
| 4739 | 
            +
                      c2_x 100
         | 
| 4740 | 
            +
                      c2_y 300
         | 
| 4741 | 
            +
                      end_x 100
         | 
| 4742 | 
            +
                      end_y 400
         | 
| 4743 | 
            +
                    }
         | 
| 4744 | 
            +
                    
         | 
| 4745 | 
            +
                    bezier {
         | 
| 4746 | 
            +
                      c1_x 100
         | 
| 4747 | 
            +
                      c1_y 300
         | 
| 4748 | 
            +
                      c2_x 300
         | 
| 4749 | 
            +
                      c2_y 100
         | 
| 4750 | 
            +
                      end_x 400
         | 
| 4751 | 
            +
                      end_y 400
         | 
| 4752 | 
            +
                    }
         | 
| 4753 | 
            +
                    
         | 
| 4932 4754 | 
             
                    fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 4933 4755 | 
             
                    stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 4934 4756 | 
             
                  }
         | 
| 4935 | 
            -
                   | 
| 4936 | 
            -
             | 
| 4937 | 
            -
                     | 
| 4938 | 
            -
             | 
| 4757 | 
            +
                  
         | 
| 4758 | 
            +
                  figure { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4759 | 
            +
                    x 100
         | 
| 4760 | 
            +
                    y 100
         | 
| 4761 | 
            +
                    
         | 
| 4762 | 
            +
                    line {
         | 
| 4763 | 
            +
                      x 400
         | 
| 4939 4764 | 
             
                      y 100
         | 
| 4940 | 
            -
                      
         | 
| 4941 | 
            -
                      line {
         | 
| 4942 | 
            -
                        x 400
         | 
| 4943 | 
            -
                        y 100
         | 
| 4944 | 
            -
                      }
         | 
| 4945 | 
            -
                      line {
         | 
| 4946 | 
            -
                        x 100
         | 
| 4947 | 
            -
                        y 400
         | 
| 4948 | 
            -
                      }
         | 
| 4949 | 
            -
                      line {
         | 
| 4950 | 
            -
                        x 400
         | 
| 4951 | 
            -
                        y 400
         | 
| 4952 | 
            -
                      }
         | 
| 4953 | 
            -
                      line {
         | 
| 4954 | 
            -
                        x 0
         | 
| 4955 | 
            -
                        y 0
         | 
| 4956 | 
            -
                      }
         | 
| 4957 4765 | 
             
                    }
         | 
| 4958 | 
            -
             | 
| 4766 | 
            +
                    
         | 
| 4767 | 
            +
                    line {
         | 
| 4768 | 
            +
                      x 100
         | 
| 4769 | 
            +
                      y 400
         | 
| 4770 | 
            +
                    }
         | 
| 4771 | 
            +
                    
         | 
| 4772 | 
            +
                    line {
         | 
| 4773 | 
            +
                      x 400
         | 
| 4774 | 
            +
                      y 400
         | 
| 4775 | 
            +
                    }
         | 
| 4776 | 
            +
                    
         | 
| 4777 | 
            +
                    line {
         | 
| 4778 | 
            +
                      x 0
         | 
| 4779 | 
            +
                      y 0
         | 
| 4780 | 
            +
                    }
         | 
| 4781 | 
            +
                    
         | 
| 4959 4782 | 
             
                    stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 4960 4783 | 
             
                  }
         | 
| 4961 | 
            -
                   | 
| 4962 | 
            -
             | 
| 4963 | 
            -
             | 
| 4964 | 
            -
             | 
| 4965 | 
            -
             | 
| 4966 | 
            -
             | 
| 4967 | 
            -
             | 
| 4968 | 
            -
             | 
| 4969 | 
            -
                    }
         | 
| 4970 | 
            -
              
         | 
| 4784 | 
            +
                  
         | 
| 4785 | 
            +
                  arc { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4786 | 
            +
                    x_center 404
         | 
| 4787 | 
            +
                    y_center 216
         | 
| 4788 | 
            +
                    radius 190
         | 
| 4789 | 
            +
                    start_angle 90
         | 
| 4790 | 
            +
                    sweep 90
         | 
| 4791 | 
            +
                    is_negative false
         | 
| 4971 4792 | 
             
                    # radial gradient (has an outer_radius in addition to x0, y0, x1, y1, and stops)
         | 
| 4972 4793 | 
             
                    fill outer_radius: 90, x0: 0, y0: 0, x1: 500, y1: 500, stops: [{pos: 0.25, r: 102, g: 102, b: 204, a: 0.5}, {pos: 0.75, r: 204, g: 102, b: 204}]
         | 
| 4973 4794 | 
             
                    stroke r: 0, g: 0, b: 0, thickness: 2, dashes: [50, 10, 10, 10], dash_phase: -50.0
         | 
| 4974 4795 | 
             
                  }
         | 
| 4975 | 
            -
                   | 
| 4976 | 
            -
             | 
| 4977 | 
            -
             | 
| 4978 | 
            -
             | 
| 4979 | 
            -
             | 
| 4980 | 
            -
                    }
         | 
| 4981 | 
            -
              
         | 
| 4796 | 
            +
                  
         | 
| 4797 | 
            +
                  circle { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4798 | 
            +
                    x_center 200
         | 
| 4799 | 
            +
                    y_center 200
         | 
| 4800 | 
            +
                    radius 90
         | 
| 4982 4801 | 
             
                    fill r: 202, g: 102, b: 204, a: 0.5
         | 
| 4983 4802 | 
             
                    stroke r: 0, g: 0, b: 0, thickness: 2
         | 
| 4984 4803 | 
             
                  }
         | 
| 4985 | 
            -
                   | 
| 4804 | 
            +
                  
         | 
| 4805 | 
            +
                  text { # dynamic path, added semi-declaratively inside on_draw block
         | 
| 4986 4806 | 
             
                    x 161
         | 
| 4987 4807 | 
             
                    y 40
         | 
| 4988 4808 | 
             
                    width 100
         | 
| @@ -5063,13 +4883,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 5063 4883 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_image'"
         | 
| 5064 4884 | 
             
            ```
         | 
| 5065 4885 |  | 
| 5066 | 
            -
            Mac
         | 
| 5067 | 
            -
             | 
| 5068 | 
            -
            
         | 
| 5069 | 
            -
             | 
| 5070 | 
            -
            Windows
         | 
| 5071 | 
            -
             | 
| 5072 | 
            -
            
         | 
| 4886 | 
            +
            Mac | Windows | Linux
         | 
| 4887 | 
            +
            ----|---------|------
         | 
| 4888 | 
            +
             |  | 
         | 
| 5073 4889 |  | 
| 5074 4890 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 5075 4891 |  | 
| @@ -5257,17 +5073,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 5257 5073 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/histogram'"
         | 
| 5258 5074 | 
             
            ```
         | 
| 5259 5075 |  | 
| 5260 | 
            -
            Mac
         | 
| 5261 | 
            -
             | 
| 5262 | 
            -
            
         | 
| 5263 | 
            -
             | 
| 5264 | 
            -
            Windows
         | 
| 5265 | 
            -
             | 
| 5266 | 
            -
            
         | 
| 5267 | 
            -
             | 
| 5268 | 
            -
            Linux
         | 
| 5269 | 
            -
             | 
| 5270 | 
            -
            
         | 
| 5076 | 
            +
            Mac | Windows | Linux
         | 
| 5077 | 
            +
            ----|---------|------
         | 
| 5078 | 
            +
             |  | 
         | 
| 5271 5079 |  | 
| 5272 5080 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 5273 5081 |  | 
| @@ -5595,19 +5403,46 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 5595 5403 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_transform'"
         | 
| 5596 5404 | 
             
            ```
         | 
| 5597 5405 |  | 
| 5598 | 
            -
            Mac
         | 
| 5406 | 
            +
            Mac | Windows | Linux
         | 
| 5407 | 
            +
            ----|---------|------
         | 
| 5408 | 
            +
             |  | 
         | 
| 5599 5409 |  | 
| 5600 | 
            -
             | 
| 5601 | 
            -
             | 
| 5602 | 
            -
            Windows
         | 
| 5410 | 
            +
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 5603 5411 |  | 
| 5604 | 
            -
             | 
| 5412 | 
            +
            ```ruby
         | 
| 5413 | 
            +
            require 'glimmer-dsl-libui'
         | 
| 5605 5414 |  | 
| 5606 | 
            -
             | 
| 5415 | 
            +
            include Glimmer
         | 
| 5607 5416 |  | 
| 5608 | 
            -
             | 
| 5417 | 
            +
            window('Basic Transform', 350, 350) {
         | 
| 5418 | 
            +
              area {
         | 
| 5419 | 
            +
                square(0, 0, 350) {
         | 
| 5420 | 
            +
                  fill r: 255, g: 255, b: 0
         | 
| 5421 | 
            +
                }
         | 
| 5422 | 
            +
                40.times do |n|
         | 
| 5423 | 
            +
                  square(0, 0, 100) {
         | 
| 5424 | 
            +
                    fill r: [255 - n*5, 0].max, g: [n*5, 255].min, b: 0, a: 0.5
         | 
| 5425 | 
            +
                    stroke :black, thickness: 2
         | 
| 5426 | 
            +
                    
         | 
| 5427 | 
            +
                    transform {
         | 
| 5428 | 
            +
                      unless OS.windows?
         | 
| 5429 | 
            +
                        skew 0.15, 0.15
         | 
| 5430 | 
            +
                        translate 50, 50
         | 
| 5431 | 
            +
                      end
         | 
| 5432 | 
            +
                      rotate 100, 100, -9 * n
         | 
| 5433 | 
            +
                      scale 1.1, 1.1
         | 
| 5434 | 
            +
                      if OS.windows?
         | 
| 5435 | 
            +
                        skew 0.15, 0.15
         | 
| 5436 | 
            +
                        translate 50, 50
         | 
| 5437 | 
            +
                      end
         | 
| 5438 | 
            +
                    }
         | 
| 5439 | 
            +
                  }
         | 
| 5440 | 
            +
                end
         | 
| 5441 | 
            +
              }
         | 
| 5442 | 
            +
            }.show
         | 
| 5443 | 
            +
            ```
         | 
| 5609 5444 |  | 
| 5610 | 
            -
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 5445 | 
            +
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version 2:
         | 
| 5611 5446 |  | 
| 5612 5447 | 
             
            ```ruby
         | 
| 5613 5448 | 
             
            require 'glimmer-dsl-libui'
         | 
| @@ -5627,11 +5462,18 @@ window('Basic Transform', 350, 350) { | |
| 5627 5462 |  | 
| 5628 5463 | 
             
                    fill r: [255 - n*5, 0].max, g: [n*5, 255].min, b: 0, a: 0.5
         | 
| 5629 5464 | 
             
                    stroke :black, thickness: 2
         | 
| 5465 | 
            +
                    
         | 
| 5630 5466 | 
             
                    transform {
         | 
| 5631 | 
            -
                       | 
| 5632 | 
            -
             | 
| 5467 | 
            +
                      unless OS.windows?
         | 
| 5468 | 
            +
                        skew 0.15, 0.15
         | 
| 5469 | 
            +
                        translate 50, 50
         | 
| 5470 | 
            +
                      end
         | 
| 5633 5471 | 
             
                      rotate 100, 100, -9 * n
         | 
| 5634 5472 | 
             
                      scale 1.1, 1.1
         | 
| 5473 | 
            +
                      if OS.windows?
         | 
| 5474 | 
            +
                        skew 0.15, 0.15
         | 
| 5475 | 
            +
                        translate 50, 50
         | 
| 5476 | 
            +
                      end
         | 
| 5635 5477 | 
             
                    }
         | 
| 5636 5478 | 
             
                  }
         | 
| 5637 5479 | 
             
                end
         | 
| @@ -5655,20 +5497,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 5655 5497 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/login'"
         | 
| 5656 5498 | 
             
            ```
         | 
| 5657 5499 |  | 
| 5658 | 
            -
            Mac
         | 
| 5659 | 
            -
             | 
| 5660 | 
            -
            
         | 
| 5661 | 
            -
            
         | 
| 5662 | 
            -
             | 
| 5663 | 
            -
            Windows
         | 
| 5664 | 
            -
             | 
| 5665 | 
            -
            
         | 
| 5666 | 
            -
            
         | 
| 5667 | 
            -
             | 
| 5668 | 
            -
            Linux
         | 
| 5669 | 
            -
             | 
| 5670 | 
            -
            
         | 
| 5671 | 
            -
            
         | 
| 5500 | 
            +
            Mac | Windows | Linux
         | 
| 5501 | 
            +
            ----|---------|------
         | 
| 5502 | 
            +
              |   |  
         | 
| 5672 5503 |  | 
| 5673 5504 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 5674 5505 |  | 
| @@ -5736,20 +5567,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 5736 5567 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/timer'"
         | 
| 5737 5568 | 
             
            ```
         | 
| 5738 5569 |  | 
| 5739 | 
            -
            Mac
         | 
| 5740 | 
            -
             | 
| 5741 | 
            -
            
         | 
| 5742 | 
            -
            
         | 
| 5743 | 
            -
             | 
| 5744 | 
            -
            Windows
         | 
| 5745 | 
            -
             | 
| 5746 | 
            -
            
         | 
| 5747 | 
            -
            
         | 
| 5748 | 
            -
             | 
| 5749 | 
            -
            Linux
         | 
| 5750 | 
            -
             | 
| 5751 | 
            -
            
         | 
| 5752 | 
            -
            
         | 
| 5570 | 
            +
            Mac | Windows | Linux
         | 
| 5571 | 
            +
            ----|---------|------
         | 
| 5572 | 
            +
              |   |  
         | 
| 5753 5573 |  | 
| 5754 5574 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 5755 5575 |  | 
| @@ -5905,23 +5725,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 5905 5725 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/color_the_circles'"
         | 
| 5906 5726 | 
             
            ```
         | 
| 5907 5727 |  | 
| 5908 | 
            -
            Mac
         | 
| 5909 | 
            -
             | 
| 5910 | 
            -
            
         | 
| 5911 | 
            -
            
         | 
| 5912 | 
            -
            
         | 
| 5913 | 
            -
             | 
| 5914 | 
            -
            Windows
         | 
| 5915 | 
            -
             | 
| 5916 | 
            -
            
         | 
| 5917 | 
            -
            
         | 
| 5918 | 
            -
            
         | 
| 5919 | 
            -
             | 
| 5920 | 
            -
            Linux
         | 
| 5921 | 
            -
             | 
| 5922 | 
            -
            
         | 
| 5923 | 
            -
            
         | 
| 5924 | 
            -
            
         | 
| 5728 | 
            +
            Mac | Windows | Linux
         | 
| 5729 | 
            +
            ----|---------|------
         | 
| 5730 | 
            +
               |    |   
         | 
| 5925 5731 |  | 
| 5926 5732 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 5927 5733 |  | 
| @@ -5955,15 +5761,17 @@ class ColorTheCircles | |
| 5955 5761 |  | 
| 5956 5762 | 
             
              def register_observers
         | 
| 5957 5763 | 
             
                observer = Glimmer::DataBinding::Observer.proc do |new_score|
         | 
| 5958 | 
            -
                   | 
| 5959 | 
            -
             | 
| 5960 | 
            -
                     | 
| 5961 | 
            -
             | 
| 5962 | 
            -
             | 
| 5963 | 
            -
             | 
| 5964 | 
            -
                     | 
| 5965 | 
            -
             | 
| 5966 | 
            -
             | 
| 5764 | 
            +
                  Glimmer::LibUI.queue_main do
         | 
| 5765 | 
            +
                    @score_label.text = new_score.to_s
         | 
| 5766 | 
            +
                    if new_score == -20
         | 
| 5767 | 
            +
                      @game_over = true
         | 
| 5768 | 
            +
                      msg_box('You Lost!', 'Sorry! Your score reached -20')
         | 
| 5769 | 
            +
                      restart_game
         | 
| 5770 | 
            +
                    elsif new_score == 0
         | 
| 5771 | 
            +
                      @game_over = true
         | 
| 5772 | 
            +
                      msg_box('You Won!', 'Congratulations! Your score reached 0')
         | 
| 5773 | 
            +
                      restart_game
         | 
| 5774 | 
            +
                    end
         | 
| 5967 5775 | 
             
                  end
         | 
| 5968 5776 | 
             
                end
         | 
| 5969 5777 | 
             
                observer.observe(self, :score) # automatically enhances self to become Glimmer::DataBinding::ObservableModel and notify observer on score attribute changes
         | 
| @@ -6127,9 +5935,7 @@ class ColorTheCircles | |
| 6127 5935 | 
             
                        }
         | 
| 6128 5936 |  | 
| 6129 5937 | 
             
                        @circles_data.each do |circle_data|
         | 
| 6130 | 
            -
                           | 
| 6131 | 
            -
                            circle_data[:circle] = circle(*circle_data[:args])
         | 
| 6132 | 
            -
             | 
| 5938 | 
            +
                          circle_data[:circle] = circle(*circle_data[:args]) {
         | 
| 6133 5939 | 
             
                            fill circle_data[:fill]
         | 
| 6134 5940 | 
             
                            stroke circle_data[:stroke]
         | 
| 6135 5941 | 
             
                          }
         | 
| @@ -6164,17 +5970,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 6164 5970 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/basic_draw_text'"
         | 
| 6165 5971 | 
             
            ```
         | 
| 6166 5972 |  | 
| 6167 | 
            -
            Mac
         | 
| 6168 | 
            -
             | 
| 6169 | 
            -
            
         | 
| 6170 | 
            -
             | 
| 6171 | 
            -
            Windows
         | 
| 6172 | 
            -
             | 
| 6173 | 
            -
            
         | 
| 6174 | 
            -
             | 
| 6175 | 
            -
            Linux
         | 
| 6176 | 
            -
             | 
| 6177 | 
            -
            
         | 
| 5973 | 
            +
            Mac | Windows | Linux
         | 
| 5974 | 
            +
            ----|---------|------
         | 
| 5975 | 
            +
             |  | 
         | 
| 6178 5976 |  | 
| 6179 5977 | 
             
            [LibUI](https://github.com/kojix2/LibUI) Original Version:
         | 
| 6180 5978 |  | 
| @@ -6450,20 +6248,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 6450 6248 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/custom_draw_text'"
         | 
| 6451 6249 | 
             
            ```
         | 
| 6452 6250 |  | 
| 6453 | 
            -
            Mac
         | 
| 6454 | 
            -
             | 
| 6455 | 
            -
            
         | 
| 6456 | 
            -
            
         | 
| 6457 | 
            -
             | 
| 6458 | 
            -
            Windows
         | 
| 6459 | 
            -
             | 
| 6460 | 
            -
            
         | 
| 6461 | 
            -
            
         | 
| 6462 | 
            -
             | 
| 6463 | 
            -
            Linux
         | 
| 6464 | 
            -
             | 
| 6465 | 
            -
            
         | 
| 6466 | 
            -
            
         | 
| 6251 | 
            +
            Mac | Windows | Linux
         | 
| 6252 | 
            +
            ----|---------|------
         | 
| 6253 | 
            +
              |   |  
         | 
| 6467 6254 |  | 
| 6468 6255 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 6469 6256 |  | 
| @@ -6670,17 +6457,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 6670 6457 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/method_based_custom_keyword'"
         | 
| 6671 6458 | 
             
            ```
         | 
| 6672 6459 |  | 
| 6673 | 
            -
            Mac
         | 
| 6674 | 
            -
             | 
| 6675 | 
            -
            
         | 
| 6676 | 
            -
             | 
| 6677 | 
            -
            Windows
         | 
| 6678 | 
            -
             | 
| 6679 | 
            -
            
         | 
| 6680 | 
            -
             | 
| 6681 | 
            -
            Linux
         | 
| 6682 | 
            -
             | 
| 6683 | 
            -
            
         | 
| 6460 | 
            +
            Mac | Windows | Linux
         | 
| 6461 | 
            +
            ----|---------|------
         | 
| 6462 | 
            +
             |  | 
         | 
| 6684 6463 |  | 
| 6685 6464 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 6686 6465 |  | 
| @@ -6802,29 +6581,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 6802 6581 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/tetris'"
         | 
| 6803 6582 | 
             
            ```
         | 
| 6804 6583 |  | 
| 6805 | 
            -
            Mac
         | 
| 6806 | 
            -
             | 
| 6807 | 
            -
            
         | 
| 6808 | 
            -
             | 
| 6809 | 
            -
            
         | 
| 6810 | 
            -
             | 
| 6811 | 
            -
            
         | 
| 6812 | 
            -
             | 
| 6813 | 
            -
            Windows
         | 
| 6814 | 
            -
             | 
| 6815 | 
            -
            
         | 
| 6816 | 
            -
             | 
| 6817 | 
            -
            
         | 
| 6818 | 
            -
             | 
| 6819 | 
            -
            
         | 
| 6820 | 
            -
             | 
| 6821 | 
            -
            Linux
         | 
| 6822 | 
            -
             | 
| 6823 | 
            -
            
         | 
| 6824 | 
            -
             | 
| 6825 | 
            -
            
         | 
| 6826 | 
            -
             | 
| 6827 | 
            -
            
         | 
| 6584 | 
            +
            Mac | Windows | Linux
         | 
| 6585 | 
            +
            ----|---------|------
         | 
| 6586 | 
            +
               |    |   
         | 
| 6828 6587 |  | 
| 6829 6588 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 6830 6589 |  | 
| @@ -6984,6 +6743,8 @@ class Tetris | |
| 6984 6743 | 
             
                    end
         | 
| 6985 6744 | 
             
                  }
         | 
| 6986 6745 | 
             
                  radio_menu_item('Rotate Left on Up Arrow') {
         | 
| 6746 | 
            +
                    checked true
         | 
| 6747 | 
            +
             | 
| 6987 6748 | 
             
                    on_clicked do
         | 
| 6988 6749 | 
             
                      @game.rotate_left_on_up = true
         | 
| 6989 6750 | 
             
                    end
         | 
| @@ -7032,34 +6793,31 @@ class Tetris | |
| 7032 6793 | 
             
                bevel_pixel_size = 0.16 * block_size.to_f
         | 
| 7033 6794 | 
             
                color = Glimmer::LibUI.interpret_color(Model::Block::COLOR_CLEAR)
         | 
| 7034 6795 | 
             
                area {
         | 
| 7035 | 
            -
                  block[:background_square] =  | 
| 7036 | 
            -
                    square(0, 0, block_size)
         | 
| 7037 | 
            -
                    
         | 
| 6796 | 
            +
                  block[:background_square] = square(0, 0, block_size) {
         | 
| 7038 6797 | 
             
                    fill color
         | 
| 7039 6798 | 
             
                  }
         | 
| 7040 | 
            -
                   | 
| 7041 | 
            -
             | 
| 7042 | 
            -
             | 
| 6799 | 
            +
                  
         | 
| 6800 | 
            +
                  block[:top_bevel_edge] = polygon {
         | 
| 6801 | 
            +
                    point_array 0, 0, block_size, 0, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size, bevel_pixel_size
         | 
| 7043 6802 | 
             
                    fill r: color[:r] + 4*BEVEL_CONSTANT, g: color[:g] + 4*BEVEL_CONSTANT, b: color[:b] + 4*BEVEL_CONSTANT
         | 
| 7044 6803 | 
             
                  }
         | 
| 7045 | 
            -
                   | 
| 7046 | 
            -
             | 
| 7047 | 
            -
             | 
| 6804 | 
            +
                  
         | 
| 6805 | 
            +
                  block[:right_bevel_edge] = polygon {
         | 
| 6806 | 
            +
                    point_array block_size, 0, block_size - bevel_pixel_size, bevel_pixel_size, block_size - bevel_pixel_size, block_size - bevel_pixel_size, block_size, block_size
         | 
| 7048 6807 | 
             
                    fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
         | 
| 7049 6808 | 
             
                  }
         | 
| 7050 | 
            -
                   | 
| 7051 | 
            -
             | 
| 7052 | 
            -
             | 
| 6809 | 
            +
                  
         | 
| 6810 | 
            +
                  block[:bottom_bevel_edge] = polygon {
         | 
| 6811 | 
            +
                    point_array block_size, block_size, 0, block_size, bevel_pixel_size, block_size - bevel_pixel_size, block_size - bevel_pixel_size, block_size - bevel_pixel_size
         | 
| 7053 6812 | 
             
                    fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
         | 
| 7054 6813 | 
             
                  }
         | 
| 7055 | 
            -
                   | 
| 7056 | 
            -
             | 
| 7057 | 
            -
             | 
| 6814 | 
            +
                  
         | 
| 6815 | 
            +
                  block[:left_bevel_edge] = polygon {
         | 
| 6816 | 
            +
                    point_array 0, 0, 0, block_size, bevel_pixel_size, block_size - bevel_pixel_size, bevel_pixel_size, bevel_pixel_size
         | 
| 7058 6817 | 
             
                    fill r: color[:r] - BEVEL_CONSTANT, g: color[:g] - BEVEL_CONSTANT, b: color[:b] - BEVEL_CONSTANT
         | 
| 7059 6818 | 
             
                  }
         | 
| 7060 | 
            -
                   | 
| 7061 | 
            -
             | 
| 7062 | 
            -
              
         | 
| 6819 | 
            +
                  
         | 
| 6820 | 
            +
                  block[:border_square] = square(0, 0, block_size) {
         | 
| 7063 6821 | 
             
                    stroke COLOR_GRAY
         | 
| 7064 6822 | 
             
                  }
         | 
| 7065 6823 |  | 
| @@ -7219,35 +6977,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 7219 6977 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/tic_tac_toe'"
         | 
| 7220 6978 | 
             
            ```
         | 
| 7221 6979 |  | 
| 7222 | 
            -
            Mac
         | 
| 7223 | 
            -
             | 
| 7224 | 
            -
            
         | 
| 7225 | 
            -
             | 
| 7226 | 
            -
            
         | 
| 7227 | 
            -
             | 
| 7228 | 
            -
            
         | 
| 7229 | 
            -
             | 
| 7230 | 
            -
            
         | 
| 7231 | 
            -
             | 
| 7232 | 
            -
            Windows
         | 
| 7233 | 
            -
             | 
| 7234 | 
            -
            
         | 
| 7235 | 
            -
             | 
| 7236 | 
            -
            
         | 
| 7237 | 
            -
             | 
| 7238 | 
            -
            
         | 
| 7239 | 
            -
             | 
| 7240 | 
            -
            
         | 
| 7241 | 
            -
             | 
| 7242 | 
            -
            Linux
         | 
| 7243 | 
            -
             | 
| 7244 | 
            -
            
         | 
| 7245 | 
            -
             | 
| 7246 | 
            -
            
         | 
| 7247 | 
            -
             | 
| 7248 | 
            -
            
         | 
| 7249 | 
            -
             | 
| 7250 | 
            -
            
         | 
| 6980 | 
            +
            Mac | Windows | Linux
         | 
| 6981 | 
            +
            ----|---------|------
         | 
| 6982 | 
            +
                |     |    
         | 
| 7251 6983 |  | 
| 7252 6984 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 7253 6985 |  | 
| @@ -7299,14 +7031,12 @@ class TicTacToe | |
| 7299 7031 |  | 
| 7300 7032 | 
             
                        3.times.map do |column|
         | 
| 7301 7033 | 
             
                          area {
         | 
| 7302 | 
            -
                             | 
| 7303 | 
            -
                              square(0, 0, 60)
         | 
| 7304 | 
            -
                              
         | 
| 7034 | 
            +
                            square(0, 0, 60) {
         | 
| 7305 7035 | 
             
                              stroke :black, thickness: 2
         | 
| 7306 7036 | 
             
                            }
         | 
| 7307 7037 | 
             
                            text(23, 19) {
         | 
| 7308 7038 | 
             
                              @cells[row] << string('') {
         | 
| 7309 | 
            -
                                font family: 'Arial', size: 20
         | 
| 7039 | 
            +
                                font family: 'Arial', size: OS.mac? ? 20 : 16
         | 
| 7310 7040 | 
             
                              }
         | 
| 7311 7041 | 
             
                            }
         | 
| 7312 7042 | 
             
                            on_mouse_up do
         | 
| @@ -7357,23 +7087,9 @@ Run with this command if you installed the [Ruby gem](https://rubygems.org/gems/ | |
| 7357 7087 | 
             
            ruby -r glimmer-dsl-libui -e "require 'examples/snake'"
         | 
| 7358 7088 | 
             
            ```
         | 
| 7359 7089 |  | 
| 7360 | 
            -
            Mac
         | 
| 7361 | 
            -
             | 
| 7362 | 
            -
            
         | 
| 7363 | 
            -
             | 
| 7364 | 
            -
            
         | 
| 7365 | 
            -
             | 
| 7366 | 
            -
            Windows
         | 
| 7367 | 
            -
             | 
| 7368 | 
            -
            
         | 
| 7369 | 
            -
             | 
| 7370 | 
            -
            
         | 
| 7371 | 
            -
             | 
| 7372 | 
            -
            Linux
         | 
| 7373 | 
            -
             | 
| 7374 | 
            -
            
         | 
| 7375 | 
            -
             | 
| 7376 | 
            -
            
         | 
| 7090 | 
            +
            Mac | Windows | Linux
         | 
| 7091 | 
            +
            ----|---------|------
         | 
| 7092 | 
            +
              |   |  
         | 
| 7377 7093 |  | 
| 7378 7094 | 
             
            New [Glimmer DSL for LibUI](https://rubygems.org/gems/glimmer-dsl-libui) Version:
         | 
| 7379 7095 |  |