GTK have feature called "socket". If easily, it's feature for share GTK widgets between few processes.
There are 2 examples.
PARENT.c - drawing simple GTK window with gradient semi-transparent background, and inserting socket into it.
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#include <gtk/gtksocket.h>
#include <gtk/gtkplug.h>
int main(int argc, char *argv[]) {
GtkWidget *window;
GtkCssProvider *provider;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GdkScreen *screen = gtk_widget_get_screen(window);
GdkVisual *visual = gdk_screen_get_rgba_visual(screen);
gtk_widget_set_visual(window, visual);
gtk_window_set_title(GTK_WINDOW(window), "Green Window");
gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
provider = gtk_css_provider_new();
gtk_css_provider_load_from_data(provider,"window {background: linear-gradient(to bottom right, blue, pink); opacity: 0.5;}",-1, NULL);
gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),GTK_STYLE_PROVIDER(provider),GTK_STYLE_PROVIDER_PRIORITY_USER);
GtkWidget* socket = gtk_socket_new();
GtkWidget * box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,1);
gtk_container_add(box, socket);
gtk_container_add(window, box);
uint64_t win = gtk_socket_get_id(GTK_WIDGET(socket));
printf("%d \n", win);
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
CHILD.c - connecting to socket created by previous PARENT.c, and inserting there simple red almost transparent button.
#include <gtk/gtk.h>
#include <gtk/gtkx.h>
#include <gtk/gtksocket.h>
#include <gtk/gtkplug.h>
int main(int argc, char *argv[]) {
gtk_init(&argc, &argv);
GtkWidget *window = gtk_plug_new(46137351); // XID returned by PARENT.c
GdkScreen *screen = gtk_widget_get_screen(window);
GdkVisual *visual = gdk_screen_get_rgba_visual(screen);
gtk_widget_set_visual(window, visual);
gtk_widget_set_app_paintable(window, FALSE);
GtkWidget* button = gtk_button_new_with_label ("Test");
GtkCssProvider *provider = gtk_css_provider_new();
gtk_css_provider_load_from_data(provider,"#button {background-color: red; opacity: 0.0;} #win {background-color: green; opacity: 0;}",-1, NULL);
gtk_style_context_add_provider_for_screen(gdk_screen_get_default(),GTK_STYLE_PROVIDER(provider),GTK_STYLE_PROVIDER_PRIORITY_USER);
gtk_widget_set_name(button, "button");
gtk_widget_set_name(window, "win");
gtk_container_add(GTK_CONTAINER(window), button);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
Opacity is works, button\socket are transparent.
What I have: opacity of button affects also parent window and doing it transparent too, so we are see desktop's content.
What I expected: opacity of button\socket (or any children widget under socket) should apply only to itself, not to parents.
On example image below, you can see window with semi-transparent gradient background; transparent button at left side of window, but under button is not window's gradient background, but content under window.
