| Title: Using a game engine to write a graphical interface to the | |
| OpenBSD package manager | |
| Author: Solène | |
| Date: 05 May 2022 | |
| Tags: openbsd godot opensource | |
| Description: In this blog entry I'm explaining why I ended using a game | |
| engine to write a GUI program for OpenBSD and how well it turned. | |
| # Introduction | |
| I'm really trying hard to lower the barrier entry to OpenBSD, I realize | |
| most of my efforts are toward making OpenBSD easier. | |
| One thing I often mumbled about on OpenBSD was the lack of a user | |
| interface to browse packages and install them, there was a console | |
| program named pkg_mgr, but I never got it to work. Of course, I'm | |
| totally able to install packages using the command line, but I like to | |
| stroll looking for packages I wouldn't know about, a GUI is perfect for | |
| doing so, and is also useful for people less comfortable with the | |
| command line. | |
| So, today, I made a graphical user interface (GUI) using OpenBSD, using | |
| a game engine. Don't worry, all the packages operations are delegated | |
| to pkg_add and pkg_delete because they are doing they job fine. | |
| OpenBSD AppManager project website | |
| AppManager main menu | |
| AppManager giving a summary of changes | |
| # What is it doing? | |
| The purpose of this program is simple, display the list of available | |
| packages, highlight in yellow the one you have installed on your | |
| system, and let you select new packages to install or installed | |
| packages to remove. | |
| It features a search input instead of displaying a blunt list of a | |
| dozen of thousands of entries. The development was made on my Thinkpad | |
| T400 (core 2 duo), performance are excellent. | |
| One simple feature I'm proud of is the automatic classification of | |
| packages into three categories: GUI programs, terminal/console user | |
| interface programs and others. While this is not perfect because we | |
| don't have this metadata anywhere, I'm reusing the dependencies' | |
| information to guess in which category each package belongs, so far | |
| it's giving great results. | |
| # About the engine | |
| I rarely write GUI application because it's often very tedious and give | |
| poor results, so the ratio time/result is very bad. I've been playing | |
| with the Godot game engine for a week now, and I was astonished when | |
| I've been told the engine editor is done using the engine itself. As | |
| it was blazing fast and easy to make small games, I wondered if this | |
| would be suitable for a simple program like a package manager | |
| interface. | |
| First thing I checked was if it was supporting sqlite or json data | |
| natively without much work. This was important as the data used to | |
| query the package list is originally found in a sqlite database | |
| provided by the sqlports package, however the sqlite support was only | |
| available through 3rd party code while JSON was natively supported. | |
| When writing then simple script converting data from the sqlite | |
| database into a json, I took the opportunity to add the logic to | |
| determine if it's a GUI or a TUI (Terminal UI) and make the data format | |
| very easy to reuse. | |
| Finally, I got a proof of concept within 2h, it was able to install | |
| packages from a list. Then I added support for displaying already | |
| installed packages and then to delete packages. The polishing of the | |
| interfaces took the most time, but the whole project didn't take more | |
| than 8h which is unbelievable for me. | |
| # Conclusion | |
| From today, I'll seriously think about using Godot for writing GUI | |
| application, did I say it's cross platform? AppManager can be run on | |
| Linux or Windows (given you have pkg.json), except it will just fail at | |
| installing packages, but the whole UI works. | |
| Thinking about it, it could be easy to reuse it for another package | |
| manager. |