NetBSD-9.1でctwmウインドウマネージャを便利に使うための設定Tips

[NetBSD Advent Calendar 2020](https://qiita.com/advent-calendar/2020/netbsd) 24日目の記事です。
今日はウインドウマネージャの[ctwm](https://ja.wikipedia.org/wiki/CTWM)について、設定周りの話をしようと思います。

## NetBSDとctwm

[1日目の記事](https://qiita.com/furandon_pig/items/c9e04865ee3e655350f0)でも紹介していますが、NetBSDでは長いあいだデフォルトのウインドウマネージャとして[twm](https://ja.wikipedia.org/wiki/Twm)が採用されていましたが、NetBSD-9.1から[ctwm](https://ja.wikipedia.org/wiki/CTWM)に切り替えられました。

 * [Default window manager switched to CTWM in NetBSD-current](https://blog.netbsd.org/tnf/entry/default_window_manager_switched_to)(2020/09/28)

個人的には[ctwm](https://ja.wikipedia.org/wiki/CTWM)は軽量で機能的にも使いやすいという印象であり、VNC等を経由してGUIを使用するような場合に有用です。

ただ、デフォルトの設定だとちょっと煩わしい挙動や表示であるため、使いやすくするための設定項目をいくつか紹介できればと思います。

## ctwmの設定

### 個人用の.ctwmrcを用意する

[ctwm](https://ja.wikipedia.org/wiki/CTWM)のデフォルト設定は `/etc/X11/ctwm/system.ctwmrc` に記載されています。必要な設定のみ個人向けにカスタムしたいため、 `~/.ctwmrc` にファイルをコピーして編集します。

```sh
$ cp /etc/X11/ctwm/system.ctwmrc ~/.ctwmrc
```

### 右クリックでメニューを出さないようにする

[1日目の記事](https://qiita.com/furandon_pig/items/c9e04865ee3e655350f0)でも紹介しましたが、デフォルトではマウスの左クリックでメニューが表示されます(右クリックでも同じメニューが出ます...)。VNC等でGUIを表示している際に、VNCのウインドウにアクティブにするつもりでクリックしたらメニューが表示され、運悪く"Restart CTWM"をクリックしてしまうという事故が発生しかねないため、以下のように `Button1` に紐づく動作をコメントアウトすることで左クリックによるメニュー表示を無効化します。

```
#Button1 =     : root          : f.menu "NetBSD"
```
### フォーカスしているウインドウを強調表示する

![nbsd1224.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/9b2d4422-e38e-efd4-e197-25c55d5cdb19.png)

[ctwm](https://ja.wikipedia.org/wiki/CTWM)では、マウスカーソルの下にあるウインドウに対して自動的にフォーカスが当たるという挙動になっています。これは便利な挙動ですが、マウスカーソルに注目しないとフォーカスが当たっているウインドウが識別しずらいことがあります。

このような場合には、 `NoTitleHightlight` をコメントアウトすることで、フォーカスが当たっているウインドウを強調表示することができます。表示的には[twm](https://ja.wikipedia.org/wiki/Twm)のような強調表示になります。

### Windowsみたいなボタン配置にする

![nbsd1224_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/75fdf131-c11d-232d-1e5a-4d261c24055e.png)

ウインドウの左上にはリサイズと閉じるボタンが表示されるのですが、[twm](https://ja.wikipedia.org/wiki/Twm)のようなワイヤーフレームをマウスでドラッグしながらリサイズするという挙動になっています。Webブラウザやペイントツール等をよく使用する場合は、単に現在のウインドウサイズと最大化したウインドウを交互に切り替えるほうが便利だったりします。

このような場合には、ウインドウの左側に配置するボタンを定義することで対応できます。以下のように、 `RightTitleButton` に設定した項目がウインドウの左側に(設定した順で)表示されます。この例では最大化ボタンと閉じるボタンが表示されます。

```
RightTitleButton          ":xpm:resize"   = f.fullzoom
RightTitleButton          ":xpm:cross"    = f.delete
```

### アイコンマネージャの表示をトグルする

![nbsd1224_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/d24f0292-24aa-6719-e59f-c0f174f76331.png)

ウインドウを最小化すると、画面右上にある「アイコンマネージャ」にアイコン化された状態でウインドウが格納されます。画面全体を使用したい場合にアイコンマネージャも隠したいことがあり、その場合は `f.hideiconmgr` と `f.showiconmgr` を呼び出すことで表示をトグルできます。

以下の例では右クリックメニューにアイコンマネージャの表示・非表示を追加しています。

```
menu "NetBSD"
{
    "NetBSD"                    f.title
    ...
    " Hide Iconmgr"             f.hideiconmgr
    " Show Iconmgr"             f.showiconmgr
    ...
}
```

### ワークスペースの表示をトグルする

![nbsd1224_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61137/52868473-70a5-a57d-5465-60cb8ac4cf49.png)

[ctwm](https://ja.wikipedia.org/wiki/CTWM)には仮想デスクトップ機能があり、ワークスペースマネージャでそれぞれの仮想デスクトップを切り替えることができます。慣れてくるとショートカットキーで仮想デスクトップを切り替えるようになり、必要な時だけワークスペースマネージャを表示したくなってきます。

このような場合には、 `f.toggleworkspacemgr` を呼び出すことで表示・非表示を切り替えることができます。
(なぜかワークスペースマネージャーの場合は「(表示を)トグルする」という機能ひとつで示現されており、アイコンマネージャの場合と異なる感じですね...)

```
menu "NetBSD"
{
    "NetBSD"                    f.title
    ...
    " Toggle Workspacemgr"      f.toggleworkspacemgr
    ...
}
```

## デフォルト設定とのdiff

ここまで紹介してきた設定について、デフォルト設定との差分を示します。

```sh
$ diff -u /etc/X11/ctwm/system.ctwmrc ~/.ctwmrc
--- /etc/X11/ctwm/system.ctwmrc 2020-11-07 02:42:05.075695725 +0900
+++ /home/nbsd/.ctwmrc  2020-12-15 01:07:19.704196666 +0900
@@ -93,7 +93,7 @@
 WindowRing
 WarpRingOnScreen

-NoTitleHighlight
+#NoTitleHighlight

 TitleButtonShadowDepth    1
 TitleShadowDepth          1
@@ -104,7 +104,8 @@
 FramePadding             0

 LeftTitleButton           ":xpm:dot"      = f.menu "titleops"
-RightTitleButton          ":xpm:resize"   = f.resize
+RightTitleButton          ":xpm:iconify"   = f.iconify
+RightTitleButton          ":xpm:resize"   = f.fullzoom
 RightTitleButton          ":xpm:cross"    = f.delete

 BorderWidth               4
@@ -196,6 +197,10 @@
     " Clock"                   !"xclock -digital &"
     " XEyes"                   !"xeyes &"
     ""                         f.separator
+    " Hide Iconmgr"                    f.hideiconmgr
+    " Show Iconmgr"                    f.showiconmgr
+    " Toggle Workspacemgr"                     f.toggleworkspacemgr
+    ""                         f.separator
     " Applications"            f.menu "appmenu"
     ""                         f.separator
     " Restart CTWM"            f.twmrc
```

## まとめ

[ctwm](https://ja.wikipedia.org/wiki/CTWM)をちょっと便利に使うための設定について紹介しました。ここでは紹介しきれませんでしたが、ショートカットキー等の設定やカラー設定等についても調べてみると面白そうです。