{"id":13879057,"url":"https://github.com/AndyObtiva/glimmer-dsl-swt","last_synced_at":"2025-07-16T15:30:52.134Z","repository":{"id":38819377,"uuid":"271674353","full_name":"AndyObtiva/glimmer-dsl-swt","owner":"AndyObtiva","description":"Glimmer DSL for SWT (JRuby Desktop Development Cross-Platform Native GUI Framework) - The Quickest Way From Zero To GUI - If You Liked Shoes, You'll Love Glimmer!","archived":false,"fork":false,"pushed_at":"2025-03-21T19:02:18.000Z","size":131024,"stargazers_count":119,"open_issues_count":6,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-27T16:50:45.415Z","etag":null,"topics":["desktop","dsl","dsl-syntax","framework","glimmer","glimmer-dsl","gui","jruby","jruby-wrapper","ruby","ruby-gem","ruby-library","rubygem","swt"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AndyObtiva.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-06-12T00:38:41.000Z","updated_at":"2025-06-05T06:31:52.000Z","dependencies_parsed_at":"2024-01-05T06:26:51.365Z","dependency_job_id":"98763f7b-5f9a-441e-928d-afb8beea880a","html_url":"https://github.com/AndyObtiva/glimmer-dsl-swt","commit_stats":{"total_commits":1198,"total_committers":6,"mean_commits":"199.66666666666666","dds":"0.20534223706176957","last_synced_commit":"b6e65585dcf5c188ce5c76e7d35edffb4a9147cb"},"previous_names":[],"tags_count":235,"template":false,"template_full_name":null,"purl":"pkg:github/AndyObtiva/glimmer-dsl-swt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AndyObtiva%2Fglimmer-dsl-swt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AndyObtiva%2Fglimmer-dsl-swt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AndyObtiva%2Fglimmer-dsl-swt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AndyObtiva%2Fglimmer-dsl-swt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AndyObtiva","download_url":"https://codeload.github.com/AndyObtiva/glimmer-dsl-swt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AndyObtiva%2Fglimmer-dsl-swt/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265521390,"owners_count":23781496,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["desktop","dsl","dsl-syntax","framework","glimmer","glimmer-dsl","gui","jruby","jruby-wrapper","ruby","ruby-gem","ruby-library","rubygem","swt"],"created_at":"2024-08-06T08:02:08.326Z","updated_at":"2025-07-16T15:30:52.120Z","avatar_url":"https://github.com/AndyObtiva.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"# [\u003cimg src=\"https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png\" height=85 /\u003e](https://github.com/AndyObtiva/glimmer) Glimmer DSL for SWT 4.30.1.1\n## JRuby Desktop Development Cross-Platform Native GUI Framework\n### The Quickest Way From Zero To GUI\n[![Gem Version](https://badge.fury.io/rb/glimmer-dsl-swt.svg)](http://badge.fury.io/rb/glimmer-dsl-swt)\n[![Travis CI](https://travis-ci.com/AndyObtiva/glimmer-dsl-swt.svg?branch=master)](https://travis-ci.com/github/AndyObtiva/glimmer-dsl-swt)\n[![Coverage Status](https://coveralls.io/repos/github/AndyObtiva/glimmer-dsl-swt/badge.svg?branch=master)](https://coveralls.io/github/AndyObtiva/glimmer-dsl-swt?branch=master)\n[![Maintainability](https://api.codeclimate.com/v1/badges/aaf1cba142dd351f84bd/maintainability)](https://codeclimate.com/github/AndyObtiva/glimmer-dsl-swt/maintainability)\n[![Join the chat at https://gitter.im/AndyObtiva/glimmer](https://badges.gitter.im/AndyObtiva/glimmer.svg)](https://gitter.im/AndyObtiva/glimmer?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n**[If You Liked Shoes, You'll Love Glimmer!](https://github.com/AndyObtiva/glimmer#faq)**\n\n**(Original Glimmer Library Handling World’s Ruby GUI Needs Since 2007. Beware of Imitators!)**\n\n(**[***RubyConf 2022 Talk - Building Native GUI Apps in Ruby***](https://andymaleh.blogspot.com/2023/02/rubyconf-2022-talk-video-for-building.html)**)\n\n(**[***Montreal.rb Talk - Glimmer DSL for SWT - Ruby Desktop Development GUI Framework***](https://andymaleh.blogspot.com/2022/10/montrealrb-talk-slides-for-glimmer-dsl.html)**)\n\n[**(Ruby Rogues Podcast Interview - Desktop Apps in Ruby ft. Andy)**](https://andymaleh.blogspot.com/2022/05/ruby-rogues-podcast-interview-desktop.html)\n\n[GLIMMER VIDEO TUTORIAL CHANNEL](https://www.youtube.com/channel/UC5hzDE23HZXsZLAxYk2UJEw)\n\n![Glimmer DSL for SWT Demo of Hello, World!](/images/glimmer-dsl-swt-demo-hello-world.gif)\n\n[Glimmer](https://github.com/AndyObtiva/glimmer) DSL for [SWT](https://www.eclipse.org/swt/) (formerly [Glimmer](https://github.com/AndyObtiva/glimmer)) is a native GUI (Graphical User Interface) cross-platform desktop development library written in [JRuby](https://www.jruby.org/), an OS-threaded faster [JVM](https://www.java.com/en/download/help/whatis_java.html) version of [Ruby](https://www.ruby-lang.org/en/). [Glimmer](https://github.com/AndyObtiva/glimmer)'s main innovation is a minimalistic declarative [Ruby DSL](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#glimmer-dsl-syntax) (Domain Specific Language) that enables productive and efficient authoring of professional-grade desktop applications by relying on the robust [Eclipse SWT library](https://www.eclipse.org/swt/), with the familiar native look, feel, and behavior of GUI on Mac, Windows, and Linux. [Glimmer](https://rubygems.org/gems/glimmer) additionally innovates by having built-in [data-binding](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#data-binding) support, which greatly facilitates synchronizing the GUI with domain models, thus achieving true decoupling of object oriented components and enabling developers to solve business problems (test-first) without worrying about GUI concerns, or alternatively drive development GUI-first, and then write clean business models afterwards. Not only does Glimmer provide a large set of GUI [widgets](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#widgets), but it also supports drawing Canvas Graphics like [Shapes](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#canvas-shape-dsl) and [Animations](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#canvas-animation-dsl). To get started quickly, [Glimmer](https://rubygems.org/gems/glimmer) offers [scaffolding](docs/reference/GLIMMER_COMMAND.md#scaffolding) options for [Apps](#in-production), [Gems](docs/reference/GLIMMER_COMMAND.md#custom-shell-gem), and [Custom Widgets](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#custom-widgets). [Glimmer](https://rubygems.org/gems/glimmer) also includes native-executable [packaging](docs/reference/GLIMMER_PACKAGING_AND_DISTRIBUTION.md) support, sorely lacking in other libraries, thus enabling the delivery of desktop apps written in [Ruby](https://www.ruby-lang.org/en/) as truly native DMG/PKG/APP files on the [Mac](https://www.apple.com/ca/macos), MSI/EXE files on [Windows](https://www.microsoft.com/en-ca/windows), and DEB/RPM files on [Linux](https://www.linux.org/). [Glimmer](https://github.com/AndyObtiva/glimmer) was the [first Ruby gem](https://rubygems.org/gems/glimmer) to bring [SWT](https://www.eclipse.org/swt/) (Standard Widget Toolkit) to [Ruby](https://www.ruby-lang.org/en/), thanks to creator [Andy Maleh](https://andymaleh.blogspot.com/), EclipseCon/EclipseWorld/RubyConf speaker.\n\n[\u003cimg src=\"https://covers.oreillystatic.com/images/9780596519650/lrg.jpg\" width=105 /\u003e\u003cbr /\u003e\nFeatured in JRuby Cookbook](http://shop.oreilly.com/product/9780596519650.do) and [Chalmers/Gothenburg University Software Engineering Master's Lecture Material](http://www.cse.chalmers.se/~bergert/slides/guest_lecture_DSLs.pdf)\n\n[SWT](https://www.eclipse.org/swt/) (Standard Widget Toolkit) is a very robust GUI toolkit that is most famous for building the [Eclipse IDE](https://www.eclipse.org/ide/), a free and open-source general language Integrated Development Environment that was the first to provide a high-performance pause-free [Java](https://www.oracle.com/ca-en/java/) IDE (unlike earlier versions of NetBeans and other [Java](https://www.oracle.com/ca-en/java/) IDEs), thanks to its very smart software architecture. Additionally, [Eclipse RCP (Rich Client Platform, built on top of SWT) has been used by NASA to build Mars Rover operational software](https://www.eclipse.org/community/casestudies/NASAfinal.pdf). So, [Eclipse technologies](https://www.eclipse.org/) are not only very highly proven, but are also considered some of the best in the world.\n\n![Eclipse SWT RCP NASA Mars Rover](/images/glimmer-eclipse-swt-rcp-nasa-mars-rover.png)\n\n[Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) 4.30.1.1 includes [SWT 4.30](https://download.eclipse.org/eclipse/downloads/drops4/R-4.30-202312010110/), which was released on December 1, 2023. Gem version numbers are in sync with the SWT library versions. The first two digits represent the SWT version number. The last two digits represent the minor and patch versions of Glimmer DSL for SWT. Note that SWT supports ARM64/AARCH64 on Mac and Linux since version `4.20`.\n\n**Starting in version 4.20.0.0, [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) comes with the new [***Shine***](/docs/reference/GLIMMER_GUI_DSL_SYNTAX.md#shine) syntax** for highly intuitive and visually expressive View/Model Attribute Mapping, relying on `\u003c=\u003e` for bidirectional (two-way) data-binding and `\u003c=` for unidirectional (one-way) data-binding, providing an alternative to the `bind` keyword. That was [originally conceived back in 2007](https://andymaleh.blogspot.com/2007/12/data-shining-in-glimmer.html).\n\nPlease help make [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) better by providing feedback and [contributing](#contributing) whenever possible. Any feature suggestions that are accepted could be implemented within weeks if not days.\n\nThis is a [JRuby](https://www.jruby.org/) desktop GUI library. If you are looking for a standard [Ruby](https://www.ruby-lang.org/) (aka MRI/CRuby) desktop GUI library instead, check out [Glimmer DSL for LibUI](https://github.com/AndyObtiva/glimmer-dsl-libui) (Fukuoka Ruby 2022 Award Winning), [Glimmer DSL for WX](https://github.com/AndyObtiva/glimmer-dsl-wx), [Glimmer DSL for Tk](https://github.com/AndyObtiva/glimmer-dsl-tk), [Glimmer DSL for GTK](https://github.com/AndyObtiva/glimmer-dsl-gtk), or [Glimmer DSL for FX](https://github.com/AndyObtiva/glimmer-dsl-fx).\n\nLearn more about the differences between various [Glimmer](https://github.com/AndyObtiva/glimmer) DSLs by looking at the **[Glimmer DSL Comparison Table](https://github.com/AndyObtiva/glimmer#glimmer-dsl-comparison-table)**.\n\n## Examples\n\n### Hello, World! Sample\n\nGlimmer GUI DSL code (from [samples/hello/hello_world.rb](samples/hello/hello_world.rb)):\n\n```ruby\ninclude Glimmer\n\nshell {\n  text \"Glimmer\"\n\n  label {\n    text \"Hello, World!\"\n  }\n}.open\n```\n\nGlimmer app:\n\n![Hello World](images/glimmer-hello-world.png)\n\nLearn more about [Hello, World!](docs/reference/GLIMMER_SAMPLES#hello-world).\n\n### Hello, Table! Sample\n\nGlimmer GUI DSL code (from [samples/hello/hello_table.rb](samples/hello/hello_table.rb)):\n\n```ruby\nshell {\n  grid_layout\n  \n  text 'Hello, Table!'\n  background_image File.expand_path('hello_table/baseball_park.png', __dir__)\n  image File.expand_path('hello_table/baseball_park.png', __dir__)\n  \n  label {\n    layout_data :center, :center, true, false\n    \n    text 'BASEBALL PLAYOFF SCHEDULE'\n    background :transparent if OS.windows?\n    foreground rgb(94, 107, 103)\n    font name: 'Optima', height: 38, style: :bold\n  }\n  \n  combo(:read_only) {\n    layout_data :center, :center, true, false\n    selection \u003c=\u003e [BaseballGame, :playoff_type]\n    font height: 14\n  }\n  \n  table(:editable) { |table_proxy|\n    layout_data :fill, :fill, true, true\n  \n    table_column {\n      text 'Game Date'\n      width 150\n      sort_property :date # ensure sorting by real date value (not `game_date` string specified in items below)\n      editor :date_drop_down, property: :date_time\n    }\n    table_column {\n      text 'Game Time'\n      width 150\n      sort_property :time # ensure sorting by real time value (not `game_time` string specified in items below)\n      editor :time, property: :date_time\n    }\n    table_column {\n      text 'Ballpark'\n      width 180\n      editor :none\n    }\n    table_column {\n      text 'Home Team'\n      width 150\n      editor :combo, :read_only # read_only is simply an SWT style passed to combo widget\n    }\n    table_column {\n      text 'Away Team'\n      width 150\n      editor :combo, :read_only # read_only is simply an SWT style passed to combo widget\n    }\n    table_column {\n      text 'Promotion'\n      width 150\n      # default text editor is used here\n    }\n    \n    # Data-bind table items (rows) to a model collection property, specifying column properties ordering per nested model\n    items \u003c=\u003e [BaseballGame, :schedule, column_properties: [:game_date, :game_time, :ballpark, :home_team, :away_team, :promotion]]\n    \n    # Data-bind table selection\n    selection \u003c=\u003e [BaseballGame, :selected_game]\n    \n    # Default initial sort property\n    sort_property :date\n    \n    # Sort by these additional properties after handling sort by the column the user clicked\n    additional_sort_properties :date, :time, :home_team, :away_team, :ballpark, :promotion\n    \n    menu {\n      menu_item {\n        text 'Book'\n        \n        on_widget_selected {\n          book_selected_game\n        }\n      }\n    }\n  }\n  \n  button {\n    text 'Book Selected Game'\n    layout_data :center, :center, true, false\n    font height: 14\n    enabled \u003c= [BaseballGame, :selected_game]\n    \n    on_widget_selected do\n      book_selected_game\n    end\n  }\n}\n```\n\nGlimmer App:\n\n![Hello Table](images/glimmer-hello-table.png)\n\nLearn more about [Hello, Table!](docs/reference/GLIMMER_SAMPLES#hello-table).\n\n### Tetris\n\nGlimmer GUI DSL code (from [samples/elaborate/tetris.rb](samples/elaborate/tetris.rb)):\n\n```ruby\nshell(:no_resize) {\n  grid_layout {\n    num_columns 2\n    make_columns_equal_width false\n    margin_width 0\n    margin_height 0\n    horizontal_spacing 0\n  }\n  \n  text 'Glimmer Tetris'\n  minimum_size 475, 500\n  image tetris_icon\n\n  tetris_menu_bar(game: game)\n\n  playfield(game_playfield: game.playfield, playfield_width: playfield_width, playfield_height: playfield_height, block_size: BLOCK_SIZE)\n\n  score_lane(game: game, block_size: BLOCK_SIZE) {\n    layout_data(:fill, :fill, true, true)\n  }\n}\n```\n\nGlimmer app:\n\n![Tetris](images/glimmer-tetris.png)\n\n[Check out many more samples over here.](/docs/reference/GLIMMER_SAMPLES.md)\n\n### Desktop Apps Built with Glimmer DSL for SWT\n\n[\u003cimg alt=\"Are We There Yet Logo\" src=\"https://raw.githubusercontent.com/AndyObtiva/are-we-there-yet/master/are-we-there-yet-logo.svg\" width=\"40\" /\u003eAre We There Yet?](https://github.com/AndyObtiva/are-we-there-yet) - Small Project Tracking App (leveraging [ActiveRecord](https://rubygems.org/gems/activerecord) and [SQLite](https://www.sqlite.org/index.html))\n\n[![Are We There Yet? App Screenshot](https://raw.githubusercontent.com/AndyObtiva/are-we-there-yet/master/are-we-there-yet-screenshot-windows.png)](https://github.com/AndyObtiva/are-we-there-yet)\n\n[\u003cimg alt=\"Math Bowling Logo\" src=\"https://raw.githubusercontent.com/AndyObtiva/MathBowling/master/images/math-bowling-logo.png\" width=\"40\" /\u003eMath Bowling](https://github.com/AndyObtiva/MathBowling) - Elementary Level Math Game Featuring Bowling Rules\n\n[![Math Bowling App Screenshot](https://raw.githubusercontent.com/AndyObtiva/MathBowling/master/Math-Bowling-Screenshot.png)](https://github.com/AndyObtiva/MathBowling)\n\n[Check out other apps in production.](#in-production)\n\n## Table of contents\n\n- [Glimmer (JRuby Desktop Development GUI Framework)](#jruby-desktop-development-gui-framework)\n  - [Table of contents](#table-of-contents)\n  - [Background](#background)\n  - [Software Architecture](#software-architecture)\n  - [Platform Support](#platform-support)\n  - [Pre-requisites](#pre-requisites)\n  - [Setup](#setup)\n  - [Glimmer Command](#glimmer-command)\n  - [Girb (Glimmer irb) Command](#girb-glimmer-irb-command)\n  - [Glimmer GUI DSL Syntax](#glimmer-gui-dsl-syntax)\n  - [Glimmer Configuration](#glimmer-configuration)\n  - [Glimmer Style Guide](#glimmer-style-guide)\n  - [Samples](#samples)\n  - [In Production](#in-production)\n  - [Packaging \u0026 Distribution](#packaging--distribution)\n  - [App Updates](#app-updates)\n  - [Glimmer Supporting Libraries](#glimmer-supporting-libraries)\n  - [Glimmer Process](#glimmer-process)\n  - [Resources](#resources)\n  - [Help](#help)\n  - [Feature Suggestions](#feature-suggestions)\n  - [Change Log](#change-log)\n  - [Contributing](#contributing)\n  - [Contributors](#contributors)\n  - [Hire Me](#hire-me)\n  - [License](#license)\n  \n## Background\n\n[Ruby](https://www.ruby-lang.org) is a dynamically-typed object-oriented language, which provides great productivity gains due to its expressive syntax and dynamic nature. While it is proven by the [Ruby](https://www.ruby-lang.org) on Rails framework for web development, it currently lacks a robust platform-independent framework for building desktop applications. Given that [Java](https://www.oracle.com/ca-en/java/) libraries can now be utilized in Ruby code through JRuby, Eclipse technologies, such as [SWT](https://www.eclipse.org/swt/), JFace, and RCP can help fill the gap of desktop application development with Ruby.\n\n## Software Architecture\n\nThere are several requirements for building enterprise-level/consumer-level desktop GUI applications:\n- Cross-Platform Support (Mac, Windows, Linux) without compilation/recompilation\n- OS Native Look \u0026 Feel\n- High Performance\n- Productivity\n- Maintainability\n- Extensibility\n- Native Executable Packaging\n- Multi-Threading / Parallel Programming\n- Arbitrary Graphics Painting\n- Audio Support\n\nGlimmer provides cross-platform support that does not require Ruby compilation (like Tk does), thanks to JRuby, a JVM (Java Virtual Machine) faster OS-threaded version of Ruby.\n\nGlimmer leverages SWT (Standard Widget Toolkit), which provides cross-platform widgets that automatically use the native GUI libraries under each operating system, such as Win32 on Windows, Cocoa on Mac, and GTK on Linux.\n\nFurthermore, what is special about SWT regarding \"High Performance\" is that it does all the GUI painting natively outside of Java, thus producing GUI that runs at maximum performance even in Ruby. As such, you do not need to worry about Ruby dynamic typing getting in the way of GUI performance. It has ZERO effect on it and since SWT supports making asynchronous calls for GUI rendering, you could avoid blocking the GUI completely with any computations happening in Ruby no matter how complex, thus never affecting the responsiveness of GUI of applications while taking full advantage of the productivity benefits of Ruby dynamic typing.\n\nGlimmer takes this further by providing a very programmer friendly DSL (Domain Specific Language) that visually maps lightweight Ruby syntax to the containment hierarchy of GUI widgets (meaning Ruby blocks nested within each other map to GUI widgets nested within each other). This provides maximum productivity and maintainability.\n\nExtensibility has never been simpler in desktop GUI application development than with Glimmer, which provides the ability to support any new custom keywords through custom widgets and custom shells (windows). Basically, you map a keyword by declaring a view class matching its name by convention with a GUI body that simply consists of reusable Glimmer GUI syntax. They can be passive views or smart views with additional logic. This provides the ultimate realization of Object Oriented Programming and micro-level MVC pattern.\n\nThanks to Java and JRuby, Glimmer apps can be packaged as cross-platform JAR files (with JRuby Warbler) and native executables (with Java Packager) as Mac APP/DMG/PACKAGE or Windows EXE/MSI.\n\nThe Java Virtual Machine already supports OS-native threads, so Glimmer apps can have multiple things running in parallel with no problem.\n\nSWT supports Canvas graphics drawing, and Glimmer takes that further by provding a Canvas Shape/Transform/Animation DSL, making it very simple to decorate any existing widgets or add new widgets with a completely custom look and feel if needed for branding purposes.\n\nAudio is supported via the Java Sound library in a cross-platform approach and video is supported via a Glimmer custom widget, so any Glimmer app can be enhanced with audio and video where needed.\n\n### Remaining Challenges\n\nJRuby startup time is longer than that of CRuby, but has gotten a lot faster with newer CPUs, especially the latest Mac ARM64 processors (it is now about 2.5 seconds on Mac ARM64 processors like the M1 chip). Thankfully, [there are work-arounds](https://andymaleh.blogspot.com/2021/03/glimmer-dsl-for-swt-41900-halved.html) that could make apps start as fast as instantly when needed.\n\nContributors who appreciate Glimmer's ultra-high productivity, maintainability, and extensibility might want to help report and resolve remaining challenges in its software architecture.\n\n## Platform Support\n\nGlimmer runs on the following platforms:\n- Mac\n- Windows\n- Linux\n\nGlimmer's GUI has the native look and feel of each operating system it runs on since it uses SWT behind the scenes, which leverages the following native libraries:\n- Win32 on Windows\n- Cocoa on Mac\n- GTK on Linux\n\nMore info about the SWT GUI on various platforms can be found on the Eclipse WIKI and SWT FAQ:\n\nhttps://wiki.eclipse.org/SWT/Devel/Gtk/Dev_guide#Win32.2FCocoa.2FGTK\nhttps://www.eclipse.org/swt/faq.php\n\n## Pre-requisites\n\n- JDK 21 is recommended / JDK 16 is the minimum except on Mac ARM64 where JDK 17 is the minimum (find at https://www.oracle.com/java/technologies/downloads / Ensure `PATH` env var includes Java bin directory for `jpackage` command to work when packaging Glimmer applications / Preferably setup `JAVA_HOME` env var too to point to JDK home directory before installing JRuby)\n- [RVM](http://rvm.io) on Mac \u0026 Linux (not needed on Windows)\n- JRuby 9.4.10.0 (supporting Ruby 3.1.x syntax) (get via [RVM](http://rvm.io) on Mac and Linux by running `rvm install jruby-9.4.10.0`; On Windows, find at [https://www.jruby.org/download](https://www.jruby.org/download))\n- Git (comes with Mac and Linux. Install on Windows: https://git-scm.com/download/win )\n\nGlimmer might still work on other versions of Java, JRuby and SWT, but there are no guarantees, so it is best to stick to the pre-requisites outlined above.\n\nTo change the SWT version to a custom `swt.jar` version that you have, simply set the 'SWT_JAR_FILE_PATH' env var.\n\n## Setup\n\nPlease follow these instructions to make the `glimmer` command available on your system via the [`glimmer-dsl-swt`](https://github.com/AndyObtiva/glimmer-dsl-swt) gem.\n\nIf you intend to learn the basics of Glimmer but are not ready to build a Glimmer app yet, pick Option 1 ([Direct Install](#option-1-direct-install)).\n\nIf you intend to build a Glimmer app from scratch with [scaffolding](https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/docs/reference/GLIMMER_COMMAND.md#scaffolding), pick Option 1 ([Direct Install](#option-1-direct-install)) as well.\n\nOtherwise, Option 2 ([Bundler](#option-2-bundler)) can be followed in rare cases where you want to build an app without [scaffolding](https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/docs/reference/GLIMMER_COMMAND.md#scaffolding).\n\n**Note:** if you encounter any [issues](https://github.com/AndyObtiva/glimmer-dsl-swt/issues), please [report](https://github.com/AndyObtiva/glimmer-dsl-swt/issues) and then install a previous version instead from the list of [Glimmer Releases](https://rubygems.org/gems/glimmer-dsl-swt/versions) (keep looking back till you find one that works). Do not be disheartened as nearly everything is only a few days of work away. That said, keep in mind that this project is free and open source, meaning provided as is, so do not expect anything, but if you help with reporting and contributing, you could speed things up or even become part of the project.\n\n### Option 1: Direct Install\n(Use for [Scaffolding](https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/docs/reference/GLIMMER_COMMAND.md#scaffolding))\n\nRun this command to install directly:\n```\njgem install glimmer-dsl-swt\n```\n\nOr this command if you want a specific version:\n```\njgem install glimmer-dsl-swt -v 4.30.1.1\n```\n\n`jgem` is JRuby's version of `gem` command.\nRVM allows running `gem install` directly as an alias.\nOtherwise, you may also run `jruby -S gem install ...`\n\nAfterwards, you can use `glimmer` and `girb` commands.\n\nOn the Mac, you also have to run:\n\n```\nglimmer-setup\n```\n\nThis ensures configuring required Mac jruby options before using `glimmer` and `girb` commands (adding `export JRUBY_OPTS=\"$JRUBY_OPTS -J-XstartOnFirstThread\"` to `~/.zprofile` and `~/.bash_profile`).\n\nIf you are new to Glimmer and would like to continue learning the basics, you may continue to the [Glimmer Command](#glimmer-command) section.\n\nOtherwise, if you are ready to build a Glimmer app, you can jump to the [Glimmer Scaffolding](https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/docs/reference/GLIMMER_COMMAND.md#scaffolding) section next.\n\nNote: if you're using activerecord or activesupport, keep in mind that Glimmer unhooks ActiveSupport::Dependencies as it does not rely on it.\n\n### Option 2: Bundler\n(Use for Manual App Creation)\n\nAdd the following to `Gemfile`:\n```\ngem 'glimmer-dsl-swt', '~\u003e 4.30.1.1'\n```\n\nAnd, then run:\n```\njruby -S bundle install\n```\n\nNote: if you're using activerecord or activesupport, keep in mind that Glimmer unhooks ActiveSupport::Dependencies as it does not rely on it.\n\nYou may learn more about other Glimmer related gems ([`glimmer-dsl-opal`](https://github.com/AndyObtiva/glimmer-dsl-opal), [`glimmer-dsl-xml`](https://github.com/AndyObtiva/glimmer-dsl-xml), and [`glimmer-dsl-css`](https://github.com/AndyObtiva/glimmer-dsl-css)) at [Multi-DSL Support](#multi-dsl-support)\n\n## Glimmer Command\n\n[docs/reference/GLIMMER_COMMAND.md](docs/reference/GLIMMER_COMMAND.md)\n\nYou can use the glimmer command to scaffold new apps, run apps \u0026 samples, package native executables, and list Glimmer community gems.\n\n```\nglimmer\n```\n\n```\nGlimmer (JRuby Desktop Development GUI Framework) - JRuby Gem: glimmer-dsl-swt v4.30.1.1\n      \nUsage: glimmer [--bundler] [--pd] [--quiet] [--debug] [--log-level=VALUE] [[ENV_VAR=VALUE]...] [[-jruby-option]...] (application.rb or task[task_args]) [[application2.rb]...]\n\nRuns Glimmer applications and tasks.\n\nWhen applications are specified, they are run using JRuby,\nautomatically preloading the glimmer Ruby gem and SWT jar dependency.\n\nOptionally, extra Glimmer options, JRuby options, and/or environment variables may be passed in.\n\nGlimmer options:\n- \"--bundler=GROUP\"   : Activates gems in Bundler default group in Gemfile\n- \"--pd=BOOLEAN\"      : Requires puts_debuggerer to enable pd method\n- \"--quiet=BOOLEAN\"   : Does not announce file path of Glimmer application being launched\n- \"--debug\"           : Displays extra debugging information, passes \"--debug\" to JRuby, and enables debug logging\n- \"--log-level=VALUE\" : Sets Glimmer's Ruby logger level (\"ERROR\" / \"WARN\" / \"INFO\" / \"DEBUG\"; default is none)\n\nTasks are run via rake. Some tasks take arguments in square brackets.\n\nAvailable tasks are below (if you do not see any, please add `require 'glimmer/rake_task'` to Rakefile and rerun or run rake -T):\n\nSelect a Glimmer task to run: (Press ↑/↓ arrow to move, Enter to select and letters to filter)\n  glimmer list:gems:customshape[query]                       # List Glimmer custom shape gems available at rubygems.org (query is optional) [alt: list:gems:cp]\n‣ glimmer list:gems:customshell[query]                       # List Glimmer custom shell gems available at rubygems.org (query is optional) [alt: list:gems:cs]\n  glimmer list:gems:customwidget[query]                      # List Glimmer custom widget gems available at rubygems.org (query is optional) [alt: list:gems:cw]\n  glimmer list:gems:dsl[query]                               # List Glimmer DSL gems available at rubygems.org (query is optional)\n  glimmer package[type]                                      # Package app for distribution (generating config, jar, and native files) (type is optional)\n  glimmer package:clean                                      # Clean by removing \"dist\" and \"packages\" directories\n  glimmer package:config                                     # Generate JAR config file\n  glimmer package:gem                                        # Generate gem under pkg directory\n  glimmer package:gemspec                                    # Generate gemspec\n  glimmer package:jar                                        # Generate JAR file\n  glimmer package:lock_jars                                  # Lock JARs\n  glimmer package:native[type]                               # Generate Native files\n  glimmer run[app_path]                                      # Runs Glimmer app or custom shell gem in the current directory, unless app_path is specified, then runs it instead (app_path is optional)\n  glimmer samples                                            # Brings up the Glimmer Meta-Sample app to allow browsing, running, and viewing code of Glimmer samples\n  glimmer scaffold[app_name]                                 # Scaffold Glimmer application directory structure to build a new app\n  glimmer scaffold:customshape[name,namespace]               # Scaffold Glimmer::UI::CustomShape subclass (part of a view) under app/views (namespace is optional) [alt: scaffold:cp]\n  glimmer scaffold:customshell[name,namespace]               # Scaffold Glimmer::UI::CustomShell subclass (full window view) under app/views (namespace is optional) [alt: scaffold:cs]\n  glimmer scaffold:customwidget[name,namespace]              # Scaffold Glimmer::UI::CustomWidget subclass (part of a view) under app/views (namespace is optional) [alt: scaffold:cw]\n  glimmer scaffold:desktopify[app_name,website]              # Desktopify a web app\n  glimmer scaffold:gem:customshape[name,namespace]           # Scaffold Glimmer::UI::CustomShape subclass (part of a view) under its own Ruby gem project (namespace is required) [alt: scaffold:gem:cp]\n  glimmer scaffold:gem:customshell[name,namespace]           # Scaffold Glimmer::UI::CustomShell subclass (full window view) under its own Ruby gem + app project (namespace is required) [alt: scaffold:ge...\n  glimmer scaffold:gem:customwidget[name,namespace]          # Scaffold Glimmer::UI::CustomWidget subclass (part of a view) under its own Ruby gem project (namespace is required) [alt: scaffold:gem:cw]\n```\n\nLearn more at:\n\n[docs/reference/GLIMMER_COMMAND.md](docs/reference/GLIMMER_COMMAND.md)\n\n## Girb (Glimmer irb) Command\n\nYou can use `girb` as an alternative to `irb` when prototyping Glimmer DSL for SWT GUI DSL code.\n\n```\ngirb\n```\n\n![GIRB](/images/glimmer-girb.png)\n\nLearn more at:\n\n[docs/reference/GLIMMER_GIRB.md](docs/reference/GLIMMER_GIRB.md)\n\n## Glimmer GUI DSL Syntax\n\n[docs/reference/GLIMMER_GUI_DSL_SYNTAX.md](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md)\n\nHere is a listing of supported widgets taken from the [SWT website](https://www.eclipse.org/swt/widgets/):\n\n[![SWT Widgets](/images/glimmer-swt-widgets.png)](https://www.eclipse.org/swt/widgets/)\n\nIn a nutshell, the Glimmer GUI DSL syntax consists mainly of:\n\n1. Keywords\n\nWidgets are declared with keywords denoting their name in underscored format.\n\nExample of a keyword representing a table widget:\n\n```ruby\ntable\n```\n\nWidgets may optionally receive symbol-style/args within parentheses (otherwise, when there are no style/args, the parentheses are left out).\n\nExample of a multi-line selection table widget:\n\n```ruby\ntable(:multi)\n```\n\n2. Content/Properties\n\nWidget content is always housed within a curly-brace (`{}`) style block.\n\nExample of a multi-line selection table widget with a table column as content that has a header `text` property as 'Name'.\n\n```ruby\ntable(:multi) {\n  table_column {\n    text 'Name'\n  }\n}\n```\n\n3. Listeners\n\nListeners embody the [Observer Design Pattern](https://en.wikipedia.org/wiki/Observer_pattern) and always start with `on_` followed by an event name (e.g. `on_widget_selected`). Also, they are an exception to Glimmer's syntax that requires a `do; end` style block to clearly demarcate as logic as opposed to View syntax.\n\nExample of a button widget with a `text` property and an `on_widget_selected` listener.\n\n```ruby\nbutton {\n  text 'Click'\n  \n  on_widget_selected do\n    message_box {\n      text 'Clicked'\n      message 'Thank you for clicking!'\n    }.open\n  end\n}\n```\n\n4. Methods\n\nWidgets have methods that invoke operations on them. Sometimes, they are required to be called in order to display the widgets (like the `open` method on `shell` and `message_box`)\n\nExample of a shell with a `text` property and an invoked `open` method operation.\n\n```ruby\nshell {\n  text 'Hello, World!'\n}.open\n```\n\nIf you need more widgets, you can check out the [Nebula Project](https://github.com/AndyObtiva/glimmer-cw-nebula) (50+ enterprise-grade custom widgets)\n\nLearn more at:\n\n[docs/reference/GLIMMER_GUI_DSL_SYNTAX.md](docs/reference/GLIMMER_GUI_DSL_SYNTAX.md)\n\n## Glimmer Configuration\n\nGlimmer configuration may be done via the `Glimmer::Config` module.\n\nLearn more at:\n\n[docs/reference/GLIMMER_CONFIGURATION.md](docs/reference/GLIMMER_CONFIGURATION.md)\n\n## Glimmer Style Guide\n\n[docs/reference/GLIMMER_STYLE_GUIDE.md](docs/reference/GLIMMER_STYLE_GUIDE.md)\n\n## Samples\n\nSee a listing of samples including screenshots and explanations at:\n\n[docs/reference/GLIMMER_SAMPLES.md](/docs/reference/GLIMMER_SAMPLES.md)\n\nCheck the [samples](/docs/reference/GLIMMER_SAMPLES.md) directory in [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt) for examples on how to write Glimmer applications. To run a sample, make sure to install the `glimmer-dsl-swt` gem first and then run:\n```\nglimmer samples\n```\n \n(alternatively, you may clone the repo, follow [CONTRIBUTING.md](CONTRIBUTING.md) instructions, and run samples locally with development glimmer command: `bin/glimmer`)\n\n![Glimmer Meta-Sample](/images/glimmer-meta-sample.png)\n\n## In Production\n\nThe following production apps have been built with Glimmer.\n\nIf you have a Glimmer app you would like referenced here, please mention in a Pull Request.\n\n### Math Bowling\n\n[\u003cimg alt=\"Math Bowling Logo\" src=\"https://raw.githubusercontent.com/AndyObtiva/MathBowling/master/images/math-bowling-logo.png\" width=\"40\" /\u003eMath Bowling](https://github.com/AndyObtiva/MathBowling): an educational math game for elementary level kids\n\n[![Math Bowling App Screenshot](https://raw.githubusercontent.com/AndyObtiva/MathBowling/master/Math-Bowling-Screenshot.png)](https://github.com/AndyObtiva/MathBowling)\n\n### Gladiator\n\n[\u003cimg src='https://raw.githubusercontent.com/AndyObtiva/glimmer-cs-gladiator/master/images/glimmer-cs-gladiator-logo.png' height=40 /\u003e Gladiator](https://github.com/AndyObtiva/glimmer-cs-gladiator) (short for Glimmer Editor) is a code editor built with Ruby.\n\n[\u003cimg src=\"https://raw.githubusercontent.com/AndyObtiva/glimmer-cs-gladiator/master/images/glimmer-gladiator.png\" /\u003e](https://github.com/AndyObtiva/glimmer-cs-gladiator)\n\nGladiator is a good demonstration of:\n- MVP Pattern\n- Tree data-binding\n- List data-binding\n- Text selection data-binding\n- Tabs\n- Context menus\n- Custom Shell\n- Custom widget\n\n### Are We There Yet?\n\n[\u003cimg alt=\"Are We There Yet Logo\" src=\"https://raw.githubusercontent.com/AndyObtiva/are-we-there-yet/master/are-we-there-yet-logo.svg\" width=\"40\" /\u003eAre We There Yet?](https://github.com/AndyObtiva/are-we-there-yet): A tool that helps you learn when your small projects will finish\n\n[![Are We There Yet? App Screenshot](https://raw.githubusercontent.com/AndyObtiva/are-we-there-yet/master/are-we-there-yet-screenshot-windows.png)](https://github.com/AndyObtiva/are-we-there-yet)\n\nThis [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) application connects to a [SQLite](https://www.sqlite.org/index.html) database using [ActiveRecord](https://rubygems.org/gems/activerecord).\n\n### Garderie Rainbow Daily Agenda\n\n[\u003cimg alt=\"Garderie Rainbow Daily Agenda Logo\" src=\"https://github.com/AndyObtiva/garderie_rainbow_daily_agenda/raw/master/images/garderie_rainbow_daily_agenda_logo.png\" width=\"40\" /\u003eGarderie Rainbow Daily Agenda](https://github.com/AndyObtiva/garderie_rainbow_daily_agenda): A child nursery daily agenda reporting desktop app\n\n[![Garderie Rainbow Daily Agenda App Screenshot](https://github.com/AndyObtiva/garderie_rainbow_daily_agenda/raw/master/images/garderie_rainbow_daily_agenda_screenshot.png)](https://github.com/AndyObtiva/garderie_rainbow_daily_agenda)\n\nThis [Glimmer DSL for SWT](https://rubygems.org/gems/glimmer-dsl-swt) application connects to a [Rails](https://rubyonrails.org/) server to submit a nursery child daily agenda via a REST API, storing data in [PostgreSQL](https://www.postgresql.org/).\n\n### Glimmer Gab\n\n[\u003cimg alt=\"Glimmer Gab Logo\" src=\"https://raw.githubusercontent.com/AndyObtiva/glimmer_gab/master/package/linux/Glimmer%20Gab.png\" height=40 /\u003e Glimmer Gab](https://github.com/AndyObtiva/glimmer_gab): Desktop App for Gab.com\n\n[![Glimmer Gab App Screenshot](https://github.com/AndyObtiva/glimmer_gab/raw/master/screenshots/glimmer-gab-mac.png)](https://github.com/AndyObtiva/glimmer_gab)\n\n### Connector\n\n[\u003cimg alt=\"Connector Logo\" src=\"https://raw.githubusercontent.com/AndyObtiva/connector/master/package/linux/Connector.png\" height=40 /\u003e Connector](https://github.com/AndyObtiva/connector): A minimalist open-source multi-engine web browser\n\n[![Connector App Screenshot](https://github.com/AndyObtiva/connector/raw/master/images/connector-mac.png)](https://github.com/AndyObtiva/connector)\n\n### The DCR Programming Language\n\n[\u003cimg alt=\"Connector Logo\" src=\"https://raw.githubusercontent.com/AndyObtiva/dcr/f31cd45a8503051e899ed8e831fd03654d38e418/package/linux/Draw%20Color%20Repeat.png\" height=40 /\u003e Draw Color Repeat](https://github.com/AndyObtiva/dcr): A young boy programming language for Drawing and Coloring with Repetition\n\n[![DCR App Screenshot](https://github.com/AndyObtiva/dcr/raw/master/images/dcr-screenshot.png)](https://github.com/AndyObtiva/dcr)\n\n### Befunge 98 Programming Language\n\n[Befunge 98 GUI](https://github.com/AndyObtiva/befunge98/tree/gui)\n\n[![Befunge 98 App Screenshot](https://github.com/AndyObtiva/befunge98/raw/gui/gui/glimmer-dsl-swt/befunge98_gui_glimmer_dsl_swt/screenshots/befunge98_gui_glimmer_dsl_swt_example_output.png)](https://github.com/AndyObtiva/befunge98/tree/gui)\n\n### Glimmer Klondike Solitaire\n\n[\u003cimg alt=\"Glimmer Klondike Solitaire Icon\" src=\"https://raw.githubusercontent.com/AndyObtiva/glimmer_klondike_solitaire/master/icons/linux/Glimmer%20Klondike%20Solitaire.png\" height=40 /\u003e Glimmer Klondike Solitaire](https://github.com/AndyObtiva/glimmer_klondike_solitaire)\n\n[![Glimmer Klondike Solitaire App Screenshot](https://github.com/AndyObtiva/glimmer_klondike_solitaire/raw/master/images/glimmer-klondike-solitaire.png)](https://github.com/AndyObtiva/glimmer_klondike_solitaire)\n\n### Glimmer Metronome\n\n[\u003cimg src=\"https://raw.githubusercontent.com/AndyObtiva/glimmer_metronome/master/icons/linux/Glimmer%20Metronome.png\" height=40 /\u003e Glimmer Metronome](https://github.com/AndyObtiva/glimmer_metronome)\n\n[![Glimmer Metronome App Screenshot](https://raw.githubusercontent.com/AndyObtiva/glimmer_metronome/master/screenshots/glimmer-metronome.gif)](https://github.com/AndyObtiva/glimmer_metronome)\n\n### Glimmer Wordle\n\n[\u003cimg src='https://raw.githubusercontent.com/AndyObtiva/glimmer_wordle/master/icons/linux/Glimmer Wordle.png' height=40 /\u003e Glimmer Wordle - Word Game](https://github.com/AndyObtiva/glimmer_wordle)\n\n[![Glimmer Wordle App Screenshot](https://github.com/AndyObtiva/glimmer_wordle/raw/master/screenshots/glimmer-wordle.png)](https://github.com/AndyObtiva/glimmer_wordle)\n\n## Packaging \u0026 Distribution\n\nGlimmer simplifies the process of native-executable packaging and distribution on Mac and Windows via a single command:\n\n```\nglimmer package\n```\n\nLearn more at: [docs/reference/GLIMMER_PACKAGING_AND_DISTRIBUTION.md](docs/reference/GLIMMER_PACKAGING_AND_DISTRIBUTION.md)\n\n## App Updates\n\nGlimmer should have support for automatic (and manual) app updates via the Mac App Store on the Mac (not tested yet, so contributor help is appreciated). Getting on the App Store requires running the `glimmer package` command with the Mac App Store keys configured as per the [Mac Application Distribution](mac-application-distribution) instructions.\n\n## Glimmer Supporting Libraries\n\nHere is a list of notable 3rd party gems used by Glimmer:\n- [juwelier](https://rubygems.org/gems/juwelier): generates app gems during [Glimmer Scaffolding](https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/docs/reference/GLIMMER_COMMAND.md#scaffolding)\n- [logging](https://github.com/TwP/logging): provides extra logging capabilities not available in Ruby Logger such as multi-threaded buffered asynchronous logging (to avoid affecting app performance) and support for multiple appenders such as stdout, syslog, and log files (the last one is needed on Windows where syslog is not supported)\n- [nested_inherited_jruby_include_package](https://github.com/AndyObtiva/nested_inherited_jruby_include_package): makes included [SWT](https://www.eclipse.org/swt/)/[Java](https://www.java.com/en/) packages available to all classes/modules that mix in the Glimmer module without having to manually reimport\n- [os](https://github.com/rdp/os): provides OS detection capabilities (e.g. `OS.mac?` or `OS.windows?`) to write cross-platform code inexpensively\n- [puts_debuggerer](https://github.com/AndyObtiva/puts_debuggerer): helps in troubleshooting when adding `require 'pd'` and using the `pd` command instead of `puts` or `p` (also `#pd_inspect` or `#pdi` instead of `#inspect`)\n- [rake](https://github.com/ruby/rake): used to implement and execute `glimmer` commands\n- [rake-tui](https://github.com/AndyObtiva/rake-tui): Rake Text-based User Interface. Allows navigating rake tasks with arrow keys and filtering task list by typing to quickly find an run a rake task.\n- [rouge](https://github.com/rouge-ruby/rouge): Ruby syntax highlighter used in the `code_text` [Glimmer DSL for SWT custom widget](#custom-widgets) leveraged by the [Glimmer Meta-Sample](/docs/reference/GLIMMER_SAMPLES.md#samples)\n- [super_module](https://github.com/AndyObtiva/super_module): used to cleanly write the Glimmer::UI:CustomWidget and Glimmer::UI::CustomShell modules\n- [text-table](https://github.com/aptinio/text-table): renders textual data in a textual table for the command-line interface of Glimmer\n- [warbler](https://github.com/jruby/warbler): converts a Glimmer app into a Java JAR file during packaging\n\n## Glimmer Process\n\n[Glimmer Process](https://github.com/AndyObtiva/glimmer/blob/master/PROCESS.md) is the lightweight software development process used for building Glimmer libraries and Glimmer apps, which goes beyond Agile, rendering all Agile processes obsolete. [Glimmer Process](https://github.com/AndyObtiva/glimmer/blob/master/PROCESS.md) is simply made up of 7 guidelines to pick and choose as necessary until software development needs are satisfied.\n\nLearn more by reading the [GPG](https://github.com/AndyObtiva/glimmer/blob/master/PROCESS.md) (Glimmer Process Guidelines)\n\n## Resources\n\n* [Glimmer DSL for SWT Video Tutorials](https://andymaleh.blogspot.com/search/label/Tutorial+SWT) ([Video Tutorial Playlist](https://www.youtube.com/watch?v=Mi5phsSdNAA\u0026list=PLSN9HhZ_0-n741vRa_dL-M81cLbqD_kem) and [Video Tutorial Channel](https://www.youtube.com/channel/UC5hzDE23HZXsZLAxYk2UJEw))\n* [Code Master Blog](http://andymaleh.blogspot.com/search/label/Glimmer)\n* [JRuby Cookbook by Justin Edelson \u0026 Henry Liu](http://shop.oreilly.com/product/9780596519650.do)\n* [InfoQ Article](http://www.infoq.com/news/2008/02/glimmer-jruby-swt)\n* [DZone Tutorial](https://dzone.com/articles/an-introduction-glimmer)\n* [MountainWest RubyConf 2011 Video](https://confreaks.tv/videos/mwrc2011-whatever-happened-to-desktop-development-in-ruby)\n* [RubyConf 2008 Video](https://confreaks.tv/videos/rubyconf2008-desktop-development-with-glimmer)\n\n### SWT Reference\n\nhttps://www.eclipse.org/swt/docs.php\n\nHere is the SWT Javadoc API:\n\nhttps://www.eclipse.org/swt/javadoc.php\n\nHere is a visual list of SWT widgets:\n\nhttps://www.eclipse.org/swt/widgets/\n\nHere is a textual list of SWT widgets:\n\nhttps://help.eclipse.org/2019-12/topic/org.eclipse.platform.doc.isv/guide/swt_widgets_controls.htm?cp=2_0_7_0_0\n\nHere is a list of SWT style bits as used in widget declaration:\n\nhttps://wiki.eclipse.org/SWT_Widget_Style_Bits\n\nHere is a SWT style bit constant reference:\n\nhttps://help.eclipse.org/2019-12/nftopic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/swt/SWT.html\n\nHere is an SWT Layout guide:\n\nhttps://www.eclipse.org/articles/Article-Understanding-Layouts/Understanding-Layouts.htm\n\nHere is an SWT Custom Widget guide:\n\nhttps://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm\n\nHere is an SWT Drag and Drop guide:\n\nhttps://www.eclipse.org/articles/Article-SWT-DND/DND-in-SWT.html\n\nHere is an SWT Graphics / Canvas-Drawing guide:\n\nhttps://www.eclipse.org/articles/Article-SWT-graphics/SWT_graphics.html\n\nHere is an SWT Image guide:\n\nhttps://www.eclipse.org/articles/Article-SWT-images/graphics-resources.html\n\nHere is the Nebula Project (custom widget library) homepage:\n\nhttps://www.eclipse.org/nebula/\n\n## Help\n\n### Issues\n\nYou may submit [issues](https://github.com/AndyObtiva/glimmer-dsl-swt/issues) on [GitHub](https://github.com/AndyObtiva/glimmer-dsl-swt/issues).\n\n[Click here to submit an issue.](https://github.com/AndyObtiva/glimmer-dsl-swt/issues)\n\n### Chat\n\nIf you need live help, try to [![Join the chat at https://gitter.im/AndyObtiva/glimmer](https://badges.gitter.im/AndyObtiva/glimmer.svg)](https://gitter.im/AndyObtiva/glimmer?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n## Feature Suggestions\n\nThese features have been suggested. You might see them in a future version of Glimmer. You are welcome to contribute more feature suggestions.\n\n[TODO.md](TODO.md)\n\nGlimmer DSL Engine specific tasks are at:\n\n[glimmer/TODO.md](https://github.com/AndyObtiva/glimmer/blob/master/TODO.md)\n\n## Change Log\n\n[CHANGELOG.md](CHANGELOG.md)\n\nAlso: [glimmer/CHANGELOG.md](https://github.com/AndyObtiva/glimmer/blob/master/CHANGELOG.md)\n\n## Contributing\n\n**Contributors Wanted!**\n\nIf you would like to contribute to Glimmer, please study up on Glimmer and [SWT](#swt-reference), run all Glimmer [samples](#samples), and build a small sample app (perhaps from [this TODO list](https://github.com/AndyObtiva/glimmer-dsl-swt/blob/master/TODO.md#samples)) to add to [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt) Hello or Elaborate samples via a Pull Request. Once done, contact me on [Chat](#chat).\n\nYou may apply for contributing to any of these Glimmer DSL gems whether you prefer to focus on the desktop or web:\n- [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt): Glimmer DSL for SWT (Desktop GUI)\n- [glimmer-dsl-opal](https://github.com/AndyObtiva/glimmer-dsl-opal): Glimmer DSL for Opal (Web GUI Adapter for Desktop Apps)\n- [glimmer-dsl-xml](https://github.com/AndyObtiva/glimmer-dsl-xml): Glimmer DSL for XML (\u0026 HTML)\n- [glimmer-dsl-css](https://github.com/AndyObtiva/glimmer-dsl-css): Glimmer DSL for CSS (Cascading Style Sheets)\n\n[CONTRIBUTING.md](CONTRIBUTING.md)\n\n## Contributors\n\n* [Andy Maleh](https://github.com/AndyObtiva) (Founder)\n* [Dennis Theisen](https://github.com/Soleone) (Contributor, originally in [Glimmer](https://github.com/AndyObtiva/glimmer/graphs/contributors) before splitting [glimmer-dsl-swt](https://rubygems.org/gems/glimmer))\n* [Wayne Vucenic](https://github.com/rubycoder)\n\n[Click here to view contributor commits.](https://github.com/AndyObtiva/glimmer-dsl-swt/graphs/contributors)\n\n## License\n\n[MIT](LICENSE.txt)\n\nCopyright (c) 2007-2025 - Andy Maleh.\n\n--\n\n[\u003cimg src=\"https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png\" height=40 /\u003e](https://github.com/AndyObtiva/glimmer) Built for [Glimmer](https://github.com/AndyObtiva/glimmer) (DSL Framework).\n\nGlimmer logo was made by [Freepik](https://www.flaticon.com/authors/freepik) from [www.flaticon.com](http://www.flaticon.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAndyObtiva%2Fglimmer-dsl-swt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FAndyObtiva%2Fglimmer-dsl-swt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAndyObtiva%2Fglimmer-dsl-swt/lists"}