desktop-notifications.rst 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. .. _desktop_notifications:
  2. Desktop notifications
  3. =======================
  4. |kitty| implements an extensible escape code (OSC 99) to show desktop
  5. notifications. It is easy to use from shell scripts and fully extensible to show
  6. title and body. Clicking on the notification can optionally focus the window it
  7. came from, and/or send an escape code back to the application running in that
  8. window.
  9. The design of the escape code is partially based on the discussion in the
  10. defunct `terminal-wg <https://gitlab.freedesktop.org/terminal-wg/specifications/-/issues/13>`__
  11. The escape code has the form::
  12. <OSC> 99 ; metadata ; payload <terminator>
  13. Here ``<OSC>`` is :code:`<ESC>]` and ``<terminator>`` is
  14. :code:`<ESC><backslash>`. The ``metadata`` is a section of colon separated
  15. :code:`key=value` pairs. Every key must be a single character from the set
  16. :code:`a-zA-Z` and every value must be a word consisting of characters from
  17. the set :code:`a-zA-Z0-9-_/\+.,(){}[]*&^%$#@!`~`. The payload must be
  18. interpreted based on the metadata section. The two semi-colons *must* always be
  19. present even when no metadata is present.
  20. Before going into details, lets see how one can display a simple, single line
  21. notification from a shell script::
  22. printf '\x1b]99;;Hello world\x1b\\'
  23. To show a message with a title and a body::
  24. printf '\x1b]99;i=1:d=0;Hello world\x1b\\'
  25. printf '\x1b]99;i=1:d=1:p=body;This is cool\x1b\\'
  26. The most important key in the metadata is the ``p`` key, it controls how the
  27. payload is interpreted. A value of ``title`` means the payload is setting the
  28. title for the notification. A value of ``body`` means it is setting the body,
  29. and so on, see the table below for full details.
  30. The design of the escape code is fundamentally chunked, this is because
  31. different terminal emulators have different limits on how large a single escape
  32. code can be. Chunking is accomplished by the ``i`` and ``d`` keys. The ``i``
  33. key is the *notification id* which can be any string containing the characters
  34. ``[a-zA-Z0-9_-+.]``. The ``d`` key stands for *done* and can only take the
  35. values ``0`` and ``1``. A value of ``0`` means the notification is not yet done
  36. and the terminal emulator should hold off displaying it. A value of ``1`` means
  37. the notification is done, and should be displayed. You can specify the title or
  38. body multiple times and the terminal emulator will concatenate them, thereby
  39. allowing arbitrarily long text (terminal emulators are free to impose a sensible
  40. limit to avoid Denial-of-Service attacks). The size of the payload must be no
  41. longer than ``2048`` bytes, *before being encoded*.
  42. Both the ``title`` and ``body`` payloads must be either UTF-8 encoded plain
  43. text with no embedded escape codes, or UTF-8 text that is :rfc:`base64 <4648>`
  44. encoded, in which case there must be an ``e=1`` key in the metadata to indicate
  45. the payload is :rfc:`base64 <4648>` encoded.
  46. Being informed when user activates the notification
  47. -------------------------------------------------------
  48. When the user clicks the notification, a couple of things can happen, the
  49. terminal emulator can focus the window from which the notification came, and/or
  50. it can send back an escape code to the application indicating the notification
  51. was activated. This is controlled by the ``a`` key which takes a comma separated
  52. set of values, ``report`` and ``focus``. The value ``focus`` means focus the
  53. window from which the notification was issued and is the default. ``report``
  54. means send an escape code back to the application. The format of the returned
  55. escape code is::
  56. <OSC> 99 ; i=identifier ; <terminator>
  57. The value of ``identifier`` comes from the ``i`` key in the escape code sent by
  58. the application. If the application sends no identifier, then the terminal
  59. *must* use ``i=0``. Actions can be preceded by a negative sign to turn them
  60. off, so for example if you do not want any action, turn off the default
  61. ``focus`` action with::
  62. a=-focus
  63. Complete specification of all the metadata keys is in the table below. If a
  64. terminal emulator encounters a key in the metadata it does not understand,
  65. the key *must* be ignored, to allow for future extensibility of this escape
  66. code. Similarly if values for known keys are unknown, the terminal emulator
  67. *should* either ignore the entire escape code or perform a best guess effort
  68. to display it based on what it does understand.
  69. .. note::
  70. It is possible to extend this escape code to allow specifying an icon for
  71. the notification, however, given that some platforms, such as legacy versions
  72. of macOS, don't allow displaying custom images on a notification, it was
  73. decided to leave it out of the spec for the time being.
  74. Similarly, features such as scheduled notifications could be added in future
  75. revisions.
  76. Being informed when a notification is closed
  77. ------------------------------------------------
  78. .. versionadded:: 0.36.0
  79. Notifications of close events were added in kitty version 0.36.0
  80. If you wish to be informed when a notification is closed, you can specify
  81. ``c=1`` when sending the notification. For example::
  82. <OSC> 99 ; i=mynotification : c=1 ; hello world <terminator>
  83. Then, the terminal will send the following
  84. escape code to inform when the notification is closed::
  85. <OSC> 99 ; i=mynotification : p=close ; <terminator>
  86. If no notification id was specified ``i=0`` will be used.
  87. If ``a=report`` is specified and the notification is activated/clicked on
  88. then both the activation report and close notification are sent.
  89. .. note:: On macOS the OS does not supply notification
  90. closed events to applications. As such close events must be implemented
  91. via polling. It is up to the terminal emulator to decide a reasonable
  92. time limit for how long to poll, before giving up. kitty polls for 60
  93. seconds. Therefore, terminal applications should not rely on close events
  94. being authoritative.
  95. Closing an existing notification
  96. ----------------------------------
  97. .. versionadded:: 0.36.0
  98. The ability to close a previous notification was added in kitty 0.36.0
  99. To close a previous notification, send::
  100. <OSC> i=<notification id> : p=close ; <terminator>
  101. This will close a previous notification with the specified id. If no such
  102. notification exists (perhaps because it was already closed or it was activated)
  103. then the request is ignored.
  104. .. _notifications_query:
  105. Querying for support
  106. -------------------------
  107. .. versionadded:: 0.36.0
  108. The ability to query for support was added in kitty 0.36.0
  109. An application can query the terminal emulator for support of this protocol, by
  110. sending the following escape code::
  111. <OSC> 99 ; i=<some identifier> : p=? ; <terminator>
  112. A conforming terminal must respond with an escape code of the form::
  113. <OSC> 99 ; i=<some identifier> : p=? ; key=value : key=value <terminator>
  114. The identifier is present to support terminal multiplexers, so that they know
  115. which window to redirect the query response too.
  116. Here, the ``key=value`` parts specify details about what the terminal
  117. implementation supports. Currently, the following keys are defined:
  118. ======= ================================================================================
  119. Key Value
  120. ======= ================================================================================
  121. ``a`` Comma separated list of actions from the ``a`` key that the terminal
  122. implements. If no actions are supported, the ``a`` key must be absent from the
  123. query response.
  124. ``o`` Comma separated list of occassions from the ``o`` key that the
  125. terminal implements. If no occassions are supported, the value
  126. ``o=always`` must be sent in the query response.
  127. ``u`` Comma separated list of urgency values that the terminal implements.
  128. If urgency is not supported, the ``u`` key must be absent from the
  129. query response.
  130. ``p`` Comma spearated list of supported payload types (i.e. values of the
  131. ``p`` key that the terminal implements). These must contain at least
  132. ``title`` and ``body``.
  133. ``c`` ``c=1`` if the terminal supports close events, otherwise the ``c``
  134. must be omitted.
  135. ======= ================================================================================
  136. In the future, if this protocol expands, more keys might be added. Clients must
  137. ignore keys they dont understand in the query response.
  138. To check if a terminal emulator supports this notifications protocol the best way is to
  139. send the above *query action* followed by a request for the `primary device
  140. attributes <https://vt100.net/docs/vt510-rm/DA1.html>`_. If you get back an
  141. answer for the device attributes without getting back an answer for the *query
  142. action* the terminal emulator does not support this notifications protocol.
  143. Specification of all keys used in the protocol
  144. --------------------------------------------------
  145. ======= ==================== ========== =================
  146. Key Value Default Description
  147. ======= ==================== ========== =================
  148. ``a`` Comma separated list ``focus`` What action to perform when the
  149. of ``report``, notification is clicked
  150. ``focus``, with
  151. optional leading
  152. ``-``
  153. ``d`` ``0`` or ``1`` ``1`` Indicates if the notification is
  154. complete or not. A non-zero value
  155. means it is complete.
  156. ``e`` ``0`` or ``1`` ``0`` If set to ``1`` means the payload is :rfc:`base64 <4648>` encoded UTF-8,
  157. otherwise it is plain UTF-8 text with no C0 control codes in it
  158. ``i`` ``[a-zA-Z0-9-_+.]`` ``0`` Identifier for the notification. Make these globally unqiue,
  159. like an UUID, so that termial multiplxers can
  160. direct responses to the correct window.
  161. ``p`` One of ``title``, ``title`` Whether the payload is the notification title or body or query. If a
  162. ``body``, notification has no title, the body will be used as title. Terminal
  163. ``close``, emulators should ignore payloads of unknown type to allow for future
  164. ``?`` expansion of this protocol.
  165. ``o`` One of ``always``, ``always`` When to honor the notification request. ``unfocused`` means when the window
  166. ``unfocused`` or the notification is sent on does not have keyboard focus. ``invisible``
  167. ``invisible`` means the window both is unfocused
  168. and not visible to the user, for example, because it is in an inactive tab or
  169. its OS window is not currently active.
  170. ``always`` is the default and always honors the request.
  171. ``u`` ``0, 1 or 2`` ``unset`` The *urgency* of the notification. ``0`` is low, ``1`` is normal and ``2`` is critical.
  172. If not specified normal is used.
  173. ``c`` ``0`` or ``1`` ``0`` When non-zero an escape code is sent to the application when the notification is closed.
  174. ======= ==================== ========== =================
  175. .. versionadded:: 0.35.0
  176. Support for the ``u`` key to specify urgency
  177. .. versionadded:: 0.31.0
  178. Support for the ``o`` key to prevent notifications from focused windows
  179. .. note::
  180. |kitty| also supports the `legacy OSC 9 protocol developed by iTerm2
  181. <https://iterm2.com/documentation-escape-codes.html>`__ for desktop
  182. notifications.