FLTK logo

[master] 8213ba9 - Improve Fl_GTK_Native_File_Chooser_Driver in relation to FLTK windows.

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] 8213ba9 - Improve Fl_GTK_Native_File_Chooser_Driver in relation to FLTK windows. "ManoloFLTK" Jan 16, 2022  
 
commit 8213ba94aa2b1a83f7da8b603935811c05c7def5
Author:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Sun Jan 16 18:49:26 2022 +0100
Commit:     ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Sun Jan 16 18:49:41 2022 +0100

    Improve Fl_GTK_Native_File_Chooser_Driver in relation to FLTK windows.
    
    Implement a new way to make the GTK file-chooser window modal-like
    by preventing any event processing by other FLTK windows.
    The new way is also no longer X11-specific.

 src/Fl_Native_File_Chooser_GTK.cxx         | 50 ++++++++++++++++++++++++++----
 src/Fl_Screen_Driver.H                     |  3 +-
 src/drivers/Posix/Fl_Posix_System_Driver.H |  3 +-
 src/drivers/X11/Fl_X11_Screen_Driver.H     |  5 +--
 src/drivers/X11/Fl_X11_Screen_Driver.cxx   | 42 +------------------------
 src/drivers/X11/Fl_X11_System_Driver.H     |  3 +-
 src/drivers/X11/Fl_X11_System_Driver.cxx   | 16 +---------
 7 files changed, 50 insertions(+), 72 deletions(-)

diff --git src/Fl_Native_File_Chooser_GTK.cxx src/Fl_Native_File_Chooser_GTK.cxx
index 976d6f9..bfb3dbe 100644
--- src/Fl_Native_File_Chooser_GTK.cxx
+++ src/Fl_Native_File_Chooser_GTK.cxx
@@ -1,7 +1,7 @@
 //
 // FLTK native file chooser widget wrapper for GTK's GtkFileChooserDialog
 //
-// Copyright 1998-2021 by Bill Spitzak and others.
+// Copyright 1998-2022 by Bill Spitzak and others.
 // Copyright 2012 IMM
 //
 // This library is free software. Distribution and use rights are outlined in
@@ -29,6 +29,7 @@
 #include <FL/fl_string.h>
 #include <dlfcn.h>   // for dlopen et al
 #include "drivers/X11/Fl_X11_System_Driver.H"
+#include "Fl_Window_Driver.H"
 #include "Fl_Screen_Driver.H"
 
 /* --------------------- Type definitions from GLIB and GTK --------------------- */
@@ -624,6 +625,11 @@ static void minus_cb(GtkWidget *togglebutton, GtkImage *preview) {
 }
 
 
+static int fnfc_dispatch(int /*event*/, Fl_Window* /*win*/) {
+  return 0;
+}
+
+
 int Fl_GTK_Native_File_Chooser_Driver::fl_gtk_chooser_wrapper()
 {
   int result = 1;
@@ -759,19 +765,42 @@ int Fl_GTK_Native_File_Chooser_Driver::fl_gtk_chooser_wrapper()
   }
   fl_gtk_file_chooser_set_extra_widget((GtkFileChooser *)gtkw_ptr, extra);
   fl_gtk_widget_show_all(extra);
-  Fl_Window* firstw = Fl::first_window();
   fl_gtk_widget_show_now(gtkw_ptr); // map the GTK window on screen
-  if (firstw) {
-    Fl::screen_driver()->make_transient(Fl_Posix_System_Driver::ptr_gtk, gtkw_ptr, firstw);
-  }
   gboolean state = fl_gtk_file_chooser_get_show_hidden((GtkFileChooser *)gtkw_ptr);
   fl_gtk_toggle_button_set_active((GtkToggleButton *)show_hidden_button, state);
