wofi(7)
π WOFI π
okay bestie, welcome to wofi(7) from the Miscellaneous Information Manual β this is the page about all the built-in modes and the extra little features, and yes we are gonna get through literally all of it together π
β¨ NAME β¨
wofi β built in modes and other features. that's it, that's the name, slay.
πΈ DESCRIPTION πΈ
So wofi has a bunch of built in modes plus a whole lot of other features β including combi β and this page is where all of that gets documented. you're in the right place, babe π«Ά
important thing first: every config option written up here is stripped of its mode name. Mode specific options get put in the config file in the format mode-example_opt=val.
Example so it's crystal clear: dmenu has an option called parse_action, so in the config file you'd write it like this:
dmenu-parse_action=true
see? mode name, dash, option. that's the whole vibe β¨
π MODES π
right now wofi has 3 built in modes:
runβ searches$PATHfor executables and lets you run them by selecting them.drunβ searches$XDG_DATA_HOME/applicationsand$XDG_DATA_DIRS/applicationsfor desktop files and lets you run them by selecting them.dmenuβ reads from stdin, shows you the options, and whatever you select gets output to stdout.
if $XDG_DATA_HOME isn't specified it defaults to ~/.local/share. if $XDG_DATA_DIRS isn't specified it defaults to:
/usr/local/share:/usr/share
Now β combi. it's not a mode, bestie, it's a feature. you use it like this:
--show mode1,mode2,mode3,etc
you can mix and match any number of modes, BUT each mode can only be loaded once. so something like --show run,drun,run is not supported. (and honestly? not sure why you'd do that in the first place π)
π DMENU CONFIG OPTIONS π
parse_action=BOOLβ if true, the result dmenu hands back gets stripped of image escape sequences and pango markup. default isfalse.separator=CHARβ the character used to separate dmenu entries. default is\n.print_line_num=BOOLβ when an entry gets selected, instead of printing the entry itself it prints the number of the line that entry was on. heads up: this disables caching, because it's fundamentally incompatible with it.
π₯ RUN π₯
in run mode, holding ctrl while running an entry makes the arguments get parsed β even if always_parse_args=false. holding shift makes the entry run in a terminal. little keyboard shortcuts, big energy π
π RUN CONFIG OPTIONS π
always_parse_args=BOOLβ if true, spaces won't be treated as part of the executable name, they get treated as an argument separator β same thing as holding control while pressing enter. default isfalse.show_all=BOOLβ if true, shows all the entries in path, including entries that have the same executable name. for example/bin/bashand/usr/bin/bashget shown separately as bash, instead of there just being one bash entry for the first one encountered. default istrue.print_command=BOOLβ if true, the executable that would be run gets printed to stdout instead of actually being executed. default isfalse.
π¦ DRUN CONFIG OPTIONS π¦
print_command=BOOLβ if true, the command used to launch the desktop file gets printed to stdout instead of being invoked. default isfalse.display_generic=BOOLβ if true, generic names get displayed in()right next to the application name. default isfalse.disable_prime=BOOLβ if true, wofi will ignore thePrefersNonDefaultGPUdesktop variable β specifically, this stops wofi from settingDRI_PRIME. default isfalse.print_desktop_file=BOOLβ if true, the path to the desktop file and the name of the corresponding action (if there is one) get printed to stdout instead of being invoked. default isfalse.ignore_metadata=BOOLβ if true, only the application's name gets searched, instead of the normal behavior of searching a large amount of metadata β including category and description. default isfalse.
π DRUN π
when images are enabled, drun mode will pull icon themes. but because it's a GTK app, there's a real chance you'll need to run gtk-update-icon-cache to get them to actually apply. just a lil heads up π§
π LOCATIONS π
there are 9 possible locations, and you can specify them either by name or by number. the numbering scheme is the same as in rofi, and the matching number is listed next to each name below. the default is center.
centerβ0top_leftβ1topβ2top_rightβ3rightβ4bottom_rightβ5bottomβ6bottom_leftβ7leftβ8
okay now the β¨mathβ¨ of offsets, stay with me. the x and y offsets are applied based on layer-shell anchors, which means an x offset can only be applied if wofi is anchored on the x axis. so basically: you can only use an x offset with the top_left, top_right, right, bottom_right, bottom_left, and left locations. center, top, and bottom can't have x offsets because they're not anchored on the x axis.
likewise, y offsets can only be applied to top_left, top, top_right, bottom_right, bottom, and bottom_left locations. center, left, and right can't have y offsets because they're not anchored to the y axis.
and since center can't have offsets on either β it's not anchored to any axis β any x or y offset applied while using center will override the location to top_left, for backwards compatibility reasons. (because otherwise the offsets would just get ignored anyway, so like, at least it does something π)
β ORDER β
there are 2 order options right now: default and alphabetical.
defaultmeans entries are displayed in the order they get added by the mode. for all the built in modes this is cached items first, followed by other entries in no specific order.alphabeticalmeans entries are alphabetically sorted. period.
these orders only affect the order when no search has been entered. once a search is entered, the order gets re-arranged based on the current matching preference, and this order is ignored.
π CACHING π
caching cannot be disabled. but bestie, you can set the cache file to /dev/null to effectively disable it. loophole queen π
πͺ WINDOW SWITCHER πͺ
okay so wofi does not have the ability to do window switching on its own, because there's no way to do that with wayland/wlroots protocols. sad, but true π
however! if you're using sway, you can use swaymsg with dmenu mode to pull it off. here's the script:
swaymsg -t get_tree |
jq -r '.nodes[].nodes[] | if .nodes then [recurse(.nodes[])] else []
end + .floating_nodes | .[] | select(.nodes==[]) | ((.id | tostring) + "
" + .name)' |
wofi --show dmenu | {
read -r id name
swaymsg "[con_id=$id]" focus
}
go off, you just got window switching on wayland π«Ά
π WIDGET LAYOUT π
this section is for advanced CSS β the kind that needs more control than the built in wofi CSS names/classes allow for.
β οΈ this widget layout is subject to change at any time and without warning, so your CSS might very well break if you rely on this. be careful out there, babe.
widgets have their corresponding names next to them if they have one. here's the whole tree:
window - #window
box - #outer-box
entry - #input
scrolledwindow - #scroll
viewport
box
flowbox - #inner-box
flowboxchild - #entry
.entry - #unselected or #selected
image
label
expander
.entry - #unselected or #selected
image
label
list
row - #entry
.entry - #unselected or #selected
image
label
scrollbar
now let me walk you through what all of that actually means:
- the first
.entry(#unselectedor#selected) only exists if there's ONLY 1 action. it's aWofiPropertyBoxwhich has no CSS node and should probably not be used. its name depends on whether or not the entry is selected. seewofi(5)on#selectedand#unselectedfor info.imageβ only present if there's an image in the entry, and it might occur multiple times if multiple images are present.labelβ only present if there's text in the entry, and it might occur multiple times if there are multiple text objects in a single entry.
expanderβ this and its children only exist if there are multiple actions on the entry..entry(#unselectedor#selected) β this is the main action. it's aWofiPropertyBoxwhich has no CSS node and should probably not be used. the name depends on whether or not the entry is selected. seewofi(5)on#selectedand#unselectedfor info.imageβ only present if there's an image in the entry, and it might occur multiple times if multiple images are present.labelβ only present if there's text in the entry, and it might occur multiple times if there are multiple text objects in a single entry.
listβ this contains all the secondary actions.row - #entry.entry(#unselectedor#selected) β aWofiPropertyBoxwhich has no CSS node and should probably not be used. the name depends on whether or not the entry is selected. seewofi(5)on#selectedand#unselectedfor info.imageβ only present if there's an image in the entry, and it might occur multiple times if multiple images are present.labelβ only present if there's text in the entry, and it might occur multiple times if there are multiple text objects in a single entry.
and that's the whole page, bestie π₯Ή that was wofi(7) from the Miscellaneous Information Manual β yes the footer really is just wofi(7), she's mysterious like that π
β¨ go forth and slay your configs π
π¦ where this page comes from
- alpine 3.24: wofi-doc 1.5.3-r0 Β· GPL-3.0-only
- arch rolling: wofi 1.5.3-1 Β· GPL-3.0-or-later
- fedora 43: wofi 1.5.3-1.fc43 Β· GPL-3.0-only
- fedora 43: wofi 1.5.3-1.fc43 Β· GPL-3.0-only
- fedora 44: wofi 1.5.3-2.fc44 Β· GPL-3.0-only
- fedora 44: wofi 1.5.3-2.fc44 Β· GPL-3.0-only
- nixos 26.05: wofi 1.5.3
- nixpkgs unstable: wofi 1.5.3
- ubuntu resolute: wofi 1.5.1-1 Β· GPL-3.0-or-later
- ubuntu stonking: wofi 1.5.3-1 Β· GPL-3.0-or-later
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms