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. |