### Copyright (C) 1995, 1996, 1997 Jeppe Buk (buk@imada.ou.dk)
### This program is free software; you can redistribute it and/or modify
### it under the terms of the GNU General Public License as published by
### the Free Software Foundation; either version 2 of the License, or
### (at your option) any later version.
###
### This program is distributed in the hope that it will be useful,
### but WITHOUT ANY WARRANTY; without even the implied warranty of
### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
### GNU General Public License for more details.
###
### You should have received a copy of the GNU General Public License
### along with this program; if not, write to the Free Software
### Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
###
### Mar. 12 1998 Japanized by Mashio Motoyama <moto@ba.mbn.or.jp>
###

######################################################################
# Convert a list of contexts/modifiers to a context/modifier string
proc makeContextOrModifier {contextList} {
  set result {}
  foreach var $contextList {
    append result [string index $var 0]
  }
  if {$result == {}} {set result "N"}
  if {[string first "A" $result] != -1 && [string length $result] != 1} {
    set result "A"
  }
  return $result
}

######################################################################
# Make a command be backgrounded
proc makeBg {prog} {
  set result [string trim $prog " \t"]
  if {[string index $result [expr [string length $result] -1]] != "&"} {
    append result " &"
  }
  return $result
}

######################################################################
# Sign an integer
proc signed {val} {
  if {$val == ""} {return ""}
  if {[string index $val 0] != "-"} {return "+$val"
  } else {return $val}
}

######################################################################
# Convert old style X colors #RRGGBB to new style rgb:RR/GG/BB
proc hash2rgb {hash} {
  if {[string index $hash 0] == "#"} {
    set rgb "rgb:[string range $hash 1 2]/[string range $hash 3 4]/[string range $hash 5 6]"
  } else {
    if {[string first " " $hash] != -1} {set rgb \"$hash\"
    } else {set rgb $hash}
  }
  return $rgb
}

######################################################################
# Remove color names consisting of more than one word
proc fixcolors {cols} {
  set result {}
  foreach col $cols {
    if {[llength [lindex $col 0]] == 1} {
      lappend result $col
    }
  }
  return $result
}

