From 870a8b122e389e8e09849e99aab7d53c302bbb24 Mon Sep 17 00:00:00 2001 From: oddlama Date: Wed, 12 Jun 2024 18:04:59 +0200 Subject: [PATCH] feat: add waybar configuration --- pkgs/scripts/brightness.nix | 1 + pkgs/scripts/volume.nix | 1 + users/myuser/graphical/hyprland.nix | 10 + users/myuser/graphical/waybar-style.css | 235 ++++++++++++++++++++++++ users/myuser/graphical/waybar.nix | 143 ++++++++++++-- 5 files changed, 371 insertions(+), 19 deletions(-) diff --git a/pkgs/scripts/brightness.nix b/pkgs/scripts/brightness.nix index df21ccf..52b389a 100644 --- a/pkgs/scripts/brightness.nix +++ b/pkgs/scripts/brightness.nix @@ -20,6 +20,7 @@ writeShellApplication { value=$(${bc}/bin/bc <<< "scale=0; 100*$value/$max") ${libnotify}/bin/notify-send \ "Brightness" \ + --transient \ --hint=string:image-path:"$image" \ --hint=int:value:"$value" \ --hint="string:wired-tag:indicator" \ diff --git a/pkgs/scripts/volume.nix b/pkgs/scripts/volume.nix index 4990d1b..43111b8 100644 --- a/pkgs/scripts/volume.nix +++ b/pkgs/scripts/volume.nix @@ -38,6 +38,7 @@ writeShellApplication { ${libnotify}/bin/notify-send \ "Volume" "$value%" \ + --transient \ --hint=string:image-path:"$image" \ --hint=int:value:"$indicator_value" \ --hint="string:wired-tag:indicator" \ diff --git a/users/myuser/graphical/hyprland.nix b/users/myuser/graphical/hyprland.nix index 93336ca..a3cd891 100644 --- a/users/myuser/graphical/hyprland.nix +++ b/users/myuser/graphical/hyprland.nix @@ -74,6 +74,7 @@ in { "ALT,tab,cyclenext," "SUPER + SHIFT,tab,cyclenext,prev" "ALT + SHIFT,tab,cyclenext,prev" + "SUPER,r,submap,resize" "SUPER,left,movefocus,l" "SUPER,right,movefocus,r" @@ -121,6 +122,7 @@ in { input = { kb_layout = "de"; + kb_variant = "nodeadkeys"; follow_mouse = 2; numlock_by_default = true; repeat_rate = 60; @@ -194,6 +196,14 @@ in { ]; extraConfig = '' + submap=resize + binde=,right,resizeactive,10 0 + binde=,left,resizeactive,-10 0 + binde=,up,resizeactive,0 -10 + binde=,down,resizeactive,0 10 + bind=,escape,submap,reset + submap=reset + windowrulev2 = immediate, class:^(cs2)$ binds { diff --git a/users/myuser/graphical/waybar-style.css b/users/myuser/graphical/waybar-style.css index e69de29..0e31c7b 100644 --- a/users/myuser/graphical/waybar-style.css +++ b/users/myuser/graphical/waybar-style.css @@ -0,0 +1,235 @@ +* { + /* `otf-font-awesome` is required to be installed for icons */ + font-family: "Symbols Nerd Font Mono", "JetBrains Mono"; + font-size: 13px; + transition-duration: .1s; +} + +window#waybar { + background-color: #000000; + border-bottom: 3px solid alpha(#485263, 0.7); + color: #ffffff; + transition-property: background-color; +} + +window#waybar.hidden { + opacity: 0.2; +} + +button { + /* Avoid rounded borders under each button name */ + border: none; + border-radius: 0; +} + +/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ +#clock:hover, +#custom-notification:hover, +#custom-pickcolor:hover, +#custom-scanqr:hover, +#wireplumber:hover, +#pulseaudio:hover, +button:hover { + background: inherit; + box-shadow: inset 0 -2px alpha(#ffffff, 0.8); +} + +#backlight, +#battery, +#clock, +#cpu, +#custom-notification, +#custom-pickcolor, +#custom-scanqr, +#disk, +#idle_inhibitor, +#memory, +#mode, +#network, +#power-profiles-daemon, +#privacy-item, +#scratchpad, +#submap, +#temperature, +#tray, +#wireplumber, +#pulseaudio, +#workspaces, +#mpd { + padding: 0 10px; +} + +#cpu, +#memory, +#wireplumber { + min-width: 56px; +} + +#window, +#workspaces { + margin: 0 4px; +} + +/* If workspaces is the leftmost module, omit left margin */ +.modules-left>widget:first-child>#workspaces { + margin-left: 0; +} + +/* If workspaces is the rightmost module, omit right margin */ +.modules-right>widget:last-child>#workspaces { + margin-right: 0; +} + +#submap.resize { + background-color: #ffa000; + color: #000000; +} + +#battery { + background-color: #ffffff; + color: #000000; +} + +#battery.charging, +#battery.plugged { + background-color: #26A65B; +} + +@keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } +} + +/* Using steps() instead of linear as a timing function to limit cpu usage */ +#battery.critical:not(.charging) { + background-color: #e05f65; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: steps(12); + animation-iteration-count: infinite; + animation-direction: alternate; +} + +#power-profiles-daemon { + padding-right: 15px; +} + +#power-profiles-daemon.performance { + background-color: #e05f65; +} + +#power-profiles-daemon.balanced { + background-color: #2980b9; +} + +#power-profiles-daemon.power-saver { + background-color: #000000; +} + +#memory.warning { + background-color: #f1c40f; + color: #000000; +} + + +#memory.critical, +#network.disconnected, +#pulseaudio.source-muted, +#temperature.critical, +#wireplumber.muted, +#mpd.disconnected { + background-color: #e05f65; +} + +#tray>.passive { + -gtk-icon-effect: dim; +} + +#tray>.needs-attention { + -gtk-icon-effect: highlight; + background-color: #e05f65; +} + +#idle_inhibitor { + background-color: #2d3436; +} + +#idle_inhibitor.activated { + background-color: #ecf0f1; + color: #2d3436; +} + +#mpd.stopped { + background-color: #90b1b1; +} + +#mpd.paused { + background-color: #51a37a; +} + +#language { + background: #00b093; + color: #740864; + padding: 0 5px; + margin: 0 5px; + min-width: 16px; +} + +#keyboard-state { + padding: 0 0px; + margin: 0 5px; + min-width: 16px; +} + +#keyboard-state>label { + padding: 0 5px; +} + +#keyboard-state>label.locked { + background: rgba(0, 0, 0, 0.2); +} + +#scratchpad { + background: rgba(0, 0, 0, 0.2); +} + +#scratchpad.empty { + background-color: transparent; +} + +#privacy-item { + padding: 0 5px; +} + +#privacy-item.screenshare { + box-shadow: inset 0 -2px #e05f65; +} + +#privacy-item.audio-in { + box-shadow: inset 0 -2px #78dba9; +} + +#privacy-item.audio-out { + box-shadow: inset 0 -2px #70a5eb; +} + +#workspaces button { + padding: 0 5px; + background-color: transparent; + color: #ffffff; +} + +#workspaces button.visible { + background-color: #2770de; + box-shadow: inset 0 -2px #70a5eb; +} + +#workspaces button.urgent { + background-color: #e05f65; +} + +#workspaces button:hover { + box-shadow: inset 0 -2px #ffffff; +} diff --git a/users/myuser/graphical/waybar.nix b/users/myuser/graphical/waybar.nix index acc01d4..161deac 100644 --- a/users/myuser/graphical/waybar.nix +++ b/users/myuser/graphical/waybar.nix @@ -1,33 +1,139 @@ { + lib, + pkgs, + ... +}: { programs.waybar = { enable = true; style = builtins.readFile ./waybar-style.css; settings.main = { layer = "top"; - position = "top"; - height = 30; + position = "bottom"; + height = 28; - modules-left = ["wlr/workspaces" "wlr/taskbar"]; - modules-center = ["hyprland/window"]; - modules-right = ["network" "clock" "bluetooth" "cpu" "memory" "tray"]; + modules-left = [ + "hyprland/workspaces" + "tray" + "hyprland/submap" + "privacy" + ]; + modules-center = [ + "hyprland/window" + ]; + modules-right = [ + "custom/scanqr" + "custom/pickcolor" + #"custom/screencast" + #"custom/gpuscreenrecorder" - "wlr/workspaces" = { - format = "{icon}"; - on-click = "activate"; + #SPACER + + #"brightness" + "pulseaudio#source" + "wireplumber" + + "network" + "bluetooth" + + #"temps" + "cpu" + "memory" + #"battery" + + "custom/notification" + "clock" + ]; + + "custom/scanqr" = { + tooltip = false; + format = "󰐲"; + on-click = lib.getExe pkgs.scripts.screenshot-area-scan-qr; + }; + + "custom/pickcolor" = { + tooltip = false; + format = ""; + on-click = "${lib.getExe pkgs.hyprpicker} --autocopy"; + }; + + "custom/notification" = { + tooltip = false; + format = "{icon} {}"; format-icons = { - urgent = ""; + notification = ""; + none = ""; + dnd-notification = ""; + dnd-none = ""; + inhibited-notification = ""; + inhibited-none = ""; + dnd-inhibited-notification = ""; + dnd-inhibited-none = ""; }; - sort-by-number = true; - all-outputs = true; + return-type = "json"; + exec = "swaync-client -swb"; + on-click = "swaync-client -t -sw"; + on-click-right = "swaync-client -d -sw"; + on-click-middle = "swaync-client --close-all"; + escape = true; + }; + + privacy = { + icon-spacing = 4; + icon-size = 18; + transition-duration = 250; + modules = [ + { + type = "screenshare"; + tooltip = true; + tooltip-icon-size = 24; + } + { + type = "audio-out"; + tooltip = true; + tooltip-icon-size = 24; + } + { + type = "audio-in"; + tooltip = true; + tooltip-icon-size = 24; + } + ]; + }; + + wireplumber = { + format = "{icon} {volume}%"; + format-muted = " {volume}%"; + format-icons = ["" ""]; + on-click = "hyprctl dispatch exec \"[float;pin;move 80% 50%;size 20% 50%;noborder]\" ${lib.getExe pkgs.pwvucontrol}"; + on-click-middle = "${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 100%"; + on-click-right = "${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + }; + + "pulseaudio#source" = { + format = "{format_source}"; + format-source = " {volume}%"; + format-source-muted = " {volume}%"; + on-click = "${lib.getExe pkgs.helvum}"; + on-click-middle = "${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 100%"; + on-click-right = "${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"; + on-scroll-up = "${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 1%+"; + on-scroll-down = "${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SOURCE@ 1%-"; + }; + + "hyprland/workspaces" = { + format = "{icon}"; + format-icons.urgent = ""; + all-outputs = false; + sort-by = "id"; }; clock = { format = "{:%H:%M}"; format-alt = "{:%A, %B %d, %Y (%R)}"; - tooltip-format = "{calendar}"; + tooltip-format = "{calendar}"; calendar = { mode = "year"; - mode-mon-col = 3; + mode-mon-col = 4; weeks-pos = "right"; on-scroll = 1; on-click-right = "mode"; @@ -36,7 +142,7 @@ days = "{}"; weeks = "W{}"; weekdays = "{}"; - today = "{}"; + today = "{}"; }; actions = { on-click-right = "mode"; @@ -50,9 +156,9 @@ network = { interval = 5; - format-ethernet = " {ipaddr}/{cidr}"; # Icon: ethernet + format-ethernet = "󰈀 {ipaddr}/{cidr}"; format-disconnected = "⚠ Disconnected"; - tooltip-format = ": {bandwidthDownBytes} : {bandwidthUpBytes}"; + tooltip-format = " {bandwidthUpBytes}\n {bandwidthDownBytes}"; }; bluetooth = { @@ -67,7 +173,7 @@ memory = { interval = 5; - format = " {}%"; + format = " {percentage}%"; states = { warning = 70; critical = 90; @@ -76,9 +182,8 @@ cpu = { interval = 5; - format = " {icon0} {icon1} {icon2} {icon3} {icon4} {icon5} {icon6} {icon7}"; + format = " {usage}%"; tooltip-format = "{usage}"; - format-icons = ["▁" "▂" "▃" "▄" "▅" "▆" "▇" "█"]; }; tray = {