+  
+  Fl_Event_Dispatch old_dispatch = Fl::event_dispatch();
+  // prevent FLTK from processing any event
+  Fl::event_dispatch(fnfc_dispatch);
+  struct win_dims {
+    Fl_Window *win;
+    int minw,minh,maxw,maxh;
+    struct win_dims *next;
+  } *first_dim = NULL;
+  // consider all bordered, top-level FLTK windows
+  Fl_Window *win = Fl::first_window();
+  while (win) {
+    if (win->border()) {
+      Fl_Window_Driver *dr = Fl_Window_Driver::driver(win);
+      win_dims *dim = new win_dims;
+      dim->win = win;
+      dim->minw = dr->minw();
+      dim->minh = dr->minh();
+      dim->maxw = dr->maxw();
+      dim->maxh = dr->maxh();
+      //make win un-resizable
+      win->size_range(win->w(), win->h(), win->w(), win->h());
+      dim->next = first_dim;
+      first_dim = dim;
+    }
+    win = Fl::next_window(win);
+  }
 
   gint response_id = GTK_RESPONSE_NONE;
   fl_g_signal_connect_data(gtkw_ptr, "response", G_CALLBACK(run_response_handler), &response_id, NULL, (GConnectFlags) 0);
   while (response_id == GTK_RESPONSE_NONE) { // loop that shows the GTK dialog window
     fl_gtk_main_iteration(); // one iteration of the GTK event loop
-    ((Fl_Posix_System_Driver*)Fl::system_driver())->emulate_modal_dialog();
+    while (Fl::ready()) Fl::check(); // queued iterations of the FLTK event loop
   }
 
   if (response_id == GTK_RESPONSE_ACCEPT) {
@@ -829,6 +858,15 @@ int Fl_GTK_Native_File_Chooser_Driver::fl_gtk_chooser_wrapper()
   // the GtkFileChooserDialog is removed from the display correctly
   while (fl_gtk_events_pending ()) fl_gtk_main_iteration ();
 
+  Fl::event_dispatch(old_dispatch);
+  while (first_dim) {
+    win_dims *dim = first_dim;
+    //give back win its resizing parameters
+    dim->win->size_range(dim->minw, dim->minh, dim->maxw, dim->maxh);
+    first_dim = dim->next;
+    delete dim;
+  }
+
   return result;
 } // fl_gtk_chooser_wrapper
 
diff --git src/Fl_Screen_Driver.H src/Fl_Screen_Driver.H
index e33950b..027b300 100644
--- src/Fl_Screen_Driver.H
+++ src/Fl_Screen_Driver.H
@@ -1,7 +1,7 @@
 //
 // All screen related calls in a driver style class.
 //
-// Copyright 1998-2021 by Bill Spitzak and others.
+// Copyright 1998-2022 by Bill Spitzak and others.
 //
 // This library is free software. Distribution and use rights are outlined in
 // the file "COPYING" which should have been included with this file.  If this
@@ -206,7 +206,6 @@ public:
   virtual APP_SCALING_CAPABILITY rescalable() { return NO_APP_SCALING; }
   // supports Fl_Window::default_icons()
   virtual void default_icons(const Fl_RGB_Image *icons[], int count);
-  virtual void make_transient(void *, void *, Fl_Window *) {}
 };
 
 #endif // !FL_SCREEN_DRIVER_H
diff --git src/drivers/Posix/Fl_Posix_System_Driver.H src/drivers/Posix/Fl_Posix_System_Driver.H
index 9d2c0fa..752b542 100644
--- src/drivers/Posix/Fl_Posix_System_Driver.H
+++ src/drivers/Posix/Fl_Posix_System_Driver.H
@@ -2,7 +2,7 @@
 // Definition of POSIX system driver
 // for the Fast Light Tool Kit (FLTK).
 //
-// Copyright 2010-2021 by Bill Spitzak and others.
+// Copyright 2010-2022 by Bill Spitzak and others.
 //
 // This library is free software. Distribution and use rights are outlined in
 // the file "COPYING" which should have been included with this file.  If this
