X.org + GTK/GDK + Transparenz

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
devilx
Beiträge: 734
Registriert: 26.08.2003 22:57:20
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Filderstadt
Kontaktdaten:

X.org + GTK/GDK + Transparenz

Beitrag von devilx » 30.04.2005 13:10:00

Hi,

Ok, ich bin nun schon fast am verzweifeln. Ich benutzte X.org und moechte eine GTK/GDK Application gerne transparent werden lassen, und zwar mittels echter Transparenz. Ich habe bereits ueberall im IRC gefragt wie das gehen koennte, doch keine konnte mir eine Antwort darauf geben. Auch google findet nichts zu dem Thema. Bin ich etwa der einzige der seite Fenster transparent machen will, und zwar mit internem code und nicht durch den User mit transset? Naja, ich hoffe, dass wenigstens hier mir einer Helfen kann.
Ich habe mir bereits die sourcen des xcompmgr und des transset Programms angeschaut, verstehe den Code aus, nur kenne ich mich leider nicht mit den X11 Libraries aus, sodass ich nicht wiess wie ich mein GtkWindow in einen X11 Window Datentypen umwandeln kann, um so direct per X11 Library die Transparenz einzustellen.
Ich hoffe es kann mir jemand weiterhelfen.
Danke.

Bye
When you smile, the world smiles with you :)
When you fart, you stand alone :(
... a place full of dorkness

Benutzeravatar
devilx
Beiträge: 734
Registriert: 26.08.2003 22:57:20
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Filderstadt
Kontaktdaten:

Beitrag von devilx » 30.04.2005 13:49:42

Ok, kurze Zwischenmeldung: Habe mir nun was zusammengehackt.

Code: Alles auswählen

#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <string.h>
 
#define OPAQUE	0xffffffff
#define OPACITY	"_NET_WM_WINDOW_OPACITY"
 
 
gint main(void)
{
	GtkWidget *frmMain;
	GdkWindow *gdkwin;
	Window target_win;
	unsigned char *data;
	Atom actual;
  int format;
  unsigned long n, left;
  double d;
  unsigned int opacity;
  Display *dpy;
 
	gtk_set_locale ();
 	gtk_init (NULL,NULL);
 
 	frmMain=gtk_window_new(GTK_WINDOW_TOPLEVEL);
 	gtk_window_set_title((GtkWindow*)frmMain,"Display");
 	gtk_window_set_default_size((GtkWindow*)frmMain,400,400);
 
	gtk_widget_realize(frmMain);
 
	gdkwin = frmMain->window;
 
 	gdk_window_show(gdkwin);
 
 	dpy=GDK_WINDOW_XDISPLAY(gdkwin);
 	target_win=GDK_WINDOW_XID(gdkwin);
 
  opacity = (unsigned int) (d * OPAQUE);
  {
    XGetWindowProperty(dpy, target_win, XInternAtom(dpy, OPACITY, False), 
		       0L, 1L, False, XA_CARDINAL, &actual, &format, &n, &left, 
		 (unsigned char **) &data);
 
    if (data != None)
      {
	memcpy (&opacity, data, sizeof (unsigned int));
	XFree(( void *) data );
	printf("Found property: %g\n", (double) opacity / OPAQUE);
      }
    else
      opacity = OPAQUE;
 
    if (opacity != OPAQUE)
      opacity = OPAQUE;
    else
      opacity = 0xc0000000;
  }
 
  printf ("opacity 0x%x\n", opacity);
  if (opacity == OPAQUE)
    XDeleteProperty (dpy, target_win, XInternAtom(dpy, OPACITY, False));
  else
    XChangeProperty(dpy, target_win, XInternAtom(dpy, OPACITY, False), 
		    XA_CARDINAL, 32, PropModeReplace, 
		    (unsigned char *) &opacity, 1L);
  XSync(dpy, False);
  printf("Set Property to %g\n", (double) opacity / OPAQUE);
 
 	gtk_main();
 
 	return(0);
}
Es stuerzt nicht ab und produziert auch keine Fehler. Leider wird das Fenster aber auch nicht wirklich transparent. Da keine Error-Ausgaben entstehen weiss ich leider nicht so ganz wieso. Kann mir jemand helfen?

Ach ja, kompillieren kann man das ding mittels:

Code: Alles auswählen

gcc ./transparency.c -o ./transparency `pkg-config --cflags --libs gtk+-2.0` -Wall
Bye
When you smile, the world smiles with you :)
When you fart, you stand alone :(
... a place full of dorkness

Antworten