[Spice-devel] [PATCH] vdagent: when SetClipboardData fails, set clipboard control event to stop wait
Uri Lublin
uril at redhat.com
Sun Dec 9 01:02:26 PST 2012
On 11/27/2012 11:16 AM, Arnon Gilboa wrote:
> Currently, a SetClipboardData failure is followed by useless wait for timeout
> (VD_CLIPBOARD_TIMEOUT_MS)
> ---
> vdagent/vdagent.cpp | 30 ++++++++++++++++--------------
> 1 files changed, 16 insertions(+), 14 deletions(-)
>
> diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp
> index 3f1053d..2bb466d 100644
> --- a/vdagent/vdagent.cpp
> +++ b/vdagent/vdagent.cpp
> @@ -643,12 +643,10 @@ bool VDAgent::handle_clipboard(VDAgentClipboard* clipboard, uint32_t size)
>
> if (_clipboard_owner != owner_client) {
> vd_printf("Received clipboard data from client while clipboard is not owned by client");
> - set_control_event(CONTROL_CLIPBOARD);
> - return false;
> + goto fin;
> }
> if (clipboard->type == VD_AGENT_CLIPBOARD_NONE) {
> - set_control_event(CONTROL_CLIPBOARD);
> - return false;
> + goto fin;
> }
> switch (clipboard->type) {
> case VD_AGENT_CLIPBOARD_UTF8_TEXT:
> @@ -664,20 +662,24 @@ bool VDAgent::handle_clipboard(VDAgentClipboard* clipboard, uint32_t size)
> }
> default:
> vd_printf("Unsupported clipboard type %u", clipboard->type);
> - return true;
> + goto fin;
> }
> format = get_clipboard_format(clipboard->type);
> - if (SetClipboardData(format, clip_data)) {
> - set_control_event(CONTROL_CLIPBOARD);
> - return true;
> - }
> - // We retry clipboard open-empty-set-close only when there is a timeout in on_clipboard_request()
> - if (!OpenClipboard(_hwnd)) {
> - return false;
> + if (format == 0) {
> + vd_printf("Unknown clipboard format, type %u", clipboard->type);
> + goto fin;
> }
> - EmptyClipboard();
> ret = !!SetClipboardData(format, clip_data);
> - CloseClipboard();
> + if (!ret) {
> + DWORD err = GetLastError();
> + if (err == ERROR_NOT_ENOUGH_MEMORY) {
> + vd_printf("Not enough memory to set clipboard data, size %u bytes", size);
> + } else {
> + vd_printf("SetClipboardData failed: %u", err);
> + }
> + }
> +fin:
> + set_control_event(CONTROL_CLIPBOARD);
> return ret;
> }
>
Ack.
Two comments:
- Only the 'default' case changed (set event + return false), other
cases are
logically the same (but it's a nice cleanup for them too).
- retry clipboard open-empty-set-close was removed.
would be nice to add it to the log message (or as a separate patch).
More information about the Spice-devel
mailing list