summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorryukamish <[email protected]>2026-03-17 20:36:12 +0530
committerryukamish <[email protected]>2026-03-17 20:36:12 +0530
commit6c197cfb233f595d8fe464b232f1d725261a5b4f (patch)
treee4200fa0c221f02f74f0d1c8f7913b2ae654b577
parent5742fc100ef25cda9b6a0bc3f3bee7e8f1df5e34 (diff)
add: waybar for niri with colorscheme
-rw-r--r--waybar/colors.css1
-rw-r--r--waybar/config.jsonc223
-rwxr-xr-xwaybar/scripts/mediaplayer.py143
-rwxr-xr-xwaybar/scripts/uptime.sh6
-rw-r--r--waybar/style.css127
-rw-r--r--waybar/themes/blacklotus.css8
-rw-r--r--waybar/themes/catppuccin-mocha.css12
-rw-r--r--waybar/themes/dracula.css8
-rw-r--r--waybar/themes/gruvbox-dark.css12
-rw-r--r--waybar/themes/kanagawa.css7
-rw-r--r--waybar/themes/rose-pine.css13
-rw-r--r--waybar/themes/tokyonight.css6
12 files changed, 566 insertions, 0 deletions
diff --git a/waybar/colors.css b/waybar/colors.css
new file mode 100644
index 0000000..9e5f3fb
--- /dev/null
+++ b/waybar/colors.css
@@ -0,0 +1 @@
+@import 'themes/tokyonight.css';
diff --git a/waybar/config.jsonc b/waybar/config.jsonc
new file mode 100644
index 0000000..9bd4776
--- /dev/null
+++ b/waybar/config.jsonc
@@ -0,0 +1,223 @@
+// _*_ mode: jsonc _*_
+{
+ "reload_style_on_change": true,
+ "layer": "top",
+ "position": "bottom",
+ "modules-left": [
+ "niri/workspaces",
+ "custom/uptime",
+ "backlight",
+ "group/network",
+ ],
+ "modules-center": [],
+ "modules-right": [
+ "group/expand-tray",
+ "group/hardware",
+ "group/audio",
+ "group/powerofmachine",
+ "clock"
+ ],
+ "niri/workspaces": {
+ "on-click": "activate",
+ "format": "{icon}",
+ "format-icons": {
+ "1": "1",
+ "2": "2",
+ "3": "3",
+ "4": "4",
+ "5": "5",
+ "6": "6",
+ "7": "7",
+ "8": "8",
+ "9": "9",
+ "10": "10"
+ }
+ },
+ // module groups
+ "group/hardware": {
+ "orientation": "horizontal",
+ "modules": [
+ "cpu",
+ "memory",
+ "temperature"
+ ]
+ },
+ "group/audio": {
+ "orientation": "horizontal",
+ "modules": [
+ "bluetooth",
+ "pulseaudio"
+ ]
+ },
+ "group/network": {
+ "orientation": "horizontal",
+ "modules": [
+ "network",
+ "custom/vpn"
+ ]
+ },
+ "group/powerofmachine": {
+ "orientation": "horizontal",
+ "modules": [
+ "battery"
+ ]
+ },
+ "group/expand-tray": {
+ "orientation": "inherit",
+ "drawer": {
+ "transition-duration": 600,
+ "children-class": "tray-group-item"
+ },
+ "modules": [
+ "custom/expand-icon",
+ "tray"
+ ]
+ },
+ // Individual modules
+ "clock": {
+ "interval": 60,
+ "tooltip": true,
+ "format": " {:%R  %d/%m}",
+ "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>",
+ "format-alt": " {:%a, %d, %b %Y}"
+ },
+ "memory": {
+ "interval": 12,
+ "format": " {}%"
+ },
+ "cpu": {
+ "interval": 5,
+ "format": " {usage}%",
+ "on-click": "alacritty --class TUI.float -e btop"
+ },
+ "temperature": {
+ // The thermal zone for CPU changes from time to time on MSI Laptops
+ "thermal-zone": 5,
+ "critical-threshold": 80,
+ "format": " {temperatureC}°C"
+ },
+ "network": {
+ "interface": "wlan0",
+ "family": "ipv4",
+ "format": "{ifname}",
+ "format-wifi": "{icon} {essid}",
+ "format-ethernet": " {ipaddr}/<span color='#aaaaaa'>{cidr}</span>",
+ "format-disconnected": "󰇨 DC'D",
+ "format-icons": [
+ "󰤯",
+ "󰤟",
+ "󰤢",
+ "󰤥",
+ "󰤨"
+ ],
+ "tooltip-format": "{ifname} via {gwaddr}",
+ "tooltip-format-wifi": "{essid} ({frequency} GHz)\n⇣{bandwidthDownBytes} ⇡{bandwidthUpBytes}",
+ "tooltip-format-ethernet": "⇣{bandwidthDownBytes} ⇡{bandwidthUpBytes}",
+ "tooltip-format-disconnected": "Disconnected",
+ "interval": 5,
+ "on-click": "alacritty --class TUI.float -e wifitui",
+ "on-click-right": "rfkill toggle wlan"
+ },
+ "backlight": {
+ "device": "intel_backlight",
+ "format": "{icon} {percent}%",
+ "format-icons": [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ "bluetooth": {
+ "format": " {num_connections}",
+ "format-disabled": "<span color='#aaaaaa'>󰂲</span>",
+ "format-connected": " {num_connections}",
+ "tooltip-format": "Devices connected: {num_connections}\n{device_alias} at {device_battery_percentage}%",
+ "on-click": "alacritty --class=TUI.float -e bluetui",
+ "on-click-right": "rfkill toggle bluetooth"
+ },
+ "pulseaudio": {
+ "format": "{icon} {volume}%",
+ "on-click": "alacritty --class TUI.float -e wiremix",
+ "tooltip-format": "{desc}",
+ "scroll-step": 5,
+ "format-muted": "<span color='#aaaaaa' </span>",
+ "format-icons": {
+ "headphone": "",
+ "default": [
+ "",
+ "",
+ ""
+ ]
+ }
+ },
+ "battery": {
+ "format": "{capacity}% {icon}",
+ "format-discharging": "{icon} {capacity}%",
+ "format-charging": "{icon} {capacity}%",
+ "format-plugged": " {capacity}%",
+ "format-full": "󰁹 {capacity}%",
+ "format-icons": {
+ "charging": [
+ "󰢜",
+ "󰂆",
+ "󰂇",
+ "󰂈",
+ "󰢝",
+ "󰂉",
+ "󰢞",
+ "󰂊",
+ "󰂋",
+ "󰂅"
+ ],
+ "default": [
+ "󰁺",
+ "󰁻",
+ "󰁼",
+ "󰁽",
+ "󰁾",
+ "󰁿",
+ "󰂀",
+ "󰂁",
+ "󰂂",
+ "󰁹"
+ ]
+ },
+ "interval": 5,
+ "states": {
+ "warning": 20,
+ "critical": 10
+ }
+ },
+ // Tray
+ "tray": {
+ "icon-size": 10,
+ "spacing": 10
+ },
+ // Custom modules
+ "custom/vpn": {
+ "format": " VPN",
+ "exec": "echo '{\"class\": \"connected\"}'",
+ "exec-if": "test -d /proc/sys/net/ipv4/conf/proton0",
+ "return-type": "json",
+ "interval": 5
+ },
+ "custom/expand-icon": {
+ "format": " ",
+ "tooltip": false
+ },
+ "custom/uptime": {
+ "format": "{}",
+ "format-icon": [
+ ""
+ ],
+ "tooltip": false,
+ "interval": 1600,
+ "exec": "~/.config/waybar/scripts/uptime.sh"
+ }
+}
diff --git a/waybar/scripts/mediaplayer.py b/waybar/scripts/mediaplayer.py
new file mode 100755
index 0000000..870eabf
--- /dev/null
+++ b/waybar/scripts/mediaplayer.py
@@ -0,0 +1,143 @@
+#!/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/waybar/scripts/uptime.sh b/waybar/scripts/uptime.sh
new file mode 100755
index 0000000..786561f
--- /dev/null
+++ b/waybar/scripts/uptime.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+UPTIME_PRETTY=$(uptime -p)
+
+UPTIME_FORMATTED=$(echo "$UPTIME_PRETTY" | sed 's/^up //;s/,*$//;s/minute/m/; s/hour/h/; s/day/d/; s/s//g')
+
+echo " $UPTIME_FORMATTED"
diff --git a/waybar/style.css b/waybar/style.css
new file mode 100644
index 0000000..cda8a00
--- /dev/null
+++ b/waybar/style.css
@@ -0,0 +1,127 @@
+@import "colors.css";
+
+* {
+ border: none;
+ font-family: "MesloLGLDZ Nerd Font Propo, sans-serif";
+ font-size: 12px;
+ font-weight: bold;
+ min-height: 0;
+}
+
+/* Keyframe animations */
+@keyframes urgent-blink {
+ 0% {
+ color: #eb4d4b;
+ }
+
+ 50% {
+ color: #ffffff;
+ }
+
+ 100% {
+ color: #eb4d4b;
+ }
+}
+
+window#waybar {
+ background-color: @background;
+ color: @foreground;
+}
+
+/* Workspaces */
+#workspaces {
+ margin-right: 0.75rem;
+}
+
+#workspaces button.active {
+ color: @color1;
+}
+
+#workspaces button.empty.active {
+ color: @color2;
+ /* opacity: 1; */
+}
+
+/* #workspaces button.empty { */
+/* opacity: 0.2; */
+/* } */
+
+/* #workspaces button:not(.empty) { */
+/* opacity: 0.7; */
+/* } */
+
+#workspaces button.urgent {
+ color: #ffffff;
+ background-color: rgba(255, 0, 0, 0.5);
+ border-radius: 0;
+}
+
+/* Modules */
+#battery,
+#clock {
+ margin: 0 0.45rem;
+}
+
+#backlight,
+#bluetooth,
+#cpu,
+#temperature,
+#memory,
+#pulseaudio {
+ margin: 0 0.45rem;
+}
+
+#tray {
+ margin-left: 0.25rem;
+}
+
+#bluetooth.connected {
+ color: @color1;
+}
+
+#battery:not(.charging).warning {
+ color: #FFA500;
+}
+
+#battery:not(.charging).critical {
+ color: #FF0000;
+}
+
+#network.disconnected {
+ color: #FF0000;
+}
+
+/* Groups */
+#audio,
+#expand-tray,
+#hardware,
+#powerofmachine,
+#network {
+ margin: 0 0.55rem;
+}
+
+#power-profiles-daemon.power-saver {
+ color: rgba(0, 250, 0, 1);
+}
+
+#power-profiles-daemon.performance {
+ color: rgba(200, 0, 0, 1);
+}
+
+/* Custom modules */
+#custom-screenrecording-indicator {
+ color: #ff0000;
+ animation-name: urgent-blink;
+ animation-duration: 1s;
+ animation-timing-function: steps(18);
+ animation-iteration-count: infinite;
+ animation-direction: alternate;
+}
+
+#custom-uptime {
+ margin: 0 0.55rem;
+}
+
+#custom-pomodoro {
+ margin: 0 0.55rem;
+}
diff --git a/waybar/themes/blacklotus.css b/waybar/themes/blacklotus.css
new file mode 100644
index 0000000..0add7da
--- /dev/null
+++ b/waybar/themes/blacklotus.css
@@ -0,0 +1,8 @@
+/* BlackLotus Colorscheme */
+@define-color background #0B0A0F;
+@define-color foreground #D7D2E9;
+
+@define-color color1 #A277FF;
+@define-color color3 #E363C9;
+@define-color color2 #6E8CFF;
+@define-color color4 #2EE2D0;
diff --git a/waybar/themes/catppuccin-mocha.css b/waybar/themes/catppuccin-mocha.css
new file mode 100644
index 0000000..19296d5
--- /dev/null
+++ b/waybar/themes/catppuccin-mocha.css
@@ -0,0 +1,12 @@
+/*
+* Variant: Catppuccin Mocha
+* Maintainer: https://github.com/catppuccin/waybar.git
+*/
+
+@define-color background #1e1e2e;
+@define-color foreground #cdd6f4;
+
+@define-color color1 #fab387;
+@define-color color2 #f5e0dc;
+@define-color color3 #74c7ec;
+@define-color color4 #f9e2af;
diff --git a/waybar/themes/dracula.css b/waybar/themes/dracula.css
new file mode 100644
index 0000000..42f7cce
--- /dev/null
+++ b/waybar/themes/dracula.css
@@ -0,0 +1,8 @@
+@define-color background #282a36;
+@define-color selection #44475a;
+@define-color foreground #f8f8f2;
+
+@define-color color1 #bd93f9;
+@define-color color2 #ffb86c;
+@define-color color3 #ff5555;
+@define-color color4 #50fa7b;
diff --git a/waybar/themes/gruvbox-dark.css b/waybar/themes/gruvbox-dark.css
new file mode 100644
index 0000000..5dcf4c6
--- /dev/null
+++ b/waybar/themes/gruvbox-dark.css
@@ -0,0 +1,12 @@
+/* Gruvbox Dark Hard – only 8 colors you’ll ever need */
+@define-color background #1d2021; /* darkest */
+@define-color background0 #282828; /* main background */
+@define-color background1 #3c3836; /* statusbars, selected lines */
+@define-color background2 #504945; /* subtle highlights */
+@define-color foreground #ebdbb2; /* main text */
+@define-color foreground0 #fbf1c7; /* brightest text (rarely used) */
+@define-color accent #fe8019; /* bright orange – main accent */
+@define-color color1 #cc241d; /* dark red */
+@define-color color2 #98971a; /* dark green */
+@define-color color3 #d79921; /* dark yellow */
+@define-color color4 #458588; /* dark blue */
diff --git a/waybar/themes/kanagawa.css b/waybar/themes/kanagawa.css
new file mode 100644
index 0000000..2a5c343
--- /dev/null
+++ b/waybar/themes/kanagawa.css
@@ -0,0 +1,7 @@
+@define-color foreground #DCD7BA;
+@define-color background #1F1F28;
+
+@define-color color1 #FF5D62;
+@define-color color2 #7AA89F;
+@define-color color3 #E6C384;
+@define-color color4 #7E9CD8;
diff --git a/waybar/themes/rose-pine.css b/waybar/themes/rose-pine.css
new file mode 100644
index 0000000..e323881
--- /dev/null
+++ b/waybar/themes/rose-pine.css
@@ -0,0 +1,13 @@
+/*
+* Variant: Rosé Pine
+* Maintainer: DankChoir
+* Modified for few colors
+*/
+
+@define-color background #191724;
+@define-color foreground #1f1d2e;
+
+@define-color color1 #eb6f92;
+@define-color color2 #f6c177;
+@define-color color3 #ebbcba;
+@define-color color4 #31748f;
diff --git a/waybar/themes/tokyonight.css b/waybar/themes/tokyonight.css
new file mode 100644
index 0000000..2f2dcf5
--- /dev/null
+++ b/waybar/themes/tokyonight.css
@@ -0,0 +1,6 @@
+@define-color background #1a1b26;
+@define-color foreground #c0caf5;
+
+@define-color color1 #7dcfff;
+@define-color color2 #f7768e;
+@define-color color3 #7aa2f7;