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

0 件のコメント :

コメントを投稿