[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master bab449f034: Improve drag-and-drop emulation time handling
From: |
Po Lu |
Subject: |
master bab449f034: Improve drag-and-drop emulation time handling |
Date: |
Sat, 9 Jul 2022 04:18:53 -0400 (EDT) |
branch: master
commit bab449f034f44657ff3ed1bf533be6a27f4dafd6
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Improve drag-and-drop emulation time handling
* src/xselect.c (x_handle_selection_request): Use
display-specific pending DND time.
(x_set_pending_dnd_time): Delete function.
* src/xterm.c (x_dnd_do_unsupported_drop, handle_one_xevent):
Set dpyinfo->pending_dnd_time instead.
* src/xterm.h (struct x_display_info): New field
`pending_dnd_time'. Make handling pending drops
display-specific to avoid interference when there are multiple
displays.
---
src/xselect.c | 17 ++++++-----------
src/xterm.c | 59 ++++++++++++++++++++++-------------------------------------
src/xterm.h | 5 ++++-
3 files changed, 32 insertions(+), 49 deletions(-)
diff --git a/src/xselect.c b/src/xselect.c
index d1b6d454ab..80db0d1fe2 100644
--- a/src/xselect.c
+++ b/src/xselect.c
@@ -40,8 +40,6 @@ along with GNU Emacs. If not, see
<https://www.gnu.org/licenses/>. */
#include <X11/Xproto.h>
-static Time pending_dnd_time;
-
struct prop_location;
struct selection_data;
@@ -265,7 +263,7 @@ x_atom_to_symbol (struct x_display_info *dpyinfo, Atom atom)
TIMESTAMP should be the timestamp where selection ownership will be
assumed.
DND_DATA is the local value that will be used for selection requests
- with `pending_dnd_time'.
+ with `dpyinfo->pending_dnd_time'.
Update the Vselection_alist so that we can reply to later requests for
our selection. */
@@ -855,8 +853,11 @@ x_handle_selection_request (struct selection_input_event
*event)
/* This is how the XDND protocol recommends dropping text onto a
target that doesn't support XDND. */
- if (SELECTION_EVENT_TIME (event) == pending_dnd_time + 1
- || SELECTION_EVENT_TIME (event) == pending_dnd_time + 2)
+ if (dpyinfo->pending_dnd_time
+ && ((SELECTION_EVENT_TIME (event)
+ == dpyinfo->pending_dnd_time + 1)
+ || (SELECTION_EVENT_TIME (event)
+ == dpyinfo->pending_dnd_time + 2)))
use_alternate = true;
block_input ();
@@ -2884,12 +2885,6 @@ x_timestamp_for_selection (struct x_display_info
*dpyinfo,
return value;
}
-void
-x_set_pending_dnd_time (Time time)
-{
- pending_dnd_time = time;
-}
-
static void syms_of_xselect_for_pdumper (void);
void
diff --git a/src/xterm.c b/src/xterm.c
index 1afb8adcfe..d9485980fe 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -3873,8 +3873,10 @@ x_dnd_do_unsupported_drop (struct x_display_info
*dpyinfo,
&& child_return != None)
child = child_return;
+ x_uncatch_errors ();
+
if (!CONSP (value))
- goto cancel;
+ return;
current_value = assq_no_quit (QPRIMARY,
dpyinfo->terminal->Vselection_alist);
@@ -3891,9 +3893,7 @@ x_dnd_do_unsupported_drop (struct x_display_info *dpyinfo,
from generating events that will insert something else. */
if (owner != FRAME_X_WINDOW (f))
- goto cancel;
-
- x_uncatch_errors ();
+ return;
event.xbutton.window = child;
event.xbutton.subwindow = None;
@@ -3903,7 +3903,7 @@ x_dnd_do_unsupported_drop (struct x_display_info *dpyinfo,
event.xbutton.button = 2;
event.xbutton.same_screen = True;
- x_set_pending_dnd_time (before);
+ dpyinfo->pending_dnd_time = before;
event.xbutton.type = ButtonPress;
event.xbutton.time = before + 1;
@@ -3924,9 +3924,6 @@ x_dnd_do_unsupported_drop (struct x_display_info *dpyinfo,
x_dnd_action_symbol = QXdndActionPrivate;
return;
-
- cancel:
- x_uncatch_errors ();
}
static void
@@ -18934,23 +18931,17 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
}
else
- {
- x_set_pending_dnd_time (event->xbutton.time);
- x_dnd_send_unsupported_drop (dpyinfo,
(x_dnd_last_seen_toplevel != None
- ?
x_dnd_last_seen_toplevel
- :
x_dnd_last_seen_window),
- event->xbutton.x_root,
event->xbutton.y_root,
- event->xbutton.time);
- }
+ x_dnd_send_unsupported_drop (dpyinfo,
(x_dnd_last_seen_toplevel != None
+ ?
x_dnd_last_seen_toplevel
+ :
x_dnd_last_seen_window),
+ event->xbutton.x_root,
event->xbutton.y_root,
+ event->xbutton.time);
}
else if (x_dnd_last_seen_toplevel != None)
- {
- x_set_pending_dnd_time (event->xbutton.time);
- x_dnd_send_unsupported_drop (dpyinfo,
x_dnd_last_seen_toplevel,
- event->xbutton.x_root,
- event->xbutton.y_root,
- event->xbutton.time);
- }
+ x_dnd_send_unsupported_drop (dpyinfo,
x_dnd_last_seen_toplevel,
+ event->xbutton.x_root,
+ event->xbutton.y_root,
+ event->xbutton.time);
x_dnd_last_protocol_version = -1;
@@ -20352,22 +20343,16 @@ handle_one_xevent (struct x_display_info *dpyinfo,
}
}
else
- {
- x_set_pending_dnd_time (xev->time);
- x_dnd_send_unsupported_drop (dpyinfo,
(x_dnd_last_seen_toplevel != None
- ?
x_dnd_last_seen_toplevel
- :
x_dnd_last_seen_window),
- xev->root_x,
xev->root_y, xev->time);
- }
+ x_dnd_send_unsupported_drop (dpyinfo,
(x_dnd_last_seen_toplevel != None
+ ?
x_dnd_last_seen_toplevel
+ :
x_dnd_last_seen_window),
+ xev->root_x,
xev->root_y, xev->time);
}
else if (x_dnd_last_seen_toplevel != None)
- {
- x_set_pending_dnd_time (xev->time);
- x_dnd_send_unsupported_drop (dpyinfo,
-
x_dnd_last_seen_toplevel,
- xev->root_x,
xev->root_y,
- xev->time);
- }
+ x_dnd_send_unsupported_drop (dpyinfo,
+
x_dnd_last_seen_toplevel,
+ xev->root_x,
xev->root_y,
+ xev->time);
x_dnd_last_protocol_version = -1;
x_dnd_last_motif_style = XM_DRAG_STYLE_NONE;
diff --git a/src/xterm.h b/src/xterm.h
index 6684d7839f..92e88bb50f 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -765,6 +765,10 @@ struct x_display_info
/* Pointer to the next request in `failable_requests'. */
struct x_failable_request *next_failable_request;
+
+ /* The pending drag-and-drop time for middle-click based
+ drag-and-drop emulation. */
+ Time pending_dnd_time;
};
#ifdef HAVE_X_I18N
@@ -1617,7 +1621,6 @@ extern void x_clipboard_manager_save_all (void);
extern Lisp_Object x_timestamp_for_selection (struct x_display_info *,
Lisp_Object);
-extern void x_set_pending_dnd_time (Time);
extern void x_own_selection (Lisp_Object, Lisp_Object, Lisp_Object,
Lisp_Object, Time);
extern Atom x_intern_cached_atom (struct x_display_info *, const char *,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master bab449f034: Improve drag-and-drop emulation time handling,
Po Lu <=