diff options
| author | Yuuki Harano | 2020-10-03 20:09:07 +0900 |
|---|---|---|
| committer | Jeff Walsh | 2020-11-24 12:24:40 +1100 |
| commit | bb6862df1beddeaa4802af58b94332ba48afbb4f (patch) | |
| tree | 7476771f8fef3b39432b30b50f72f750790ce983 | |
| parent | 640f770b79b3c646fab8cad63076a7d58acdc44a (diff) | |
| download | emacs-bb6862df1beddeaa4802af58b94332ba48afbb4f.tar.gz emacs-bb6862df1beddeaa4802af58b94332ba48afbb4f.zip | |
Fix crash on drag and drop
* src/pgtkterm.c (pgtk_select): Move dispatch before
g_main_context_query.
(drag_drop): Remove drag_drop.
(drag_data_received): Rename arg.
(pgtk_set_event_handler): Remove drag-drop callback.
| -rw-r--r-- | src/pgtkterm.c | 51 |
1 files changed, 16 insertions, 35 deletions
diff --git a/src/pgtkterm.c b/src/pgtkterm.c index a5cf0a8159d..c66379e6e4b 100644 --- a/src/pgtkterm.c +++ b/src/pgtkterm.c | |||
| @@ -3841,6 +3841,20 @@ pgtk_select (int fds_lim, fd_set * rfds, fd_set * wfds, fd_set * efds, | |||
| 3841 | Note that, as implemented, this failure is completely silent: there is | 3841 | Note that, as implemented, this failure is completely silent: there is |
| 3842 | no feedback to the caller. */ | 3842 | no feedback to the caller. */ |
| 3843 | 3843 | ||
| 3844 | /* Before sleep, dispatch draw events. | ||
| 3845 | * Don't do this after g_main_context_query(), because fd may be closed | ||
| 3846 | * in dispatch. | ||
| 3847 | */ | ||
| 3848 | if (context_acquired) | ||
| 3849 | { | ||
| 3850 | int pselect_errno = errno; | ||
| 3851 | block_input (); | ||
| 3852 | while (g_main_context_pending (context)) | ||
| 3853 | g_main_context_dispatch (context); | ||
| 3854 | unblock_input (); | ||
| 3855 | errno = pselect_errno; | ||
| 3856 | } | ||
| 3857 | |||
| 3844 | if (rfds) | 3858 | if (rfds) |
| 3845 | all_rfds = *rfds; | 3859 | all_rfds = *rfds; |
| 3846 | else | 3860 | else |
| @@ -3895,17 +3909,6 @@ pgtk_select (int fds_lim, fd_set * rfds, fd_set * wfds, fd_set * efds, | |||
| 3895 | tmop = &tmo; | 3909 | tmop = &tmo; |
| 3896 | } | 3910 | } |
| 3897 | 3911 | ||
| 3898 | /* Before sleep, dispatch draw events. */ | ||
| 3899 | if (context_acquired) | ||
| 3900 | { | ||
| 3901 | int pselect_errno = errno; | ||
| 3902 | block_input (); | ||
| 3903 | while (g_main_context_pending (context)) | ||
| 3904 | g_main_context_dispatch (context); | ||
| 3905 | unblock_input (); | ||
| 3906 | errno = pselect_errno; | ||
| 3907 | } | ||
| 3908 | |||
| 3909 | fds_lim = max_fds + 1; | 3912 | fds_lim = max_fds + 1; |
| 3910 | nfds = thread_select (pselect, fds_lim, | 3913 | nfds = thread_select (pselect, fds_lim, |
| 3911 | &all_rfds, have_wfds ? &all_wfds : NULL, efds, | 3914 | &all_rfds, have_wfds ? &all_wfds : NULL, efds, |
| @@ -6509,31 +6512,11 @@ scroll_event (GtkWidget * widget, GdkEvent * event, gpointer * user_data) | |||
| 6509 | return TRUE; | 6512 | return TRUE; |
| 6510 | } | 6513 | } |
| 6511 | 6514 | ||
| 6512 | static gboolean | ||
| 6513 | drag_drop (GtkWidget * widget, | ||
| 6514 | GdkDragContext * context, | ||
| 6515 | gint x, gint y, guint time_, gpointer user_data) | ||
| 6516 | { | ||
| 6517 | PGTK_TRACE ("drag_drop"); | ||
| 6518 | GdkAtom target = gtk_drag_dest_find_target (widget, context, NULL); | ||
| 6519 | PGTK_TRACE ("drag_drop: target: %p", (void *) target); | ||
| 6520 | |||
| 6521 | if (target == GDK_NONE) | ||
| 6522 | { | ||
| 6523 | gtk_drag_finish (context, TRUE, FALSE, time_); | ||
| 6524 | return FALSE; | ||
| 6525 | } | ||
| 6526 | |||
| 6527 | gtk_drag_get_data (widget, context, target, time_); | ||
| 6528 | |||
| 6529 | return TRUE; | ||
| 6530 | } | ||
| 6531 | |||
| 6532 | static void | 6515 | static void |
| 6533 | drag_data_received (GtkWidget * widget, GdkDragContext * context, | 6516 | drag_data_received (GtkWidget * widget, GdkDragContext * context, |
| 6534 | gint x, gint y, | 6517 | gint x, gint y, |
| 6535 | GtkSelectionData * data, | 6518 | GtkSelectionData * data, |
| 6536 | guint info, guint time_, gpointer user_data) | 6519 | guint info, guint time, gpointer user_data) |
| 6537 | { | 6520 | { |
| 6538 | PGTK_TRACE ("drag_data_received:"); | 6521 | PGTK_TRACE ("drag_data_received:"); |
| 6539 | struct frame *f = pgtk_any_window_to_frame (gtk_widget_get_window (widget)); | 6522 | struct frame *f = pgtk_any_window_to_frame (gtk_widget_get_window (widget)); |
| @@ -6567,7 +6550,7 @@ drag_data_received (GtkWidget * widget, GdkDragContext * context, | |||
| 6567 | } | 6550 | } |
| 6568 | PGTK_TRACE ("drag_data_received: that's all."); | 6551 | PGTK_TRACE ("drag_data_received: that's all."); |
| 6569 | 6552 | ||
| 6570 | gtk_drag_finish (context, TRUE, FALSE, time_); | 6553 | gtk_drag_finish (context, TRUE, FALSE, time); |
| 6571 | } | 6554 | } |
| 6572 | 6555 | ||
| 6573 | void | 6556 | void |
| @@ -6622,8 +6605,6 @@ pgtk_set_event_handler (struct frame *f) | |||
| 6622 | G_CALLBACK (pgtk_selection_lost), NULL); | 6605 | G_CALLBACK (pgtk_selection_lost), NULL); |
| 6623 | g_signal_connect (G_OBJECT (FRAME_GTK_WIDGET (f)), "configure-event", | 6606 | g_signal_connect (G_OBJECT (FRAME_GTK_WIDGET (f)), "configure-event", |
| 6624 | G_CALLBACK (configure_event), NULL); | 6607 | G_CALLBACK (configure_event), NULL); |
| 6625 | g_signal_connect (G_OBJECT (FRAME_GTK_WIDGET (f)), "drag-drop", | ||
| 6626 | G_CALLBACK (drag_drop), NULL); | ||
| 6627 | g_signal_connect (G_OBJECT (FRAME_GTK_WIDGET (f)), "drag-data-received", | 6608 | g_signal_connect (G_OBJECT (FRAME_GTK_WIDGET (f)), "drag-data-received", |
| 6628 | G_CALLBACK (drag_data_received), NULL); | 6609 | G_CALLBACK (drag_data_received), NULL); |
| 6629 | g_signal_connect (G_OBJECT (FRAME_GTK_WIDGET (f)), "draw", | 6610 | g_signal_connect (G_OBJECT (FRAME_GTK_WIDGET (f)), "draw", |