ラベル gtkdialog の投稿を表示しています。 すべての投稿を表示
ラベル gtkdialog の投稿を表示しています。 すべての投稿を表示

2017年5月5日金曜日

「簡易ポーズエディタ」 遂に、ボタンを使う


Raspberry Pi 2 Model B + ServoBlaster + シェルスクリプト(GtkDialog)で4足歩行ロボットを操作。
「簡易ポーズエディタ」の、今まで飾りになっていた上部のボタンに、機能を持たせた。
「左回転」「前進」「後退」「右回転」のボタンでそれぞれの動作を起動する。
(GtkDialogから、別のシェルスクリプトに書かれたfunction呼んでいるだけ)
ただし、「停止」ボタンを押さない限り、繰り返し回数上限まで動作を続行する。

ヘボいのは、上限に達して終了しても、操作ボタンがグレイアウトから復帰しない点。
「停止」ボタンを押さないと、復帰しない。

2016年9月18日日曜日

再修正「簡易ポーズエディタ」

修正「簡易ポーズエディタ」 で作ったスクリプトの再修正
例によって、上部のボタンは意味なし 。

原点に対する補正値を入れられるようにした。
起動時に、原点復帰を行う。

#!/bin/bash

export test00='
echo $USER
'
export SERVO0='50'
export SERVO1='50'
export SERVO2='50'
export SERVO3='50'
export SERVO4='50'
export SERVO5='50'
export SERVO6='50'
export SERVO7='50'

#原点に対する補正値の設定 
export ADJUST0='4'
export ADJUST1='3'
export ADJUST2='-3'
export ADJUST3='5'
export ADJUST4='-4'
export ADJUST5='-3'
export ADJUST6='1'
export ADJUST7='-3'

for((i = 0; i <= 7; i++)); do
    echo $i=$((SERVO$i + ADJUST$i))% > /dev/servoblaster
done

