43.19 桌面通知

Emacs 能够在支持 freedesktop.org 桌面通知规范、MS-Windows、Haiku 以及 Android 系统上发送 通知(notifications)

要在 POSIX 主机上使用该功能,Emacs 必须在编译时启用 D-Bus 支持,并且必须加载 notifications 库。See D-Bus in D-Bus integration in Emacs. 当支持 D-Bus 时,以下函数可用:

Function: notifications-notify &rest params

该函数通过 D-Bus 向桌面发送一条通知,内容由参数 params 指定。这些参数应为成对出现的关键字与值。支持的关键字与取值如下:

:bus bus

使用的 D-Bus 总线。仅当需要使用非 :session 总线时才需要此参数。

:title title

通知标题。

:body text

通知正文文本。根据通知服务端的实现,文本可包含 HTML 标记,如 ‘"<b>bold text</b>"’、超链接或图片。HTML 特殊字符必须转义,例如 ‘"Contact &lt;postmaster@localhost&gt;!"’。

:app-name name

发送通知的应用名称。默认值为 notifications-application-name

:replaces-id id

本条通知所要替换的通知 idid 必须是之前调用 notifications-notify 返回的结果。

:app-icon icon-file

通知图标的文件名。设为 nil 则不显示图标。默认值为 notifications-application-icon。 若值为字符串,函数会将其视为文件名并通过 expand-file-name 转为绝对路径;若为符号,则使用其名称(在遵循图标命名规范时非常有用 34)。

:actions (key title key title ...)

要应用的操作列表。keytitle 均为字符串。默认操作(通常通过点击通知触发)应使用名为 ‘"default"’ 的键。标题可以任意设置,不过具体实现可以选择不显示它。

:timeout timeout

通知显示后自动关闭的超时时间,单位为毫秒。若为 −1,通知过期时间由通知服务端设置决定,并可能因通知类型不同而变化。若为 0,通知永不过期。默认值为 −1。

:urgency urgency

通知优先级。可为 lownormalcritical

:action-items

指定此关键字时,操作的 title 字符串将被解析为图标名称。

:category category

通知类型,为字符串。标准分类列表请参见 Desktop Notifications Specification

:desktop-entry filename

指定代表调用程序的桌面文件名,例如 ‘"emacs"’。

:image-data (width height rowstride has-alpha bits channels data)

原始图像数据格式,依次描述宽度、高度、行跨度、是否包含透明通道、每样本位数、通道数与图像数据。

:image-path path

