diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-01-14 19:25:08 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-01-14 19:25:17 +0100 |
| commit | ebd0c81f7e5745d58e11846a695fe5842245c627 (patch) | |
| tree | dbb9e99ffeb5cc9cb97dd61e367a9a18d8699963 /src/drivers/X11/Fl_X11_Screen_Driver.cxx | |
| parent | ab58971bcf9cedee6ecd131ca032087ff7d1623c (diff) | |
Move make_transient() to Fl_Posix_System_Driver from Fl_Screen_Driver
Diffstat (limited to 'src/drivers/X11/Fl_X11_Screen_Driver.cxx')
| -rw-r--r-- | src/drivers/X11/Fl_X11_Screen_Driver.cxx | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/drivers/X11/Fl_X11_Screen_Driver.cxx b/src/drivers/X11/Fl_X11_Screen_Driver.cxx index ed8c54dfa..717132d1c 100644 --- a/src/drivers/X11/Fl_X11_Screen_Driver.cxx +++ b/src/drivers/X11/Fl_X11_Screen_Driver.cxx @@ -1399,3 +1399,43 @@ 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 |
