Document the new OSC 5522 protocol
This commit is contained in:
parent
f35ee1bb40
commit
a3ba8647ba
160
docs/clipboard.rst
Normal file
160
docs/clipboard.rst
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
Copying all data types to the clipboard
|
||||||
|
==============================================
|
||||||
|
|
||||||
|
There already exists an escape code to allow terminal programs to
|
||||||
|
read/write plain text data from the system clipboard, *OSC 52*.
|
||||||
|
kitty introduces a more advanced protocol that supports:
|
||||||
|
|
||||||
|
* Copy arbitrary data including images, rich text documents, etc.
|
||||||
|
* Allow terminals to ask the user for permission to access the clipboard and
|
||||||
|
report permission denied
|
||||||
|
|
||||||
|
The escape code is *OSC 5522*, an extension of *OSC 52*. The basic format
|
||||||
|
of the escape code is::
|
||||||
|
|
||||||
|
<OSC>5522;metadata;payload<ST>
|
||||||
|
|
||||||
|
Here, *metadata* is a colon separated list of key-value pairs and payload is
|
||||||
|
base64 encoded data. :code:`OSC` is :code:`<ESC>[`.
|
||||||
|
:code:`ST` is the string terminator, :code:`<ESC>\\`.
|
||||||
|
|
||||||
|
Reading data from the system clipboard
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
To read data from the system clipboard, the escape code is::
|
||||||
|
|
||||||
|
<OSC>5522;type=read;<base 64 encoded space separated list of mime types to read><ST>
|
||||||
|
|
||||||
|
For example, to read plain text and PNG data, the payload would be::
|
||||||
|
|
||||||
|
text/plain image/png
|
||||||
|
|
||||||
|
encoded as base64. To read from the primary selection instead of the
|
||||||
|
clipboard, add the key ``loc=primary`` to the metadata section.
|
||||||
|
|
||||||
|
To get the list of MIME types available on the clipboard the payload must be
|
||||||
|
just a period (``.``), encoded as base64.
|
||||||
|
|
||||||
|
The terminal emulator will reply with a sequence of escape codes of the form::
|
||||||
|
|
||||||
|
<OSC>5522;type=read:status=OK<ST>
|
||||||
|
<OSC>5522;type=read:status=DATA:mime=<base 64 encoded mime type>;<base64 encoded data><ST>
|
||||||
|
<OSC>5522;type=read:status=DATA:mime=<base 64 encoded mime type>;<base64 encoded data><ST>
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
<OSC>5522;type=read:status=DONE<ST>
|
||||||
|
|
||||||
|
Here, the ``status=DATA`` packets deliver the data (as base64 encoded bytes)
|
||||||
|
associated with each MIME type. The terminal emulator should chunk up the data
|
||||||
|
for an individual type. A recommended size for each chunk is 4096 bytes. All
|
||||||
|
the chunks for a given type must be transmitted sequentially and only once they
|
||||||
|
are done the chunks for the next type, if any, should be sent. The end of data
|
||||||
|
is indicated by a ``status=DONE`` packet.
|
||||||
|
|
||||||
|
If an error occurs, instead of the opening ``status=OK`` packet the terminal
|
||||||
|
must send a ``status=ERRORCODE`` packet. The error code must be one of:
|
||||||
|
|
||||||
|
``status=ENOSYS``
|
||||||
|
Sent if the requested clipboard type is not available. For example, primary
|
||||||
|
selection is not available on all systems and ``loc=primary`` was used.
|
||||||
|
|
||||||
|
``status=EPERM``
|
||||||
|
Sent if permission to read from the clipboard was denied by the system or
|
||||||
|
the user.
|
||||||
|
|
||||||
|
``status=EBUSY``
|
||||||
|
Sent if there is some temporary problem, such as multiple clients in a
|
||||||
|
multiplexer trying to access the clipboard simultaneously.
|
||||||
|
|
||||||
|
Terminals should ask the user for permission before allowing a read request.
|
||||||
|
However, if a read request only wishes to list the available data types on the
|
||||||
|
clipboard, it should be allowed without a permission prompt. This is so that
|
||||||
|
the user is not presented with a double permission prompt for reading the
|
||||||
|
available MIME types and then reading the actual data.
|
||||||
|
|
||||||
|
|
||||||
|
Writing data to the system clipboard
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
To write data to the system clipboard, the terminal programs sends the
|
||||||
|
following sequence of packets::
|
||||||
|
|
||||||
|
<OSC>5522;type=write<ST>
|
||||||
|
<OSC>5522;type=wdata:mime=<base64 encoded mime type>;<base 64 encoded chunk of data for this type><ST>
|
||||||
|
<OSC>5522;type=wdata:mime=<base64 encoded mime type>;<base 64 encoded chunk of data for this type><ST>
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
<OSC>5522;type=wdata<ST>
|
||||||
|
|
||||||
|
The final packet with no mime and no data indicates end of transmission. The
|
||||||
|
data for every MIME type should be split into chunks of no more than 4096
|
||||||
|
bytes. All the chunks for a given MIME type must be sent sequentially, before
|
||||||
|
sending chunks for the next MIME type. After the transmission is complete, the
|
||||||
|
terminal replies with a single packet indicating success::
|
||||||
|
|
||||||
|
<OSC>5522;type=write:status=DONE<ST>
|
||||||
|
|
||||||
|
If an error occurs the terminal can, at any time, send an error packet of the
|
||||||
|
form::
|
||||||
|
|
||||||
|
<OSC>5522;type=write:status=ERRORCODE<ST>
|
||||||
|
|
||||||
|
Here ``ERRORCODE`` must be one of:
|
||||||
|
|
||||||
|
``status=EIO``
|
||||||
|
An I/O error occurred while processing the data
|
||||||
|
``status=EINVAL``
|
||||||
|
One of the packets was invalid, usually because of invalid base64 encoding.
|
||||||
|
``status=ENOSYS``
|
||||||
|
The client asked to write to the primary selection with (``loc=primary``) and that is not
|
||||||
|
available on the system
|
||||||
|
``status=EPERM``
|
||||||
|
Sent if permission to write to the clipboard was denied by the system or
|
||||||
|
the user.
|
||||||
|
``status=EBUSY``
|
||||||
|
Sent if there is some temporary problem, such as multiple clients in a
|
||||||
|
multiplexer trying to access the clipboard simultaneously.
|
||||||
|
|
||||||
|
Once an error occurs, the terminal must ignore all further OSC 5522 write related packets until it
|
||||||
|
sees the start of a new write with a ``type=write`` packet.
|
||||||
|
|
||||||
|
The client can send to the primary selection instead of the clipboard by adding
|
||||||
|
``loc=primary`` to the initial ``type=write`` packet.
|
||||||
|
|
||||||
|
Finally, clients have the ability to *alias* MIME types when sending data to
|
||||||
|
the clipboard. To do that, the client must send a ``type=walias`` packet of the
|
||||||
|
form::
|
||||||
|
|
||||||
|
<OSC>5522;type=walias;mime=<base64 encoded target MIME type>;<base64 encoded, space separated list of aliases><ST>
|
||||||
|
|
||||||
|
The effect of an alias is that the system clipboard will make available all the
|
||||||
|
aliased MIME types, with the same data as was transmitted for the target MIME
|
||||||
|
type. This saves bandwidth, allowing the client to only transmit one copy of
|
||||||
|
the data, but create multiple references to it in the system clipboard. Alias
|
||||||
|
packets can be sent anytime after the initial write packet and before the end
|
||||||
|
of data packet.
|
||||||
|
|
||||||
|
|
||||||
|
Support for terminal multiplexers
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
Since this protocol involves two way communication between the terminal
|
||||||
|
emulator and the client program, multiplexers need a way to know which window
|
||||||
|
to send responses from the terminal to. In order to make this possible, the
|
||||||
|
metadata portion of this escape code includes an optional ``id`` field. If
|
||||||
|
present the terminal emulator must send it back unchanged with every response.
|
||||||
|
Valid ids must include only characters from the set: ``[a-zA-Z0-9-_+.]``. Any
|
||||||
|
other characters must be stripped out from the id by the terminal emulator
|
||||||
|
before retransmitting it.
|
||||||
|
|
||||||
|
Note that when using a terminal multiplexer it is possible for two different
|
||||||
|
programs to tread on each others clipboard requests. This is fundamentally
|
||||||
|
unavoidable since the system clipboard is a single global shared resource.
|
||||||
|
However, there is an additional complication where responses form this protocol
|
||||||
|
could get lost if, for instance, multiple write requests are received
|
||||||
|
simultaneously. It is up to well designed multiplexers to ensure that only a
|
||||||
|
single request is in flight at a time. The multiplexer can abort requests by
|
||||||
|
sending back the ``EBUSY`` error code indicating some other window is trying
|
||||||
|
to access the clipboard.
|
||||||
@ -43,9 +43,15 @@ data types. Best illustrated with some examples::
|
|||||||
# Copy an image to a file and text to STDOUT:
|
# Copy an image to a file and text to STDOUT:
|
||||||
kitty +kitten clipboard -g picture.png /dev/stdout
|
kitty +kitten clipboard -g picture.png /dev/stdout
|
||||||
|
|
||||||
|
# List the formats available on the system clipboard
|
||||||
|
kitty +kitten clipboard -g -m . /dev/stdout
|
||||||
|
|
||||||
Normally, the kitten guesses MIME types based on the file names. To control the
|
Normally, the kitten guesses MIME types based on the file names. To control the
|
||||||
MIME types precisely, use the :option:`--mime <kitty +kitten clipboard --mime>` option.
|
MIME types precisely, use the :option:`--mime <kitty +kitten clipboard --mime>` option.
|
||||||
|
|
||||||
|
This kitten uses a new protocol developed by kitty to function, for details,
|
||||||
|
see :doc:`/clipboard`.
|
||||||
|
|
||||||
.. program:: kitty +kitten clipboard
|
.. program:: kitty +kitten clipboard
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -32,3 +32,4 @@ please do so by opening issues in the `GitHub bug tracker
|
|||||||
unscroll
|
unscroll
|
||||||
color-stack
|
color-stack
|
||||||
deccara
|
deccara
|
||||||
|
clipboard
|
||||||
|
|||||||
@ -24,7 +24,8 @@ likely to be incorrect or the filename has no extension and therefore no mimetyp
|
|||||||
can be detected. If more than one file is specified, this option should be specified multiple
|
can be detected. If more than one file is specified, this option should be specified multiple
|
||||||
times, once for each specified file. When copying data from the clipboard, you can use wildcards
|
times, once for each specified file. When copying data from the clipboard, you can use wildcards
|
||||||
to match MIME types. For example: :code:`--mime 'text/*'` will match any textual MIME type
|
to match MIME types. For example: :code:`--mime 'text/*'` will match any textual MIME type
|
||||||
available on the clipboard, usually the first matching MIME type is copied.
|
available on the clipboard, usually the first matching MIME type is copied. The special MIME
|
||||||
|
type :code:`.` will return the list of available MIME types currently on the system clipboard.
|
||||||
|
|
||||||
|
|
||||||
--alias -a
|
--alias -a
|
||||||
@ -70,6 +71,9 @@ the clipboard. Some examples:
|
|||||||
|
|
||||||
# Copy an image to a file and text to STDOUT:
|
# Copy an image to a file and text to STDOUT:
|
||||||
kitty +kitten clipboard -g picture.png /dev/stdout
|
kitty +kitten clipboard -g picture.png /dev/stdout
|
||||||
|
|
||||||
|
# List the formats available on the system clipboard
|
||||||
|
kitty +kitten clipboard -g -m . /dev/stdout
|
||||||
'''
|
'''
|
||||||
|
|
||||||
usage = '[files to copy to/from]'
|
usage = '[files to copy to/from]'
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user