| @@ -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); | |||