]> git.eshelyaron.com Git - emacs.git/commitdiff
Clear xwidget passive grab whenever a drag begins
authorPo Lu <luangruo@yahoo.com>
Fri, 28 Jan 2022 03:08:20 +0000 (11:08 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 28 Jan 2022 03:08:20 +0000 (11:08 +0800)
* src/xwidget.c (xv_drag_begin_cb): New function.
(xwidget_view_from_window): Attach said function to grab widget
when a grab starts.
* src/xwidget.h (struct xwidget_view): New field
`passive_grab_drag_signal'.

src/xwidget.c
src/xwidget.h

index c5f4c0ee944fd0e3591dc8d77a685ce8a0912057..2080f109cddde915792f9446e1e5e95ac3860614 100644 (file)
@@ -1138,6 +1138,23 @@ run_file_chooser_cb (WebKitWebView *webview,
 
 #ifdef HAVE_X_WINDOWS
 
+static void
+xv_drag_begin_cb (GtkWidget *widget,
+                 GdkDragContext *context,
+                 gpointer user_data)
+{
+  struct xwidget_view *view = user_data;
+
+  if (view->passive_grab)
+    {
+      g_signal_handler_disconnect (view->passive_grab,
+                                  view->passive_grab_destruction_signal);
+      g_signal_handler_disconnect (view->passive_grab,
+                                  view->passive_grab_drag_signal);
+      view->passive_grab = NULL;
+    }
+}
+
 static void
 xwidget_button_1 (struct xwidget_view *view,
                  bool down_p, int x, int y, int button,
@@ -1170,6 +1187,10 @@ xwidget_button_1 (struct xwidget_view *view,
        = g_signal_connect (G_OBJECT (view->passive_grab),
                            "destroy", G_CALLBACK (gtk_widget_destroyed),
                            &view->passive_grab);
+      view->passive_grab_drag_signal
+       = g_signal_connect (G_OBJECT (view->passive_grab),
+                           "drag-begin", G_CALLBACK (xv_drag_begin_cb),
+                           view);
     }
   else
     {
@@ -1230,6 +1251,8 @@ xwidget_button_1 (struct xwidget_view *view,
        {
          g_signal_handler_disconnect (view->passive_grab,
                                       view->passive_grab_destruction_signal);
+         g_signal_handler_disconnect (view->passive_grab,
+                                      view->passive_grab_drag_signal);
          view->passive_grab = NULL;
        }
     }
@@ -3205,6 +3228,8 @@ DEFUN ("delete-xwidget-view",
     {
       g_signal_handler_disconnect (xv->passive_grab,
                                   xv->passive_grab_destruction_signal);
+      g_signal_handler_disconnect (xv->passive_grab,
+                                  xv->passive_grab_drag_signal);
       xv->passive_grab = NULL;
     }
 
index 79dee37695d1a25227c3a4a4c721763fe2e9f253..8b47a0b90468c7c8033267de953df748b317e0ca 100644 (file)
@@ -122,6 +122,7 @@ struct xwidget_view
   GdkWindow *last_crossing_window;
   GtkWidget *passive_grab;
   guint passive_grab_destruction_signal;
+  guint passive_grab_drag_signal;
 #else
   struct pgtk_display_info *dpyinfo;
   GtkWidget *widget;