free-launch 0.2.8

A simple fuzzy launcher written in Rust.
Documentation
# Basic Features

A fuzzy launcher written in Rust 2024 edition.

## Basics

- Runs on NixOS under GNOME or wlroots.
- Uses the `eframe` and `egui` libraries for GUI rendering.
- When invoked, it should popup a window in the middle of the primary screen.
- The window should respond to common interactions:
  - `Ctrl-w` and `Ctrl-q` should close the window and quit the app.
  - The window should be resizable by dragging the edges with the mouse.

## Functionality

- The window should contain a text box and a list of matched items below the text box.
- Items available for launch should include:
  - all available `*.desktop` files.
  - search template entries from `~/.config/search/config.yaml` for the `search` crate from cargo.
  - running apps
- An icon for each item should be displayed to its left.
- The first item in the list should be selected by default.

## Interaction

- When pressing the up and down arrow keys, the selected item should change respectively.
- Page Up and Page Down should move the selection to the top or bottom of the visible items. The second press should move the list of items up or down by the number of items currently being displayed.
- The home and end keys should move to the first last items in the list respectively.
- Pressing Return or Enter should:
  - launch the selected item if it is a `desktop` item.
  - switch to a view that allows the user to type a search query if the selected item is a search template.
- Clicking on an item should launch it as well.

### Item Chaining

It should be possible to feed one item to another e.g. the current clipboard contents to a text processing script.

- The `Tab` key should invoke the selector to choose the second item in the chain.
- The currently selected item should be invoked and the `ActionResult` collected.
  - It's this `ActionResult` that will be passed in to the next item as it's input, unless the result is an Error result.
  - We may wish to make execution async in the future.
- Items that take input should pull input from the clipboard if they are the first item in the chain.
- Output should default to the clipboard, unless a destination item such as `New File` is chosen.

## Sorting

- When the text box is empty, the items in the list should be based on "frecency" a combination of the most frequently launched and most recently launched items.
- When text is entered into the box, the list should update based on fuzzy matches of items by name or description.
  - The listed items should be sorted in order of frecency.

## Performance

- Loading should take place in separate threads
- Completed items should be cached via something like [Bincode]https://lib.rs/crates/bincode so everything can be reloaded via a single file
- As other background loaders collect data, it should augment/update the items that were loaded from cache

## Launch Sources

The types of items we support for launching:

- [x] [Desktop Entry Specification](https://specifications.freedesktop.org/desktop-entry/latest/index.html) files
- [x] Search templates for [search-cli]https://lib.rs/crates/search-cli
- [ ] Running programs
- [ ] Markdown files
- [ ] Projects
- [ ] Repos
- [ ] Contacts
- [ ] KeePass entries
- [ ] Firefox Tabs
- [ ] Firefox Bookmarks
- [ ] Firefox History
- [ ] Pictures
- [ ] Videos
- [ ] Audio
- [ ] Clipboard entries
- [ ] [FreeTube](https://github.com/FreeTubeApp/FreeTube) history and playlist entries

## Supported Actions

- [ ] Launch
- [ ] Reveal
- [ ] Append
- [ ] Extract/OCR
- [ ] QuickView like [sushi]https://gitlab.gnome.org/GNOME/sushi
- [ ] Kill