This commit is contained in:
Hui
2024-03-24 13:25:38 +08:00
parent b63fa00bd9
commit fa8c6727cf
103 changed files with 2840 additions and 1341 deletions

View File

@@ -0,0 +1,10 @@
"backlight": {
"device": "intel_backlight",
"rotate": ${r_deg},
"format": "{icon} {percent}%",
"format-icons": ["", "", "", "", "", "", "", "", ""],
"on-scroll-up": "brightnessctl set 1%+",
"on-scroll-down": "brightnessctl set 1%-",
"min-length": 6
},

View File

@@ -0,0 +1,14 @@
"battery": {
"states": {
"good": 95,
"warning": 30,
"critical": 20
},
"format": "{icon} {capacity}%",
"rotate": ${r_deg},
"format-charging": " {capacity}%",
"format-plugged": " {capacity}%",
"format-alt": "{time} {icon}",
"format-icons": ["󰂎", "󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"]
},

View File

@@ -0,0 +1,15 @@
"bluetooth": {
"format": "",
"rotate": ${r_deg},
"format-disabled": "",
"format-connected": " {num_connections}",
"format-connected-battery": "{icon} {num_connections}",
// "format-connected-battery": "{icon} {device_alias}-{device_battery_percentage}%",
"format-icons": ["󰥇", "󰤾", "󰤿", "󰥀", "󰥁", "󰥂", "󰥃", "󰥄", "󰥅", "󰥆", "󰥈"],
// "format-device-preference": [ "device1", "device2" ], // preference list deciding the displayed device If this config option is not defined or none of the devices in the list are connected, it will fall back to showing the last connected device.
"tooltip-format": "{controller_alias}\n{num_connections} connected",
"tooltip-format-connected": "{controller_alias}\n{num_connections} connected\n\n{device_enumerate}",
"tooltip-format-enumerate-connected": "{device_alias}",
"tooltip-format-enumerate-connected-battery": "{device_alias}\t{icon} {device_battery_percentage}%"
},

View File

@@ -0,0 +1,11 @@
"custom/cliphist": {
"format": "{}",
"rotate": ${r_deg},
"exec": "echo ; echo 󰅇 clipboard history",
"on-click": "sleep 0.1 && ${ScrDir}/cliphist.sh c",
"on-click-right": "sleep 0.1 && ${ScrDir}/cliphist.sh d",
"on-click-middle": "sleep 0.1 && ${ScrDir}/cliphist.sh w",
"interval" : 86400, // once every day
"tooltip": true
},

View File

@@ -0,0 +1,25 @@
"clock": {
"format": "{:%I:%M %p}",
"rotate": ${r_deg},
"format-alt": "{:%R 󰃭 %d·%m·%y}",
"tooltip-format": "<tt>{calendar}</tt>",
"calendar": {
"mode": "month",
"mode-mon-col": 3,
"on-scroll": 1,
"on-click-right": "mode",
"format": {
"months": "<span color='#ffead3'><b>{}</b></span>",
"weekdays": "<span color='#ffcc66'><b>{}</b></span>",
"today": "<span color='#ff6699'><b>{}</b></span>"
}
},
"actions": {
"on-click-right": "mode",
"on-click-forward": "tz_up",
"on-click-backward": "tz_down",
"on-scroll-up": "shift_up",
"on-scroll-down": "shift_down"
}
},

View File

@@ -0,0 +1,8 @@
"cpu": {
"interval": 10,
"format": "󰍛 {usage}%",
"rotate": ${r_deg},
"format-alt": "{icon0}{icon1}{icon2}{icon3}",
"format-icons": ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"]
},

View File

@@ -0,0 +1,10 @@
"custom/cpuinfo": {
"exec": " ${ScrDir}/cpuinfo.sh",
"return-type": "json",
"format": "{}",
"rotate": ${r_deg},
"interval": 5, // once every 5 seconds
"tooltip": true,
"max-length": 1000
},

View File

@@ -0,0 +1,47 @@
// modules for padding //
"custom/l_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/r_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/sl_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/sr_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/rl_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/rr_end": {
"format": " ",
"interval" : "once",
"tooltip": false
},
"custom/padd": {
"format": " ",
"interval" : "once",
"tooltip": false
}
}

View File

