org.freedesktop.Notifications.CloseNotification(uint id) 可以通过 DBus 触发和调用吗?

org.freedesktop.Notifications.CloseNotification(uint id) 可以通过 DBus 触发和调用吗?

參考文獻:
通知 OSD 上的关闭按钮?

书签:
org.freedesktop.Notifications.CloseNotification(uint id) 可以通过 DBus 触发和调用吗?

目前,此脚本

dbus-monitor "interface='org.freedesktop.Notifications'" |             \
grep --line-buffered "member=Notify"                     |             \
sed -u -e  's/.*/killall notify-osd/g'                   |             \
bash

将终止所有待处理的通知。

最好使用 来巧妙地取消特定目标 OSD 通知 org.freedesktop.Notifications.CloseNotification(uint id)。是否有一个接口方法可以将其放在 DBus 上(在?)以在发生特定通知事件时触发?

该方法需要获取通知 PID 以用作 的参数CloseNotification(uint id)。或者,

  qdbus    org.freedesktop.Notifications                \
          /org/freedesktop/Notifications                \
           org.freedesktop.Notifications.CloseNotification(uint id)

如果可以确定参数,则可以从 shell 中使用(uint id)。实际命令语法将使用整数代替(uint id)

也许首先要问的一个更好的问题是“如何找到通知的 DBus 地址?”。
这两个都不能正确识别它:

gdbus monitor --session --dest org.freedesktop.Notifications

返回

The name org.freedesktop.Notifications is owned by :1.130
...

或者

dbus-monitor "interface='org.freedesktop.Notifications'"

返回

... string ":1.340" ...

回想起来,之前的问题“如何(uint id)找到通知?”是修辞性的,因为之前已经回答过另一个问题:
https://askubuntu.com/a/186311/89468
提供详细信息,因此可以使用以下任一方法:

gdbus call --session --dest org.freedesktop.DBus                                   \
             --object-path /                                                       \
                   --method org.freedesktop.DBus.GetConnectionUnixProcessID :1.16

返回:

(uint32 8957,)

或者

qdbus --literal --session  org.freedesktop.DBus                                  \
                          /                                                      \
                           org.freedesktop.DBus.GetConnectionUnixProcessID :1.16

返回:

8957

弹出通知OSD涂鸦将被击败:

  qdbus    org.freedesktop.Notifications                             \
          /org/freedesktop/Notifications                             \
           org.freedesktop.Notifications.CloseNotification           \
  $(qdbus --literal --session                                        \
           org.freedesktop.DBus                                      \
          /                                                          \
           org.freedesktop.DBus.GetConnectionUnixProcessID :?.???  )

“技巧”是找到:?.???DBus地址。

答案1

你怎么知道什么(UINT32 id)是或什么不是?

You ... need a way to get that ID ...鉴于本声明回答根据以下经验观察,问题的标题或许应该改为“如何gdbus ... -m org.freedesktop.Notifications.CloseNotification ...关闭通知?”

是通过暗示还是通过消除过程得出的语句“......它只表明 ID 必须是唯一的、非零的,并且小于 MAXINT ......”,在描述中找到9.1.2. org.freedesktop.Notifications.通知,也适用于CloseNotification参数(UINT32 id)UINT32通过消除过程,可以得出文档中作为属性类型的唯一共同因素,并且暗示必须存在某种共同的 ID“句柄”,但是……

Notify返回值及其参数的细节UINT32 replaces_id非常明确,但不清楚与此CloseNotification有何(UINT32 id)关系,如下面的实证测试所示。

引用9.1.3. org.freedesktop.Notifications.关闭通知总的来说:

9.1.3. org.freedesktop.Notifications.CloseNotification

void org.freedesktop.Notifications.CloseNotification (UINT32 id);

Causes a notification to be forcefully closed and removed from the user's view.
It can be used, for example, in the event that what the notification pertains to
is no longer relevant, or to cancel a notification with no expiration time.

The NotificationClosed signal is emitted by this method.

If the notification no longer exists, an empty D-BUS Error message is sent back.

这并不能描述或解释的含义(UINT32 id)

