Browse Source

gtk2 fixes

tags/1.9.6
falkTX 10 years ago
parent
commit
229de81fe8
1 changed files with 54 additions and 30 deletions
  1. +54
    -30
      source/bridges-ui/CarlaBridgeToolkitGtk.cpp

+ 54
- 30
source/bridges-ui/CarlaBridgeToolkitGtk.cpp View File

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


Loading…
Cancel
Save