export MAIN_DIALOG='
  <window>
    <vbox>
      <hbox>
        <vbox>
          <hbox>
            <frame サーボ5(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO5</variable>
                <action>bash -c "echo 5="$((SERVO5 + ADJUST5))"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT5</action>
              </vscale>
            </frame>
            <frame サーボ4(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO4</variable>
                <action>bash -c "echo 4="$((SERVO4 + ADJUST4))"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT4</action>
              </vscale>
            </frame>
          </hbox>
          <hbox>
            <frame サーボ7(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO7</variable>
                <action>bash -c "echo 7="$((SERVO7 + ADJUST7))"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT7</action>
              </vscale>
            </frame>
            <frame サーボ6(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO6</variable>
                <action>bash -c "echo 6="$((SERVO6 + ADJUST8))"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT6</action>
              </vscale>
            </frame>
          </hbox>
        </vbox>

        <vbox>
          <hbox>
            <button>
              <label>ボタン 1</label>
              <action>echo $LANG</action>
            </button>
            <vbox>
              <button width-request="110">
                <label>前進</label>
                <action>bash -c "$test00"</action>
              </button>
              <button>
                <label>後退</label>
              </button>
            </vbox>
            <button>
              <label>ボタン 4</label>
            </button>
          </hbox>
          <vbox>
            <frame>
              <text>
                <variable>TEXT0</variable>
                <input>echo "echo 0="$SERVO0"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT1</variable>
                <input>echo "echo 1="$SERVO1"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT2</variable>
                <input>echo "echo 2="$SERVO2"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT3</variable>
                <input>echo "echo 3="$SERVO3"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT4</variable>
               <input>echo "echo 4="$SERVO4"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT5</variable>
                <input>echo "echo 5="$SERVO5"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT6</variable>
                <input>echo "echo 6="$SERVO6"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT7</variable>
                <input>echo "echo 7="$SERVO7"% > /dev/servoblaster"</input>
              </text>
            </frame>
          </vbox>
          <entry>
            <variable>FILE0</variable>
            <default>"./temp.txt"</default>
          </entry>
          <button>
            <label>新規作成</label>
            <action>echo "#!/bin/bash" > $FILE0</action>
            <action>echo "" >> $FILE0</action>
            <action>echo "echo 0="$((SERVO0 + ADJUST0))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 1="$((SERVO1 + ADJUST1))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 2="$((SERVO2 + ADJUST2))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 3="$((SERVO3 + ADJUST3))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 4="$((SERVO4 + ADJUST4))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 5="$((SERVO5 + ADJUST5))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 6="$((SERVO6 + ADJUST6))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 7="$((SERVO7 + ADJUST7))"% > /dev/servoblaster" >> $FILE0</action>
          </button>
          <button>
            <label>ポーズ追加</label>
            <action>echo "" >> $FILE0</action>
            <action>echo "sleep 1" >> $FILE0</action>
            <action>echo "" >> $FILE0</action>
            <action>echo "echo 0="$((SERVO0 + ADJUST0))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 1="$((SERVO1 + ADJUST1))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 2="$((SERVO2 + ADJUST2))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 3="$((SERVO3 + ADJUST3))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 4="$((SERVO4 + ADJUST4))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 5="$((SERVO5 + ADJUST5))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 6="$((SERVO6 + ADJUST6))"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 7="$((SERVO7 + ADJUST7))"% > /dev/servoblaster" >> $FILE0</action>
          </button>
        </vbox>

        <vbox>
          <hbox>
            <frame サーボ0(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO0</variable>
                <action>bash -c "echo 0="$((SERVO0 + ADJUST0))"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT0</action>
              </vscale>
            </frame>
            <frame サーボ1(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO1</variable>
                <action>bash -c "echo 1="$((SERVO1 + ADJUST1))"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT1</action>
              </vscale>
            </frame>
          </hbox>
          <hbox>
            <frame サーボ2(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO2</variable>
                <action>bash -c "echo 2="$((SERVO2 + ADJUST2))"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT2</action>
              </vscale>
            </frame>
            <frame サーボ3(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO3</variable>
                <action>bash -c "echo 3="$((SERVO3 + ADJUST3))"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT3</action>
              </vscale>
            </frame>
          </hbox>
        </vbox>
      </hbox>
    </vbox>
  </window>
'

gtkdialog -p MAIN_DIALOG -c 

2016年8月16日火曜日

ワークスペース毎に動くタイリング・シェルスクリプト

前回作成したシェルスクリプトを、ワークスペース毎に操作できるようにする実験


WmCtrlGtk(0)とWmCtrlGtk(1)で、それぞれワークスペース0とワークスペース1を別個に操作する。
(その分、シェルスクリプトから保存するファイルが増えてます。)

#!/bin/bash

PRE_IFS=$IFS
IFS=$'\n'

top_panel_h=0
bottom_panel_h=26
title_h=30
disp_width=$(xwininfo -root | grep 'Width' | cut -f2 -d ':')
disp_height=$(xwininfo -root | grep 'Height' | cut -f2 -d ':')
export current_ws=$(xprop -root -notype _NET_CURRENT_DESKTOP | cut -b 24)

if [ ! $(wmctrl -l | grep "WmCtrlGtk("$current_ws")") ]; then
    export MAIN_DIALOG$current_ws='
    <window title="WmCtrlGtk('$current_ws')">
        <hbox>
            <button>
                <label>h</label>
                <action>'$0' h 200</action>
            </button>
            <button>
                <label>v</label>
                <action>'$0' v 200</action>
            </button>
            <button>
                <label>r</label>
                <action>'$0' r</action>
            </button>
            <button>
                <label>+100</label>
                <action>'$0' 100</action>
            </button>
            <button>
                <label>-100</label>
                <action>'$0' -100</action>
            </button>
        </hbox>
    </window>
    '

    gtkdialog -p MAIN_DIALOG$current_ws -c
fi

rotate_flag=0
if [ $# -eq 1 ]; then
    if [ $1 = 'h' -o $1 = 'v' ]; then
        hv_flag=$1
        main_add=0
    elif [ $1 = 'r' ]; then
        rotate_flag=1
    elif [ $1 -gt 0 -o $1 -lt 0 ]; then
        rotate_flag=2
    else
        hv_flag='h'
    fi
elif [ $# -eq 2 ]; then
    hv_flag=$1
    main_add=$2
else
    exit 0
fi

temp_file='./wm-ctrl'$current_ws'.txt'
if [ $rotate_flag -gt 0 ]; then
    hv_flag=$(sed -n 1p ./wm-ctrl${current_ws}.his | cut -f1 -d',')
    main_add=$(sed -n 1p ./wm-ctrl${current_ws}.his | cut -f2 -d',')
    if [ $rotate_flag -eq 1 ]; then
        temp_1=$(sed -n 2p ./wm-ctrl${current_ws}.his)
        sed -i '$a '$temp_1'' ./wm-ctrl${current_ws}.his
        sed -i 1,2d ./wm-ctrl${current_ws}.his
    else
        sed -i 1d ./wm-ctrl${current_ws}.his
        main_add=$((main_add + $1))
    fi
    sed -i 's/_/ /g' ./wm-ctrl${current_ws}.his
    temp_file='./wm-ctrl'$current_ws'.his'
fi

wmctrl -l > wm-ctrl${current_ws}.txt
sed -i '/WmCtrlGtk/d' ./wm-ctrl${current_ws}.txt
txt_lines=$(wc $temp_file | sed 's/^[ \t]*//' | cut -f1 -d " ")
if [ $txt_lines -gt 0 ]; then
#    current_ws=$(xprop -root -notype _NET_CURRENT_DESKTOP | cut -b 24)
    #active_win=$(xprop -root -notype _NET_ACTIVE_WINDOW | cut -b 33-43)

    ws_windows=0
    for((i = 1; i <= $txt_lines; i++)); do
        ws_flag=$(sed -n $i'p' $temp_file | cut -b 12-13)
        if [ $ws_flag -eq $current_ws ]; then
            let ws_windows++
        fi
    done

    disp_width2=$((disp_width / 2))
    disp_height2=$(($(((disp_height - top_panel_h - bottom_panel_h) / 2)) - title_h))
    disp_width_main=$((disp_width2 + main_add))
    disp_height_main=$((disp_height2 + main_add))
    disp_width_sub=$((disp_width2 - main_add))
    disp_height_sub=$((disp_height2 - main_add))

    pos_width=$((disp_width / 2))
    pos_height=$(((disp_height - top_panel_h - bottom_panel_h) / 2))

    if [ $hv_flag = 'v' ]; then
        x_pos=(0 0 $pos_width $pos_width)
        y_pos=($((0 + top_panel_h)) $((pos_height + top_panel_h + main_add)) \
              $((pos_height + top_panel_h+ main_add)) $((0 + top_panel_h)))
    else
        x_pos=(0 $((pos_width + main_add)) $((pos_width + main_add)) 0)
        y_pos=($((0 + top_panel_h)) $((0 + top_panel_h)) $((pos_height + top_panel_h)) \
              $((pos_height + top_panel_h)))
    fi

    case $ws_windows in
        1)
            temp_width=$disp_width
            temp_height=$((disp_height - top_panel_h - bottom_panel_h - title_h));; 
        [2-3])
            temp_width=$disp_width2
            temp_height=$((disp_height - top_panel_h - bottom_panel_h - title_h));;
        *)
            temp_width=$disp_width2
            temp_height=$disp_height2;;
    esac

    window_array=()
    n=0
    for((i = 1; i <= $txt_lines; i++)); do
        if [ $n -gt 3 ]; then
            n=0
        fi
        ws_flag=$(sed -n $i'p' $temp_file | cut -b 11-13)
        if [ $ws_flag -eq $current_ws ]; then
            win_id=$(sed -n $i'p' $temp_file | cut -b 1-10)
            if [ $rotate_flag -eq 0 ]; then
                if [ $n -eq 0 ]; then
                    echo $hv_flag','$main_add',' > wm-ctrl${current_ws}.his
                    echo $win_id'__'$current_ws'_' >> wm-ctrl${current_ws}.his
                else
                    echo $win_id'__'$current_ws'_' >> wm-ctrl${current_ws}.his
                fi
            fi
            if [ $ws_windows -eq 2 ]; then
                if [ $n -eq 0 ]; then
                    if [ $hv_flag = 'v' ]; then
                        temp_width=$disp_width
                        temp_height=$disp_height_main
                    else
                        temp_width=$disp_width_main
                    fi
                else
                    if [ $hv_flag = 'v' ]; then
                        temp_width=$disp_width
                        temp_height=$disp_height_sub 
                    else
                        temp_width=$disp_width_sub
                        temp_height=$((disp_height - top_panel_h - bottom_panel_h - title_h))
                    fi
                fi
            fi            
            if [ $ws_windows -eq 3 ]; then
                if [ $n -eq 0 ]; then
                    if [ $hv_flag = 'v' ]; then
                        temp_width=$disp_width
                        temp_height=$disp_height_main
                    else
                        temp_width=$disp_width_main
                    fi
                fi
            fi
            if [ $ws_windows -gt 2 -a $n -gt 0 ]; then
                if [ $hv_flag = 'v' ]; then
                    temp_width=$disp_width2
                    temp_height=$disp_height_sub 
                else
                    temp_width=$disp_width_sub
                    temp_height=$disp_height2
                fi
            fi
            if [ $ws_windows -gt 3 -a $n -gt 0 ]; then
                x_pos=(0 $pos_width $pos_width 0)
                y_pos=($((0 + top_panel_h)) $((0 + top_panel_h)) $((pos_height + top_panel_h)) \
                      $((pos_height + top_panel_h)))
                temp_width=$disp_width2
                temp_height=$disp_height2
            fi
            window_array+=( $win_id','${x_pos[$n]}','${y_pos[$n]}','$temp_width','$temp_height )
            let n++
        fi
    done

    for par in ${window_array[@]}; do
        for((i = 1; i <= 5; i++)); do
            declare par$i=$(echo ${par} | cut -f$i -d ',')
        done
        wmctrl -i -r $par1 -e 0,$par2,$par3,$par4,$par5
    done
fi

if [ $rotate_flag -gt 0 ]; then
    sed -i 's/ /_/g' ./wm-ctrl${current_ws}.his
    temp=$hv_flag','$main_add','
    sed -i '1i '$temp'' ./wm-ctrl${current_ws}.his
fi

2016年7月3日日曜日

GtkDialogでOpenboxウィンドウのタイリング

前回、作成したシェルスクリプトをGtkDialogを使ってGUI操作できるようにする実験


※追記1(2016/07/09 21:00)※
一応、上部にパネルを表示している場合を想定。
top_panel_hで高さを指定する。

#!/bin/bash

PRE_IFS=$IFS
IFS=$'\n'

top_panel_h=0
bottom_panel_h=26
title_h=30
disp_width=$(xwininfo -root | grep 'Width' | cut -f2 -d ':')
disp_height=$(xwininfo -root | grep 'Height' | cut -f2 -d ':')

if [ ! $(wmctrl -l | grep "WmCtrlGtk") ]; then
    export MAIN_DIALOG='
    <window title="WmCtrlGtk">
        <hbox>
            <button>
                <label>h</label>
                <action>'$0' h</action>
            </button>
            <button>
                <label>v</label>
                <action>'$0' v</action>
            </button>
            <button>
                <label>r</label>
                <action>'$0' r</action>
            </button>
            <button>
                <label>+100</label>
                <action>'$0' 100</action>
            </button>
            <button>
                <label>-100</label>
                <action>'$0' -100</action>
            </button>
        </hbox>
    </window>
    '

    gtkdialog -p MAIN_DIALOG -c
fi

rotate_flag=0
if [ $# -eq 1 ]; then
    if [ $1 = 'h' -o $1 = 'v' ]; then
        hv_flag=$1
        main_add=0
    elif [ $1 = 'r' ]; then
        rotate_flag=1
    elif [ $1 -gt 0 -o $1 -lt 0 ]; then
        rotate_flag=2
    else
        hv_flag='h'
    fi
elif [ $# -eq 2 ]; then
    hv_flag=$1
    main_add=$2
else
    exit 0
fi

temp_file='./wm-ctrl.txt'
if [ $rotate_flag -gt 0 ]; then
    hv_flag=$(sed -n 1p ./wm-ctrl.his | cut -f1 -d',')
    main_add=$(sed -n 1p ./wm-ctrl.his | cut -f2 -d',')
    if [ $rotate_flag -eq 1 ]; then
        temp_1=$(sed -n 2p ./wm-ctrl.his)
        sed -i '$a '$temp_1'' ./wm-ctrl.his
        sed -i 1,2d ./wm-ctrl.his
    else
        sed -i 1d ./wm-ctrl.his
        main_add=$((main_add + $1))
    fi
    sed -i 's/_/ /g' ./wm-ctrl.his
    temp_file='./wm-ctrl.his'
fi

wmctrl -l > wm-ctrl.txt
sed -i '/WmCtrlGtk/d' ./wm-ctrl.txt
txt_lines=$(wc $temp_file | sed 's/^[ \t]*//' | cut -f1 -d " ")
if [ $txt_lines -gt 0 ]; then
    current_ws=$(xprop -root -notype _NET_CURRENT_DESKTOP | cut -b 24)
    #active_win=$(xprop -root -notype _NET_ACTIVE_WINDOW | cut -b 33-43)

    ws_windows=0
    for((i = 1; i <= $txt_lines; i++)); do
        ws_flag=$(sed -n $i'p' $temp_file | cut -b 12-13)
        if [ $ws_flag -eq $current_ws ]; then
            let ws_windows++
        fi
    done

    disp_width2=$((disp_width / 2))
    disp_height2=$(($(((disp_height - top_panel_h - bottom_panel_h) / 2)) - title_h))
    disp_width_main=$((disp_width2 + main_add))
    disp_height_main=$((disp_height2 + main_add))
    disp_width_sub=$((disp_width2 - main_add))
    disp_height_sub=$((disp_height2 - main_add))

    pos_width=$((disp_width / 2))
    pos_height=$(((disp_height - top_panel_h - bottom_panel_h) / 2))

    if [ $hv_flag = 'v' ]; then
        x_pos=(0 0 $pos_width $pos_width)
        y_pos=($((0 + top_panel_h)) $((pos_height + top_panel_h + main_add)) \
              $((pos_height + top_panel_h+ main_add)) $((0 + top_panel_h)))
    else
        x_pos=(0 $((pos_width + main_add)) $((pos_width + main_add)) 0)
        y_pos=($((0 + top_panel_h)) $((0 + top_panel_h)) $((pos_height + top_panel_h)) \
              $((pos_height + top_panel_h)))
    fi

    case $ws_windows in
        1)
            temp_width=$disp_width
            temp_height=$((disp_height - top_panel_h - bottom_panel_h - title_h));; 
        [2-3])
            temp_width=$disp_width2
            temp_height=$((disp_height - top_panel_h - bottom_panel_h - title_h));;
        *)
            temp_width=$disp_width2
            temp_height=$disp_height2;;
    esac

    window_array=()
    n=0
    for((i = 1; i <= $txt_lines; i++)); do
        if [ $n -gt 3 ]; then
            n=0
        fi
        ws_flag=$(sed -n $i'p' $temp_file | cut -b 11-13)
        if [ $ws_flag -eq $current_ws ]; then
            win_id=$(sed -n $i'p' $temp_file | cut -b 1-10)
            if [ $rotate_flag -eq 0 ]; then
                if [ $n -eq 0 ]; then
                    echo $hv_flag','$main_add',' > wm-ctrl.his
                    echo $win_id'__'$current_ws'_' >> wm-ctrl.his
                else
                    echo $win_id'__'$current_ws'_' >> wm-ctrl.his
                fi
            fi
            if [ $ws_windows -eq 2 ]; then
                if [ $n -eq 0 ]; then
                    if [ $hv_flag = 'v' ]; then
                        temp_width=$disp_width
                        temp_height=$disp_height_main
                    else
                        temp_width=$disp_width_main
                    fi
                else
                    if [ $hv_flag = 'v' ]; then
                        temp_width=$disp_width
                        temp_height=$disp_height_sub 
                    else
                        temp_width=$disp_width_sub
                        temp_height=$((disp_height - top_panel_h - bottom_panel_h - title_h))
                    fi
                fi
            fi            
            if [ $ws_windows -eq 3 ]; then
                if [ $n -eq 0 ]; then
                    if [ $hv_flag = 'v' ]; then
                        temp_width=$disp_width
                        temp_height=$disp_height_main
                    else
                        temp_width=$disp_width_main
                    fi
                fi
            fi
            if [ $ws_windows -gt 2 -a $n -gt 0 ]; then
                if [ $hv_flag = 'v' ]; then
                    temp_width=$disp_width2
                    temp_height=$disp_height_sub 
                else
                    temp_width=$disp_width_sub
                    temp_height=$disp_height2
                fi
            fi
            if [ $ws_windows -gt 3 -a $n -gt 0 ]; then
                x_pos=(0 $pos_width $pos_width 0)
                y_pos=($((0 + top_panel_h)) $((0 + top_panel_h)) $((pos_height + top_panel_h)) \
                      $((pos_height + top_panel_h)))
                temp_width=$disp_width2
                temp_height=$disp_height2
            fi
            window_array+=( $win_id','${x_pos[$n]}','${y_pos[$n]}','$temp_width','$temp_height )
            let n++
        fi
    done

    for par in ${window_array[@]}; do
        for((i = 1; i <= 5; i++)); do
            declare par$i=$(echo ${par} | cut -f$i -d ',')
        done
        wmctrl -i -r $par1 -e 0,$par2,$par3,$par4,$par5
    done
fi

if [ $rotate_flag -gt 0 ]; then
    sed -i 's/ /_/g' ./wm-ctrl.his
    temp=$hv_flag','$main_add','
    sed -i '1i '$temp'' ./wm-ctrl.his
fi

2016年6月5日日曜日

修正「簡易ポーズエディタ」

Raspberry Pi 2 4足歩行ロボット用「簡易ポーズエディタ」 で作ったスクリプトの修正。
例によって、上部のボタンは意味なし 。


レイアウト修正と、ファイル「新規作成」の修正及び、「ポーズ追加」ボタンの付加。

中央下の「新規作成」ボタンでスクリプトファイル(形式のテキストファイル)作成。

「ポーズ追加」ボタンで、次のポーズを追加。

テキストファイルなので、実行権限はなし。
動きの無いサーボモータに対しても同位置の指示が書き込みされている。
ポーズ間のスリープは1秒固定。

実際には、上の修正をしながらシェルスクリプトとして手作業で仕上げて行く。

#!/bin/bash

export test00='
echo $USER
'
export SERVO0='50'
export SERVO1='50'
export SERVO2='50'
export SERVO3='50'
export SERVO4='50'
export SERVO5='50'
export SERVO6='50'
export SERVO7='50'

export MAIN_DIALOG='
  <window>
    <vbox>
      <hbox>
        <vbox>
          <hbox>
            <frame サーボ5(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO5</variable>
                <action>bash -c "echo 5="$SERVO5"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT5</action>
              </vscale>
            </frame>
            <frame サーボ4(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO4</variable>
                <action>bash -c "echo 4="$SERVO4"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT4</action>
              </vscale>
            </frame>
          </hbox>
          <hbox>
            <frame サーボ7(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO7</variable>
                <action>bash -c "echo 7="$SERVO7"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT7</action>
              </vscale>
            </frame>
            <frame サーボ6(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO6</variable>
                <action>bash -c "echo 6="$SERVO6"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT6</action>
              </vscale>
            </frame>
          </hbox>
        </vbox>

        <vbox>
          <hbox>
            <button>
              <label>ボタン 1</label>
              <action>echo $LANG</action>
            </button>
            <vbox>
              <button width-request="110">
                <label>前進</label>
                <action>bash -c "$test00"</action>
              </button>
              <button>
                <label>後退</label>
              </button>
            </vbox>
            <button>
              <label>ボタン 4</label>
            </button>
          </hbox>
          <vbox>
            <frame>
              <text>
                <variable>TEXT0</variable>
                <input>echo "echo 0="$SERVO0"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT1</variable>
                <input>echo "echo 1="$SERVO1"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT2</variable>
                <input>echo "echo 2="$SERVO2"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT3</variable>
                <input>echo "echo 3="$SERVO3"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT4</variable>
               <input>echo "echo 4="$SERVO4"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT5</variable>
                <input>echo "echo 5="$SERVO5"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT6</variable>
                <input>echo "echo 6="$SERVO6"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT7</variable>
                <input>echo "echo 7="$SERVO7"% > /dev/servoblaster"</input>
              </text>
            </frame>
          </vbox>
          <entry>
            <variable>FILE0</variable>
            <default>"./temp.txt"</default>
          </entry>
          <button>
            <label>新規作成</label>
            <action>echo "#!/bin/bash" > $FILE0</action>
            <action>echo "" >> $FILE0</action>
            <action>echo "echo 0="$SERVO0"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 1="$SERVO1"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 2="$SERVO2"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 3="$SERVO3"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 4="$SERVO4"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 5="$SERVO5"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 6="$SERVO6"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 7="$SERVO7"% > /dev/servoblaster" >> $FILE0</action>
          </button>
          <button>
            <label>ポーズ追加</label>
            <action>echo "" >> $FILE0</action>
            <action>echo "sleep 1" >> $FILE0</action>
            <action>echo "" >> $FILE0</action>
            <action>echo "echo 0="$SERVO0"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 1="$SERVO1"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 2="$SERVO2"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 3="$SERVO3"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 4="$SERVO4"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 5="$SERVO5"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 6="$SERVO6"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 7="$SERVO7"% > /dev/servoblaster" >> $FILE0</action>
          </button>
        </vbox>

        <vbox>
          <hbox>
            <frame サーボ0(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO0</variable>
                <action>bash -c "echo 0="$SERVO0"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT0</action>
              </vscale>
            </frame>
            <frame サーボ1(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO1</variable>
                <action>bash -c "echo 1="$SERVO1"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT1</action>
              </vscale>
            </frame>
          </hbox>
          <hbox>
            <frame サーボ2(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO2</variable>
                <action>bash -c "echo 2="$SERVO2"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT2</action>
              </vscale>
            </frame>
            <frame サーボ3(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO3</variable>
                <action>bash -c "echo 3="$SERVO3"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT3</action>
              </vscale>
            </frame>
          </hbox>
        </vbox>
      </hbox>
    </vbox>
  </window>
'

gtkdialog -p MAIN_DIALOG -c 

2015年10月17日土曜日

Raspberry Pi 2 4足歩行ロボット用「簡易ポーズエディタ」

前回「Raspberry Pi 2 やっぱりシェルスクリプトでやる」で作ったServoBlaster用シェルスクリプトの発展形。


 4足歩行ロボットの脚に対応したスライダーを操作してポーズを決め、
その時点のコマンドを任意のファイルに書き出すgtkdialog使用のシェルスクリプト。

#!/bin/bash

export test00='
echo $USER
'
export SERVO0='50'
export SERVO1='50'
export SERVO2='50'
export SERVO3='50'
export SERVO4='50'
export SERVO5='50'
export SERVO6='50'
export SERVO7='50'

export MAIN_DIALOG='
  <window>
    <vbox>
      <hbox>
        <vbox>
          <hbox>
            <frame サーボ5(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO5</variable>
                <action>bash -c "echo 5="$SERVO5"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT5</action>
              </vscale>
            </frame>
            <frame サーボ4(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO4</variable>
                <action>bash -c "echo 4="$SERVO4"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT4</action>
              </vscale>
            </frame>
          </hbox>
          <hbox>
            <frame サーボ7(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO7</variable>
                <action>bash -c "echo 7="$SERVO7"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT7</action>
              </vscale>
            </frame>
            <frame サーボ6(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO6</variable>
                <action>bash -c "echo 6="$SERVO6"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT6</action>
              </vscale>
            </frame>
          </hbox>
        </vbox>

        <vbox>
          <hbox>
            <button>
              <label>ボタン 1</label>
              <action>echo $LANG</action>
            </button>
            <vbox>
              <button>
                <label>前進</label>
                <action>bash -c "$test00"</action>
              </button>
              <button>
                <label>後退</label>
              </button>
            </vbox>
            <button>
              <label>ボタン4</label>
            </button>
          </hbox>
          <vbox>
            <frame>
              <text>
                <variable>TEXT0</variable>
                <input>echo "echo 0="$SERVO0"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT1</variable>
                <input>echo "echo 1="$SERVO1"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT2</variable>
                <input>echo "echo 2="$SERVO2"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT3</variable>
                <input>echo "echo 3="$SERVO3"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT4</variable>
               <input>echo "echo 4="$SERVO4"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT5</variable>
                <input>echo "echo 5="$SERVO5"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT6</variable>
                <input>echo "echo 6="$SERVO6"% > /dev/servoblaster"</input>
              </text>
              <text>
                <variable>TEXT7</variable>
                <input>echo "echo 7="$SERVO7"% > /dev/servoblaster"</input>
              </text>
            </frame>
          </vbox>
          <entry>
            <variable>FILE0</variable>
            <default>"./temp.txt"</default>
          </entry>
          <button>
            <label>Write</label>
            <action>echo "echo 0="$SERVO0"% > /dev/servoblaster" > $FILE0</action>
            <action>echo "echo 1="$SERVO1"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 2="$SERVO2"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 3="$SERVO3"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 4="$SERVO4"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 5="$SERVO5"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 6="$SERVO6"% > /dev/servoblaster" >> $FILE0</action>
            <action>echo "echo 7="$SERVO7"% > /dev/servoblaster" >> $FILE0</action>
          </button>
        </vbox>

        <vbox>
          <hbox>
            <frame サーボ0(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO0</variable>
                <action>bash -c "echo 0="$SERVO0"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT0</action>
              </vscale>
            </frame>
            <frame サーボ1(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO1</variable>
                <action>bash -c "echo 1="$SERVO1"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT1</action>
              </vscale>
            </frame>
          </hbox>
          <hbox>
            <frame サーボ2(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1" inverted="true">
                <default>50</default>
                <variable>SERVO2</variable>
                <action>bash -c "echo 2="$SERVO2"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT2</action>
              </vscale>
            </frame>
            <frame サーボ3(%)>
              <vscale height-request="200" range-min="10" range-max="90" range-step="1">
                <default>50</default>
                <variable>SERVO3</variable>
                <action>bash -c "echo 3="$SERVO3"% > /dev/servoblaster"</action>
                <action type="refresh">TEXT3</action>
              </vscale>
            </frame>
          </hbox>
        </vbox>
      </hbox>
    </vbox>
  </window>
'

gtkdialog -p MAIN_DIALOG -c 

というわけで、中央上部のボタンは前回同様飾り。
 使い道の無かったシェルスクリプトに、多少は意味を持たせてみた。

2015年10月12日月曜日

Raspberry Pi 2 やっぱりシェルスクリプトでやる

シェルスクリプトでもgtkdialogを使うことで、GUI操作が可能なので、
gtkdialogのスライダーを使って、サーボモータを動かしてみようと思った。
(サーボモータの制御にはServoBlasterを使用するので、そのインターフェースって感じ。)

Arch Linux ARMではリポジトリにgtkdialogがパッケージとしてあるので、
pacmanでインストールする。

例によって体裁は考えずに、兎に角動くものを作る。

#!/bin/bash

export test00='
echo $USER
'

export MAIN_DIALOG='
  <window>
    <vbox>
      <hbox>
        <button>
          <label>ボタン1</label>
          <action>echo $LANG</action>
        </button>
        <vbox>
          <button>
            <label>前進</label>
            <action>bash -c "$test00"</action>
          </button>
          <button>
            <label>後退</label>
          </button>
        </vbox>
        <button>
          <label>ボタン4</label>
        </button>
      </hbox>
      <frame サーボ0(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO0</variable>
          <action>bash -c "echo 0="$SERVO0"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ1(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO1</variable>
          <action>bash -c "echo 1="$SERVO1"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ2(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO2</variable>
          <action>bash -c "echo 2="$SERVO2"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ3(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO3</variable>
          <action>bash -c "echo 3="$SERVO3"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ4(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO4</variable>
          <action>bash -c "echo 4="$SERVO4"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ5(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO5</variable>
          <action>bash -c "echo 5="$SERVO5"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ6(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO6</variable>
          <action>bash -c "echo 6="$SERVO6"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
      <frame サーボ7(%)>
        <hscale range-min="10" range-max="90" range-step="1">
          <default>50</default>
          <variable>SERVO7</variable>
          <action>bash -c "echo 7="$SERVO7"% > /dev/servoblaster"</action>
        </hscale>
      </frame>
    </vbox>
 </window>
'

gtkdialog -p MAIN_DIALOG -c 


今のところボタンは飾りなので、気にしない。

一応、できたってだけで、使い道は無い

2014年6月8日日曜日

Puppy パッケージマネージャの実験

Puppy Linux(Presice Puppy 5.7.1)でのパッケージマネージャに関する実験は続いている。


現状は、上の画像のような感じになってる。


「パッケージマネージャ:設定」で独自のuiファイルを選択できるようにしてある。


/usr/local/petget/configure.sh の55行目に適用するui名を追記↑
こうした、uiの追加登録・削除機能がGUIで提供されているのか否かは知らない。
(もし無いのなら、それを作ってみるのも一興か)



最近、OpenSSL関連の更新があったようだが、↑画像の下段部分に詳細情報を表示させるように
したので、更新情報の確認等に役に立つんじゃないかと目論んでいる。

2014年5月25日日曜日

マウス設定スクリプトの微調整

マウス設定のスクリプトで、Puppy Linuxの初期値(default)のポインタを、
擬似的にプレビューできるようにした。

SUB_DIALOGを表示する際に、MAIN_DIALOGにhideを与えるようにした。


※ 注意 ※
0)Precise Puppy 5.7.1JP でしか動作確認していません。
  動作には、gtkdialog0.8.3 xcur2png が必要です。
1)動作の保証はしません。
2)隠しファイルの操作をしています。
3)最悪の場合、Puppy Linux自体の不具合が起こります。

よって、スクリプトは読むだけ にしてください

以上宜しくお願いします。


#!/bin/bash 

#mouse_setting053

########## Page1 ##########
#設定ファイル.gtkrc.mineの存在を確認する
if [ ! -e /root/.gtkrc.mine ];then
  touch /root/.gtkrc.mine
  echo "gtk-double-click-time=250" > /root/.gtkrc.mine
  echo "gtk-double-click-distance=5" >> /root/.gtkrc.mine
fi

#/root/.config/rox.sourceforge.net/ROX-Filer/Optionsから
#bind_single_clickとbind_single_pinboardの値を切り出し、変数に代入
rox_path="/root/.config/rox.sourceforge.net/ROX-Filer/Options"

single_click_n=$(grep -n "bind_single_click" $rox_path)
single_click_n=$(echo $single_click_n | cut -f1 -d ":")

def_single_click_str=$(grep "bind_single_click" $rox_path)
def_single_click_value=$(echo $def_single_click_str | cut -c 34)
single_pinboard_n=$(grep -n "bind_single_pinboard" $rox_path)
single_pinboard_n=$(echo $single_pinboard_n | cut -f1 -d ":")
def_single_pinboard_str=$(grep "bind_single_pinboard" $rox_path)
def_single_pinboard_value=$(echo $def_single_pinboard_str | cut -c 37)

def_single_flag=`echo $(( $def_single_click_value + $def_single_pinboard_value ))`

if [ "$def_single_flag" != 0 ]; then
  def_single_click_boolean="false"
else
  def_single_click_boolean="true"
fi

#gtk-double-click-timeの値を.gtkrc.mineから切り出し、変数に代入
def_time_str=$(grep "gtk-double-click-time" /root/.gtkrc.mine)
if [ "$def_time_str" = "" ]; then
  echo "gtk-double-click-time=250" >> /root/.gtkrc.mine
  def_time_str=$(grep "gtk-double-click-time" /root/.gtkrc.mine)
fi
def_time_value=$(echo $def_time_str | cut -c 23-${#def_time_str})
#gtk-double-click-distanceの値を.gtkrc/mineから切り出し、変数に代入
def_distance_str=$(grep "gtk-double-click-distance" /root/.gtkrc.mine)
if [ "$def_distance_str" = "" ]; then
  echo "gtk-double-click-distance=5" >> /root/.gtkrc.mine
  def_distance_str=$(grep "gtk-double-click-distance" /root/.gtkrc.mine)
fi
def_distance_value=$(echo $def_distance_str | cut -c 27-${#def_distance_str})

########## Page2 ##########
#xset -qコマンドからマウス関連の数値を切り出し、変数に代入
temp_xset=$(xset -q)
def_acceleration_str=$(echo "$temp_xset" | grep "acceleration")
def_acceleration_value_str=$(echo $def_acceleration_str | cut -f2 -d " ")
def_acceleration_value=$(echo $def_acceleration_value_str | cut -f1 -d "/")
dot_point=$(echo $(( ${#def_acceleration_value} - 1 )))
front_value=$(echo "$def_acceleration_value" | cut -c 1-"$dot_point")
bottom_value=$(echo "$def_acceleration_value" | cut -c ${#def_acceleration_value}) 
def_acceleration_value=$front_value"."$bottom_value
def_threshold_value=$(echo $def_acceleration_str | cut -f4 -d " ")
def_x_parameter="m "$def_acceleration_value_str" "$def_threshold_value

#設定ファイル/.xset.shの存在を確認する
if [ ! -e /root/.xset.sh ]; then
  touch /root/.xset.sh
  chmod +x /root/.xset.sh
  echo "xset "$def_x_parameter > /root/.xset.sh
fi

########## Page3 ##########
default_png='
cat <<'EOF'>> /tmp/ao_o10yan_temp/left_ptr_000.png
/* XPM */
static const char * xpm_data[] = {
"16 16 2 1",
"       c None",
".      c #000000000000",
"                ",
".               ",
"..              ",
"...             ",
"....            ",
".....           ",
"......          ",
".......         ",
"........        ",
".....           ",
".. ..           ",
".   ..          ",
"    ..          ",
"     ..         ",
"     ..         ",
"                "};
EOF

cat <<'EOF'>> /tmp/ao_o10yan_temp/hand_000.png
/* XPM */
static const char * xpm_data[] = {
"16 16 2 1",
"       c None",
".      c #000000000000",
"                ",
"                ",
" ........       ",
".        .      ",
" ......   .     ",
"   .       .    ",
"    ...    .    ",
"   .       .    ",
"    ...   . .   ",
"   .     .   .  ",
"    ..  .     . ",
"      ..     .  ",
"      .  .  .   ",
"       .   .    ",
"        . .     ",
"         .      "};
EOF

cat <<'EOF'>> /tmp/ao_o10yan_temp/watch_000.png
/* XPM */
static const char * xpm_data[] = {
"16 16 2 1",
"       c None",
".      c #000000000000",
"   ........     ",
"   ........     ",
"   ........     ",
"  ..........    ",
" ..    .   ..   ",
"..     .    ..  ",
".      .     ...",
".     ...    ...",
".     ...    ...",
".    .       ...",
"..  .       ..  ",
" ..        ..   ",
"  ..........    ",
"   ........     ",
"   ........     ",
"   ........     "};
EOF
'
mkdir -p /tmp/ao_o10yan_temp
#symlinkの存在を確認する
if [ -e /root/.icons/default ]; then
  def_symlink=$(readlink /root/.icons/default)
  def_symlink_dir=$(echo $def_symlink | cut -f4 -d "/")
else
  def_symlink="/root/.icons/default"
  def_symlink_dir="default"
fi

#lsコマンドで列挙して<list>の<item>を作成する
temp_directories=$(ls /root/.icons/)
#echo $temp_directories
i_count=0
items="<item>default</item>"

if [ "$def_symlink_dir" = "default" ]; then
  def_selected_rwo=0
  eval "$default_png"
fi

for i in $temp_directories
do
  if [ "$i" != "default" -a "$i" != "ROX" -a -e "/root/.icons/""$i""/cursors" ]; then
    i_count=$(( $i_count + 1 ))
#    echo $i_count$i
    if [ "$def_symlink_dir" = "$i" ]; then
      def_selected_row="$i_count"
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$i"/cursors/left_ptr
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$i"/cursors/hand
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$i"/cursors/watch
    fi
    items=$items"<item>"$i"</item>"
  fi
#  echo $items
done

###############################################################################
#OKボタンが押された時に呼び出す
export ok_action='
#前処理
  msg_flag1=0
  msg_flag2=0
  msg_flag3=0
  
  new_time_str="gtk-double-click-time="$TIME
  new_distance_str="gtk-double-click-distance="$DISTANCE

#ダブルクリック、シングルクリックの切替設定
  if [ "'$def_single_click_boolean'" != "$CHKBOX" ]; then
    if [ "$CHKBOX" = "true" ]; then
      new_single_flag=0
    else
      new_single_flag=1
    fi

#ファイラとピンボードの設定を一緒に行う
#どちらかがシングル、どちらかがダブルと言う設定にはしない!!
    sed --in-place "'$single_click_n's/'$def_single_click_value'/$new_single_flag/" '$rox_path'
    sed --in-place "'$single_pinboard_n's/'$def_single_pinboard_value'/$new_single_flag/" '$rox_path'

    msg_flag1=1
  fi

#ダブルクリック間隔、反応距離の設定(文字列整形した後の比較じゃなくてもいいのに)
  if [ "'$def_time_str'" != "$new_time_str" -o "'$def_distance_str'" != "$new_distance_str" ]; then
    sed --in-place --expression=s/'$def_time_str'/$new_time_str/ /root/.gtkrc.mine
    sed --in-place --expression=s/'$def_distance_str'/$new_distance_str/ /root/.gtkrc.mine

    msg_flag1=1
  fi

#加速の設定
  if [ "'$def_acceleration_value'" != "$ACCELERATION" -o "'$def_threshold_value'" != "$THRESHOLD" ]; then
    new_acceleration=$(echo $ACCELERATION | sed "s/\.//")
    echo $new_acceleration
    new_x_parameter="m "$new_acceleration"/10 "$THRESHOLD
    echo $new_x_parameter
    xset $new_x_parameter
    
    sed --in-place "s:'$def_x_parameter':$new_x_parameter:" /root/.xset.sh

    msg_flag2=3
  fi

#テーマの変更
  new_symlink="/root/.icons/"$DIRECTORY
  echo "def_symlink="'$def_symlink'
  echo "new_symlink="$new_symlink
  if [ "$new_symlink" != "/root/.icons/" -a "'$def_symlink'" != "$new_symlink" ]; then
    if [ -e /root/.icons/default ]; then
      rm /root/.icons/default
    fi

    if [ "'$def_symlink'" != "$new_symlink" ]; then
      if [ "$new_symlink" != "/root/.icons/default" ]; then
        ln -s $new_symlink /root/.icons/default
      fi
      
      msg_flag3=1
    fi
  fi

#change_msg_flagにより、表示するメッセージを変える
  change_msg_flag=$(( $msg_flag1 + $msg_flag2 + $msg_flag3 ))

  if [ "$change_msg_flag" = "0" ]; then
    msg0="設定が変更されていません"
    msg1="何もせずに終了します"
    msg2="..."
  else
    msg0="マウスの設定を変更しました"
    msg1="Xサーバをリスタートして効果を確認してください"
    msg2="..."
#加速調整はxのリスタートなしで反映される
    if [ "$change_msg_flag" = "3" ]; then
      msg1="..."
    fi
    if [ "$msg_flag2" = "3" ]; then
      msg2="加速の変更は、既に反映されています。確認してください"
    fi
  fi

  export SUB_DIALOG="
    <window title=\"Double Click Adjust\" width_request=\"400\" height_request=\"300\">
      <vbox>
        <text height-request=\"40\">
          <label>"$msg0"</label>
        </text>
        <text height-request=\"40\">
          <label>"$msg1"</label>
        </text>
        <text height-request=\"40\">
          <label>"$msg2"</label>
        </text>
       <button height-request=\"100\"><label>閉じる</label>
          <action type=\"exit\">exit</action>
        </button>
      </vbox>
    </window>"

  gtkdialog -c --program SUB_DIALOG
'
###############################################################################
#マウステーマプレビュー用

export list_on_change='
  if [ "$DIRECTORY" = "default" ]; then
    if [ -e /tmp/ao_o10yan_temp/left_ptr_000.png ]; then
      rm /tmp/ao_o10yan_temp/left_ptr_000.png
      rm /tmp/ao_o10yan_temp/hand_000.png
      rm /tmp/ao_o10yan_temp/watch_000.png
      
      '$default_png'
    fi
  else
    temp_file_dir="/tmp/ao_o10yan_temp/"$DIRECTORY
    if [ "$temp_file_dir" != "/tmp/ao_o10yan_temp/" ]; then
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$DIRECTORY"/cursors/left_ptr
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$DIRECTORY"/cursors/hand
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$DIRECTORY"/cursors/watch
    fi
  fi
'
###############################################################################
#後始末
export del_temp='
  rm -rf /tmp/ao_o10yan_temp
  rm -f ./left_ptr.conf
  rm -f ./hand.conf
  rm -f ./watch.conf
'

###############################################################################

export MAIN_DIALOG=' 
  <window title="マウスの設定" width_request="400" height_request="300"> 
    <vbox>
      <notebook labels="ダブルクリック|加速|テーマ"> 
        <vbox>  
          <text>
            <label>ダブルクリック調整用スライダー</label>
          </text>
          <frame>
            <checkbox>
              <label>ダブルクリックを有効にする</label>
              <default>'$def_single_click_boolean'</default>
              <variable>CHKBOX</variable>
              <action>if true enable:TIME</action>
              <action>if false disable:TIME</action>
              <action>if true enable:DISTANCE</action>
              <action>if false disable:DISTANCE</action>
            </checkbox>
          </frame>
          <frame 間隔(ミリ秒)>
            <hscale range-min="250" range-max="2000" range-step="1">
              <default>'$def_time_value'</default>
              <variable>TIME</variable>
              <sensitive>'$def_single_click_boolean'</sensitive>
            </hscale>
          </frame>
          <frame 距離(ピクセル)>
            <hscale range-min="5" range-max="100" range-step="1">
              <default>'$def_distance_value'</default>
              <variable>DISTANCE</variable>
              <sensitive>'$def_single_click_boolean'</sensitive>
            </hscale>
          </frame>
        </vbox>
        <vbox>
          <text>
            <label>加速調整用スライダー</label>
          </text>
          <frame 加速(数値が大きい程、マウスが速く動きます)>
            <hscale range-min="1" range-max="10" range-step="0.1">
              <default>'$def_acceleration_value'</default>
              <variable>ACCELERATION</variable>
            </hscale>
          </frame>
          <frame 閾値(数値が小さい程、マウスが速く動きます)>
            <hscale range-max="20" range-min="1" range-step="1">
              <default>'$def_threshold_value'</default>
              <variable>THRESHOLD</variable>
            </hscale>
          </frame>
        </vbox>
        <vbox>
          <text>
            <label>マウスのテーマ切替</label>
          </text>
          <hbox>
            <list selected-row="'$def_selected_row'">
              <variable>DIRECTORY</variable>
              <width>150</width>
              <height>208</height>
              '$items'
              <action>bash -c "$list_on_change"</action>
              <action>refresh:LEFT_PTR</action>
              <action>refresh:HAND</action>
              <action>refresh:WATCH</action>
            </list>
            <frame プレビュー>
              <vbox>
                <pixmap space-fill="false" space-fill="false">
                  <variable>LEFT_PTR</variable>
                  <height>32</height>
                  <input file>/tmp/ao_o10yan_temp/left_ptr_000.png</input>
                </pixmap>
                <pixmap space-fill="false" space-fill="false">
                  <variable>HAND</variable>
                  <height>32</height>
                  <input file>/tmp/ao_o10yan_temp/hand_000.png</input>
                </pixmap>
                <pixmap space-fill="false" space-fill="false">
                  <variable>WATCH</variable>
                  <height>32</height>
                  <input file>/tmp/ao_o10yan_temp/watch_000.png</input>
                </pixmap>
              </vbox>
            </frame>
          </hbox>
        </vbox>
      </notebook>
      <hbox>
        <button ok>
          <action>hide:MAIN_DIALOG</action>
          <action>bash -c "$ok_action"</action>
          <action>bash -c "$del_temp"</action>
          <action type="exit">exit</action>
        </button>
        <button cancel>
          <action>bash -c "$del_temp"</action>
          <action type="exit">exit</action>
        </button>
      </hbox>
    </vbox>
  </window> 
 ' 

gtkdialog -c --program MAIN_DIALOG

2014年5月23日金曜日

Puppy パッケージマネージャに日付情報を付加する実験

パッケージマネージャで、インストールしたパッケージの一覧に日付情報を付加したいと思った。

或るパッケージをインストールすると、依存関係のライブラリやら何やら、沢山のパッケージを
インストールしなければならない場合がある。
後からパッケージマネージャを見たときに、インストール日時の情報があれば、近い時間帯に
インストールされたものは、依存関係によるものだと推測することができるんじゃないか。

で、実験してみた。
実験なので、実際には使わないでください!!


パッケージマネージャの下段「インストール済みパッケージ」にDate項目を追加されているのが
分かると思う。

Puppy Linux(Presice Puppy 5.7.1)では、/root/.packages/ 以下に
インストールされたパッケージの情報を持っている。
沢山の情報が集まった宝のディレクトリなのだが、今回注目するのは、その中の
user-installed-packages と言うファイル。
これは、ユーザがインストールしたパッケージ情報を書き込んだテキストファイルで、
パッケージマネージャは、ここの情報を間接的に)読み込んで表示している。
このファイルにパッケージをインストールした日時の記載があれば、それを使って、
パッケージマネージャに表示させられるんじゃないかと思った。

ところが、実際には日時の記載はない。
(逆にそれがあれば、何らかの方法で利用されているだろう)
そこで先ず、日付情報の書き込みから始める。

パッケージインストール時(?)に、user-installed-packages に情報の書き込みを行っているのは、
/usr/local/petget/installpkg.sh の669行目。

echo "$DB_ENTRY" >> /root/.packages/user-installed-packages

ここで日付を付加して書き込みを行うようにする。

temp_time=$(date)
echo "$DB_ENTRY""$temp_time" >> /root/.packages/user-installed-packages

次に、パッケージマネージャが表示のときに読み込むファイルを整形する必要がある。
パッケージマネージャは、/root/.packages/user-installed-packages を直接読んでいるのではなく、
/sur/local/petget/finduserinstalledpkgs.sh が用意するテンポラリファイル、
/tmp/petget/installedpkgs.results.post を読んでいる。

/tmp/petget/installedpkgs.results は、user-installed-packages の内容から、
パッケージマネージャで表示する項目だけを抽出したものになっている。
したがって、その抽出項目として日時を選んでやらないといけない。

/sur/local/petget/finduserinstalledpkgs.sh の11行目

cut -f 1,5,10 -d '|' /root/.packages/user-installed-packages > /tmp/petget/installedpkgs.results

user-installed-packages から「|」を区切り文字にして、1,5,10番目のフィールドを
抽出してテンポラリファイルに書き出している。
ここで、フィールドの最後に位置する日時を awk を使って抽出し、書き出しをする。

echo -n > /tmp/petget/installedpkgs.results
while read line;do
  temp_line=$(echo $line | cut -f1,5,10 -d "|")
  last_field=$(echo $line | awk -F "|" '{print $NF}')
  echo "$temp_line""|""$last_field" >> /tmp/petget/installedpkgs.results
done < /root/.packages/user-installed-packages

最初は、cut を使って「14番目のフィールド」を指定したが、パッケージによっては、
フィールド数が一定でないことが分かったので、「最後のフィールド」を取り出す方式に変更。
(この際、最初にテンポラリファイルを空にしておくことが必要)

更に、15行目

cut -f 1,3 -d '|' /tmp/petget/installedpkgs.results > /tmp/petget/installedpkgs.results.post-noicons #120908

を下のように変更。
(整形したテンポラリファイルから更に抽出する際に日時を含めるように、4番目のフィールドを追加)

cut -f 1,3,4 -d '|' /tmp/petget/installedpkgs.results > /tmp/petget/installedpkgs.results.post-noicons #120908

最後は、/sur/local/petget/ui_Classic の変更。
これは、gtkdialogの<tree>を使ってるので、

<label>$(gettext 'Package|Description|Date')</label>

上のように、3番めのcolumnとしてDateを追加するだけ。
「Date」のところをクリックすれば、日時での昇順・降順を切り替えることができる。

以上で、実験終了
終了したので、元に戻すのを忘れずに!


※ 余談 ※
抽出する項目
フィールド 1  パッケージの名称
フィールド 5  カテゴリー
フィールド 10  説明

カテゴリーは、columnとして使用するのではなく、ミニ・アイコン用に抽出してるらしい。
「説明」として、10番目をそのまま選択するのが見やすいかどうかは、別の問題としてあると思う。
何らかの整形をしないと、長い文章が表示されてしまう場合有り。

※ 追記 ※
/usr/share/locale/ja/LC_MESSAGES/petget__ui_Classic.mo を編集して、
columnの項目名を日本語表示(日時)にした。

2014年5月18日日曜日

Puppy パッケージマネージャの表示を修正

Presice Puppy 5.7.1 のPuppy パッケージマネジャで「すべてのレポジトリ内検索」を選択した時のこと。


検索結果の表示で、どのレポジトリに属するかを示すために、「説明」の先頭部分に、
[ubuntu-precise-universe]等の文字列が付加される。
更に、インストール済みのパッケージには、(ALREADY INSTALLED)の文字列も付加される。
そうすると、先頭部分で文字数を消費してしまうので、説明を読むためには横スクロールバー
で移動してやらないとならない。


そうすると、今度は肝心のパッケージ名が見えなくなってしまう↑
それならば、ウィンドウを大きくすれば見えるんじゃない?


うーん、どうしたもんでしょう。

色々と試した結果、/usr/local/petget/ui_Classic を下のように修正して使うことにした。


/usr/local/petget/ui_Classic

41行目の<hbox>にAttributeとして明示的に
space-expand=\"true\" space-fill=\"true\" を追加。

42行目の<vbox>にAttributeとして明示的に
space-expand=\"false\" space-fill=\"false\" を追加。
( \" ←これは、ダブルクォーテーションをエスケープしてるってことです)

以上で、ウィンドウを最大化した時に、少しだけ見やすくなった。

2014年4月6日日曜日

シェルスクリプトの余談

一つ前の投稿で、Puppy linuxに於けるマウス設定のシェルスクリプトの恥を晒した訳です。
その時点では、マウスのテーマ切替でdefaultのプレビューが表示できなかった。

defaultのプレビューが表示できない

それは、defaultのマウスカーソル画像を探したけど見つけられず、
gtkdialogの<pixmap><input file>で指定すべき画像を用意できなかったから。

で、考えたのは、画像を外部ファイルとして用意できなければ、シェルスクリプト内に
データとして持ってしまえば良いということ。
XPM形式のデータを埋め込んで、プレビュー用の画像に展開できることはすぐに確認できた。
ファイル形式がXPMでも、他の画像と共通に扱えるように、ファイル名は .png で終わるように
した。
が、肝心のカーソルのデータをどうやって作成すれば良いのか?

defaultのカーソルはcursor.pcfと言うファイルで、フォントの形式であるらしい。
下記参照。
http://www.murga-linux.com/puppy/viewtopic.php?search_id=742059936&t=85706

このcursor.pcfの中身を見るには、一旦bdfファイルに変換して、フォント編集ツールを
使えば良いとのこと。
先ず、pcf2bdfと言うツールでcursor.bdfを作り、それをfontforgeと言うツールで開く
ことにした。

cursor.bdfをfontforgeで開いてみた
これを基にして、下の図のようにXPMデータを記述。

left_ptrのXPMデータ
hnadのXPMデータ
watchのXPMデータ
結果、pngファイル名で書き出したXPMファイルが↓この様に表示された。

そして、こうなった

めでたし、めでたし(?)

2014年4月5日土曜日

マウスの設定周りをまとめたい

Puppy Linuxで、あっちこっちに散らばっているマウスの設定をまとめたい、
と思った。
・ダブルクリックの設定
・マウス加速の設定
・マウスのテーマ切替
これらを、一つのツールでやりたい、って事です。
(但し、現状ではホイール関連の設定についての調べができてない)

マウスのテーマ切替をするには、予めテーマをダウンロードして解凍し、
解凍してできたディレクトリをそのまま /root/.icons へコピーしておく。
(defaultの選択では、画像が表示されません)
(今現在使用しているテーマのディレクトリを削除すると不具合が起こります)

※ 注意 ※
0)Precise Puppy 5.7.1JP でしか動作確認していません。
  動作には、gtkdialog0.8.3 xcur2png が必要です。
1)動作の保証はしません。
2)隠しファイルの操作をしています。
3)最悪の場合、Puppy Linux自体の不具合が起こります。

よって、スクリプトは読むだけ にしてください

以上宜しくお願いします。



#!/bin/bash 

#mouse_setting042

########## Page1 ##########
#設定ファイル.gtkrc.mineの存在を確認する
if [ ! -e /root/.gtkrc.mine ];then
  touch /root/.gtkrc.mine
  echo "gtk-double-click-time=250" > /root/.gtkrc.mine
  echo "gtk-double-click-distance=5" >> /root/.gtkrc.mine
fi

#/root/.config/rox.sourceforge.net/ROX-Filer/Optionsから
#bind_single_clickとbind_single_pinboardの値を切り出し、変数に代入
rox_path="/root/.config/rox.sourceforge.net/ROX-Filer/Options"

single_click_n=$(grep -n "bind_single_click" $rox_path)
single_click_n=$(echo $single_click_n | cut -f1 -d ":")

def_single_click_str=$(grep "bind_single_click" $rox_path)
def_single_click_value=$(echo $def_single_click_str | cut -c 34)
single_pinboard_n=$(grep -n "bind_single_pinboard" $rox_path)
single_pinboard_n=$(echo $single_pinboard_n | cut -f1 -d ":")
def_single_pinboard_str=$(grep "bind_single_pinboard" $rox_path)
def_single_pinboard_value=$(echo $def_single_pinboard_str | cut -c 37)

def_single_flag=`echo $(( $def_single_click_value + $def_single_pinboard_value ))`

if [ "$def_single_flag" != "0" ]; then
  def_single_click_boolean="false"
else
  def_single_click_boolean="true"
fi

#gtk-double-click-timeの値を.gtkrc.mineから切り出し、変数に代入
def_time_str=$(grep "gtk-double-click-time" /root/.gtkrc.mine)
if [ "$def_time_str" = "" ]; then
  echo "gtk-double-click-time=250" >> /root/.gtkrc.mine
  def_time_str=$(grep "gtk-double-click-time" /root/.gtkrc.mine)
fi
def_time_value=$(echo $def_time_str | cut -c 23-${#def_time_str})
#gtk-double-click-distanceの値を.gtkrc/mineから切り出し、変数に代入
def_distance_str=$(grep "gtk-double-click-distance" /root/.gtkrc.mine)
if [ "$def_distance_str" = "" ]; then
  echo "gtk-double-click-distance=5" >> /root/.gtkrc.mine
  def_distance_str=$(grep "gtk-double-click-distance" /root/.gtkrc.mine)
fi
def_distance_value=$(echo $def_distance_str | cut -c 27-${#def_distance_str})

########## Page2 ##########
#xset -qコマンドからマウス関連の数値を切り出し、変数に代入
temp_xset=$(xset -q)
def_acceleration_str=$(echo "$temp_xset" | grep "acceleration")
def_acceleration_value_str=$(echo $def_acceleration_str | cut -f2 -d " ")
def_acceleration_value=$(echo $def_acceleration_value_str | cut -f1 -d "/")
dot_point=$(echo $(( ${#def_acceleration_value} - 1 )))
front_value=$(echo "$def_acceleration_value" | cut -c 1-"$dot_point")
bottom_value=$(echo "$def_acceleration_value" | cut -c ${#def_acceleration_value}) 
def_acceleration_value=$front_value"."$bottom_value
def_threshold_value=$(echo $def_acceleration_str | cut -f4 -d " ")
def_x_parameter="m "$def_acceleration_value_str" "$def_threshold_value

#設定ファイル/.xset.shの存在を確認する
if [ ! -e /root/.xset.sh ]; then
  touch /root/.xset.sh
  chmod +x /root/.xset.sh
  echo "xset "$def_x_parameter > /root/.xset.sh
fi

########## Page3 ##########
mkdir -p /tmp/ao_o10yan_temp
#symlinkの存在を確認する
if [ -e /root/.icons/default ]; then
  def_symlink=$(readlink /root/.icons/default)
  def_symlink_dir=$(echo $def_symlink | cut -f4 -d "/")
else
  def_symlink="/root/.icons/default"
  def_symlink_dir="default"
fi

#lsコマンドで列挙して<list>の<item>を作成する
temp_directories=$(ls /root/.icons/)
#echo $temp_directories
i_count=0
items="<item>default</item>"

if [ "$def_symlink_dir" = "default" ]; then
  def_selected_rwo=0
fi

for i in $temp_directories
do
  if [ "$i" != "default" -a "$i" != "ROX" -a -e "/root/.icons/""$i""/cursors" ]; then
    i_count=$(( $i_count + 1 ))
#    echo $i_count$i
    if [ "$def_symlink_dir" = "$i" ]; then
      def_selected_row="$i_count"
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$i"/cursors/left_ptr
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$i"/cursors/hand
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$i"/cursors/watch
    fi

    items=$items"<item>"$i"</item>"
  fi
#  echo $items
done

#####################################################################
#OKボタンが押された時に呼び出す
export ok_action='
#前処理
  msg_flag1=0
  msg_flag2=0
  msg_flag3=0
  
  new_time_str="gtk-double-click-time="$TIME
  new_distance_str="gtk-double-click-distance="$DISTANCE

#ダブルクリック、シングルクリックの切替設定
  if [ "'$def_single_click_boolean'" != "$CHKBOX" ]; then
    if [ "$CHKBOX" = "true" ]; then
      new_single_flag=0
    else
      new_single_flag=1
    fi

#ファイラとピンボードの設定を一緒に行う
#どちらかがシングル、どちらかがダブルと言う設定にはしない!!
    sed --in-place "'$single_click_n's/'$def_single_click_value'/$new_single_flag/" '$rox_path'
    sed --in-place "'$single_pinboard_n's/'$def_single_pinboard_value'/$new_single_flag/" '$rox_path'

    msg_flag1=1
  fi

#ダブルクリック間隔、反応距離の設定(文字列整形した後の比較じゃなくてもいいのに)
  if [ "'$def_time_str'" != "$new_time_str" -o "'$def_distance_str'" != "$new_distance_str" ]; then
    sed --in-place --expression=s/'$def_time_str'/$new_time_str/ /root/.gtkrc.mine
    sed --in-place --expression=s/'$def_distance_str'/$new_distance_str/ /root/.gtkrc.mine

    msg_flag1=1
  fi

#加速の設定
  if [ "'$def_acceleration_value'" != "$ACCELERATION" -o "'$def_threshold_value'" != "$THRESHOLD" ]; then
    new_acceleration=$(echo $ACCELERATION | sed "s/\.//")
    echo $new_acceleration
    new_x_parameter="m "$new_acceleration"/10 "$THRESHOLD
    echo $new_x_parameter
    xset $new_x_parameter
    
    sed --in-place "s:'$def_x_parameter':$new_x_parameter:" /root/.xset.sh

    msg_flag2=3
  fi

#テーマの変更
  new_symlink="/root/.icons/"$DIRECTORY
  echo "def_symlink="'$def_symlink'
  echo "new_symlink="$new_symlink
  if [ "$new_symlink" != "/root/.icons/" -a "'$def_symlink'" != "$new_symlink" ]; then
    if [ -e /root/.icons/default ]; then
      rm /root/.icons/default
    fi

    if [ "'$def_symlink'" != "$new_symlink" ]; then
      if [ "$new_symlink" != "/root/.icons/default" ]; then
        ln -s $new_symlink /root/.icons/default
      fi
      
      msg_flag3=1
    fi
  fi

#change_msg_flagにより、表示するメッセージを変える
  change_msg_flag=$(( $msg_flag1 + $msg_flag2 + $msg_flag3 ))

  if [ "$change_msg_flag" = "0" ]; then
    msg0="設定が変更されていません"
    msg1="何もせずに終了します"
    msg2="..."
  else
    msg0="マウスの設定を変更しました"
    msg1="Xサーバをリスタートして効果を確認してください"
    msg2="..."
#加速調整はxのリスタートなしで反映される
    if [ "$change_msg_flag" = "3" ]; then
      msg1="..."
    fi
    if [ "$msg_flag2" = "3" ]; then
      msg2="加速の変更は、既に反映されています。確認してください"
    fi
  fi

  export SUB_DIALOG="
    <window title=\"Double Click Adjust\" width_request=\"400\" height_request=\"300\">
      <vbox>
        <text height-request=\"40\">
          <label>"$msg0"</label>
        </text>
        <text height-request=\"40\">
          <label>"$msg1"</label>
        </text>
        <text height-request=\"40\">
          <label>"$msg2"</label>
        </text>
       <button height-request=\"100\"><label>閉じる</label>
          <action type=\"exit\">exit</action>
        </button>
      </vbox>
    </window>"

  gtkdialog -c --program SUB_DIALOG
'
#####################################################################
#マウステーマプレビュー用
export list_on_change='
  if [ "$DIRECTORY" = "default" ]; then
    if [ -e /tmp/ao_o10yan_temp/left_ptr_000.png ]; then
      rm /tmp/ao_o10yan_temp/left_ptr_000.png
      rm /tmp/ao_o10yan_temp/hand_000.png
      rm /tmp/ao_o10yan_temp/watch_000.png
    fi
  else
    temp_file_dir="/tmp/ao_o10yan_temp/"$DIRECTORY
    if [ "$temp_file_dir" != "/tmp/ao_o10yan_temp/" ]; then
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$DIRECTORY"/cursors/left_ptr
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$DIRECTORY"/cursors/hand
      xcur2png -d /tmp/ao_o10yan_temp /root/.icons/"$DIRECTORY"/cursors/watch
    fi
  fi
'
#####################################################################
#後始末
export del_temp='
  rm -rf /tmp/ao_o10yan_temp
  rm -f ./left_ptr.conf
  rm -f ./hand.conf
  rm -f ./watch.conf
'

#####################################################################

export MAIN_DIALOG=' 
  <window title="マウスの設定" width_request="400" height_request="300"> 
    <vbox>
      <notebook labels="ダブルクリック|加速|テーマ"> 
        <vbox>  
          <text>
            <label>ダブルクリック調整用スライダー</label>
          </text>
          <frame>
            <checkbox>
              <label>ダブルクリックを有効にする</label>
              <default>'$def_single_click_boolean'</default>
              <variable>CHKBOX</variable>
              <action>if true enable:TIME</action>
              <action>if false disable:TIME</action>
              <action>if true enable:DISTANCE</action>
              <action>if false disable:DISTANCE</action>
            </checkbox>
          </frame>
          <frame 間隔(ミリ秒)>
            <hscale range-min="250" range-max="2000" range-step="1">
              <default>'$def_time_value'</default>
              <variable>TIME</variable>
              <sensitive>'$def_single_click_boolean'</sensitive>
            </hscale>
          </frame>
          <frame 距離(ピクセル)>
            <hscale range-min="5" range-max="100" range-step="1">
              <default>'$def_distance_value'</default>
              <variable>DISTANCE</variable>
              <sensitive>'$def_single_click_boolean'</sensitive>
            </hscale>
          </frame>
        </vbox>
        <vbox>
          <text>
            <label>加速調整用スライダー</label>
          </text>
          <frame 加速(数値が大きい程、マウスが速く動きます)>
            <hscale range-min="1" range-max="10" range-step="0.1">
              <default>'$def_acceleration_value'</default>
              <variable>ACCELERATION</variable>
            </hscale>
          </frame>
          <frame 閾値(数値が小さい程、マウスが速く動きます)>
            <hscale range-min="1" range-max="20" range-step="1">
              <default>'$def_threshold_value'</default>
              <variable>THRESHOLD</variable>
            </hscale>
          </frame>
        </vbox>
        <vbox>
          <text>
            <label>マウスのテーマ切替</label>
          </text>
          <hbox>
            <list selected-row="'$def_selected_row'">
              <variable>DIRECTORY</variable>
              <width>150</width>
              <height>208</height>
              '$items'
              <action>bash -c "$list_on_change"</action>
              <action>refresh:LEFT_PTR</action>
              <action>refresh:HAND</action>
              <action>refresh:WATCH</action>
            </list>
            <frame プレビュー>
              <vbox>
                <pixmap space-expand="true">
                  <variable>LEFT_PTR</variable>
                  <height>40</height>
                  <input file>/tmp/ao_o10yan_temp/left_ptr_000.png</input>
                </pixmap>
                <pixmap space-expand="true">
                  <variable>HAND</variable>
                  <height>40</height>
                  <input file>/tmp/ao_o10yan_temp/hand_000.png</input>
                </pixmap>
                <pixmap space-expand="true">
                  <variable>WATCH</variable>
                  <height>40</height>
                  <input file>/tmp/ao_o10yan_temp/watch_000.png</input>
                </pixmap>
              </vbox>
            </frame>
          </hbox>
        </vbox>
      </notebook>
      <hbox>
        <button ok>
          <action>bash -c "$ok_action"</action>
          <action>bash -c "$del_temp"</action>
          <action type="exit">exit</action>
        </button>
        <button cancel>
          <action>bash -c "$del_temp"</action>
          <action type="exit">exit</action>
        </button>
      </hbox>
    </vbox>
  </window> 
 ' 

gtkdialog -c --program MAIN_DIALOG