From 34639d4a2b4312c961859ede1fb1708dedcb6312 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 1 Sep 2024 00:01:40 -0700 Subject: hi --- .../waybar/configuration/default-modules.nix | 237 +++++++++++++++++++++ .../waybar/configuration/scripts/mediaplayer.py | 152 +++++++++++++ .../configuration/scripts/mediaplayer.py.bak | 128 +++++++++++ .../desktop/wayland/waybar/configuration/style.css | 134 ++++++++++++ .../wayland/waybar/configuration/style.css.bak | 221 +++++++++++++++++++ .../fortune/desktop/wayland/waybar/default.nix | 18 +- .../wayland/waybar/waybar/default-modules.nix | 231 -------------------- .../wayland/waybar/waybar/scripts/mediaplayer.py | 152 ------------- .../waybar/waybar/scripts/mediaplayer.py.bak | 128 ----------- .../desktop/wayland/waybar/waybar/style.css | 134 ------------ .../desktop/wayland/waybar/waybar/style.css.bak | 221 ------------------- 11 files changed, 880 insertions(+), 876 deletions(-) create mode 100644 home/ebisu/fortune/desktop/wayland/waybar/configuration/default-modules.nix create mode 100755 home/ebisu/fortune/desktop/wayland/waybar/configuration/scripts/mediaplayer.py create mode 100755 home/ebisu/fortune/desktop/wayland/waybar/configuration/scripts/mediaplayer.py.bak create mode 100644 home/ebisu/fortune/desktop/wayland/waybar/configuration/style.css create mode 100644 home/ebisu/fortune/desktop/wayland/waybar/configuration/style.css.bak delete mode 100644 home/ebisu/fortune/desktop/wayland/waybar/waybar/default-modules.nix delete mode 100755 home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py delete mode 100755 home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py.bak delete mode 100644 home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css delete mode 100644 home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css.bak diff --git a/home/ebisu/fortune/desktop/wayland/waybar/configuration/default-modules.nix b/home/ebisu/fortune/desktop/wayland/waybar/configuration/default-modules.nix new file mode 100644 index 0000000..a9d6cad --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/configuration/default-modules.nix @@ -0,0 +1,237 @@ +{ pkgs, ... }: +let + mediaplayer = pkgs.stdenv.mkDerivation { + name = "mediaplayer"; + + propagatedBuildInputs = with pkgs; [ + (python3.withPackages (ps: [ ps.pygobject3 ])) + playerctl + gobject-introspection + curl + ]; + + dontUnpack = true; + installPhase = "install -Dm755 ${./scripts/mediaplayer.py} $out/bin/mediaplayer"; + }; +in +{ + layer = "top"; + position = "top"; + margin-left = 8; + margin-right = 8; + height = 40; + + bluetooth = { + format = ""; + on-click = "${pkgs.blueberry}/bin/blueberry"; + }; + + clock = { + locale = "ja_JP.utf8"; + interval = 5; + tooltip-format = "{calendar}"; + # format = "{:%m月 %d日 %H:%M:%S}"; + format = "{:L%m月 %d日 %H:%M}"; + format-alt = "{:L%G年%b %d日 %A}"; + }; + + # For when clock doesn't work + "custom/clock" = { + exec = "date '+%m月 %d日 %H:%M'"; + tooltip = false; + interval = 5; + }; + + cpu = { + interval = 5; + format = " {usage}% ({load})"; + + states = { + warning = 70; + critical = 90; + }; + + on-click = "${pkgs.kitty}/bin/kitty -e '${pkgs.bottom}/bin/btm'"; + }; + + memory = { + interval = 5; + format = " {}%"; + format-alt = " {used:0.1f}/{total:0.1f}ギガ"; + + # I might remove these. I have 64GB of RAM .... + states = { + warning = 70; + critical = 90; + }; + }; + + network = { + interval = 1; + # format-wifi = " {bandwidthUpBytes} {bandwidthDownBytes}", + # format-ethernet = " {bandwidthUpBytes} {bandwidthDownBytes}", + format = " {bandwidthUpBytes}  {bandwidthDownBytes}"; + format-disconnected = "⚠ Disconnected"; + tooltip-format = "{ifname}: {ipaddr}"; + on-click = "${pkgs.kitty}/bin/kitty -e 'nmtui'"; + }; + + "hyprland/mode" = { + format = "{}"; + tooltip = false; + }; + + "hyprland/window" = { + format = "{}"; + max-length = 120; + separate-outputs = true; + icon = false; + + rewrite = { + "(.*) - Thorium" = "󰖟 $1"; + "(.*) - NVIM" = " $1"; + "ChatGPT" = " ChatGPT"; + "~(.*)" = " ~$1"; + "…(.*)" = " …$1"; + "zsh" = " ~"; + "fish" = " ~"; + "kitty" = " ~"; + "Volume Control" = " Volume Control"; + "Bluetooth" = " Bluetooth"; + "JamesDSP for Linux" = "󰺢 JamesDSP"; + }; + }; + + pulseaudio = { + scroll-step = 1; + format = "{icon} {volume}%"; + # format-bluetooth = "{volume}% {icon}  {format_source}"; + # format-bluetooth-muted = " {icon}  {format_source}"; + format-muted = "󰸈"; + + format-icons = { + headphone = "󰋋"; + hands-free = "וֹ"; + headset = "󱡏"; + phone = ""; + portable = ""; + car = ""; + + default = [ "" ]; + }; + + on-click = "pactl set-sink-mute @DEFAULT_SINK@ toggle"; + on-click-right = "${pkgs.pavucontrol}/bin/pavucontrol"; + on-scroll-up = "pactl set-sink-volume @DEFAULT_SINK@ +2%"; + on-scroll-down = "pactl set-sink-volume @DEFAULT_SINK@ -2%"; + }; + + tray = { + spacing = 10; + show-passive-items = true; + }; + + "image#album-art" = { + path = "/tmp/mediaplayer_art"; + size = 22.5; # (18 + (18 / 4)) + interval = 5; + on-click = "${pkgs.playerctl}/bin/playerctl play-pause"; + }; + + "custom/media" = { + format = "{icon} {}"; + return-type = "json"; + max-length = 40; + + format-icons = { + spotify = " "; + default = "󰗃 "; + }; + + escape = true; + exec = "GI_TYPELIB_PATH=${pkgs.playerctl}/lib/girepository-1.0:${pkgs.glib}/lib/girepository-1.0:$GI_TYPELIB_PATH ${mediaplayer}/bin/mediaplayer 2> /dev/null"; + on-click = "${pkgs.playerctl}/bin/playerctl play-pause"; + on-scroll-up = "${pkgs.playerctl}/bin/playerctl next"; + on-scroll-down = "${pkgs.playerctl}/bin/playerctl previous"; + }; + + cava = { + framerate = 280; + autosens = 1; + sensitivity = 3; + bars = 26; + lower_cutoff_freq = 50; + higher_cutoff_freq = 10000; + method = "pipewire"; + source = "auto"; + stereo = true; + reverse = true; + bar_delimiter = 0; + monstercat = false; + waves = false; + hide_on_silence = true; + noise_reduction = 0.77; + input_delay = 0; + on-click = "${pkgs.playerctl}/bin/playerctl play-pause"; + + # actions = { + # on-click-right = "mode"; + # }; + + # format-icons = ["░", "▒", "▓", "█", "█", "█", "█", "█"] + # format-icons = ["⎺", "⎻", "⎼", "⎽", "⎼", "⎻", "⎺", "⎹"] + # format-icons = ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"] + format-icons = [ + "⠁" + "⠃" + "⠇" + "⠋" + "⠛" + "⠟" + "⠿" + "⣿" + ]; + # format-icons = ["◰", "◳", "◲", "◱", "▘", "▝", "▖", "▗"] + # format-icons = ["▖", "▗", "▘", "▝", "▚", "▞", "▛", "▟"] + # format-icons = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "▉", "▊"] + # format-icons = ["⎯", "⎰", "⎱", "⎲", "⎳", "⎴", "⎵", "⎶"] + # format-icons = ["⎺", "⎻", "⎼", "⎽", "⎾", "⎿", "⏀", "⏁"] + # format-icons = ["♪", "♫", "♬", "♭", "♮", "♯", "♩", "♪"] + # format-icons = ["→", "⇉", "⇒", "⇉", "→", "⇉", "⇒", "⇉"] + # format-icons = ["·", ":", "⁙", "⁘", "⁙", ":", "·", "•"] + # format-icons = ["○", "◔", "◑", "◕", "●", "◍", "◎", "◉"] + # format-icons = ["△", "▲", "▴", "▸", "▶", "▹", "►", "▻"] + # format-icons = ["◇", "◈", "◉", "◍", "◎", "◯", "⦿", "◑"] + # format-icons = ["-", "–", "—", "––", "–––", "——", "———", "——––"] + # format-icons = ["-", "=", "≡", "≣", "≠", "≢", "≜", "≝"] + # format-icons = ["✓", "✔", "✕", "✖", "✗", "✘", "✙", "✚"] + # format-icons = ["✩", "✪", "✫", "✬", "✭", "✮", "✯", "✰"] + }; + + "custom/gpu" = { + exec = "nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader | sed 's/ %/%/'"; + interval = 5; + format = " {}"; + on-click = "${pkgs.kitty}/bin/kitty -e '${pkgs.nvtopPackages.nvidia}/bin/nvtop'"; + }; + + modules-left = [ + "hyprland/workspaces" + "hyprland/window" + "custom/media" + "image#album-art" + ]; + + modules-center = [ "clock" ]; + + modules-right = [ + # "cava" + # "network" + "tray" + "cpu" + "custom/gpu" + "memory" + "bluetooth" + "pulseaudio" + ]; +} diff --git a/home/ebisu/fortune/desktop/wayland/waybar/configuration/scripts/mediaplayer.py b/home/ebisu/fortune/desktop/wayland/waybar/configuration/scripts/mediaplayer.py new file mode 100755 index 0000000..c44ee0b --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/configuration/scripts/mediaplayer.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 + +import argparse +import logging +import os +import sys +import signal +import gi +import json + +gi.require_version("Playerctl", "2.0") + +from gi.repository import Playerctl, GLib + +logger = logging.getLogger(__name__) + + +def write_output(text, player): + logger.info("Writing output") + + output = { + "text": text, + "class": "custom-" + player.props.player_name, + "alt": player.props.player_name, + "art": player.props.metadata["mpris:artUrl"], + } + + sys.stdout.write(json.dumps(output) + "\n") + sys.stdout.flush() + + +def on_play(player, status, manager): + logger.info("Received new playback status") + on_metadata(player, player.props.metadata, manager) + + +def on_metadata(player, metadata, manager): + logger.info("Received new metadata") + + track_info = "" + + if ( + player.props.player_name == "spotify" + and "mpris:trackid" in metadata.keys() + and ":ad:" in player.props.metadata["mpris:trackid"] + ): + track_info = "AD PLAYING" + elif player.get_artist() != "" and player.get_title() != "": + track_info = "{title} - {artist}".format( + artist=player.get_artist(), title=player.get_title() + ) + else: + track_info = player.get_title() + + if "file://" in player.props.metadata["mpris:artUrl"]: + os.system( + f"cp $(echo '{player.props.metadata['mpris:artUrl']}' | sed -E 's/file:\\/\\///g') /tmp/mediaplayer_art" + ) + else: + os.system( + f"curl --silent $(echo '{player.props.metadata['mpris:artUrl']}' | sed -E 's/file:\\/\\///g') --output /tmp/mediaplayer_art" + ) + + # if player.props.status != 'Playing' and track_info: + # track_info = ' ' + track_info + + write_output(track_info, player) + + +def on_player_appeared(manager, player, selected_player=None): + if player is not None and ( + selected_player is None or player.name == selected_player + ): + init_player(manager, player) + else: + logger.debug("New player appeared, but it's not the selected player, skipping") + + +def on_player_vanished(manager, player): + logger.info("Player has vanished") + sys.stdout.write("\n") + sys.stdout.flush() + os.system("rm /tmp/mediaplayer_art") + + +def init_player(manager, name): + logger.debug("Initialize player: {player}".format(player=name.name)) + + player = Playerctl.Player.new_from_name(name) + + player.connect("playback-status", on_play, manager) + player.connect("metadata", on_metadata, manager) + manager.manage_player(player) + on_metadata(player, player.props.metadata, manager) + + +def signal_handler(sig, frame): + logger.debug("Received signal to stop, exiting") + sys.stdout.write("\n") + sys.stdout.flush() + # loop.quit() + sys.exit(0) + + +def parse_arguments(): + parser = argparse.ArgumentParser() + + parser.add_argument("-v", "--verbose", action="count", default=0) + parser.add_argument("--player") + + return parser.parse_args() + + +def main(): + arguments = parse_arguments() + logging.basicConfig( + stream=sys.stderr, + level=logging.DEBUG, + format="%(name)s %(levelname)s %(message)s", + ) + + logger.setLevel(max((3 - arguments.verbose) * 10, 0)) + logger.debug("Arguments received {}".format(vars(arguments))) + + manager = Playerctl.PlayerManager() + loop = GLib.MainLoop() + + manager.connect( + "name-appeared", lambda *args: on_player_appeared(*args, arguments.player) + ) + manager.connect("player-vanished", on_player_vanished) + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + + for player in manager.props.player_names: + if arguments.player is not None and arguments.player != player.name: + logger.debug( + "{player} is not the filtered player, skipping it".format( + player=player.name + ) + ) + + continue + + init_player(manager, player) + + loop.run() + + +if __name__ == "__main__": + main() diff --git a/home/ebisu/fortune/desktop/wayland/waybar/configuration/scripts/mediaplayer.py.bak b/home/ebisu/fortune/desktop/wayland/waybar/configuration/scripts/mediaplayer.py.bak new file mode 100755 index 0000000..1630d97 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/configuration/scripts/mediaplayer.py.bak @@ -0,0 +1,128 @@ +#!/usr/bin/env python3 +import argparse +import logging +import sys +import signal +import gi +import json +gi.require_version('Playerctl', '2.0') +from gi.repository import Playerctl, GLib + +logger = logging.getLogger(__name__) + + +def write_output(text, player): + logger.info('Writing output') + + output = {'text': text, + 'class': 'custom-' + player.props.player_name, + 'alt': player.props.player_name} + + sys.stdout.write(json.dumps(output) + '\n') + sys.stdout.flush() + + +def on_play(player, status, manager): + logger.info('Received new playback status') + on_metadata(player, player.props.metadata, manager) + + +def on_metadata(player, metadata, manager): + logger.info('Received new metadata') + track_info = '' + + if player.props.player_name == 'spotify' and \ + 'mpris:trackid' in metadata.keys() and \ + ':ad:' in player.props.metadata['mpris:trackid']: + track_info = 'AD PLAYING' + elif player.get_artist() != '' and player.get_title() != '': + track_info = '{artist} - {title}'.format(artist=player.get_artist(), + title=player.get_title()) + else: + track_info = player.get_title() + + if player.props.status != 'Playing' and track_info: + track_info = ' ' + track_info + write_output(track_info, player) + + +def on_player_appeared(manager, player, selected_player=None): + if player is not None and (selected_player is None or player.name == selected_player): + init_player(manager, player) + else: + logger.debug("New player appeared, but it's not the selected player, skipping") + + +def on_player_vanished(manager, player): + logger.info('Player has vanished') + sys.stdout.write('\n') + sys.stdout.flush() + + +def init_player(manager, name): + logger.debug('Initialize player: {player}'.format(player=name.name)) + player = Playerctl.Player.new_from_name(name) + player.connect('playback-status', on_play, manager) + player.connect('metadata', on_metadata, manager) + manager.manage_player(player) + on_metadata(player, player.props.metadata, manager) + + +def signal_handler(sig, frame): + logger.debug('Received signal to stop, exiting') + sys.stdout.write('\n') + sys.stdout.flush() + # loop.quit() + sys.exit(0) + + +def parse_arguments(): + parser = argparse.ArgumentParser() + + # Increase verbosity with every occurrence of -v + parser.add_argument('-v', '--verbose', action='count', default=0) + + # Define for which player we're listening + parser.add_argument('--player') + + return parser.parse_args() + + +def main(): + arguments = parse_arguments() + + # Initialize logging + logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, + format='%(name)s %(levelname)s %(message)s') + + # Logging is set by default to WARN and higher. + # With every occurrence of -v it's lowered by one + logger.setLevel(max((3 - arguments.verbose) * 10, 0)) + + # Log the sent command line arguments + logger.debug('Arguments received {}'.format(vars(arguments))) + + manager = Playerctl.PlayerManager() + loop = GLib.MainLoop() + + manager.connect('name-appeared', lambda *args: on_player_appeared(*args, arguments.player)) + manager.connect('player-vanished', on_player_vanished) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + + for player in manager.props.player_names: + if arguments.player is not None and arguments.player != player.name: + logger.debug('{player} is not the filtered player, skipping it' + .format(player=player.name) + ) + continue + + init_player(manager, player) + + loop.run() + + +if __name__ == '__main__': + main() diff --git a/home/ebisu/fortune/desktop/wayland/waybar/configuration/style.css b/home/ebisu/fortune/desktop/wayland/waybar/configuration/style.css new file mode 100644 index 0000000..121c792 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/configuration/style.css @@ -0,0 +1,134 @@ +@import "/home/ebisu/.cache/wal/colors-waybar.css"; + +* { + /* font-family: CartographCF Nerd Font, Iosevka Nerd Font, cursive; */ + /* font-family: Noto Sans Mono, Sarasa Mono J, cursive; */ + /* font-family: SF Mono, cursive; */ + /* font-family: MesloLGS NF; */ + font-family: SF Pro, Hiragino Sans, cursive; + font-size: 15px; +} + +window#waybar { + background-color: rgba(0, 0, 0, 0); + color: @foreground; + /* -gtk-icon-shadow: */ + /* -1px 0 #ffffff, */ + /* 0 1px #ffffff, */ + /* 1px 0 #ffffff, */ + /* 0 -1px #ffffff; */ +} + +#battery, +#cava, +#custom-know, +#clock, +#custom-clock, +#backlight, +#cpu, +#custom-keyboard-layout, +#memory, +#mode, +#custom-weather, +#network, +#pulseaudio, +#temperature, +#tray, +#idle_inhibitor, +#window, +#bluetooth, +#custom-power, +#workspaces, +#custom-media, +#custom-gpu, +#custom-PBPbattery { + /* padding: 0.25rem 0.75rem; */ + /* margin: 10px 5px 0px 0; */ + padding: 5px 15px; + margin: 10px 1rem 0px 0; + background-color: @background; + border-radius: 10px; /* 9 */ + color: @foreground; +} + +#image { + margin-top: 10px; + border-top-right-radius: 10px; + border-bottom-right-radius: 10px; + background-color: @background; + margin-right: 1rem; + padding-right: 1rem; +} + +#image > * { + border-radius: 10px; +} + +#image.empty { + background-color: transparent; + min-width: 0; + min-height: 0; + margin: 0; + padding: 0; +} + +window#waybar #custom-media { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + padding-right: 1rem; + margin-right: 0; +} + +window#waybar.empty #window { + background-color: transparent; + padding: 0; + margin: 0; +} + +window#custom-media.empty #window { + background-color: transparent; +} + +#workspaces button.active { + color: @color11; +} + +#workspaces button:hover { + background-color: unset; +} + +#pulseaudio { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin-left: 0; + padding-left: 0.5rem; +} + +#bluetooth { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: 0; + padding-right: 0.5rem; +} + +#memory { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin-left: 0; + padding-left: 0.5rem; +} + +#custom-gpu { + border-radius: 0; + margin-right: 0; + margin-left: 0; + padding-right: 0.5rem; + padding-left: 0.5rem; +} + +#cpu { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin-right: 0; + padding-right: 0.5rem; +} diff --git a/home/ebisu/fortune/desktop/wayland/waybar/configuration/style.css.bak b/home/ebisu/fortune/desktop/wayland/waybar/configuration/style.css.bak new file mode 100644 index 0000000..3858c71 --- /dev/null +++ b/home/ebisu/fortune/desktop/wayland/waybar/configuration/style.css.bak @@ -0,0 +1,221 @@ +@import "colors-waybar.css"; + +* { + font-family: CartographCF Nerd Font, Iosevka Nerd Font, cursive; + font-size: 14px; +} + +window#waybar { + background-color: rgba(0, 0, 0, 0); + color: @foreground; + transition-property: background-color; + transition-duration: 0.5s; +} + +window#waybar.hidden { + opacity: 0.1; +} + +#window { + color: @foreground; +} + +#clock, +#cpu, +#memory, +#custom-media, +#tray, +#mode, +#workspaces, +#battery, +#idle_inhibitor, +#window, +#custom-power-menu, +#custom-wallpaper, +#custom-launcher, +#custom-spotify, +#custom-weather, +#custom-theme, +#custom-weather.severe, +#custom-weather.sunnyDay, +#custom-weather.clearNight, +#custom-weather.cloudyFoggyDay, +#custom-weather.cloudyFoggyNight, +#custom-weather.rainyDay, +#custom-weather.rainyNight, +#custom-weather.showyIcyDay, +#custom-weather.snowyIcyNight, +#custom-weather.default { + color: @foreground; + padding: 2px 10px; + background-color: @background; + border-radius: 8px; + margin: 6px 3px 0; +} + +#window { + color: @color8; +} + +#custom-launcher { + color: @color9; + padding: 0 20px 0 20px; + margin-left: 8px; +} + +#cpu { + /* color: @color10; */ + color: @foreground; +} + +#memory { + /* color: @color11; */ + color: @foreground; +} + +#workspaces {} + +#workspaces button { + color: @color10; + box-shadow: inset 0 -3px transparent; + margin-right: 0em; + transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.68); +} + +#workspaces button.active { + color: @foreground; + margin-right: 0em; + transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.68); +} + +/* 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; +} + +#tray {} + +#tray>.passive { + -gtk-icon-effect: dim; +} + +#tray>.needs-attention { + -gtk-icon-effect: highlight; + background-color: #eb4d4b; +} + +#custom-spotify { + /* color: @color10; */ + color: @color8; +} + +#custom-wallpaper { + padding: 0 18px 0 12px; + color: @color14; +} + +#custom-theme { + padding: 0 18px 0 12px; + color: @color13; +} + +#bluetooth, +#backlight, +#pulseaudio, +#network { + color: @color5; + background-color: @background; + padding: 0 12px; + margin: 6px 0 0; +} + +#bluetooth { + border-radius: 8px 0px 0px 8px; + /* color: @color11; */ + margin-left: 3px; + border-right: none; +} + +#network { + color: @color13; + padding-right: 14px; + border-right: none; + border-left: none; +} + +#network.disconnected { + color: @color11; +} + +#pulseaudio { + /* color: @color10; */ + border-left: none; + /* border-right: none; */ + border-radius: 0 8px 8px 0; + padding-right: 12px; +} + +#pulseaudio.muted { + color: @color11; +} + +#backlight { + margin-right: 3px; + padding-right: 8px; + color: @color13; + border-radius: 0 8px 8px 0; + border-left: none; +} + +#battery { + color: @color9; + border-radius: 8px; + padding: 0 12px; +} + +#battery.critical, +#battery.warning, +#battery.full, +#battery.plugged { + color: @color15; +} + +#clock { + color: @foreground; + margin-left: 6px; +} + +#custom-power-menu { + color: @color10; + margin-right: 8px; + padding: 0 12px 0 10px; +} + +@keyframes blink { + to { + background-color: rgba(30, 34, 42, 0.5); + color: #abb2bf; + } +} + +tooltip { + border-radius: 15px; + padding: 15px; + background-color: @background; + color: @foreground; + font-family: CartographCF Nerd Font; +} + +tooltip label { + padding: 5px; + color: @foreground; +} + +label:focus { + background-color: @background; +} diff --git a/home/ebisu/fortune/desktop/wayland/waybar/default.nix b/home/ebisu/fortune/desktop/wayland/waybar/default.nix index 4efd8b5..cdf3268 100644 --- a/home/ebisu/fortune/desktop/wayland/waybar/default.nix +++ b/home/ebisu/fortune/desktop/wayland/waybar/default.nix @@ -2,11 +2,11 @@ { programs.waybar = { enable = true; - style = ./waybar/style.css; + style = ./configuration/style.css; settings = let - defaultModules = import ./waybar/default-modules.nix { inherit pkgs; }; + defaultModules = import ./configuration/default-modules.nix { inherit pkgs; }; hyprland-workspaces-base = { disable-scroll = true; disable-markup = false; @@ -83,14 +83,12 @@ scripts = [ "mediaplayer.py" ]; in (builtins.listToAttrs ( - map - (script: { - name = "waybar/scripts/${script}"; + map (script: { + name = "waybar/scripts/${script}"; - value = { - source = ./waybar/scripts/${script}; - }; - }) - scripts + value = { + source = ./configuration/scripts/${script}; + }; + }) scripts )); } diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/default-modules.nix b/home/ebisu/fortune/desktop/wayland/waybar/waybar/default-modules.nix deleted file mode 100644 index 07d741d..0000000 --- a/home/ebisu/fortune/desktop/wayland/waybar/waybar/default-modules.nix +++ /dev/null @@ -1,231 +0,0 @@ -{ pkgs, ... }: -let - python-shell = pkgs.mkShell { - packages = [ - (pkgs.python3.withPackages (python-pkgs: [ python-pkgs.pygobject3 ])) - pkgs.playerctl - pkgs.gobject-introspection - ]; - }; -in -{ - layer = "top"; - position = "top"; - margin-left = 8; - margin-right = 8; - height = 40; - - bluetooth = { - format = ""; - on-click = "${pkgs.blueberry}/bin/blueberry"; - }; - - clock = { - locale = "ja_JP.utf8"; - interval = 5; - tooltip-format = "{calendar}"; - # format = "{:%m月 %d日 %H:%M:%S}"; - format = "{:L%m月 %d日 %H:%M}"; - format-alt = "{:L%G年%b %d日 %A}"; - }; - - # For when clock doesn't work - "custom/clock" = { - exec = "date '+%m月 %d日 %H:%M'"; - tooltip = false; - interval = 5; - }; - - cpu = { - interval = 5; - format = " {usage}% ({load})"; - - states = { - warning = 70; - critical = 90; - }; - - on-click = "${pkgs.kitty}/bin/kitty -e '${pkgs.bottom}/bin/btm'"; - }; - - memory = { - interval = 5; - format = " {}%"; - format-alt = " {used:0.1f}/{total:0.1f}ギガ"; - - # I might remove these. I have 64GB of RAM .... - states = { - warning = 70; - critical = 90; - }; - }; - - network = { - interval = 1; - # format-wifi = " {bandwidthUpBytes} {bandwidthDownBytes}", - # format-ethernet = " {bandwidthUpBytes} {bandwidthDownBytes}", - format = " {bandwidthUpBytes}  {bandwidthDownBytes}"; - format-disconnected = "⚠ Disconnected"; - tooltip-format = "{ifname}: {ipaddr}"; - on-click = "${pkgs.kitty}/bin/kitty -e 'nmtui'"; - }; - - "hyprland/mode" = { - format = "{}"; - tooltip = false; - }; - - "hyprland/window" = { - format = "{}"; - max-length = 120; - separate-outputs = true; - icon = false; - - rewrite = { - "(.*) - Thorium" = "󰖟 $1"; - "(.*) - NVIM" = " $1"; - "ChatGPT" = " ChatGPT"; - "~(.*)" = " ~$1"; - "…(.*)" = " …$1"; - "zsh" = " ~"; - "fish" = " ~"; - "kitty" = " ~"; - "Volume Control" = " Volume Control"; - "Bluetooth" = " Bluetooth"; - "JamesDSP for Linux" = "󰺢 JamesDSP"; - }; - }; - - pulseaudio = { - scroll-step = 1; - format = "{icon} {volume}%"; - # format-bluetooth = "{volume}% {icon}  {format_source}"; - # format-bluetooth-muted = " {icon}  {format_source}"; - format-muted = "󰸈"; - - format-icons = { - headphone = "󰋋"; - hands-free = "וֹ"; - headset = "󱡏"; - phone = ""; - portable = ""; - car = ""; - - default = [ "" ]; - }; - - on-click = "pactl set-sink-mute @DEFAULT_SINK@ toggle"; - on-click-right = "${pkgs.pavucontrol}/bin/pavucontrol"; - on-scroll-up = "pactl set-sink-volume @DEFAULT_SINK@ +2%"; - on-scroll-down = "pactl set-sink-volume @DEFAULT_SINK@ -2%"; - }; - - tray = { - spacing = 10; - show-passive-items = true; - }; - - "image#album-art" = { - path = "/tmp/mediaplayer_art"; - size = 22.5; # (18 + (18 / 4)) - interval = 5; - on-click = "${pkgs.playerctl}/bin/playerctl play-pause"; - }; - - "custom/media" = { - format = "{icon} {}"; - return-type = "json"; - max-length = 40; - - format-icons = { - spotify = " "; - default = "󰗃 "; - }; - - escape = true; - exec = "${python-shell}/bin/python3 ~/.config/waybar/scripts/mediaplayer.py 2> /dev/null"; - on-click = "${pkgs.playerctl}/bin/playerctl play-pause"; - on-scroll-up = "${pkgs.playerctl}/bin/playerctl next"; - on-scroll-down = "${pkgs.playerctl}/bin/playerctl previous"; - }; - - cava = { - framerate = 280; - autosens = 1; - sensitivity = 3; - bars = 26; - lower_cutoff_freq = 50; - higher_cutoff_freq = 10000; - method = "pipewire"; - source = "auto"; - stereo = true; - reverse = true; - bar_delimiter = 0; - monstercat = false; - waves = false; - hide_on_silence = true; - noise_reduction = 0.77; - input_delay = 0; - on-click = "${pkgs.playerctl}/bin/playerctl play-pause"; - - # actions = { - # on-click-right = "mode"; - # }; - - # format-icons = ["░", "▒", "▓", "█", "█", "█", "█", "█"] - # format-icons = ["⎺", "⎻", "⎼", "⎽", "⎼", "⎻", "⎺", "⎹"] - # format-icons = ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "█"] - format-icons = [ - "⠁" - "⠃" - "⠇" - "⠋" - "⠛" - "⠟" - "⠿" - "⣿" - ]; - # format-icons = ["◰", "◳", "◲", "◱", "▘", "▝", "▖", "▗"] - # format-icons = ["▖", "▗", "▘", "▝", "▚", "▞", "▛", "▟"] - # format-icons = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "▉", "▊"] - # format-icons = ["⎯", "⎰", "⎱", "⎲", "⎳", "⎴", "⎵", "⎶"] - # format-icons = ["⎺", "⎻", "⎼", "⎽", "⎾", "⎿", "⏀", "⏁"] - # format-icons = ["♪", "♫", "♬", "♭", "♮", "♯", "♩", "♪"] - # format-icons = ["→", "⇉", "⇒", "⇉", "→", "⇉", "⇒", "⇉"] - # format-icons = ["·", ":", "⁙", "⁘", "⁙", ":", "·", "•"] - # format-icons = ["○", "◔", "◑", "◕", "●", "◍", "◎", "◉"] - # format-icons = ["△", "▲", "▴", "▸", "▶", "▹", "►", "▻"] - # format-icons = ["◇", "◈", "◉", "◍", "◎", "◯", "⦿", "◑"] - # format-icons = ["-", "–", "—", "––", "–––", "——", "———", "——––"] - # format-icons = ["-", "=", "≡", "≣", "≠", "≢", "≜", "≝"] - # format-icons = ["✓", "✔", "✕", "✖", "✗", "✘", "✙", "✚"] - # format-icons = ["✩", "✪", "✫", "✬", "✭", "✮", "✯", "✰"] - }; - - "custom/gpu" = { - exec = "nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader | sed 's/ %/%/'"; - interval = 5; - format = " {}"; - on-click = "${pkgs.kitty}/bin/kitty -e '${pkgs.nvtopPackages.nvidia}/bin/nvtop'"; - }; - - modules-left = [ - "hyprland/workspaces" - "hyprland/window" - "custom/media" - "image#album-art" - ]; - - modules-center = [ "clock" ]; - - modules-right = [ - # "cava" - # "network" - "tray" - "cpu" - "custom/gpu" - "memory" - "bluetooth" - "pulseaudio" - ]; -} diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py b/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py deleted file mode 100755 index c44ee0b..0000000 --- a/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py +++ /dev/null @@ -1,152 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import logging -import os -import sys -import signal -import gi -import json - -gi.require_version("Playerctl", "2.0") - -from gi.repository import Playerctl, GLib - -logger = logging.getLogger(__name__) - - -def write_output(text, player): - logger.info("Writing output") - - output = { - "text": text, - "class": "custom-" + player.props.player_name, - "alt": player.props.player_name, - "art": player.props.metadata["mpris:artUrl"], - } - - sys.stdout.write(json.dumps(output) + "\n") - sys.stdout.flush() - - -def on_play(player, status, manager): - logger.info("Received new playback status") - on_metadata(player, player.props.metadata, manager) - - -def on_metadata(player, metadata, manager): - logger.info("Received new metadata") - - track_info = "" - - if ( - player.props.player_name == "spotify" - and "mpris:trackid" in metadata.keys() - and ":ad:" in player.props.metadata["mpris:trackid"] - ): - track_info = "AD PLAYING" - elif player.get_artist() != "" and player.get_title() != "": - track_info = "{title} - {artist}".format( - artist=player.get_artist(), title=player.get_title() - ) - else: - track_info = player.get_title() - - if "file://" in player.props.metadata["mpris:artUrl"]: - os.system( - f"cp $(echo '{player.props.metadata['mpris:artUrl']}' | sed -E 's/file:\\/\\///g') /tmp/mediaplayer_art" - ) - else: - os.system( - f"curl --silent $(echo '{player.props.metadata['mpris:artUrl']}' | sed -E 's/file:\\/\\///g') --output /tmp/mediaplayer_art" - ) - - # if player.props.status != 'Playing' and track_info: - # track_info = ' ' + track_info - - write_output(track_info, player) - - -def on_player_appeared(manager, player, selected_player=None): - if player is not None and ( - selected_player is None or player.name == selected_player - ): - init_player(manager, player) - else: - logger.debug("New player appeared, but it's not the selected player, skipping") - - -def on_player_vanished(manager, player): - logger.info("Player has vanished") - sys.stdout.write("\n") - sys.stdout.flush() - os.system("rm /tmp/mediaplayer_art") - - -def init_player(manager, name): - logger.debug("Initialize player: {player}".format(player=name.name)) - - player = Playerctl.Player.new_from_name(name) - - player.connect("playback-status", on_play, manager) - player.connect("metadata", on_metadata, manager) - manager.manage_player(player) - on_metadata(player, player.props.metadata, manager) - - -def signal_handler(sig, frame): - logger.debug("Received signal to stop, exiting") - sys.stdout.write("\n") - sys.stdout.flush() - # loop.quit() - sys.exit(0) - - -def parse_arguments(): - parser = argparse.ArgumentParser() - - parser.add_argument("-v", "--verbose", action="count", default=0) - parser.add_argument("--player") - - return parser.parse_args() - - -def main(): - arguments = parse_arguments() - logging.basicConfig( - stream=sys.stderr, - level=logging.DEBUG, - format="%(name)s %(levelname)s %(message)s", - ) - - logger.setLevel(max((3 - arguments.verbose) * 10, 0)) - logger.debug("Arguments received {}".format(vars(arguments))) - - manager = Playerctl.PlayerManager() - loop = GLib.MainLoop() - - manager.connect( - "name-appeared", lambda *args: on_player_appeared(*args, arguments.player) - ) - manager.connect("player-vanished", on_player_vanished) - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - signal.signal(signal.SIGPIPE, signal.SIG_DFL) - - for player in manager.props.player_names: - if arguments.player is not None and arguments.player != player.name: - logger.debug( - "{player} is not the filtered player, skipping it".format( - player=player.name - ) - ) - - continue - - init_player(manager, player) - - loop.run() - - -if __name__ == "__main__": - main() diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py.bak b/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py.bak deleted file mode 100755 index 1630d97..0000000 --- a/home/ebisu/fortune/desktop/wayland/waybar/waybar/scripts/mediaplayer.py.bak +++ /dev/null @@ -1,128 +0,0 @@ -#!/usr/bin/env python3 -import argparse -import logging -import sys -import signal -import gi -import json -gi.require_version('Playerctl', '2.0') -from gi.repository import Playerctl, GLib - -logger = logging.getLogger(__name__) - - -def write_output(text, player): - logger.info('Writing output') - - output = {'text': text, - 'class': 'custom-' + player.props.player_name, - 'alt': player.props.player_name} - - sys.stdout.write(json.dumps(output) + '\n') - sys.stdout.flush() - - -def on_play(player, status, manager): - logger.info('Received new playback status') - on_metadata(player, player.props.metadata, manager) - - -def on_metadata(player, metadata, manager): - logger.info('Received new metadata') - track_info = '' - - if player.props.player_name == 'spotify' and \ - 'mpris:trackid' in metadata.keys() and \ - ':ad:' in player.props.metadata['mpris:trackid']: - track_info = 'AD PLAYING' - elif player.get_artist() != '' and player.get_title() != '': - track_info = '{artist} - {title}'.format(artist=player.get_artist(), - title=player.get_title()) - else: - track_info = player.get_title() - - if player.props.status != 'Playing' and track_info: - track_info = ' ' + track_info - write_output(track_info, player) - - -def on_player_appeared(manager, player, selected_player=None): - if player is not None and (selected_player is None or player.name == selected_player): - init_player(manager, player) - else: - logger.debug("New player appeared, but it's not the selected player, skipping") - - -def on_player_vanished(manager, player): - logger.info('Player has vanished') - sys.stdout.write('\n') - sys.stdout.flush() - - -def init_player(manager, name): - logger.debug('Initialize player: {player}'.format(player=name.name)) - player = Playerctl.Player.new_from_name(name) - player.connect('playback-status', on_play, manager) - player.connect('metadata', on_metadata, manager) - manager.manage_player(player) - on_metadata(player, player.props.metadata, manager) - - -def signal_handler(sig, frame): - logger.debug('Received signal to stop, exiting') - sys.stdout.write('\n') - sys.stdout.flush() - # loop.quit() - sys.exit(0) - - -def parse_arguments(): - parser = argparse.ArgumentParser() - - # Increase verbosity with every occurrence of -v - parser.add_argument('-v', '--verbose', action='count', default=0) - - # Define for which player we're listening - parser.add_argument('--player') - - return parser.parse_args() - - -def main(): - arguments = parse_arguments() - - # Initialize logging - logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, - format='%(name)s %(levelname)s %(message)s') - - # Logging is set by default to WARN and higher. - # With every occurrence of -v it's lowered by one - logger.setLevel(max((3 - arguments.verbose) * 10, 0)) - - # Log the sent command line arguments - logger.debug('Arguments received {}'.format(vars(arguments))) - - manager = Playerctl.PlayerManager() - loop = GLib.MainLoop() - - manager.connect('name-appeared', lambda *args: on_player_appeared(*args, arguments.player)) - manager.connect('player-vanished', on_player_vanished) - - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - signal.signal(signal.SIGPIPE, signal.SIG_DFL) - - for player in manager.props.player_names: - if arguments.player is not None and arguments.player != player.name: - logger.debug('{player} is not the filtered player, skipping it' - .format(player=player.name) - ) - continue - - init_player(manager, player) - - loop.run() - - -if __name__ == '__main__': - main() diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css b/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css deleted file mode 100644 index 121c792..0000000 --- a/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css +++ /dev/null @@ -1,134 +0,0 @@ -@import "/home/ebisu/.cache/wal/colors-waybar.css"; - -* { - /* font-family: CartographCF Nerd Font, Iosevka Nerd Font, cursive; */ - /* font-family: Noto Sans Mono, Sarasa Mono J, cursive; */ - /* font-family: SF Mono, cursive; */ - /* font-family: MesloLGS NF; */ - font-family: SF Pro, Hiragino Sans, cursive; - font-size: 15px; -} - -window#waybar { - background-color: rgba(0, 0, 0, 0); - color: @foreground; - /* -gtk-icon-shadow: */ - /* -1px 0 #ffffff, */ - /* 0 1px #ffffff, */ - /* 1px 0 #ffffff, */ - /* 0 -1px #ffffff; */ -} - -#battery, -#cava, -#custom-know, -#clock, -#custom-clock, -#backlight, -#cpu, -#custom-keyboard-layout, -#memory, -#mode, -#custom-weather, -#network, -#pulseaudio, -#temperature, -#tray, -#idle_inhibitor, -#window, -#bluetooth, -#custom-power, -#workspaces, -#custom-media, -#custom-gpu, -#custom-PBPbattery { - /* padding: 0.25rem 0.75rem; */ - /* margin: 10px 5px 0px 0; */ - padding: 5px 15px; - margin: 10px 1rem 0px 0; - background-color: @background; - border-radius: 10px; /* 9 */ - color: @foreground; -} - -#image { - margin-top: 10px; - border-top-right-radius: 10px; - border-bottom-right-radius: 10px; - background-color: @background; - margin-right: 1rem; - padding-right: 1rem; -} - -#image > * { - border-radius: 10px; -} - -#image.empty { - background-color: transparent; - min-width: 0; - min-height: 0; - margin: 0; - padding: 0; -} - -window#waybar #custom-media { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - padding-right: 1rem; - margin-right: 0; -} - -window#waybar.empty #window { - background-color: transparent; - padding: 0; - margin: 0; -} - -window#custom-media.empty #window { - background-color: transparent; -} - -#workspaces button.active { - color: @color11; -} - -#workspaces button:hover { - background-color: unset; -} - -#pulseaudio { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - margin-left: 0; - padding-left: 0.5rem; -} - -#bluetooth { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - margin-right: 0; - padding-right: 0.5rem; -} - -#memory { - border-top-left-radius: 0; - border-bottom-left-radius: 0; - margin-left: 0; - padding-left: 0.5rem; -} - -#custom-gpu { - border-radius: 0; - margin-right: 0; - margin-left: 0; - padding-right: 0.5rem; - padding-left: 0.5rem; -} - -#cpu { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - margin-right: 0; - padding-right: 0.5rem; -} diff --git a/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css.bak b/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css.bak deleted file mode 100644 index 3858c71..0000000 --- a/home/ebisu/fortune/desktop/wayland/waybar/waybar/style.css.bak +++ /dev/null @@ -1,221 +0,0 @@ -@import "colors-waybar.css"; - -* { - font-family: CartographCF Nerd Font, Iosevka Nerd Font, cursive; - font-size: 14px; -} - -window#waybar { - background-color: rgba(0, 0, 0, 0); - color: @foreground; - transition-property: background-color; - transition-duration: 0.5s; -} - -window#waybar.hidden { - opacity: 0.1; -} - -#window { - color: @foreground; -} - -#clock, -#cpu, -#memory, -#custom-media, -#tray, -#mode, -#workspaces, -#battery, -#idle_inhibitor, -#window, -#custom-power-menu, -#custom-wallpaper, -#custom-launcher, -#custom-spotify, -#custom-weather, -#custom-theme, -#custom-weather.severe, -#custom-weather.sunnyDay, -#custom-weather.clearNight, -#custom-weather.cloudyFoggyDay, -#custom-weather.cloudyFoggyNight, -#custom-weather.rainyDay, -#custom-weather.rainyNight, -#custom-weather.showyIcyDay, -#custom-weather.snowyIcyNight, -#custom-weather.default { - color: @foreground; - padding: 2px 10px; - background-color: @background; - border-radius: 8px; - margin: 6px 3px 0; -} - -#window { - color: @color8; -} - -#custom-launcher { - color: @color9; - padding: 0 20px 0 20px; - margin-left: 8px; -} - -#cpu { - /* color: @color10; */ - color: @foreground; -} - -#memory { - /* color: @color11; */ - color: @foreground; -} - -#workspaces {} - -#workspaces button { - color: @color10; - box-shadow: inset 0 -3px transparent; - margin-right: 0em; - transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.68); -} - -#workspaces button.active { - color: @foreground; - margin-right: 0em; - transition: all 0.5s cubic-bezier(0.55, -0.68, 0.48, 1.68); -} - -/* 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; -} - -#tray {} - -#tray>.passive { - -gtk-icon-effect: dim; -} - -#tray>.needs-attention { - -gtk-icon-effect: highlight; - background-color: #eb4d4b; -} - -#custom-spotify { - /* color: @color10; */ - color: @color8; -} - -#custom-wallpaper { - padding: 0 18px 0 12px; - color: @color14; -} - -#custom-theme { - padding: 0 18px 0 12px; - color: @color13; -} - -#bluetooth, -#backlight, -#pulseaudio, -#network { - color: @color5; - background-color: @background; - padding: 0 12px; - margin: 6px 0 0; -} - -#bluetooth { - border-radius: 8px 0px 0px 8px; - /* color: @color11; */ - margin-left: 3px; - border-right: none; -} - -#network { - color: @color13; - padding-right: 14px; - border-right: none; - border-left: none; -} - -#network.disconnected { - color: @color11; -} - -#pulseaudio { - /* color: @color10; */ - border-left: none; - /* border-right: none; */ - border-radius: 0 8px 8px 0; - padding-right: 12px; -} - -#pulseaudio.muted { - color: @color11; -} - -#backlight { - margin-right: 3px; - padding-right: 8px; - color: @color13; - border-radius: 0 8px 8px 0; - border-left: none; -} - -#battery { - color: @color9; - border-radius: 8px; - padding: 0 12px; -} - -#battery.critical, -#battery.warning, -#battery.full, -#battery.plugged { - color: @color15; -} - -#clock { - color: @foreground; - margin-left: 6px; -} - -#custom-power-menu { - color: @color10; - margin-right: 8px; - padding: 0 12px 0 10px; -} - -@keyframes blink { - to { - background-color: rgba(30, 34, 42, 0.5); - color: #abb2bf; - } -} - -tooltip { - border-radius: 15px; - padding: 15px; - background-color: @background; - color: @foreground; - font-family: CartographCF Nerd Font; -} - -tooltip label { - padding: 5px; - color: @foreground; -} - -label:focus { - background-color: @background; -} -- cgit v1.2.3