Raspberry Pi Application Menuとdevilspie

アプリケーションを起動する方法はメインメニューやファイルマネージャーの関連付けなどいろいろありますが自作のスクリプトや自前でコンパイルしたアプリケーションを含めて使いやすいと思うものはあまり見当たりません。

以前ZEROで作成したpythonクリプトのアプリケーションランチャを利用します。

devilspieはX Window Systemのウインドウを検出してマッチしたときウインドウサイスや位置など一連のアクションを実行することができます。

Application Menu

アプリケーションランチャ(ZERO)

これまでデイスクトップやLXPanelに置いていたものなどを適当に登録してみました。
アイコンファイルは32×32サイズを使っています。

サンプル ~/bin/app_menu.py

#!/usr/bin/python3

from tkinter import *
from tkinter import ttk 
import subprocess
import time

root = Tk()
root.title('Application Menu')
style = ttk.Style()
style.theme_use('default') #('clam', 'alt', 'default', 'classic')

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

# Button arduino
def app06():
    subprocess.run("~/Applications/arduino/arduino &", shell=True)
    time.sleep(5)
    subprocess.run("killall devilspie && devilspie -a &", shell=True)
icon6 = PhotoImage(file='~/.icons/32x32/arduino.png')
button6 = ttk.Button(
    frame1,
    image=icon6,
    command=app06)
button6.grid(row=2,column=1)

# Button loop_remove
def app15():
    subprocess.run("~/bin/loop_remove.py &", shell=True)
    time.sleep(1)
    subprocess.run("killall devilspie && devilspie -a &", shell=True)
icon15 = PhotoImage(file='~/.icons/32x32/folder_loop.png')
button15 = ttk.Button(
    frame1,
    image=icon15,
    command=app15)
button15.grid(row=3,column=5)

root.mainloop()

~/.iconsはサイズ別に整理しています。
subprocess.runでdevilspieを再起動しています。(後述)
ボタンの並びはrowとcolumnを入れ替えることで変更できます。

devilspie

アプリケーションを起動するとopenboxは空いているスペースから配置します。devilspieから特定のアプリケーションを使いやすい場所に配置するようにします。

# apt install gdevilspie

gDevilspieはdevilspieのGUIフロントエンドです。devilspieは依存関係でインストールされます。
Xのパラメータは少々わかりにくい項目もありますが今回の用途ではgDevilspieから比較的簡単に設定することができます。

メニュー アクセサリ gDevilspie 起動
追加をクリック


Matchingタブ
一番上の枠にルールネームを記入(適当に)
window_nameまたはapplication_nameにチェック


Actionsタブ
とりあえずgeometryにチェック
ほか
pin 全ワークスペースに配置
shade タイトルバー巻き上げ
set_workspace ワークスペースナンバー指定
maximize 最大化
minimize 最小化
などなど


Application Menuを配置したい場所に移動
Getボタンクリック
Window SelectorでApplication Menu選択 適用をクリック


ウインドウサイズ、位置取得


Rawタブで確認(このタブからは直接編集不可)
保存をクリック
( window_name ) “Application Menu” はapp_menu.pyのroot.title(‘Application Menu’)で設定した値です。タイトルを変更するとdevilspieからはmatchしなくなります。


app_menuが登録された
ここでApplication Menuのウインドウ位置をずらしてStartボタンをクリックすると設定が正しければ(matchしたら)ヒョイと移動します。


MatchやActionの追加、変更は編集ボタンから実行します。
設定したファイルは~/.devilspie以下に保存されます。
ウインドウサイズは必ずしも期待通りの値を取得しません。
細かい調整は直接~/.devilspie/app_menu.dsを編集したほうが早い。

正しい値はターミナルから

$ xwininfo

を実行してApplication Menuウインドウをクリックすると取得できます。編集しながらStop,Startで確認できます。

*pcmanfmは登録してはいけません。画面全体がずれる。(再起動で直る)
*アプリケーションによってはgeometryが指定できます。(早い確実)
*常用するターミナルなどはopenboxに任せたほうがいい(と思う)
*期待通りの位置にいかないものはxdotoolを使っています。

*devilspieは起動時に自動実行します。
当サイトのApplication Menuはpin,shadeをActionに加えて右上隅に配置しています(ウインドウを巻き上げて全ワークスペースに配置)
OS起動時にApplication Menuを起動しています。
Application Menu内のアプリケーション実行後は
subprocess.run(“killall devilspie && devilspie -a &”, shell=True)
でまたウインドウを巻き上げています。
(起動済みアプリケーションでサイズ、位置変更している場合は設定値に戻る)

app_menu.pyを自動実行する(autostart)
~/.config/autostart/app_menu.desktop

[Desktop Entry]
Type=Application
Name=app_menu
Exec=~/bin/app_menu.py

当サイトのスタートアップはxdotoolと併用しながらスクリプトから起動しています。
ターミナルやpcmanfmはxdotoolでワークスペースを切り替えながら配置。(xdotoolは適切にスリープを入れること)

前回のshutdown.py,changesd.pyも登録、実行時は中央に配置しています。