2014年12月29日月曜日

Arch Linux まぁだだよ

前回、Xサーバの起動を確認したので、デスクトップ環境の整備や
日本語まわりの設定をやりたいところだけど、せっかくなので、
ウィンドウマネージャ無しの状態をもう少し味わってみる。

先ずは現状を確認するために、デフォルト(共有の設定ファイル?)
として読み込まれる
/etc/X11/xinit/xinitrc
を覗いてみる。

xinitrc は大きく三つの部分に分かれているように見える。

前段は、XresourcesやXmodmapが存在した場合は、それらを読み込む。
(但し、特別に用意しなければデフォルトでは存在しなかったり、非推奨な
設定ファイルなりなので、ここは気にしなくて良いと思う。ってヲイ!)

中段は、/etc/X11/xinit/xinitrc.d ディレクトリ内の実行可能ファイル
(スクリプト)を順次実行させる。

後段が、

twm &
xclock -geometry 50x50-1+1 &
xterm -geometry 80x50+494+51 &
xterm -geometry 80x20+494-0 &
exec xterm -geometry 80x66+0+0 -name login

twm(ウィンドウマネージャ)、xclockはインストールしていないので、
"command not found"と言われる。
(このエラーでXの起動工程が止まる訳じゃない)

xterm(端末エミュレータ)は、"-geometry"で、サイズ、位置を指定して
起動される。
一般的にサイズは、横幅x高さをピクセル単位で指定するが、
xterm の場合は文字数x行数になるので注意されたし。


/etc/X11/xinit/xinitrc を適当に書き換えて xterm を一つだけ起動し、
そこから別のウィンドウを起動させる。
プロセスIDを指定して kill すればウィンドウを閉じることもできる。
(画像では、xterm しか起動していないので、その上で exit するば良いけど)

2014年12月6日土曜日

Arch Linux Xサーバ(クライアント)インストール メモ

Arch Linux Xサーバのインストール メモ
 前回の「Arch Linux インストール手順」の後、
 起動して、rootでログイン(root以外のユーザを、まだ作っていない)
 ※ Xのインストール前にログインユーザを作成したり、
  コンソールのKEYMAPを設定するために
  /etc/vconsole.conf を新規作成して
  KEYMAP=jp106 の記述をしておいても良い。


①Xサーバのインストール
# pacman -S xorg-server xorg-server-utils xorg-xinit

②ビデオ・チップセットの確認
# lspci | grep VGA

③ビデオドライバの一覧表示
# pacman -Ss xf86-video | less

④ビデオドライバのインストール
※ ②で調べたチップセットに該当するドライバを
  ③の中から確認しておいて、それをインストールする。
# pacman -S xf86-video-intel
 (↑は、intelドライバの例)

Xサーバのインストールが終わった後、この状態で startx してみるのも一興。
(クライアントが無いので、起動しないことを確認するだけ)

⑤クライアントのインストール
# pacman -S xterm
(とりあえずX標準の端末エミュレータを選択)

⑥起動確認
# startx
(この段階では、デフォルトの /etc/X11/xinit/xinitrc の記述にしたがって
 Xの起動、クライアントの起動が確認できるはず。
 但し、ウィンドウマネージャの twm をインストールしていないので
 ウィンドウ枠無、マウスでのウィンドウ操作ができないことを確認する。
 xclockをインストールしていないので、時計も表示されないことを確認。 )

 左の大きなウィンドウで表示されているxterm上で
exit すれば、コンソールに戻る。

2014年10月13日月曜日

Arch Linux インストール手順 メモ

Arch Linux インストール手順
インストール先 sdc2
(ディスクのパーティショニングは予めGParted等でやっておく)
無線LAN使用


①インストールディスク起動

②ネットワーク接続
# wifi-menu

③ミラーリスト編集
# nano /etc/pacman.d/mirrorlist
(Server = http://ftp.jaist.ac.jp/pub/Linux/ArchLinux/$repo/os/$arch
をトップへ)

④インストール先をマウント
# mount /dev/sdc2 /mnt

⑤ベースシステムのインストール
# pacstrap /mnt base base-devel
(インストール後wifi-menu使用の為 → dialog wpa_supplicant追加
NetworkManagerが必要な場合は、networkmanagerも追加)

