A configurable, component-based launcher, menu, and bar application in Rust.
System Dependencies: cargo, rustc, and opengl.
Crate Dependencies (autodownloaded): applications, eframe, egui, serde, icns, anyhow, ron, and strum.
- clone the repo (
git clone https://github.com/quinntyx/erun) - enter the repo (
cd erun) - build the repo (
cargo build --release) - copy
target/release/erunto/usr/bin(or your other place of choice)
All in one:
git clone https://github.com/quinntyx/erun
cd erun
cargo build --release
cp target/release/erun /usr/binI really like eww. However, as I used it, I found it somewhat lacking, for a few reasons:
- EWW uses GTK. Gradience has recently been discontinued for GTK, and I'm not too interested in investing further time in GTK theming and design at the moment in any capacity
- EWW is extremely difficult to use, with an insane learning curve. This is due to a combination of factors:
- Custom language (yuck) used for configuration
- Configuration written in a lisp-based language
- Configuration purely functional Fundamentally, I found EWW's configuration too esoteric for widespread adoption or any form of real use.
- EWW doesn't have any good alternatives that can match its feature set or flexibility.
- I haven't seen any tool of this type that supports MacOS.
Many applications exist that can do the same job as EWW piecemeal, but there aren't any that ship something close to EWW's basic feature-set out of the box. This was a problem for me, so I decided to just write something myself.
I also use MacOS, but am not satisfied with Spotlight, so this project will attempt to
support MacOS as well, which many other launchers and panels don't do.
However, due to the relatively locked-down nature of MacOS (and, specifically, lack of support for native OpenGL), some features (like window transparency) may be unsupported on Mac host systems.
erun is not, and probably will never be, a ui toolkit.
erun is, however, intended to be a competent alternative to EWW (elkowar's wacky widgets)
in a way that doesn't mandate you learn a new (functional and lispy) programming language.
In keeping with this philosophy, erun will have a primary goal of keeping the configuration
process as simple as possible, with sane defaults and as many features optional as possible.
erun will also, within reason, attempt to support as many different config file formats
as possible, ensuring a minimal learning curve for any prospective users while granting
maximum flexibility and ease of use.
These formats are currently planned to have first-class support prior to 1.0:
- ron (Rusty Object Notation)
- kdl (Cuddly Data Language)
- json
- Hjson (Human json)
- yaml
- toml
I haven't run any benchmarks, as the software is in extremely early development at the
moment. However, some performance downsides are to be expected, as egui is used in this
project, which is an immediate mode UI toolkit as opposed to the retained-state UI toolkit
used in EWW (GTK) or similar projects.
As the project goes on, I'll make sure to benchmark erun properly and implement
good-by-default performance settings to make sure that no noticeable performance
degradation can be seen as a fault of the tool itself.
- Shell Integration
- Custom list elements from
stdin- Custom list elements for multi-list Windows
stdin
- Custom list elements for multi-list Windows
- Custom list elements from
- Runner
- Auto resize window based on number of hits (possibly related to transparent window), see Spotlight on Mac
- multiple columns in scrolling list (pagenated similar to
rofiaesthetic) - custom run command support
- default to
open
- default to
- custom run args support
- option to make window close after running process
- fork process to outlive parent runner process
-
bridgesettings to override this if runner child needs stdio-
bridge_stdin -
bridge_stdout -
bridge_stderr
-
-
- fork process to outlive parent runner process
- [ ]
- Bar & Panel
- reserve WM space
- spawn window at coordinates
- spawn window on specfic monitor
- default monitor to
PRIMARY
- default monitor to
- spawn window with specified dimensions
- some way to set
WM_IGNOREfor tiling wms that try to manage the window - set window as not resizable
- set window as no decorations
- hide window from taskbar
- hide window from alt-tab
- spawn inactive window (can't receive focus)
- Tests & Examples
- Write automatic serialization tests for all examples in
test_cfg - Generate examples using serde
- Figure out
#[serde(skip_serialize_if)]to improve serialization in cases when generating examples is important and all fields need to be represented (no skipping)
- Write automatic serialization tests for all examples in
- CLI
-
erun open -deserialize window struct fromstdin -
erun openwith no file argument default to readingerun.ronfile from current directory, iterates through possible extensions, then checks~/.config/erun/erun.ronand other extensions, then checks~/.config/erun.ronand other extensions -
erun open [FILE] [FORMAT?]multi-format support in CLI- format default to
inferbased on file extension - some form of inference engine based on file content, for use with
stdindeserialization
- format default to
-
erun example [EXAMPLE] [FORMAT?]multi-format examples in CLI- infer user's preferred format from the located closest config file that would open with
erun open
- infer user's preferred format from the located closest config file that would open with
-
erun help [COMMAND?]outputs for subcommands -
erun helpoutput for main process
-
- Core
- make everything
#[serde(default)]to clean up config format - ron support
- kdl support
- json support
- Hjson support
- yaml support
- toml support
- s-expression (lisp) support
- url encoding support
- xml support
- make xml support better, it's cursed asf rn
- components
- Image
- Actually Show an image instead of crashing with a
todo!() - cache web URIs on local disk and convert from
httporhttpsURIs tobytesURIs for performance (maybe a flag?)
- Actually Show an image instead of crashing with a
- Frame
- Margin
- Padding
- Fill
- Outline
- Multiple Children
- possible
taffyintegration with css grid or flex layouts
- possible
- Label
- Variable
- Button
- List
- Filter search
- search box (currently useless)
- pass filter box content to ListProvider for custom behavior
- smooth scrolling
- pagenation / multi column layout
- ListProvider
- ListProvider::Applications for system apps
- icon support
- MacOS icon support (reading ICNS files)
- MacOS desktop file support
- Linux desktop file support
- Windows start menu applications support
- ListProvider::Stdio for reading from std IO
- some way of getting icons
- ListProvider::Command for running a command
- Command updated based on events
- Events:
- Search field updated (user input)
- flag to pass user input to the command actually running to update
- flag to disable filtering so that the command getting user input can do it manually
- New Frame (Poll)
- Fork thread and poll on regular time intervals
- Run once at init
- Search field updated (user input)
- ListProvider::Applications for system apps
- Image
- serialize colors as hex codes instead of rgba tuples
- serialize
pxandptas a suffixed string instead of an unwieldy enum
- make everything
- Style
- ability to customize fonts
- ability to customize
Widgetsettings - style struct
- background colors
- foreground colors
- panel fill
- window rounding (TODO: Test this, it's untested but "done")
- set zoom factor
- Misc
- spawn fullscreen window
- spawn maximized window
- spawn mouse passthrough window
- spawn invisible window