[Spice-devel] [PATCH spice 12/17] spicec-x11: Force processing of ownerchange event when releasing the cb
Arnon Gilboa
agilboa at redhat.com
Mon Oct 4 08:54:45 PDT 2010
Hans de Goede wrote:
> Make sure we process the XFixesSetSelectionOwnerNotify event caused by
> us setting the clipboard owner to none, directly after setting the owner
> to none. Otherwise we may end up changing the clipboard owner to none, after
> it has already been re-owned because the XFixesSetSelectionOwnerNotify event
> to owner none is event is still pending when we set the new owner, and
> then changes the owner back to none once processed messing up our clipboard
> ownership state tracking.
>
> I saw this happening when doing copy twice in succession inside the guest.
> ---
> client/red_client.cpp | 3 +--
> client/windows/platform.cpp | 1 +
> client/x11/platform.cpp | 13 +++++++++++++
> 3 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/client/red_client.cpp b/client/red_client.cpp
> index a022499..8e7dfe0 100644
> --- a/client/red_client.cpp
> +++ b/client/red_client.cpp
> @@ -1133,12 +1133,11 @@ void RedClient::dispatch_agent_message(VDAgentMessage* msg, void* data)
> break;
> case VD_AGENT_CLIPBOARD_RELEASE:
> if (Platform::get_clipboard_owner() != Platform::owner_guest) {
> - LOG_WARN("received clipboard release from guest while clipboard is not owned by guest");
> + LOG_INFO("received clipboard release from guest while clipboard is not owned by guest");
> break;
> }
>
> Platform::on_clipboard_release();
> - Platform::set_clipboard_owner(Platform::owner_none);
> break;
> default:
> DBG(0, "Unsupported message type %u size %u", msg->type, msg->size);
> diff --git a/client/windows/platform.cpp b/client/windows/platform.cpp
> index db47079..580a40a 100644
> --- a/client/windows/platform.cpp
> +++ b/client/windows/platform.cpp
> @@ -1011,6 +1011,7 @@ bool Platform::on_clipboard_request(uint32_t type)
> void Platform::on_clipboard_release()
> {
> SetEvent(clipboard_event);
> + set_clipboard_owner(owner_none);
> }
>
> static bool has_console = false;
> diff --git a/client/x11/platform.cpp b/client/x11/platform.cpp
> index ea2558d..75b34c6 100644
> --- a/client/x11/platform.cpp
> +++ b/client/x11/platform.cpp
> @@ -3342,5 +3342,18 @@ bool Platform::on_clipboard_request(uint32_t type)
>
> void Platform::on_clipboard_release()
> {
> + XEvent event;
> +
> XSetSelectionOwner(x_display, clipboard_prop, None, CurrentTime);
> + /* Make sure we process the XFixesSetSelectionOwnerNotify event caused
> + by this, so we don't end up changing the clipboard owner to none, after
> + it has already been re-owned because this event is still pending. */
> + XSync(x_display, False);
> + while (XCheckTypedEvent(x_display,
> + XFixesSelectionNotify + xfixes_event_base,
> + &event))
> + root_win_proc(event);
> +
> + /* Note no need to do a set_clipboard_owner(owner_none) here, as that is
> + already done by processing the XFixesSetSelectionOwnerNotify event. */
> }
>
Ack
More information about the Spice-devel
mailing list