| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | #!/bin/zsh | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | DEPENDENCIES+=( | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 	diff | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | REQUIRED_ENV+=( | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 	I3__MODEL_CONFIG | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | CHECK_ENVIRONMENT | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | ##################################################################### | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | REGEX_FONT='^\(font [^0-9]*\)\(.*\)' | 
					
						
							|  |  |  | REGEX_DMENU="^\\(.*dmenu_run .*-fn '[^0-9]*\\)\\([0-9]*\\)'" | 
					
						
							|  |  |  | REGEX_BORDER='^\(for_window.*border pixel \)\(.*\)' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | INSTALL() { | 
					
						
							|  |  |  | 	local USAGE=" | 
					
						
							|  |  |  | 		usage: [...options...] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		options | 
					
						
							|  |  |  | 		  -f, --force             force replacement of existing i3config | 
					
						
							|  |  |  | 		  -n, --no-link           if output config and template are the same, don't create link | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		  -h, --help              print this message and exit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		environment | 
					
						
							|  |  |  | 		  I3__MODEL_CONFIG        fully-qualified path to sourced i3config | 
					
						
							|  |  |  | 		  I3__GLOBAL_FONT_SIZE    global font size | 
					
						
							|  |  |  | 		  I3__DMENU_FONT_SIZE     (optional) font size for 'dmenu' command | 
					
						
							|  |  |  | 		  I3__BORDER_PIXEL_SIZE   (optional) pixel-width of window borders | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		I3 provides no way to include dynamic variables in your config. | 
					
						
							|  |  |  | 		The main difference I want between my i3 configurations is font-size | 
					
						
							|  |  |  | 		to match the current monitor. Since i3-msg provides no way to change | 
					
						
							|  |  |  | 		font size, I run this command to update those variables on a local | 
					
						
							|  |  |  | 		copy of my sourced config | 
					
						
							|  |  |  | 	" | 
					
						
							|  |  |  | 	local FORCE=0 | 
					
						
							|  |  |  | 	local AUTOLINK=1 | 
					
						
							|  |  |  | 	while [[ $# -gt 0 ]] | 
					
						
							|  |  |  | 	do | 
					
						
							|  |  |  | 		case $1 in  | 
					
						
							|  |  |  | 			-f | --force ) FORCE=1 ;; | 
					
						
							|  |  |  | 			-n | --no-link ) AUTOLINK=0 ;; | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 			-h | --help ) USAGE; exit 0 ;; | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 		esac | 
					
						
							|  |  |  | 		shift 1 | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 	STATUS 'reading local i3config' | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 	[[ ^$I3__MODEL_CONFIG$ =~ ^$HOME/.config/i3/config$ ]] && { | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 		STATUS "model configuration is default configuration" | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 		I3__MODEL_CONFIG="$I3__MODEL_CONFIG.template" | 
					
						
							|  |  |  | 		[ ! -f "$I3__MODEL_CONFIG" ] && { | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 			STATUS "creating template" | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 			cp "$HOME/.config/i3/config" "$I3__MODEL_CONFIG.template" | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 		STATUS "referring to '$I3__MODEL_CONFIG'" | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	local CONFIG=$(cat "$I3__MODEL_CONFIG") | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 	[ ! $CONFIG ] && FAIL 1 "failed to read config at '$I3__MODEL_CONFIG'" | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	local CONFIG_FILE="$HOME/.config/i3/config" | 
					
						
							|  |  |  | 	[ ! -d $(dirname "$CONFIG_FILE") ] && mkdir -p "$(dirname "$CONFIG_FILE")" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	[ -f "$CONFIG_FILE" ] && mv "$CONFIG_FILE" "$CONFIG_FILE.bak" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	[ $I3__GLOBAL_FONT_SIZE ] && { | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 		STATUS "setting global font size to '$I3__GLOBAL_FONT_SIZE'" | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 		CONFIG=$(echo $CONFIG | sed "s/$REGEX_FONT/\\1$I3__GLOBAL_FONT_SIZE/") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	[ $I3__DMENU_FONT_SIZE ] && { | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 		STATUS "setting dmenu font size to '$I3__DMENU_FONT_SIZE'" | 
					
						
							| 
									
										
										
										
											2022-08-24 12:01:24 -06:00
										 |  |  | 		CONFIG=$(echo $CONFIG | sed "s/$REGEX_DMENU/\\1$I3__DMENU_FONT_SIZE'/") | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	[ $I3__BORDER_PIXEL_SIZE ] && { | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 		STATUS "setting border pixel size to '$I3__BORDER_PIXEL_SIZE'" | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 		CONFIG=$(echo $CONFIG | sed "s/$REGEX_BORDER/\\1$I3__BORDER_PIXEL_SIZE/") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	echo $CONFIG > "$CONFIG_FILE" | 
					
						
							|  |  |  | 	[ -f "$CONFIG_FILE.bak" ] \ | 
					
						
							|  |  |  | 		&& diff "$CONFIG_FILE" "$CONFIG_FILE.bak" -q >/dev/null \ | 
					
						
							|  |  |  | 		&& mv "$CONFIG_FILE.bak" "$CONFIG_FILE" \ | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 		&& INFO "no changes were made" \ | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 		; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	[[ $AUTOLINK -eq 1 ]] \ | 
					
						
							|  |  |  | 		&& diff "$CONFIG_FILE" "$I3__MODEL_CONFIG" -q >/dev/null \ | 
					
						
							|  |  |  | 		&& rm "$CONFIG_FILE" \ | 
					
						
							|  |  |  | 		&& ln -s "$I3__MODEL_CONFIG" "$CONFIG_FILE" \ | 
					
						
							| 
									
										
										
										
											2023-02-21 18:44:27 -07:00
										 |  |  | 		&& INFO "output is the same as model, i3config has been linked to model" \ | 
					
						
							| 
									
										
										
										
											2022-08-22 16:04:03 -06:00
										 |  |  | 		; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	[[ $FORCE -eq 1 ]] && rm "$CONFIG.bak" >/dev/null 2>&1 | 
					
						
							|  |  |  | 	return 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ##################################################################### | 
					
						
							|  |  |  | INSTALL $@ |