Oops, no, that's wrong. When we lose the selection, we must stop
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 12 Feb 2011 16:47:23 +0000 (16:47 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 12 Feb 2011 16:47:23 +0000 (16:47 +0000)
responding to SelectionRequest events, and _only_ continue with
incremental transfers already in progress.

git-svn-id: svn://svn.tartarus.org/sgt/utils@9090 cda61777-01e9-0310-a592-d414129be87e

xcopy/xcopy.c

index da1f6ac..bb72814 100644 (file)
@@ -610,25 +610,27 @@ void run_X(void) {
                 return;
             }
         } else {
-            int exiting = False;
+            int have_ownership = True;
 
             switch (ev.type) {
               case SelectionClear:
                 /* Selection has been cleared by another app. */
-                exiting = True;
+                have_ownership = False;
                 break;
               case SelectionRequest:
-                e2.xselection.type = SelectionNotify;
-                e2.xselection.requestor = ev.xselectionrequest.requestor;
-                e2.xselection.selection = ev.xselectionrequest.selection;
-                e2.xselection.target = ev.xselectionrequest.target;
-                e2.xselection.time = ev.xselectionrequest.time;
-                e2.xselection.property =
-                   convert_sel_outer(ev.xselectionrequest.requestor,
-                                     ev.xselectionrequest.target,
-                                     ev.xselectionrequest.property);
-                XSendEvent (disp, ev.xselectionrequest.requestor,
-                           False, 0, &e2);
+                if (have_ownership) {
+                    e2.xselection.type = SelectionNotify;
+                    e2.xselection.requestor = ev.xselectionrequest.requestor;
+                    e2.xselection.selection = ev.xselectionrequest.selection;
+                    e2.xselection.target = ev.xselectionrequest.target;
+                    e2.xselection.time = ev.xselectionrequest.time;
+                    e2.xselection.property =
+                        convert_sel_outer(ev.xselectionrequest.requestor,
+                                          ev.xselectionrequest.target,
+                                          ev.xselectionrequest.property);
+                    XSendEvent (disp, ev.xselectionrequest.requestor,
+                                False, 0, &e2);
+                }
                 break;
               case PropertyNotify:
                 for (i = j = 0; i < nincrs; i++) {
@@ -667,7 +669,7 @@ void run_X(void) {
                 nincrs = j;
                 break;
             }
-            if (nincrs == 0 && exiting)
+            if (nincrs == 0 && !have_ownership)
                 return;
         }
     }