######################################################################
# The builtin commands including help
#
set Builtins {

    Beep
    "Example: 'Beep' ビープ音を鳴らします。引数はありません。"

  ChangeDecor "Example: 'ChangeDecor \"Default\"'. カレント・ウインドウの装飾を変更します。引数として装飾名を必要とします。装飾名として Default を利用すると、ウインドウの全装飾特性をリセットします。"

    Close
    "Example: 'Close' カレント・ウインドウを閉じます。引数はありません。"

    CursorMove
    "Example: 'CursorMove 10 0' カーソルを動かします。引数として垂直方向と水平方向の移動量を持ち、その値の単位は、スクリーンとのパーセンテージになります。"

    Delete
    "Example: 'Delete' カレント・ウインドウを消去します。引数はありません。"

    Desk
    "Example: 'Desk 0 2' 指定された仮想デスクトップへ移動します。引数として二つの値を持ち、第一引数が 0 の場合には、移動先のデスクトップは第二引数の番号を持ったデスクトップになり、0 でない場合には、現在のデスクトップ番号に足した番号を持つデスクトップになります。"

    Destroy
    "Example: 'Destroy' カレント・ウインドウを強制終了させます。引数はありません。"

    DestroyDecor
    "Example: 'DestroyDecor \"Flattened\"' 定義済の装飾を解除します。引数として装飾名を持ちます。"

    DestroyFunc
    "Example: 'DestroyFunc \"PrintFunction\"' 定義済の関数を消去します。引数として関数名を持ちます。"

    DestroyMenu
    "Example: 'DestroyMenu \"Utilities\"' 定義済のメニューを消去します。引数としてメニューの名前を持ちます。"

    DestroyModuleConfig
    "Example: 'DestroyModuleConfig FvwmButtons' モジュールの設定を破棄します。引数としてモジュール名を持ちます。"

    Echo
    "Example: 'Echo Beginning style defs...' 標準エラー出力へメッセージを出力します。引数として出力文字列を持ちます。"

    Exec
    "Example: 'Exec rxvt -fg yellow -bg blue -e /bin/tcsh' 外部コマンドを実行します。引数として実行するコマンドとその引数を持ちます。"

    ExecUseShell
    "Example: 'ExecUseShell /bin/tcsh' コマンドを実行する際のシェルを指定します。引数が与えられていればそれをシェルとして利用し、なければ SHELL 環境変数を利用します。"

    Focus
    "Example: 'Focus' カレント・ウインドウにフォーカスを与えます。引数はありません。"

    Function
    "Example: 'Function MoveOrRaise' ユーザ定義関数を呼び出します。引数として関数名を持ちます。"

    GotoPage
    "Example: 'GotoPage 0 1' デスクトップの物理スクリーンに対応した表示領域を動かします。ポップアップメニューでは利用できません。引数として、X 座標と Y座標を持ちます。"

    Iconify
    "Example: 'Iconify -1' カレント・ウインドウを(非)アイコン化します。引数がなければアイコン化と標準状態との切替になり、引数が正の値であればアイコン化のみを行い、負の値であれば非アイコン化を行います。"

    KillModule
    "Example: 'KillModule FvwmButtons' モジュールを強制終了させます。引数としてモジュール名を持ちます。"

    Lower
    "Example: 'Lower' カレント・ウインドウを一番下へ持って来ます。引数はありません。"

    Maximize
    "Example: 'Maximize 0 100' カレント・ウインドウを(非)最大化します。引数として垂直方向と水平方向の増加量を持ち、その値は物理スクリーンとのパーセンテージになります。"

    Menu
    "Example: 'Menu MainMenu' 定義済メニューを表示します。引数としてメニュー名を持ちます。"
    
    Module
    "Example: 'Module FvwmBanner' 外部モジュールを起動します。引数としてモジュール名を持ちます。"

    Move
    "Example: 'Move' カレント・ウインドウを移動させます。引数が与えられていない場合には対話的な移動となり、引数として X 座標と Y 座標が与えられている場合にはその座標へ移動させます。"

    Next
    "Example 'Next \[Emacs\] Iconify -1' 与えられた条件を満足する次のウインドウで、引数のコマンドを実行します。条件としては iconic, !iconic, CurrentDesk, Visible, !Visible, CurrentScreen が使用できます。"

    None
    "Example: 'None \[Emacs\] Exec emacs &' 与えられた条件を満足するウインドウが無い場合にそのコマンドを実行します。使用可能な条件は Next と同じになります。"

    Nop
    "Example: 'Nop' 何もしません。メニューのセパレータとして利用します。"

    PipeRead
    "Example: 'PipeRead /usr/local/bin/create_menu' 引数として与えられたコマンドの出力を得ます。"

    Popup
    "Example: 'Popup \"Window Ops\"' ユーザ定義ポップアップメニューを呼び出します。引数としてメニュー名を持ちます。"

    Prev
    "Example: 'Prev [Emacs] Iconify' 与えられた条件を満足する直前のウインドウで引数のコマンドを実行します。条件は Next と同様です。"

    Quit
    "Example: 'Quit' FVWM を終了します。引数はありません。"

    Raise
    "Example 'Raise' カレント・ウインドウを一番上に持って来ます。引数はありません。"

    RaiseLower
    "Example 'RaiseLower' カレント・ウインドウに対して、レイズとロウアを交互に行います。引数はありません。"

    Read
    "Example: 'Read $HOME/.userfvwm2rc' コマンドをファイルから読み込みます。引数としてファイル名を持ちます。"

    Recapture
    "Example: 'Recapture' 全ウインドウを再度取り込みます。引数はありません。"

    Refresh
    "Example: 'Refresh' 全ウインドウを再描画します。引数はありません。"

    RefreshWindow
    "Example: 'RefreshWindow' カレント・ウインドウを再描画します。引数はありません。"

    Resize
    "Example: 'Resize' カレント・ウインドウの大きさを変更します。引数が無ければ対話的なリサイズとなり、面積を引数として与えた場合にはそのサイズになります。"

    Restart
    "Example: 'Restart fvwm2' ウインドウ・マネージャを再起動します。引数としてウインドウ・マネージャを持ちます。"

    SendToModule
    "Example: 'SendToModule FvwmTalk command' モジュールへ文字列を送ります。引数としてモジュール名と送信文字列を持ちます。"

    Scroll
    "Example: 'Scroll 100 0' デスクトップの表示領域を動かします。引数として水平方向と垂直方向の移動量を、物理スクリーンに対するパーセンテージで与えます。"

    Stick
    "Example: 'Stick' カレント・ウインドウの物理スクリーンへの張り付け(解除)を行います。引数はありません。"

    Title
    "Example: 'Title' 何もしません。メニューにタイトルを表示します。引数はありません。"
    
    UpdateDecor
    "Example: 'UpdateDecor \"Flattened\"' 指定ウインドウの装飾を更新します。引数が無い場合にはただの更新になり、引数として装飾名を与えた場合にはその特性で更新されます。"

    Wait
    "Example: 'Wait Emacs' ウインドウが表示されるまで待機します。引数はありません。"

    WarpToWindow
    "Example: 'WarpToWindow 50 50' 指定したウインドウの座標へカーソルを移動させます。引数として X 座標と Y 座標を持ちます。"

    WindowId
    "Example: 'WindowId 0x34567890 Raise' 指定したウインドウ ID でコマンドを実行します。引数としてウインドウ ID とコマンドを持ちます。"

    WindowList
    "Example: 'WindowList NoGeometry CurrentDesk' ウインドウ・リストを表示します。引数は以下のとおり。\
	    NoGeometry (ジオメトリ情報を表示しない),\
	    Function <func> (<func> を替わりに実行),\
	    Desk <deskno> (<deskno> 番デスクトップのウインドウのみ表示),\
	    CurrentDesk (カレント・デスクトップのみ表示),\
	    NoIcons (アイコン化されたウインドウの非表示),\
	    OnlyIcons (アイコン化ウインドウのみ表示),\
	    NoNormal (?),\
	    NoSticky (貼り付いたウインドウは除外),\
	    NoOnTop ('StaysOnTop' ウインドウは除外),\
	    Unsorted (リストをソートしない),\
	    UseIconName (アイコン名で表示)"

    WindowShade
    "Example: 'WindowShade 1' タイトルのあるウインドウの陰影を切替えます。引数が無ければシェイドの切替えを行い、引数が 1 であればウインドウにシェイドをかけ、2 であればシェイドを外します。最大化されたウインドウとタイトルの無いウインドウはシェイドがかけられません。"

    WindowsDesk
    "Example: 'WindowsDesk 2' 選択したウインドウを引数の番号を持った仮想デスクトップへ移動させます。"

}

