#!/bin/bash

# Created By: srdusr
# Created On: Tue 07 Mar 2023 15:06:47 PM CAT
# Project: Agnostic dropdown/scratchpad terminal that works on most window managers

## List of supported terminals with dropdown class
#supported_terminals=(
#  "wezterm"
#  "kitty"
#  "alacritty"
#)
#
## Check if any of the supported terminals with dropdown class are running
#for term in "${supported_terminals[@]}"; do
#  if pgrep -f "$term.*--class dropdown" > /dev/null; then
#    my_term="$term"
#    break
#  fi
#done
#
## If none of the supported terminals are running, start the first available one
#if [ -z "$my_term" ]; then
#  for term in "${supported_terminals[@]}"; do
#    if command -v "$term" > /dev/null 2>&1; then
#      my_term="$term"
#      break
#    fi
#  done
#  if [ -z "$my_term" ]; then
#    echo "No supported terminal found."
#    exit 1
#  fi
#
#  # Start the terminal with dropdown class
#  case "$my_term" in
#    "wezterm")
#      wezterm start --class dropdown -e tmux new-session -A -s dropdown -e bash > /dev/null 2>&1 &
#      ;;
#    "kitty")
#      kitty --class dropdown tmux new-session -A -s dropdown -e bash > /dev/null 2>&1 &
#      ;;
#    "alacritty")
#      alacritty --class dropdown -e tmux new-session -A -s dropdown -e bash > /dev/null 2>&1 &
#      ;;
#  esac
#fi
#
## Get the window ID of the dropdown terminal
#id="$(xdo id -N dropdown)"
#
## Toggle the visibility of the dropdown terminal
#if [ -n "$id" ]; then
#  if xwininfo -id "$id" | grep "Map State: IsViewable" > /dev/null; then
#    # The dropdown window is visible, so hide it
#    dimensions="$(xwininfo -id "$id" | awk '/Width:|Height:/ { printf("%s=%s;", tolower($1), $2) }')"
#    xdo hide "$id" 2>/dev/null
#  else
#    # The dropdown window is hidden, so show it
#    xdo show "$id"
#    # Restore the dimensions of the window
#    xdotool windowsize "$id" "$(echo "$dimensions" | tr ';' ' ')" 2>/dev/null
#  fi
#fi






# List of supported terminals with dropdown class
supported_terminals=(
  "wezterm"
  "kitty"
  "alacritty"
)

# Check if any of the supported terminals with dropdown class are running
for term in "${supported_terminals[@]}"; do
  if pgrep -f "$term.*--class dropdown" > /dev/null; then
    my_term="$term"
    break
  fi
done

# If none of the supported terminals are running, start the first available one
if [ -z "$my_term" ]; then
  for term in "${supported_terminals[@]}"; do
    if command -v "$term" > /dev/null 2>&1; then
      my_term="$term"
      break
    fi
  done
  if [ -z "$my_term" ]; then
    echo "No supported terminal found."
    exit 1
  fi

  # Start the terminal with dropdown class
  case "$my_term" in
    "wezterm")
      wezterm start --class dropdown -e tmux new-session -A -s dropdown -e bash > /dev/null 2>&1 &
      ;;
    "kitty")
      kitty --class dropdown tmux new-session -A -s dropdown -e bash > /dev/null 2>&1 &
      ;;
    "alacritty")
      alacritty --class dropdown -e tmux new-session -A -s dropdown -e bash > /dev/null 2>&1 &
      ;;
  esac
fi

# Function to toggle the visibility of the dropdown terminal
toggle_dropdown() {
  local id="$(xdotool search --class dropdown | head -1)"
  if [ -n "$id" ]; then
    local state="$(xprop -id "$id" | grep "_NET_WM_STATE_HIDDEN")"
    if [ -n "$state" ]; then
      # The dropdown window is hidden, so show it
      wmctrl -i -r "$id" -b remove,hidden
    else
      # The dropdown window is visible, so hide it
      wmctrl -i -r "$id" -b add,hidden
    fi
  fi
}

# Check if the script is already running and exit if it is
if pgrep -x "$(basename "$0")" | grep -v $$ > /dev/null; then
  exit 1
fi

# Attempt to toggle the dropdown terminal
toggle_dropdown

# Sometimes, it may fail to toggle, so we add a slight delay and try again
sleep 0.1
toggle_dropdown
