From 9a3c1f1f7ab8ca3f98f76dfcb95882e29b092607 Mon Sep 17 00:00:00 2001 From: pika Date: Tue, 21 May 2024 09:42:16 +0200 Subject: [PATCH] initial repo commit --- config | 213 ++++++++++++++++++++++++++++++++++ config.save | 152 ++++++++++++++++++++++++ config.save.1 | 170 +++++++++++++++++++++++++++ config.save.2 | 207 +++++++++++++++++++++++++++++++++ custom-scripts/mediaplayer.py | 179 ++++++++++++++++++++++++++++ custom-scripts/update | 11 ++ custom-scripts/updates | 63 ++++++++++ mocha.css | 37 ++++++ style.css | 204 ++++++++++++++++++++++++++++++++ 9 files changed, 1236 insertions(+) create mode 100644 config create mode 100644 config.save create mode 100644 config.save.1 create mode 100644 config.save.2 create mode 100644 custom-scripts/mediaplayer.py create mode 100755 custom-scripts/update create mode 100755 custom-scripts/updates create mode 100644 mocha.css create mode 100644 style.css diff --git a/config b/config new file mode 100644 index 0000000..189579d --- /dev/null +++ b/config @@ -0,0 +1,213 @@ +{ + "layer": "top", + "position": "top", + "spacing": 4, + "margin-top": 3, + "margin-bottom": 3, + "margin-left": 3, + "margin-right": 5, + + "modules-left": [ + "custom/icon", + "hyprland/workspaces", + "hyprland/window", + "custom/spotify", + ], + + "modules-center": [ + "clock" + ], + + "modules-right": [ + "tray", + "backlight", + "cpu", + "pulseaudio", + "network", + "memory", + "battery", + "idle_inhibitor", + "custom/notification", + "custom/power", + ], + + "custom/icon": { + "format": "󰣇", + "on-click-right": "rofi -config $HOME/.config/rofi/ssh-config.rasi -show ssh", + "on-click": "pkill rofi || rofi -show drun -modi drun,filebrowser,run,window,ssh", + "on-click-middle": "nwg-look", + "tooltip": false + }, + + "cpu": { + "interval": 10, + "format": " {usage}%", + "max-length": 10, + "tooltip": false, + "on-click-right": "kitty --class floating -e btop" + }, + + "clock": { + "format": "󰥔 {:%H:%M 󰃭 %d/%m} ", + //"format": "{:%a}", + "tooltip-format": "{calendar}", + "calendar": { + "mode" : "month", + "format": { + "months": "{}", + "days": "{}", + "weeks": "W{}", + "weekdays": "{}", + "today": "{}" + } + }, + }, + + "memory": { + "interval": 30, + "format": " {used}GiB", + "format-alt": " {used:0.1f}G", + "on-click-right": "kitty --class floating -e btop", + "max-length": 10 + }, + + "temperature": { + "format": " {temperatureF}°F" + }, + + "hyprland/window": { + "format": " {}", + "on-click-right": "$HOME/.config/hypr/scripts/screenshot_area", + "rewrite": { + "(.*) - NVIM": " NeoVim", + "(.*) — Mozilla Firefox": "󰈹 Firefox", + " ": "󰇄 Desktop", + "(.*) Spotify Free": "󰓇 Spotify", + "(.*) Spotify": "󰓇 Spotify", + " ~": " pika@home", + "(.*) - Obsidian(.*)": "󱓧 Obsidian", + } + }, + + "hyprland/workspaces" : { + "on-click": "activate", + "active-only": false, + "all-outputs": true, + "format": "{icon}", + "format-icons": { + "urgent": "", + "active": "", + "default": "" + }, + "persistent-workspaces": { + "*": 4 + } + }, + + "backlight": { + "format": "{icon} {percent}%", + "format-icons": ["󰃞", "󰃟", "󰃠"], + "tooltip": false, + }, + + "pulseaudio": { + "format": "{icon} {volume}%", + "format-bluetooth": "{icon}  {volume}%", + "format-bluetooth-muted": "󰝟 ", + "format-muted": " 󰝟 ", + "format-icons": { + "headset": "", + "default": ["󰕿", "󰖀", "󰕾"], + }, + "tooltip": false, + "on-click": "pavucontrol", + }, + + "network": { + "interval": 30, + "on-click": "wl-copy $(ip address show up scope global | grep inet | head -n1 | cut -d/ -f 1 | tr -d [:space:] | cut -c5-)", + "on-click-right": "kitty --class floating $HOME/.config/hypr/scripts/wlan.sh", + "format-wifi": "󰤨 {essid}", + "format-ethernet": "󰈀 Wired", + "fomat-disconnected": "󱚵 Disconnected", + "tooltip-format-wifi": "{essid} ({signalStrength}%)", + "tooltip-format-ethernet": "{ifname} ", + "tooltip-format-disconnected": "Disconnected", + }, + "battery": { + "states": { + "warning": 45, + "critical": 20 + }, + "format": "{icon} {capacity}%", + "format-icons": ["󰂎", "󰁻", "󰁽", "󰁿", "󰂁", "󰁹"], + "max-length": 25, + "tooltip": false, + "on-click-right": "kitty --class floating $HOME/.config/hypr/scripts/wlan.sh", + }, + + + "tray": { + "icon-size": 18, + "spacing": 10, + }, + + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "󰈈 ", + "deactivated": "󰈉 " + }, + }, + + "custom/separator-space": { + "format": " ", + "tooltip": false, + }, + + "custom/separator-gap": { + "format": " ", + "tooltip": false, + }, + + "custom/separator-arrow": { + "format": "  ", + "tooltip": false, + }, + + "custom/power": { + "format": "󰐥", + "on-click": "wlogout", + "tooltip": false, + }, + "custom/notification": { + "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 + }, + + "custom/updates": { + "format": " {}", + "tooltip-format": "{}", + "escape": true, + "return-type": "json", + "restart-interval": 60, + "tooltip": false + }, + +} diff --git a/config.save b/config.save new file mode 100644 index 0000000..0c31c56 --- /dev/null +++ b/config.save @@ -0,0 +1,152 @@ +{ + "layer": "top", + "position": "top", + "spacing": 4, + "margin-top": 5, + "margin-bottom": 0, + "margin-left": 5, + "margin-right": 5, + + "modules-left": [ + "custom/icon", + "custom/separator-gap", + "cpu", + "memory", + "temperature", + "custom/separator-arrow", + "hyprland/window", + ], + + "modules-center": [ + "hyprland/workspaces", + ], + + "modules-right": [ + "backlight", + "pulseaudio", + "network", + "battery", + "tray", + "custom/separator-dot", + "clock", + "custom/power", + ], + + "custom/icon": { + "format": "󰣇" + }, + + "cpu": { + "interval": 10, + "format": " {usage}%", + "max-length": 10, + "tooltip": false + }, + + "memory": { + "interval": 30, + "format": " {used}GiB", + "format-alt": " {used:0.1f}G", + "max-length": 10 + }, + + "temperature": { + "format": " {temperatureF}°F" + }, + + "hyprland/window": { + "format": " {}", + "rewrite": { + "(.*) - NVIM": " NeoVim", + "(.*) — Mozilla Firefox": "󰈹 Mozilla Firefox", + } + }, + + "hyprland/workspaces": { + "all-outputs": true, + "format": "{icon}", + "format-icons": { + "1": "", + "2": "", + "3": "", + "urgent": "", + "active": "", + "default": "" + } + }, + + "backlight": { + "format": "{icon} {percent}", + "format-icons": ["󰃟", "󰃠"], + "tooltip": false, + }, + + "pulseaudio": { + "format": "{icon} {volume}", + "format-bluetooth": "{icon}  {volume}%", + "format-bluetooth-muted": "󰝟 ", + "format-muted": " 󰝟 ", + "format-icons": { + "headph": "", + "default": ["󰝟 ", ""], + }, + "tooltip": false, + "on-click": "pavucontrol", + }, + + "network": { + "interval": 30, + "format-wifi": "󰖩 {essid}", + "format-ethernet": "󰈀 Wired", + "fomat-disconnected": "󱚵 Disconnected", + "tooltip-format-wifi": "{essid} ({signalStrength}%)", + "tooltip-format-ethernet": "{ifname} ", + "tooltip-format-disconnected": "Disconnected", + }, + + "battery": { + "states": { + "warning": 30, + "critical": 15 + }, + "format": "{icon} {capacity}%", + "format-icons": [" ", " ", " ", " ", " "], + "max-length": 25, + "tooltip": false, + }, + + "tray": { + "icon-size": 20, + "spacing": 10, + }, + + "custom/separator-dot": { + "format": "  ", + "tooltip": false, + "on-click": "$HOME/.config/hypr/scripts/random-wallpaper" + }, + + "custom/separator-gap": { + "format": " ", + "tooltip": false, + }, + + "custom/separator-arrow": { + "format": "  ", + "tooltip": false, + }, + + "custom/spotify": { + "exec": "/usr/bin/python3 $HOME/.config/waybar/custom-scripts/mediaplayer.py --player spotify --verbose", + "format": "{} ", + "return-type": "json", + "on-click": "playerctl play-pause", + "on-scroll-up": "playerctl next", + "on-scroll-down": "playerctl previous" + }, + "custom/power": { + "format": "", + "on-click": "~/.config/rofi/bin/powermenu", + "tooltip": false, + }, +} diff --git a/config.save.1 b/config.save.1 new file mode 100644 index 0000000..6d31d6e --- /dev/null +++ b/config.save.1 @@ -0,0 +1,170 @@ +{ + "layer": "top", + "position": "top", + "spacing": 4, + "margin-top": 5, + "margin-bottom": 0, + "margin-left": 5, + "margin-right": 5, + + "modules-left": [ + "custom/icon", + "clock", + "custom/spotify", + ], + + "modules-center": [ + "hyprland/window", + "custom/separator-arrow", + "hyprland/workspaces", + ], + + "modules-right": [ + "backlight", + "pulseaudio", + "network", + "battery", + "tray", + "custom/power", + ], + + "custom/icon": { + "format": "󰣇", + "on-click": "~/.config/rofi/bin/launcher", + "tooltip": false + }, + + "cpu": { + "interval": 10, + "format": " {usage}%", + "max-length": 10, + "tooltip": false + }, + + clock": { + "format": "{: %d-%m-24  %H:%M}", + //"format": "{:%a}", + "tooltip-format": "{calendar}", + "calendar": { + "mode" : "month", + "format": { + "months": "{}", + "days": "{}", + "weeks": "W{}", + "weekdays": "{}", + "today": "{}" + } + }, + }, + + "memory": { + "interval": 30, + "format": " {used}GiB", + "format-alt": " {used:0.1f}G", + "max-length": 10 + }, + + "temperature": { + "format": " {temperatureF}°F" + }, + + "hyprland/window": { + "format": " {}", + "rewrite": { + "(.*) - NVIM": " NeoVim", + "(.*) — Mozilla Firefox": "󰈹 Mozilla Firefox", + " ": "󰇄 Desktop", + "(.*) Spotify Free": "󰓇 Spotify", + "(.*) Spotify": "󰓇 Spotify", + " ~": " l6174@Radon", + "(.*) - Obsidian(.*)": "󱓧 Obsidian", + } + }, + + "hyprland/workspaces": { + "all-outputs": true, + "format": "{icon}", + "format-icons": { + "1": "", + "2": "", + "3": "", + "urgent": "", + "active": "", + "default": "" + } + }, + + "backlight": { + "format": "{icon} {percent}", + "format-icons": ["󰃟", "󰃠"], + "tooltip": false, + }, + + "pulseaudio": { + "format": "{icon} {volume}", + "format-bluetooth": "{icon}  {volume}%", + "format-bluetooth-muted": "󰝟 ", + "format-muted": " 󰝟 ", + "format-icons": { + "headset": "", + "default": ["", ""], + }, + "tooltip": false, + "on-click": "pavucontrol", + }, + + "network": { + "interval": 30, + "format-wifi": "󰖩 {essid}", + "format-ethernet": "󰈀 Wired", + "fomat-disconnected": "󱚵 Disconnected", + "tooltip-format-wifi": "{essid} ({signalStrength}%)", + "tooltip-format-ethernet": "{ifname} ", + "tooltip-format-disconnected": "Disconnected", + }, + "battery": { + "states": { + "warning": 30, + "critical": 15 + }, + "format": "{icon} {capacity}%", + "format-icons": [" ", " ", " ", " ", " "], + "max-length": 25, + "tooltip": false, + }, + + "tray": { + "icon-size": 20, + "spacing": 10, + }, + + "custom/separator-dot": { + "format": "  ", + "tooltip": false, + "on-click": "$HOME/.config/hypr/scripts/random-wallpaper" + }, + + "custom/separator-gap": { + "format": " ", + "tooltip": false, + }, + + "custom/separator-arrow": { + "format": "  ", + "tooltip": false, + }, + + "custom/spotify": { + "exec": "/usr/bin/python3 $HOME/.config/waybar/custom-scripts/mediaplayer.py --player spotify --verbose", + "format": " {}  ", + "return-type": "json", + "on-click": "playerctl play-pause", + "on-scroll-up": "playerctl next", + "on-scroll-down": "playerctl previous" + }, + "custom/power": { + "format": "󰐥", + "on-click": "~/.config/rofi/bin/powermenu", + "tooltip": false, + }, +} diff --git a/config.save.2 b/config.save.2 new file mode 100644 index 0000000..effd104 --- /dev/null +++ b/config.save.2 @@ -0,0 +1,207 @@ +{ + "layer": "top", + "position": "top", + "spacing": 4, + "margin-top": 5, + "margin-bottom": 0, + "margin-left": 5, + "margin-right": 5, + + "modules-left": [ + "custom/icon", + "custom/separator-space", + "hyprland/workspaces", + "custom/spotify",2 + "custom/separator-arrow", + "hyprland/window", + ], + + "modules-center": [ + "clock" + ], + + "modules-right": [ + "backlight", + "pulseaudio", + "network", + "battery", + "tray", + "custom/inhibitor", + "custom/notification", + "custom/power", + ], + + "custom/icon": { + "format": "󰣇", + "on-click": "~/.config/rofi/bin/launcher", + "tooltip": false + }, + + "cpu": { + "interval": 10, + "format": " {usage}%", + "max-length": 10, + "tooltip": false + }, + + "clock": { + "format": "󰥔 {:%H:%M 󰃭 %d/%m} ", + //"format": "{:%a}", + "tooltip-format": "{calendar}", + "calendar": { + "mode" : "month", + "format": { + "months": "{}", + "days": "{}", + "weeks": "W{}", + "weekdays": "{}", + "today": "{}" + } + }, + }, + + "memory": { + "interval": 30, + "format": " {used}GiB", + "format-alt": " {used:0.1f}G", + "max-length": 10 + }, + + "temperature": { + "format": " {temperatureF}°F" + }, + + "hyprland/window": { + "format": " {}", + "rewrite": { + "(.*) - NVIM": " NeoVim", + "(.*) — Mozilla Firefox": "󰈹 Firefox", + " ": "󰇄 Desktop", + "(.*) Spotify Free": "󰓇 Spotify", + "(.*) Spotify": "󰓇 Spotify", + " ~": " l6174@Radon", + "(.*) - Obsidian(.*)": "󱓧 Obsidian", + } + }, + + "hyprland/workspaces": { + "all-outputs": false, + "format": "{icon}", + "format-icons": { + "urgent": " ", + "persistent": " ", + "active": " ", + "empty": " " + }, + "persistent-workspaces": { + "1": [], + "2": [], + "3": [], + "4": [] + } + }, + + "backlight": { + "format": "{icon} {percent}", + "format-icons": ["󰃞", "󰃟", "󰃠"], + "tooltip": false, + }, + + "pulseaudio": { + "format": "{icon} {volume}", + "format-bluetooth": "{icon}  {volume}%", + "format-bluetooth-muted": "󰝟 ", + "format-muted": " 󰝟 ", + "format-icons": { + "headset": "", + "default": ["󰕿", "󰖀", "󰕾"], + }, + "tooltip": false, + "on-click": "pavucontrol", + }, + + "network": { + "interval": 30, + "format-wifi": "󰤨 {essid}", + "format-ethernet": "󰈀 Wired", + "fomat-disconnected": "󱚵 Disconnected", + "tooltip-format-wifi": "{essid} ({signalStrength}%)", + "tooltip-format-ethernet": "{ifname} ", + "tooltip-format-disconnected": "Disconnected", + }, + "battery": { + "states": { + "warning": 30, + "critical": 15 + }, + "format": "{icon} {capacity}%", + "format-icons": ["󰂎", "󰁻", "󰁽", "󰁿", "󰂁", "󰁹"], + "max-length": 25, + "tooltip": false, + }, + + "tray": { + "icon-size": 20, + "spacing": 10, + }, + + "custom/inhibitor": { + "exec": "~/.local/bin/waybar-inhibitor", + "interval": 5, + "return-type": "json", + "tooltip": true, + "on-click": "~/.local/bin/inhibitor", + "signal": 10 + }, + + + "custom/separator-dot": { + "format": "  ", + "tooltip": false, + "on-click": "$HOME/.config/hypr/scripts/random-wallpaper" + }, + + "custom/separator-gap": { + "format": " ", + "tooltip": false, + }, + + "custom/separator-arrow": { + "format": "  ", + "tooltip": false, + }, + + "custom/spotify": { + "exec": "/usr/bin/python3 $HOME/.config/waybar/custom-scripts/mediaplayer.py --player spotify --verbose", + "format": " {}  ", + "return-type": "json", + "on-click": "playerctl play-pause", + "on-scroll-up": "playerctl next", + "on-scroll-down": "playerctl previous" + }, + "custom/power": { + "format": "󰐥", + "on-click": "~/.config/rofi/bin/powermenu", + "tooltip": false, + }, + "custom/notification": { + "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 + }, +} diff --git a/custom-scripts/mediaplayer.py b/custom-scripts/mediaplayer.py new file mode 100644 index 0000000..3da53e9 --- /dev/null +++ b/custom-scripts/mediaplayer.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python3 +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): + 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.init_players() + + def init_players(self): + for player in self.manager.props.player_names: + 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 + title = player.get_title() + + track_info = "" + if player_name == "spotify" and "mpris:trackid" in metadata.keys() and ":ad:" in player.props.metadata["mpris:trackid"]: + track_info = "Advertisement" + 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 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) + + # 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}") + player = PlayerManager(arguments.player) + player.run() + + +if __name__ == "__main__": + main() diff --git a/custom-scripts/update b/custom-scripts/update new file mode 100755 index 0000000..61a35dc --- /dev/null +++ b/custom-scripts/update @@ -0,0 +1,11 @@ +#!/bin/bash +sleep 1 +figlet "Update" +sleep 0.5 +echo "." +sleep 0.5 +echo "." +sleep 0.5 +echo "." +sleep 0.5 +arch-update diff --git a/custom-scripts/updates b/custom-scripts/updates new file mode 100755 index 0000000..b6b0be5 --- /dev/null +++ b/custom-scripts/updates @@ -0,0 +1,63 @@ +#!/bin/bash +# _ _ _ _ +# | | | |_ __ __| | __ _| |_ ___ ___ +# | | | | '_ \ / _` |/ _` | __/ _ \/ __| +# | |_| | |_) | (_| | (_| | || __/\__ \ +# \___/| .__/ \__,_|\__,_|\__\___||___/ +# |_| +# +# by Stephan Raabe (2023) +# ----------------------------------------------------- + +# ----------------------------------------------------- +# Define threshholds for color indicators +# ----------------------------------------------------- + +threshhold_green=0 +threshhold_yellow=25 +threshhold_red=100 + +# ----------------------------------------------------- +# Calculate available updates pacman and aur (with aur) +# ----------------------------------------------------- + +if ! updates_arch=$(checkupdates 2> /dev/null | wc -l ); then + updates_arch=0 +fi + +if ! updates_aur=$(paru -Qua | wc -l); then + updates_aur=0 +fi + +updates=$(("$updates_arch" + "$updates_aur")) + +# ----------------------------------------------------- +# Testing +# ----------------------------------------------------- + +# Overwrite updates with numbers for testing +# updates=50 + +# test JSON output +# printf '{"text": "0", "alt": "0", "tooltip": "0 Updates", "class": "red"}' +# exit + +# ----------------------------------------------------- +# Output in JSON format for Waybar Module custom-updates +# ----------------------------------------------------- + +css_class="green" + +if [ "$updates" -gt $threshhold_yellow ]; then + css_class="yellow" +fi + +if [ "$updates" -gt $threshhold_red ]; then + css_class="red" +fi + +if [ "$updates" -gt $threshhold_green ]; then + printf '{"text": "%s", "alt": "%s", "tooltip": "%s Updates", "class": "%s"}' "$updates" "$updates" "$updates" "$css_class" +else + printf '{"text": "0", "alt": "0", "tooltip": "0 Updates", "class": "green"}' +fi diff --git a/mocha.css b/mocha.css new file mode 100644 index 0000000..98e218a --- /dev/null +++ b/mocha.css @@ -0,0 +1,37 @@ +/* +* +* Catppuccin Mocha palette +* Maintainer: rubyowo +* +*/ + +@define-color base #1e1e2e; +@define-color mantle #181825; +@define-color crust #11111b; + +@define-color text #cdd6f4; +@define-color subtext0 #a6adc8; +@define-color subtext1 #bac2de; + +@define-color surface0 #313244; +@define-color surface1 #45475a; +@define-color surface2 #585b70; + +@define-color overlay0 #6c7086; +@define-color overlay1 #7f849c; +@define-color overlay2 #9399b2; + +@define-color blue #89b4fa; +@define-color lavender #b4befe; +@define-color sapphire #74c7ec; +@define-color sky #89dceb; +@define-color teal #94e2d5; +@define-color green #a6e3a1; +@define-color yellow #f9e2af; +@define-color peach #fab387; +@define-color maroon #eba0ac; +@define-color red #f38ba8; +@define-color mauve #cba6f7; +@define-color pink #f5c2e7; +@define-color flamingo #f2cdcd; +@define-color rosewater #f5e0dc; diff --git a/style.css b/style.css new file mode 100644 index 0000000..588faac --- /dev/null +++ b/style.css @@ -0,0 +1,204 @@ +@import "mocha.css"; +@import "pywal.css"; + +* { + padding: 0px; + margin: 0px; + font-family: "Rubik", "JetBrains Mono Nerd Font"; + font-size: 12px; + font-weight: bold; +} + +/* ------ Set a Uniform Border Radius ------ */ +.modules-left, .modules-center, .modules-right, #cpu, #memory, #temperature, #pulseaudio, #backlight, #custom-spotify, #custom-icon, #custom-updates, #network, #battery, #tray, #idle_inhibitor, #custom-power, #custom-notification { + border-radius: 6px; +} + +/* ------ Modules Left ------ */ +.modules-left { + background-color: @base; + padding-right: 5px; + padding-left: 5px; +} + +/* ------ Modules Center ------ */ +.modules-center { + background-color: @base; + padding-right: 5px; + padding-left: 5px; +} + +/* ------ Modules Right ------ */ +.modules-right { + background-color: @base; + padding-right: 5px; + padding-left: 5px; +} + +/* ------ Cpu Usage, Temperature, and Memory ------ */ +#cpu, #temperature, #memory { + background-color: @surface0; + padding: 4px 4px; + margin: 4px 4px; + font-size: 12px; +} + +#cpu { color: @peach; } +#memory { color: @mauve; } +#temperature { color: @maroon; } + +/* ------ Window Title ------ */ +#window { + color: @color7; + padding-right: 4px; +} + +window#waybar { + background-color: rgba(0, 0, 0, 0); + /* border-bottom: 0px solid #ffffff; */ + /* color: #FFFFFF; */ + background: transparent; + transition-property: background-color; + transition-duration: .5s; +} + +/* ----------------------------------------------------- + * Workspaces + * ----------------------------------------------------- */ + +#workspaces button.empty { + color: @color2; + font-family: JetBrainsMono Nerd Font; +} + +#workspaces { + margin: 0px 1px 0px 1px; + padding: 0px 1px; + font-family: JetBrainsMono Nerd Font; +} + +#workspaces button { + padding: 0px 2px; + margin: 4px 2px; + color: @color7; + font-family: JetBrainsMono Nerd Font; +} + +#workspaces button:hover { + opacity:0.5; + color: @color3; +} + +/* ------ Pulseaudio ------ */ +#pulseaudio { + color: @peach; + background-color: @surface0; + padding: 2px 5px; + margin: 4px 2px; +} + +/* ------ Backlight ------ */ +#backlight { + color: @sky; + background-color: @surface0; + padding: 2px 5px; + margin: 4px 2px; +} + +/* ------ Network ------ */ +#network { + color: @mauve; + background-color: @surface0; + padding: 2px 5px; + margin: 4px 2px; +} + +/* ------ Battery ------ */ +#battery { + color: @maroon; + background-color: @surface0; + padding: 2px 5px; + margin: 4px 2px; +} + +/* ------ Clock ------ */ +#clock { + padding-left: 10px; + color: @color7; + font-weight: bold; + font-size: 13px; +} + +/* ------ System Tray ------ */ +#tray { + background-color: @surface0; + padding: 2px 5px; + margin: 4px 2px; +} + +/* ------ Custom Modules ------ */ +#custom-icon { + font-size: 18px; + color: @blue; + padding-right: 5px; +} + +#custom-separator-arrow { + font-size: 14px; + color: @text; +} + +#custom-separator-dot { + font-size: 15px; + color: @text; +} + +#custom-spotify { + color: @mauve; + background-color: @surface0; + padding: 2px 9px; + margin: 4px 2px; +} +#custom-power { + color: @red; + background-color: @surface0; + padding: 2px 9px; + margin: 4px 2px; + font-size: 15px; +} + +#idle_inhibitor { + color: @green; + background-color: @surface0; + padding: 2px 9px; + margin: 4px 2px; + font-size: 15px; +} + +#custom-updates { + padding: 2px 8px; + margin: 4px 4px; + background-color: @surface0; +} +#custom-updates.green { + color: @text; +} +#custom-updates.yellow { + color: @peach; +} +#custom-updates.red { + color: @red; +} + +#custom-notification { + color: @teal; + background-color: @surface0; + padding: 2px 9px; + margin: 4px 2px; + font-size: 15px; +} + +tooltip { + background: @base; + border: 1px solid @blue; +}