3

我有一个简单的 Python 代码,它使用来自GI的AppIndicator3创建一个 Linux 托盘指示器。这很好用。但我想检测并处理简单的用户单击或双击此托盘图标。

据我所知,例如,Telegram使用Qt 类QSystemTrayIcon,它支持此功能,因为当用户双击托盘图标时,Telegram 窗口会显示自己。

  • 我知道 AppIndicator3 支持scroll_event当用户在托盘图标上滚动鼠标滚轮时触发的信号。

AyatanaAppIndicator3.Indicator接收到滚动事件时发出信号。

设置在图标/标签上menuitem发出辅助激活事件(即中键单击)时激活 。AyatanaAppIndicator3.Indicator

有人了解它的工作原理吗?前面的两个例子都让我想知道为什么没有简单的鼠标点击信号/事件。我在想是否有可能更深入,也许继承AyatanaAppIndicator3.Indicator类并重写一些事件处理?或者更深入地研究StatusNotifierItemActivate方法,如果它是 AppIndicator 实现的?

或者有什么棘手的解决方法吗?因为这似乎是一个十多年来没有答案的问题,我对“不可能”的答案并不满意。

我也知道我不是第一个问这个问题的人。我进行了小型研究,发现了多个相关线程:

Python AppIndicator 绑定-> 如何检查菜单是否打开?
单击应用程序指示器时如何运行操作
如何编程单击指示器(添加中间单击功能)?
显示/隐藏菜单时,指示器应用程序不发送信号
处理单击事件和修饰符

4

1 回答 1

2

AppIndicator 的感知限制是经过深思熟虑的设计选择(请参阅背景信息)。

监听鼠标点击事件将不起作用

使用 AppIndicator,您可以进行以下交互:

  • 主要操作:显示上下文菜单(可能仅包含常规菜单项,不能放置任意小部件)。
  • 次要操作:激活此上下文菜单中的一个特定项目(通常在桌面上单击鼠标中键)。
  • 监听图标上的鼠标滚动事件。

您将需要切换到另一个解决方案来检测任意鼠标点击。在这里,我假设您想在相应地标记您的问题时坚持使用 Python/GTK。

一种解决方案是使用基于相当旧的System Tray Protocol Specification的 Gtk.StatusIcon 。问题是这个解决方案正在慢慢被淘汰。它在 GTK3 中被标记为弃用,并在 GTK4 中被删除。

我知道的唯一其他可行的解决方案是libxapps(由 Mint Linux 提供)。它具有XApp.StatusIcon,它专门设计为 Gtk.StatusIcon 的现代替代品。它支持所有可以显示托盘图标的桌面环境。

背景资料

Ubuntu 桌面体验团队将 Linux 桌面通知区域视为“问题区域”。具体来说,他们批评了不同应用状态图标在用户体验和风格上的不一致。他们建议将用户交互限制为一些标准化的方式。这一努力促成了 AppIndicator 的开发。 (资源)

顺便说一句,这是另一篇关于不同解决方案的旧(2011 年)博客文章:
StatusNotifierItem (aka App Indicators) for Qt applications

于 2021-02-19T02:27:30.977 回答