@@ -0,0 +1,41 @@
"custom/gpuinfo": {
"exec": " ${ScrDir}/gpuinfo.sh",
"return-type": "json",
"format": "{}",
"rotate": ${r_deg},
"interval": 5, // once every 5 seconds
"tooltip": true,
"max-length": 1000,
"on-click": "${ScrDir}/gpuinfo.sh --toggle",
},
"custom/gpuinfo#nvidia": {
"exec": " ${ScrDir}/gpuinfo.sh --use nvidia ",
"return-type": "json",
"format": "{}",
"rotate": ${r_deg},
"interval": 5, // once every 5 seconds
"tooltip": true,
"max-length": 1000,
},
"custom/gpuinfo#amd": {
"exec": " ${ScrDir}/gpuinfo.sh --use amd ",
"return-type": "json",
"format": "{}",
"rotate": ${r_deg},
"interval": 5, // once every 5 seconds
"tooltip": true,
"max-length": 1000,
},
"custom/gpuinfo#intel": {
"exec": " ${ScrDir}/gpuinfo.sh --use intel ",
"return-type": "json",
"format": "{}",
"rotate": ${r_deg},
"interval": 5, // once every 5 seconds
"tooltip": true,
"max-length": 1000,
},

View File

@@ -0,0 +1,12 @@
// --// waybar config generated by wbarconfgen.sh //-- //
{
// sourced from header module //
"layer": "top",
"position": "${w_position}",
"mod": "dock",
"${hv_pos}": ${w_height},
"exclusive": true,
"passthrough": false,
"gtk-layer-shell": true,

View File

@@ -0,0 +1,9 @@
"idle_inhibitor": {
"format": "{icon}",
"rotate": ${r_deg},
"format-icons": {
"activated": "󰥔",
"deactivated": ""
}
},

View File

@@ -0,0 +1,6 @@
"custom/keybindhint": {
"format": " ",
"rotate": ${r_deg},
"on-click": "${ScrDir}/keybinds_hint.sh"
},

View File

@@ -0,0 +1,6 @@
"hyprland/language": {
"format": "{short} {variant}",
"rotate": ${r_deg},
"on-click": "${ScrDir}/keyboardswitch.sh",
},

View File

@@ -0,0 +1,183 @@
#!/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, tooltip):
logger.debug(f"Writing output: {text}")
output = {"text": text,
"class": "custom-" + player.props.player_name,
"alt": player.props.player_name,
"tooltip": tooltip}
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" and "mpris:trackid" in metadata.keys() and ":ad:" in player.props.metadata["mpris:trackid"]:
track_info = "Advertisement"
elif artist is not None and title is not None:
track_info = f"{artist} - {title}"
else:
track_info = title
tooltip = track_info
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, tooltip)
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()

View File

@@ -0,0 +1,18 @@
"memory": {
"states": {
"c": 90, // critical
"h": 60, // high
"m": 30, // medium
},
"interval": 30,
"format": "󰾆 {used}GB",
"rotate": ${r_deg},
"format-m": "󰾅 {used}GB",
"format-h": "󰓅 {used}GB",
"format-c": " {used}GB",
"format-alt": "󰾆 {percentage}%",
"max-length": 10,
"tooltip": true,
"tooltip-format": "󰾆 {percentage}%\n {used:0.1f}GB/{total:0.1f}GB"
},

View File

@@ -0,0 +1,16 @@
"mpris": {
"format": "{player_icon} {dynamic}",
"rotate": ${r_deg},
"format-paused": "{status_icon} <i>{dynamic}</i>",
"player-icons": {
"default": "▶",
"mpv": "🎵"
},
"status-icons": {
"paused": "⏸"
},
// "ignored-players": ["firefox"]
"max-length": 1000,
"interval": 1
},

View File

@@ -0,0 +1,13 @@
"network": {
"tooltip": true,
"format-wifi": " ",
"rotate": ${r_deg},
"format-ethernet": "󰈀 ",
"tooltip-format": "Network: <big><b>{essid}</b></big>\nSignal strength: <b>{signaldBm}dBm ({signalStrength}%)</b>\nFrequency: <b>{frequency}MHz</b>\nInterface: <b>{ifname}</b>\nIP: <b>{ipaddr}/{cidr}</b>\nGateway: <b>{gwaddr}</b>\nNetmask: <b>{netmask}</b>",
"format-linked": "󰈀 {ifname} (No IP)",
"format-disconnected": "󰖪 ",
"tooltip-format-disconnected": "Disconnected",
"format-alt": "<span foreground='#99ffdd'> {bandwidthDownBytes}</span> <span foreground='#ffcc66'> {bandwidthUpBytes}</span>",
"interval": 2,
},

View File

@@ -0,0 +1,10 @@
"custom/power": {
"format": "{}",
"rotate": ${r_deg},
"exec": "echo ; echo  logout",
"on-click": "${ScrDir}/logoutlaunch.sh 2",
"on-click-right": "${ScrDir}/logoutlaunch.sh 1",
"interval" : 86400, // once every day
"tooltip": true
},

View File