######################################################################
# Helpers for the fvwmIconMan function below
proc maybeCb {pf cb name} {
  if {$cb == 1} {
    CheckBox ${pf}_cb$name -text "上書き" \
	-help "一般設定の内容で上書きしたい場合に選択します。"
  }
}

proc maybeFrame {pf cb name wList} {
  if {$cb == 1} {set widgets [concat ${pf}_cb$name $wList]
  } else {set widgets $wList}
  eval Frame ${pf}_fr$name -entries $widgets
}

proc maybeNo {str no} {
  if {$no != -1} {
    return ${str}${no}*
  } else {
    return $str
  }
}

######################################################################
# Create FvwmIconMan widgets (pf = prefix, cb = useCheckBox)
proc fvwmIconMan {pf cb} {

  # Resolution
  maybeCb $pf $cb Res
  Label ${pf}_lbRes\
	  -text "対象ウインドウの範囲: " \
	  -help "どのウインドウを表示するかを指定します。'global'は全てのウインドウが対象になり、'desk'はカレント・デスクトップ上のウインドウのみ、'page'はカレント・ページのウインドウのみが対象になります。"
  Radio ${pf}_rdRes -entryhelp {
    "global" "全てのウインドウが対象になります。"
    "desk" "カレント・デスクトップのウインドウのみ表示します。"
    "page" "カレント・ページのウインドウのみ表示します。"
  }
  maybeFrame $pf $cb Res [list ${pf}_lbRes ${pf}_rdRes]
  if {$cb == 1} {
    Change \
	"if {\$changeElm == \"${pf}_cbRes\"} { \
           if {\$${pf}_cbRes == 1} { \
             Enable ${pf}_rdRes \
           } else { \
             Disable ${pf}_rdRes \
           } \
         }"
  }

  # ShowTitle
  maybeCb $pf $cb ShT
  Label ${pf}_lbShT\
	  -text "表示内容: " \
	  -help "ボタンに表示する識別名をアイコンの名前にするか、ウインドウの名前にするか選択します。"
  Radio ${pf}_rdShT -entryhelp {
    "アイコン名" "アイコンの名前で表示します。"
    "ウインドウ名" "ウインドウの名前で表示します。"
  }
  maybeFrame $pf $cb ShT [list ${pf}_lbShT ${pf}_rdShT]
  if {$cb == 1} {
    Change \
	"if {\$changeElm == \"${pf}_cbShT\"} { \
           if {\$${pf}_cbShT == 1} { \
             Enable ${pf}_rdShT \
           } else { \
             Disable ${pf}_rdShT \
           } \
         }"
  }

  # FollowFocus
  maybeCb $pf $cb FoF
  Label ${pf}_lbFoF -text "フォーカスの反映: " \
      -help "入力フォーカスの有無を表示に反映させる場合に選択します。"
  Radio ${pf}_rdFoF -entryhelp {
    "反映させない" "フォーカスは表示方法に影響を与えません。"
    "反映させる" "フォーカスの有無で表示が変わります。"
  }
  maybeFrame $pf $cb FoF [list ${pf}_lbFoF ${pf}_rdFoF]
  if {$cb == 1} {
    Change \
	"if {\$changeElm == \"${pf}_cbFoF\"} { \
           if {\$${pf}_cbFoF == 1} { \
             Enable ${pf}_rdFoF \
           } else { \
             Disable ${pf}_rdFoF \
           } \
         }"
  }

  # SortIcons
  maybeCb $pf $cb Srt
  Label ${pf}_lbSrt -text "ソート: " \
      -help "ソートを行うか行わないかを選択します。"
  Radio ${pf}_rdSrt -entryhelp {
    "行わない"  "ソートを行いません。"
    "行う" "ソートします。"
  } -default "行う"
  maybeFrame $pf $cb Srt [list ${pf}_lbSrt ${pf}_rdSrt]
  if {$cb == 1} {
    Change \
	"if {\$changeElm == \"${pf}_cbSrt\"} { \
           if {\$${pf}_cbSrt == 1} { \
             Enable ${pf}_rdSrt \
           } else { \
             Disable ${pf}_rdSrt \
           } \
         }"
  }

  # Geometry
  Label ${pf}_lbGeo\
	  -text "ジオメトリ情報: " \
	  -help "ウインドウのサイズや表示位置を指定したい場合に選択します。"
  Int ${pf}_GeoW -text "幅"
  Int ${pf}_GeoH -text "高さ"
  Int ${pf}_GeoX -text "X 座標"
  Int ${pf}_GeoY -text "Y 座標"
  Frame ${pf}_frGeo -entries ${pf}_lbGeo ${pf}_GeoW ${pf}_GeoH ${pf}_GeoX \
      ${pf}_GeoY
  Change "\
     if {\$changeElm == \"${pf}_GeoW\" && \$${pf}_GeoW == \"-\"} { \
       set ${pf}_GeoW \"\" \
     } \
     elseif {\$changeElm == \"${pf}_GeoH\" && \$${pf}_GeoH == \"-\"} { \
       set ${pf}_GeoH \"\" \
     }"

  # Font
  CheckBox ${pf}_cbFnt\
	  -text "フォントを指定: " \
	  -help "表示に使うフォントを指定したい場合に選択します。"
  Command ${pf}_cmFntAscii\
      -default "a14"\
      -setvalue "buttonSetText \$widget ASCII \$${pf}_cmFntAscii ascii"\
      -invoke "FontWidget \$${pf}_cmFntAscii 0"\
      -disable {$widget configure -text "Not set"}\
      -enable "buttonSetText \$widget ASCII \$${pf}_cmFntAscii ascii"\
      -help "ボタンのタイトルに使用する ASCII フォントを選択します。"
  Command ${pf}_cmFntKanji\
      -default "k14"\
      -setvalue "buttonSetText \$widget 漢字 \$${pf}_cmFntKanji kanji"\
      -invoke "FontWidget \$${pf}_cmFntKanji 0"\
      -disable {$widget configure -text "未設定"}\
      -enable "buttonSetText \$widget 漢字 \$${pf}_cmFntKanji kanji"\
      -help "ボタンのタイトルに使用する漢字フォントを選択します。"
  Command ${pf}_cmFntKana\
      -default "r14"\
      -setvalue "buttonSetText \$widget \"1Byte Kana\" \$${pf}_cmFntKana kana"\
      -invoke "FontWidget \$${pf}_cmFntKana 0"\
      -disable {$widget configure -text "Not set"}\
      -enable "buttonSetText \$widget \"1Byte Kana\" \$${pf}_cmFntKana kana"\
      -help "ボタンのタイトルに使用する半角カナフォントを選択します。"
  
  Frame ${pf}_frFnt -entries [list ${pf}_cbFnt ${pf}_cmFntAscii ${pf}_cmFntKanji ${pf}_cmFntKana]
  Change \
	  "if {\$changeElm == \"${pf}_cbFnt\"} { \
	  if {\$${pf}_cbFnt == 1} { \
	  Enable ${pf}_cmFntAscii ${pf}_cmFntKanji ${pf}_cmFntKana\
         } else { \
           Disable ${pf}_cmFntAscii ${pf}_cmFntKanji ${pf}_cmFntKana \
         } \
       }"

  # Default color
  CheckBox ${pf}_cbCol\
	  -text "標準色を指定: "\
	  -help "標準的に使用される色を指定したい場合に選択します。"
  Command ${pf}_cmColF \
      -text "前景色" \
      -default [list black 0] \
      -setvalue "\
	\$widget configure -bg \[lindex \$${pf}_cmColF 0\] -text \"      \"" \
      -invoke "ColorWidget \$colorList \[lindex \$${pf}_cmColF 0\] \
		   \[lindex \$${pf}_cmColF 1\]" \
      -disable {$widget configure -relief flat } \
      -enable {$widget configure -relief raised } \
      -help "標準の前景色を指定します。"
  Command ${pf}_cmColB \
      -text "背景色" \
      -default [list "white" 0] \
      -setvalue "\
	\$widget configure -bg \[lindex \$${pf}_cmColB 0\] -text \"      \"" \
      -invoke "ColorWidget \$colorList \[lindex \$${pf}_cmColB 0\] \
		   \[lindex \$${pf}_cmColB 1\]" \
      -disable {$widget configure -relief flat } \
      -enable {$widget configure -relief raised } \
      -help "標準の背景色を指定します。"
  Frame ${pf}_frCol -entries ${pf}_cbCol ${pf}_cmColF ${pf}_cmColB
  Change "\
    if {\$changeElm == \"${pf}_cbCol\"} { \
      if {\$${pf}_cbCol == 1} {Enable ${pf}_cmColF ${pf}_cmColB \
      } else {Disable ${pf}_cmColF ${pf}_cmColB} \
    }"

  # Buttons
  CheckBox ${pf}_cbBut\
	  -help "ボタンの外観を変更したい場合に選択します。"
  Label ${pf}_lbBut -label:width 16 -label:justify left -label:relief groove
  Menu ${pf}_mnBut\
	  -text "スタイル"\
	  -entries {up flat down}\
	  -button:width 5
  CheckBox ${pf}_cbButC\
	  -text "色を指定"\
	  -help "色を指定したい場合に選択します。"
  Command ${pf}_cmButF \
      -text "前景色" \
      -default [list black 0] \
      -setvalue "\
	\$widget configure -bg \[lindex \$${pf}_cmButF 0\] -text \"      \"" \
      -invoke "ColorWidget \$colorList \[lindex \$${pf}_cmButF 0\] \
		   \[lindex \$${pf}_cmButF 1\]" \
      -disable {$widget configure -relief flat } \
      -inactive {$widget configure -text "      "} \
      -enable {$widget configure -relief raised } \
      -help "標準の前景色を指定します。"
  Command ${pf}_cmButB \
      -text "背景色" \
      -default [list "white" 0] \
      -setvalue "\
	\$widget configure -bg \[lindex \$${pf}_cmButB 0\] -text \"      \"" \
      -invoke "ColorWidget \$colorList \[lindex \$${pf}_cmButB 0\] \
		   \[lindex \$${pf}_cmButB 1\]" \
      -disable {$widget configure -relief flat } \
      -inactive {$widget configure -text "      "} \
      -enable {$widget configure -relief raised } \
      -help "標準の背景色を指定します。"

  Change "\
    if {\$changeElm == \"${pf}_cbBut\"} { \
      if {\$${pf}_cbBut == 1} {Enable ${pf}_mnBut ${pf}_cbButC} \n \
      if {\$${pf}_cbBut == 1 && \$${pf}_cbButC == 1} { \
        Enable ${pf}_cmButF ${pf}_cmButB \
      } \n \
      if {\$${pf}_cbBut == 0} { \
        Disable ${pf}_mnBut ${pf}_cbButC ${pf}_cmButF ${pf}_cmButB \
      } \
    }"

  ExtEntry ${pf}_frBut -entries ${pf}_cbBut ${pf}_lbBut ${pf}_mnBut \
      ${pf}_cbButC ${pf}_cmButF ${pf}_cmButB -count 4 -maxentries 4 \
      -noscissor 1 -default {
    {0 "平面"}
    {0 "選択済"}
    {0 "フォーカス"}
    {0 "フォーカスと選択済"}
  }

  Change "\
    if {\$changeElm == \"${pf}_cbButC\"} { \
      if {\$${pf}_cbButC == 1} {Enable ${pf}_cmButF ${pf}_cmButB \
      } else {Disable ${pf}_cmButF ${pf}_cmButB} \
    }"

  Window ${pf}_LnF\
	  -text "ボタンのインターフェイス" \
      -entries ${pf}_frCol ${pf}_frBut \
      -help "ボタンのフォントや色等の設定を行います。"

  # (Dont)Show
  CheckBox ${pf}_cbClShw\
	  -text "クラス" \
	  -help "入力したパターンの対象がクラスの場合に選択します。"
  CheckBox ${pf}_cbRsShw\
	  -text "リソース" \
	  -help "入力したパターンの対象がリソースの場合に選択します。"
  CheckBox ${pf}_cbTlShw\
	  -text "タイトル" \
	  -help "入力したパターンの対象がタイトルの場合に選択します。"
  CheckBox ${pf}_cbIcShw\
	  -text "アイコン" \
	  -help "入力したパターンの対象がアイコン名の場合に選択します。"
  Entry ${pf}_enShw\
	  -text "パターン: " \
	  -help "パターンを入力します。"
  ExtEntry ${pf}_eeShw -entries ${pf}_cbClShw ${pf}_cbRsShw ${pf}_cbTlShw \
      ${pf}_cbIcShw ${pf}_enShw\
      -text "マネージャへの登録対象" \
      -help "アイコン・マネージャへ登録するウインドウの番号を入力します。空の場合は全てのウインドウが対象になります。"

  CheckBox ${pf}_cbClDsh\
	  -text "クラス" \
	  -help "入力したパターンの対象がクラスの場合に選択します。"
  CheckBox ${pf}_cbRsDsh\
	  -text "リソース" \
	  -help "入力したパターンの対象がリソースの場合に選択します。"
  CheckBox ${pf}_cbTlDsh\
	  -text "タイトル"\
	  -help "入力したパターンの対象がタイトルの場合に選択します。"
  CheckBox ${pf}_cbIcDsh\
	  -text "アイコン"\
	  -help "入力したパターンの対象がアイコン名の場合に選択します。"
  Entry ${pf}_enDsh\
	  -text "パターン: " \
	  -help "パターンを入力します。"
  ExtEntry ${pf}_eeDsh -entries ${pf}_cbClDsh ${pf}_cbRsDsh ${pf}_cbTlDsh \
      ${pf}_cbIcDsh ${pf}_enDsh\
      -text "マネージャへの登録除外対象" \
      -help "アイコンマネージャへ登録しないウインドウの番号を入力します。これが空であれば、全てのウインドウは登録対象になります。"

  # Actions
  Label ${pf}_idxAct\
	  -text "定義名: " -label:relief groove
  Radio ${pf}_rdAct\
	  -text "イベントの種類" -entries \
      Key Mouse Select \
      -help "Key と mouse は標準のバインドを意味します。"\
      "Select はボタンにマウスが入っているときのイベントを意味します。"

  ComboBox ${pf}_ksAct\
	  -text "キーシム: " -entries \
      Left Right Up Down \
      F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 L1 L2 L3 L4 L5 L6 L7 L8 L9 L10 \
      a b c d e f g h i j k l m n o p q r s t u v w x y z \
      A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \
      -packFrame:anchor nw \
      -help "リストからキーシムを選択して下さい。リストに無い場合は手打ちになります。"

  Menu ${pf}_mbAct -text "ボタン番号: " -entries { Any 1 2 3 } \
      -packFrame:anchor nw \
      -help "どのマウスボタンにバインドするか選択します。"

  Frame ${pf}_kmAct -entries  ${pf}_ksAct ${pf}_mbAct
  
  ListBox ${pf}_mdAct -text "装飾キー" -entries \
      Any Control Shift Meta 1mod 2mod 3mod 4mod 5mod \
      -width 8 \
      -selectmode multiple \
      -help "装飾キー(モディファイア)を選択します。"

  Change "\
      if {\$changeElm == \"${pf}_rdAct\"} { \
        if {\$${pf}_rdAct(name) == \"Key\"} { \
	  Disable ${pf}_mbAct \n \
          Enable ${pf}_ksAct \n \
          Enable ${pf}_mdAct \
        } elseif {\$${pf}_rdAct(name) == \"Mouse\"} { \
	  Disable ${pf}_ksAct \n \
          Enable ${pf}_mbAct \n \
          Enable ${pf}_mdAct \
        } else { \
	  Disable ${pf}_ksAct \n \
          Disable ${pf}_mbAct \n \
          Disable ${pf}_mdAct \
	} \
      } \n \
      if {\$changeElm == \"${pf}_rdAct\" || \
          \$changeElm == \"${pf}_ksAct\" || \
          \$changeElm == \"${pf}_mbAct\" || \
          \$changeElm == \"${pf}_mdAct\"} { \
        set ${pf}_idxAct \$${pf}_rdAct(name) \n \
	switch \$${pf}_rdAct(name) \
	  Key    { append ${pf}_idxAct \
	           \" \[makeContextOrModifier \$${pf}_mdAct(name)\]\" \n \
		   append ${pf}_idxAct \" \$${pf}_ksAct\" \
		 } \
          Mouse  { append ${pf}_idxAct \
	           \" \[makeContextOrModifier \$${pf}_mdAct(name)\]\" \n \
		   append ${pf}_idxAct \" \$${pf}_mbAct(name)\" \
		 } \
  }"

  Menu ${pf}_fctAct -text "コマンド" -entryhelp {
    lowermanager "マネージャ・ウインドウを一番下へ持って来ます。"
    raisemanager "マネージャ・ウインドウを一番上へ持って来ます。"
    selectbutton "パラメータで指定されたボタンを選択します。"
    sendcommand  "指定されたウインドウへコマンドを送信します。"
    quit         "アイコンマネージャを終了します。"
    warp         "指定されたウインドウへカーソルを移動します。"
  }

  Menu ${pf}_manAct -text "マネージャ: " -entryhelp {
    select   "現在の選択されているマネージャ"
    focus    "フォーカスのあたったウインドウを保持しているマネージャ"
    absolute "整数値でマネージャを指定する"
  }
  Int ${pf}_manAddAct\
	  -help "このメニューに与えられている値から加算または減算をします。"\
	  "select を選択し -1 を入力した場合には、マネージャには現在選択している対象から一つ手前を与えることになります。"\
	  "absolute を選択した場合には整数値を入力する必要があります。"

  Menu ${pf}_buwAct -text "ボタン/ウインドウ: " -entryhelp {
    select   "現在の選択されているボタンまたはウインドウ。"
    focus    "フォーカスを得ているボタンまたはウインドウ。"
    absolute "整数値でボタンまたはウインドウを指定。"
  }

  Int ${pf}_buwAddAct\
	  -help "このメニューに与えられている値から加算または減算をします。"\
	  "select を選択し -1 を入力した場合には、マネージャに現在選択している対象から一つ手前を与えることになります。"\
	  "absolute を選択した場合には整数値を入力する必要があります。"

  Frame ${pf}_frActAct -entries ${pf}_manAct ${pf}_manAddAct ${pf}_buwAct \
      ${pf}_buwAddAct

  global Builtins
  Label ${pf}_bcLabAct\
	  -text "組み込み関数" \
	  -help "このメニューから呼び出す組み込み関数を入力します。"
  ComboBox ${pf}_bcAct -noedit 1 -default Beep -entryhelp $Builtins \
      -help "このメニューから呼び出す組み込み関数を入力します。"
  Frame ${pf}_frBcAct -orient top -entries ${pf}_bcLabAct ${pf}_bcAct

  Label ${pf}_argLabAct -text "引数" \
      -help "引数を入力します。尚、その書式については関知しません。"
  Entry ${pf}_argAct \
      -help "引数を入力します。尚、その書式については関知しません。"
  Frame ${pf}_frArgAct -orient top -entries ${pf}_argLabAct ${pf}_argAct
  Frame ${pf}_comAct -entries ${pf}_frBcAct ${pf}_frArgAct

  ExtEntry ${pf}_eeAct -orient top -entries ${pf}_idxAct ${pf}_rdAct \
      ${pf}_kmAct ${pf}_mdAct ${pf}_fctAct ${pf}_frActAct ${pf}_comAct \
      -index ${pf}_idxAct \
      -count 1

  Change "\
    if {\$changeElm == \"${pf}_fctAct\"} { \
      switch \$${pf}_fctAct(name) \
        \"lowermanager\" {Disable ${pf}_frActAct ${pf}_comAct} \
        \"raisemanager\" {Disable ${pf}_frActAct ${pf}_comAct} \
        \"selectbutton\" {Enable ${pf}_frActAct; Disable ${pf}_comAct} \
        \"sendcommand\"  {Enable ${pf}_frActAct ${pf}_comAct} \
        \"quit\"         {Disable ${pf}_frActAct ${pf}_comAct} \
        \"warp\"         {Enable ${pf}_frActAct; Disable ${pf}_comAct} \
    }"

  Window ${pf}_wnAct\
	  -text "イベントへのバインド" -entries \
      ${pf}_eeAct \
      -help "キー操作やマウス等、特定のイベントへ動作を割当ます。"

  # Frame with all widgets.
  Frame ${pf}_frame -orient top -entries ${pf}_frRes ${pf}_frShT \
      ${pf}_frFoF ${pf}_frSrt ${pf}_frGeo ${pf}_frFnt ${pf}_eeShw \
      ${pf}_eeDsh ${pf}_wnAct ${pf}_LnF
}

