summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client/red_client.cpp3
-rw-r--r--client/windows/platform.cpp1
-rw-r--r--client/x11/platform.cpp13
3 files changed, 15 insertions, 2 deletions
diff --git a/client/red_client.cpp b/client/red_client.cpp
index a022499f..8e7dfe0e 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 db47079d..580a40ae 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 ea2558d7..75b34c61 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. */
}