diff --git a/.config/dinit.d/audio.d/pipewire b/.config/dinit.d/audio.d/pipewire new file mode 120000 index 0000000..f09fd7d --- /dev/null +++ b/.config/dinit.d/audio.d/pipewire @@ -0,0 +1 @@ +../pipewire \ No newline at end of file diff --git a/.config/dinit.d/audio.d/pipewire-pulse b/.config/dinit.d/audio.d/pipewire-pulse new file mode 120000 index 0000000..42c3510 --- /dev/null +++ b/.config/dinit.d/audio.d/pipewire-pulse @@ -0,0 +1 @@ +../pipewire-pulse \ No newline at end of file diff --git a/.config/dinit.d/audio.d/wireplumber b/.config/dinit.d/audio.d/wireplumber new file mode 120000 index 0000000..e8f60cf --- /dev/null +++ b/.config/dinit.d/audio.d/wireplumber @@ -0,0 +1 @@ +../wireplumber \ No newline at end of file diff --git a/.config/dinit.d/audio.target b/.config/dinit.d/audio.target index 0eb38fe..502676e 100644 --- a/.config/dinit.d/audio.target +++ b/.config/dinit.d/audio.target @@ -1,5 +1,2 @@ type = internal -depends-on = pipewire -depends-on = pipewire-pulse -depends-on = wireplumber -restart = yes +waits-for.d = audio.d diff --git a/.config/dinit.d/env-sv b/.config/dinit.d/env-sv new file mode 100644 index 0000000..971cb32 --- /dev/null +++ b/.config/dinit.d/env-sv @@ -0,0 +1,3 @@ +type = scripted +command = env +log-type = buffer diff --git a/.config/dinit.d/xdg-portal.target b/.config/dinit.d/xdg-portal.target new file mode 100644 index 0000000..e69de29 diff --git a/.config/foot/foot.ini b/.config/foot/foot.ini index 70a3f7d..99b2e0d 100644 --- a/.config/foot/foot.ini +++ b/.config/foot/foot.ini @@ -11,7 +11,7 @@ shell=/bin/zsh # title=foot # locked-title=no -font=ProFontWindowsNerdFontMono:size=11.5 +font=UbuntuMono:size=12 # font-bold= # font-italic= # font-bold-italic= @@ -48,7 +48,7 @@ initial-window-size-pixels=740x420 # command-focused=no [scrollback] -# lines=1000 +lines=2000 # multiplier=3.0 # indicator-position=relative # indicator-format= diff --git a/.config/fuzzel/fuzzel.ini b/.config/fuzzel/fuzzel.ini index 64c2598..7d022ff 100644 --- a/.config/fuzzel/fuzzel.ini +++ b/.config/fuzzel/fuzzel.ini @@ -7,7 +7,7 @@ width=0 [main] dpi-aware=no -font=ProFontWindowsNerdFontMono:size=18 +font=UbuntuMono:size=16 horizontal-pad=10 icon-theme=Papirus-Dark image-size-ratio=0.0 diff --git a/.config/gtklock/style.css b/.config/gtklock/style.css new file mode 100644 index 0000000..07b7c2f --- /dev/null +++ b/.config/gtklock/style.css @@ -0,0 +1,18 @@ +@import url("/home/n/.cache/wal/colors-waybar.css"); + +* { + color: @foreground; + background-color: @background; + font-family: "Roboto"; +} + +#window-box { + padding: 10px; + border-radius: 2px; +} + +window { + background-image: url("/home/n/.cache/current_wallpaper.png"); + background-position: center; + background-size: cover; +} diff --git a/.config/mako/config b/.config/mako/config index e41842c..2409738 100644 --- a/.config/mako/config +++ b/.config/mako/config @@ -1,9 +1,9 @@ -font=ProFontWindowsNerdFontMono 12 +font=Ubuntu 10 default-timeout=8000 margin=8 border-size=2 icon-path=/usr/share/icons/Papirus-Dark -text-color=#c5c5c4 -background-color=#181916 -border-color=#3764A3 +text-color=#c0c1c2 +background-color=#03070C +border-color=#939270 diff --git a/.config/nvim/after/plugin/lsp.lua b/.config/nvim/after/plugin/lsp.lua index 74dd21b..0ed4767 100644 --- a/.config/nvim/after/plugin/lsp.lua +++ b/.config/nvim/after/plugin/lsp.lua @@ -28,4 +28,5 @@ cmp.setup({ }) require('lspconfig').clangd.setup({capabilities=capabilities}) +require('lspconfig').zls.setup({capabilities=capabilities}) require('lspconfig').pylsp.setup({capabilities=capabilities}) diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json index 89ca8a3..7e88889 100644 --- a/.config/nvim/lazy-lock.json +++ b/.config/nvim/lazy-lock.json @@ -1,8 +1,8 @@ { "LuaSnip": { "branch": "master", "commit": "03c8e67eb7293c404845b3982db895d59c0d1538" }, "cmp-nvim-lsp": { "branch": "main", "commit": "99290b3ec1322070bcfb9e846450a46f6efa50f0" }, - "lazy.nvim": { "branch": "main", "commit": "7e6c863bc7563efbdd757a310d17ebc95166cef3" }, - "nvim-cmp": { "branch": "main", "commit": "b555203ce4bd7ff6192e759af3362f9d217e8c89" }, - "nvim-lspconfig": { "branch": "master", "commit": "ff2b85abaa810f6611233dbe6d31c07510ebf43d" }, + "lazy.nvim": { "branch": "main", "commit": "d8f26efd456190241afd1b0f5235fe6fdba13d4a" }, + "nvim-cmp": { "branch": "main", "commit": "8c82d0bd31299dbff7f8e780f5e06d2283de9678" }, + "nvim-lspconfig": { "branch": "master", "commit": "339ccc81e08793c3af9b83882a6ebd90c9cc0d3b" }, "pywal16.nvim": { "branch": "main", "commit": "446ae689c8e4569b9537cddadb28d6e939658ea5" } } diff --git a/.config/pipewire/pipewire.conf b/.config/pipewire/pipewire.conf new file mode 100644 index 0000000..6fe8f17 --- /dev/null +++ b/.config/pipewire/pipewire.conf @@ -0,0 +1,344 @@ +# Daemon config file for PipeWire version "1.2.6" # +# +# Copy and edit this file in /etc/pipewire for system-wide changes +# or in ~/.config/pipewire for local changes. +# +# It is also possible to place a file with an updated section in +# /etc/pipewire/pipewire.conf.d/ for system-wide changes or in +# ~/.config/pipewire/pipewire.conf.d/ for local changes. +# + +context.properties = { + ## Configure properties in the system. + #library.name.system = support/libspa-support + #context.data-loop.library.name.system = support/libspa-support + #support.dbus = true + #link.max-buffers = 64 + link.max-buffers = 16 # version < 3 clients can't handle more + #mem.warn-mlock = false + #mem.allow-mlock = true + #mem.mlock-all = false + #clock.power-of-two-quantum = true + #log.level = 2 + #cpu.zero.denormals = false + + #loop.rt-prio = -1 # -1 = use module-rt prio, 0 disable rt + #loop.class = data.rt + #thread.affinity = [ 0 1 ] # optional array of CPUs + #context.num-data-loops = 1 # -1 = num-cpus, 0 = no data loops + # + #context.data-loops = [ + # { loop.rt-prio = -1 + # loop.class = [ data.rt audio.rt ] + # #library.name.system = support/libspa-support + # thread.name = data-loop.0 + # #thread.affinity = [ 0 1 ] # optional array of CPUs + # } + #] + + core.daemon = true # listening for socket connections + core.name = pipewire-0 # core name and socket name + + ## Properties for the DSP configuration. + #default.clock.rate = 48000 + #default.clock.allowed-rates = [ 48000 ] + #default.clock.quantum = 1024 + #default.clock.min-quantum = 32 + #default.clock.max-quantum = 2048 + #default.clock.quantum-limit = 8192 + #default.clock.quantum-floor = 4 + #default.video.width = 640 + #default.video.height = 480 + #default.video.rate.num = 25 + #default.video.rate.denom = 1 + # + #settings.check-quantum = false + #settings.check-rate = false + + # keys checked below to disable module loading + module.x11.bell = true + # enables autoloading of access module, when disabled an alternative + # access module needs to be loaded. + module.access = true + # enables autoloading of module-jackdbus-detect + module.jackdbus-detect = true +} + +context.properties.rules = [ + { matches = [ { cpu.vm.name = !null } ] + actions = { + update-props = { + # These overrides are only applied when running in a vm. + default.clock.min-quantum = 1024 + } + } + } +] + +context.spa-libs = { + # = + # + # Used to find spa factory names. It maps an spa factory name + # regular expression to a library name that should contain + # that factory. + # + audio.convert.* = audioconvert/libspa-audioconvert + avb.* = avb/libspa-avb + api.alsa.* = alsa/libspa-alsa + api.v4l2.* = v4l2/libspa-v4l2 + api.libcamera.* = libcamera/libspa-libcamera + api.bluez5.* = bluez5/libspa-bluez5 + api.vulkan.* = vulkan/libspa-vulkan + api.jack.* = jack/libspa-jack + support.* = support/libspa-support + video.convert.* = videoconvert/libspa-videoconvert + #videotestsrc = videotestsrc/libspa-videotestsrc + #audiotestsrc = audiotestsrc/libspa-audiotestsrc +} + +context.modules = [ + #{ name = + # ( args = { = ... } ) + # ( flags = [ ( ifexists ) ( nofail ) ] ) + # ( condition = [ { = ... } ... ] ) + #} + # + # Loads a module with the given parameters. + # If ifexists is given, the module is ignored when it is not found. + # If nofail is given, module initialization failures are ignored. + # If condition is given, the module is loaded only when the context + # properties all match the match rules. + # + + # Uses realtime scheduling to boost the audio thread priorities. This uses + # RTKit if the user doesn't have permission to use regular realtime + # scheduling. You can also clamp utilisation values to improve scheduling + # on embedded and heterogeneous systems, e.g. Arm big.LITTLE devices. + { name = libpipewire-module-rt + args = { + nice.level = -11 + rt.prio = 88 + #rt.time.soft = -1 + #rt.time.hard = -1 + #uclamp.min = 0 + #uclamp.max = 1024 + } + flags = [ ifexists nofail ] + } + + # The native communication protocol. + { name = libpipewire-module-protocol-native + args = { + # List of server Unix sockets, and optionally permissions + #sockets = [ { name = "pipewire-0" }, { name = "pipewire-0-manager" } ] + } + } + + # The profile module. Allows application to access profiler + # and performance data. It provides an interface that is used + # by pw-top and pw-profiler. + { name = libpipewire-module-profiler } + + # Allows applications to create metadata objects. It creates + # a factory for Metadata objects. + { name = libpipewire-module-metadata } + + # Creates a factory for making devices that run in the + # context of the PipeWire server. + { name = libpipewire-module-spa-device-factory } + + # Creates a factory for making nodes that run in the + # context of the PipeWire server. + { name = libpipewire-module-spa-node-factory } + + # Allows creating nodes that run in the context of the + # client. Is used by all clients that want to provide + # data to PipeWire. + { name = libpipewire-module-client-node } + + # Allows creating devices that run in the context of the + # client. Is used by the session manager. + { name = libpipewire-module-client-device } + + # The portal module monitors the PID of the portal process + # and tags connections with the same PID as portal + # connections. + { name = libpipewire-module-portal + flags = [ ifexists nofail ] + } + + # The access module can perform access checks and block + # new clients. + { name = libpipewire-module-access + args = { + # Socket-specific access permissions + #access.socket = { pipewire-0 = "default", pipewire-0-manager = "unrestricted" } + + # Deprecated legacy mode (not socket-based), + # for now enabled by default if access.socket is not specified + #access.legacy = true + } + condition = [ { module.access = true } ] + } + + # Makes a factory for wrapping nodes in an adapter with a + # converter and resampler. + { name = libpipewire-module-adapter } + + # Makes a factory for creating links between ports. + { name = libpipewire-module-link-factory } + + # Provides factories to make session manager objects. + { name = libpipewire-module-session-manager } + + # Use libcanberra to play X11 Bell + { name = libpipewire-module-x11-bell + args = { + #sink.name = "@DEFAULT_SINK@" + #sample.name = "bell-window-system" + #x11.display = null + #x11.xauthority = null + } + flags = [ ifexists nofail ] + condition = [ { module.x11.bell = true } ] + } + { name = libpipewire-module-jackdbus-detect + args = { + #jack.library = libjack.so.0 + #jack.server = null + #jack.client-name = PipeWire + #jack.connect = true + #tunnel.mode = duplex # source|sink|duplex + source.props = { + #audio.channels = 2 + #midi.ports = 1 + #audio.position = [ FL FR ] + # extra sink properties + } + sink.props = { + #audio.channels = 2 + #midi.ports = 1 + #audio.position = [ FL FR ] + # extra sink properties + } + } + flags = [ ifexists nofail ] + condition = [ { module.jackdbus-detect = true } ] + } +] + +context.objects = [ + #{ factory = + # ( args = { = ... } ) + # ( flags = [ ( nofail ) ] ) + # ( condition = [ { = ... } ... ] ) + #} + # + # Creates an object from a PipeWire factory with the given parameters. + # If nofail is given, errors are ignored (and no object is created). + # If condition is given, the object is created only when the context properties + # all match the match rules. + # + #{ factory = spa-node-factory args = { factory.name = videotestsrc node.name = videotestsrc node.description = videotestsrc "Spa:Pod:Object:Param:Props:patternType" = 1 } } + #{ factory = spa-device-factory args = { factory.name = api.jack.device foo=bar } flags = [ nofail ] } + #{ factory = spa-device-factory args = { factory.name = api.alsa.enum.udev } } + #{ factory = spa-node-factory args = { factory.name = api.alsa.seq.bridge node.name = Internal-MIDI-Bridge } } + #{ factory = adapter args = { factory.name = audiotestsrc node.name = my-test node.description = audiotestsrc } } + #{ factory = spa-node-factory args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } } + + # A default dummy driver. This handles nodes marked with the "node.always-process" + # property when no other driver is currently active. JACK clients need this. + { factory = spa-node-factory + args = { + factory.name = support.node.driver + node.name = Dummy-Driver + node.group = pipewire.dummy + node.sync-group = sync.dummy + priority.driver = 200000 + #clock.id = monotonic # realtime | tai | monotonic-raw | boottime + #clock.name = "clock.system.monotonic" + } + } + { factory = spa-node-factory + args = { + factory.name = support.node.driver + node.name = Freewheel-Driver + priority.driver = 190000 + node.group = pipewire.freewheel + node.sync-group = sync.dummy + node.freewheel = true + #freewheel.wait = 10 + } + } + + # This creates a new Source node. It will have input ports + # that you can link, to provide audio for this source. + #{ factory = adapter + # args = { + # factory.name = support.null-audio-sink + # node.name = "my-mic" + # node.description = "Microphone" + # media.class = "Audio/Source/Virtual" + # audio.position = "FL,FR" + # monitor.passthrough = true + # } + #} + + # This creates a single PCM source device for the given + # alsa device path hw:0. You can change source to sink + # to make a sink in the same way. + #{ factory = adapter + # args = { + # factory.name = api.alsa.pcm.source + # node.name = "alsa-source" + # node.description = "PCM Source" + # media.class = "Audio/Source" + # api.alsa.path = "hw:0" + # api.alsa.period-size = 1024 + # api.alsa.headroom = 0 + # api.alsa.disable-mmap = false + # api.alsa.disable-batch = false + # audio.format = "S16LE" + # audio.rate = 48000 + # audio.channels = 2 + # audio.position = "FL,FR" + # } + #} + + # Use the metadata factory to create metadata and some default values. + #{ factory = metadata + # args = { + # metadata.name = my-metadata + # metadata.values = [ + # { key = default.audio.sink value = { name = somesink } } + # { key = default.audio.source value = { name = somesource } } + # ] + # } + #} +] + +context.exec = [ + #{ path = + # ( args = "" | [ ... ] ) + # ( condition = [ { = ... } ... ] ) + #} + # + # Execute the given program with arguments. + # If condition is given, the program is executed only when the context + # properties all match the match rules. + # + # You can optionally start the session manager here, + # but it is better to start it as a systemd service. + # Run the session manager with -h for options. + # + #{ path = "/usr/bin/pipewire-media-session" args = "" + # condition = [ { exec.session-manager = null } { exec.session-manager = true } ] } + # + # You can optionally start the pulseaudio-server here as well + # but it is better to start it as a systemd service. + # It can be interesting to start another daemon here that listens + # on another address with the -a option (eg. -a tcp:4713). + # + #{ path = "/usr/bin/pipewire" args = [ "-c" "pipewire-pulse.conf" ] + # condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] } +] diff --git a/.config/river/binds b/.config/river/binds index cf5b9fe..c7a1a32 100755 --- a/.config/river/binds +++ b/.config/river/binds @@ -7,6 +7,7 @@ riverctl map normal Super+Control S spawn 'pkill -9 slurp || grim -g "$(slurp)" riverctl map normal Super Print spawn 'grim | wl-copy -t image/png' riverctl map normal Super V spawn pavucontrol riverctl map normal Super Escape spawn 'gtklock -d' +riverctl map normal Super E spawn nemo # Super+Q to close the focused view riverctl map normal Super Slash close @@ -31,8 +32,8 @@ riverctl map normal Super Period focus-output next riverctl map normal Super Comma focus-output previous # Super+Shift+{Period,Comma} to send the focused view to the next/previous output -riverctl map normal Super+Shift Period send-to-output -current-tags next -riverctl map normal Super+Shift Comma send-to-output -current-tags previous +riverctl map normal Super+Shift Period send-to-output next +riverctl map normal Super+Shift Comma send-to-output previous # Super+Alt+{H,J,K,L} to move views riverctl map normal Super+Alt H move left 100 diff --git a/.config/river/init b/.config/river/init index 02f9407..d693ea5 100755 --- a/.config/river/init +++ b/.config/river/init @@ -23,10 +23,6 @@ riverctl declare-mode passthrough riverctl default-layout bsp-layout river-bsp-layout --inner-gap 2 --outer-gap 4 --split-perc 0.5 --og-top 0 & -# Set focus-follow and cursos-warp -riverctl focus-follows-cursor normal -riverctl set-cursor-warp on-output-change - # --- Device input settings -------------- @@ -38,3 +34,6 @@ riverctl set-repeat 50 300 # Natural scroll riverctl input pointer-1160-4639-DELL08B8:00_0488:121F_Touchpad natural-scroll enabled + +# Set focus-follow +riverctl focus-follows-cursor normal diff --git a/.config/wal/templates/colors-mako b/.config/wal/templates/colors-mako index fc168cc..8220702 100644 --- a/.config/wal/templates/colors-mako +++ b/.config/wal/templates/colors-mako @@ -1,4 +1,4 @@ -font=ProFontWindowsNerdFontMono 12 +font=Ubuntu 10 default-timeout=8000 margin=8 border-size=2 diff --git a/.config/waybar/style.css b/.config/waybar/style.css index d4ca263..662c464 100644 --- a/.config/waybar/style.css +++ b/.config/waybar/style.css @@ -1,8 +1,8 @@ @import url("/home/n/.cache/wal/colors-waybar.css"); * { - font-family: "ProFontWindowsNerdFontMono"; - font-size: 10px; + font-family: "UbuntuMono"; + font-size: 16px; margin: 0; padding: 0; color: @foreground; @@ -34,20 +34,17 @@ tooltip label { } #battery { - font-size: 16px; color: @foreground; margin-right: 10px; } #clock { - font-size: 16px; min-width: 50px; color: @foreground; } #custom-notification { font-family: "NotoMonoNerdFont-Regular"; - font-size: 16px; color: @foreground; margin-right: 10px; } @@ -61,7 +58,6 @@ tooltip label { } #tags * { - font-size: 16px; margin: 0; padding: 0; } diff --git a/.config/wireplumber/wireplumber.conf b/.config/wireplumber/wireplumber.conf new file mode 100644 index 0000000..65aa082 --- /dev/null +++ b/.config/wireplumber/wireplumber.conf @@ -0,0 +1,865 @@ +## The WirePlumber configuration + +context.spa-libs = { + ## SPA factory name to library mappings + ## Used to find SPA factory names. It maps a SPA factory name regular + ## expression to a library name that should contain that factory. + ## + ## Syntax: + ## = + + api.alsa.* = alsa/libspa-alsa + api.bluez5.* = bluez5/libspa-bluez5 + api.v4l2.* = v4l2/libspa-v4l2 + api.libcamera.* = libcamera/libspa-libcamera + audio.convert.* = audioconvert/libspa-audioconvert + support.* = support/libspa-support +} + +context.modules = [ + ## PipeWire modules to load. + ## These modules are loaded before a connection to pipewire is attempted. + ## This section should be kept minimal and load only the modules that are + ## necessary for the protocol to work. + ## + ## If ifexists is given, the module is ignored when it is not found. + ## If nofail is given, module initialization failures are ignored. + ## + ## Syntax: + ## { + ## name = + ## [ args = { = ... } ] + ## [ flags = [ ifexists | nofail ] ] + ## } + + # Uses RTKit to boost the data thread priority. Also allows clamping + # of utilisation when using the Completely Fair Scheduler on Linux. + { + name = libpipewire-module-rt + args = { + nice.level = -11 + # rt.prio = 88 + # rt.time.soft = -1 + # rt.time.hard = -1 + # uclamp.min = 0 + # uclamp.max = 1024 + } + flags = [ ifexists, nofail ] + } + + ## The native communication protocol. + { name = libpipewire-module-protocol-native } + + ## Support for metadata objects + { name = libpipewire-module-metadata } +] + +wireplumber.profiles = { + ## Syntax: + ## = { + ## inherits = [ other, profile, names ] # optional + ## # optional is the default + ## = [ required | optional | disabled ] + ## ... + ## } + + # The default profile + main = { + inherits = [ base ] + + metadata.sm-settings = required + metadata.sm-objects = required + + policy.standard = required + + hardware.audio = required + hardware.bluetooth = required + hardware.video-capture = required + } + + # Profile for running on a systemwide level + main-systemwide = { + inherits = [ main, mixin.systemwide-session ] + } + + # Typical profile for embedded use cases, systemwide without maintaining state + main-embedded = { + inherits = [ main, mixin.systemwide-session, mixin.stateless ] + } + + # Profile for video-only use cases (camera & screen sharing) + video-only = { + inherits = [ main ] + hardware.audio = disabled + hardware.bluetooth = disabled + } + + ## + ## Profiles for multi-instance setup + ## + + policy = { + inherits = [ base ] + metadata.sm-settings = required + metadata.sm-objects = required + policy.standard = required + } + + audio = { + inherits = [ base ] + hardware.audio = required + } + + bluetooth = { + inherits = [ base ] + hardware.bluetooth = required + } + + video-capture = { + inherits = [ base ] + hardware.video-capture = required + } + + ## + ## The following are not complete profiles, but blocks that can be inherited + ## + + # The bare minimum that all instances should have by default + base = { + check.no-media-session = required + support.settings = required + support.log-settings = required + } + + # Disable features that are meant only for user sessions + mixin.systemwide-session = { + support.reserve-device = disabled + monitor.alsa.reserve-device = disabled + + support.portal-permissionstore = disabled + script.client.access-portal = disabled + + support.logind = disabled + monitor.bluez.seat-monitoring = disabled + } + + # Disable storing/restoring runtime state information regarding + # default nodes selection, profiles, routes and stream volume / properties + # This makes sense for embedded systems that should always reboot to a default + # state, not remembering any of the user's runtime changes + mixin.stateless = { + hooks.device.profile.state = disabled + hooks.device.routes.state = disabled + hooks.default-nodes.state = disabled + hooks.stream.state = disabled + } +} + +wireplumber.components = [ + ## WirePlumber components to load. + ## These components are loaded after a connection to pipewire is established. + ## type is mandatory; rest of the tags are optional + ## + ## Syntax: + ## { + ## name = + ## type = + ## arguments = { } + ## + ## # Feature that this component provides + ## provides = + ## + ## # List of features that must be provided before this component is loaded + ## requires = [ ] + ## + ## # List of features that would offer additional functionality if provided + ## # but are not strictly required + ## wants = [ ] + ## } + + ## Check to avoid loading together with media-session + { + name = ensure-no-media-session, type = built-in + provides = check.no-media-session + } + + ## Makes a secondary connection to PipeWire for exporting objects + { + name = export-core, type = built-in + provides = support.export-core + } + + ## Enables creating local nodes that are exported to pipewire + ## This is needed for LocalNode() / WpImplNode + ## This should be used with the export-core to avoid protocol deadlocks, + ## unless you know what you are doing + { + name = libpipewire-module-client-node, type = pw-module + provides = pw.client-node + wants = [ support.export-core ] + } + + ## Enables creating local devices that are exported to pipewire + ## This is needed for SpaDevice() / WpSpaDevice + ## This should be used with the export-core to avoid protocol deadlocks, + ## unless you know what you are doing + { + name = libpipewire-module-client-device, type = pw-module + provides = pw.client-device + wants = [ support.export-core ] + } + + # Provides a node factory to create SPA nodes + # You need this to use LocalNode("spa-node-factory", ...) + { + name = libpipewire-module-spa-node-factory, type = pw-module + provides = pw.node-factory.spa + requires = [ pw.client-node ] + } + + ## Provides a node factory to create SPA nodes wrapped in an adapter + ## You need this to use LocalNode("adapter", ...) + { + name = libpipewire-module-adapter, type = pw-module + provides = pw.node-factory.adapter + requires = [ pw.client-node ] + } + + ## Provides the "sm-settings" metadata object + { + name = libwireplumber-module-settings, type = module + arguments = { metadata.name = sm-settings } + provides = metadata.sm-settings + } + + ## Activates a global WpSettings instance, providing settings from + ## the sm-settings metadata object. Note that this blocks and waits for the + ## sm-settings metadata object to become available, so one instance must + ## provide that, while others should only load this to access settings + { + name = settings-instance, type = built-in + arguments = { metadata.name = sm-settings } + provides = support.settings + after = [ metadata.sm-settings ] + } + + ## Log level settings + { + name = libwireplumber-module-log-settings, type = module + provides = support.log-settings + } + + ## The lua scripting engine + { + name = libwireplumber-module-lua-scripting, type = module + provides = support.lua-scripting + } + + ## Module listening for pipewire objects to push events + { + name = libwireplumber-module-standard-event-source, type = module + provides = support.standard-event-source + } + + ## The shared D-Bus connection + { + name = libwireplumber-module-dbus-connection, type = module + provides = support.dbus + } + + ## Module managing the portal permissions + { + name = libwireplumber-module-portal-permissionstore, type = module + provides = support.portal-permissionstore + requires = [ support.dbus ] + } + + ## Needed for device reservation to work + { + name = libwireplumber-module-reserve-device, type = module + provides = support.reserve-device + requires = [ support.dbus ] + } + + ## logind integration to enable certain functionality only on the active seat + { + name = libwireplumber-module-logind, type = module + provides = support.logind + } + + ## Session item factories + { + name = libwireplumber-module-si-node, type = module + provides = si.node + } + { + name = libwireplumber-module-si-audio-adapter, type = module + provides = si.audio-adapter + } + { + name = libwireplumber-module-si-standard-link, type = module + provides = si.standard-link + } + + ## API to access default nodes from scripts + { + name = libwireplumber-module-default-nodes-api, type = module + provides = api.default-nodes + } + + ## API to access mixer controls + { + name = libwireplumber-module-mixer-api, type = module + provides = api.mixer + } + + ## API to get notified about file changes + { + name = libwireplumber-module-file-monitor-api, type = module + provides = api.file-monitor + } + + ## Provide the "default" pw_metadata + { + name = metadata.lua, type = script/lua + arguments = { metadata.name = default } + provides = metadata.default + } + + ## Provide the "filters" pw_metadata + { + name = metadata.lua, type = script/lua + arguments = { metadata.name = filters } + provides = metadata.filters + } + + ## Provide the "sm-objects" pw_metadata, supporting dynamic loadable objects + { + name = sm-objects.lua, type = script/lua + provides = metadata.sm-objects + } + + ## Device monitors' optional features + { + type = virtual, provides = monitor.alsa.reserve-device, + requires = [ support.reserve-device ] + } + { + type = virtual, provides = monitor.alsa-midi.monitoring, + requires = [ api.file-monitor ] + } + { + type = virtual, provides = monitor.bluez.seat-monitoring, + requires = [ support.logind ] + } + + ## Device monitors + { + name = monitors/alsa.lua, type = script/lua + provides = monitor.alsa + requires = [ support.export-core, pw.client-device ] + wants = [ monitor.alsa.reserve-device ] + } + { + name = monitors/bluez.lua, type = script/lua + provides = monitor.bluez + requires = [ support.export-core, + pw.client-device, + pw.client-node, + pw.node-factory.adapter ] + wants = [ monitor.bluez.seat-monitoring ] + } + { + name = monitors/bluez-midi.lua, type = script/lua + provides = monitor.bluez-midi + requires = [ support.export-core, + pw.client-device, + pw.client-node, + pw.node-factory.spa ] + wants = [ monitor.bluez.seat-monitoring ] + } + { + name = monitors/alsa-midi.lua, type = script/lua + provides = monitor.alsa-midi + wants = [ monitor.alsa-midi.monitoring ] + } + ## v4l2 monitor + { + name = monitors/v4l2/name-device.lua, type = script/lua + provides = hooks.monitor.v4l2-name-device + } + { + name = monitors/v4l2/create-device.lua, type = script/lua + provides = hooks.monitor.v4l2-create-device + requires = [ support.export-core, + pw.client-device, + support.standard-event-source ] + } + { + name = monitors/v4l2/name-node.lua, type = script/lua + provides = hooks.monitor.v4l2-name-node + } + { + name = monitors/v4l2/create-node.lua, type = script/lua + provides = hooks.monitor.v4l2-create-node + } + { + name = monitors/v4l2/enumerate-device.lua, type = script/lua + provides = monitor.v4l2 + requires = [ support.export-core, + pw.client-device, + support.standard-event-source, + hooks.monitor.v4l2-create-device, + hooks.monitor.v4l2-create-node ] + wants = [ hooks.monitor.v4l2-name-device, + hooks.monitor.v4l2-name-node ] + } + ## libcamera monitor + { + name = monitors/libcamera/name-device.lua, type = script/lua + provides = hooks.monitor.libcamera-name-device + } + { + name = monitors/libcamera/create-device.lua, type = script/lua + provides = hooks.monitor.libcamera-create-device + requires = [ support.export-core, + pw.client-device, + support.standard-event-source ] + } + { + name = monitors/libcamera/name-node.lua, type = script/lua + provides = hooks.monitor.libcamera-name-node + } + { + name = monitors/libcamera/create-node.lua, type = script/lua + provides = hooks.monitor.libcamera-create-node + } + { + name = monitors/libcamera/enumerate-device.lua, type = script/lua + provides = monitor.libcamera + requires = [ support.export-core, + pw.client-device, + support.standard-event-source, + hooks.monitor.libcamera-create-device, + hooks.monitor.libcamera-create-node ] + wants = [ hooks.monitor.libcamera-name-device, + hooks.monitor.libcamera-name-node ] + } + + ## Client access configuration hooks + { + name = client/access-default.lua, type = script/lua + provides = script.client.access-default + } + { + name = client/access-portal.lua, type = script/lua + provides = script.client.access-portal + requires = [ support.portal-permissionstore ] + } + { + name = client/access-snap.lua, type = script/lua + provides = script.client.access-snap + } + { + type = virtual, provides = policy.client.access + wants = [ script.client.access-default, + script.client.access-portal, + script.client.access-snap ] + } + + ## Device profile selection hooks + { + name = device/select-profile.lua, type = script/lua + provides = hooks.device.profile.select + } + { + name = device/find-preferred-profile.lua, type = script/lua + provides = hooks.device.profile.find-preferred + } + { + name = device/find-best-profile.lua, type = script/lua + provides = hooks.device.profile.find-best + } + { + name = device/state-profile.lua, type = script/lua + provides = hooks.device.profile.state + } + { + name = device/apply-profile.lua, type = script/lua + provides = hooks.device.profile.apply + } + { + name = device/autoswitch-bluetooth-profile.lua, type = script/lua + provides = hooks.device.profile.autoswitch-bluetooth + } + { + type = virtual, provides = policy.device.profile + requires = [ hooks.device.profile.select, + hooks.device.profile.autoswitch-bluetooth, + hooks.device.profile.apply ] + wants = [ hooks.device.profile.find-best, hooks.device.profile.find-preferred, + hooks.device.profile.state ] + } + + # Device route selection hooks + { + name = device/select-routes.lua, type = script/lua + provides = hooks.device.routes.select + } + { + name = device/find-best-routes.lua, type = script/lua + provides = hooks.device.routes.find-best + } + { + name = device/state-routes.lua, type = script/lua + provides = hooks.device.routes.state + } + { + name = device/apply-routes.lua, type = script/lua + provides = hooks.device.routes.apply + } + { + type = virtual, provides = policy.device.routes + requires = [ hooks.device.routes.select, + hooks.device.routes.apply ] + wants = [ hooks.device.routes.find-best, + hooks.device.routes.state ] + } + + ## Default nodes selection hooks + { + name = default-nodes/rescan.lua, type = script/lua + provides = hooks.default-nodes.rescan + } + { + name = default-nodes/find-selected-default-node.lua, type = script/lua + provides = hooks.default-nodes.find-selected + requires = [ metadata.default ] + } + { + name = default-nodes/find-best-default-node.lua, type = script/lua + provides = hooks.default-nodes.find-best + } + { + name = default-nodes/state-default-nodes.lua, type = script/lua + provides = hooks.default-nodes.state + requires = [ metadata.default ] + } + { + name = default-nodes/apply-default-node.lua, type = script/lua, + provides = hooks.default-nodes.apply + requires = [ metadata.default ] + } + { + type = virtual, provides = policy.default-nodes + requires = [ hooks.default-nodes.rescan, + hooks.default-nodes.apply ] + wants = [ hooks.default-nodes.find-selected, + hooks.default-nodes.find-best, + hooks.default-nodes.state ] + } + + ## Node configuration hooks + { + name = node/create-item.lua, type = script/lua + provides = hooks.node.create-session-item + requires = [ si.audio-adapter, si.node ] + } + { + name = node/suspend-node.lua, type = script/lua + provides = hooks.node.suspend + } + { + name = node/state-stream.lua, type = script/lua + provides = hooks.stream.state + } + { + name = node/filter-forward-format.lua, type = script/lua + provides = hooks.filter.forward-format + } + { + type = virtual, provides = policy.node + requires = [ hooks.node.create-session-item ] + wants = [ hooks.node.suspend + hooks.stream.state + hooks.filter.forward-format ] + } + { + name = node/software-dsp.lua, type = script/lua + provides = node.software-dsp + } + + ## Linking hooks + { + name = linking/rescan.lua, type = script/lua + provides = hooks.linking.rescan + } + { + name = linking/find-media-role-target.lua, type = script/lua + provides = hooks.linking.target.find-media-role + } + { + name = linking/find-defined-target.lua, type = script/lua + provides = hooks.linking.target.find-defined + } + { + name = linking/find-filter-target.lua, type = script/lua + provides = hooks.linking.target.find-filter + requires = [ metadata.filters ] + } + { + name = linking/find-default-target.lua, type = script/lua + provides = hooks.linking.target.find-default + requires = [ api.default-nodes ] + } + { + name = linking/find-best-target.lua, type = script/lua + provides = hooks.linking.target.find-best + requires = [ metadata.filters ] + } + { + name = linking/get-filter-from-target.lua, type = script/lua + provides = hooks.linking.target.get-filter-from + requires = [ metadata.filters ] + } + { + name = linking/prepare-link.lua, type = script/lua + provides = hooks.linking.target.prepare-link + requires = [ api.default-nodes ] + } + { + name = linking/link-target.lua, type = script/lua + provides = hooks.linking.target.link + requires = [ si.standard-link ] + } + { + type = virtual, provides = policy.linking.standard + requires = [ hooks.linking.rescan, + hooks.linking.target.prepare-link, + hooks.linking.target.link ] + wants = [ hooks.linking.target.find-media-role, + hooks.linking.target.find-defined, + hooks.linking.target.find-filter, + hooks.linking.target.find-default, + hooks.linking.target.find-best, + hooks.linking.target.get-filter-from ] + } + + ## Linking: Role-based priority system + { + name = linking/rescan-media-role-links.lua, type = script/lua + provides = hooks.linking.role-based.rescan + requires = [ api.mixer ] + } + { + type = virtual, provides = policy.linking.role-based + requires = [ policy.linking.standard, + hooks.linking.role-based.rescan ] + } + + ## Standard policy definition + { + type = virtual, provides = policy.standard + requires = [ policy.client.access + policy.device.profile + policy.device.routes + policy.default-nodes + policy.linking.standard + policy.linking.role-based + policy.node + support.standard-event-source ] + } + + ## Load targets + { + type = virtual, provides = hardware.audio + wants = [ monitor.alsa, monitor.alsa-midi ] + } + { + type = virtual, provides = hardware.bluetooth + wants = [ monitor.bluez, monitor.bluez-midi ] + } + { + type = virtual, provides = hardware.video-capture + wants = [ monitor.v4l2, monitor.libcamera ] + } +] + +wireplumber.components.rules = [ + ## Rules to apply on top of wireplumber.components + ## Syntax: + ## { + ## matches = [ + ## { + ## [ = ... ] + ## } + ## ... + ## ] + ## actions = { + ## = { + ## [ = ... ] + ## } + ## ... + ## } + ## } + + { + matches = [ + { + type = "script/lua" + } + ] + actions = { + merge = { + requires = [ support.lua-scripting ] + } + } + } + { + matches = [ + { + provides = "~hooks.*" + name = "!~monitors/.*" + } + ] + actions = { + merge = { + before = [ support.standard-event-source ] + } + } + } + { + matches = [ + { provides = "~monitor.*" } + ] + actions = { + merge = { + after = [ support.standard-event-source ] + } + } + } +] + +wireplumber.settings.schema = { + ## Bluetooth + bluetooth.use-persistent-storage = { + description = "Whether to use persistent BT storage or not" + type = "bool" + default = true + } + bluetooth.autoswitch-to-headset-profile = { + description = "Whether to autoswitch to BT headset profile or not" + type = "bool" + default = true + } + + ## Device + device.restore-profile = { + description = "Whether to restore device profile or not" + type = "bool" + default = true + } + device.restore-routes = { + description = "Whether to restore device routes or not" + type = "bool" + default = true + } + device.routes.default-sink-volume = { + description = "The default volume for sink devices" + type = "float" + default = 0.064 + min = 0.0 + max = 1.0 + } + device.routes.default-source-volume = { + description = "The default volume for source devices" + type = "float" + default = 1.0 + min = 0.0 + max = 1.0 + } + + ## Linking + linking.role-based.duck-level = { + description = "The volume level to apply when ducking (= reducing volume for a higher priority stream to be audible) in the role-based linking policy" + type = "float" + default = 0.3 + min = 0.0 + max = 1.0 + } + linking.allow-moving-streams = { + description = "Whether to allow metadata to move streams at runtime or not" + type = "bool" + default = true + } + linking.follow-default-target = { + description = "Whether to allow streams follow the default device or not" + type = "bool" + default = true + } + + ## Monitor + monitor.camera-discovery-timeout = { + description = "The camera discovery timeout in milliseconds" + type = "int" + default = 1000 + min = 0 + max = 60000 + } + + ## Node + node.features.audio.no-dsp = { + description = "Whether to never convert audio to F32 format or not" + type = "bool" + default = false + } + node.features.audio.monitor-ports = { + description = "Whether to enable monitor ports on audio nodes or not" + type = "bool" + default = true + } + node.features.audio.control-port = { + description = "Whether to enable control ports on audio nodes or not" + type = "bool" + default = false + } + node.stream.restore-props = { + description = "Whether to restore properties on stream nodes or not" + type = "bool" + default = true + } + node.stream.restore-target = { + description = "Whether to restore target on stream nodes or not" + type = "bool" + default = true + } + node.stream.default-playback-volume = { + description = "The default volume for playback nodes" + type = "float" + default = 1.0 + min = 0.0 + max = 1.0 + } + node.stream.default-capture-volume = { + description = "The default volume for capture nodes" + type = "float" + default = 1.0 + min = 0.0 + max = 1.0 + } + node.stream.default-media-role = { + description = "A media.role to assign on streams that have none specified" + type = "string" + default = null + } + node.filter.forward-format = { + description = "Whether to forward format on filter nodes or not" + type = "bool" + default = false + } + node.restore-default-targets = { + description = "Whether to restore default targets or not" + type = "bool" + default = true + } +} diff --git a/.config/xkb/symbols/dehel b/.config/xkb/symbols/dehel index 2a17bbb..8e7e5ed 100644 --- a/.config/xkb/symbols/dehel +++ b/.config/xkb/symbols/dehel @@ -30,8 +30,8 @@ xkb_symbols "basic" { key {[ bracketleft, braceleft ]}; key {[ bracketright, braceright ]}; key {[ backslash, bar ]}; - key {[ Caps_Lock, NoSymbol ]}; // Swap Backspace with Caps Lock - key {[ BackSpace, NoSymbol ]}; // Swap Caps Lock with Backspace + key {[ U0133, U0132 ]}; // Swap Backspace with Caps Lock + key {[ BackSpace, NoSymbol ]}; // Swap Caps Lock with Backspace key {[ a, A ]}; key {[ s, S ]};