208 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			208 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/env zsh
							 | 
						||
| 
								 | 
							
								source $bspwm_config_dir/common
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								cleanup() {
							 | 
						||
| 
								 | 
							
									jobs=${${jobstates##*:*:}%=*}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if [[ "$jobs" ]]; then
							 | 
						||
| 
								 | 
							
										eval "kill $jobs"
							 | 
						||
| 
								 | 
							
									fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bspc config top_padding 0
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								get_line() {
							 | 
						||
| 
								 | 
							
									declare counter=0 line=$1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									while read; do
							 | 
						||
| 
								 | 
							
										if (( counter == line )); then
							 | 
						||
| 
								 | 
							
											printf '%s\n' "$REPLY"
							 | 
						||
| 
								 | 
							
											return 0
							 | 
						||
| 
								 | 
							
										fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										(( counter++ ))
							 | 
						||
| 
								 | 
							
									done
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								parse_fifo_data() {
							 | 
						||
| 
								 | 
							
									declare msg desktop_spec
							 | 
						||
| 
								 | 
							
									declare -g win_name misc bspwm_status
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									while read; do
							 | 
						||
| 
								 | 
							
										case "$REPLY" in
							 | 
						||
| 
								 | 
							
											cmd::*)
							 | 
						||
| 
								 | 
							
												read -r cmd args <<< "${REPLY#cmd::}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												case "$cmd" in
							 | 
						||
| 
								 | 
							
													redraw)
							 | 
						||
| 
								 | 
							
														printf 'Redraw triggered\n'
							 | 
						||
| 
								 | 
							
														sleep 1
							 | 
						||
| 
								 | 
							
														printf '%s\n' "$msg"
							 | 
						||
| 
								 | 
							
													;;
							 | 
						||
| 
								 | 
							
													respawn)
							 | 
						||
| 
								 | 
							
														printf 'Dying...\n'
							 | 
						||
| 
								 | 
							
														sleep 1
							 | 
						||
| 
								 | 
							
														rexec
							 | 
						||
| 
								 | 
							
													;;
							 | 
						||
| 
								 | 
							
													run)
							 | 
						||
| 
								 | 
							
														$args
							 | 
						||
| 
								 | 
							
														rexec
							 | 
						||
| 
								 | 
							
													;;
							 | 
						||
| 
								 | 
							
												esac
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
											updates::*) updates="${REPLY#*updates::}";;
							 | 
						||
| 
								 | 
							
											date::*) date="${REPLY#*date::}";;
							 | 
						||
| 
								 | 
							
											T*)
							 | 
						||
| 
								 | 
							
												if (( panel_taskbar_enable )); then
							 | 
						||
| 
								 | 
							
													unset win_title
							 | 
						||
| 
								 | 
							
													unset taskbar taskbar_windows taskbar_length
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													panel_taskbar_max_title_current=$panel_taskbar_max_title
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													while read -r _ _ _ wid _ _ _ _ focus; do
							 | 
						||
| 
								 | 
							
														if [[ "$wid" =~ [0-9]x[0-9A-F] ]]; then
							 | 
						||
| 
								 | 
							
															if [[ "$focus" == '*' ]]; then
							 | 
						||
| 
								 | 
							
																taskbar_windows+=( "$wid::F" )
							 | 
						||
| 
								 | 
							
															else
							 | 
						||
| 
								 | 
							
																taskbar_windows+=( "$wid::u" )
							 | 
						||
| 
								 | 
							
															fi
							 | 
						||
| 
								 | 
							
														fi
							 | 
						||
| 
								 | 
							
													done < <( bspc query -T -d focused )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													taskbar_windows_n="${#taskbar_windows[@]}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													if (( taskbar_windows_n )); then
							 | 
						||
| 
								 | 
							
														until (( taskbar_length )) && (( taskbar_length <= panel_taskbar_max_length )); do
							 | 
						||