可以是 URI(目前仅支持 ‘file://’ 协议)或 ‘$XDG_DATA_DIRS/icons’ 中符合 freedesktop.org 规范的图标主题名称。

:sound-file filename

通知弹出时要播放的声音文件路径。

:sound-name name

来自 ‘$XDG_DATA_DIRS/sounds’、遵循 freedesktop.org 声音命名规范的主题化声音名称,在通知弹出时播放。与图标名称类似,仅用于声音。例如 ‘"message-new-instant"’。

:suppress-sound

使服务端禁止播放任何声音(如果支持该功能)。

:resident

设置后,服务端在操作被触发时不会自动移除通知。通知将一直保留,直到被用户或发送方显式移除。此提示通常仅在服务端支持 :persistence 能力时有效。

:transient

设置后,服务端会将通知视为临时通知,并忽略其持久化能力(如果存在)。

:x position
:y position

指定通知在屏幕上指向的 X、Y 坐标。两个参数必须同时使用。

:on-action function

操作被触发时调用的函数。通知 id 与操作 key 将作为参数传入该函数。

:on-close function

通知因超时或用户操作关闭时调用的函数。函数接收通知 id 与关闭 reason 作为参数:

  • expired:通知已过期
  • dismissed:用户已关闭通知
  • close-notification:通过调用 notifications-close-notification 关闭通知
  • undefined:通知服务端未提供原因

通知服务端支持哪些参数可通过 notifications-get-capabilities 查询。

该函数返回一个整数类型的通知 ID,可用于通过 notifications-close-notification 或另一次 notifications-notify 调用的 :replaces-id 参数管理该通知。示例:

(defun my-on-action-function (id key)
  (message "Message %d, key \"%s\" pressed" id key))
     ⇒ my-on-action-function

(defun my-on-close-function (id reason)
  (message "Message %d, closed due to \"%s\"" id reason))
     ⇒ my-on-close-function

(notifications-notify
 :title "Title"
 :body "This is <b>important</b>."
 :actions '("Confirm" "I agree" "Refuse" "I disagree")
 :on-action 'my-on-action-function
 :on-close 'my-on-close-function)
     ⇒ 22

A message window opens on the desktop.  Press ``I agree''.
     ⇒ Message 22, key "Confirm" pressed
        Message 22, closed due to "dismissed"
Function: notifications-close-notification id &optional bus

该函数关闭标识为 id 的通知。bus 可为表示 D-Bus 连接的字符串,默认为 :session

Function: notifications-get-capabilities &optional bus

返回通知服务端的能力,为一个符号列表。bus 可为表示 D-Bus 连接的字符串,默认为 :session。可用能力如下:

:actions

服务端会向用户提供指定的操作。

:body

支持通知正文。

:body-hyperlinks

服务端支持通知中的超链接。

:body-images

服务端支持通知中的图片。

:body-markup

支持正文文本中的标记。

:icon-multi

服务端会渲染给定图像数组中所有帧的动画。

:icon-static

支持显示任意图像数组的恰好一帧。与 :icon-multi 互斥。

:persistence

服务端支持通知持久化。

:sound

服务端支持通知声音。

其他厂商专属能力以 :x-vendor 开头,例如 :x-gnome-foo-cap

Function: notifications-get-server-information &optional bus

返回通知服务端信息,为字符串列表。bus 可为表示 D-Bus 连接的字符串,默认为 :session。返回列表格式为 (name vendor version spec-version)

name

服务端产品名称。

vendor

厂商名称。例如 ‘"KDE"’、‘"GNOME"’。

version

服务端版本号。

spec-version

服务端兼容的规范版本。

spec_versionnil,表示服务端支持 ‘"1.0"’ 之前的规范。

当 Emacs 在 MS-Windows 上以图形界面运行时,通过原生接口支持一小部分 D-Bus 通知功能:

Function: w32-notification-notify &rest params

该函数根据 params 显示一条 MS-Windows 托盘通知。Windows 托盘通知以气泡形式从任务栏通知区域的图标弹出。

返回值为通知的唯一整数 ID,可用于通过下文介绍的 w32-notification-close 移除通知。若函数失败,返回 nil

参数 params 以关键字/值对形式指定。所有参数均为可选,但如果未指定任何参数,函数将不执行任何操作并返回 nil

支持以下参数:

:icon icon

在系统托盘显示 icon。若 icon 为字符串,应指定要加载图标的文件名;文件应为 Windows .ico 图标文件。若 icon 不是字符串,或未指定此参数,则使用标准 Emacs 图标。

:tip tip

tip 用作通知的工具提示。若 tip 为字符串,鼠标悬停在通知添加的托盘图标上时将显示该文本。若 tip 不是字符串,或未指定此参数,默认工具提示为 ‘Emacs notification’。提示文本最长 127 个字符(W2K 之前的 Windows 版本为 63 个),超长会被截断。

:level level

通知严重级别,可为 infowarningerror。若指定,该值决定通知标题左侧显示的图标,但仅当同时指定了字符串类型的 :title 参数时有效。

:title title

通知标题。若 title 为字符串,将以较大字体显示在正文上方。标题最长 63 个字符,超长会被截断。

:body body

通知正文。若 body 为字符串,指定通知消息文本。可使用内嵌换行符控制分行。正文最长 255 个字符,超长会被截断。与 D-Bus 不同,正文仅支持纯文本,不支持标记。

注意:W2K 之前的 Windows 版本仅支持 :icon:tip。其他参数可以传入,但会被旧系统忽略。

同一时间最多只能有一个活跃通知。显示新通知前,必须先通过 w32-notification-close 移除当前活跃通知。

要从任务栏移除通知及其图标,使用以下函数:

Function: w32-notification-close id

该函数根据唯一 id 移除托盘通知。

当 Emacs 在 Haiku 系统上以图形程序运行时,也提供了一套简化版、风格类似前述 D-Bus 桌面通知的接口。下述函数缺少的主要能力是回调函数,如 :actions:on-action:on-close

Function: haiku-notifications-notify &rest params

该函数向桌面通知服务发送通知,支持的部分参数与 notifications-notify 类似。参数包括:

:title title
:body body
:replaces-id replaces-id
:urgency urgency

含义与 notifications-notify 中一致。

:app-icon app-icon

应为用作通知图标的图像文件名。若为 nil,则使用 Emacs 应用图标。

返回值为标识该通知的数字,可在后续调用本函数时作为 :replaces-id 参数使用。

当 Emacs 编译为 Android 应用包时,可通过 android-notifications-notify 显示通知。与 notifications-notify 相比,该函数不支持回调,且存在一些特有行为。

Function: android-notifications-notify &rest params

该函数显示一条桌面通知。params 是与 notifications-notify 类似的参数列表。参数包括:

:title title
:body body
:replaces-id replaces-id
:on-action on-action
:on-cancel on-close
:actions actions
:timeout timeout
:resident resident

含义与 notifications-notify 中一致,但最多只显示三个非默认操作。

:urgency urgency

支持的取值与 notifications-notify 相同,但优先级会应用到同一 group 下的所有通知(Android 7.1 及更早版本除外)。

:group group

字符串类型,指定本条通知所属的分类。该分类会出现在系统通知设置菜单中,但在 Android 7.1 及更早版本中被忽略。

group 为 nil 或未指定,将使用字符串 ‘"Desktop Notifications"’。

调用方应为每种通知提供固定的 urgencygroup 组合,因为如果优先级与该分组之前的通知不一致,系统可能会忽略该设置。

:icon icon

控制通知显示的图标。值为字符串,指定 android.R.drawable 系统包中的图标。可用图标列表请参见 R.drawable | Android Developers

若未指定或图标不存在,默认使用 ‘"ic_dialog_alert"’。

返回值为标识该通知的数字,可在后续调用本函数时作为 :replaces-id 参数使用。

在 Android 13 及更高版本中,如果 Emacs 未被授予显示通知的权限(see Android Environment in The GNU Emacs Manual),发送的所有通知将被静默忽略。


Footnotes

(34)

有关图标命名规范的更多信息,请参见 Icon Naming Specification