WineStarter.app 製作メモ 2012.10.5

作業記録。

WineStarter.app version 1.1 の直しをしてるけど機能を追加し過ぎな気がしてきた。なんかもう、そろそろ Automator じゃ限界。Xcode とかでプラグイン作らないとだめかなぁ。シェルスクリプト機能じゃなくてアップルスクリプトの中でシェルスクリプトを使ったほうがいいんだろうか…。

追加しようと思ってる機能↓

  • ヒストリ機能
  • 起動時のデフォルトアプリケーションを最大3個までセット可能
  • 起動時の仮想デスクトップサイズを最大3個までセット可能

スクリプトは2つに分けてます。ひとつは入力ファイルの読み込みとプロファイル作成なんかをするスクリプト。バックアップ用に貼っておく。

bash
#!/bin/bash

##### Automator Shellscript (stdin mode) #####

# Input file check
read INPUT && echo INPUT=\"${INPUT}\"

# History import
[ -e "/tmp/WineStarter" -a "$(cat "/tmp/WineStarter" | egrep "^INPUT=\"")" ] && echo $(cat "/tmp/WineStarter" | egrep "^INPUT=\"" | sed -e 's|INPUT|HISTORY|')

# Profile check
PROFILE="$HOME/.WineStarter"
[ ! -e "${PROFILE}" ] && cat <<EOF > "${PROFILE}"
# デフォルトアプリ0
APP_0="explorer"

# デフォルトアプリ1
APP_1=""

# デフォルトアプリ2
APP_2=""

# 仮想デスクトップの使用 ("yes" or "on" or "true")
USE_VD=""

# 仮想デスクトップ名
VD_NAME=""

# 仮想デスクトップサイズ0 (e.g. "1024x768")
VD_SIZE_0=""

# 仮想デスきトップサイズ1
VD_SIZE_1=""

# 仮想デスクトップサイズ2
VD_SIZE_2=""

# デフォルトプレフィックス (e.g. "$HOME/.wine.old")
WINEPREFIX=""

# デバッグメッセージ
WINEDEBUG="-all"

# xterm を使用する場合はコメントアウトを外してパスをセット
# Remove a comment out if you use to xterm.
#XTERM="/opt/X11/bin/xterm"
EOF

# Profile options check and exclude
cat "${PROFILE}" | egrep "^\w+=\".+\""

もう一つは起動用コマンドを作成するスクリプト。

bash
#!/bin/bash

##### Automator Shellscript (stdin mode) #####

# Export and import profile options
PROFILE="/tmp/WineStarter"
cat > "${PROFILE}"

# Use history
[ ! "$(cat "${PROFILE}" | egrep "^INPUT=")" ] && sed -i '' -e 's|^HISTORY=|INPUT=|' "${PROFILE}"

# Apply profile
. "${PROFILE}"

if [ -n "$(cat "${PROFILE}")" ] ; then

    # Export environment valiables
    [ "${WINEPREFIX}" ] && export WINEPREFIX
    [ "${WINEDEBUG}" -a ! "${XTERM}" ] && export WINEDEBUG

    # For Homebrew Users
    [ -x "/usr/local/bin/wine" ] && PATH="/usr/local/bin:${PATH}"

    # For MacPorts Users
    [ -x "/opt/local/bin/wine" ] && PATH="/opt/local/bin:${PATH}"

    export PATH

    # Start up application priority 
    INPUT="${INPUT:-${APP_0:-${APP_1:-${APP_2}}}}"

    # Virtual desktop
    if [ "$(echo "${USE_VD}" | egrep -i "^(yes|on|true)$")" ] ; then

        # Auto VD name
        [ ! "${VD_NAME}" ] && VD_NAME="$(echo $(wine --version))"

        VD="explorer /desktop=${VD_NAME},${VD_SIZE_0:-${VD_SIZE_1:-${VD_SIZE_2}}}"

    fi

    # MSI executable support
    [ "$(echo "${INPUT}" | egrep -i "\.msi$" )" ] && MSIEXEC="msiexec /i"

    # Start up command
    START_WINE="eval wine ${VD} ${MSIEXEC} "${INPUT}""

    if [ -x "${XTERM}" ] ; then

        # Use xterm
        ${XTERM} -geometry +0+0 -e bash -c "echo ${START_WINE}; ${START_WINE}" &

    else

        # Use background shell
        ${START_WINE} &

    fi

fi

覚えなきゃいけないことがいっぱいありますね。bash は変数を展開するとクオートを取り除いちゃうから eval 使ったりしなきゃいけないとか。eval はシングルクオートで文字列化したしたものも展開出来たりしてすごい便利で有り難いんですが、詳しく知らないので注意しなきゃいけないこととかもわかりません。

他にもシェルスクリプトを使ったアプリケーションを作ってるんですが、egrep とか xarges 使ったりすると楽しいですね。

Automator も最初は引数で使ってたんですが、スペースのあるパスだと取り出しが面倒になるので stdin 使ったほうが苦労は少ないかも(用途によるけど)。

とりあえず上のスクリプトは一応動くけど、WINE の起動コマンドに関して見落としていた部分があったので書き直しです。

Xcode の本が欲しい…。