]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix queuing already-present selection requests
authorPo Lu <luangruo@yahoo.com>
Sat, 11 Jun 2022 06:11:28 +0000 (14:11 +0800)
committerPo Lu <luangruo@yahoo.com>
Sat, 11 Jun 2022 06:15:44 +0000 (14:15 +0800)
* src/xterm.c (x_defer_selection_requests): Move kbd_fetch_ptr
if possible and fix counter increment order.

src/xterm.c

index 74716dfe4080ad470e0f18b47f3ae1142fb33096..55cd5286fe16108e7d68c7f9ce415ec1cbd3d80f 100644 (file)
@@ -795,9 +795,9 @@ static int x_use_pending_selection_requests;
 
 static void x_push_selection_request (struct selection_input_event *);
 
-/* Defer selection requests.  Any selection requests generated after
-   this can then be processed by calling
-   `x_handle_pending_selection_requests'.
+/* Defer selection requests.  Between this and
+   x_release_selection_requests, any selection requests can be
+   processed by calling `x_handle_pending_selection_requests'.
 
    Also run through and queue all the selection events already in the
    keyboard buffer.  */
@@ -805,10 +805,11 @@ void
 x_defer_selection_requests (void)
 {
   union buffered_input_event *event;
+  bool between;
 
-  block_input ();
-  x_use_pending_selection_requests++;
+  between = false;
 
+  block_input ();
   if (!x_use_pending_selection_requests)
     {
       event = kbd_fetch_ptr;
@@ -822,13 +823,24 @@ x_defer_selection_requests (void)
 
              /* Mark this selection event as invalid.   */
              SELECTION_EVENT_DPYINFO (&event->sie) = NULL;
+
+             /* Move the kbd_fetch_ptr along if doing so would not
+                result in any other events being skipped.  This
+                avoids exhausting the keyboard buffer with some
+                over-enthusiastic clipboard managers.  */
+             if (!between)
+               kbd_fetch_ptr = (event == kbd_buffer + KBD_BUFFER_SIZE - 1
+                                ? kbd_buffer : event + 1);
            }
+         else
+           between = true;
 
          event = (event == kbd_buffer + KBD_BUFFER_SIZE - 1
                   ? kbd_buffer : event + 1);
        }
     }
 
+  x_use_pending_selection_requests++;
   unblock_input ();
 }