Added waybar
This commit is contained in:
		
							parent
							
								
									80abe36a01
								
							
						
					
					
						commit
						3030d83a2a
					
				
					 3 changed files with 412 additions and 0 deletions
				
			
		
							
								
								
									
										111
									
								
								config/waybar-config
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								config/waybar-config
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,111 @@ | |||
| // | ||||
| // ~/.config/waybar/config | ||||
| // | ||||
| 
 | ||||
| [{ | ||||
| 	"position": "bottom", // Waybar position (top|bottom|left|right) | ||||
| 	"height": 30, // Waybar height (to be removed for auto height) | ||||
| 	"spacing": 4, // Gaps between modules (4px) | ||||
| 	 | ||||
| 	"modules-left": ["sway/workspaces", "custom/media"], | ||||
| 	"modules-right": ["idle_inhibitor", "cpu", "memory", "temperature", "pulseaudio", "battery", "clock", "tray"], | ||||
| 	 | ||||
| 	"ipc": true, | ||||
|      | ||||
| 	"sway/workspaces": { | ||||
| 		"disable-scroll": true, | ||||
| 		"all-outputs": true, | ||||
| 		"format": "{icon}{name}", | ||||
| 		"format-icons": { | ||||
| 			"urgent": " ", | ||||
| 			"default": "" // Prevent showing workspace name literal.  | ||||
| 		} | ||||
| 	}, | ||||
| 	"idle_inhibitor": { | ||||
|         	"format": "Prohibit idle {icon}", | ||||
| 	        "format-icons": { | ||||
|         		"activated": "", | ||||
| 			"deactivated": "" | ||||
| 		},  | ||||
| 		"tooltip": false | ||||
| 	}, | ||||
| 	"tray": { | ||||
|         	// "icon-size": 21, | ||||
| 	        "spacing": 10 | ||||
| 	}, | ||||
| 	"clock": { | ||||
|         	"timezone": "Europe/Brussels", | ||||
| 		"format": "<big>{:%H:%M %d/%m%Y}</big>", //"<big>{:%H:%M}</big>\n21-03-2022", //\n{:%d/%m/%Y}", | ||||
| 	        "format-alt": "{:%H:%M}", | ||||
| 	        "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>", | ||||
| 	}, | ||||
| 	"cpu": { | ||||
|         	"format": "{usage}% ", | ||||
| 	        "tooltip": true | ||||
| 	}, | ||||
| 	"memory": { | ||||
|         	"format": "{}% ", | ||||
| 		"on-click": "alacritty | htop" | ||||
| 	}, | ||||
| 	"temperature": { | ||||
| 	        "critical-threshold": 70, | ||||
| 	        // "format-critical": "{temperatureC}°C {icon}", | ||||
| 	        "format": "{temperatureC}°C {icon}", | ||||
| 	        "format-icons": ["", "", ""] | ||||
| 	}, | ||||
| 	"backlight": { | ||||
| 	        "format": "{percent}% {icon}", | ||||
| 		"format-icons": ["", ""] | ||||
| 	}, | ||||
| 	"battery": { | ||||
|         	"states": { | ||||
| 			"warning": 30, | ||||
| 			"critical": 15 | ||||
| 		}, | ||||
| 	        "format": "{capacity}% {icon}", | ||||
| 	        "format-charging": "{capacity}% ", | ||||
| 	        "format-plugged": "{capacity}% ", | ||||
| 	        "format-alt": "{time} {icon}", | ||||
| 	        // "format-good": "", // An empty format will hide the module | ||||
| 	        // "format-full": "", | ||||
| 	        "format-icons": ["", "", "", "", ""] | ||||
| 	}, | ||||
| 	"pulseaudio": { | ||||
| 	        "scroll-step": 2, | ||||
| 	        "format": "{volume}% {icon} {format_source}", | ||||
| 	        "format-bluetooth": "{volume}% {icon} {format_source}", | ||||
| 	        "format-bluetooth-muted": " {icon} {format_source}", | ||||
| 	        "format-muted": " {format_source}", | ||||
| 	        "format-source": "{volume}% ", | ||||
| 	        "format-source-muted": "", | ||||
| 	        "format-icons": { | ||||
| 			"headphone": " ", | ||||
| 			"hands-free": "", | ||||
| 			"headset": "", | ||||
| 			"phone": "", | ||||
| 			"portable": "", | ||||
| 			"car": "", | ||||
| 			"default": ["", "", ""] | ||||
| 		}, | ||||
| 		"on-click": "playerctl play-pause" | ||||
| 	}, | ||||
| 	"custom/media": { | ||||
|         	"format": "{icon} {}", | ||||
| 	        "return-type": "json", | ||||
| 	        "max-length": 40, | ||||
| 	        "format-icons": { | ||||
| 	            "spotify": "", | ||||
| 	            "default": "🎜" | ||||
| 	        }, | ||||
| 	        "escape": true, | ||||
| 	        "exec": "~/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder | ||||
| 	// "exec": "~/.config/waybar/mediaplayer.py --player spotify //2> /dev/null" // Filter player based on name | ||||
| 	} | ||||
| },  | ||||
| { | ||||
|         "position": "top", | ||||
|         "height": 20, | ||||
| 	"modules-left": ["sway/mode"], | ||||
|         "modules-center": ["sway/window"] | ||||
| }] | ||||
| 
 | ||||
							
								
								
									
										131
									
								
								config/waybar-mediaplayer.py
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										131
									
								
								config/waybar-mediaplayer.py
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,131 @@ | |||
| #!/usr/bin/env python3 | ||||
| # From:  | ||||
| # https://github.com/Alexays/Waybar/blob/master/resources/custom_modules/mediaplayer.py | ||||
| 
 | ||||
