qemu/include/ui/clipboard.h
<<
>>
Prefs
   1#ifndef QEMU_CLIPBOARD_H
   2#define QEMU_CLIPBOARD_H
   3
   4#include "qemu/notify.h"
   5
   6/**
   7 * DOC: Introduction
   8 *
   9 * The header ``ui/clipboard.h`` declares the qemu clipboard interface.
  10 *
  11 * All qemu elements which want use the clipboard can register as
  12 * clipboard peer.  Subsequently they can set the clipboard content
  13 * and get notifications for clipboard updates.
  14 *
  15 * Typical users are user interfaces (gtk), remote access protocols
  16 * (vnc) and devices talking to the guest (vdagent).
  17 *
  18 * Even though the design allows different data types only plain text
  19 * is supported for now.
  20 */
  21
  22typedef enum QemuClipboardType QemuClipboardType;
  23typedef enum QemuClipboardSelection QemuClipboardSelection;
  24typedef struct QemuClipboardPeer QemuClipboardPeer;
  25typedef struct QemuClipboardInfo QemuClipboardInfo;
  26
  27/**
  28 * enum QemuClipboardType
  29 *
  30 * @QEMU_CLIPBOARD_TYPE_TEXT: text/plain; charset=utf-8
  31 * @QEMU_CLIPBOARD_TYPE__COUNT: type count.
  32 */
  33enum QemuClipboardType {
  34    QEMU_CLIPBOARD_TYPE_TEXT,
  35    QEMU_CLIPBOARD_TYPE__COUNT,
  36};
  37
  38/* same as VD_AGENT_CLIPBOARD_SELECTION_* */
  39/**
  40 * enum QemuClipboardSelection
  41 *
  42 * @QEMU_CLIPBOARD_SELECTION_CLIPBOARD: clipboard (explitcit cut+paste).
  43 * @QEMU_CLIPBOARD_SELECTION_PRIMARY: primary selection (select + middle mouse button).
  44 * @QEMU_CLIPBOARD_SELECTION_SECONDARY: secondary selection (dunno).
  45 * @QEMU_CLIPBOARD_SELECTION__COUNT: selection count.
  46 */
  47enum QemuClipboardSelection {
  48    QEMU_CLIPBOARD_SELECTION_CLIPBOARD,
  49    QEMU_CLIPBOARD_SELECTION_PRIMARY,
  50    QEMU_CLIPBOARD_SELECTION_SECONDARY,
  51    QEMU_CLIPBOARD_SELECTION__COUNT,
  52};
  53
  54/**
  55 * struct QemuClipboardPeer
  56 *
  57 * @name: peer name.
  58 * @update: notifier for clipboard updates.
  59 * @request: callback for clipboard data requests.
  60 *
  61 * Clipboard peer description.
  62 */
  63struct QemuClipboardPeer {
  64    const char *name;
  65    Notifier update;
  66    void (*request)(QemuClipboardInfo *info,
  67                    QemuClipboardType type);
  68};
  69
  70/**
  71 * struct QemuClipboardInfo
  72 *
  73 * @refcount: reference counter.
  74 * @owner: clipboard owner.
  75 * @selection: clipboard selection.
  76 * @types: clipboard data array (one entry per type).
  77 *
  78 * Clipboard content data and metadata.
  79 */
  80struct QemuClipboardInfo {
  81    uint32_t refcount;
  82    QemuClipboardPeer *owner;
  83    QemuClipboardSelection selection;
  84    struct {
  85        bool available;
  86        bool requested;
  87        size_t size;
  88        void *data;
  89    } types[QEMU_CLIPBOARD_TYPE__COUNT];
  90};
  91
  92/**
  93 * qemu_clipboard_peer_register
  94 *
  95 * @peer: peer information.
  96 *
  97 * Register clipboard peer.  Registering is needed for both active
  98 * (set+grab clipboard) and passive (watch clipboard for updates)
  99 * interaction with the qemu clipboard.
 100 */
 101void qemu_clipboard_peer_register(QemuClipboardPeer *peer);
 102
 103/**
 104 * qemu_clipboard_peer_unregister
 105 *
 106 * @peer: peer information.
 107 *
 108 * Unregister clipboard peer.
 109 */
 110void qemu_clipboard_peer_unregister(QemuClipboardPeer *peer);
 111
 112/**
 113 * qemu_clipboard_peer_owns
 114 *
 115 * @peer: peer information.
 116 * @selection: clipboard selection.
 117 *
 118 * Return TRUE if the peer owns the clipboard.
 119 */
 120bool qemu_clipboard_peer_owns(QemuClipboardPeer *peer,
 121                              QemuClipboardSelection selection);
 122
 123/**
 124 * qemu_clipboard_peer_release
 125 *
 126 * @peer: peer information.
 127 * @selection: clipboard selection.
 128 *
 129 * If the peer owns the clipboard, release it.
 130 */
 131void qemu_clipboard_peer_release(QemuClipboardPeer *peer,
 132                                 QemuClipboardSelection selection);
 133
 134/**
 135 * qemu_clipboard_info
 136 *
 137 * @selection: clipboard selection.
 138 *
 139 * Return the current clipboard data & owner informations.
 140 */
 141QemuClipboardInfo *qemu_clipboard_info(QemuClipboardSelection selection);
 142
 143/**
 144 * qemu_clipboard_info_new
 145 *
 146 * @owner: clipboard owner.
 147 * @selection: clipboard selection.
 148 *
 149 * Allocate a new QemuClipboardInfo and initialize it with the given
 150 * @owner and @selection.
 151 *
 152 * QemuClipboardInfo is a reference-counted struct.  The new struct is
 153 * returned with a reference already taken (i.e. reference count is
 154 * one).
 155 */
 156QemuClipboardInfo *qemu_clipboard_info_new(QemuClipboardPeer *owner,
 157                                           QemuClipboardSelection selection);
 158/**
 159 * qemu_clipboard_info_ref
 160 *
 161 * @info: clipboard info.
 162 *
 163 * Increase @info reference count.
 164 */
 165QemuClipboardInfo *qemu_clipboard_info_ref(QemuClipboardInfo *info);
 166
 167/**
 168 * qemu_clipboard_info_unref
 169 *
 170 * @info: clipboard info.
 171 *
 172 * Decrease @info reference count.  When the count goes down to zero
 173 * free the @info struct itself and all clipboard data.
 174 */
 175void qemu_clipboard_info_unref(QemuClipboardInfo *info);
 176
 177/**
 178 * qemu_clipboard_update
 179 *
 180 * @info: clipboard info.
 181 *
 182 * Update the qemu clipboard.  Notify all registered peers (including
 183 * the clipboard owner) that the qemu clipboard has been updated.
 184 *
 185 * This is used for both new completely clipboard content and for
 186 * clipboard data updates in response to qemu_clipboard_request()
 187 * calls.
 188 */
 189void qemu_clipboard_update(QemuClipboardInfo *info);
 190
 191/**
 192 * qemu_clipboard_request
 193 *
 194 * @info: clipboard info.
 195 * @type: clipboard data type.
 196 *
 197 * Request clipboard content.  Typically the clipboard owner only
 198 * advertises the available data types and provides the actual data
 199 * only on request.
 200 */
 201void qemu_clipboard_request(QemuClipboardInfo *info,
 202                            QemuClipboardType type);
 203
 204/**
 205 * qemu_clipboard_set_data
 206 *
 207 * @peer: clipboard peer.
 208 * @info: clipboard info.
 209 * @type: clipboard data type.
 210 * @size: data size.
 211 * @data: data blob.
 212 * @update: notify peers about the update.
 213 *
 214 * Set clipboard content for the given @type.  This function will make
 215 * a copy of the content data and store that.
 216 */
 217void qemu_clipboard_set_data(QemuClipboardPeer *peer,
 218                             QemuClipboardInfo *info,
 219                             QemuClipboardType type,
 220                             uint32_t size,
 221                             const void *data,
 222                             bool update);
 223
 224G_DEFINE_AUTOPTR_CLEANUP_FUNC(QemuClipboardInfo, qemu_clipboard_info_unref)
 225
 226#endif /* QEMU_CLIPBOARD_H */
 227