How to set transparent background for gtk_plug_new window

24 Views Asked by At

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.

enter image description here

0

There are 0 best solutions below