PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit GDK Bildchen auf das Root Window malen



Trillian
01-12-2002, 19:37
Hallo,
ich möchte mit GDK ein Bitmap aufs Rootwindow zeichnen, habe aber von XLib Programmierung garkeine Ahnung, deswegen aheb ich da noch so meine Schwierigkeiten ;)

Ich bin soweit, dass ich GdkBitmap habe, weiss aber nicht, wie das nun aufs Rootwindow kommen soll. Wenn jemand eine kleine Beispiel-Anwendung kennt, die das macht, würd mir das auch schon weiterhelfen :D

Danke

tkortkamp
01-12-2002, 21:27
Vielleicht helfen dir
http://mail.gnome.org/archives/gtk-list/2000-August/msg00237.html
http://mail.gnome.org/archives/gtk-list/2000-August/msg00238.html
weiter.

c ya,
Tobias

tkortkamp
01-12-2002, 21:42
Der Image Viewer kann auch Bilder auf dem Root Window darstellen
http://wolfpack.twu.net/utilities.html



Auschnitt aus main.c:
.
.
.
GdkWindow *root_win = (GdkWindow *)GDK_ROOT_PARENT();
GdkGC *gc = gdk_gc_new(root_win);

if((root_win != NULL) && (gc != NULL))
iv_put_image_to_root_centered(
root_win, gc,
(const guint8 *)data_rgba,
width, height, bpl, bpp,
IMGVIEW_FORMAT_RGBA
);
.
.
.
Auschnitt aus rootwin.c:
void iv_put_image_to_root_centered(
GdkWindow *root_window, GdkGC *gc,
const guint8 *data,
gint width, gint height, gint bpl, gint bpp,
gint format
)
{
gint rx, ry, rwidth, rheight, rdepth;
GdkPixmap *pixmap;


if((root_window == NULL) || (data == NULL) || (gc == NULL) ||
(width < 1) || (height < 1) || (bpl <= 0) || (bpp <= 0)
)
return;

/* Get size of root window. */
gdk_window_get_geometry(
root_window, &rx, &ry, &rwidth, &rheight, &rdepth
);
/* Root window size valid? */
if((rwidth < 1) || (rheight < 1))
return;

/* Create tempory GdkPixmap. */
pixmap = gdk_pixmap_new(root_window, rwidth, rheight, rdepth);
if(pixmap != NULL)
{
/* Put given data to the GdkPixmap. */
switch(bpp)
{
case 4:
gdk_draw_rgb_32_image(
(GdkDrawable *)pixmap, gc,
(rwidth / 2) - (width / 2),
(rheight / 2) - (height / 2),
width, height,
GDK_RGB_DITHER_NORMAL,
(guchar *)data,
bpl
);
break;

case 3:
gdk_draw_rgb_image(
(GdkDrawable *)pixmap, gc,
(rwidth / 2) - (width / 2),
(rheight / 2) - (height / 2),
width, height,
GDK_RGB_DITHER_NORMAL,
(guchar *)data,
bpl
);
break;
}

/* Set this pixmap to the root window. */
gdk_window_set_back_pixmap(
root_window, pixmap, FALSE
);
/* Redraw the root window. */
gdk_window_clear(root_window);

/* Unref the tempory GdkPixmap, the root window should keep
* one refcount that it will manage.
*/
gdk_pixmap_unref(pixmap);
pixmap = NULL;
}
}


c ya,
Tobias

Trillian
01-12-2002, 21:59
Danke dir, das hilft mir erstmal weiter :)

Trillian
02-12-2002, 17:06
Es klappt doch noch nicht :(

Folgender Code sollte eigentlich das Bild, das als Parameter angegeben wird, in das Rootwindow laden, tut er aber nicht. Prinzipiell sollte das so gehen, AFAIK ;)

Hast du eine Idee, warum das nicht funktioniert?
An unterschiedlichen Farbtiefen (Bild, Rootwindow) liegt es jedenfalls nicht.



#include <stdio.h>
#include <gdk/gdk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>

gint main(gint argc, gchar *argv[])
{
GdkWindow *root;
GdkPixbuf *pixbuf;
GdkPixmap *pixmap;
GdkPixmap *mask;

gdk_init(&argc, &argv);

if (!(root = GDK_ROOT_PARENT()))
{
printf("Root Window ist kaputt :(\n");
return 1;
}

if (!(pixbuf = gdk_pixbuf_new_from_file(argv[1], NULL)))
{
printf("Urks, konnte %s nicht laden!\n", argv[1]);
return 1;
}

gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &mask, 0);

if (!pixmap)
{
printf("Konnte kein pixmap erstellen!\n");
return 1;
}

gdk_window_set_back_pixmap(root, pixmap, FALSE);
gdk_window_clear(root);

return 0;
}

tkortkamp
04-12-2002, 20:33
:eek:

Hmm...
Eine Frage: Warum muss es überhaupt mit Gtk/Gdk sein? Unter nicht-X11-Systemen funktioniert das Ganze sowieso nicht mehr mehr, also was spricht gegen ein Xlib-Programm?

c ya,
Tobias

Trillian
04-12-2002, 21:29
Keine Xlib-Kenntnisse ;)
Und 'ne zusätzliche Bibliothek bräucht ich sowieso, wenn ich die Bilder nicht alle von Hand laden will (libpng, libjpeg, ...)

tkortkamp
05-12-2002, 20:05
Hab das zum Laufen bekommen!!



#include <stdio.h>
#include <gdk/gdk.h>
#include <gdk-pixbuf/gdk-pixbuf.h>

gint main(gint argc, gchar *argv[])
{
GdkWindow *root;
GdkPixbuf *pixbuf;
GdkPixmap *pixmap;
GdkPixmap *mask;

gtk_init(&argc, &argv); //gdk_init(&argc, &argv);

if (!(root = gdk_get_default_root_window()))
{
printf("Root Window ist kaputt \n");
return 1;
}

if (!(pixbuf = gdk_pixbuf_new_from_file(argv[1], NULL)))
{
printf("Urks, konnte %s nicht laden!\n", argv[1]);
return 1;
}

gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, &mask, 0);

if (!pixmap)
{
printf("Konnte kein pixmap erstellen!\n");
return 1;
}

gdk_window_set_back_pixmap(root, pixmap, FALSE);
gdk_window_show(root);
gdk_window_clear(root);

gtk_main(); //Da muss es noch was anderes geben für GDK?
return 0;
}


Natürlich beendet sich das Programm nicht...
Aber das musst du dann weitermachen :rolleyes:
c ya,
Tobias

Trillian
05-12-2002, 20:52
Hehe, ich habs mittlerweile auch rausgekriegt!

gdk_flush() :D