diff --git a/source/bridges-ui/CarlaBridgeToolkitGtk.cpp b/source/bridges-ui/CarlaBridgeToolkitGtk.cpp index 6c41f790b..8419b7ece 100644 --- a/source/bridges-ui/CarlaBridgeToolkitGtk.cpp +++ b/source/bridges-ui/CarlaBridgeToolkitGtk.cpp @@ -73,39 +73,14 @@ public: CARLA_SAFE_ASSERT_RETURN(fWindow != nullptr,); carla_debug("CarlaBridgeToolkitGtk::exec(%s)", bool2str(showUI)); - GtkWidget* const widget((GtkWidget*)kClient->getWidget()); + GtkWindow* const gtkWindow(GTK_WINDOW(fWindow)); + CARLA_SAFE_ASSERT_RETURN(gtkWindow != nullptr,); + GtkWidget* const widget((GtkWidget*)kClient->getWidget()); gtk_container_add(GTK_CONTAINER(fWindow), widget); - gtk_window_set_resizable(GTK_WINDOW(fWindow), kClient->isResizable()); - gtk_window_set_title(GTK_WINDOW(fWindow), kWindowTitle); - - if (const char* const winIdStr = std::getenv("ENGINE_OPTION_FRONTEND_WIN_ID")) - { - if (const long long winId = std::strtoll(winIdStr, nullptr, 16)) - { -#ifdef CARLA_OS_LINUX - if (GdkWindow* const gdkWindow = GDK_WINDOW(fWindow)) - { - if (GdkDisplay* const gdkDisplay = gdk_window_get_display(gdkWindow)) - { - ::Display* const display(gdk_x11_display_get_xdisplay(gdkDisplay)); -# ifdef BRIDGE_GTK3 - ::XID const xid(gdk_x11_window_get_xid(gdkWindow)); -# else - ::XID xid = 0; - if (GdkDrawable* const gdkDrawable = GDK_DRAWABLE(fWindow)) - xid = gdk_x11_drawable_get_xid(gdkDrawable); -# endif - if (display != nullptr && xid != 0) - XSetTransientForHint(display, xid, static_cast<::Window>(winId)); - } - } -#else - (void)winId; -#endif - } - } + gtk_window_set_resizable(gtkWindow, kClient->isResizable()); + gtk_window_set_title(gtkWindow, kWindowTitle); if (showUI || fNeedsShow) { @@ -115,6 +90,7 @@ public: g_timeout_add(30, gtk_ui_timeout, this); g_signal_connect(fWindow, "destroy", G_CALLBACK(gtk_ui_destroy), this); + g_signal_connect(fWindow, "realize", G_CALLBACK(gtk_ui_realize), this); // First idle handleTimeout(); @@ -182,6 +158,17 @@ protected: fWindow = nullptr; } + void handleRealize() + { + carla_debug("CarlaBridgeToolkitGtk::handleRealize()"); + +#ifdef CARLA_OS_LINUX + if (const char* const winIdStr = std::getenv("ENGINE_OPTION_FRONTEND_WIN_ID")) + if (const long long winId = std::strtoll(winIdStr, nullptr, 16)) + setTransient(winId); +#endif + } + gboolean handleTimeout() { if (fWindow != nullptr) @@ -201,6 +188,36 @@ protected: return true; } +#ifdef CARLA_OS_LINUX + void setTransient(const uintptr_t winId) + { + CARLA_SAFE_ASSERT_RETURN(fWindow != nullptr,); + carla_debug("CarlaBridgeToolkitGtk::setTransient(0x" P_UINTPTR ")", winId); + + GdkWindow* const gdkWindow(gtk_widget_get_window(fWindow)); + CARLA_SAFE_ASSERT_RETURN(gdkWindow != nullptr,); + +# ifdef BRIDGE_GTK3 + GdkDisplay* const gdkDisplay(gdk_window_get_display(gdkWindow)); + CARLA_SAFE_ASSERT_RETURN(gdkDisplay != nullptr,); + + ::Display* const display(gdk_x11_display_get_xdisplay(gdkDisplay)); + CARLA_SAFE_ASSERT_RETURN(display != nullptr,); + + const ::XID xid(gdk_x11_window_get_xid(gdkWindow)); + CARLA_SAFE_ASSERT_RETURN(xid != 0,); +# else + ::Display* const display(gdk_x11_drawable_get_xdisplay(gdkWindow)); + CARLA_SAFE_ASSERT_RETURN(display != nullptr,); + + const ::XID xid(gdk_x11_drawable_get_xid(gdkWindow)); + CARLA_SAFE_ASSERT_RETURN(xid != 0,); +# endif + + XSetTransientForHint(display, xid, static_cast<::Window>(winId)); + } +#endif + // --------------------------------------------------------------------- private: @@ -218,6 +235,13 @@ private: gtk_main_quit_if_needed(); } + static void gtk_ui_realize(GtkWidget*, gpointer data) + { + CARLA_SAFE_ASSERT_RETURN(data != nullptr,); + + ((CarlaBridgeToolkitGtk*)data)->handleRealize(); + } + static gboolean gtk_ui_timeout(gpointer data) { CARLA_SAFE_ASSERT_RETURN(data != nullptr, false);