2016-05-03 9 views
1

Gibt es einen Weg oder einen Hack, um ein GTK + 3 transparentes Fenster ohne einen Kompositionsmanager in Linux zu erstellen? Ich möchte eine GtkWindow unsichtbare (Null Alpha) mit sichtbaren Childs Objekte. Ich habe versucht gtk_widget_set_opacity(window, 0.0); und andere Dinge, aber es hat nicht funktioniert.GTK3 Fenster transparent

Ich benutze Arch Linux mit OpenBox. Entschuldigung für mein Englisch.

EDIT

Ich habe meine Fenster mit GDK_WINDOW_TYPE_HINT_DESKTOP Flagge erstellt so mein Fenster immer auf dem Desktop sein wird, und ich denke, die Art und Weise, was ich zu tun möchte, ist Desktop-Hintergrund erhalten und mit diesem Bild mein Fenster Hintergrund zeichnen. Es ist möglich, dies zu tun?

+2

Sie mögen [** Wie ein GtkWindow Hintergrund transparent auf Linux machen? **] (http://stackoverflow.com/questions/16832581/how-to-make-a-gtkwindow-Hintergrund-transparent-on-linux). –

+0

Es funktioniert nicht, das Ergebnis ist ein schwarzes Fenster. – vaati

+0

Das ist der einzige Nachteil der schnellen API-Änderungen an der GTK3.X-Bibliothek. Sie müssen nur den Code dort mit den aktuellen * neuen Funktionen * und * veralteten Funktionen * zwischen der Version, für die diese Version verwendet wurde, und der Version, die Sie verwenden, vergleichen. Es kann auch Probleme mit Desktop- und Window-Manager-Fähigkeiten geben. (mit Arch sind Sie auf der absolut neuesten Version ~ 'gtk3 3.20.3-1' und das Beispiel war' 3.10', wenn ich mich richtig erinnere) –

Antwort

1

Sie können ein Fenster ohne einen Compositing-Manager, der die GtkWidget:opacity-Eigenschaft verwendet, nicht transparent machen.

Die einzige Möglichkeit, es auf X11 transparent zu machen, besteht darin, den Inhalt des Stammfensters an den Koordinaten des Fensters zu lesen und dann den Inhalt als Hintergrundmuster für das Fenster zu verwenden. Dies funktioniert nicht, wenn Ihr Fenster über anderen Fenstern gestapelt ist, aber das ist, was Sie erhalten, wenn Sie keinen Compositing-Manager verwenden.

0

Ich weiß nicht, ob dies Ihnen helfen können

#include <cairo.h> 
#include <gtk/gtk.h> 

static void do_drawing(cairo_t *); 


static void tran_setup(GtkWidget *win) 
{ 
    GdkScreen *screen; 
    GdkVisual *visual; 

    gtk_widget_set_app_paintable(win, TRUE); 
    screen = gdk_screen_get_default(); 
    visual = gdk_screen_get_rgba_visual(screen); 

    if (visual != NULL && gdk_screen_is_composited(screen)) { 
    gtk_widget_set_visual(win, visual); 
    } 
} 

static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, 
        gpointer user_data) 
{ 
    do_drawing(cr); 

    return FALSE; 
} 

static void do_drawing(cairo_t *cr) 
{ 
    cairo_set_source_rgba(cr, 0.2, 0.2, 0.2, 0.4); 
    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); 
    cairo_paint(cr); 
} 

int main (int argc, char *argv[]) 
{ 
    GtkWidget *window; 
    GtkWidget *darea; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 

    tran_setup(window); 

    darea = gtk_drawing_area_new(); 
    gtk_container_add(GTK_CONTAINER (window), darea); 

    g_signal_connect(G_OBJECT(darea), "draw", 
      G_CALLBACK(on_draw_event), NULL); 
    g_signal_connect(window, "destroy", 
      G_CALLBACK(gtk_main_quit), NULL); 

    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 250); 
    gtk_window_set_title(GTK_WINDOW(window), "Transparent window"); 

    gtk_widget_show_all(window); 

    gtk_main(); 

    return 0; 
} 
+0

Danke für die Hilfe, aber es hat nicht funktioniert, Ergebnis ist ein schwarzer Bildschirm. – vaati

+0

Was ist deine Distribution? Hast du einen Kompositionsmanager? – vaati

+0

distro ubuntu 16.04 – Sciamano