@@ -88,7 +88,6 @@ public:
   virtual void lock_ring();
   virtual void unlock_ring();
 #endif
-  virtual void emulate_modal_dialog() {}
 };
 
 #endif // FL_POSIX_SYSTEM_DRIVER_H
diff --git src/drivers/X11/Fl_X11_Screen_Driver.H src/drivers/X11/Fl_X11_Screen_Driver.H
index 8a82486..7d665db 100644
--- src/drivers/X11/Fl_X11_Screen_Driver.H
+++ src/drivers/X11/Fl_X11_Screen_Driver.H
@@ -2,7 +2,7 @@
 // Definition of X11 Screen interface
 // for the Fast Light Tool Kit (FLTK).
 //
-// Copyright 2010-2018 by Bill Spitzak and others.
+// Copyright 2010-2022 by Bill Spitzak and others.
 //
 // This library is free software. Distribution and use rights are outlined in
 // the file "COPYING" which should have been included with this file.  If this
@@ -103,9 +103,6 @@ public:
   // --- compute dimensions of an Fl_Offscreen
   virtual void offscreen_size(Fl_Offscreen o, int &width, int &height);
   virtual void default_icons(const Fl_RGB_Image *icons[], int count);
-#if HAVE_DLSYM && HAVE_DLFCN_H
-  virtual void make_transient(void *ptr_gtk, void *gtk_window, Fl_Window *win);
-#endif
 };
 
 
diff --git src/drivers/X11/Fl_X11_Screen_Driver.cxx src/drivers/X11/Fl_X11_Screen_Driver.cxx
index 717132d..beb30df 100644
--- src/drivers/X11/Fl_X11_Screen_Driver.cxx
+++ src/drivers/X11/Fl_X11_Screen_Driver.cxx
@@ -1,7 +1,7 @@
 //
 // Definition of X11 Screen interface
 //
-// Copyright 1998-2020 by Bill Spitzak and others.
+// Copyright 1998-2022 by Bill Spitzak and others.
 //
 // This library is free software. Distribution and use rights are outlined in
 // the file "COPYING" which should have been included with this file.  If this
@@ -1399,43 +1399,3 @@ void Fl_X11_Screen_Driver::desktop_scale_factor()
 }
 
 #endif // USE_XFT
