Use a GTK grab when showing a modal GtkFileChooserNativeWin32
authorLuca Bacci <luca.bacci982@gmail.com>
Tue, 4 Jan 2022 09:44:54 +0000 (10:44 +0100)
committerLuca Bacci <luca.bacci982@gmail.com>
Tue, 4 Jan 2022 09:46:20 +0000 (10:46 +0100)
gtk/gtkfilechoosernativewin32.c

index 505e0b07f0f0df2feff6a155bac63bd69685cb05..bd08939e8625f5bd214da60acdfe10c155c0c0f9 100644 (file)
@@ -41,6 +41,7 @@
 #include "gtktogglebutton.h"
 #include "gtkheaderbar.h"
 #include "gtklabel.h"
+#include "gtkmain.h"
 #include "gtkfilefilterprivate.h"
 #include "gtknative.h"
 
@@ -50,6 +51,9 @@
 
 typedef struct {
   GtkFileChooserNative *self;
+
+  GtkWidget *grab_widget;
+
   IFileDialogEvents *events;
 
   HWND parent;
@@ -318,6 +322,12 @@ filechooser_win32_thread_data_free (FilechooserWin32ThreadData *data)
   if (data->events)
     IFileDialogEvents_Release (data->events);
 
+  if (data->grab_widget)
+    {
+      gtk_grab_remove (data->grab_widget);
+      g_object_unref (data->grab_widget);
+    }
+
   g_clear_object (&data->current_folder);
   g_clear_object (&data->current_file);
   g_free (data->current_name);
@@ -969,6 +979,12 @@ gtk_file_chooser_native_win32_show (GtkFileChooserNative *self)
       return FALSE;
     }
 
+  if (data->modal)
+    {
+      data->grab_widget = g_object_ref_sink (gtk_label_new (""));
+      gtk_grab_add (GTK_WIDGET (data->grab_widget));
+    }
+
   return TRUE;
 }