| 
								 | 
							
															unset taskbar
							 | 
						||
| 
								 | 
							
															taskbar_length=$(( (taskbar_windows_n * 2) + 2 ))
							 | 
						||
| 
								 | 
							
															
							 | 
						||
| 
								 | 
							
															for w in "${taskbar_windows[@]}"; do
							 | 
						||
| 
								 | 
							
																IFS='::' read -r wid _ state <<< "$w"
							 | 
						||
| 
								 | 
							
																win_title=$( xtitle -f '%s' -t "${panel_taskbar_max_title_current}" "$wid" )
							 | 
						||
| 
								 | 
							
																win_title_length="${#win_title}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																taskbar_length=$(( taskbar_length + win_title_length ))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																if [[ "$state" == 'F' ]]; then
							 | 
						||
| 
								 | 
							
																	taskbar+=" %{B${colors_bg_focused}}%{F${colors_bg_normal}}%{F-} ${win_title} %{B-}%{F${colors_bg_focused}}%{F-}"
							 | 
						||
| 
								 | 
							
																else
							 | 
						||
| 
								 | 
							
																	taskbar+=" %{A:bspc window -f ${wid}:}  ${win_title}  %{A}"
							 | 
						||
| 
								 | 
							
																fi
							 | 
						||
| 
								 | 
							
															done
							 | 
						||
| 
								 | 
							
																
							 | 
						||
| 
								 | 
							
															(( panel_taskbar_max_title_current-- ))
							 | 
						||
| 
								 | 
							
														done
							 | 
						||
| 
								 | 
							
													fi
							 | 
						||
| 
								 | 
							
												else
							 | 
						||
| 
								 | 
							
													win_title="${REPLY#*T}"
							 | 
						||
| 
								 | 
							
													if [[ "$win_title" ]]; then
							 | 
						||
| 
								 | 
							
														taskbar=" %{B${colors_bg_focused}}%{F${colors_bg_normal}}%{F-} ${win_title} %{B-}%{F${colors_bg_focused}}%{F-}"
							 | 
						||
| 
								 | 
							
													else
							 | 
						||
| 
								 | 
							
														unset taskbar
							 | 
						||
| 
								 | 
							
													fi
							 | 
						||
| 
								 | 
							
												fi
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
											WM*)
							 | 
						||
| 
								 | 
							
												unset desktop_spec
							 | 
						||
| 
								 | 
							
												IFS=':' read -A bspwm_status <<< "$REPLY"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												for i in "${bspwm_status[@]}"; do
							 | 
						||
| 
								 | 
							
													if [[ "$i" =~ ^[oOfFuU].+ ]]; then
							 | 
						||
| 
								 | 
							
														n="${i#*[oOfFuU]}"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														case "$i" in
							 | 
						||
| 
								 | 
							
															O*|F*|U*) desktop_spec+="%{B${colors_bg_focused}} $n %{B-}";;
							 | 
						||
| 
								 | 
							
															u*) desktop_spec+="%{B${colour_urgent}}%{A:bspc desktop -f $n:} $n %{A}%{B-}";;
							 | 
						||
| 
								 | 
							
															o*) desktop_spec+="%{B-}%{A:bspc desktop -f $n:} $n %{A}";;
							 | 
						||
| 
								 | 
							
															f*)
							 | 
						||
| 
								 | 
							
																(( panel_show_empty_tags )) && {
							 | 
						||
| 
								 | 
							
																	desktop_spec+="%{B-} $n "
							 | 
						||
| 
								 | 
							
																}
							 | 
						||
| 
								 | 
							
															;;
							 | 
						||
| 
								 | 
							
														esac
							 | 
						||
| 
								 | 
							
													fi
							 | 
						||
| 
								 | 
							
												done
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												read _ _ _ _ layout float _ < <( bspc query -T -d focused | get_line 1 )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if [[ "$float" == 'f' ]]; then
							 | 
						||
