App launcher and fuzzy finder for Wayland, inspired by rofi(1) and dmenu(1).
Find a file
Peter Colberg 65a037a507
All checks were successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
ci/woodpecker/push/woodpecker Pipeline was successful
match: fix false-positive use-after-free after failed reallocarray()
With GCC 14.2.0 on Debian sid, fuzzel fails to build [1] on some non-x86
archs [2] due to a false-positive use-after-free error for free(tokens)
or free(tok_lengths), in the case where the corresponding reallocarray()
call fails. Revise error handling to free() immediately after a failing
reallocarray(), so that GCC follows that the calls to free() are valid.

[1] https://buildd.debian.org/status/fetch.php?pkg=fuzzel&arch=riscv64&ver=1.11.1%2Bds-1&stamp=1726441493&raw=0
[2] loong64, m68k, mips64el, powerpc, ppc64, ppc64el, riscv64, and s390x.
2024-10-26 19:16:39 -04:00
.builds ci (sr.ht): pull directly from git.sr.ht 2022-08-23 16:43:36 +02:00
3rd-party/nanosvg nanosvg: silence "may be used uninitialized" warning 2024-07-14 13:35:31 +02:00
completions fixup: rename to --hide-before-typing 2024-09-11 11:47:43 -04:00
doc docs: Document how to disable large images 2024-09-19 11:07:57 -04:00
external external: wlr-protocols: bump 2021-06-27 10:52:14 +02:00
nanosvg meson/nanosvg: add support for linking against system's nanosvg 2024-07-18 18:09:55 +02:00
subprojects subprojects: use meson *.wrap files for tllist+fcft 2020-12-24 13:26:02 +01:00
test test: Add test coverage for fzf mode sorting early-string matches higher 2024-10-02 09:38:33 -04:00
.gitignore gitignore: ignore .cache 2022-08-09 18:42:34 +02:00
.gitmodules fcft/tllist: remove git submodules 2020-01-11 14:47:47 +01:00
.woodpecker.yaml ci: add a cairo-librsvg-no-png build 2024-08-14 11:50:56 +02:00
application.c application: reset shaped_bold to NULL on text run flush 2024-09-05 07:33:31 +02:00
application.h render: add support for rendering the selected entry in bold 2024-08-20 08:42:01 +02:00
CHANGELOG.md wayland: don't commit any buffers until the surface has been configured 2024-10-04 12:35:32 +02:00
char32.c dmenu: start rendering input before STDIN has been closed 2024-08-20 08:08:04 +02:00
char32.h dmenu: start rendering input before STDIN has been closed 2024-08-20 08:08:04 +02:00
clipboard.c Fix release build with GCC 11.x 2024-10-02 08:35:03 +02:00
clipboard.h Add support for pasting text 2024-08-24 08:34:51 +02:00
config.c config: bugfix: support XDG_CONFIG_HOME as absolute path 2024-09-11 12:08:27 -04:00
config.h Added "hide-when-prompt-empty" command line and config option 2024-09-01 17:38:14 +02:00
debug.c render: render match list using multiple rendering threads 2024-08-14 09:50:24 +02:00
debug.h render: render match list using multiple rendering threads 2024-08-14 09:50:24 +02:00
dmenu.c diagnostics: demote 'aborted' logging to debug level. 2024-09-11 11:59:33 -04:00
dmenu.h dmenu: start rendering input before STDIN has been closed 2024-08-20 08:08:04 +02:00
event.c dmenu: start rendering input before STDIN has been closed 2024-08-20 08:08:04 +02:00
event.h dmenu: start rendering input before STDIN has been closed 2024-08-20 08:08:04 +02:00
fdm.c tllist: is now an external "library", so use <> includes 2019-11-17 19:18:21 +01:00
fdm.h fdm: sync with latest FDM - fdm_del() now closes FD 2019-11-05 11:00:15 +01:00
fuzzel.ini fixup: rename to --hide-before-typing 2024-09-11 11:47:43 -04:00
generate-version.sh generate-version: handle git repo not having any tags 2021-10-11 20:22:58 +02:00
icon.c dmenu: start rendering input before STDIN has been closed 2024-08-20 08:08:04 +02:00
icon.h icon: icon_reload_application_icons() -> icon_lookup_application_icons() 2022-04-17 23:28:09 +02:00
key-binding.c key-binding: disable debug logging by default 2022-10-28 16:32:06 +02:00
key-binding.h Add support for pasting text 2024-08-24 08:34:51 +02:00
LICENSE license: fix bad copy-paste: first commit was in 2019 2020-07-25 08:51:51 +02:00
log.c log: respect the NO_COLOR environment variable 2024-07-18 08:36:13 +02:00
log.h main: add --log-level=none|info|warning|error command line option 2022-02-04 23:13:23 +01:00
macros.h macros: add missing UNREACHABLE() 2024-08-14 09:55:32 +02:00
main.c Merge branch 'hide-when-prompt-empty' 2024-09-11 11:48:35 -04:00
match.c match: fix false-positive use-after-free after failed reallocarray() 2024-10-26 19:16:39 -04:00
match.h match: do matching/filtering using a thread pool 2024-08-20 08:29:37 +02:00
meson.build meson+pkgbuild: bump version to 1.11.1 2024-09-13 08:35:36 +02:00
meson_options.txt meson/nanosvg: add support for linking against system's nanosvg 2024-07-18 18:09:55 +02:00
nanosvg.c meson/nanosvg: add support for linking against system's nanosvg 2024-07-18 18:09:55 +02:00
nanosvgrast.c meson/nanosvg: add support for linking against system's nanosvg 2024-07-18 18:09:55 +02:00
path.c path: initialize lower-case title, and the title-length fields 2024-08-25 11:16:33 +00:00
path.h Add --list-executables-in-path command line option 2024-01-05 11:14:36 +00:00
PKGBUILD meson+pkgbuild: bump version to 1.11.1 2024-09-13 08:35:36 +02:00
png-fuzzel.h svg: add support for using nanosvg as SVG backend 2021-10-07 19:18:54 +02:00
png.c png: handle unrecognized PNG color types (by erroring out) 2024-08-14 09:49:31 +02:00
prompt.c Add support for pasting text 2024-08-24 08:34:51 +02:00
prompt.h Add support for pasting text 2024-08-24 08:34:51 +02:00
README.md test: minimium viable test suite 2024-10-02 13:26:41 +00:00
render.c render: fix cursor glitches with custom line heights 2024-10-02 07:49:05 +02:00
render.h render: font-shape the input string 2024-09-05 11:26:29 +02:00
shm.c Fix compilation with librsvg after adding threading rendering 2024-08-14 10:59:34 +02:00
shm.h Fix compilation with librsvg after adding threading rendering 2024-08-14 10:59:34 +02:00
stride.h Add missing file 2019-09-29 13:00:03 +02:00
uri.c Add support for pasting text 2024-08-24 08:34:51 +02:00
uri.h Add support for pasting text 2024-08-24 08:34:51 +02:00
wayland.c wayland: don't commit any buffers until the surface has been configured 2024-10-04 12:35:32 +02:00
wayland.h Add support for pasting text 2024-08-24 08:34:51 +02:00
xdg.c match: do matching/filtering using a thread pool 2024-08-20 08:29:37 +02:00
xdg.h config: new option filter-desktop 2023-06-06 09:31:32 -07:00

