是否可以添加或编辑会话指示器菜单项?
有没有简单的方法可以做到这一点,或者是否需要重新编译自定义版本?
我在网上找不到太多与此相关的信息。
答案1
一些参考:
-jimi312 / 标题栏菜单 / 来源 — Bitbucket:
-使用 PyQt 进行 DBus 编程
-Unity/QA/StateIntrospection - Ubuntu 维基百科:特别是示例代码
目前,被动查询可以提取如下帖子中所示的信息:
如何找出哪个应用程序与指示图标相关联?。
我也在探索这个问题的答案,因为它与 DBus 有关,尽可能使用高级接口以避免低级编程。最终目标是创建一个实用程序,最低限度地识别指示器的主机应用程序及其组件菜单的子应用程序。最大限度,它将允许修改菜单,例如session-indicator
包括顶级菜单的菜单,即统一面板本身的图标指示器。
最好知道 DBus 环境中存在哪些(如果有的话)修饰方法可以修改 DBus,这样就可以根据需要修改indicator panel
及其组件(例如)。Session Indicator
以下命令揭示了操作session indicator
总线信息的接口方法,但遗憾的是这里没有描述这些方法中使用的参数 - 上面的参考提供了描述一般指示器接口的文档的链接 - 但session indicator
仍然需要具体细节。
输出
qdbus --session com.canonical.indicator.session
暗示菜单界面的存在项目以下:
/
/org
/org/ayatana
/org/ayatana/indicator
/org/ayatana/indicator/service
/com
/com/canonical
/com/canonical/indicator
/com/canonical/indicator/users
/com/canonical/indicator/用户/菜单
/com/canonical/indicator/session
/com/canonical/indicator/session/service
/com/canonical/indicator/session/menu
可以使用以下方法检查接口:
gdbus introspect --session --dest com.canonical.indicator.session \
--object-path /com/canonical/indicator/users/menu --recurse
和
gdbus introspect --session --dest com.canonical.indicator.session \
--object-path /com/canonical/indicator/session/menu --recurse
请注意 的内部引用interface com.canonical.dbusmenu
。
对于真正的全面转储使用:
gdbus introspect --session --dest com.canonical.indicator.session --object-path / --recurse
几个子应用程序绑定到session indicator
下拉菜单,但不清楚这些接口方法是否仅将数据传输到相关的子菜单应用程序,或者是否实际上存在与会话指示器应用程序本身的通信渠道,以便其菜单可以“方法化”。
还,
qdbus --literal --session com.canonical.AppMenu.Registrar \
/com/canonical/AppMenu/Registrar \
com.canonical.AppMenu.Registrar.GetMenus \
| sed -e 's/], \[/],\n[/g' | sort -k 4 -V
提供界面菜单关联列表(有menus
针对窗口的,也有针对指示器的,比如session indicator
,下面列表中的哪个还有待确定)
[Argument: (uso) 25167301, ":1.22", [ObjectPath: /com/canonical/menu/18005C5]],
[Argument: (uso) 25165828, ":1.22", [ObjectPath: /com/canonical/menu/1800004]],
[Argument: (uso) 48234500, ":1.81", [ObjectPath: /com/canonical/menu/2E00004]],
[Argument: (uso) 55244411, ":1.114", [ObjectPath: /com/canonical/menu/34AF67B]],
[Argument: (uso) 55370996, ":1.114", [ObjectPath: /com/canonical/menu/34CE4F4]],
...
[Argument: (uso) 65083174, ":1.275", [ObjectPath: /com/canonical/menu/3E11726]],
[Argument: (uso) 65085474, ":1.275", [ObjectPath: /com/canonical/menu/3E12022]],
检查
qdbus --session com.canonical.AppMenu.Registrar /com/canonical/AppMenu/Registrar
这些方法可能有用:
method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value
method void com.canonical.AppMenu.Registrar.RegisterWindow(uint windowId, QDBusObjectPath menuObjectPath)
method void com.canonical.AppMenu.Registrar.UnregisterWindow(uint windowId)
注意参数被标识为menuObjectPath
。这些方法名称以限定{un}RegisterWindow
,因此这些方法可能与指示器菜单无关。
一旦确定了正确的方法及其参数,使用起来就更容易了qdbus
(但是不能使用 QVariant 参数)或者D-Feet
调用gdbus
这些方法。
基本上qdbus
和gdbus
功能相同,并使用相同的参数,但以下情况除外:
qdbus
不识别单独的组件,--dest, --object-path, --method, ...
而是要求按精确顺序给出相应的属性gdbus
方法调用处理更多参数类型qdbus
并不像gdbus
特别是 w/那样详尽--recurse
qdbus
可以通过双击或三击从其输出中提取其命令参数序列,并使用鼠标中键将其连接到命令的末尾
答案
如何找出哪个应用程序与指示图标相关联?
在上面提到的帖子中描述了如何使用qdbus
作为一种权宜之计来编写脚本。
手册页man gdbus
(或gdbus:
) 比 有更好的阐述,man qdbus
但请考虑D-Feet
。