Em∃nu - app to call on screen round menu to do some commands. The idea is to have something like dmenu but with simple touch action
  • Go 98.9%
  • Makefile 1.1%
Find a file
Arnas Udovic 5710630b34
All checks were successful
Backend Build and Test / backend-tasks (push) Successful in 54s
wrong project in badge
2026-06-02 17:15:13 +03:00
.forgejo/workflows add build badge and action 2026-06-02 17:12:05 +03:00
.gitignore basic layout 2026-04-20 11:55:47 +03:00
CHANGELOG.md changelog update 2026-05-21 07:52:33 +03:00
gl_legacy.go moved to glfw and opengl 2026-05-20 19:36:15 +03:00
go.mod moved to glfw and opengl 2026-05-20 19:36:15 +03:00
go.sum moved to glfw and opengl 2026-05-20 19:36:15 +03:00
LICENSE Initial commit 2026-04-19 06:43:08 +00:00
main.go changelog update 2026-05-21 07:52:33 +03:00
Makefile wayland build instruction 2026-05-20 19:47:36 +03:00
README.md wrong project in badge 2026-06-02 17:15:13 +03:00
touch_stub.go to support 2026-05-21 06:42:56 +03:00
touch_wayland.go to support 2026-05-21 06:42:56 +03:00

emenu

Version Build Status

Em∃nu - A circular command launcher for touch screens and mice, built with Go, GLFW, and OpenGL.

The idea is to have something like dmenu or rofi but with a simple touch-friendly circular interface, similar to old Android radial menus.

Features

  • Circular Layout: Commands are arranged in a ring around a central button.
  • Tree-like Structure: Supports nested submenus for organizing many commands.
  • Touch Friendly: Large targets and intuitive navigation make it ideal for touch screens.
  • Lightweight: Fast startup and minimal resource usage.
  • Customizable: Colors and command trees can be configured via command-line flags.

Prerequisites

  • Go 1.26 or later.
  • Development libraries for GLFW and OpenGL.

Linux Dependencies

On Linux, GLFW uses its X11 backend by default unless you build with the wayland tag.

For Wayland builds, install Wayland, xkbcommon, EGL/OpenGL development packages:

postmarketOS / Alpine:

doas apk add wayland-dev libxkbcommon-dev mesa-dev

Ubuntu / Debian:

sudo apt install libwayland-dev libxkbcommon-dev libegl1-mesa-dev libgl1-mesa-dev

Arch Linux:

sudo pacman -S wayland libxkbcommon mesa

For the default X11 build, install X11 development packages too:

sudo apt install xorg-dev libgl1-mesa-dev

Installation & Running

  1. Clone the repository:

    git clone https://g.arns.lt/zordsdavini/emenu
    cd emenu
    
  2. Build the application:

    go build -o emenu .
    

    On Wayland without X11 development headers, build with the wayland tag:

    go build -tags wayland -o emenu .
    

    Or use:

    make build-wayland
    
  3. Run it:

    ./emenu
    

Configuration

You can customize emenu using flags:

  • -commands: JSON string defining the menu structure.
  • -color: Hex color for command labels (default #2563ebd9).
  • -root-color: Hex color for the root center circle (default #111827d9).
  • -cancel-color: Hex color for the close button (default #dc2626d9).
  • -back-color: Hex color for the back button (default #f97316d9).
  • -scale: UI scale factor for touch targets and text (default 2.5).
  • -debug: Enable debug logging.
  • -version: Print version and exit.

emenu requests a transparent GLFW framebuffer. On systems that support it, the window background is transparent and only the menu controls are visible. If transparency still does not work, run with -debug and check whether transparent framebuffer: true is logged.

On Wayland builds, -debug also logs whether native touchscreen input was detected with wayland touch: true.

Example with custom commands:

./emenu -commands '[{"name": "Term", "exec": "st"}, {"name": "Web", "exec": "firefox"}]'

Example with nested submenus (children):

./emenu -commands '[
  {"name": "Apps", "children": [
    {"name": "Editor", "exec": "code"},
    {"name": "Web", "exec": "firefox"}
  ]},
  {"name": "System", "children": [
    {"name": "Monitor", "exec": "gnome-system-monitor"},
    {"name": "Settings", "exec": "gnome-control-center"}
  ]}
]'

Usage

  • Drag the central circle over a command label to select it.
  • Release to execute the command or enter a submenu.
  • Drag to the top red circle with "X" to close the app.
  • Drag and release back in the center to go back in submenus.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

bitcoin: bc1qel3spnk8e2hsmkwn7fcm2drlyjms3ch8t2tek7

monero: 856UP5jqjHt2TjHo6HEvGEciGweLM5kM4ek6tNPUbk57QhJixqntdL5Wt6djPHm3V7D5Zr8FPc8i9ixWfWuSFb1D6u5GuTv