#!/bin/bash

MODKEY=Mod4 # "super"
UP=p
DOWN=n
LEFT=b
RIGHT=f

HIST="`conffile history`"

# Colors tuples: "<text> <background> <border>"
. `conffile theme-solarized-dark`

Event() {
	event=$1; shift;
	case "$event" in
		## Mouse event meanings:
		##   MouseDown = mouse down
		##   Click     = mouse up
		##   DND       = hover, while dragging something (Drag 'n' Drop)
		##               The associated mouse button is always "1"
		##
		## Mouse-button IDs:
		##   1 = left
		##   2 = middle
		##   3 = right

		## Custom (non-WMII-generated) events
		WmiircStart) ## No args
			echo ' ==> Starting wmiirc'
			is_mounted $WMII_DIR && Event WmiircUnmount
			Event WmiircMount

			# Configure wmii
			< "`conffile tagrules`" expand_variables >> $WMII_DIR/tagrules
			< "`conffile ctl-init`" expand_variables >> $WMII_DIR/ctl
			scansection Key | cut -sf2               >> $WMII_DIR/keys
			# Configure X11
			xsetroot -solid "$WMII_BACKGROUND"

			# Clear the LBar and RBar
			find $WMII_DIR/{l,r}bar -type f -delete
			# Populate the LBar by emulating [Create|Focus]Tag events
			seltag=`sed 1q $WMII_DIR/tag/sel/ctl`
			lstags | while read tag; do
				Event CreateTag "$tag"
				if [ "$tag" = "$seltag" ]; then
					Event FocusTag "$tag"
				fi
			done

			# Run the autostart action  
			Action autostart 2>/dev/null &
			;;
		WmiircQuit) ## No args
			echo ' ==> Stopping wmiirc'
			exit;;
		WmiircMount) ## No args
			echo "  -> Creating mountpoint WMII_DIR=$WMII_DIR..."
			mkdir -p "$WMII_DIR"
			echo "  -> Mounting WMII_DIR=$WMII_DIR..."
			9mount -i "unix!$WMII_NAMESPACE/wmii" "$WMII_DIR";;
		WmiircUnmount) ## No args
			echo "  -> Unmounting WMII_DIR=$WMII_DIR..."
			9umount "$WMII_DIR"
			echo "  -> Removing mountpoint WMII_DIR=$WMII_DIR..."
			rmdir "$WMII_DIR";;
		## WMII-meta events
		Quit) ## No args
			echo ' ==> wmii quit: unmounting'
			trap - EXIT
			Event WmiircUnmount
			Event WmiircQuit;;
		Warning) ## $@=string
			notify-send "wmii warning: $*";;
		Key) ## $1=keystroke
			Key "$@";;

		## WMII Window management events
		FocusFloating) ## No args
			;;
		AreaFocus) ## $1=area
			;;
		DestroyArea) ## $1=area
			;;
		ColumnFocus) ## $1=column
			;;
		CreateColumn) ## $1=column
			;;

		## Client events
		CreateClient) ## $1=client
			;;
		DestroyClient) ## $1=client
			;;
		Urgent) ## $1=client $2=[Manager|Client]
			;;
		NotUrgent) ## $1=client $2=[Manager|Client]
			;;
		ClientMouseDown) ## $1=client $2=button
			client=$1
			button=$2
			case $button in
				1) ;;
				2) ;;
				3)
					{
						case `wmii9menu Delete Fullscreen` in
							Delete)
								echo kill >> $WMII_DIR/client/$client/ctl;;
							Fullscreen)
								echo Fullscreen on >> $WMII_DIR/client/$1/ctl;;
						esac
					}& ;;
			esac;;
		ClientClick) ## $1=client $2=button
			;;
		Unresponsive) ## $1=client
			client=$1
			client_name=`cat $WMII_DIR/client/$client/label`
			msg="The client \`${client_name}' is not responding."
			msg+=" What would you like to do?"
			{
				resp=$(wihack -transient $client \
					xmessage -nearmouse -buttons Kill,Wait -print "$msg")
				if [ "$resp" = Kill ]; then
					echo slay >> $WMII_DIR/client/$client/ctl
				fi
			}& ;;
		Fullscreen) ## $1=client $2=[on|off]
			# TODO: hide any clients with the 'panel' class
			;;

		## Tag events
		CreateTag) ## $1=tag
			echo "$WMII_NORMCOLORS"   $@ >> $WMII_DIR/lbar/$1;;
		DestroyTag) ## $1=tag
			rm $WMII_DIR/lbar/$1;;
		FocusTag) ## $1=tag
			echo "$WMII_FOCUSCOLORS"  $1 >> $WMII_DIR/lbar/$1;;
		UnfocusTag) ## $1=tag
			echo "$WMII_NORMCOLORS"   $1 >> $WMII_DIR/lbar/$1;;
		UrgentTag) ## $1=tag $2=[Manager|Client]
			echo "$WMII_URGENTCOLORS" $1 >> $WMII_DIR/lbar/$1;;
		NotUrgentTag) ## $1=tag $2=[Manager|Client]
			echo "$WMII_NORMCOLORS"   $1 >> $WMII_DIR/lbar/$1;;

		## LeftBar events (usually tag buttons)
		LeftBarMouseDown) ## $1=button $2=bar_item
			;;
		LeftBarClick) ## $1=button $2=bar_item
			shift # ignore the button
			echo view "$@" >> $WMII_DIR/ctl;;
		LeftMouseDND) ## $1=button $2=bar_item
			Event LeftBarClick "$@";;

		## RightBar events
		RightBarMouseDown) ## $1=button $2=bar_item
			;;
		RightBarClick) ## $1=button $2=bar_item
			;;
		RightMouseDND) ## $1=button $2=bar_item
			Event RightBarClick "$@";;
	esac
} ## End Event

