You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.6 KiB
Bash

#!/bin/bash
# _ _ _ _
# __ _ ___ | |_| |__ | | ___| |_ _ _
# / _` |/ _ \| __| '_ \| |/ _ \ __| | | |
#| (_| | (_) | |_| |_) | | __/ |_| |_| |
# \__, |\___/ \__|_.__/|_|\___|\__|\__,_|
# |___/
# https://www.youtube.com/user/gotbletu
# https://twitter.com/gotbletu
# https://plus.google.com/+gotbletu
# https://github.com/gotbletu
# gotbletu@gmail.com
# tutorial video playlist: https://www.youtube.com/playlist?list=PLqv94xWU9zZ1cXfg3ED24G6RSt4NbFBfO
# description: move mouse cursor around, mouse clicks and drag using just the keyboard (vim style, wasd, numpad, or arrow keys)
# requirements: xdotool xterm wmctrl
# note: if you want to use this script by itself then bind commmand to a hotkey:
# xterm -geometry 0x0+0+0 -e /path/to/mousemove_mode.sh
# references:
# https://bbs.archlinux.org/viewtopic.php?pid=1106808#p1106808
# http://stackoverflow.com/a/10680015
# http://stackoverflow.com/a/11759139
# http://www.bbc.co.uk/accessibility/guides/keyboard_mouse/computer/linux/gnome/
# use to set always on top and refocusing
title="mousemove_mode.sh"
# Always on top: check if terminal script window is focus or not, if not then refocus it
refocus_window() {
while :
do
detect_focus_window=$(xdotool getwindowfocus getwindowname)
if [[ "$detect_focus_window" != "$title" ]]; then
wmctrl -a "$title"
fi
done
}
# background the process
refocus_window &
# movemouse/mouse clicks using xdotools (using vim, wasd, numpad or arrow keys)
while read -rsn1 key # 1 char (not delimiter), silent, dont need to hit enter key
do
# catch multi-char special key sequences
# allows special arrow keys to work
read -sN1 -t 0.0001 k1
read -sN1 -t 0.0001 k2
read -sN1 -t 0.0001 k3
key+=${k1}${k2}${k3}
case "$key" in
h|a|4|$'\e[D') xdotool mousemove_relative -- -15 0 ;; # move left
j|s|5|$'\e[B') xdotool mousemove_relative 0 15 ;; # move down
k|w|8|$'\e[A') xdotool mousemove_relative -- 0 -15 ;; # move up
l|d|6|$'\e[C') xdotool mousemove_relative 15 0 ;; # move right
u|e|7|'/') xdotool click 1 ;; # primary click
o|q|9|'-') sleep 0.2 && xdotool click 3 ;; # secondary click (menu click)
i|r|'*'|',') xdotool click 2 ;; # middle click
n|z|0) xdotool mousedown 1 ;; # highlight | drag&drop mode (begin)
m|x|'.') xdotool mouseup 1 ;; # highlight | drag&drop mode (end)
$'\e'|';'|'+') break ;; # quit
esac
done