rofi的dbus扩展
py-rofi-bus的Python项目详细描述
此包为^ {TT1}$提供了DBUS基础。
当前版本是一个带有简单窗口切换器的框架api。api可能会发生巨大变化。
功能
(这些都是有计划的;0.2.0不会公开太多api)
- 通过py-rofi-bus 生成和填充脚本/modi
- 保存脚本/modi中的信息
- 将大量脚本/modi拆分成更小的组件,这些组件通过py-rofi-hub
用法
截至0.2.0,日志和帮助菜单非常稀少。没有明确的理由就指望事情会破裂。
MainDbusDaemon
py-rofi-bus的(当前)核心是MainDbusDaemon,它以某种方式组合了所有重要功能,但没有很好地实现其中任何功能。MainDbusDaemonfork将成为守护进程并在后台运行。它向SessionBus发布一个非常简单的接口,并等待用户的交互。如果它的主回路被击毙或退出,则目前不能自行复苏。
cli交互
py-rofi-bus公开一个非常简单的cli来管理MainDbusDaemon。
$ which py-rofi-bus ~/.local/bin/py-rofi-bus $ py-rofi-bus daemon -h usage: py-rofi-bus daemon [-h] {start,status,stop} ... positional arguments: {start,status,stop} Available actions start Start the daemon status Check the status of the daemon stop Stop the daemon optional arguments: -h, --help show this help message and exit
cli独立于守护进程,因此可以使用它重新启动守护进程。
dbus接口
start
启动守护程序。实际上什么也不做(除了我认为我没有正确地监视pid文件,所以它实际上只是重新启动守护进程)。
stop
停止守护进程。这会终止守护进程。
is_running
True如果守护进程正在运行,GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown如果守护进程没有运行。
load_apps
这是一个实验性功能,尝试运行在配置的load_from目录中找到的任何可执行文件。必须将文件标记为可执行文件,脚本才能加载它们。到目前为止,我的粗略测试已经证明了加载和控制简单脚本和更复杂的东西(如守护进程)的能力。他们还透露,我应该计划得更好一些,可能很快就会面临一些重构。
start
启动守护程序。实际上什么也不做(除了我认为我没有正确地监视pid文件,所以它实际上只是重新启动守护进程)。
stop
停止守护进程。这会终止守护进程。
is_running
True如果守护进程正在运行,GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown如果守护进程没有运行。
load_apps
这是一个实验性功能,尝试运行在配置的load_from目录中找到的任何可执行文件。必须将文件标记为可执行文件,脚本才能加载它们。到目前为止,我的粗略测试已经证明了加载和控制简单脚本和更复杂的东西(如守护进程)的能力。他们还透露,我应该计划得更好一些,可能很快就会面临一些重构。
systemd集成
MainDbusDaemon可以很容易地作为usersystemdunit运行。首先必须生成绑定到graphical-session.target的target。
$ cat $XDG_CONF_HOME/systemd/user/my-first.target [Unit] Description=Lives and dies with the graphical session BindsTo=graphical-session.target
我们现在可以将unit绑定到target,这意味着它也将依赖于graphical-session。请注意,下面的路径假定为--user安装。如果py-rofi-bus安装在其他地方,则需要更新它们。
$ cat $XDG_CONF_HOME/systemd/user/pyrofibus.service [Unit] Description=py-rofi-bus PartOf=graphical-session.target [Service] Type=forking ExecStart=%h/.local/bin/py-rofi-bus daemon start ExecStop=%h/.local/bin/py-rofi-bus daemon stop PIDFile=%h/.config/wotw/py-rofi-bus/.pid [Install] WantedBy=my-first.target # Start the service to make sure it works $ systemctl --user start pyrofibus.service # Assuming it does, you can enable it to run automatically $ systemctl --user enable pyrofibus.service
最后,要触发my-first.target,请将这些命令添加到启动文件中的某个位置。我运行i3,这些在我的i3配置文件的末尾执行。您的.whateverrc文件的尾部也可以正常工作。
# Some of these might not be necessary. I never weeded out the duds.
# You'll need some of these variables to be able to trigger the target.
systemctl --user import-environment USER HOME PATH DISPLAY XAUTHORITY
systemctl --user start my-first.target
示例应用程序
我更新了概念证明示例。它揭示了包裹的缺陷。用它和一粒盐。许多现在是手工操作的东西并不是永远都是手工操作的。
初始设置
假设您已经安装了py-rofi-bus,则需要创建配置目录。
$ mkdir -p "$XDG_CONFIG_HOME/wotw/py-rofi-bus/{apps-enabled,pids}"
要运行守护进程,它们必须在load_fromconfig目录中,除非您更改了内容,否则可能是上面的目录。
$cd path/to/repo/or/package $ ls -l examples/rofi-alt-tab total 16 -rw-r--r--. 1 cjharries cjharries 2457 Jun 3 13:06 active_window_monitor_daemon.py -rw-r--r--. 1 cjharries cjharries 2231 Jun 3 13:06 dbus_window_daemon.py -rw-r--r--. 1 cjharries cjharries 4826 Jun 3 13:06 ordered_window_script.py $ chmod u+x examples/rofi-alt-tab/*.py $source <( realpath examples/rofi-alt-tab/*daemon.py | \ awk '{ print "ln -s "$0" $XDG_CONFIG_HOME/wotw/py-rofi-bus/apps-enabled"; }' \ ) $ ls -l ~/.config/wotw/py-rofi-bus/apps-enabled total 12 lrwxrwxrwx. 1 cjharries cjharries 103 Jun 3 18:00 active_window_monitor_daemon.py -> <snip>/examples/rofi-alt-tab/active_window_monitor_daemon.py lrwxrwxrwx. 1 cjharries cjharries 93 Jun 3 18:00 dbus_window_daemon.py -> <snip>/examples/rofi-alt-tab/dbus_window_daemon.py
如果你不喜欢用符号链接文件,或者不想惹麻烦,你总是可以做一个普通的副本。
您还需要以某种方式公开脚本。通常建议的想法是将脚本存储在一个公共位置。
$ mkdir -p $XDG_CONFIG_HOME/rofi/scripts $cd path/to/repo/or/package $ ln -s $(realpath examples/rofi-alt-tab/ordered_window_script.py)$XDG_CONFIG_HOME/rofi/scripts
启动主守护进程
运行以下命令。
$ py-rofi-bus daemon start
劳恩茨举个例子
一旦文件在load_from目录中并且守护进程正在运行,您就必须添加另一个文件或弹出一个repl。
$ python >>> import pydbus >>> bus= pydbus.SessionBus()>>> loader= bus.get('pro.wizardsoftheweb.pyrofibus.daemon.window_properties')>>> loader.load_apps()>>> exit()
运行modi
在脚本可访问且守护进程正在运行的情况下,您可以一次性执行它,也可以将其添加到配置中。
# Runs it as a one-off $ rofi -modi alttab:~/.config/rofi/scripts/ordered_window_script.py -show alttab # Adds it to the existing config $exportROFI_CONFIG_FILE=$(rofi --help | awk 'BEGIN{ IGNORECASE = 1 };/configuration file/{ print $3; }')$[ -f $ROFI_CONFIG_FILE]|| rofi -dump-config > $ROFI_CONFIG_FILE$ sed \ -i=.bak \ -e 's@\([^-]modi:.*\)";@\1,alttab:~/.config/rofi/scripts/ordered_window_script.py";@g'\ $ROFI_CONFIG_FILE$ rofi -show alttab
结论
和它的前身一样,这个例子(以及它来自的包)仍然处于初级阶段。期待事情改变。如果python能为我做的话,这项工作就太多了。