# Key Bindings
Key() {
	key=$1
	case "$key" in
		## Moving around

		$MODKEY-$LEFT) ## Select the client to the left
			echo select left   >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-$RIGHT) ## Select the client to the right
			echo select right  >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-$UP) ## Select the client above
			echo select up     >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-$DOWN) ## Select the client below
			echo select down   >> $WMII_DIR/tag/sel/ctl;;

		$MODKEY-space) ## Toggle between floating and managed layers
			echo select toggle >> $WMII_DIR/tag/sel/ctl;;

		## Moving clients around

		$MODKEY-Shift-$LEFT) ## Move selected client to the left
			echo send sel left   >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-Shift-$RIGHT) ## Move selected client to the right
			echo send sel right  >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-Shift-$UP) ## Move selected client up
			echo send sel up     >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-Shift-$DOWN) ## Move selected client down
			echo send sel down   >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-Shift-space) ## Toggle selected client between floating and managed layers
			echo send sel toggle >> $WMII_DIR/tag/sel/ctl;;

		## Moving through stacks
		$MODKEY-Control-$UP) ## Select the stack above
			echo select up   stack >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-Control-$DOWN) ## Select the stack below
			echo select down stack >> $WMII_DIR/tag/sel/ctl;;

		## Client actions
		$MODKEY-shift-1) ## Toggle selected client's fullsceen state
			echo Fullscreen toggle >> $WMII_DIR/client/sel/ctl;;
		$MODKEY-shift-0) ## Close client
			echo kill >> $WMII_DIR/client/sel/ctl;;

		## Changing column modes
		$MODKEY-d) ## Set column to default mode
			echo colmode sel default-max >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-s) ## Set column to stack mode
			echo colmode sel stack-max   >> $WMII_DIR/tag/sel/ctl;;
		$MODKEY-m) ## Set column to max mode
			echo colmode sel stack+max   >> $WMII_DIR/tag/sel/ctl;;

		## Running programs
		$MODKEY-a) ## Open wmii actions menu
			Action $(path_ls $WMII_CONFPATH | wimenu -h "${HIST}.actions" -n 5000) & ;;
		$MODKEY-x) ## Open program menu
			setsid $(path_ls $PATH | wimenu -h "${HIST}.progs" -n 5000) & ;;
		$MODKEY-Return) ## Launch a terminal
			setsid x-terminal-emulator & ;;

		## Tag actions
		$MODKEY-t) ## Change to another tag
			{
				tag=$(lstags | wimenu -h "${HIST}.tags" -n 50) || return
				echo  view $tag >> $WMII_DIR/ctl
			}& ;;
		$MODKEY-Shift-t) ## Retag the selected client
			sel=$(sed 1q $WMII_DIR/client/sel/ctl)
			{
				tag=$(lstags | wimenu -h "${HIST}.tags" -n 50) || return
				echo "$tag" >> $WMII_DIR/client/$sel/tags
			}& ;;
	esac
} ## End Key

Action() {
	prog=`path_which "$WMII_CONFPATH" $1`; shift
	if [ -n "$prog" ]; then
		"$prog" "$@"
		return $?
	else
		return 1
	fi
} ## End Action