diff options
author | Po Lu <luangruo@yahoo.com> | 2022-04-05 20:03:48 +0800 |
---|---|---|
committer | Po Lu <luangruo@yahoo.com> | 2022-04-05 20:19:09 +0800 |
commit | 7d504c9acc0c8d75d11c3a2b5e016f39e6156bf8 (patch) | |
tree | 3207ff8a7d216c4908efcb360e6bc5d9a2b03e0e /src/xterm.c | |
parent | 91ca41e292184bf0c21b55a8e51f3eb1a8c89bb7 (diff) | |
download | emacs-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.c | 30 |
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; |