diff --git a/waybar/animations.css b/waybar/animations.css deleted file mode 100644 index f3c5c80..0000000 --- a/waybar/animations.css +++ /dev/null @@ -1,18 +0,0 @@ -@keyframes workspace-pick-attention { - 50% { - background: @color4; - padding: 0 18px; - } - - 60% { - background: @color1; - } - - 80% { - background: @color4; - } - - 100% { - background: @color1; - } -} diff --git a/waybar/config.jsonc b/waybar/config.jsonc deleted file mode 100644 index 92f14fc..0000000 --- a/waybar/config.jsonc +++ /dev/null @@ -1,227 +0,0 @@ -{ - "position": "top", - "layer": "top", - "spacing": 0, - "margin": 0, - "reload_style_on_change": true, - "modules-left": [ - "custom/logo", - "hyprland/workspaces" - ], - "modules-center": [ - "clock", - "hyprland/window", - "custom/media" - ], - "modules-right": [ - "tray", - "pulseaudio", - "bluetooth", - "network", - "custom/notifications" - ], - - "hyprland/workspaces": { - "all-outputs": true, - "format": "{icon}", - "show-special": true, - "format-icons": { - "urgent": "", - "focused": "", - "active": "", - "default": "" - }, - "persistent-workspaces": { - "1": [], - "2": [] - }, - "on-scroll-down": "hyprctl dispatch workspace e-1", - "on-scroll-up": "hyprctl dispatch workspace e+1", - "escape": true - }, - - "bluetooth": { - "format": "", - "format-on": "󰂯", - "format-connected": "󰂱", - "tooltip-format": "󰇄 {controller_alias}\n{controller_address}", - "tooltip-format-connected": " Controller(s):\n {controller_alias}\t{controller_address}\n\n󰂱 Devices ( {num_connections} ) :\n {device_enumerate}", - "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}\n", - "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t󰁹 {device_battery_percentage}%\n", - "on-click": "blueberry" // Change to preferred bluetooth manager - }, - - "keyboard-state": { - "numlock": true, - "capslock": true, - "format": "{icon} {name}", - "format-icons": { - "locked": " ", - "unlocked": " " - } - }, - - "hyprland/window": { - "format": "{class} - {title}", - "show-empty": false, - "icon": true, - "separate-outputs": true, - "rewrite": { - " - ": "", - "zen-alpha(.*)": "Zen Browser", - "firefox(.*)": "Firefox", - "kitty - (.*)": "Kitty $1", - "Kitty ~": "Kitty", - "spotify(.*)": "Spotify", - "spotube": "Spotube", - "discord - Discord (.*)": "Discord $1", - "vesktop -(.*)Discord (.*)": "Vesktop $2", - "org.gnome.(.*) - (.*)": "$1 - $2", - "steam - (.*)": "Steam - $1", - "steam - Steam": "Steam", - "net.nokyan.Resources - Resources": "Resources" - }, - "escape": true - }, - - "custom/logo": { - "format": "", // Change to desired logo - "tooltip": false, - "escape": true, - "on-click": "anyrun" // Change to desired action - }, - - "custom/notifications": { - "tooltip": false, - "format": "{icon}", - "format-icons": { - "notification": "󱅫", - "none": "󰂜", - "dnd-notification": "󱏩", - "dnd-none": "󰪓", - "inhibited-notification": "󱏩", - "inhibited-none": "󰪓", - "dnd-inhibited-notification": "󱏩", - "dnd-inhibited-none": "󰪓" - }, - "return-type": "json", - "exec-if": "which swaync-client", - "exec": "swaync-client -swb", - "on-click": "swaync-client -t -sw", - "on-click-right": "swaync-client -d -sw", - "escape": true - }, - - "idle_inhibitor": { - "format": "{icon}", - "format-icons": { - "activated": "", - "deactivated": "" - } - }, - - "tray": { - "icon-size": 16, - "spacing": 12 - }, - - "clock": { - "format": "{:L%A %d, %H:%M}", - "format-alt": "{:%Y-%m-%d}", - "tooltip-format": "{calendar}" - }, - - "cpu": { - "format": " {usage}%", - "tooltip": true, - "escape": true - }, - "memory": { - "format": " {}%" - }, - "temperature": { - "critical-threshold": 80, - "format": "{icon} {temperatureC}°C", - "format-icons": ["", "", ""] - }, - "backlight": { - // "device": "acpi_video1", - "format": "{percent}% {icon}", - "format-icons": ["", "", "", "", "", "", "", "", ""] - }, - "battery": { - "states": { - "good": 95, - "warning": 30, - "critical": 15 - }, - "format": "{capacity}% {icon}", - "format-charging": "{capacity}% ", - "format-plugged": "{capacity}% ", - "format-alt": "{time} {icon}", - "format-good": "{capacity}% {icon}", - "format-full": "", - "format-icons": ["", "", "", "", ""] - }, - "power-profiles-daemon": { - "format": "{icon}", - "tooltip-format": "Power profile: {profile}\nDriver: {driver}", - "tooltip": true, - "format-icons": { - "default": "", - "performance": "", - "balanced": "", - "power-saver": "" - } - }, - "network": { - // "interface": "wlp2*", // (Optional) To force the use of this interface - "format-wifi": "{icon}", - "format-ethernet": "", - "tooltip-format": "{ifname}\t{ipaddr}\n {bandwidthUpBits}\n {bandwidthDownBits}", - "tooltip-format-disconnected": "Disconnected", - "tooltip-format-wifi": "󰤨 {essid}\n {bandwidthUpBits}\n {bandwidthDownBits}", - "format-linked": "{ifname} (No IP) ", - "format-disconnected": "󰤭", - "format-alt": "{ipaddr}/{cidr}", - "format-icons": [ "󰤯", "󰤟", "󰤢", "󰤥", "󰤨" ] - }, - "pulseaudio": { - "format": "{icon} {volume}%", - "format-bluetooth": "{icon}󰂯 {volume}%", - "format-muted": "", - "format-icons": { - "headphone": "", - "hands-free": "󰥰", - "headset": "󰋎", - "phone": "", - "phone-muted": "", - "portable": "", - "car": "", - "default": ["", ""] - }, - "scroll-step": 1, - "on-scroll-up": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+", - "on-scroll-down": "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-", - "on-click": "pavucontrol" - }, - "custom/media": { - "format": "{icon} {0}", - "return-type": "json", - "max-length": 50, - "escape": true, - "format-icons": { - "mpv": "", - "firefox": "", - "discord": "", - "spotify": "", - "spotube": "", - "Clapper": "󱜅", - "default": "󰎇" - }, - "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null", - "on-scroll-down": "playerctl previous", - "on-scroll-up": "playerctl next", - "on-click": "playerctl play-pause" - } -} diff --git a/waybar/mediaplayer.py b/waybar/mediaplayer.py deleted file mode 100755 index 303dd44..0000000 --- a/waybar/mediaplayer.py +++ /dev/null @@ -1,200 +0,0 @@ -#!/usr/bin/env python3 - -# Original code is from Alexays/Waybar repo in https://github.com/Alexays/Waybar -# Modified by retrozinndev to support Spotube and MPD. Dotfiles: https://github.com/retrozinndev/Hyprland-Dots - -import gi -gi.require_version("Playerctl", "2.0") -from gi.repository import Playerctl, GLib -from gi.repository.Playerctl import Player -import argparse -import logging -import sys -import signal -import gi -import json -import os -from typing import List - -logger = logging.getLogger(__name__) - -def signal_handler(sig, frame): - logger.info("Received signal to stop, exiting") - sys.stdout.write("\n") - sys.stdout.flush() - # loop.quit() - sys.exit(0) - - -class PlayerManager: - def __init__(self, selected_player=None, excluded_player=[]): - self.manager = Playerctl.PlayerManager() - self.loop = GLib.MainLoop() - self.manager.connect( - "name-appeared", lambda *args: self.on_player_appeared(*args)) - self.manager.connect( - "player-vanished", lambda *args: self.on_player_vanished(*args)) - - signal.signal(signal.SIGINT, signal_handler) - signal.signal(signal.SIGTERM, signal_handler) - signal.signal(signal.SIGPIPE, signal.SIG_DFL) - self.selected_player = selected_player - self.excluded_player = excluded_player.split(',') if excluded_player else [] - - self.init_players() - - def init_players(self): - for player in self.manager.props.player_names: - if player.name in self.excluded_player: - continue - if self.selected_player is not None and self.selected_player != player.name: - logger.debug(f"{player.name} is not the filtered player, skipping it") - continue - self.init_player(player) - - def run(self): - logger.info("Starting main loop") - self.loop.run() - - def init_player(self, player): - logger.info(f"Initialize new player: {player.name}") - player = Playerctl.Player.new_from_name(player) - player.connect("playback-status", - self.on_playback_status_changed, None) - player.connect("metadata", self.on_metadata_changed, None) - self.manager.manage_player(player) - self.on_metadata_changed(player, player.props.metadata) - - def get_players(self) -> List[Player]: - return self.manager.props.players - - def write_output(self, text, player): - logger.debug(f"Writing output: {text}") - - 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 clear_output(self): - sys.stdout.write("\n") - sys.stdout.flush() - - def on_playback_status_changed(self, player, status, _=None): - logger.debug(f"Playback status changed for player {player.props.player_name}: {status}") - self.on_metadata_changed(player, player.props.metadata) - - def get_first_playing_player(self): - players = self.get_players() - logger.debug(f"Getting first playing player from {len(players)} players") - if len(players) > 0: - # if any are playing, show the first one that is playing - # reverse order, so that the most recently added ones are preferred - for player in players[::-1]: - if player.props.status == "Playing": - return player - # if none are playing, show the first one - return players[0] - else: - logger.debug("No players found") - return None - - def show_most_important_player(self): - logger.debug("Showing most important player") - # show the currently playing player - # or else show the first paused player - # or else show nothing - current_player = self.get_first_playing_player() - if current_player is not None: - self.on_metadata_changed(current_player, current_player.props.metadata) - else: - self.clear_output() - - def on_metadata_changed(self, player, metadata, _=None): - logger.debug(f"Metadata changed for player {player.props.player_name}") - player_name = player.props.player_name - artist = player.get_artist() - title = player.get_title() - - track_info = "" - if ((player_name == "spotify" or player_name == "spotube" or player_name == "mpv") and "mpris:trackid" in metadata.keys() and ":ad:" in player.props.metadata["mpris:trackid"]): - track_info = "Advertisement" - elif artist != None and title != None: - track_info = f"{artist} - {title}" - if(artist == "" or artist == " "): - track_info = f"{title}" - else: - track_info = title - - if track_info: - if player.props.status == "Playing": - track_info = " " + track_info - else: - track_info = " " + track_info - # only print output if no other player is playing - current_playing = self.get_first_playing_player() - if current_playing is None or current_playing.props.player_name == player.props.player_name: - self.write_output(track_info, player) - else: - logger.debug(f"Other player {current_playing.props.player_name} is playing, skipping") - - def on_player_appeared(self, _, player): - logger.info(f"Player has appeared: {player.name}") - if player.name in self.excluded_player: - logger.debug( - "New player appeared, but it's in exclude player list, skipping") - return - if player is not None and (self.selected_player is None or player.name == self.selected_player): - self.init_player(player) - else: - logger.debug( - "New player appeared, but it's not the selected player, skipping") - - def on_player_vanished(self, _, player): - logger.info(f"Player {player.props.player_name} has vanished") - self.show_most_important_player() - -def parse_arguments(): - parser = argparse.ArgumentParser() - - # Increase verbosity with every occurrence of -v - parser.add_argument("-v", "--verbose", action="count", default=0) - - parser.add_argument("-x", "--exclude", "- Comma-separated list of excluded player") - - # Define for which player we"re listening - parser.add_argument("--player") - - parser.add_argument("--enable-logging", action="store_true") - - return parser.parse_args() - - -def main(): - arguments = parse_arguments() - - # Initialize logging - if arguments.enable_logging: - logfile = os.path.join(os.path.dirname( - os.path.realpath(__file__)), "media-player.log") - logging.basicConfig(filename=logfile, level=logging.DEBUG, - format="%(asctime)s %(name)s %(levelname)s:%(lineno)d %(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)) - - logger.info("Creating player manager") - if arguments.player: - logger.info(f"Filtering for player: {arguments.player}") - if arguments.exclude: - logger.info(f"Exclude player {arguments.exclude}") - - player = PlayerManager(arguments.player, arguments.exclude) - player.run() - - -if __name__ == "__main__": - main() diff --git a/waybar/modules.css b/waybar/modules.css deleted file mode 100644 index 8184a99..0000000 --- a/waybar/modules.css +++ /dev/null @@ -1,145 +0,0 @@ - -@import "./animations.css"; - -/* Distro Logo */ -#custom-logo { - padding: 0 12px; - font-size: 15.2px; - transition: 110ms ease-in; - margin-right: 6px; -} - -/* Workspace Indicator */ -#workspaces { - padding-left: 8px; - padding-right: 8px; -} - -#workspaces > button { - all: unset; - transition: 80ms linear; - background: @color1; - border-radius: 14px; - padding: 4px 12px; - margin: 0 2px; -} - -#workspaces > button.active { - background: @foreground; - padding-right: 30px; -} - -#workspaces > button.urgent { - animation: workspace-pick-attention; - animation-duration: 2s; -} - -#workspace > button.special { - background: @color3; -} - -#workspaces > button:first-child { - margin-left: 0px; -} - -#workspaces > button:last-child { - margin-right: 0px; -} - -/* Notifications */ -#custom-notifications { - font-size: 16px; - padding-left: 12px; - padding-right: 13px; -} - -#custom-notifications.cc-open { - background: @color1; -} - - -/* Current Window Widget */ -window.empty #window { - padding: 0; - margin: 0; - border: none; -} - - -/* Battery */ -#battery.charging, -#battery.plugged { - color: @foreground; - background-color: @color2; -} - -#battery:not(.plugged):not(.charging) { - background-color: shade(@color1, .68); -} - -#battery.critical:not(.charging) { - background-color: @color1; - color: @foreground; - animation-name: blink; - animation-duration: .5s; - animation-timing-function: steps(12); - animation-iteration-count: infinite; - animation-direction: alternate; -} - -#network { - padding-right: 11px -} - -/* Network and Wi-Fi */ -#network.disconnected { - font-size: 14px; - padding-left: 11px; - padding-right: 12px; -} - - -/* Bluetooth */ -#bluetooth { - font-size: 14px; - padding: 0 10px; -} - -/* Pulse Audio */ -#pulseaudio { - padding-left: 8px; - padding-right: 16px; -} - -#pulseaudio.bluetooth { - padding: 0 8px; -} - - -/* Media Player Info */ -#custom-media { - box-shadow: none; - border: 2px solid @color3; - font-weight: 500; - transition: 200ms ease-in; -} - -#custom-media:hover { - background: @color3; -} - - -/* Sensors */ -#temperature.critical { - background-color: @color1; -} - - -/* App Tray */ -#tray > .passive { - -gtk-icon-effect: dim; -} - -#tray > .needs-attention { - -gtk-icon-effect: highlight; -} diff --git a/waybar/modules/swaync-recording.sh b/waybar/modules/swaync-recording.sh deleted file mode 100644 index e69de29..0000000 diff --git a/waybar/style.css b/waybar/style.css deleted file mode 100644 index ef9d611..0000000 --- a/waybar/style.css +++ /dev/null @@ -1,98 +0,0 @@ - -@import "../../.cache/wal/colors-waybar.css"; -@import "./modules.css"; - -* { - color: @foreground; - transition: 120ms ease-in; - font-family: "Noto Sans", "Font Awesome", sans-serif; - font-size: 12px; -} - -window#waybar { - background: transparent; -} - -window#waybar > box { - margin: 6px 6px 0px 6px; -} - -/* Styling modules-[left/center/right] */ -window#waybar > box > * { - padding: 5px; - background: alpha(@background, .78); - margin-bottom: 4px; - border-radius: 18px; -} - -/* Style all widgets */ -widget .module { - padding: 4px 10px; - font-weight: 500; - margin: 0 2px; - border-radius: 14px; -} - -widget .module label { - font-size: .98em; - font-weight: 500; -} - -widget .module:hover:not(#workspaces):not(#tray):not(#custom-media) { - background: @color1; -} - -window#waybar > box > * > widget:first-child .module { - margin-left: 0px; -} - -window#waybar > box > * > widget:last-child .module { - margin-right: 0px; -} - - -menu { - background: @background; - padding: 2px; -} - -menu > separator { - padding: 0px; - margin: 2px 0; -} - -menu > * { - border-radius: 2px; - margin: 0; -} - -menu > *:first-child { - border-top-left-radius: 6px; - border-top-right-radius: 6px; -} - -menu > *:last-child { - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; -} - -menu > *:hover { - background: @color1; -} - -tooltip { - all: unset; - padding: 10px; -} - -tooltip > box { - border-radius: 12px; - border: 1px solid @color1; - background: @background; - box-shadow: 0 0 6px 1px alpha(@background, .5); -} - -tooltip > box > label { - font-weight: 600; - font-size: 1em; -}