CI status

Fuzzel

Fuzzel is a Wayland-native application launcher and fuzzy finder, inspired by rofi and dmenu.

Packaging status

Screenshot

Screenshot

Fuzzel, with transparency, on top of a browser window showing a diff of a fuzzel commit

Features

For app launching

  • Fuzzy-find applications from a list and launch them
  • Icon support
  • Remembers frequently launched applications
  • Customize which .desktop files are searched
  • Option to filter apps based on OnlyShowIn and NotShowIn
  • Startup notification support
  • Launch prefix option to customize how apps are launched
  • Display a large icon of current selection if there are only a few matches
  • Option to display executables in $PATH
  • Option to execute the input rather than return an app
  • Support for localized strings

For dmenu mode

  • dmenu mode where newline separated entries are read from STDIN
  • Support for Rofi's protocol to support icons
  • Optional cache with custom path
  • Password mode
  • Prompt-only mode
  • Exact-match option to support multi-stage menus
  • Option to return index of what's selected rather than what's selected
  • Some dmenu option compatibility. Invoking it as dmenu enables dmenu mode
  • Option for null-separated input

For all modes

  • Numerous customizable key bindings, based on Emacs
  • Mouse support
  • Paste support
  • A number of theming options, which can be set in a separate include file
  • fzf-style matching with ability to filter huge lists
  • Optimized for performance
  • Zsh and Fish completions
  • Support for true fractional scaling
  • Wayland native

For details, see man fuzzel and man fuzzel.ini

Requirements

Runtime

  • pixman
  • wayland (client and cursor libraries)
  • xkbcommon
  • cairo (optional, required by librsvg)
  • libpng (optional)
  • librsvg (optional, for enhanced SVG icon support)
  • fcft 1

Fuzzel uses the builtin nanosvg backend to render SVG icons by default. Since nanosvg is somewhat limited, we also offer a librsvg backend for SVG icons. Note that librsvg also requires cairo.

Building

  • meson
  • ninja
  • wayland protocols
  • scdoc
  • tllist 1

Installation

To build, first, create a build directory, and switch to it:

mkdir -p bld/release && cd bld/release

Second, configure the build (if you intend to install it globally, you might also want --prefix=/usr):

meson --buildtype=release \
    -Denable-cairo=disabled|enabled|auto \
    -Dpng-backend=none|libpng \
    -Dsvg-backend=none|librsvg|nanosvg \
    ../..

-D{png,svg}-backend can be used to force-enable or force-disable a specific png and/or svg backend. Note that nanosvg is builtin (i.e. it needs to external dependencies).

-Denable-cairo can be used to force-enable or force-disable cairo support. When disabled, fuzzel will not be able to draw rounded corners, nor will it support SVGs using the librsvg backend.

Three, build it:

ninja

You can now run it directly from the build directory:

./fuzzel

Use command line arguments to configure the look-and-feel:

./fuzzel --help

Optionally, install it:

ninja install

For more detailed configuration information, see the man pages:

man fuzzel
man fuzzel.ini

Testing

Fuzzel has some automated tests in test/. To run them, Fish shell and wtype are required. The test runner can be installed within Fish shell with:

fisher install jorgebucaran/fishtape

Once installed, the tests can be run with:

fishtape test/*.fish

License

Fuzzel is released under the MIT license.

Fuzzel uses nanosvg, released under the Zlib license.


  1. can also be built as subprojects, in which case they are statically linked. ↩︎