#!/usr/bin/env bash #:Usage: mcorners [-tl cmd] [-t cmd] [-tr cmd] [-l cmd] [-r cmd] [-bl cmd] [-b cmd] [-br cmd] [-iof] [-v] #: #: cmd: run the command when mouse reach to the edge of screen: #: #: -tl cmd top-left #: -t cmd top #: -tr cmd top-right #: -l cmd left #: -r cmd right #: -bl cmd bottom-left #: -b cmd bottom #: -br cmd bottom-right #: -iof, --ignore-on-fullscreen disable command when active window #: is fullscreen. #: --stop force stop mcorners if it's running #: -v verbose output #: -h show the help #: # same as py version before, but faster eval $(xdotool getdisplaygeometry --shell) G=2;MR=8 W=$((WIDTH-G)); H=$((HEIGHT-G)); DB=/tmp/mcorners.lck; #my E=200; X1=$((WIDTH/2-E/2));X2=$((X1+E));Y1=$((HEIGHT/2-E/2));Y2=$((Y1+E)); #my usage() { grep "^#:" $0 | while read DOC; do printf '%s\n' "${DOC###:}"; done exit } options() { while [[ "$1" ]]; do case "$1" in "-tl") tl="$2" ;; "-t") t="$2" ;; "-tr") tr="$2" ;; "-l") l="$2" ;; "-r") r="$2" ;; "-bl") bl="$2" ;; "-b") b="$2" ;; "-br") br="$2" ;; "-iof"|"--ignore-on-fullscreen") iof=1 ;; "--stop") kill -9 $(cat $DB) && exit ;; "-v") verbose=1 ;; ""|"-h"|"--help") usage ;; esac shift done } delay() { local IFS [[ -n "${_de:-}" ]] || exec {_de}<> <(:) read ${1:+-t "$1"} -u $_de || : } invoke() { pkill -f jgmenu proc=$(IFS=" "; set -- $1; echo $1) id="$(pidof -x "$proc")" if [[ -n "$verbose" ]]; then [[ -z "$id" ]] && (eval "$1" &) || (kill -9 $id &) else [[ -z "$id" ]] && (eval "$1" 2&>/dev/null &) || (kill -9 $id 2&>/dev/null &) fi xdotool mousemove $2 $3 delay 1.2 } quithandler() { rm -f $DB exit $? } trap quithandler SIGINT SIGTERM EXIT [[ -f "$DB" && -z "$(cat $DB | xargs ps -p)" ]] && rm -rf $DB [[ -z "$@" ]] && usage || options "$@" if [[ ! -f "$DB" ]]; then while :;do [[ ! -f "$DB" ]] && printf "%s\n" $$ >$DB eval $(xdotool getmouselocation --shell) if [[ -n "$iof" && -n "$(xdotool getactivewindow 2>/dev/null | xargs xprop -id 2>/dev/null | grep E_FULLS)" ]]; then delay 0.8 else [[ -n "$tl" && "$X" -lt "$G" && "$Y" -lt "$G" ]] && invoke "$tl" $((X+MR)) $((Y+MR)) [[ -n "$t" && "$X" -gt "$X1" && "$X" -lt "$X2" && "$Y" -lt "$G" ]] && invoke "$t" $((X-0)) $((Y+MR)) [[ -n "$tr" && "$X" -gt "$W" && "$X" -le "$WIDTH" && "$Y" -lt "$G" ]] && invoke "$tr" $((X-MR)) $((Y+MR)) [[ -n "$l" && "$X" -lt "$G" && "$Y" -gt "$Y1" && "$Y" -lt "$Y2" ]] && invoke "$l" $((X+MR)) $((Y+0)) [[ -n "$r" && "$X" -gt "$W" && "$X" -le "$WIDTH" && "$Y" -gt "$Y1" && "$Y" -lt "$Y2" ]] && invoke "$r" $((X-MR)) $((Y+0)) [[ -n "$bl" && "$X" -lt "$G" && "$Y" -gt "$H" ]] && invoke "$bl" $((X+MR)) $((Y-MR)) [[ -n "$b" && "$X" -gt "$X1" && "$X" -lt "$X2" && "$Y" -gt "$H" ]] && invoke "$b" $((X+0)) $((Y-MR)) [[ -n "$br" && "$X" -gt "$W" && "$X" -le "$WIDTH" && "$Y" -gt "$H" ]] && invoke "$br" $((X-MR)) $((Y-MR)) fi delay 0.2 done exit 0 else printf "Lock Exists: Mcorners is running at PID $(cat $DB). run \"mcorners --stop\" to close it.\n" exit 1 fi