content: # 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"
  