+
+ if ( styleChanges & wxFRAME_NO_TASKBAR )
+ {
+ gtk_window_set_skip_taskbar_hint(GTK_WINDOW(m_widget),
+ m_windowStyle & wxFRAME_NO_TASKBAR);
+ }
+}
+
+/* Get the X Window between child and the root window.
+ This should usually be the WM managed XID */
+static Window wxGetTopmostWindowX11(Display *dpy, Window child)
+{
+ Window root, parent;
+ Window* children;
+ unsigned int nchildren;
+
+ XQueryTree(dpy, child, &root, &parent, &children, &nchildren);
+ XFree(children);
+
+ while (parent != root) {
+ child = parent;
+ XQueryTree(dpy, child, &root, &parent, &children, &nchildren);
+ XFree(children);
+ }
+
+ return child;
+}
+
+bool wxTopLevelWindowGTK::SetTransparent(wxByte alpha)
+{
+ if (!m_widget || !m_widget->window)
+ return false;
+
+ Display* dpy = GDK_WINDOW_XDISPLAY (m_widget->window);
+ // We need to get the X Window that has the root window as the immediate parent
+ // and m_widget->window as a child. This should be the X Window that the WM manages and
+ // from which the opacity property is checked from.
+ Window win = wxGetTopmostWindowX11(dpy, GDK_WINDOW_XID (m_widget->window));
+
+
+ // Using pure Xlib to not have a GTK version check mess due to gtk2.0 not having GdkDisplay
+ if (alpha == 0xff)
+ XDeleteProperty(dpy, win, XInternAtom(dpy, "_NET_WM_WINDOW_OPACITY", False));
+ else
+ {
+ long opacity = alpha * 0x1010101L;
+ XChangeProperty(dpy, win, XInternAtom(dpy, "_NET_WM_WINDOW_OPACITY", False),
+ XA_CARDINAL, 32, PropModeReplace,
+ (unsigned char *) &opacity, 1L);
+ }
+ XSync(dpy, False);
+ return true;
+}
+
+bool wxTopLevelWindowGTK::CanSetTransparent()
+{
+ // allow to override automatic detection as it's far from perfect
+ static const wxChar *SYSOPT_TRANSPARENT = wxT("gtk.tlw.can-set-transparent");
+ if ( wxSystemOptions::HasOption(SYSOPT_TRANSPARENT) )
+ {
+ return wxSystemOptions::GetOptionInt(SYSOPT_TRANSPARENT) != 0;
+ }
+
+#if GTK_CHECK_VERSION(2,10,0)
+ if (!gtk_check_version(2,10,0))
+ {
+ return (gtk_widget_is_composited (m_widget));
+ }
+ else
+#endif // In case of lower versions than gtk+-2.10.0 we could look for _NET_WM_CM_Sn ourselves
+ {
+ return false;
+ }
+
+#if 0 // Don't be optimistic here for the sake of wxAUI
+ int opcode, event, error;
+ // Check for the existence of a RGBA visual instead?
+ return XQueryExtension(gdk_x11_get_default_xdisplay (),
+ "Composite", &opcode, &event, &error);
+#endif
+}
+
+void wxTopLevelWindowGTK::OnSysColourChanged(wxSysColourChangedEvent& event)
+{
+ // We don't know the order in which top-level windows will
+ // be notified, so we need to clear the system objects
+ // for each top-level window.
+ extern void wxClearGtkSystemObjects();
+ wxClearGtkSystemObjects();
+
+ // wxWindowBase::OnSysColourChanged will propagate event
+ // to children
+ event.Skip();