Subject: Bug#585: Fix

From: Ulrich Sibiller <[email-masked]>
Date: Tue, 4 Nov 2014 23:51:35 +0100

Without XFIXES the client calls GetSelectionOwner() before every paste
operation and therefor always knows the current selection owner.

With XFIXES some clients rely solely on the
XFixesSelectSelectionInput/XFixesSelectionNotify mechanism. But they
never receive any notifications because the nxagent does not register
at the real X server to receive those notifications itself and so
never gets anything to forward to the clients. A client assuming it
will get informed about owner changes skips the GetSelectionOwner()
call. So it never knows that the selection owner has changed and
refers to what it thinks the current owner is (itself).

Attached is a fix for this bug. nxagent calls
XFixesSelectSelectionInput for all its selections (t.i. CLIPBOARD and
PRIMARY, _not_ SECONDARY) now. It (still) does not check the return
code but the original code registering only CLIPBOARD did neither...

This is a complete patch generated by git format-patch after using
(d)quilt as documented in the wiki.

As I did not find any hints of what patch number to choose I took 207
to put it as close as possible to other clipboard related patches.
Feel free to change that...

Uli
From fa294cc020d285df6286195fd435c5c386257711 Mon Sep 17 00:00:00 2001
From: Ulrich Sibiller <[email-masked]>
Date: Tue, 4 Nov 2014 22:24:19 +0100
Subject: [PATCH] Add 207_nxagent_fix-xfixes-selection.full.patch. Fix
 selection handling when XFIXES is enabled. (Fixes: #585).

---
 debian/changelog                                   |  4 +++
 .../207_nxagent_fix-xfixes-selection.full.patch    | 32 ++++++++++++++++++++++
 debian/patches/series                              |  1 +
 3 files changed, 37 insertions(+)
 create mode 100644 debian/patches/207_nxagent_fix-xfixes-selection.full.patch

diff --git a/debian/changelog b/debian/changelog
index 766db52..0356bf8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -37,6 +37,10 @@ nx-libs (2:3.5.0.28-0x2go1) UNRELEASED; urgency=medium
   * Add 400_nxcomp-version.full+lite.patch. Allow 4-digit version comparison
     during NX session handshake. (Fixes: #610).
 
+  [ Ulrich Sibiller ]
+  * Add 207_nxagent_fix-xfixes-selection.full.patch. Fix selection handling
+    when XFIXES is enabled. (Fixes: #585)
+
  -- Mike Gabriel <[email-masked]>  Mon, 30 Jun 2014 15:05:54 +0200
 
 nx-libs (2:3.5.0.27-0x2go1) unstable; urgency=medium
diff --git a/debian/patches/207_nxagent_fix-xfixes-selection.full.patch b/debian/patches/207_nxagent_fix-xfixes-selection.full.patch
new file mode 100644
index 0000000..0ee74e5
--- /dev/null
+++ b/debian/patches/207_nxagent_fix-xfixes-selection.full.patch
@@ -0,0 +1,32 @@
+Description: Fix XFIXES selection handling (copy and paste via middle
+ mouse button). When nxagent has the XFIXES extension enabled copy and
+ paste from outside applications to applications within the session
+ that rely on XFixesSelectSelectionInput (e.g. qt applications like
+ konsole) did never receive any notifications because the nxagent did
+ not register itself at the real X server to receive them. Fixes Bug
+ #585.
+Author: Ulrich Sibiller <[email-masked]>
+
+Index: nx-libs/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c
+===================================================================
+--- nx-libs.orig/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c	2014-11-04 22:42:50.893569624 +0100
++++ nx-libs/nx-X11/programs/Xserver/hw/nxagent/Clipboard.c	2014-11-04 22:42:50.893569624 +0100
+@@ -1556,10 +1556,14 @@
+     fprintf(stderr, "nxagentInitClipboard: Registering for XFixesSelectionNotify events.\n");
+     #endif
+
+-    XFixesSelectSelectionInput(nxagentDisplay, iWindow, nxagentClipboardAtom,
+-                               XFixesSetSelectionOwnerNotifyMask |
+-                               XFixesSelectionWindowDestroyNotifyMask |
+-                               XFixesSelectionClientCloseNotifyMask);
++    for (i = 0; i < nxagentMaxSelections; i++)
++    {
++      XFixesSelectSelectionInput(nxagentDisplay, iWindow,
++                                 lastSelectionOwner[i].selection,
++                                 XFixesSetSelectionOwnerNotifyMask |
++                                 XFixesSelectionWindowDestroyNotifyMask |
++                                 XFixesSelectionClientCloseNotifyMask);
++    }
+
+     nxagentXFixesInfo.Initialized = 1;
+   }
diff --git a/debian/patches/series b/debian/patches/series
index 3a37ac5..4e792a2 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -50,6 +50,7 @@
 204_nxagent_repaint-solidpict.full.patch
 205_nxagent_refresh-adsl.full.patch
 206_nxagent_clipboard-as-nxoption.full.patch
+207_nxagent_fix-xfixes-selection.full.patch
 209_x2goagent_add-man-page.full.patch
 210_nxagent_save_session_state.full.patch
 210_nxcomp_save_session_state.full+lite.patch
-- 
1.9.1