| 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() | ||||
							
								
								
									
										170
									
								
								config/waybar-style
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								config/waybar-style
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,170 @@ | |||
| /* | ||||
|  * ~/.config/waybar/style.css | ||||
|  * */ | ||||
| 
 | ||||
| * { | ||||
|     /* `otf-font-awesome` is required to be installed for icons */ | ||||
|     font-family: FontAwesome, Roboto, Helvetica, Arial, sans-serif; | ||||
|     font-size: 13px; | ||||
| } | ||||
| 
 | ||||
| window#waybar { | ||||
|     background-color: rgba(43, 48, 59, 0.75); | ||||
|     color: #ffffff; | ||||
|     transition-property: background-color; | ||||
|     transition-duration: .5s; | ||||
| } | ||||
| 
 | ||||
| /* Top bar which only contains title can be transparent */ | ||||
| window#waybar.top { | ||||
| 	background-color: transparent;  | ||||
| } | ||||
| 
 | ||||
| window#waybar.hidden { | ||||
|     opacity: 0.2; | ||||
| } | ||||
| 
 | ||||
| /* | ||||
| window#waybar.empty { | ||||
|     background-color: transparent; | ||||
| } | ||||
| window#waybar.solo { | ||||
|     background-color: #FFFFFF; | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| window#waybar.termite { | ||||
|     background-color: #3F3F3F; | ||||
| } | ||||
| 
 | ||||
| window#waybar.chromium { | ||||
|     background-color: #000000; | ||||
|     border: none; | ||||
| } | ||||
| 
 | ||||
| #workspaces button { | ||||
|     padding: 0 5px; | ||||
|     background-color: transparent; | ||||
|     color: #ffffff; | ||||
|     /* Use box-shadow instead of border so the text isn't offset */ | ||||
|     /* Avoid rounded borders under each workspace name */ | ||||
|     border: none; | ||||
|     border-radius: 0; | ||||
|     min-width: 30px;  | ||||
| } | ||||
| 
 | ||||
| /* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ | ||||
| #workspaces button:hover { | ||||
|     background: rgba(0, 0, 0, 0.2); | ||||
|     box-shadow: inset 0 3px #ffffff; | ||||
| } | ||||
| 
 | ||||
| #workspaces button.focused { | ||||
|     background-color: #0E423C; /* REPLACE */ | ||||
|     box-shadow: inset 0 3px #ffffff;  | ||||
| } | ||||
| 
 | ||||
| #workspaces button.urgent { | ||||
|     background-color: #eb4d4b; | ||||
| } | ||||
| 
 | ||||
| #mode { | ||||
|     background-color: #64727D; | ||||
|     border-bottom: 3px solid #ffffff; | ||||
| } | ||||
| 
 | ||||
| #clock, | ||||
| #battery, | ||||
| #cpu, | ||||
| #memory, | ||||
| #disk, | ||||
| #temperature, | ||||
| #backlight, | ||||
| #network, | ||||
| #pulseaudio, | ||||
| #custom-media, | ||||
| #tray, | ||||
| #mode, | ||||
| #idle_inhibitor, | ||||
| #mpd { | ||||
|     padding: 0 10px; | ||||
|     color: #ffffff; | ||||
| } | ||||
| 
 | ||||
| #window, | ||||
| #workspaces { | ||||
|     margin: 0 4px; | ||||
| } | ||||
| 
 | ||||
| /* 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; | ||||
| } | ||||
| 
 | ||||
| #battery.charging, #battery.plugged { | ||||
|     color: #ffffff; | ||||
|     background-color: #26A65B; | ||||
| } | ||||
| 
 | ||||
| @keyframes blink { | ||||
|     to { | ||||
|         background-color: #ffffff; | ||||
|         color: #000000; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #battery.critical:not(.charging) { | ||||
|     background-color: #f53c3c; | ||||
|     color: #ffffff; | ||||
|     animation-name: blink; | ||||
|     animation-duration: 0.5s; | ||||
|     animation-timing-function: linear; | ||||
|     animation-iteration-count: infinite; | ||||
|     animation-direction: alternate; | ||||
| } | ||||
| 
 | ||||
| label:focus { | ||||
|     background-color: #000000; | ||||
| } | ||||
| 
 | ||||
| #pulseaudio.muted { | ||||
|     color: #0E423C; /* REPLACE */ | ||||
| } | ||||
| 
 | ||||
| #custom-media { | ||||
|     background-color: #66cc99; | ||||
|     color: #2a5c45; | ||||
|     min-width: 100px; | ||||
| } | ||||
| 
 | ||||
| #custom-media.custom-spotify { | ||||
|     background-color: #66cc99; | ||||
| } | ||||
| 
 | ||||
| #custom-media.custom-vlc { | ||||
|     background-color: #ffa000; | ||||
| } | ||||
| 
 | ||||
| #temperature.critical { | ||||
|     background-color: #eb4d4b; | ||||
| } | ||||
| 
 | ||||
| #tray > .passive { | ||||
|     -gtk-icon-effect: dim; | ||||
| } | ||||
| 
 | ||||
| #tray > .needs-attention { | ||||
|     -gtk-icon-effect: highlight; | ||||
|     background-color: #eb4d4b; | ||||
| } | ||||
| 
 | ||||
| #idle_inhibitor.activated { | ||||
|     background-color: #ecf0f1; | ||||
|     color: #2d3436; | ||||
| } | ||||
| 
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue