#!/bin/bash
#
# ivman の自動マウントと ファイルマネージャを連携させ、
# ファイルマネージャの起動/終了を制御する

usage()
{
    cat<<EOF

ivman-volume-manager:
    ivman によりリムバブルメディアの挿抜を監視し、自動マウントされた時は
    ファイルマネージャを起動、アンマウントされた時は、起動したファイルマ
    ネージャを終了します。
    ※ ファイルマネージャからアンマウント出来ない時は、ivman-umount(GUI)
    又は pumount コマンドでアンマウントして下さい。
使い方: ivman-volume-manager [--filemanager|-f ファイルマネージャ]
    ivman-volume-manager は、自動マウント時に使用するファイルマネージャを、
        rox thunar pcmanfm nautilush konqueror
    の順に、インストールされているものを探し、最初に見付かったものを使用
    します。
※ 検索順を変えたい時や、検索リストに無いファイルマネージャを指定したい
時は、-f オプションでファイルマネージャを指定して下さい。
ファイルマネージャ指定時、必須オプションが有る場合は、ファイルマネー
ジャ名と共にダブルクォートして指定して下さい。
    例: ivman-volume-manager -f "filema --no-desktop"

EOF
}

# デフォルトファイルマネージャ設定
fileman=`which rox 2> /dev/null` || fileman=`which thunar 2> /dev/null` || fileman=`which pcmanfm 2> /dev/null` || fileman=`which nautilus 2> /dev/null` || fileman=`which konqueror 2> /dev/null`
fileman=`basename $fileman`

# 引数検査
if [ ! $# == 0 ]; then
    case $1 in
        --filemanager|-f)
            fileman=$2 ;;
        --help|-help|-h)
            usage
            exit 0;;
        *)
            echo 不正なオプションです
            usage
            exit 1;;
    esac
fi
fm=`echo $fileman | cut -d " " -f 1`
fm=`basename $fm`
if [ -z "`type -p $fm`" ]; then
    echo $fm は不正なコマンドです。終了します。
    exit 1
fi
# ファイルマネージャ名チェック
case $fm in
    nautilus|pcmanfm)
        fileman="$fileman --no-desktop" ;;
    rox|thunar|konqueror)
        ;;
    *)
        echo "$fileman は実行可能ですが、ivman-volume-managerは、"
        echo "それがファイルマネージャかどうかを知りません"
        echo "本当に $fileman をファイルマネージャとして使用しますか？"
        PS3="1 又は 2 を選んで下さい > "
        select ans in "はい" "いいえ"; do
            if [ ! x$ans == x"はい" ]; then
                echo "中断します"
                exit 1
            fi
            break
        done
        ;;
esac

# 二重起動チェック
user_name=`whoami`       # ivman-volume-manager を実行中のユーザー名を取得
my_name=`basename $0`
my_id=`pgrep -fu "$user_name" "$my_name"`   # ivman-volume-manager の pid を取得
if [ -n "`pgrep ^ivman$`" ]; then
    # 既に ivman が起動している場合
    if (( `echo "$my_id" | wc -w` \> 1 )); then
        # ivman-volume-manager が二重起動している場合
        echo "`basename $0` は既に移動しています"
        exit 1
    fi
    pkill ivman
fi

# X のログイン・セッションを調査
for i in blackbox fluxbox fvwm icewm openbox twm wmaker; do
    pgrep $i > /dev/null && session=$i && break
done

# ivman を起動
exec ivman > /dev/null &

# ivman-volume-manager の nice 値を19 に設定し、負荷を抑える
my_name=`basename "$0"`                     # コマンド名を取得
my_id=(`pgrep -fu "$user_name" "$my_name"`) # pid を取得
renice 19 -p "${my_id[0]}" > /dev/null      # nice 値を変更

# media ディレクトリ表示中フラグの初期値をリセットに
media_disp_flag=0

# /media ディレクトリ監視ループ
while (( 1 )) ; do
    if [ "$media_disp_flag" == "0" ]; then
        # ディレクトリ表示中フラグがリセットされている場合
        med=(`ls /media/`)
        if [ ! x"" == x"${med[0]}" ]; then
            # ファイルマネージャ起動
            nice -n 0 $fileman  /media > /dev/null &          
            media_disp_flag=1      # ディレクトリ表示中フラグをセット
        fi
    fi
    if [ "$media_disp_flag" == "1" ]; then
        # 表示中フラグがセットされている場合
        med=(`ls /media/`)
        if [ -z ${med[0]} ]; then
            # /media 以下にディレクトリが無い場合はディレクトリ表示を終了
            if [ "$fileman" == "rox" ]; then
                rox -D /media        # ROX-Filer の場合
            else
                pkill -f "$fileman /media" # 他のファイルマネージャの場合
            fi
            media_disp_flag=0      # ディレクトリ表示中フラグをリセット
        fi
    fi
    # X のセッションが終了した時は ivman-volume-manager も終了する
    [ -z "`pgrep -l $session`" ] && pkill ivman && echo X のセッションが終了しました && exit 0
    nice -n 0 sleep 1s    # 0.5 秒 sleep して、while ループ内を繰り返す
done 2> /dev/null