| 
								 | 
							
													float_flag='f'
							 | 
						||
| 
								 | 
							
												else
							 | 
						||
| 
								 | 
							
													float_flag=''
							 | 
						||
| 
								 | 
							
												fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												case "$layout" in
							 | 
						||
| 
								 | 
							
													T) layout_flag='t';;
							 | 
						||
| 
								 | 
							
													M) layout_flag='m';;
							 | 
						||
| 
								 | 
							
												esac
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												desktop_spec+=" %{A:bsptl:}[${layout_flag}${float_flag}]%{A}"
							 | 
						||
| 
								 | 
							
											;;
							 | 
						||
| 
								 | 
							
										esac
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										msg="$desktop_spec"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										[[ "$taskbar" ]] && { msg+="$taskbar"; }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										msg+="%{r}%{F${colors_bg_focused}}%{F-}%{B${colors_bg_focused}} $updates $date "
							 | 
						||
| 
								 | 
							
										msg+='%{B-}%{F-}'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										printf '%s\n' "$msg"
							 | 
						||
| 
								 | 
							
									done < "$panel_fifo"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								misc_status() {
							 | 
						||
| 
								 | 
							
									declare ip msg date
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									while sleep 1; do
							 | 
						||
| 
								 | 
							
										date=$( date +%A,\ %Y.%m.%d\ %H:%M:%S )
							 | 
						||
| 
								 | 
							
										msg="[ $date ]"
							 | 
						||
| 
								 | 
							
										printf 'S:%s\n' "$msg"
							 | 
						||
| 
								 | 
							
									done
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								rexec() {
							 | 
						||
| 
								 | 
							
									eval "kill ${${jobstates##*:*:}%=*[@]}"
							 | 
						||
| 
								 | 
							
									exec "$0"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function panel_geometry
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									xrandr|grep -Eo '[[:digit:]]+x[[:digit:]]+\+[[:digit:]]+\+[[:digit:]]+'|awk -F'x|+' '{print $1,$2,$3,$4}'|read -A screen_geometry
							 | 
						||
| 
								 | 
							
									((panel_h)) || panel_h=20
							 | 
						||
| 
								 | 
							
									((panel_w)) || panel_w=$screen_geometry[2]
							 | 
						||
| 
								 | 
							
									((panel_l)) || panel_l=$screen_geometry[3]
							 | 
						||
| 
								 | 
							
									((panel_d)) || panel_d=$screen_geometry[4]
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								main() {
							 | 
						||
| 
								 | 
							
									trap 'cleanup' EXIT TERM INT
							 | 
						||
| 
								 | 
							
									trap 'rexec' HUP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									[[ -e "$panel_fifo" ]] && {
							 | 
						||
| 
								 | 
							
										rm "$panel_fifo" || { return 1; }
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									mkfifo "$panel_fifo"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (( panel_taskbar_enable )); then
							 | 
						||
| 
								 | 
							
										xtitle -s -t "$panel_taskbar_max_title" -f 'T%s' > "$panel_fifo" &
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										xtitle -s -f 'T%s' > "$panel_fifo" &
							 | 
						||
| 
								 | 
							
									fi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bspc control --subscribe > "$panel_fifo" &
							 | 
						||
| 
								 | 
							
									$bspwm_config_dir/panel_status &
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bspc config top_padding "$(( panel_h + bspwm_window_gap ))"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									parse_fifo_data | lemonbar -g "${panel_w}x${panel_h}+${panel_l}+${panel_d}" \
							 | 
						||
| 
								 | 
							
								                         -f "$font_norm" \
							 | 
						||
| 
								 | 
							
								                         -f "$font_bold" \
							 | 
						||
| 
								 | 
							
								                         -F "$colors_fg_normal" \
							 | 
						||
| 
								 | 
							
								                         -B "$colors_bg_normal" | zsh &
							 | 
						||
| 
								 | 
							
									wait
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								main
							 |