⑥fstab生成(nanoで確認)
# genfstab -U -p /mnt >> /mnt/etc/fstab
(# nano /mnt/etc/fstab)

⑦chrootとrootパスワードの設定(ホスト名設定)
# arch-chroot /mnt /bin/bash
# passwd
(# echo (ホスト名) > /etc/hostname)

⑧grubインストール
# pacman -S grub
# grub-install --target=i386-pc --recheck /dev/sdc

# grub-mkconfig -o /boot/grub/grub.cfg



※追記(2014/11/01)※
# exit
# umount /mnt
# poweroff

2014年9月21日日曜日

ArchBang OperaでHTML5 Video再生

ArchBang(archbang-rc-2014.06.03-i686)のWebブラウザはFirefoxだが、
私はOperaを入れている。

そのOperaでYouTubeをHTML5 Video再生する方法。
(Flashで再生できれば、それでOKだろうが、私の環境ではFlashが上手く
 行かなかった)

・gstreamer をインストール
 (私は gstreamer0.10(Legacy but widely used version.) を選択した)
・同時に、gstreamer0.10-base-plugins と gstreamer0.10-good をインストール
・YouTubeで「HTML5 プレイヤーをリクエストする」を選択する



WebM VP8 にチェックが付いた

参考ページ
https://wiki.archlinux.org/index.php/GStreamer
https://bbs.archlinux.org/viewtopic.php?id=145968



2014年9月19日金曜日

ArchBang uimのF9・F10変換

ArchBang の日本語入力で uim を使い、F9やF10で英数字に変換しようとして、
子音が削除されてしまう場合の設定。

・uim-pref-gtk(uim の設定)を起動
・グループの「ローマ字・かな変換」を選択
・「かなに対応していない子音をローマ字として残す」のチェックを入れる
・「適用」ボタンを押す



(但し、shiftキーでの"大文字交じり"には上手く対応してないみたいなので、
 そこは、uim を切っての使用になると思います)


ArchWiki には別の方法も紹介されてます。

2014年8月14日木曜日

ArchBang でCG-WLUSB300NWHを使う

Dimension 4500CにArchBangを入れた。
このPCはUSB無線LANアダプタCoregaのCG-WLUSB300NWHで接続している。
しかし、ArchBangではこのアダプタを正常に認識してくれない。
ドライバは読み込まれているらしいが、ネットワークマネージャで
接続しようとしても「デバイスの準備ができていません」と言われる。

これは、あれですね。標準のモジュールでは対応していないから、
別のドライバを探してね、ってことですね。
以前にWindows用のドライバを ndiswrapper で使ったので、
同じ方法でいけると予想。

ArchBangにはndiswrapperが標準で入っていない。
早速 pacman -S ndiswrapper を実行してみるも、
「エラー:対象が見つかりませんでした」と言われる。
仕方がないので yaourt を使って AUR から入れることにする。
(yaourt や AUR については、ArchWikiを参照してください。
その際、base-devel を入れるのをお忘れなく。
これは、yaourt を使ってパッケージを作成する時に必要な
開発環境のツール群です。)
https://wiki.archlinux.org/index.php/Yaourt_(日本語)

サポートがないパッケージ:潜在的に危険です!」と表示されるが
それは承知の上なので操作を進める。

ビルドが成功し、インストールが済むと ndisgtk も入れたらどうか
聞かれるが、いざインストールしようとすると、ndisgtkはAURにも
登録がない。
と言うことで、GUIは諦めてArchWikiを参照しながら設定する。
https://wiki.archlinux.org/index.php/Wireless_Setup_(日本語)#ndiswrapper

(中略)

うーん。ndiswrapperを通して、ネットワークマネージャから
接続できるようにはなるんだが、、、。
上手く繋がるときと、できないときがある。
接続後も、切断されることが度々ある。
具合悪いですね。

nidswrapperを諦めて、他の方法を探しましょうかね。

調べてみると、ドライバが入っているのに認識されない、
接続できない場合は、対応する firmware を入れれば良い、
と言うような事が書かれている。

lsusb コマンドで見ると、CG-WLUSB300NWHは、チップに
Realtek RTL8192U を使用している事が分かる。
これに対応するfiemwareを使えば良いはず。

firemwareは、/lib/firmware 以下にあり、そこを眺めてみると
/lib/firmware/RTL8192E と言うディレクトリがあるじゃないですか。
似たような番号のfirmwareなら使えるんじゃないかと考えて、
/lib/firmware/RTL8192U ディレクトリを作成して、その中に
RTL8192E以下の三つのファイル
  boot.img
  data.img
  main.img
をコピペした。
ndiswrapperを読み込まないようにしてから、再起動を掛けると、
いとも簡単に接続できた。
ところが、接続情報を見ると、速度が 1Mb/sしかない??
今までは、65Mb/sは出ていたので、これは酷い。
やっぱり、RTL8192U と RTL8192E では違うのか。

「RTL8192U firmware」で検索するとDebian Wikiの情報が
真っ先に出てくる。
が、読んでみると

RTL8192U firmware is currently not packaged

なんですと?!(この記述のところにバグレポートへの
リンクもあるので、興味のある方は読んでみても良いかも)

それでも、さらに探していくと

rtl8192u-firmware-1.0-1.1.src.rpm

と言うものが見つかる。
これを展開してできた上記の三つのファイルを、
/lib/firmware/RTL8192U に入れて再起動する。

OK!
ログイン後、すぐに接続でき、速度も65Mb/s出てる。
これで安心して使えるようになりました。 

2014年8月3日日曜日

ArchBang 壁紙の変更

壁紙やウィンドウマネージャ、ツールキットのテーマの変更で、
「見た目はどうにでもなる」。


壁紙の変更は、
/home/(ユーザ名)/.config/openbox/autostart を編集して、
hsetroot コマンドで画像ファイルを指定する。
下の行は、私の編集例。

hsetroot -fill /home/o10yan/Pictures/A4wx6.jpg  &





詳しくは↓を参照。
http://manpages.ubuntu.com/manpages/dapper/man1/hsetroot.1.html




因みに、
ログイン画面は、lxdmでの制御なので、
/etc/lxdm/lxdm.conf の以下の行を編集。

## background of the greeter
bg=/usr/share/wallpapers/OpenSky.jpg

2014年7月27日日曜日

ダブルクリック なんて無い!

そうですよね?

クリック・イベントが連続して発生したとき、
二つのイベント発生座標と時間をみて、
一定範囲内、一定時間内だった場合に特別な意味を
持たせているだけですよね?

ArchBang でのダブルクリック

ArchBang(archbang-rc-2014.06.03-i686)の初期状態では、ファイルマネージャの
SpaceFMが入ってる。
この、ダブルクリックがやはり問題で、私のノートPCのタッチパッドでは、
非常に困難な操作となる。

で、インストール後すぐにやったのが、ダブルクリック間隔の調整。

/home/(ユーザ名)/.gtkrc-2.0 があったので、これを開いてみる。



# Any customization should be done in ~/.gtkrc-2.0.mine instead.

と書いてあるので、.gtkrc-2.0.mine を新規作成し、

gtk-double-click-time=1000

を記述して保存。再起動する。

※ 追記(2014/08/11 13:55) ※
インストール直後だと、.gtkrc-2.0.mine が有効じゃ無いので、
Customize Look and Feel を使ってGTKテーマの変更などをしてみてください。
そうすると変更内容が、.gtkrc-2.0 に上書きされて .gtkrc-2.0.mine が有効になります。

Leafpad ではダブルクリック間隔の調整はOKだが、肝心の SpaceFM で効いていない。
さては、SpaceFM は、gtk3ベースなんだな。
そこで、.config/gtk-3.0/setteings.ini に同様の記述をして、SpaceFM でもOK。
※注意※
settings.ini GTKテーマを変更すると上書きされてしまうのでその場合
再度 gtk-double-click-time= 記述をし直す必要あり


とは言うものの、SpaceFM は使っていない。
現在は、PCManFM をインストールして使っている。



gtkベースのなら上述の設定が効いているのでインストール直後から普通に
ダブルクリックができる。
(Qtはどうか、って? 御免なさい。分かりません)

2014年7月20日日曜日

ArchBang ものぐさインストール

ノートPC Mebius PC-BJ120 M(Celeron 433MHz 192MB)に
ArchBang(archbang-rc-2014.06.03-i686)をインストールした。
その手順の覚書。

インストールの詳細に関しては、検索すれば沢山出てくるので、そちらを参考に。
(自分は↓こちらを参考にしました。有り難うございました)
http://hgeekooohay.blogspot.jp/2012/12/archbang-201212_18.html


PC-BJ120 Mには、Windows98(SE)とPrecise-571JP(Puppy Linux)が
インストールされており、そこに新たなパーティションを設けて、
ArchBangをインストールし、マルチブートを実現する目論見。


 ・ダウンロードしたisoイメージをCDに焼いておく。

 ・Puppy Linuxを起動してGpartedで、パーティションを用意しておく。
   sda1  Windows98
   sda2  Puppy Linux
   sda3  ArchBang(インストール予定)
   sda4  Linux用swap領域

 ・CDからArchBangを起動してデスクトップで右クリック、
  メニューからInstallを選択。

 ・基本は、インストールメニューの順番通りに実行。

 ・Disk(s) preperation は選択してパーティションの設定まで進めるが、
  予めパーティションを設けてあるので、何の変更もせずにQuitして、
  Doneで、次の Install system に進む。

 ・Install system が済んだら Configure system(上述のリンク先参照)を設定。

 ・Install Bootloader は飛ばして、Quit を選択する

 ・「ブートローダ入れてないけど、それで良いの?」みたいなメッセージが
  出るが、そのまま終了する。

 ・再起動して、Puppy Linuxの Grub4Dos を実行。Grub4Dos が ArchBang を
  みつけて、menu.lst を作成してくれる。
  (但し、そのままでは ArchBang が起動しないので)
  menu.lstの編集 を選んで、エディタで開く。
  タイトルを適当に変更し、
   kernel /boot/vmlinuz-linux root=/dev/sda3 ro
  の行のすぐ下に次の一行を追記する。

   initrd /boot/initramfs-linux.img

























 ・Grub4Dos を終了して、PCを再起動。

 ・GRUB4DOSのメニューに、↑で設定した ArchBang が表示されるので、
  それを選んで起動。


以上で、ArchBang は、基本的な操作が可能な状態で起動する。
パーティションを準備したり、ブートローダをインストールしたりの面倒そうなところを、
他のOSのGUIで済ませようという、ものぐさインストールの完了。

後は、個別の設定になる。
壁紙の変更、無線LANの設定、日本語入力環境のインストール、常用アプリケーションの変更
等々、、、。
それらについては、追々書いて行きたいと思う。


こうなる迄の過程は次へ、、、(?)

2014年7月15日火曜日

ArchBang 始めました

ArchBang 始めました。


Mebius PC-BJ120 M(Celeron 433MHz 192MB)に
ArchBang(archbang-rc-2014.06.03-i686)を入れました。
Windows98、Precise-571JP(Puppy Linux)とのマルチブートです。

先ず調整したのは、ダブルクリック間隔です(笑

2014年6月28日土曜日

Lubuntu マウスのポインタ加速調節


Lubuntu で、マウスのポインタ加速は、
メニューから 設定→キーボードとマウス と開いて、マウスタブの
「モーション」で、加速・感度スライダーで調節できる。

なるほど。
加速スライダーの値は、xset で10分の1になる数値で、右に行くほど加速される。
(加速と言うか、<一定時間内の>ポインタ移動量を何倍するかと言う数値だそうですが、、、)
感度スライダーの値は、xset に逆進反映される値で、右に行くほど短い移動量で、加速される。
(110からスライダーの値を引くことで xset での閾値が設定されるらしい。
 スライダーを最も低い10すれば、110-10=100
 最も高い100にすれば、110-100=10 と言う数値が反映される)

両スライダーともに、右へ移動させることで、マウスポインターの移動が加速されるので、
分かり易い作りになっていると思う。

が、残念ながら、感度の調節できる範囲に不満がある。
現状のGUIでは、10~100ピクセルの間でしか閾値の設定ができない。

「加速も感度も一番高い設定にしてるのに、なんか加速が今一なんだよな」と思った
人も居るのではないか。
斯く言う私がその一人。

私は、/home/[ユーザ名]/.config/lxsession/Lubuntu/desktop.conf を編集して
使っている。
このファイルの、[Mouse]セッションにある
AccFactor (加速スライダーでの設定値に等しい)
AccThreshold (110から感度スライダー設定値を引いた値)
を任意に書き換えることで、望みの加速を実現できる(?)

4ピクセルの移動に8倍の加速設定。
(AccThresholdをスライダーで設定できるより小さい値にした例)

この二つの数値を色々と組み合わせて、最適な加速設定を探してみては、、、。



※ 勿論、その気になればzenityなどを使って、GUIで設定できるスクリプトを書くことも
可能でしょう。

2014年6月22日日曜日

初めての zenity

Lubuntu でのダブルクリック間隔の調節用のシェルスクリプトを作ってみた。



初めて zenity を使ってみたので、例によって動作の保証はありません。

スクリプトは読むだけにして、使わないでください。

#!/bin/bash

#mouse_setting_lz01

#ユーザの確認及びパスの設定
current_user=$(whoami)
rc_path="/home/""$current_user""/.gtkrc-2.0"
ini_path="/home/""$current_user""/.config/gtk-3.0/settings.ini"

#ユーザのホームディレクトリに.gtkrc-2.0が存在するかを確認し、無ければ作成して値を書き込み
if [ ! -e "$rc_path" ];then
  echo -n > $rc_path
  echo "gtk-double-click-time=250" > $rc_path
fi

def_time_str=$(grep "gtk-double-click-time" $rc_path)
if [ "$def_time_str" = "" ];then
  echo "gtk-double-click-time=250" >> $rc_path
  def_time_str=$(grep "gtk-double-click-time" $rc_path)
fi
def_time_value=$(echo $def_time_str | cut -c 23-${#def_time_str})

#ユーザの.config/gtk-3.0ディレクトリにsettings.iniが存在するかを確認し、無ければ作成して値を書き込み
if [ ! -e "$ini_path" ];then
  echo -n > $ini_path
  echo "[Settings] " > $ini_path
  echo "gtk-double-click-time=250" >> $ini_path
fi

def_time_str_ini=$(grep "gtk-double-click-time" $ini_path)
if [ "$def_time_str_ini" = "" ];then
  echo "gtk-double-click-time=250" >> $ini_path
fi

#zenityのscaleを使って値を変更
new_time_value=$(zenity --scale --text="ダブルクリックの間隔を設定(ミリ秒)" --min-value=250 --max-value=1500 --value=$def_time_value)

#ダブルクリック間隔変更、設定
if [ "$?" = "0" ];then
  new_time_str="gtk-double-click-time=""$new_time_value"
  if [ "$def_time_str" != "$new_time_str" ];then
    sed --in-place --expression=s/$def_time_str/$new_time_str/ $rc_path
    sed --in-place --expression=s/$def_time_str/$new_time_str/ $ini_path
    zenity --info --text="設定を変更しました。再起動してください"
  else
    zenity --info --text="設定の変更はありません"
  fi
else
  zenity --info --text="キャンセルしました"
fi

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年5月6日火曜日

Puppy Linuxのdefaultfilerスクリプトをやっつけ仕事

PmountやPfindを使うと、ROX-Filerが起動するけど、環境によって使い分けたい。
XfceではThunar、KDEではDolphinを使いたいと言うだけの話。

/usr/local/bin/ に defaultfiler のスクリプトが見あたらなかったので、やっつけで作った。

#!/bin/sh

CURRENTWM="`cat /etc/windowmanager`"

case "$CURRENTWM" in
  "startxfce4") exec thunar "$1";;
  "startkde") exec dolphin "$1";;
  *) exec rox "$1";;
esac

/usr/sbin/pmount の422行目をコメントアウトして、defaultfilerで開くように編集。

#    exec rox -x /mnt/$DEVNAME -d /mnt/$DEVNAME #want this window on top.
  exec /usr/local/bin/defaultfiler /mnt/$DEVNAME

pfind は、設定を変更。


※ 追記 ※
pfind は設定の変更で良いと思ったけど、何か固まるので、
/usr/local/pfind/pfind の409行目の rox を defaultfiler に変更した。
検索結果のディレクトリを開くだけで、該当ファイルの位置までスクロールしないけど、気にしない。
(気にしろよヲイ!)

2014年5月5日月曜日

Puppy Linux でKDEを使っちゃおう

Precise Puppy 5.7.1JP にKDEのSFSを読み込ませたら、簡単に動いた。

本家(英語版)フォーラムの KDE 4.10.1, 99mo ! から kde4.10.1.sfs をダウンロードし、
読み込ませる。
「Bootマネージャ」から「起動時にどの追加SFSファイルをロードするかを選択」あるいは、
「SFS-Load オン・ザ・フライ」を使用するだけなので、超簡単。



「起動時にどの追加SFSファイルをロードするかを選択」の場合、文字通りに起動時に有効になるので、
再起動してから、一旦プロンプトに戻り、xwin startkde とする。

「SFS-Load オン・ザ・フライ」なら、再起動は必要ないので、そのままプロンプトに戻り、
xwin startkde とする。


このままでも良いのだけど、Puppy Linuxのシステムトレイを表示させるため(?)に、
/root/.xinitrc に編集を加える。

上の図のように、exec startkde の前に /usr/sbin/delayedrun & を追加。
(その上の /sbin/pup_event_frontend_d & に関してはコメントアウトの有無による違いを確認できてません。)



これで、システムトレイが表示される。
ボリュームコントロール(ミキサー)が二つになっているのはご愛嬌。片方を消せば良い。

さて、賢明なる読者諸兄に於かれましては、上のエディタ画像右側を目にして、お察しのことだろう。
今回の .xinitrc への変更は、スクリプトの前半部分に行っている。
(元々の .xinitrc がKDEに関しては、この位置に記述している。)
パネルを読み込んだり、ピンボード機能を有効にする前の段階で、exec startkde として、
デスクトップ環境を立ち上げている。

ならば、Xfceも同様に、前段階でデスクトップ環境を立ち上げてしまえば、後の諸々は必要ない
のではないか?

(やってみましたが、大丈夫そうですよ)

2014年5月4日日曜日

aho が Puppy Linux で使うパネルとは?

前回の「Puppy Linuxのプロンプトで xwin aho としたら」に引続き .xinitrc の話題。
もし、「AO_o10yanのやってることはPuppy Linuxの意図しない使い方だ」と思ってるならば、
以下は読まないでください。
/root/.xinitrc を読んで、「あれ?これってスクリプトの書き方として変じゃね?」って思った人は、
読んでも良いかもしれません。但し、既にそう思っている人には目新しい話では無いですが。

それでは、、、。

前回提示した画像を改めて見てみる。


これを見て、気付いた人もいると思う。
そう、ウィンドウマネージャはJWMなのに、画面下部に表示されてるパネルは、標準のトレイでは
ない。ここで表示されているのはLXPanelだ。
私は、Openboxを使用する際に表示するパネルとしてLXPanelを入れている。

LXPanelの表示を上にすれば見慣れたトレイが現れる。

上の画像を見れば分かる通り、標準トレイは表示されていたが、LXPanelに隠れて見えなかった、
ってこと。

これは、私がJWMのトレイとLXPanel の両方を表示させたかった訳ではなく、単純に
.xinitrc にそうなるように書かれているからに過ぎない。

#v3.95 support fbpanel tray/taskbar...
#only launch tray for w.m. without inbuilt tray...
if [ "$CURRENTWM" != "jwm" -a "$CURRENTWM" != "icewm" ];then
if [ -f /usr/bin/fbpanel ];then
#a bit of a hack: when 3builddistro runs fixmenus, which calls variconlinks,
#which populates /var/local/icons with symlinks, /usr/local/lib/X11/pixmaps
#is not yet populated (happens at first boot, from default icon theme)...
[ ! -e /var/local/icons/home48.png ] && ln -fs /usr/local/lib/X11/pixmaps/* /var/local/icons/
fbpanel &
fi
[ -f /usr/bin/lxpanel ] && lxpanel &
fi

じゃあ、それは xwin aho とした時だけの問題かって言えば、一目瞭然。

↓この画像を見てね。

Xfceで下部パネルが重なっている。

/etc/windowmanager に jwm と icewm 以外の記述があった場合、
lxpanel の存在を判定して、lxpanel があればそれを起動。

/etc/windowmanager に startxfce4 って書いてあっても同じじゃないのか?

私は取り立てて特別なことをしているつもりは無い。
パッケージマネージャからXfce4を入れているだけだ。
Presice Puppy 5.7.1から、Ubuntuのリポジトリを利用してパッケージのインストールが
できるようになったらしいので、それならば、それなりの対応をしないと駄目なんじゃないか?
と思う。
狭い範囲で、謂わば特殊な環境のみを対象にしたディストリビューションであることは、
エクスキューズに使えなくなってるんじゃないのか?との疑問を持ちつつある。




※ 余談 ※
.xinitrc の中に、下の記述を見つけた人もいるでしょう。

if [ "$CURRENTWM" = "xfwm4" ];then
if [ "`which xfce4-panel`" != "" ];then
xfwm4 --daemon #note, starts xfce-mcs-manager daemon also.
exec xfce4-panel
fi
fi

そう。単体のウィンドウマネージャとして xfwm4 を動かした場合に、xfce4-panel を
起動しておく記述。
単体で xfwm4 を動かしたことのある人なら疑問に思うでしょう。
「LXPanelが表示されないじゃん?重複しないじゃん?」って。

私も、デスクトップ起動後に端末から # lxpanel として、

tray: another systray already running

となりつつも、LXPanel が表示されることを確認したり、
試しにこのブロックを、上述の lxpanel 起動部分の下へ移動してみました。
そして、起動する順番を変更すると、パネルが重複して表示されることを確認しました。

確かなことは分かりませんが、順番と、デスクトップ環境からセッションで起動するとの違い
なのかと、感じています。(←「感じ」ってのも変ですが)

2014年4月21日月曜日

Puppy Linuxのプロンプトで xwin aho としたら

Puppy Linuxのプロンプトで

# xwin aho

としたら、JWMが起動するが、メニューのシャットダウン関係の項目が
効かなくなる。


当然だ。
そんな aho なウィンドウマネージャ(以下WMと表記)など存在しないから。
じゃあ、存在しないWMを指定して起動させた場合のPuppy Linuxの挙動は
これで良いのか?

馬鹿を言っちゃいけない。
ahoな指令はちゃんとエラーを出すか、代替のWMを起動させるなら、それが正常に
動くようにしなくちゃ駄目でしょう!!

/usr/bin/xwin の77行目のコメント以下81行目まで。
xwin に渡された引数を $1 で参照してはいるものの、引数の有無を見ているだけで、
何ら評価が行われていないんじゃないのか?

渡された文字列は何でも良いのですか?
WMを起動しろと言うコマンド、あるいは起動用のファイル名、
それが実行可能なのか、ファイルが存在するのか、それはWMを指定しているのか、、、。
それらの評価がない。
だから、aho な文字列を渡したら、それを /etc/windowmanager ファイルへ書き込んでしまう。
そこの注意書きには「/root/.xinitrc use this file.」と記されている。

ちょっと、意図を推し量りかねる。

Puppy Linuxでは、 /etc/windowmanager を読んで、使用されているWMを特定し、
それを使うスクリプト等が存在する。シャットダウン関連の項目もその例だろう。
実際に使用しているWMがJWMなのに aho を終了させようとしたって、そりゃ無理ですわ。

何故こんなことになるのか。
xwin での書き込みも重用だが、それを読み込む .xinitrc にも疑問がある。

.xinitrc では諸々の設定が終わった最後の方で、WMを実行している。
そこの記述。

which $CURRENTWM && exec $CURRENTWM
[ -x $CURRENTWM ] && exec $CURRENTWM
exec jwm

素人が見て分かる範囲では、
busybox に含まれる Unix コマンドの which を使って、
実際にコマンドの場所を指定し、あれば実行。
[ -x]でファイルが実行可能かを判定して実行。
最後の exec jwm は上記が否定された場合に実行。
(上記が実行されれば以下は無視?)
だろうと思われる。

えっ?

ってなるよね!!
$CURRENTWM が否定された場合、そのままなの?
変数を読み込んだ元ファイルの /etc/windowmanager は修正しないの?
そこを、実際に実行する jwm に書き換えておけば、起動後 /etc/windowmanager を
読み込むスクリプト等が動いても、齟齬を来すことはないはず。

実際には、$CURRENTWM で読み込まれている文字列が、WM以外のコマンドや実行ファイル名と
重複していないか、判定しなければならないだろう。
逆にいえば、Puppy Linux で対応できるWMを予め列挙した文字列をデータに持ち、
それに該当しない文字列ならば、強制的に jwm として処理する方法をとれば良い。
(xwin で書き込む際に判定しても良いはず)


「xwin aho なんてのは想定していません。そんなことする人は使わなくて良いです」
って、言われればそれまで。
私が悪かったです。申し訳ありません。



which $CURRENTWM && exec $CURRENTWM
[ -x $CURRENTWM ] && exec $CURRENTWM
echo -n "jwm" > /etc/windowmanager
exec jwm

↑のように "jwm" を書き込む1行を加えるだけでも、対症療法にはなると思うんだけどな、、、。

2014年4月19日土曜日

Puppy Linux にXfceをいれたら

Precise Puppy 5.7.1JPに色んなウィンドウマネージャ(以後WMと表記)を入れてみた。
JWMは元から入っているもので、IceWM、Fluxbox、Openboxを追加した。


これらの「単体」のWMには、壁紙の表示やデスクトップアイコンを表示する機能がない
(らしい)ので、お馴染みのROX-Filerのピンボード機能をそのまま使ってる。
(勿論、ROX-Filerのピンボードを使わずとも、Idesk等で実現できることは以前のブログに
書いたとおり)
そして、パネルに関してはOpenbox用にLxpanelを入れてある。

さて、、、。問題はXfce。

Xfceはデスクトップ環境なので、当然単体のWMとは違う。
Xfceで使われているWMはxfwmなので、これを単体でいれる分には、
上記WMと同じくROX-filerのピンボード機能を使って問題ない。

でも、デスクトップ環境を導入するとなれば別のはなし。

XfceにはWMの他にセッションマネージャ、ファイルマネージャ
デスクトップマネージャ、パネル等が含まれるので、Puppy Linuxの環境と競合する部分が出てくる。

私が、Xfceを導入した際には、この(特にデスクトップマネージャの)競合による不具合に遭遇した。


導入自体は、パピーパッケージマネジャでxfceを検索して、xfce4_4.8.0.3 をクリックするだけの
簡単操作。

インストール後、一旦「プロンプトへ戻る」でXを終了し、

xwin startxfce4

として、X及びXfceを起動すると↓のようになる。
(xwinと言うスクリプトを通して起動するには訳がある。それについては別の機会に)


これで、表面上は問題ないのだが、先に設定しておいたダブルクリック間隔が反映されていない。


Xfceがデスクトップ環境として統合して持っている設定と、.gtkrc-2.0(.gtkrc.mine)
での設定が競合しているらしい。
ここが、単体のWMとしてxfwmを使用する場合と、デスクトップ環境としてのXfceを使う場合の
違い。

この競合は、.gtkrc-2.0をリネームしておくなどすれば、解決できる。
JWM等に切り替えたときに、ファイル名を戻せば良い。
(この辺は、WMSwitcerを使えばスクリプトが自動でやってくれる)

但し表面上の解決ができればそれで良いと言うことではなく、この違いは、結構重要なことじゃないか
勝手に思っている。
最初に紹介した画像では、WMSwitcher(ここを参照) というWM切り替えツールが、Xfceを
他のWMと同列に表示している。
また、ここの「Q5:ウィンドウマネージャ」 に見るように、WMの話題のなかで、あたかもXfceが
WMであるかのような記述がされているのを目にする。

ここを無意識にやり過ごしてしまうと、WM関連で問題が発生したときの解決糸口を自ら、
蔑ろにしてしまう結果になりかねないと思っている。


実は、ここからが本題。
※ここから書く内容はマネしないでください。トラブルから復帰できなくなる可能性があります※

Xfceは、ウィンドウの透過処理に(簡易的に?)対応しており、「ウィンドウマネージャ(詳細)」の
「合成処理」設定で指定できる。


この「合成処理」を設定した状態で、他のWMに切り替えてから再度Xfceを起動したり、
再起動をした場合、非常に困った事態に陥る。

xwin startxfce4 を実行してもXfceの画面が表示されず、他のWMで設定した画面になってしまう。
更に、見た目が違うだけではなく、実際の操作結果が画面上で見えなくなってしまう!!!

Xfceが起動されていない訳ではなく、ROX-Filerのピンボードが上から覆い被さっているらしい。
実際にどんな状況なのかをスクリーンショットでお見せしたくても、操作画面が表示されない状態で、
どうやって画像を撮れば良いのか、その方法を知らない。

ただ、画面上部のパネル部分へマウスポインタを合わせれば、ツールチップが表示されるので、
そこから「ログアウトダイアログの表示」を探りだし、クリックをすることでダイアログを
表示させることはできる。一旦「ログアウト」してプロンプトに戻り、JWM等を表示させれば、
通常の画面に戻ることはできる。

初めてこの状態になったときの驚愕と慌てぶりは、ご想像にお任せする(笑)

しかし、JWMに戻してから冷静に考えれば原因は明らかだった。
Xfceのデスクトップマネージャの設定とROX-Filerのピンボード機能が競合してると推測するのに
時間はかからなかった。
他のWMで設定した画面が出るということは、それを制御しているROX-Filerのピンボードが
動いていると考えるのが自然の流れ。

そこで、X起動時に読み込まれる /root/.xnintrc を覘いてみた。
その中に、次の記述を見ることができる。

if [ -f /root/Choices/ROX-Filer/PuppyPan1 ];then
rox -p /root/Choices/ROX-Filer/PuppyPin -r /root/Choices/ROX-Filer/PuppyPan1
else
rox -p /root/Choices/ROX-Filer/PuppyPin
fi

ROX-Filerのパネルを使える状態ならば、ピンボードとパネルを起動し、
パネルが使えないならば、ピンボードのみを起動しろと命令しているらしい。

-p -r オプションの参考
Puppy Linuxではパネルの使用を廃止しているため、結果としてピンボードが起動される。
ただ、この起動には他の条件式が付加されていないので、基本的にピンボードは起動されてしまう。

WMを単体で切り替えるならば、この命令でも問題はなかったのだろう。
が、Xfceのようにデスクトップマネージャが含まれ、更に透過処理を行うような状況では、
この競合は致命的なんじゃないだろうか。
今までこの .xinitrc のままだったということは、これは私の環境依存による不具合なのかも知れない
(過去にはここの事例に見るようなこともあったようだが、、、)
そうであれば、それにこしたことはない。私だけが対策をすれば済む。
もし、そうでないのならば、他の使用者への注意を促してほしい。
対策といっても、下のように現在使われているWMが何かを判定に入れただけ。

if [ "$CURRENTWM" != "startxfce4" ];then
if [ -f /root/Choices/ROX-Filer/PuppyPan1 ];then
rox -p /root/Choices/ROX-Filer/PuppyPin -r /root/Choices/ROX-Filer/PuppyPan1
else
rox -p /root/Choices/ROX-Filer/PuppyPin
fi
fi

今回はXfceのみを対象にしているが、ほかのデスクトップ環境を導入した際にはそれに応じた判定を
加えれば良いはず。

今回のことに限らず、Puppy Linuxの .xinitrc には疑問に思うことがある。
まるで「アキラ」の冷凍設備のような印象を受けなくもない、、、。

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

2014年3月21日金曜日

或いは、もう一つの覚書

Puppy Linuxのバージョンによっては、gtkdialogが古くてスライダーが使えなかったので、
単純に数値を入力するタイプを作ってみた。

※ 注意 ※
0)Precise Puppy 5.7.1JPとPuppy Linux 4.3.1JPでしか動作確認していません。
1)動作の保証はしません。
2)隠しファイル(.gtkrc.mine)の操作をしています。
3)ダブルクリックの設定は隠しファイル(.gtkrc-2.0)と競合しています。
4)設定を反映させるには、再起動が必要です。
5)最悪の場合、Puppy Linux自体の不具合が起こります。


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

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


#! /bin/bash

if test ! -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

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}`
def_time_tag="<default>"$def_time_value"</default>"

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}`
def_distance_tag="<default>"$def_distance_value"</default>"

export ok_action='
  new_time_str="gtk-double-click-time="$TIME
  new_distance_str="gtk-double-click-distance="$DISTANCE

  if [ '$def_time_str' = "$new_time_str" -a '$def_distance_str' = "$new_distance_str" ];then
    mes0="設定が変更されていません"
    mes1="何もせずに終了します"
  else
    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

    mes0="設定ファイル.gtkrc.mineを書き換えました"
    mes1="Xサーバをリスタートして効果を確認してください"
  fi

  export SUB_DIALOG="
    <window title=\"Double Click Adjust std\" width_request=\"300\" height_request=\"200\">
      <vbox>
        <text height-request=\"50\">
          <label>"$mes0"</label>
        </text>
        <text height-request=\"50\">
          <label>"$mes1"</label>
        </text>
        <button height-request=\"80\"><label>閉じる</label>
          <action type=\"exit\">exit</action>
        </button>
      </vbox>
    </window>"

  gtkdialog3 -c --program SUB_DIALOG
'

export MAIN_DIALOG='
  <window title="Double Click Adjust std" width_request="300" height_request="200">
    <vbox>
      <text>
        <label>ダブルクリック調整用</label>
      </text>
      <frame 間隔(ミリ秒)>
        <hbox>
          <text>
            <label>数値を入力(推奨値:250〜1000)</label>
          </text>
          <entry>
            '$def_time_tag'
            <variable>TIME</variable>
          </entry>
        </hbox>
      </frame>
      <frame 距離(ピクセル)>
        <hbox>
          <text>
            <label>数値を入力(推奨値:5〜30)  </label>
          </text>
          <entry>
            '$def_distance_tag'
            <variable>DISTANCE</variable>
          </entry>
        </hbox>
      </frame>
      <hbox>
        <button ok>
          <action>bash -c "$ok_action"</action>
          <action type="exit">exit</action>
        </button>
        <button cancel></button>
      </hbox>
    </vbox>
  </window>'

gtkdialog3 -c --program MAIN_DIALOG

現時点の覚書

こんな物を作ってみたい。
Puppy Linuxでダブルクリックの調整方法が分かったので、それをGUIでやってみたいと思った。
前回Ideskの壁紙変更スクリプト(今見たら、ひどいミスがあったので、いずれ直したい)を
書いてから数年が経過しているので、また「初めてのおつかい」状態。

シェルスクリプト、gtkdialogを使ってみる。
※ 注意 
0)Precise Puppy 5.7.1JP でしか動作確認していません。
動作の保証はしません
隠しファイル(.gtkrc.mine)操作をしています
ダブルクリックの設定は隠しファイル.gtkrc-2.0競合しています
設定を反映させるには再起動が必要です
最悪の場合Puppy Linux自体の不具合が起こります

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

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







#! /bin/bash

if test ! -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

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}`
def_time_tag="<default>"$def_time_value"</default>"

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}`
def_distance_tag="<default>"$def_distance_value"</default>"

export ok_action='
  new_time_str="gtk-double-click-time="$TIME
  new_distance_str="gtk-double-click-distance="$DISTANCE

  if [ '$def_time_str' = "$new_time_str" -a '$def_distance_str' = "$new_distance_str" ];then
    mes0="設定が変更されていません"
    mes1="何もせずに終了します"
  else
    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

    mes0="設定ファイル.gtkrc.mineを書き換えました"
    mes1="Xサーバをリスタートして効果を確認してください"
  fi

  export SUB_DIALOG="
    <window title=\"Double Click Adjust\" width_request=\"400\" height_request=\"200\">
      <vbox>
        <text height-request=\"50\">
          <label>"$mes0"</label>
        </text>
        <text height-request=\"50\">
          <label>"$mes1"</label>
        </text>
        <button height-request=\"80\"><label>閉じる</label>
          <action type=\"exit\">exit</action>
        </button>
      </vbox>
    </window>"

  gtkdialog -c --program SUB_DIALOG
'

export MAIN_DIALOG='
  <window title="Double Click Adjust" width_request="400" height_request="200">
    <vbox>
      <text>
        <label>ダブルクリック調整用スライダー</label>
      </text>
      <frame 間隔(ミリ秒)>
        <hscale range-min="250" range-max="2000" range-step="1">
          '$def_time_tag'
          <variable>TIME</variable>
        </hscale>
      </frame>
      <frame 距離(ピクセル)>
        <hscale range-min="5" range-max="100" range-step="1">
          '$def_distance_tag'
          <variable>DISTANCE</variable>
        </hscale>
      </frame>
      <hbox>
        <button ok>
          <action>bash -c "$ok_action"</action>
          <action type="exit">exit</action>
        </button>
        <button cancel></button>
      </hbox>
    </vbox>
  </window>'

gtkdialog -c --program MAIN_DIALOG