Glimmer DSL for SWT 4.21 (New SWT/JRuby/JDK)
Tags: ruby, desktop, gui, dsl
Published: 2021-09-30 01:32:09

[Glimmer DSL for SWT 4.21](https://github.com/AndyObtiva/glimmer-dsl-swt) is the quarterly major release that ships with a new version of SWT (released in 2021-09) as well as other big changes like JRuby 9.3.0.0 and JDK 16:
- Upgrade to SWT 4.21
- Upgrade to JDK 16.0.2
- Upgrade to JRuby 9.3.0.0
- Update packaging to rely on JDK 16 `jpackage` (instead of older JDK 8 `javapackager`)
- Renamed `Glimmer::RakeTask::Package.javapackager_extra_args` to `Glimmer::RakeTask::Package.jpackage_extra_args` to match the name of `jpackage` in JDK 16
- Change `package/[os]` scaffolding placement for packaging icons into `icons/[os]` to accomodate Java 9 Module security for icon retrieval from within a JAR

The biggest difference in this version of SWT is auto-switching to Dark Mode on the Mac.

![image 1](https://1.bp.blogspot.com/-UXW2XXKQoWo/YVJGn2uWEAI/AAAAAAAABzM/ezWVNwtVaAEa7lP7b5ZbFXS-V-Bpzh2iwCLcBGAsYHQ/s0/Screen%2BShot%2B2021-09-27%2Bat%2B6.25.55%2BPM.png)

![image 2](https://1.bp.blogspot.com/-NmdeiLgFasQ/YVJGoK91rhI/AAAAAAAABzQ/anQxX1L2ookL6Psa1yYI15iPI49B8ozVgCLcBGAsYHQ/s0/Screen%2BShot%2B2021-09-27%2Bat%2B6.26.07%2BPM.png)

![image 3](https://1.bp.blogspot.com/-Zi5S0nq9VgA/YVJGoAjKWLI/AAAAAAAABzU/8UyLGi1plnwpwak-dNIVEK1-TSIf9bWTACLcBGAsYHQ/w640-h228/Screen%2BShot%2B2021-09-27%2Bat%2B6.27.13%2BPM.png)

If you encounter any issues due to the big upgrade from JDK 8 to JDK 16 and jpackage for native-executable packaging, please report in an issue request. There is one annoying message that shows up during packaging with Warbler (unsupported Java version "16", defaulting to 1.7), which seems caused by running JRuby on JDK 16, but I was able to contain its damage and render it harmless (at least as far as I could tell).

In other news, a new Glimmer DSL has been brewing:

[Glimmer DSL for LibUI](https://github.com/AndyObtiva/glimmer-dsl-libui) is a prerequisite-free CRuby desktop development GUI library. No need to pre-install any prerequisites. Just install the gem and have platform-independent native GUI that just works!

![glimmer dsl libui](https://raw.githubusercontent.com/AndyObtiva/glimmer-dsl-libui/master/images/glimmer-dsl-libui-mac-control-gallery.png)

```ruby
# From: https://github.com/AndyObtiva/glimmer-dsl-libui#control-gallery

require 'glimmer-dsl-libui'

include Glimmer

menu('File') {
  menu_item('Open') {
    on_clicked do
      file = open_file(MAIN_WINDOW)
      puts file unless file.nil?
    end
  }

  menu_item('Save') {
    on_clicked do
      file = save_file(MAIN_WINDOW)
      puts file unless file.nil?
    end
  }
  
  quit_menu_item {
    on_clicked do
      puts 'Bye Bye'
    end
  }
  
  preferences_menu_item # Can optionally contain an on_clicked listener
}

menu('Edit') {
  check_menu_item('Checkable Item_')
  separator_menu_item
  menu_item('Disabled Item_') {
    enabled false
  }
}

menu('Help') {
  menu_item('Help')
  
  about_menu_item # Can optionally contain an on_clicked listener
}

MAIN_WINDOW = window('Control Gallery', 600, 500) {
  margined true
  
  on_closing do
    puts 'Bye Bye'
  end
  
  vertical_box {
    horizontal_box {
      group('Basic Controls') {
        vertical_box {
          button('Button') {
            stretchy false

            on_clicked do
              msg_box(MAIN_WINDOW, 'Information', 'You clicked the button')
            end
          }

          checkbox('Checkbox') {
            stretchy false

            on_toggled do |c|
              checked = c.checked?
              MAIN_WINDOW.title = "Checkbox is #{checked}"
              c.text = "I am the checkbox (#{checked})"
            end
          }

          label('Label') { stretchy false }

          horizontal_separator { stretchy false }

          date_picker { stretchy false }

          time_picker { stretchy false }

          date_time_picker { stretchy false }

          font_button { stretchy false }

          color_button { stretchy false }
        }
      }

      vertical_box {
        group('Numbers') {
          stretchy false

          vertical_box {
            spinbox(0, 100) {
              stretchy false
              value 42

              on_changed do |s|
                puts "New Spinbox value: #{s.value}"
              end
            }

            slider(0, 100) {
              stretchy false

              on_changed do |s|
                v = s.value
                puts "New Slider value: #{v}"
                @progress_bar.value = v
              end
            }

            @progress_bar = progress_bar { stretchy false }
          }
        }

        group('Lists') {
          stretchy false

          vertical_box {
            combobox {
              stretchy false
              items 'combobox Item 1', 'combobox Item 2', 'combobox Item 3' # also accepts a single array argument

              on_selected do |c|
                puts "New combobox selection: #{c.selected}"
              end
            }

            editable_combobox {
              stretchy false
              items 'Editable Item 1', 'Editable Item 2', 'Editable Item 3' # also accepts a single array argument
            }

            radio_buttons {
              items 'Radio Button 1', 'Radio Button 2', 'Radio Button 3' # also accepts a single array argument
            }
          }
        }

        tab {
          tab_item('Page 1') {
            horizontal_box {
              entry {
                text 'Please enter your feelings'

                on_changed do |e|
                  puts "Current textbox data: '#{e.text}'"
                end
              }
            }
          }
          
          tab_item('Page 2') {
            horizontal_box
          }
          
          tab_item('Page 3') {
            horizontal_box
          }
        }
      }
    }
  }
}

MAIN_WINDOW.show
```

Happy [Glimmering](https://raw.githubusercontent.com/AndyObtiva/glimmer)!