# This file documents wiremix's configuration file. It is also itself a wiremix # configuration file in which wiremix's default configuration is specified. # # It is recommended to start with an empty configuration file and to use this # file only as a reference. Anything specified in the configuration file will # be merged with wiremix's defaults. # Main Options # PipeWire remote to connect to #remote = "pipewire-0" # Limit rendering frames per second (unlimited if unset) #fps = 60.0 # # Enable mouse support mouse = true # Peak meter mode # "off" - not meters # "mono" - all mono meters # "auto" - left/right meters for stereo streams, otherwise mono peaks = "auto" # Character set to use (see Character Sets section) char_set = "default" # Theme to use (see Themes section) theme = "default" # Initial tab tab = "playback" # Maximum percentage for volume sliders max_volume_percent = 150.0 # Whether to prevent increasing volume past max_volume enforce_max_volume = false # Keybindings # # A keybinding consists of a key, modifiers, and a UI action to be performed. # # Keybindings you define in your configuration will be merged with the default # keybindings (listed below for reference). You can effectively delete a # default keybinding by setting its action to "Nothing". # # A keybinding key can be one of: # 1. A character: { Char = "x" } # for the 'x' key # 2. An F-key: { F = 1 } # for F1 # 3. A media key: { Media = "MediaKeyCode" } # where MediaKeyCode is one of: # Play Pause PlayPause Reverse Stop FastForward Rewind TrackNext # TrackPrevious Record LowerVolume RaiseVolume MuteVolume # 4. A special key: "SpecialKey" # where SpecialKey is one of: # Backspace Enter Left Right Up Down Home End PageUp PageDown Tab BackTab # Delete Insert Null Esc CapsLock ScrollLock NumLock PrintScreen Pause # Menu KeypadBegin # # A keybinding modifier can be one or more of SHIFT CONTROL ALT SUPER HYPER # META NONE combined with |. It defaults to NONE if omitted. # # For example: # # keybindings = [ # # Demonstrate modifiers # { key = "End", modifier = "CTRL | ALT", action = "Exit" }, # ] # # Each of the available keybinding actions are documented below. keybindings = [ # Exit the program { key = { Char = "q" }, action = "Exit" }, # Toggle mute for the selected item { key = { Char = "m" }, action = "ToggleMute" }, # Make the selected item in Input/Output Devices the default endpoint { key = { Char = "d" }, action = "SetDefault" }, # Increase the volume of the selected item by 1% { key = { Char = "l" }, action = { SetRelativeVolume = 0.01 } }, { key = "Right", action = { SetRelativeVolume = 0.01 } }, # Decrease the volume of the selected item by 1% { key = { Char = "h" }, action = { SetRelativeVolume = -0.01 } }, { key = "Left", action = { SetRelativeVolume = -0.01 } }, # Open a dropdown for the selected item or chose an item in the dropdown { key = { Char = "c" }, action = "ActivateDropdown" }, { key = "Enter", action = "ActivateDropdown" }, # Close an open dropdown { key = "Esc", action = "CloseDropdown" }, # Select the next item { key = { Char = "j" }, action = "MoveDown" }, { key = "Down", action = "MoveDown" }, # Select the previous item { key = { Char = "k" }, action = "MoveUp" }, { key = "Up", action = "MoveUp" }, # Select the next tab { key = { Char = "L" }, action = "TabRight" }, { key = "Tab", action = "TabRight" }, # Select the previous tab { key = { Char = "H" }, action = "TabLeft" }, { key = "BackTab", modifiers = "SHIFT", action = "TabLeft" }, # Set the volume of the selected item in 10% increments from 0% to 100% { key = { Char = "`" }, action = { SetAbsoluteVolume = 0.00 } }, { key = { Char = "1" }, action = { SetAbsoluteVolume = 0.10 } }, { key = { Char = "2" }, action = { SetAbsoluteVolume = 0.20 } }, { key = { Char = "3" }, action = { SetAbsoluteVolume = 0.30 } }, { key = { Char = "4" }, action = { SetAbsoluteVolume = 0.40 } }, { key = { Char = "5" }, action = { SetAbsoluteVolume = 0.50 } }, { key = { Char = "6" }, action = { SetAbsoluteVolume = 0.60 } }, { key = { Char = "7" }, action = { SetAbsoluteVolume = 0.70 } }, { key = { Char = "8" }, action = { SetAbsoluteVolume = 0.80 } }, { key = { Char = "9" }, action = { SetAbsoluteVolume = 0.90 } }, { key = { Char = "0" }, action = { SetAbsoluteVolume = 1.00 } }, # Open the help menu { key = { Char = "?" }, action = "Help" }, # There are two actions which don't have default bindings: # 1. "Nothing": Do nothing - can effectively delete a default keybinding # 2. { SelectTab = N }: Open the Nth tab ] # Names # # You can customize how streams, endpoints, and devices are named in the user # interface using a template system to generate names based on PipeWire # properties. # # Name templates are composed of property tags enclosed in { } and literal # text. For example: # # "Application {client:application.name} playing {node:media.name}" # # wiremix will replace the property tags with the properties from the PipeWire # object being displayed. # # The first part of a tag specifies the object type - device, node, or client, # and the second part specifies the property. # # You can use pw-dump(1) to inspect the available properties. # # Literal curly braces can be escaped by doubling them: {{ become { and }} # becomes }. # # Streams can have linked clients, so node and client properties are valid for # stream. Similarly, endpoint can use either node or device properties. Only # device properties are valid for device. # # Each option in names is an array - if a tempalte can't be resolved because it # uses a property which doesn't exit on a given object, wiremix tries the next # template in the sequence. If none of them can be resolved, it falls back on # node.name for nodes or device.name for devices. # # The overall order of precedence for name resolution is: # 1. Matching override templates, if any (see the Name Overrides section) # 2. Configured templates for the object type # 3. Fall back to the object's name property [names] # Streams in the Playback/Recording tabs stream = ["{node:node.name}: {node:media.name}"] # Endpoints in the Input/Output Devices tabs endpoint = ["{device:device.nick}", "{node:node.description}"] # Devices in the Configuration tab device = ["{device:device.nick}", "{device:device.description}"] # Name Overrides # # Name overrides define alternate templates that will be used for objects # matching a given criterion. # # An override is matched by type, which contains a list of one or more of # stream, endpoint, or device (see the Name section for more details), and a # property value. Any node or device property that can be used in the names # section can be used to match an override. # # There are no default overrides, but here is an example. This causes all # streams whose node.name is "spotify" to use just "{node:node.name}" as its # name. # # [[names.overrides]] # # Which object types this override applies to # types = [ "stream" ] # # The property to match # property = "node:node.name" # # The value to match # value = "spotify" # # Templates to use when the property value matches # templates = [ "{node:node.name}" ] # # You can have multiple name overrides, each in its own [[names.overrides]] # section. # Themes # # Themes determine the styling of user interface elements. # # Theme styles are based on ratatui's Style struct. # https://docs.rs/ratatui/latest/ratatui/style/struct.Style.html # # Each style can have an fg color, a bg color, and modifiers. Any property not # specified will inherit from the default style for your terminal. # # fg and bg can be an RGB hex value in the form "#RRGGBB" or named ANSI colors: # Black Red Green Yellow Blue Magenta Cyan Gray DarkGray LightRed LightGreen # LightYellow LightBlue LightMagenta LightCyan White # # add_modifier can be one or more of BOLD DIM ITALIC UNDERLINED SLOW_BLINK # RAPID_BLINK REVERSED HIDDEN CROSSED_OUT combined with |. # # For example: # # # Red foreground on a black background with bold, underlined text # { fg = "#FF0000", bg = "Black", add_modifier = "BOLD | UNDERLINE" } # # An empty style with no properties ({ }) corresponds to the default style. # # You can modify built-in themes. Anything you don't specify will remain # unchanged. For example: # # # Modify the "default" theme to make the selection indicator blink. # [themes.default] # selector = { fg = "LightCyan", add_modifier = "SLOW_BLINK" } # # And you can create a new theme that inherits unspecified styles from a # built-in theme. For example: # # # Create a new theme called "my_custom_theme" based on "nocolor" # [themes.my_custom_theme] # inherit = "nocolor" # tab_selected = { fg = "LightCyan", add_modifier = "SLOW_BLINK" } # # The "inherit" option is optional. If not present, the new theme will inherit # from the "default" theme. # # The following is the default theme with each themeable property described. [themes.default] # The symbol marking the default device on the Input/Output Devices tabs default_device = {} # The symbol marking the default endpoint on the Playback/Recording tabs default_stream = {} # The selection indicator in a tab selector = { fg = "#b7bdf8" } # The name of a tab in the tab menu tab = {} # The name of the selected tab in the tab menu tab_selected = { fg = "#8aadf4" } # The symbols surrounding the selected tab in the tab menu tab_marker = { fg = "#8aadf4" } # The symbol at the top/bottom of a tab indicating that there are more items list_more = { fg = "DarkGray" } # The name of a PipeWire node node_title = {} # The name of the selected target for a node node_target = {} # The volume percentage label volume = {} # Volume bar volume_empty = { fg = "DarkGray" } volume_filled = { fg = "#8aadf4" } # Peak meter. Inactive = unlit, active = lit, overload = greater than 0.0 dB meter_inactive = { fg = "DarkGray" } meter_active = { fg = "#a6da95" } meter_overload = { fg = "#ed8796" } # The "live" indicator in the center of the meter meter_center_inactive = { fg = "DarkGray" } meter_center_active = { fg = "#a6da95" } # The name of a device in the Configuration tab config_device = {} # The name of the selected profile in the Configuration tab config_profile = {} # Dropdown marker next to the profiles in the Conifguration tab dropdown_icon = {} # Border around dropdowns dropdown_border = {} # The name of an item in a dropdown dropdown_item = {} # The name of the currently-selected item in a dropdown dropdown_selected = { fg = "#8aadf4", add_modifier = "REVERSED" } # The symbol at the top/bottom of a dropdown indicating that there are more items dropdown_more = { fg = "DarkGray" } # Border around help menu help_border = {} # The name of an item in a the help menu help_item = {} # The symbol at the top/bottom of the help menu indicating that there are more items help_more = { fg = "DarkGray" } # Character Sets # # Character sets define the symbols used in the user interface. # # You can modify built-in characters sets. Anything you don't specify will # remain unchanged. For example: # # # Modify the "default" character set to use parentheses around the selected # # tab name # [char_sets.default] # tab_marker_left = "(" # tab_marker_right = ")" # # And you can create a new character set that inherits unspecified symbols from # a built-in character set. For example: # # # Create a new character set called "my_custom_char_set" based on "compat" # [char_sets.my_custom_char_set] # inherit = "compat" # Inherit from "compat" (omit to inherit from "default") # tab_marker_left = "(" # tab_marker_right = ")" # # The following is the default character set which the options described. [char_sets.default] # Marks the default device on the Input/Output Devices tabs default_device = "◇" # Marks the default endpoint on the Playback/Recording tabs default_stream = "◇" # The selection indicator in a tab selector_top = "░" selector_middle = "▒" selector_bottom = "░" # Surround the selected tab in the tab menu tab_marker_left = "[" tab_marker_right = "]" # Displayed at the top/bottom of a tab when there are more items list_more = "•••" # Volume bar volume_empty = "╌" volume_filled = "━" # Peak meter. Inactive = unlit, active = lit, overload = greater than 0.0 dB # Mono meters use only the right side characters meter_left_inactive = "▮" meter_left_active = "▮" meter_left_overload = "▮" meter_right_inactive = "▮" meter_right_active = "▮" meter_right_overload = "▮" # The "live" indicator in the center of the meter # Mono meters use only the right side meter_center_left_inactive = "▮" meter_center_left_active = "▮" meter_center_right_inactive = "▮" meter_center_right_active = "▮" # Dropdown marker next to the profiles in the Configuration tab dropdown_icon = "▼" # Indicates the selected item in a dropdown dropdown_selector = ">" # Displayed at the top/bottom of a dropdown when there are more items dropdown_more = "•••" # Border around dropdowns # One of "Plain", "Rounded", "Double", "Thick", "QuadrantInside", "QuadrantOutside" dropdown_border = "Rounded" # Displayed at the top/bottom of the help menu when there are more items help_more = "•••" # Border around help menu # One of "Plain", "Rounded", "Double", "Thick", "QuadrantInside", "QuadrantOutside" help_border = "Rounded" # Appendix A # # The other built-in themes and character sets are defined for reference here. [themes.nocolor] default_device = {} default_stream = {} selector = { add_modifier = "BOLD" } tab = {} tab_selected = { add_modifier = "BOLD" } tab_marker = { add_modifier = "BOLD" } list_more = {} node_title = {} node_target = {} volume = {} volume_empty = { add_modifier = "DIM" } volume_filled = { add_modifier = "BOLD" } meter_inactive = { add_modifier = "DIM" } meter_active = { add_modifier = "BOLD" } meter_overload = { add_modifier = "BOLD" } meter_center_inactive = { add_modifier = "DIM" } meter_center_active = { add_modifier = "BOLD" } config_device = {} config_profile = {} dropdown_icon = {} dropdown_border = {} dropdown_item = {} dropdown_selected = { add_modifier = "BOLD | REVERSED" } dropdown_more = {} help_border = {} help_item = {} help_more = {} [themes.plain] default_device = {} default_stream = {} selector = {} tab = {} tab_selected = {} tab_marker = {} list_more = {} node_title = {} node_target = {} volume = {} volume_empty = {} volume_filled = {} meter_inactive = {} meter_active = {} meter_overload = {} meter_center_inactive = {} meter_center_active = {} config_device = {} config_profile = {} dropdown_icon = {} dropdown_border = {} dropdown_item = {} dropdown_selected = {} dropdown_more = {} help_border = {} help_item = {} help_more = {} [char_sets.compat] default_device = "◊" default_stream = "◊" selector_top = "░" selector_middle = "▒" selector_bottom = "░" tab_marker_left = "[" tab_marker_right = "]" list_more = "•••" volume_empty = "─" volume_filled = "━" meter_left_inactive = "┃" meter_left_active = "┃" meter_left_overload = "┃" meter_right_inactive = "┃" meter_right_active = "┃" meter_right_overload = "┃" meter_center_left_inactive = "█" meter_center_left_active = "█" meter_center_right_inactive = "█" meter_center_right_active = "█" dropdown_icon = "▼" dropdown_selector = ">" dropdown_more = "•••" dropdown_border = "Plain" help_more = "•••" help_border = "Plain" [char_sets.extracompat] default_device = "*" default_stream = "*" selector_top = "-" selector_middle = "=" selector_bottom = "-" tab_marker_left = "[" tab_marker_right = "]" list_more = "~~~" volume_empty = "-" volume_filled = "=" meter_left_inactive = "=" meter_left_active = "#" meter_left_overload = "!" meter_right_inactive = "=" meter_right_active = "#" meter_right_overload = "!" meter_center_left_inactive = "[" meter_center_left_active = "[" meter_center_right_inactive = "]" meter_center_right_active = "]" dropdown_icon = "\\" dropdown_selector = ">" dropdown_more = "~~~" dropdown_border = "Plain" help_more = "~~~" help_border = "Plain"