Raspberry Pi ZERO ウィンドウマネージャを切り換える

ZEROのウィンドウマネージャはopenboxとdwmがインストールされています。スタック型かタイル型かは使い勝って、好み次第と思いますがどちらも一長一短があります。

ZEROではdwmをメインに使っていますがPi3と比較することもあることから簡単に切り換えできるようにしてみたいと思います。

xstartup

ウィンドウマネージャを変更するには~/.vnc/xstartupを編集することで切り換えることができます。
具体的な内容は前回までに掲載しています。異なる箇所を挙げるとopenboxはデフォルトのウィンドウマネージャに設定されているのでlxpanelを起動、dwmはlxpanelを外してdwmを明示的に記載することで変更することができます。
それぞれを別ファイルとして保存します。
xstartup.openbox
xstartup.dwm
切替時は$ cp xstartup.openbox xstartupとかしてrebootすればそれぞれのウィンドウマネージャで立ち上がることになります。

python3

上記の動作は簡単なスクリプトでも可能ですが今回はpythonを使ってみました。
pythonはウルトラの初心者ですが勉強のためpythonで作成しようと思います。
といってもweb上の記事(サンプル)を参考にしているだけですが(-。-;)

raspbian-liteにはpython2.7とpython3.5が含まれています。

python --version
Python 2.7.13

ディフォルトはPython2ですね。python3系に変更することも可能ですがraspbianではfile managerのrangerがpython2系になっているためディフォルトはPython2のままにして明示的にpython3で実行します。
次期raspbianのBusterでは間違いなくpython3系がディフォルトになると思います。

raspbian-liteでは必要なモジュールが含まれていないのでインストールします。

# apt install python3-pip python3-tk python3-rpi.gpio

参考サイト Python 入門 Button – Tkinter のウィジェット
参考サイトからtkinterを使用して少し見栄えのいいUIにします。

画像付きのボタンをクリックでxstartupのコピーを実行します。
選択したラベルを表示
Rebootボタンで再起動

~/bin/wm.py

#!/usr/bin/python3

from tkinter import *
from tkinter import ttk
import os

root = Tk()
root.title('WM Select')
s = StringVar()

# Frame as Widget Container
frame1 = ttk.Frame(
    root,
    padding=5)
frame1.grid()

# Button 1
def dwm():
    button1.state(['pressed'])
    button2.state(['!pressed'])
    s.set("WM: dwm")
    os.system("cp ~/.vnc/xstartup.dwm ~/.vnc/xstartup")
icon1 = PhotoImage(file='~/.icons/dwm.png')
button1 = ttk.Button(
    frame1,
    image=icon1,
    command=dwm)
button1.grid(row=1,column=1)

# Button 2
def openbox():
    button1.state(['!pressed'])
    button2.state(['pressed'])
    s.set("WM: openbox")
    os.system("cp ~/.vnc/xstartup.openbox ~/.vnc/xstartup")
icon2 = PhotoImage(file='~/.icons/openbox.png')
button2 = ttk.Button(
    frame1,
    image=icon2,
    command=openbox)
button2.grid(row=1,column=2)

# Button 3
def button3_clicked():
    os.system("sudo reboot")
button3 = ttk.Button(
    frame1,
    width=13,
    text='Reboot',
    command=button3_clicked)
button3.grid(row=3,column=1)

# Button 4
def button4_clicked():
    os.system("sudo reboot")
button4 = ttk.Button(
    frame1,
    width=13,
    text='Reboot',
    command=button4_clicked)
button4.grid(row=3,column=2)

# Button 5
def button5_clicked():
    os.system("sudo poweroff")
button5 = ttk.Button(
    frame1,
    width=13,
    text='Power OFF',
    command=button5_clicked)
button5.grid(row=4,column=1)

# Button 6
def button6_clicked():
    root.quit()
button6 = ttk.Button(
    frame1,
    width=13,
    text='Cancel',
    command=button6_clicked)
button6.grid(row=4,column=2)

# Label 1
label1 = ttk.Label(
    frame1,
    font='monospace, 16',
    foreground='#E71794',
    textvariable=s)
label1.grid(row=2,column=1,columnspan=2)

root.mainloop()
$ chmod 755 ~/bin/wm.py


画像ファイルは~/.iconsに入れておきます。
Cancelで終了、但し一旦書き込んだxstartupは元に戻さないので取り消すには再度書き込んでやります。
Rebootボタンは2個ありますがどちらも同じです。

起動はxbindkeysからファンクションキーに割り当てました。
openboxは更にlxpanelに登録しています。
メニューエディタをインストール、登録してアプリケーションランチャに登録しています。
~/.config/lxpanel/を直接編集してもいいでしょう。

# apt install alacarte