-
-#if HAVE_DLSYM && HAVE_DLFCN_H
-void Fl_X11_Screen_Driver::make_transient(void *ptr_gtk, void *gtkw_window, Fl_Window *win) {
-  typedef int gboolean;
-  typedef struct _GdkDrawable GdkWindow;
-  typedef struct _GtkWidget GtkWidget;
-
-  typedef unsigned long (*XX_gdk_x11_window_get_type)();
-  static XX_gdk_x11_window_get_type fl_gdk_x11_window_get_type = NULL;
-
-  typedef gboolean (*XX_g_type_check_instance_is_a)(void *type_instance, unsigned long iface_type);
-  static XX_g_type_check_instance_is_a fl_g_type_check_instance_is_a = NULL;
-
-  typedef Window (*gdk_to_X11_t)(GdkWindow*);
-  static gdk_to_X11_t fl_gdk_to_X11 = NULL;
-
-  typedef GdkWindow* (*XX_gtk_widget_get_window)(GtkWidget *);
-  static XX_gtk_widget_get_window fl_gtk_widget_get_window = NULL;
-
-  if (!fl_gdk_to_X11) {
-    fl_gdk_to_X11 = (gdk_to_X11_t)dlsym(ptr_gtk, "gdk_x11_drawable_get_xid");
-    if (!fl_gdk_to_X11) fl_gdk_to_X11 = (gdk_to_X11_t)dlsym(ptr_gtk, "gdk_x11_window_get_xid");
-    if (!fl_gdk_to_X11) return;
-    fl_gdk_x11_window_get_type = (XX_gdk_x11_window_get_type)dlsym(ptr_gtk, "gdk_x11_window_get_type");
-    fl_g_type_check_instance_is_a = (XX_g_type_check_instance_is_a)dlsym(ptr_gtk, "g_type_check_instance_is_a");
-    fl_gtk_widget_get_window = (XX_gtk_widget_get_window)dlsym(ptr_gtk, "gtk_widget_get_window");
-    if (!fl_gtk_widget_get_window) return;
-  }
-  GdkWindow* gdkw = fl_gtk_widget_get_window((GtkWidget*)gtkw_window);
-
-  // Make sure the Dialog is an X11 window because it's not on Wayland.
-  // Until we find how to make a wayland window transient for an X11 window,
-  // we make the GTK window transient only when it's X11-based.
-  if ( (!fl_gdk_x11_window_get_type) || (!fl_g_type_check_instance_is_a) ||
-      fl_g_type_check_instance_is_a(gdkw, fl_gdk_x11_window_get_type()) ) {
-    Window xw = fl_gdk_to_X11(gdkw); // get the X11 ref of the GTK window
-    if (xw) XSetTransientForHint(fl_display, xw, fl_xid(win)); // set the GTK window transient for the last FLTK win
-  }
-}
-#endif //HAVE_DLSYM && HAVE_DLFCN_H
diff --git src/drivers/X11/Fl_X11_System_Driver.H src/drivers/X11/Fl_X11_System_Driver.H
index 69649bc..146a48e 100644
--- src/drivers/X11/Fl_X11_System_Driver.H
+++ src/drivers/X11/Fl_X11_System_Driver.H
@@ -2,7 +2,7 @@
 // Definition of Posix system driver
 // for the Fast Light Tool Kit (FLTK).
 //
-// Copyright 2010-2018 by Bill Spitzak and others.
+// Copyright 2010-2022 by Bill Spitzak and others.
 //
 // This library is free software. Distribution and use rights are outlined in
 // the file "COPYING" which should have been included with this file.  If this
@@ -64,7 +64,6 @@ public:
   virtual void add_fd(int fd, Fl_FD_Handler cb, void* = 0);
   virtual void remove_fd(int, int when);
   virtual void remove_fd(int);
-  virtual void emulate_modal_dialog();
 };
 
 #endif /* FL_X11_SYSTEM_DRIVER_H */
diff --git src/drivers/X11/Fl_X11_System_Driver.cxx src/drivers/X11/Fl_X11_System_Driver.cxx
index 30dfe8b..7868ae3 100644
--- src/drivers/X11/Fl_X11_System_Driver.cxx
+++ src/drivers/X11/Fl_X11_System_Driver.cxx
@@ -2,7 +2,7 @@
 // Definition of Posix system driver
 // for the Fast Light Tool Kit (FLTK).
 //
-// Copyright 2010-2020 by Bill Spitzak and others.
+// Copyright 2010-2022 by Bill Spitzak and others.
 //
 // This library is free software. Distribution and use rights are outlined in
 // the file "COPYING" which should have been included with this file.  If this
@@ -618,18 +618,4 @@ void Fl_X11_System_Driver::own_colormap() {
 #endif // USE_COLORMAP
 }
 
-
-void Fl_X11_System_Driver::emulate_modal_dialog() {
-  while (XEventsQueued(fl_display, QueuedAfterReading)) { // emulate modal dialog
-    XEvent xevent;
-    XNextEvent(fl_display, &xevent);
-    Window xid = xevent.xany.window;
-    if (xevent.type == ConfigureNotify) xid = xevent.xmaprequest.window;
-    if (!fl_find(xid)) continue; // skip events to non-FLTK windows
-    // process Expose and ConfigureNotify events
-    if ( xevent.type == Expose || xevent.type == ConfigureNotify ) fl_handle(xevent);
-  }
-  Fl::flush(); // do the drawings needed after Expose events
-}
-
 #endif // !defined(FL_DOXYGEN)
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.