mirror of
https://git.sr.ht/~roxwize/.dotfiles
synced 2025-02-12 04:22:07 +00:00
~
This commit is contained in:
parent
31500a22ec
commit
14a4f4d391
5 changed files with 760 additions and 26 deletions
33
configs/openbox/menu.xml
Normal file
33
configs/openbox/menu.xml
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openbox_menu xmlns="http://openbox.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://openbox.org/ file:///usr/share/openbox/menu.xsd">
|
||||||
|
<menu id="root" label="Menu">
|
||||||
|
<item label="Browser">
|
||||||
|
<action name="Execute">
|
||||||
|
<command>firefox</command>
|
||||||
|
</action>
|
||||||
|
</item>
|
||||||
|
<item label="Terminal">
|
||||||
|
<action name="Execute">
|
||||||
|
<command>kitty</command>
|
||||||
|
</action>
|
||||||
|
</item>
|
||||||
|
<item label="Task Manager">
|
||||||
|
<action name="Execute">
|
||||||
|
<command>xfce4-taskmanager</command>
|
||||||
|
</action>
|
||||||
|
</item>
|
||||||
|
<separator/>
|
||||||
|
<item label="Restart">
|
||||||
|
<action name="Execute">
|
||||||
|
<command>reboot now</command>
|
||||||
|
<prompt>Really shutdown the computer?</prompt>
|
||||||
|
</action>
|
||||||
|
</item>
|
||||||
|
<item label="Shutdown">
|
||||||
|
<action name="Execute">
|
||||||
|
<command>shutdown now</command>
|
||||||
|
<prompt>Really shutdown the computer?</prompt>
|
||||||
|
</action>
|
||||||
|
</item>
|
||||||
|
</menu>
|
||||||
|
</openbox_menu>
|
|
@ -52,4 +52,13 @@
|
||||||
</action>
|
</action>
|
||||||
</keybind>
|
</keybind>
|
||||||
</keyboard>
|
</keyboard>
|
||||||
|
<mouse>
|
||||||
|
<context name="Root">
|
||||||
|
<mousebind button="Right" action="Click">
|
||||||
|
<action name="ShowMenu">
|
||||||
|
<menu>root</menu>
|
||||||
|
</action>
|
||||||
|
</mousebind>
|
||||||
|
</context>
|
||||||
|
</mouse>
|
||||||
</openbox_config>
|
</openbox_config>
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
imports = [
|
imports = [
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
../../home.nix
|
../../home.nix
|
||||||
|
../../packages.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.loader = {
|
boot.loader = {
|
||||||
|
@ -93,32 +94,6 @@
|
||||||
shell = pkgs.fish;
|
shell = pkgs.fish;
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
# system tools
|
|
||||||
bat
|
|
||||||
btop
|
|
||||||
ffmpeg
|
|
||||||
git
|
|
||||||
gparted
|
|
||||||
hyfetch
|
|
||||||
imagemagick
|
|
||||||
kitty
|
|
||||||
xclip
|
|
||||||
yt-dlp
|
|
||||||
zellij
|
|
||||||
# text editors
|
|
||||||
neovim
|
|
||||||
vscodium
|
|
||||||
# X11
|
|
||||||
hsetroot
|
|
||||||
nitrogen
|
|
||||||
polybar
|
|
||||||
rofi
|
|
||||||
xcompmgr
|
|
||||||
# misc
|
|
||||||
uxn
|
|
||||||
];
|
|
||||||
|
|
||||||
# Open ports in the firewall.
|
# Open ports in the firewall.
|
||||||
# networking.firewall.allowedTCPPorts = [ ... ];
|
# networking.firewall.allowedTCPPorts = [ ... ];
|
||||||
# networking.firewall.allowedUDPPorts = [ ... ];
|
# networking.firewall.allowedUDPPorts = [ ... ];
|
||||||
|
|
31
nixos/packages.nix
Normal file
31
nixos/packages.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
# system tools
|
||||||
|
bat
|
||||||
|
btop
|
||||||
|
ffmpeg
|
||||||
|
git
|
||||||
|
gparted
|
||||||
|
hyfetch
|
||||||
|
imagemagick
|
||||||
|
kitty
|
||||||
|
xclip
|
||||||
|
yt-dlp
|
||||||
|
zellij
|
||||||
|
# text editors
|
||||||
|
neovim
|
||||||
|
vscodium
|
||||||
|
# X11
|
||||||
|
hsetroot
|
||||||
|
nitrogen
|
||||||
|
polybar
|
||||||
|
rofi
|
||||||
|
xcompmgr
|
||||||
|
xdotool
|
||||||
|
xorg.xev
|
||||||
|
xorg.xwininfo
|
||||||
|
# misc
|
||||||
|
uxn
|
||||||
|
];
|
||||||
|
}
|
686
scripts/hideIt.sh
Normal file
686
scripts/hideIt.sh
Normal file
|
@ -0,0 +1,686 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Automagically hide/show a window by its name when the cursor is
|
||||||
|
# within a defined region or you mouse over it.
|
||||||
|
#
|
||||||
|
# This script was initially written to imitate gnome-shell's systray
|
||||||
|
# but should be generic enough to do other things as well.
|
||||||
|
#
|
||||||
|
# Requirements:
|
||||||
|
# bash, xdotool, xwininfo, xev
|
||||||
|
#
|
||||||
|
|
||||||
|
# Global variables used throughout the script
|
||||||
|
WIN_ID=""
|
||||||
|
WIN_NAME=""
|
||||||
|
WIN_CLASS=""
|
||||||
|
WIN_INSTANCE=""
|
||||||
|
WAIT=1
|
||||||
|
|
||||||
|
WIN_WIDTH=""
|
||||||
|
WIN_HEIGHT=""
|
||||||
|
WIN_POSX=""
|
||||||
|
WIN_POSY=""
|
||||||
|
|
||||||
|
SCREEN_WIDTH=""
|
||||||
|
SCREEN_HEIGHT=""
|
||||||
|
|
||||||
|
MINX=""
|
||||||
|
MINY=""
|
||||||
|
MAXX=""
|
||||||
|
MAXY=""
|
||||||
|
|
||||||
|
HOVER=1
|
||||||
|
SIGNAL=1
|
||||||
|
INTERVAL=1
|
||||||
|
PEEK=3
|
||||||
|
DIRECTION="left"
|
||||||
|
STEPS=3
|
||||||
|
NO_TRANS=1
|
||||||
|
TOGGLE=1
|
||||||
|
TOGGLE_PEEK=1
|
||||||
|
|
||||||
|
_IS_HIDDEN=1
|
||||||
|
_DOES_PEEK=0
|
||||||
|
_HAS_REGION=1
|
||||||
|
_WAIT_PID=""
|
||||||
|
_PID_FILE=""
|
||||||
|
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
# Print usage
|
||||||
|
printf "usage: $0 [options]\n"
|
||||||
|
printf "\n"
|
||||||
|
printf "Required (At least on):\n"
|
||||||
|
printf " -N, --name [pattern]\n"
|
||||||
|
printf " Match against the window name.\n"
|
||||||
|
printf " This is the same string that is displayed in the window titlebar.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -C, --class [pattern]\n"
|
||||||
|
printf " Match against the window class.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -I, --instance [pattern]\n"
|
||||||
|
printf " Match against the window instance.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " --id [window-id]\n"
|
||||||
|
printf " Explicitly specify a window id rather than searching for one.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf "Optional:\n"
|
||||||
|
printf " -w, --wait\n"
|
||||||
|
printf " Wait until a matching window was found.\n"
|
||||||
|
printf " This will check once every second.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -r, --region [posXxposY+offsetX+offsetY]\n"
|
||||||
|
printf " Cursor region at which to trigger.\n"
|
||||||
|
printf " Examples:\n"
|
||||||
|
printf " --region 0x1080+10+-10 (Bottom left incl. a 10 pixel offset)\n"
|
||||||
|
printf " --region 1920x1080+0+0 (Bottom right without offset)\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -H, --hover\n"
|
||||||
|
printf " Show the window when hovering over it.\n"
|
||||||
|
printf " If --region was defined, --hover will be ignored!\n"
|
||||||
|
printf " This will only work if --peek is greater 0.\n"
|
||||||
|
printf " By default, hover is off.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -S, --signal\n"
|
||||||
|
printf " Toggle the visibility by sending a 'SIGUSR1' signal.\n"
|
||||||
|
printf " Both --region and --hover will be ignored.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -i, --interval [interval]\n"
|
||||||
|
printf " Interval in seconds to check the cursors location.\n"
|
||||||
|
printf " Defaults to 1.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -p, --peek [amount]\n"
|
||||||
|
printf " When hidden, peek 'amount' of pixels to indicate the window.\n"
|
||||||
|
printf " Required if --hover is used."
|
||||||
|
printf " Defaults to 3.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -d, --direction [left|right|top|bottom]\n"
|
||||||
|
printf " direction in which to move the window.\n"
|
||||||
|
printf " Defaults to left.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -s, --steps [amount]\n"
|
||||||
|
printf " steps in pixel used to move the window. The higher the value,\n"
|
||||||
|
printf " the faster it will move at the cost of smoothness.\n"
|
||||||
|
printf " Defaults to 3.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -T, --no-trans\n"
|
||||||
|
printf " Turn of the transition effect.\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " -t, --toggle\n"
|
||||||
|
printf " Send a SIGUSR1 signal to the process matching the same window.\n"
|
||||||
|
printf " This will toggle the visibility of the window."
|
||||||
|
printf "\n\n"
|
||||||
|
printf " -P, --toggle-peek\n"
|
||||||
|
printf " Send a SIGUSR2 signal to the process matching the same window.\n"
|
||||||
|
printf " This will toggle the hidden state of the window if --peek is greater 0."
|
||||||
|
printf "\n\n"
|
||||||
|
printf "Examples:\n"
|
||||||
|
printf " Dropdown Terminal:\n"
|
||||||
|
printf " # Start a terminal with a unique name\n"
|
||||||
|
printf " # (Make sure yourself it is positioned correctly)\n"
|
||||||
|
printf " $ termite --title=dropdown-terminal &\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " # Hide it and wait for a SIGUSR1 signal\n"
|
||||||
|
printf " $ hideIt.sh --name '^dropdown-terminal$' --direction top --steps 5 --signal\n"
|
||||||
|
printf "\n"
|
||||||
|
printf " # Send a SIGUSR1 signal (This could be mapped to a keyboard shortcut)\n"
|
||||||
|
printf " $ hideIt.sh --name '^dropdown-terminal$' --toggle\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
argparse() {
|
||||||
|
# Parse system args
|
||||||
|
|
||||||
|
while [ $# -gt 0 ]; do
|
||||||
|
case $1 in
|
||||||
|
"-N"|"--name")
|
||||||
|
WIN_NAME="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-C"|"--class")
|
||||||
|
WIN_CLASS="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-I"|"--instance")
|
||||||
|
WIN_INSTANCE="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"--id")
|
||||||
|
if [[ ! $2 =~ [0-9]+ ]]; then
|
||||||
|
printf "Invalid window id. Should be a number.\n" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
WIN_ID="$2"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-w"|"--wait")
|
||||||
|
WAIT=0
|
||||||
|
;;
|
||||||
|
"-H"|"--hover")
|
||||||
|
HOVER=0
|
||||||
|
;;
|
||||||
|
"-S"|"--signal")
|
||||||
|
SIGNAL=0
|
||||||
|
;;
|
||||||
|
"-r"|"--region")
|
||||||
|
local posX posY offsetX offsetY
|
||||||
|
read posX posY offsetX offsetY <<<$(echo "$2" | \
|
||||||
|
sed -rn 's/^([0-9]+)x([0-9]+)\+(-?[0-9]+)\+(-?[0-9]+)/\1 \2 \3 \4/p')
|
||||||
|
|
||||||
|
# Test if we have proper values by trying
|
||||||
|
# to add them all together
|
||||||
|
expr $posX + $posY + $offsetX + $offsetY > /dev/null 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
printf "Invalid region. See --help for usage.\n" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
MINX=$posX
|
||||||
|
MAXX=$((${MINX} + ${offsetX}))
|
||||||
|
if [ $MINX -gt $MAXX ]; then
|
||||||
|
read MINX MAXX <<< "$MAXX $MINX"
|
||||||
|
fi
|
||||||
|
|
||||||
|
MINY=$posY
|
||||||
|
MAXY=$((${MINY} + ${offsetY}))
|
||||||
|
if [ $MINY -gt $MAXY ]; then
|
||||||
|
read MINY MAXY <<< "$MAXY $MINY"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! $MINX =~ [0-9]+ ]] || [[ ! $MINY =~ [0-9]+ ]] \
|
||||||
|
|| [[ ! $MAXY =~ [0-9]+ ]] || [[ ! $MAXY =~ [0-9]+ ]]; then
|
||||||
|
printf "Missing or invalid region. See --help for usage.\n" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
_HAS_REGION=0
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-i"|"--interval")
|
||||||
|
INTERVAL="$2"
|
||||||
|
if [[ ! $INTERVAL =~ [0-9]+ ]]; then
|
||||||
|
printf "Interval should be a number. " 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-p"|"--peek")
|
||||||
|
PEEK="$2"
|
||||||
|
if [[ ! $PEEK =~ [0-9]+ ]]; then
|
||||||
|
printf "Peek should be a number. " 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-d"|"--direction")
|
||||||
|
DIRECTION="$2"
|
||||||
|
if [[ ! "$DIRECTION" =~ ^(left|right|top|bottom)$ ]]; then
|
||||||
|
printf "Invalid direction. See --help for usage.\n" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-s"|"--steps")
|
||||||
|
STEPS="$2"
|
||||||
|
if [[ ! $STEPS =~ [0-9]+ ]]; then
|
||||||
|
printf "Steps should be a number. " 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
"-T"|"--no-trans")
|
||||||
|
NO_TRANS=0
|
||||||
|
;;
|
||||||
|
"-t"|"--toggle")
|
||||||
|
TOGGLE=0
|
||||||
|
;;
|
||||||
|
"-P"|"--toggle-peek")
|
||||||
|
TOGGLE_PEEK=0
|
||||||
|
;;
|
||||||
|
"-h"|"--help")
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
**)
|
||||||
|
printf "Didn't understand '$1'\n" 1>&2
|
||||||
|
printf "See --help for usage.\n"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# Check required arguments
|
||||||
|
local _names="${WIN_ID}${WIN_NAME}${WIN_CLASS}${WIN_INSTANCE}"
|
||||||
|
if [ -z "$_names" ] && [ -z "$WIN_ID" ]; then
|
||||||
|
printf "At least one of --name, --class, --instance or --id" 1>&2
|
||||||
|
printf " is required!\n" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $TOGGLE -ne 0 ] && [ $TOGGLE_PEEK -ne 0 ] && [ $SIGNAL -ne 0 ] \
|
||||||
|
&& [ $_HAS_REGION -ne 0 ] && [ $HOVER -ne 0 ]; then
|
||||||
|
printf "At least one of --toggle, --signal, --hover or" 1>&2
|
||||||
|
printf " --region is required!\n" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function fetch_window_id() {
|
||||||
|
# Sets the values for the following global
|
||||||
|
# WIN_ID
|
||||||
|
|
||||||
|
# We already have a window id
|
||||||
|
if [ ! -z "$WIN_ID" ]; then
|
||||||
|
_PID_FILE="/tmp/hideIt-${WIN_ID}.pid"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local _id=-1
|
||||||
|
|
||||||
|
# Search all windows matching the provided class
|
||||||
|
local _tmp1=()
|
||||||
|
if [ ! -z "$WIN_CLASS" ]; then
|
||||||
|
_tmp1=($(xdotool search --class "$WIN_CLASS"))
|
||||||
|
_tmp1=${_tmp1:--1}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Search all windows matching the provided instance
|
||||||
|
local _tmp2=()
|
||||||
|
if [ ! -z "$WIN_INSTANCE" ]; then
|
||||||
|
_tmp2=($(xdotool search --classname "$WIN_INSTANCE"))
|
||||||
|
_tmp2=${_tmp2:--1}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Search all windows matching the provided name (title)
|
||||||
|
local _tmp3=()
|
||||||
|
if [ ! -z "$WIN_NAME" ]; then
|
||||||
|
_tmp3=($(xdotool search --name "$WIN_NAME"))
|
||||||
|
_tmp3=${_tmp3:--1}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Shift values upwards
|
||||||
|
for i in {1..2}; do
|
||||||
|
if [ -z $_tmp1 ]; then
|
||||||
|
_tmp1=(${_tmp2[@]})
|
||||||
|
_tmp2=()
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z $_tmp2 ]; then
|
||||||
|
_tmp2=(${_tmp3[@]})
|
||||||
|
_tmp3=()
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z $_tmp2 ]; then
|
||||||
|
# We only have one list of ids so we pick the first one from it
|
||||||
|
_id=${_tmp1[0]}
|
||||||
|
else
|
||||||
|
# We have multiple lists so we have to find the id that appears
|
||||||
|
# in all of them
|
||||||
|
local _oldIFS=$IFS
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
|
local _ids=($(comm -12 \
|
||||||
|
<(echo "${_tmp1[*]}" | sort) \
|
||||||
|
<(echo "${_tmp2[*]}" | sort)))
|
||||||
|
|
||||||
|
if [ ! -z $_tmp3 ]; then
|
||||||
|
_ids=($(comm -12 \
|
||||||
|
<(echo "${_tmp3[*]}" | sort) \
|
||||||
|
<(echo "${_ids[*]}" | sort)))
|
||||||
|
fi
|
||||||
|
IFS=$_oldIFS
|
||||||
|
|
||||||
|
_id=${_ids[0]}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $_id =~ [0-9]+ ]] && [ $_id -gt 0 ]; then
|
||||||
|
WIN_ID=$_id
|
||||||
|
_PID_FILE="/tmp/hideIt-${WIN_ID}.pid"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function fetch_screen_dimensions() {
|
||||||
|
# Sets the values for the following globals
|
||||||
|
# SCREEN_WIDTH, SCREEN_HEIGHT
|
||||||
|
|
||||||
|
local win_info=$(xwininfo -root)
|
||||||
|
SCREEN_WIDTH=$(echo "$win_info" | sed -rn 's/.*Width: +([0-9]+)/\1/p')
|
||||||
|
SCREEN_HEIGHT=$(echo "$win_info" | sed -rn 's/.*Height: +([0-9]+)/\1/p')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function fetch_window_dimensions() {
|
||||||
|
# Sets the values for the following globals unless no WIN_ID exists
|
||||||
|
# WIN_WIDTH, WIN_HEIGHT, WIN_POSX, WIN_POSY
|
||||||
|
|
||||||
|
if [[ ! $WIN_ID =~ [0-9]+ ]]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local win_info=$(xwininfo -id $WIN_ID)
|
||||||
|
|
||||||
|
WIN_WIDTH=$(echo "$win_info" | sed -rn 's/.*Width: +([0-9]+)/\1/p')
|
||||||
|
WIN_HEIGHT=$(echo "$win_info" | sed -rn 's/.*Height: +([0-9]+)/\1/p')
|
||||||
|
|
||||||
|
if [ ! -z "$1" ] && [ $1 -eq 0 ]; then
|
||||||
|
WIN_POSX=$(echo "$win_info" | \
|
||||||
|
sed -rn 's/.*Absolute upper-left X: +(-?[0-9]+)/\1/p')
|
||||||
|
WIN_POSY=$(echo "$win_info" | \
|
||||||
|
sed -rn 's/.*Absolute upper-left Y: +(-?[0-9]+)/\1/p')
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function send_signal() {
|
||||||
|
# Send a SIGUSR1 to an active hideIt.sh instance
|
||||||
|
# if a pid file was found.
|
||||||
|
local signal=$1
|
||||||
|
if [ ! -f "$_PID_FILE" ]; then
|
||||||
|
printf "Pid file at \"${_PID_FILE}\" doesn't exist!\n" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local _pid=`cat $_PID_FILE`
|
||||||
|
printf "Sending ${signal} to instance...\n"
|
||||||
|
|
||||||
|
if [[ $_pid =~ [0-9]+ ]]; then
|
||||||
|
kill -${signal} $_pid
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
printf "Invalid pid in \"${_PID_FILE}\".\n" 1>&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function hide_window() {
|
||||||
|
# Move the window in or out
|
||||||
|
# Args:
|
||||||
|
# hide: 0 to hide, 1 to show
|
||||||
|
|
||||||
|
local hide=$1
|
||||||
|
|
||||||
|
# Make sure window still exists and exit if not.
|
||||||
|
xwininfo -id $WIN_ID &> /dev/null
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
printf "Window doesn't exist anymore, exiting!\n"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
_IS_HIDDEN=$hide
|
||||||
|
|
||||||
|
# Update WIN_WIDTH, WIN_HEIGHT in case they changed
|
||||||
|
fetch_window_dimensions
|
||||||
|
|
||||||
|
# Activate the window.
|
||||||
|
# Should bring it to the front, change workspace etc.
|
||||||
|
if [ $hide -ne 0 ]; then
|
||||||
|
xdotool windowactivate $WIN_ID > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Generate the sequence used to move the window
|
||||||
|
local to=()
|
||||||
|
local sequence=()
|
||||||
|
if [ "$DIRECTION" == "left" ]; then
|
||||||
|
to=-$(($WIN_WIDTH - $PEEK))
|
||||||
|
if [ $hide -eq 0 ]; then
|
||||||
|
sequence=($(seq $WIN_POSX -$STEPS $to))
|
||||||
|
sequence+=($to)
|
||||||
|
else
|
||||||
|
sequence=($(seq $to $STEPS $WIN_POSX))
|
||||||
|
sequence+=($WIN_POSX)
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [ "$DIRECTION" == "right" ]; then
|
||||||
|
to=$(($SCREEN_WIDTH - $PEEK))
|
||||||
|
if [ $hide -eq 0 ]; then
|
||||||
|
sequence=($(seq $WIN_POSX $STEPS $to))
|
||||||
|
sequence+=($to)
|
||||||
|
else
|
||||||
|
sequence=($(seq $to -$STEPS $WIN_POSX))
|
||||||
|
sequence+=($WIN_POSX)
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [ "$DIRECTION" == "bottom" ]; then
|
||||||
|
to=$(($SCREEN_HEIGHT - $PEEK))
|
||||||
|
if [ $hide -eq 0 ]; then
|
||||||
|
sequence=($(seq $WIN_POSY $STEPS $to))
|
||||||
|
sequence+=($to)
|
||||||
|
else
|
||||||
|
sequence=($(seq $to -$STEPS $WIN_POSY))
|
||||||
|
sequence+=($WIN_POSY)
|
||||||
|
fi
|
||||||
|
|
||||||
|
elif [ "$DIRECTION" == "top" ]; then
|
||||||
|
to=-$(($WIN_HEIGHT - $PEEK))
|
||||||
|
if [ $hide -eq 0 ]; then
|
||||||
|
sequence=($(seq $WIN_POSY -$STEPS $to))
|
||||||
|
sequence+=($to)
|
||||||
|
else
|
||||||
|
sequence=($(seq $to $STEPS $WIN_POSY))
|
||||||
|
sequence+=($WIN_POSY)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Actually move the window
|
||||||
|
if [ $NO_TRANS -ne 0 ]; then
|
||||||
|
for pos in ${sequence[@]}; do
|
||||||
|
if [[ "$DIRECTION" =~ ^(left|right)$ ]]; then
|
||||||
|
xdotool windowmove $WIN_ID $pos $WIN_POSY
|
||||||
|
elif [[ "$DIRECTION" =~ ^(top|bottom)$ ]]; then
|
||||||
|
xdotool windowmove $WIN_ID $WIN_POSX $pos
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
pos=${sequence[-1]}
|
||||||
|
if [[ "$DIRECTION" =~ ^(left|right)$ ]]; then
|
||||||
|
xdotool windowmove $WIN_ID $pos $WIN_POSY
|
||||||
|
elif [[ "$DIRECTION" =~ ^(top|bottom)$ ]]; then
|
||||||
|
xdotool windowmove $WIN_ID $WIN_POSX $pos
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# In case we hid the window, try to give focus to whatever is
|
||||||
|
# underneath the cursor.
|
||||||
|
if [ $hide -eq 0 ]; then
|
||||||
|
eval $(xdotool getmouselocation --shell)
|
||||||
|
xdotool windowactivate $WINDOW > /dev/null 2>&1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function toggle() {
|
||||||
|
# Toggle the hidden state of the window
|
||||||
|
|
||||||
|
if [ $_IS_HIDDEN -eq 0 ]; then
|
||||||
|
hide_window 1
|
||||||
|
else
|
||||||
|
hide_window 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggle_peek() {
|
||||||
|
# Completely hide/unhide the window in case PEEK is greater 0
|
||||||
|
|
||||||
|
if [ $PEEK -eq 0 ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local _peek=$PEEK
|
||||||
|
local _win_posx=$WIN_POSX
|
||||||
|
local _win_posy=$WIN_POSY
|
||||||
|
|
||||||
|
fetch_window_dimensions 0
|
||||||
|
|
||||||
|
if [ $_DOES_PEEK -eq 0 ]; then
|
||||||
|
_DOES_PEEK=1
|
||||||
|
PEEK=0
|
||||||
|
else
|
||||||
|
_DOES_PEEK=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
hide_window 0
|
||||||
|
|
||||||
|
PEEK=$_peek
|
||||||
|
WIN_POSX=$_win_posx
|
||||||
|
WIN_POSY=$_win_posy
|
||||||
|
}
|
||||||
|
|
||||||
|
function serve_region() {
|
||||||
|
# Check the cursors location and act accordingly
|
||||||
|
|
||||||
|
local _hide=0
|
||||||
|
while true; do
|
||||||
|
if [ $_DOES_PEEK -eq 0 ]; then
|
||||||
|
# Get cursor x, y position and active window
|
||||||
|
eval $(xdotool getmouselocation --shell)
|
||||||
|
|
||||||
|
# Test if the cursor is within the region
|
||||||
|
if [ $X -ge $MINX -a $X -le $MAXX ] \
|
||||||
|
&& [ $Y -ge $MINY -a $Y -le $MAXY ]; then
|
||||||
|
_hide=1
|
||||||
|
else
|
||||||
|
_hide=0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Don't hide if the cursor is still above the window
|
||||||
|
if [ $_IS_HIDDEN -ne 0 ] \
|
||||||
|
&& [ $_hide -eq 0 ] \
|
||||||
|
&& [ $WINDOW -eq $WIN_ID ]; then
|
||||||
|
_hide=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Only do something if necessary
|
||||||
|
if [ $_IS_HIDDEN -ne $_hide ]; then
|
||||||
|
hide_window $_hide
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Cut some slack
|
||||||
|
sleep $INTERVAL
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function serve_xev() {
|
||||||
|
# Wait for cursor "Enter" and "Leave" events reported by
|
||||||
|
# xev and act accordingly
|
||||||
|
|
||||||
|
xev -id $WIN_ID -event mouse | while read line; do
|
||||||
|
if [[ "$line" =~ ^EnterNotify.* ]]; then
|
||||||
|
hide_window 1
|
||||||
|
elif [[ "$line" =~ ^LeaveNotify.* ]]; then
|
||||||
|
hide_window 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function restore() {
|
||||||
|
# Called by trap once we receive an EXIT
|
||||||
|
|
||||||
|
if [ -n "$_WAIT_PID" ]; then
|
||||||
|
kill -- "-${_WAIT_PID}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$_PID_FILE" ]; then
|
||||||
|
rm "$_PID_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $_IS_HIDDEN -eq 0 ]; then
|
||||||
|
printf "Restoring original window position...\n"
|
||||||
|
hide_window 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
# Entry point for hideIt
|
||||||
|
|
||||||
|
# Parse all the args!
|
||||||
|
argparse "$@"
|
||||||
|
|
||||||
|
printf "Searching window...\n"
|
||||||
|
fetch_window_id
|
||||||
|
|
||||||
|
# If enabled, wait until a window was found.
|
||||||
|
if [ $WAIT -eq 0 ] && [[ ! $WIN_ID =~ [0-9]+ ]]; then
|
||||||
|
printf "Waiting for window"
|
||||||
|
while [[ ! $WIN_ID =~ [0-9]+ ]]; do
|
||||||
|
printf "."
|
||||||
|
fetch_window_id
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
printf "\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! $WIN_ID =~ [0-9]+ ]]; then
|
||||||
|
printf "No window found!\n" 1>&2
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
printf "Found window with id: $WIN_ID\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $TOGGLE -eq 0 ]; then
|
||||||
|
send_signal SIGUSR1
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $TOGGLE_PEEK -eq 0 ]; then
|
||||||
|
send_signal SIGUSR2
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf "Fetching window dimensions...\n"
|
||||||
|
fetch_window_dimensions 0
|
||||||
|
|
||||||
|
printf "Fetching screen dimensions...\n"
|
||||||
|
fetch_screen_dimensions
|
||||||
|
|
||||||
|
trap restore EXIT
|
||||||
|
|
||||||
|
printf "Initially hiding window...\n"
|
||||||
|
hide_window 0
|
||||||
|
|
||||||
|
# Save our pid into a file
|
||||||
|
echo "$$" > /tmp/hideIt-${WIN_ID}.pid
|
||||||
|
trap toggle_peek SIGUSR2
|
||||||
|
|
||||||
|
# Start observing
|
||||||
|
if [ $_HAS_REGION -eq 0 ]; then
|
||||||
|
printf "Defined region:\n"
|
||||||
|
printf " X: $MINX $MAXX\n"
|
||||||
|
printf " Y: $MINY $MAXY\n"
|
||||||
|
printf "\n"
|
||||||
|
printf "Waiting for region...\n"
|
||||||
|
serve_region &
|
||||||
|
_WAIT_PID=$!
|
||||||
|
elif [ $SIGNAL -eq 0 ]; then
|
||||||
|
printf "Waiting for SIGUSR1...\n"
|
||||||
|
trap toggle SIGUSR1
|
||||||
|
sleep infinity &
|
||||||
|
_WAIT_PID=$!
|
||||||
|
elif [ $HOVER -eq 0 ]; then
|
||||||
|
printf "Waiting for HOVER...\n"
|
||||||
|
serve_xev &
|
||||||
|
_WAIT_PID=$!
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$_WAIT_PID" ]; then
|
||||||
|
while true; do
|
||||||
|
wait "$_WAIT_PID"
|
||||||
|
printf "Received signal...\n"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Lets do disss!
|
||||||
|
set -m
|
||||||
|
main "$@"
|
Loading…
Add table
Reference in a new issue