Xウィンドウマネージャっているの？

デスクトップの壁紙に好きな画像を表示したり、Xアプリを[×]ボタンで閉じたり、マウスを使ってウィンドウサイズを変えたり。これらはXウィンドウマネージャの仕事です。
とても重要な仕事をしますが、Xサーバとは、どのような関係なのでしょうか？

結論を言うと、Xサーバから見るとXウィンドウマネージャは他のXアプリと大差なく、Xウィンドウマネージャが無くてもX Window Systemとして成り立ちます。
しかし、使い勝手は悪くなるし、Xウィンドウマネージャを必要とする機能は当然動きません。

それを承知の上で、今回、XウィンドウマネージャなしでXサーバを立ち上げたいと思います。
　Xサーバ(startx)の起動設定、
　および、コマンドでのウィンドウ操作に関する文章です。
　使用OS:ArchLinux(VirtualBoxゲスト)

![XWindowSystem.png](https://qiita-image-store.s3.amazonaws.com/0/202736/bb587a69-54ff-cc05-d709-f65f2258e8bd.png)

# 前提
下記のパッケージ等は、事前にインストールされているという前提で話を進めます。
・xorg-server
・xorg-xinit
・xorg-xeyes
・xorg-xclock
・xorg-xwininfo
・xdotool
・xterm
・openbox
・xorg-twm

ヒント、ArchLinuxでtwmを使う場合、以下のパケージをインストールしないとエラーが出ます。

```
sudo pacman -S xorg-fonts-100dpi
```


# Xサーバ起動
ttyコンソールのログイン表示がされている状態(Xサーバが起動されていない状態)から話を始めます。
![login.png](https://qiita-image-store.s3.amazonaws.com/0/202736/dceaa4b9-da21-2357-25e9-994f4df539e3.png)


ログイン後、
.xinitrcを作成するため、以下のコマンドを入力してください。

```
echo "xterm" > ~/.xinitrc

#注意、.xinitrcが存在する場合、上書きします。
```



Xサーバを起動するために次のコマンドを打ちます。

```
startx
```
![xterm.png](https://qiita-image-store.s3.amazonaws.com/0/202736/fe9a0e80-7948-363f-5985-5783ea0f7119.png)

図のように.xinitrcに記述したxtermが現れます。2、3秒で起動したと思いますが、もう、Xサーバ管理下の画面です。
しかし、Xウィンドウマネージャが起動されていないため、xtermの上段にはタイトルバーが表示されていません。マウスを使っての移動やウィンドウサイズの変更など何もできません。

今のキーマップはUSキーボードになっているはずです。
試しに`;` `:` `[` `]`辺りのキーを押してみて下さい。
キーの刻印とは違う文字が表示されるはずです。

```
setxkbmap -model jp106 -layout jp,us
```
と打つことで、日本語キーボードに変わります。



# Xアプリを動かす
次に

```
xterm &
```
と打ってみて下さい。
新しいxtermが起動されているはずですが、同じ位置に表示されているので、見分けが付きません。

```
xwininfo -tree -root
```
と打つと

```
xwininfo: Window id: 0x2bd (the root window) (has no name)

  Root window id: 0x2bd (the root window) (has no name)
  Parent window id: 0x0 (none)
     2 children:
     0x600022 "user001@ARCH64-PC:~": ("xterm" "XTerm")  484x316+0+0  +0+0
        1 child:
        0x60002d (has no name): ()  484x316+0+0  +1+1
     0x400022 "user001@ARCH64-PC:~": ("xterm" "XTerm")  484x316+0+0  +0+0
        1 child:
        0x40002d (has no name): ()  484x316+0+0  +1+1
```
と筆者の環境では表示されました。

`0x2bd (the root window)`とあります。このXサーバのルートウィンドウのIDが0x2bdだと分かります。
そのルート配下に2つの子ウィンドウがあります。
筆者の環境では0x600022と0x400022です。
これが、.xinitrcに記述したxtermと、先ほどキー入力したxtermです。

一つ動かしてみましょう。

```
xdotool windowmove 0x400022 100 320
```

ウィンドウサイズを変えてみましょう。

```
xdotool windowsize 0x400022 500 250
```

いかがですか？Xウィンドウマネージャが無くてもXサーバが使えます。

当然、

```
xclock &
xeyes &
firefox &
```
など、別のXアプリも実行することができます。

![screen01.png](https://qiita-image-store.s3.amazonaws.com/0/202736/8fee7166-c417-f128-359e-791e21d9de31.png)

(firefoxのメニュー表示はうまく動作しませんでした。多分、Xウィンドウマネージャの機能を使っているのでしょう)


# Xウィンドウマネージャを起動する
## OpenBoxの起動

ここで、xtermから

```
openbox-session
```
と打ってみます。

![screen02.png](https://qiita-image-store.s3.amazonaws.com/0/202736/33c93a4a-1de0-f350-3d38-e2282f407c16.png)

図のように、各Xアプリの上段にタイトルバーが現れました。
各Xアプリを動かしたり、閉じたり、普段と変わらない操作ができるようになりました。

## OpenBoxの終了

デスクトップ背景を右クリックするとOpenBoxのメニューが現れます。

![menu01.png](https://qiita-image-store.s3.amazonaws.com/0/202736/980183f2-b7ee-81b7-4434-40a9a33edae0.png)

そのメニューの一番下にある`Log Out`をクリックすれば、OpenBoxが終了します。
試しに押してみて下さい。押すとOpenBoxが終了すると同時にXアプリの上段からタイトルバーが消えるのが分かります。


## Twmの起動

次に

```
twm
```
と入力すると、各Xアプリのタイトルバーが、twmが表示するものに変わりました。

![screen03.png](https://qiita-image-store.s3.amazonaws.com/0/202736/cfe70522-1a2b-68d9-4007-52fd1287aba4.png)

いかがですか？Xウィンドウマネージャを変えることでデスクトップ画面の見た目と操作性がまったく違うものになります。



# Xサーバを終わらせる
Xウィンドウマネージャを終わらせても、Xサーバは終わらない。では、Xサーバはどうすれば終わるのでしょうか？それは、最初(.xinitrc)に実行したxtermで

```
exit
```
と打てばXサーバは終了し、最初のログインした画面に戻ります。


# 最後に
今回、Xウィンドウマネージャが無くてもXアプリが動くことを試しました。
XウィンドウマネージャはXアプリを動かした後からでも起動できることを試しました。
この文章はあくまで実験的なものです。Xウィンドウマネージャを起動しない理由もXアプリを実行した後で起動する理由もないので、通常はXアプリより先にXウィンドウマネージャを起動します。

2020-01-26追記　続き、[超かんたん、自作ウィンドウマネージャの作り方](https://qiita.com/ai56go/items/dec1307f634181d923f5)