@@ -0,0 +1,34 @@
"pulseaudio": {
"format": "{icon} {volume}",
"rotate": ${r_deg},
"format-muted": "婢",
"on-click": "pavucontrol -t 3",
"on-click-middle": "${ScrDir}/volumecontrol.sh -o m",
"on-scroll-up": "${ScrDir}/volumecontrol.sh -o i",
"on-scroll-down": "${ScrDir}/volumecontrol.sh -o d",
"tooltip-format": "{icon} {desc} // {volume}%",
"scroll-step": 5,
"format-icons": {
"headphone": "",
"hands-free": "",
"headset": "",
"phone": "",
"portable": "",
"car": "",
"default": ["", "", ""]
}
},
"pulseaudio#microphone": {
"format": "{format_source}",
"rotate": ${r_deg},
"format-source": "",
"format-source-muted": "",
"on-click": "pavucontrol -t 4",
"on-click-middle": "${ScrDir}/volumecontrol.sh -i m",
"on-scroll-up": "${ScrDir}/volumecontrol.sh -i i",
"on-scroll-down": "${ScrDir}/volumecontrol.sh -i d",
"tooltip-format": "{format_source} {source_desc} // {source_volume}%",
"scroll-step": 5
},

View File

@@ -0,0 +1,15 @@
"custom/spotify": {
"exec": "/usr/bin/env python3 $HOME/.config/waybar/modules/mediaplayer.py --player spotify",
"format": " {}",
"rotate": ${r_deg},
"return-type": "json",
"on-click": "playerctl play-pause --player spotify",
"on-click-right": "playerctl next --player spotify",
"on-click-middle": "playerctl previous --player spotify",
"on-scroll-up": "${ScrDir}/volumecontrol.sh -p spotify i",
"on-scroll-down": "${ScrDir}/volumecontrol.sh -p spotify d",
"max-length": 25,
"escape": true,
"tooltip": true
},

View File

@@ -0,0 +1,143 @@
* {
border: none;
border-radius: 0px;
font-family: "JetBrainsMono Nerd Font";
font-weight: bold;
font-size: ${s_fontpx}px;
min-height: 10px;
}
@import "themes/theme.css";
window#waybar {
background: @bar-bg;
}
tooltip {
background: @main-bg;
color: @main-fg;
border-radius: ${t_radius}px;
border-width: 0px;
}
#workspaces button {
box-shadow: none;
text-shadow: none;
padding: 0px;
border-radius: ${w_radius}px;
margin-${x1}: ${w_margin}px;
margin-${x2}: ${w_margin}px;
margin-${x3}: 0px;
padding-${x3}: ${w_paddin}px;
padding-${x4}: ${w_paddin}px;
margin-${x4}: 0px;
color: @main-fg;
animation: ws_normal 20s ease-in-out 1;
}
#workspaces button.active {
background: @wb-act-bg;
color: @wb-act-fg;
margin-${x3}: ${w_margin}px;
padding-${x3}: ${w_padact}px;
padding-${x4}: ${w_padact}px;
margin-${x4}: ${w_margin}px;
animation: ws_active 20s ease-in-out 1;
transition: all 0.4s cubic-bezier(.55,-0.68,.48,1.682);
}
#workspaces button:hover {
background: @wb-hvr-bg;
color: @wb-hvr-fg;
animation: ws_hover 20s ease-in-out 1;
transition: all 0.3s cubic-bezier(.55,-0.68,.48,1.682);
}
#taskbar button {
box-shadow: none;
text-shadow: none;
padding: 0px;
border-radius: ${w_radius}px;
margin-${x1}: ${w_margin}px;
margin-${x2}: ${w_margin}px;
margin-${x3}: 0px;
padding-${x3}: ${w_paddin}px;
padding-${x4}: ${w_paddin}px;
margin-${x4}: 0px;
color: @wb-color;
animation: tb_normal 20s ease-in-out 1;
}
#taskbar button.active {
background: @wb-act-bg;
color: @wb-act-color;
margin-${x3}: ${w_margin}px;
padding-${x3}: ${w_padact}px;
padding-${x4}: ${w_padact}px;
margin-${x4}: ${w_margin}px;
animation: tb_active 20s ease-in-out 1;
transition: all 0.4s cubic-bezier(.55,-0.68,.48,1.682);
}
#taskbar button:hover {
background: @wb-hvr-bg;
color: @wb-hvr-color;
animation: tb_hover 20s ease-in-out 1;
transition: all 0.3s cubic-bezier(.55,-0.68,.48,1.682);
}
${modules_ls}
#custom-l_end,
#custom-r_end,
#custom-sl_end,
#custom-sr_end,
#custom-rl_end,
#custom-rr_end {
color: @main-fg;
background: @main-bg;
opacity: 1;
margin: ${x1g_margin}px ${x2g_margin}px ${x3g_margin}px ${x4g_margin}px;
padding-${x3}: ${g_paddin}px;
padding-${x4}: ${g_paddin}px;
}
#workspaces,
#taskbar {
padding: 0px;
}
#custom-r_end {
border-radius: ${x1rb_radius}px ${x2rb_radius}px ${x3rb_radius}px ${x4rb_radius}px;
margin-${x4}: ${e_margin}px;
padding-${x4}: ${e_paddin}px;
}
#custom-l_end {
border-radius: ${x1lb_radius}px ${x2lb_radius}px ${x3lb_radius}px ${x4lb_radius}px;
margin-${x3}: ${e_margin}px;
padding-${x3}: ${e_paddin}px;
}
#custom-sr_end {
border-radius: 0px;
margin-${x4}: ${e_margin}px;
padding-${x4}: ${e_paddin}px;
}
#custom-sl_end {
border-radius: 0px;
margin-${x3}: ${e_margin}px;
padding-${x3}: ${e_paddin}px;
}
#custom-rr_end {
border-radius: ${x1rc_radius}px ${x2rc_radius}px ${x3rc_radius}px ${x4rc_radius}px;
margin-${x4}: ${e_margin}px;
padding-${x4}: ${e_paddin}px;
}
#custom-rl_end {
border-radius: ${x1lc_radius}px ${x2lc_radius}px ${x3lc_radius}px ${x4lc_radius}px;
margin-${x3}: ${e_margin}px;
padding-${x3}: ${e_paddin}px;
}

