[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master cc297af178: Handle IO errors when creating Motif drag window
From: |
Po Lu |
Subject: |
master cc297af178: Handle IO errors when creating Motif drag window |
Date: |
Fri, 29 Apr 2022 01:48:32 -0400 (EDT) |
branch: master
commit cc297af17872233eb00d1bf06b4446be529dc1dc
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Handle IO errors when creating Motif drag window
* src/xterm.c (xm_drag_window_io_error_handler): New function.
(xm_get_drag_window): Use that as the IO error handler when the
temporary display is open.
---
src/xterm.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/src/xterm.c b/src/xterm.c
index cce586952a..51828795c5 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -1390,6 +1390,14 @@ xm_drag_window_error_handler (Display *display,
XErrorEvent *event)
return 0;
}
+static _Noreturn int
+xm_drag_window_io_error_handler (Display *dpy)
+{
+ /* DPY isn't created through GDK, so it doesn't matter if we don't
+ crash here. */
+ longjmp (x_dnd_disconnect_handler, 1);
+}
+
static Window
xm_get_drag_window (struct x_display_info *dpyinfo)
{
@@ -1400,7 +1408,7 @@ xm_get_drag_window (struct x_display_info *dpyinfo)
Window drag_window;
XSetWindowAttributes attrs;
Display *temp_display;
- void *old_handler;
+ void *old_handler, *old_io_handler;
drag_window = None;
rc = XGetWindowProperty (dpyinfo->display, dpyinfo->root_window,
@@ -1434,13 +1442,25 @@ xm_get_drag_window (struct x_display_info *dpyinfo)
if (drag_window == None)
{
block_input ();
+ old_io_handler = XSetIOErrorHandler (xm_drag_window_io_error_handler);
+
+ if (sigsetjmp (x_dnd_disconnect_handler, 1))
+ {
+ XSetIOErrorHandler (old_io_handler);
+ unblock_input ();
+
+ return None;
+ }
+
unrequest_sigio ();
temp_display = XOpenDisplay (XDisplayString (dpyinfo->display));
request_sigio ();
if (!temp_display)
{
+ XSetIOErrorHandler (old_io_handler);
unblock_input ();
+
return None;
}
@@ -1484,6 +1504,7 @@ xm_get_drag_window (struct x_display_info *dpyinfo)
XCloseDisplay (temp_display);
XSetErrorHandler (old_handler);
+ XSetIOErrorHandler (old_io_handler);
/* Make sure the drag window created is actually valid for the
current display, and the XOpenDisplay above didn't
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master cc297af178: Handle IO errors when creating Motif drag window,
Po Lu <=