[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 7def8baa08: Fix cancelling DND upon a regular X error
From: |
Po Lu |
Subject: |
master 7def8baa08: Fix cancelling DND upon a regular X error |
Date: |
Fri, 10 Jun 2022 21:12:56 -0400 (EDT) |
branch: master
commit 7def8baa086451450f8bb34b07febb232f9c148d
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Fix cancelling DND upon a regular X error
* src/xterm.c (x_connection_closed): The display isn't dead upon
a non-IO error, so don't avoid sending messages to clean stuff
up.
---
src/xterm.c | 86 ++++++++++++++++++++++++++++++++-----------------------------
1 file changed, 45 insertions(+), 41 deletions(-)
diff --git a/src/xterm.c b/src/xterm.c
index 30322b0c09..ad925755b5 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -22379,51 +22379,55 @@ x_connection_closed (Display *dpy, const char
*error_message, bool ioerror)
if (x_dnd_in_progress || x_dnd_waiting_for_finish)
{
- /* Handle display disconnect errors here because this function
- is not reentrant at this particular spot. */
- io_error_handler = XSetIOErrorHandler (x_dnd_io_error_handler);
-
- if (!sigsetjmp (x_dnd_disconnect_handler, 1)
- && x_dnd_in_progress
- && dpy != (x_dnd_waiting_for_finish
- ? x_dnd_finish_display
- : FRAME_X_DISPLAY (x_dnd_frame)))
+ if (!ioerror)
{
- /* Clean up drag and drop if the drag frame's display isn't
- the one being disconnected. */
- f = x_dnd_frame;
-
- if (x_dnd_last_seen_window != None
- && x_dnd_last_protocol_version != -1)
- x_dnd_send_leave (x_dnd_frame,
- x_dnd_last_seen_window);
- else if (x_dnd_last_seen_window != None
- && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
- && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
- && x_dnd_motif_setup_p)
+ /* Handle display disconnect errors here because this function
+ is not reentrant at this particular spot. */
+ io_error_handler = XSetIOErrorHandler (x_dnd_io_error_handler);
+
+ if (!!sigsetjmp (x_dnd_disconnect_handler, 1)
+ && x_dnd_in_progress
+ && dpy == (x_dnd_waiting_for_finish
+ ? x_dnd_finish_display
+ : FRAME_X_DISPLAY (x_dnd_frame)))
{
- dmsg.reason = XM_DRAG_REASON (XM_DRAG_ORIGINATOR_INITIATOR,
- XM_DRAG_REASON_DROP_START);
- dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
- dmsg.timestamp = FRAME_DISPLAY_INFO (f)->last_user_time;
- dmsg.side_effects
- = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action
(FRAME_DISPLAY_INFO (f),
-
x_dnd_wanted_action),
- XM_DROP_SITE_VALID,
x_dnd_motif_operations,
- XM_DROP_ACTION_DROP_CANCEL);
- dmsg.x = 0;
- dmsg.y = 0;
- dmsg.index_atom = FRAME_DISPLAY_INFO (f)->Xatom_XdndSelection;
- dmsg.source_window = FRAME_X_WINDOW (f);
-
- x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (f), f,
- x_dnd_last_seen_window, 0);
- xm_send_drop_message (FRAME_DISPLAY_INFO (f), FRAME_X_WINDOW (f),
- x_dnd_last_seen_window, &dmsg);
+ /* Clean up drag and drop if the drag frame's display isn't
+ the one being disconnected. */
+ f = x_dnd_frame;
+
+ if (x_dnd_last_seen_window != None
+ && x_dnd_last_protocol_version != -1)
+ x_dnd_send_leave (x_dnd_frame,
+ x_dnd_last_seen_window);
+ else if (x_dnd_last_seen_window != None
+ && !XM_DRAG_STYLE_IS_DROP_ONLY (x_dnd_last_motif_style)
+ && x_dnd_last_motif_style != XM_DRAG_STYLE_NONE
+ && x_dnd_motif_setup_p)
+ {
+ dmsg.reason = XM_DRAG_REASON (XM_DRAG_ORIGINATOR_INITIATOR,
+ XM_DRAG_REASON_DROP_START);
+ dmsg.byte_order = XM_BYTE_ORDER_CUR_FIRST;
+ dmsg.timestamp = FRAME_DISPLAY_INFO (f)->last_user_time;
+ dmsg.side_effects
+ = XM_DRAG_SIDE_EFFECT (xm_side_effect_from_action
(FRAME_DISPLAY_INFO (f),
+
x_dnd_wanted_action),
+ XM_DROP_SITE_VALID,
x_dnd_motif_operations,
+ XM_DROP_ACTION_DROP_CANCEL);
+ dmsg.x = 0;
+ dmsg.y = 0;
+ dmsg.index_atom = FRAME_DISPLAY_INFO (f)->Xatom_XdndSelection;
+ dmsg.source_window = FRAME_X_WINDOW (f);
+
+ x_dnd_send_xm_leave_for_drop (FRAME_DISPLAY_INFO (f), f,
+ x_dnd_last_seen_window, 0);
+ xm_send_drop_message (FRAME_DISPLAY_INFO (f), FRAME_X_WINDOW
(f),
+ x_dnd_last_seen_window, &dmsg);
+ }
}
+
+ XSetIOErrorHandler (io_error_handler);
}
- XSetIOErrorHandler (io_error_handler);
dpyinfo = x_display_info_for_display (dpy);
x_dnd_last_seen_window = None;
@@ -22432,7 +22436,7 @@ x_connection_closed (Display *dpy, const char
*error_message, bool ioerror)
x_dnd_waiting_for_finish = false;
if (x_dnd_use_toplevels)
- x_dnd_free_toplevels (false);
+ x_dnd_free_toplevels (!ioerror);
x_dnd_return_frame_object = NULL;
x_dnd_movement_frame = NULL;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 7def8baa08: Fix cancelling DND upon a regular X error,
Po Lu <=