View File

@@ -0,0 +1,17 @@
"wlr/taskbar": {
"format": "{icon}",
"rotate": ${r_deg},
"icon-size": ${i_task},
"icon-theme": "${i_theme}",
"spacing": 0,
"tooltip-format": "{title}",
"on-click": "activate",
"on-click-middle": "close",
"ignore-list": [
"Alacritty"
],
"app_ids-mapping": {
"firefoxdeveloperedition": "firefox-developer-edition"
}
},

View File

@@ -0,0 +1,11 @@
"custom/theme": {
"format": "{}",
"rotate": ${r_deg},
"exec": "echo ; echo 󰟡 switch theme",
"on-click": "${ScrDir}/themeswitch.sh -n",
"on-click-right": "${ScrDir}/themeswitch.sh -p",
"on-click-middle": "sleep 0.1 && ${ScrDir}/themeselect.sh",
"interval" : 86400, // once every day
"tooltip": true
},

View File

@@ -0,0 +1,6 @@
"tray": {
"icon-size": ${i_size},
"rotate": ${r_deg},
"spacing": 5
},

View File

@@ -0,0 +1,10 @@
"custom/updates": {
"exec": "${ScrDir}/systemupdate.sh",
"return-type": "json",
"format": "󰮯 {}",
"rotate": ${r_deg},
"on-click": "${ScrDir}/systemupdate.sh up",
"interval": 86400, // once every day
"tooltip": true,
},

View File

@@ -0,0 +1,11 @@
"custom/wallchange": {
"format": "{}",
"rotate": ${r_deg},
"exec": "echo ; echo 󰆊 switch wallpaper",
"on-click": "${ScrDir}/swwwallpaper.sh -n",
"on-click-right": "${ScrDir}/swwwallpaper.sh -p",
"on-click-middle": "sleep 0.1 && ${ScrDir}/swwwallselect.sh",
"interval" : 86400, // once every day
"tooltip": true
},

View File

@@ -0,0 +1,11 @@
"custom/wbar": {
"format": "{}", //   //
"rotate": ${r_deg},
"exec": "echo ; echo  switch bar //  dock",
"on-click": "${ScrDir}/wbarconfgen.sh n",
"on-click-right": "${ScrDir}/wbarconfgen.sh p",
"on-click-middle": "sleep 0.1 && ${ScrDir}/quickapps.sh kitty firefox spotify code dolphin",
"interval" : 86400,
"tooltip": true
},

View File

@@ -0,0 +1,17 @@
"hyprland/window": {
"format": "  {}",
"rotate": ${r_deg},
"separate-outputs": true,
"rewrite": {
"${USER}@${set_sysname}:(.*)": "$1 ",
"(.*) — Mozilla Firefox": "$1 󰈹",
"(.*)Mozilla Firefox": "Firefox 󰈹",
"(.*) - Visual Studio Code": "$1 󰨞",
"(.*)Visual Studio Code": "Code 󰨞",
"(.*) — Dolphin": "$1 󰉋",
"(.*)Spotify": "Spotify 󰓇",
"(.*)Steam": "Steam 󰓓"
},
"max-length": 1000
},

View File

@@ -0,0 +1,10 @@
"hyprland/workspaces": {
"disable-scroll": true,
"rotate": ${r_deg},
"all-outputs": true,
"active-only": false,
"on-click": "activate",
"persistent-workspaces": {
}
},