[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 36af7004e2: Don't call XSelectInput on a dying display when cance
From: |
Po Lu |
Subject: |
master 36af7004e2: Don't call XSelectInput on a dying display when cancelling drag-and-drop |
Date: |
Thu, 2 Jun 2022 20:52:02 -0400 (EDT) |
branch: master
commit 36af7004e2bf0db1d9c2fd1312215a931c1db3df
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Don't call XSelectInput on a dying display when cancelling drag-and-drop
* src/xterm.c (x_dnd_free_toplevels): New argument
`display_alive'.
(x_dnd_cleanup_drag_and_drop, x_dnd_begin_drag_and_drop)
(handle_one_xevent): Change calls to `x_dnd_free_toplevels'.
(x_connection_closed, x_delete_terminal): Set it to false.
---
src/xterm.c | 33 +++++++++++++++++++--------------
1 file changed, 19 insertions(+), 14 deletions(-)
diff --git a/src/xterm.c b/src/xterm.c
index f8b1f0db74..d64d78f647 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -2288,7 +2288,7 @@ x_dnd_send_xm_leave_for_drop (struct x_display_info
*dpyinfo,
}
static void
-x_dnd_free_toplevels (void)
+x_dnd_free_toplevels (bool display_alive)
{
struct x_client_list_window *last;
struct x_client_list_window *tem = x_dnd_toplevels;
@@ -2298,13 +2298,16 @@ x_dnd_free_toplevels (void)
last = tem;
tem = tem->next;
- x_catch_errors (last->dpy);
- XSelectInput (last->dpy, last->window,
- last->previous_event_mask);
+ if (display_alive)
+ {
+ x_catch_errors (last->dpy);
+ XSelectInput (last->dpy, last->window,
+ last->previous_event_mask);
#ifdef HAVE_XSHAPE
- XShapeSelectInput (last->dpy, last->window, None);
+ XShapeSelectInput (last->dpy, last->window, None);
#endif
- x_uncatch_errors ();
+ x_uncatch_errors ();
+ }
#ifdef HAVE_XSHAPE
if (last->n_input_rects != -1)
@@ -4054,7 +4057,7 @@ x_dnd_cleanup_drag_and_drop (void *frame)
x_dnd_waiting_for_finish = false;
if (x_dnd_use_toplevels)
- x_dnd_free_toplevels ();
+ x_dnd_free_toplevels (true);
FRAME_DISPLAY_INFO (f)->grabbed = 0;
#ifdef USE_GTK
@@ -10647,7 +10650,7 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time,
Atom xaction,
{
if (x_dnd_compute_toplevels (FRAME_DISPLAY_INFO (f)))
{
- x_dnd_free_toplevels ();
+ x_dnd_free_toplevels (true);
x_dnd_use_toplevels = false;
}
}
@@ -10843,7 +10846,7 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time,
Atom xaction,
x_dnd_waiting_for_finish = false;
if (x_dnd_use_toplevels)
- x_dnd_free_toplevels ();
+ x_dnd_free_toplevels (true);
x_dnd_return_frame_object = NULL;
x_dnd_movement_frame = NULL;
@@ -10993,7 +10996,7 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time,
Atom xaction,
x_dnd_return_frame_object = NULL;
if (x_dnd_use_toplevels)
- x_dnd_free_toplevels ();
+ x_dnd_free_toplevels (true);
FRAME_DISPLAY_INFO (f)->grabbed = 0;
/* Emacs can't respond to DND events inside the nested event
@@ -15901,11 +15904,11 @@ handle_one_xevent (struct x_display_info *dpyinfo,
{
if (x_dnd_use_toplevels)
{
- x_dnd_free_toplevels ();
+ x_dnd_free_toplevels (true);
if (x_dnd_compute_toplevels (dpyinfo))
{
- x_dnd_free_toplevels ();
+ x_dnd_free_toplevels (true);
x_dnd_use_toplevels = false;
}
}
@@ -21790,7 +21793,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 ();
+ x_dnd_free_toplevels (false);
x_dnd_return_frame_object = NULL;
x_dnd_movement_frame = NULL;
@@ -25838,8 +25841,10 @@ x_delete_terminal (struct terminal *terminal)
x_dnd_in_progress = false;
x_dnd_waiting_for_finish = false;
+ /* The display is going away, so there's no point in
+ de-selecting for input on the DND toplevels. */
if (x_dnd_use_toplevels)
- x_dnd_free_toplevels ();
+ x_dnd_free_toplevels (false);
x_dnd_return_frame_object = NULL;
x_dnd_movement_frame = NULL;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 36af7004e2: Don't call XSelectInput on a dying display when cancelling drag-and-drop,
Po Lu <=