diff --git a/.config/wiremix/.github/README.md b/.config/wiremix/.github/README.md new file mode 100644 index 00000000..affa9d51 --- /dev/null +++ b/.config/wiremix/.github/README.md @@ -0,0 +1,3 @@ +
diff --git a/.config/wiremix/.github/title.png b/.config/wiremix/.github/title.png new file mode 100644 index 00000000..93f574ac Binary files /dev/null and b/.config/wiremix/.github/title.png differ diff --git a/.config/wiremix/wiremix.toml b/.config/wiremix/wiremix.toml new file mode 100644 index 00000000..332d22e0 --- /dev/null +++ b/.config/wiremix/wiremix.toml @@ -0,0 +1,479 @@ +# 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"