一个明显的缺陷是缺少一个表格来描述该NotificationClosed (UINT32 id)参数。方法和信号的所有其他参数都符合这样的表格。

实证测试表明,通知不会使用Notify的返回值关闭:

 qdbus  org.freedesktop.Notifications                           \
       /org/freedesktop/Notifications                           \
        org.freedesktop.Notifications.CloseNotification         \
$(gdbus call --session                                          \
     -d org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
     -m org.freedesktop.Notifications.Notify                    \
                     "" 0 "" "sigma-ry" "corpus" [] {} 200      \
 | sed -e 's/(uint32\(.*\),)/\1/g'                            )

或者

 qdbus  org.freedesktop.Notifications                           \
       /org/freedesktop/Notifications                           \
        org.freedesktop.Notifications.CloseNotification         \
$(gdbus call --session                                          \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.Notify                    \
                     "" 5 "" "sigma-ry" "corpus" [] {}  20      \
 | sed -e 's/(uint32\(.*\),)/\1/g'                            )

通知不会关闭,如果(UINT32 id)通过返回值进行识别,就会出现这种情况Notify

更多测试:

 gdbus call --session                                           \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.CloseNotification         \
$(gdbus call --session                                          \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.Notify                    \
                     "" 0 "" "sigma-ry" "corpus" [] {}     0    \
 | sed -e 's/(uint32\(.*\),)/\1/g'                            )

甚至强制使用常量 ID,通过设置UINT32 replaces_id为 42 和expire_timeout0,可以看出CloseNotification没有影响

 gdbus call --session                                           \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.CloseNotification         \
$(gdbus call --session                                          \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.Notify                    \
                     "" 42 "" "sigma-ry" "corpus" [] {}    0    \
 | sed -e 's/(uint32\(.*\),)/\1/g'                            )

即使42在整个方法中进行往返,并确认

dbus-monitor "interface='org.freedesktop.Notifications'"

在输出中

方法调用发送者=:1.332 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=Notify
   细绳 ””
   单位32四十二
   细绳 ””
   字符串“sigma-ry”
   字符串“语料库”
   大批 [
   ]
   大批 [
   ]
   int32 0
方法调用发送者=:1.333 -> dest=org.freedesktop.Notifications serial=3 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=CloseNotification
   单位32四十二

另请注意 -1 超时通知失败(文档是矛盾的):

  gdbus call --session                                          \
    -d  org.freedesktop.Notifications                           \
    -o /org/freedesktop/Notifications                           \
    -m  org.freedesktop.Notifications.Notify                    \
                     "" 42 "" "sigma-ry" "corpus" [] {}   -1

尽管这“有效”

notify-send "test" -t -1

參考文獻:
显示通知的程序名称是什么?(文件矛盾)
如何强制在notify-osd中显示新的通知而不等待之前的通知退出?
如何使用“notify-send”立即替换现有通知?

书签:
org.freedesktop.Notifications.CloseNotification(uint id) 可以通过 DBus 触发和调用吗?

答案2

CloseNotification方法被定义为 D-Bus 方法规格。但是,它只规定 ID 必须是唯一的、非零的并且小于 MAXINT。它不要求 ID 是调用进程的 PID。您需要一种方法来获取该 ID,然后才能成功调用该方法。

答案3

我知道我有点晚了,但是今天我自己也遇到了这个问题,这可能对其他人有用!

首先,安装一个libnotify-bin支持-p打印通知 ID 选项的补丁:

sudo apt-add-repository ppa:izx/askubuntu
sudo apt-get update
sudo apt-get install libnotify-bin

现在是一个示例脚本,它会发送一个没有超时的通知,然后在某个命令完成后关闭通知(在这种情况下,只需睡眠 5 秒):

notify-send 'Message...' -i dialog-information \
    -t 0 -h int:transient:1 \
    -p >/tmp/notification_id

sleep 5

qdbus org.freedesktop.Notifications \
     /org/freedesktop/Notifications \
      org.freedesktop.Notifications.CloseNotification \
    $(cat /tmp/notification_id)

相关内容