summaryrefslogtreecommitdiff
path: root/src/xterm.c
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2022-04-05 20:03:48 +0800
committerPo Lu <luangruo@yahoo.com>2022-04-05 20:19:09 +0800
commit7d504c9acc0c8d75d11c3a2b5e016f39e6156bf8 (patch)
tree3207ff8a7d216c4908efcb360e6bc5d9a2b03e0e /src/xterm.c
parent91ca41e292184bf0c21b55a8e51f3eb1a8c89bb7 (diff)
downloademacs-7d504c9acc0c8d75d11c3a2b5e016f39e6156bf8.tar.gz
emacs-7d504c9acc0c8d75d11c3a2b5e016f39e6156bf8.tar.bz2
emacs-7d504c9acc0c8d75d11c3a2b5e016f39e6156bf8.zip
Mark some data during drag-and-drop
It doesn't make sense to prevent the return frame or movement frame from being deleted, but we should at least protect them from garbage collection. * src/alloc.c (garbage_collect): Call mark_xterm. * src/xterm.c (x_dnd_begin_drag_and_drop) (x_dnd_cleanup_drag_and_drop): Clear movement and return frames upon DND completion. (mark_xterm): Mark those frames. * src/xterm.h: Update prototypes.
Diffstat (limited to 'src/xterm.c')
-rw-r--r--src/xterm.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/xterm.c b/src/xterm.c
index 922aafbbdf1..b9a5355b415 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -3497,6 +3497,8 @@ x_dnd_cleanup_drag_and_drop (void *frame)
#ifdef USE_GTK
current_hold_quit = NULL;
#endif
+ x_dnd_return_frame_object = NULL;
+ x_dnd_movement_frame = NULL;
block_input ();
/* Restore the old event mask. */
@@ -9528,6 +9530,9 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
if (x_dnd_use_toplevels)
x_dnd_free_toplevels ();
+ x_dnd_return_frame_object = NULL;
+ x_dnd_movement_frame = NULL;
+
FRAME_DISPLAY_INFO (f)->grabbed = 0;
#ifdef USE_GTK
current_hold_quit = NULL;
@@ -9546,6 +9551,7 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
#ifdef USE_GTK
current_hold_quit = NULL;
#endif
+ x_dnd_movement_frame = NULL;
/* Restore the old event mask. */
XSelectInput (FRAME_X_DISPLAY (f),
@@ -9554,14 +9560,18 @@ x_dnd_begin_drag_and_drop (struct frame *f, Time time, Atom xaction,
unblock_input ();
- if (x_dnd_return_frame == 3)
+ if (x_dnd_return_frame == 3
+ && FRAME_LIVE_P (x_dnd_return_frame_object))
{
x_dnd_return_frame_object->mouse_moved = true;
XSETFRAME (action, x_dnd_return_frame_object);
+ x_dnd_return_frame_object = NULL;
return action;
}
+ x_dnd_return_frame_object = NULL;
+
if (x_dnd_use_toplevels)
x_dnd_free_toplevels ();
FRAME_DISPLAY_INFO (f)->grabbed = 0;
@@ -23016,6 +23026,24 @@ init_xterm (void)
#endif
void
+mark_xterm (void)
+{
+ Lisp_Object val;
+
+ if (x_dnd_return_frame_object)
+ {
+ XSETFRAME (val, x_dnd_return_frame_object);
+ mark_object (val);
+ }
+
+ if (x_dnd_movement_frame)
+ {
+ XSETFRAME (val, x_dnd_movement_frame);
+ mark_object (val);
+ }
+}
+
+void
syms_of_xterm (void)
{
x_error_message = NULL;