proc fvwmIconManSave {pf no} {
  global ___pf
  set ___pf $pf
  global ___no
  set ___no $no
  uplevel 1 {
    # Resolution
    if {$___no != -1} {
      if {[set ${___pf}_cbRes] == 1} {
	print "*FvwmIconMan*${___no}*resolution\t[set ${___pf}_rdRes(name)]"
      }
    } else {
      if {[set ${___pf}_rdRes(name)] != "global"} {
	print "*FvwmIconMan*resolution\t[set ${___pf}_rdRes(name)]"
      }
    }
    # Show title
    if {$___no != -1} {
      if {[set ${___pf}_cbShT] == 1} {
	set result "*FvwmIconMan*${___no}*showtitle\t"
	if {[set ${___pf}_rdRes(index)] == 0} {
	  append result "false"
	} else {
	  append result "true"
	}
	print $result
      }
    } else {
      if {[set ${___pf}_rdShT(index)] == 1} {
	print "*FvwmIconMan*showtitle\ttrue"
      }
    }
    # Follow focus
    if {$___no != -1} {
      if {[set ${___pf}_cbFoF] == 1} {
	set result "*FvwmIconMan*${___no}*followfocus\t"
	if {[set ${___pf}_rdRes(index)] == 0} {
	  append result "false"
	} else {
	  append result "true"
	}
	print $result
      }
    } else {
      if {[set ${___pf}_rdFoF(index)] == 1} {
	print "*FvwmIconMan*followfocus\ttrue"
      }
    }
    # Sort buttons
    if {$___no != -1} {
      if {[set ${___pf}_cbSrt] == 1} {
	set result "*FvwmIconMan*${___no}*sort\t"
	if {[set ${___pf}_rdRes(index)] == 0} {
	  append result "false"
	} else {
	  append result "true"
	}
	print $result
      }
    } else {
      if {[set ${___pf}_rdSrt(index)] == 0} {
	print "*FvwmIconMan*followfocus\tfalse"
      }
    }

    ##################################################
    # No checkboxes from here...

    # Geometry
    if {[set ${___pf}_GeoW] != "" || [set ${___pf}_GeoX] != ""} {
      set result "[maybeNo "*FvwmIconMan*" $___no]geometry\t"
      if {[set ${___pf}_GeoW] != ""} {
	append result [set ${___pf}_GeoW]x[set ${___pf}_GeoH]
      }
      if {[set ${___pf}_GeoX] != ""} {
	append result [signed [set ${___pf}_GeoX]][signed [set ${___pf}_GeoY]]
      }
      print $result
    }
    # Font
    if {[set ${___pf}_cbFnt] == 1} {
      print "[maybeNo "*FvwmIconMan*" $___no]font\t[set ${___pf}_cmFntAscii],[set ${___pf}_cmFntKanji],[set ${___pf}_cmFntKana]"
    }
    # Show
    set result ""
    forevery ${___pf}_eeShw {
      if {[set ${___pf}_cbClShw] == 1} {
	if {[set ${___pf}_enShw] != ""} {
	  append result " class=\"[set ${___pf}_enShw]\""
	}
      }
      if {[set ${___pf}_cbRsShw] == 1} {
	if {[set ${___pf}_enShw] != ""} {
	  append result " resource=\"[set ${___pf}_enShw]\""
	}
      }
      if {[set ${___pf}_cbTlShw] == 1} {
	if {[set ${___pf}_enShw] != ""} {
	  append result " title=\"[set ${___pf}_enShw]\""
	}
      }
      if {[set ${___pf}_cbIcShw] == 1} {
	if {[set ${___pf}_enShw] != ""} {
	  append result " icon=\"[set ${___pf}_enShw]\""
	}
      }
    }
    if {$result != ""} {
      print \
	"[maybeNo "*FvwmIconMan*" $___no]show\t[string range $result 1 end]"
    }
    # Don't show
    set result ""
    forevery ${___pf}_eeDsh {
      if {[set ${___pf}_cbClDsh] == 1} {
	if {[set ${___pf}_enDsh] != ""} {
	  append result " class=\"[set ${___pf}_enDsh]\""
	}
      }
      if {[set ${___pf}_cbRsDsh] == 1} {
	if {[set ${___pf}_enDsh] != ""} {
	  append result " resource=\"[set ${___pf}_enDsh]\""
	}
      }
      if {[set ${___pf}_cbTlDsh] == 1} {
	if {[set ${___pf}_enDsh] != ""} {
	  append result " title=\"[set ${___pf}_enDsh]\""
	}
      }
      if {[set ${___pf}_cbIcDsh] == 1} {
	if {[set ${___pf}_enDsh] != ""} {
	  append result " icon=\"[set ${___pf}_enDsh]\""
	}
      }
    }
    if {$result != ""} {
      print \
      "[maybeNo "*FvwmIconMan*" $___no]dontshow\t[string range $result 1 end]"
    }
    # Buttons
    if {[set ${___pf}_cbCol] == 1} {
      print "[maybeNo "*FvwmIconMan*" $___no]foreground\t[hash2rgb [lindex [set ${___pf}_cmColF] 0]]"
      print "[maybeNo "*FvwmIconMan*" $___no]background\t[hash2rgb [lindex [set ${___pf}_cmColB] 0]]"
    }
    forevery ${___pf}_frBut {
      if {[set ${___pf}_cbBut] == 1} {
	set result [maybeNo "*FvwmIconMan*" $___no]
	switch [set ${___pf}_lbBut] \
	    "平面" {
	      append result "plainbutton\t[set ${___pf}_mnBut(name)]"
	    } \
	    "選択済" {
	      append result "selectbutton\t[set ${___pf}_mnBut(name)]"
	    } \
	    "フォーカス" {
	      append result "focusbutton\t[set ${___pf}_mnBut(name)]"
	    } \
	    "フォーカスと選択済" {
	      append result "focusandselectbutton\t[set ${___pf}_mnBut(name)]"
	    }
	if {[set ${___pf}_cbButC] == 1} {
	  append result " [hash2rgb [lindex [set ${___pf}_cmButF] 0]]"
	  append result " [hash2rgb [lindex [set ${___pf}_cmButB] 0]]"
	}
	print $result
      }
    }
    # Actions
    forevery ${___pf}_eeAct {
      set result "[maybeNo "*FvwmIconMan*" $___no]action\t"
      switch [set ${___pf}_rdAct(name)] \
	  Key {
	    if {[set ${___pf}_ksAct] == ""} {
	      error "You must specify keysym in FvwmIconMan key actions."
	    }
	    append result " Key [set ${___pf}_ksAct] "
	    append result [makeContextOrModifier [set ${___pf}_mdAct(name)]]
	  } \
	  Mouse {
	    append result " Mouse [string index [set ${___pf}_mbAct(name)] 0] "
	    append result [makeContextOrModifier [set ${___pf}_mdAct(name)]]
	  } \
	  Select {
	    append result " Select"
	  }
      append result " [set ${___pf}_fctAct(name)]"
      switch [set ${___pf}_fctAct(name)] \
	  selectbutton {
	    if {[set ${___pf}_manAct(name)] != "absolute"} {
	      append result " [set ${___pf}_manAct(name)]"
	      append result " [signed [set ${___pf}_manAddAct]]"
	    }
	    if {[set ${___pf}_buwAct(name)] != "absolute"} {
	      append result " [set ${___pf}_buwAct(name)]"
	      append result " [signed [set ${___pf}_buwAddAct]]"
	    }
	  } \
	  sendcommand {
	    if {[set ${___pf}_manAct(name)] != "absolute"} {
	      append result " [set ${___pf}_manAct(name)]"
	      append result " [signed [set ${___pf}_manAddAct]]"
	    }
	    if {[set ${___pf}_buwAct(name)] != "absolute"} {
	      append result " [set ${___pf}_buwAct(name)]"
	      append result " [signed [set ${___pf}_buwAddAct]]"
	    }
	    append result " [set ${___pf}_bcAct]"
	    if {[set ${___pf}_argAct] != ""} {
	      append result " [set ${___pf}_argAct]"
	    }
	  } \
	  warp {
	    if {[set ${___pf}_manAct(name)] != "absolute"} {
	      append result " [set ${___pf}_manAct(name)]"
	      append result " [signed [set ${___pf}_manAddAct]]"
	    }
	    if {[set ${___pf}_buwAct(name)] != "absolute"} {
	      append result " [set ${___pf}_buwAct(name)]"
	      append result " [signed [set ${___pf}_buwAddAct]]"
	    }
	  }
      print $result
    }
  }
}

proc funcWithArgs {funcName} {
  set argList {ChangeDecor CursorMove Desk DestroyDecor DestroyFunc
    DestroyMenu DestroyModuleConfig Echo Exec ExecUseShell Function GotoPage
    Iconify KillModule Maximize Menu Module Move Next None PipeRead Popup
    Prev Read Resize Restart SendToModule Scroll UpdateDecor Wait
    WarpToWindow WindowId WindowList WindowShade WindowsDesk}
  if {[lsearch $argList $funcName] != -1} {
    return 1
  } else {
    return 0
  }
}
