我的系统配置为当我收到新邮件时,屏幕上会出现一个通知气球。这有时很方便,有时却很分散注意力。无需卸载我正在使用的 gmail 集成,有没有办法集中地切换是否显示某些类型的通知?
换句话说,我正在寻找一个应用程序(或 API),它允许我查看使用通知服务的“已注册”应用程序列表,并将它们切换为启用/禁用。或者,允许我创建一个或多个正则表达式,这些正则表达式可用于匹配源应用程序名称或通知气泡内容,如果匹配,则阻止通知。
答案1
...但看起来工作量很大...
事实上,这还不算太糟糕,至少对于一个粗糙的通用解决方案而言。
以下是我去年(2012 年 9 月)帖子的回复,内容如下:
dbus-monitor "interface='org.freedesktop.Notifications'" \
| grep --line-buffered 'string "NetworkManager"' \
| sed -u -e 's/.*/killall notify-osd/g' \
| bash
string "NetworkManager"
用所需的 RE 替换以确定阻塞。
要了解要查找的 RE 模式匹配,请运行:
dbus-monitor "interface='org.freedesktop.Notifications'"
并在通知弹出时查看输出。
也就是说,要删除notify-send
消息,请使用以下grep
行:
| grep --line-buffered 'string "NetworkManager"\|string "notify-send"' \
警告:
killall notify-osd
不带歧视,无论是否NetworkManager
为notify-send
通知代理,都会完全清除任何待处理消息的通知堆栈。
一个“诚实”的解决方案需要考虑可能出现的竞争条件,即在确定需要清除通知和执行清除通知之间,另一个通知应该弹出,而不是与其他通知一起被清除。
此外,如果在收到要阻止的违规通知时通知处于待处理状态,则所有通知都将被清除。这种情况至少可以通过复制待处理通知,然后在清除后dbus
重新发出所需通知来解决。notify-send
这是一项需要大量手工劳动的工作!
理想情况下,直接使用 dbus
method void org.freedesktop.Notifications.CloseNotification(uint id) [1]
不幸的是,专门针对所需的通知并不明显......但是......
另一个答案
org.freedesktop.Notifications.CloseNotification(uint id) 可以通过 DBus 触发和调用吗?
展示了如何使用[1]
,至少是使用notify-send
,但不幸的是不能用于任意通知应用程序。尽管一些应用程序有自定义界面来控制弹出通知。
交叉引用:
答案2
您可能能够在 d-bus 级别过滤此问题,但这看起来需要做很多工作。首先查看此帖子以深入了解 osd 的运作方式
在单独的控制台上发送运行“notify-send”之前启动 dbus-monitor。
方法调用发送方=:1.2450 -> 目标=org.freedesktop.DBus 串行=5 路径=/org/freedesktop/DBus;接口=org.freedesktop.DBus;成员=GetNameOwner 字符串“org.freedesktop.Notifications” 方法调用发送者=:1.2450 -> 目标=:1.41 序列=6 路径=/org/freedesktop/Notifications;接口=org.freedesktop.Notifications;成员=GetServerInformation 方法返回发送者=:1.41 -> 目标=:1.2450 reply_serial=6 字符串“notify-osd” 字符串“Canonical Ltd” 字符串“1.0” 字符串“1.1” 方法调用发送者=:1.2450 -> 目标=:1.41 序列=7 路径=/org/freedesktop/Notifications;接口=org.freedesktop.Notifications;成员=Notify 字符串“通知发送” uint32 0 字符串“/usr/share/pixmaps/debian-logo.png” 字符串“我的标题” 字符串“一些文本主体” 大批 [ ] 大批 [ 字典条目( 字符串“紧急程度” 变体字节 1 ) ] int32 -1
dbus 上确实存在 notify-osd
dpkg -L 通知-osd /usr/share/dbus-1/services/org.freedesktop.Notifications.service
但 /etc/dbus-1/system.d 中没有针对此服务的额外限制
因此,您可能能够创建一个配置文件,该文件可以根据通知事件的来源过滤掉通知事件并实现您想要的控制。这是我在不深入研究问题和 dbus 规范的情况下能做的最好的事情。我希望这能有所帮助,您所追求的应该更容易配置。