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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.