v3.9.1
===================================================================== --- Changes ------------------------------ - Moved personal-environment specific scwrypts to wrynegade/dotwryn
This commit is contained in:
		@@ -1,102 +0,0 @@
 | 
				
			|||||||
#!/bin/zsh
 | 
					 | 
				
			||||||
DEPENDENCIES+=(
 | 
					 | 
				
			||||||
	diff
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
REQUIRED_ENV+=(
 | 
					 | 
				
			||||||
	I3__MODEL_CONFIG
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CHECK_ENVIRONMENT
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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 ;;
 | 
					 | 
				
			||||||
			-h | --help ) USAGE; exit 0 ;;
 | 
					 | 
				
			||||||
		esac
 | 
					 | 
				
			||||||
		shift 1
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	STATUS 'reading local i3config'
 | 
					 | 
				
			||||||
	[[ ^$I3__MODEL_CONFIG$ =~ ^$HOME/.config/i3/config$ ]] && {
 | 
					 | 
				
			||||||
		STATUS "model configuration is default configuration"
 | 
					 | 
				
			||||||
		I3__MODEL_CONFIG="$I3__MODEL_CONFIG.template"
 | 
					 | 
				
			||||||
		[ ! -f "$I3__MODEL_CONFIG" ] && {
 | 
					 | 
				
			||||||
			STATUS "creating template"
 | 
					 | 
				
			||||||
			cp "$HOME/.config/i3/config" "$I3__MODEL_CONFIG.template"
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		STATUS "referring to '$I3__MODEL_CONFIG'"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	local CONFIG=$(cat "$I3__MODEL_CONFIG")
 | 
					 | 
				
			||||||
	[ ! $CONFIG ] && FAIL 1 "failed to read config at '$I3__MODEL_CONFIG'"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	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 ] && {
 | 
					 | 
				
			||||||
		STATUS "setting global font size to '$I3__GLOBAL_FONT_SIZE'"
 | 
					 | 
				
			||||||
		CONFIG=$(echo $CONFIG | sed "s/$REGEX_FONT/\\1$I3__GLOBAL_FONT_SIZE/")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[ $I3__DMENU_FONT_SIZE ] && {
 | 
					 | 
				
			||||||
		STATUS "setting dmenu font size to '$I3__DMENU_FONT_SIZE'"
 | 
					 | 
				
			||||||
		CONFIG=$(echo $CONFIG | sed "s/$REGEX_DMENU/\\1$I3__DMENU_FONT_SIZE'/")
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[ $I3__BORDER_PIXEL_SIZE ] && {
 | 
					 | 
				
			||||||
		STATUS "setting border pixel size to '$I3__BORDER_PIXEL_SIZE'"
 | 
					 | 
				
			||||||
		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" \
 | 
					 | 
				
			||||||
		&& INFO "no changes were made" \
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[[ $AUTOLINK -eq 1 ]] \
 | 
					 | 
				
			||||||
		&& diff "$CONFIG_FILE" "$I3__MODEL_CONFIG" -q >/dev/null \
 | 
					 | 
				
			||||||
		&& rm "$CONFIG_FILE" \
 | 
					 | 
				
			||||||
		&& ln -s "$I3__MODEL_CONFIG" "$CONFIG_FILE" \
 | 
					 | 
				
			||||||
		&& INFO "output is the same as model, i3config has been linked to model" \
 | 
					 | 
				
			||||||
		;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[[ $FORCE -eq 1 ]] && rm "$CONFIG.bak" >/dev/null 2>&1
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
INSTALL $@
 | 
					 | 
				
			||||||
@@ -1,136 +0,0 @@
 | 
				
			|||||||
#!/bin/zsh
 | 
					 | 
				
			||||||
DEPENDENCIES+=(
 | 
					 | 
				
			||||||
	i3-msg
 | 
					 | 
				
			||||||
	xdotool
 | 
					 | 
				
			||||||
	xrandr
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
REQUIRED_ENV+=()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
use system/desktop/notify
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CHECK_ENVIRONMENT
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LAUNCH_OR_SHOW() {
 | 
					 | 
				
			||||||
	INFO $@
 | 
					 | 
				
			||||||
	local USAGE="
 | 
					 | 
				
			||||||
		usage: <path-executable> [client-class] [...options...]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		options
 | 
					 | 
				
			||||||
		  -c, --client <string>   if different from the executable name, xprop CLIENT_CLASS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		  -s, --scale <value>     (default: 0.8 or 0.5 if screen width >3000px)
 | 
					 | 
				
			||||||
		  -x, --x-offset <value>  (default: 0.0)
 | 
					 | 
				
			||||||
		  -y, --y-offset <value>  (default: 0.0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		  -a, --always-launch     invoke executable even if client-class exists
 | 
					 | 
				
			||||||
		  -n, --no-resize         don't resize the window (ignores -sxy flags)
 | 
					 | 
				
			||||||
		  -l, --no-center         leave the window wherever it was last positioned
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		  --has-statusbar-icon    (default: false) use if program has a statusbar icon
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		  -h, --help              print this message and exit
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		Makes it easy to bind appications to key shortcuts without having to
 | 
					 | 
				
			||||||
		spin up redundant instances or cycle through the scratchpad queue.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		Performs a variety of tasks based on states:
 | 
					 | 
				
			||||||
		  1) starts and application
 | 
					 | 
				
			||||||
		  2) adds all instances of the specified application to the scratchpad
 | 
					 | 
				
			||||||
		  3) (toggle) hides all visible instances
 | 
					 | 
				
			||||||
		  4) (toggle) shows all scratchpad-hidden instances
 | 
					 | 
				
			||||||
	"
 | 
					 | 
				
			||||||
	local APPLICATION CLIENT_CLASS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local XFFSET=0.0
 | 
					 | 
				
			||||||
	local YFFSET=0.0
 | 
					 | 
				
			||||||
	local SCALE=0.8
 | 
					 | 
				
			||||||
	[[ $(xrandr | grep primary | awk '{print $4;}' | sed 's/x.*//') -gt 3000 ]] \
 | 
					 | 
				
			||||||
		&& SCALE=0.5
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local ALWAYS_LAUNCH=0
 | 
					 | 
				
			||||||
	local RESIZE=1
 | 
					 | 
				
			||||||
	local MOVE=1
 | 
					 | 
				
			||||||
	local MIN_ACTIVE=1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	while [[ $# -gt 0 ]]
 | 
					 | 
				
			||||||
	do
 | 
					 | 
				
			||||||
		case $1 in 
 | 
					 | 
				
			||||||
			-c | --client   ) CLIENT_CLASS="$2"; shift 1 ;;
 | 
					 | 
				
			||||||
			-x | --x-offset ) XFFSET=$2; shift 1 ;;
 | 
					 | 
				
			||||||
			-y | --y-offset ) YFFSET=$2; shift 1 ;;
 | 
					 | 
				
			||||||
			-s | --scale    ) SCALE=$2;  shift 1 ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			-a | --always-launch ) ALWAYS_LAUNCH=1 ;;
 | 
					 | 
				
			||||||
			-n | --no-resize     ) RESIZE=0 ;;
 | 
					 | 
				
			||||||
			-l | --no-center     ) MOVE=0 ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			--has-statusbar-icon ) MIN_ACTIVE=2 ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			-h | --help ) USAGE; exit 0 ;;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			* )
 | 
					 | 
				
			||||||
				[ ! $APPLICATION  ] && APPLICATION="$1" \
 | 
					 | 
				
			||||||
					|| ERROR "extra positional argument '$1'"
 | 
					 | 
				
			||||||
		esac
 | 
					 | 
				
			||||||
		shift 1
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[ ! $APPLICATION  ] && ERROR 'path-executable required'
 | 
					 | 
				
			||||||
	[ ! $CLIENT_CLASS ] && CLIENT_CLASS=$APPLICATION
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[ $APPLICATION ] && {
 | 
					 | 
				
			||||||
		__CHECK_DEPENDENCY $APPLICATION || {
 | 
					 | 
				
			||||||
			ERROR "$APPLICATION is not installed"
 | 
					 | 
				
			||||||
			NOTIFY "ERROR: $APPLICATION not found"
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	CHECK_ERRORS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	xrandr | grep primary | awk '{print $4;}' | grep -q '^[0-9]\+$' || {
 | 
					 | 
				
			||||||
		xrandr --output $(xrandr | grep ' connected' | awk '{print $1;}' | head -n1) --primary
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local CURRENTLY_ACTIVE=$(xdotool search --onlyvisible --classname $CLIENT_CLASS 2>/dev/null | wc -l)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local LAUNCH_APP=$ALWAYS_LAUNCH
 | 
					 | 
				
			||||||
	STATUS "looking for window process ids"
 | 
					 | 
				
			||||||
	xdotool search --class $CLIENT_CLASS || LAUNCH_APP=1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[[ $LAUNCH_APP -eq 1 ]] && {
 | 
					 | 
				
			||||||
		STATUS 'launching application'
 | 
					 | 
				
			||||||
		i3-msg "exec --no-startup-id $APPLICATION;"
 | 
					 | 
				
			||||||
		sleep .5
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	STATUS 'getting target window size'
 | 
					 | 
				
			||||||
	WINDOW_SIZE=$(\
 | 
					 | 
				
			||||||
		xrandr \
 | 
					 | 
				
			||||||
			| grep 'connected primary' \
 | 
					 | 
				
			||||||
			| sed 's/.*connected primary \([^x]*\)x\([^+]*\).*/\1 \2/' \
 | 
					 | 
				
			||||||
			| awk -v f=$SCALE -v x=$XFFSET -v y=$YFFSET \
 | 
					 | 
				
			||||||
				'{print int($1*f+x)," ",int($2*f+y);}'\
 | 
					 | 
				
			||||||
	)
 | 
					 | 
				
			||||||
	INFO "window size: $WINDOW_SIZE"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	STATUS 'moving window to scratchpad'
 | 
					 | 
				
			||||||
	i3-msg "[class=$CLIENT_CLASS] move scratchpad"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[[ $RESIZE -eq 1 ]] \
 | 
					 | 
				
			||||||
		&& STATUS 'resizing window' \
 | 
					 | 
				
			||||||
		&& i3-msg "[class=$CLIENT_CLASS] resize set $WINDOW_SIZE"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	[[ $CURRENTLY_ACTIVE -lt $MIN_ACTIVE ]] && {
 | 
					 | 
				
			||||||
		STATUS 'pulling window from scratchpad to foreground'
 | 
					 | 
				
			||||||
		i3-msg "[class=$CLIENT_CLASS] scratchpad show"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	STATUS 'moving window to center of current screen'
 | 
					 | 
				
			||||||
	[[ $MOVE -eq 1 ]] && i3-msg "[class=$CLIENT_CLASS] move position center"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#####################################################################
 | 
					 | 
				
			||||||
LAUNCH_OR_SHOW $@
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user