rofi的dbus扩展

py-rofi-bus的Python项目详细描述


https://badge.fury.io/py/py-rofi-bus.svghttps://travis-ci.org/thecjharries/py-rofi-bus.svg?branch=masterhttps://coveralls.io/repos/github/thecjharries/py-rofi-bus/badge.svg?branch=master

此包为^ {TT1}$提供了DBUS基础。

当前版本是一个带有简单窗口切换器的框架api。api可能会发生巨大变化。

功能

(这些都是有计划的;0.2.0不会公开太多api)

  • 通过py-rofi-bus
  • 生成和填充脚本/modi
  • 保存脚本/modi中的信息
  • 将大量脚本/modi拆分成更小的组件,这些组件通过py-rofi-hub

设置

系统依赖性

安装

$ pip install --user py-rofi-bus

用法

截至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目录中找到的任何可执行文件。必须将文件标记为可执行文件,脚本才能加载它们。到目前为止,我的粗略测试已经证明了加载和控制简单脚本和更复杂的东西(如守护进程)的能力。他们还透露,我应该计划得更好一些,可能很快就会面临一些重构。

systemd集成

MainDbusDaemon可以很容易地作为usersystemdunit运行。首先必须生成绑定到graphical-session.targettarget

$ 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能为我做的话,这项工作就太多了。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何使用Ibatis在插入时返回ID(使用返回关键字)   java(org.hibernate.TransactionException)org。冬眠TransactionException:事务未成功启动   java小程序jwindow始终位于JNLP顶部   在Java中重新解析JSON对象?   java单击后将ListView数据移动到新屏幕   Mule ESB中的java WSA寻址特性   Java,对象编程:获取返回0值的方法   hibernate的Java通用问题,如何处理T get(K id)   java在使用超级CSV读取CSV时忽略引用   ssh使用Java远程运行命令   java如何向具体用户发送websocket消息?   在JAVA中,我可以在不指定的情况下使用条件运算符吗?