#!/bin/bash # Borrowed from: # - http://bytefreaks.net/gnulinux/bash/howto-make-terminator-terminal-act-like-guake-terminal-in-fedora-20ubuntu-14-10 # The purpose of this script is to allow the user to toggle the visibility of # (almost) any window. Please note it will work on the first match, so if there # are multiple instances of an application it would be a random window of them # the one to be affected. # Only checks dependencies on request to keep toggling behavior as fast as # possible. if [ "$1" == "--install-deps" ]; then # Checking that all dependencies are met, since we cannot proceed without # them. DEPENDENCIES=("xdotool" "wmctrl") MANAGERS=("yum" "apt-get") echo "Checking dependencies:" for DEPENDENCY in ${DEPENDENCIES[@]}; do if hash $DEPENDENCY 2>/dev/null; then echo "- $DEPENDENCY: ok" else echo "- $DEPENDENCY: not found" for MANAGER in ${MANAGERS[@]}; do if hash $MANAGER 2>/dev/null; then echo -n "$DEPENDENCY is missing, would you like to try and install " \ "it via $MANAGER now? [Y/N] (default is Y): " read ANSWER if [[ "$ANSWER" == "Y" || "$ANSWER" == "y" || "$ANSWER" == "" ]]; then sudo "$MANAGER" install "$DEPENDENCY" else echo "Terminating" exit -1 fi fi done fi done exit 0 fi if [ "$1" == "-a" ]; then MOVE_TO="yes" shift 1 fi APP_NAME="$1" if [ -n "$2" ]; then APP_BIN="$2" else APP_BIN="$APP_NAME" fi if [ -n "$3" ]; then WIN_NAME="$3" else WIN_NAME="$APP_NAME" fi # Checking if the application name provided by the user exists if ! command -v "$APP_BIN" 2>/dev/null; then echo -e "$APP_BIN does not seem to be a valid executable\nTerminating" exit -2 fi # Check if a process matching APP_NAME exists, and in the case of multiple # processes (for example Slack), limit it to the first process which has a # window who's title matches WIN_NAME. PID="" for pid in $(pgrep "$APP_NAME"); do if xdotool search --all --onlyvisible --pid "$pid" --name "$WIN_NAME" &>/dev/null; then PID="$pid" break fi done # If the application is not running, we will try to launch it. if [ -z "$PID" ]; then echo "$APP_NAME not running, launching it.." "$APP_BIN" else # Since the application has a live instance, we can proceed with the rest of # the code. We will get the PID of the application that is currently focused, # if it is not the application we passed as parameter we will change the focus # to that. In the other case, we will minimize the application. echo -n "$APP_NAME instance found - " FOCUSED="$(xdotool getactivewindow getwindowpid)" if [[ "$PID" == "$FOCUSED" ]]; then echo "It was focused so we are minimizing it" # We minimize the active window which we know in this case that it is the # application we passed as parameter. xdotool getactivewindow windowminimize else echo "We are setting the focus on it" # We set the focus to the application we passed as parameter. If it is # minimized it will be raised as well. if [ "$MOVE_TO" == "yes" ]; then xdotool search --all --onlyvisible --pid "$PID" --name "$WIN_NAME" \ windowactivate else # This allows window name to be a regular expression WIN_TITLE="$(xdotool search --all --onlyvisible --pid "$PID" --name "$WIN_NAME" getwindowname)" wmctrl -R "$WIN_TITLE" fi fi fi