Anzeige:
Ergebnis 1 bis 9 von 9

Thema: Mit GDK Bildchen auf das Root Window malen

  1. #1
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180

    Mit GDK Bildchen auf das Root Window malen

    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

    Danke

  2. #2
    Registrierter Benutzer
    Registriert seit
    10.04.2001
    Ort
    Bremen
    Beiträge
    339

  3. #3
    Registrierter Benutzer
    Registriert seit
    10.04.2001
    Ort
    Bremen
    Beiträge
    339
    Der Image Viewer kann auch Bilder auf dem Root Window darstellen
    http://wolfpack.twu.net/utilities.html

    Code:
    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

  4. #4
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    Danke dir, das hilft mir erstmal weiter

  5. #5
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    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.

    Code:
    #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;
    }

  6. #6
    Registrierter Benutzer
    Registriert seit
    10.04.2001
    Ort
    Bremen
    Beiträge
    339


    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

  7. #7
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    Keine Xlib-Kenntnisse
    Und 'ne zusätzliche Bibliothek bräucht ich sowieso, wenn ich die Bilder nicht alle von Hand laden will (libpng, libjpeg, ...)

  8. #8
    Registrierter Benutzer
    Registriert seit
    10.04.2001
    Ort
    Bremen
    Beiträge
    339
    Hab das zum Laufen bekommen!!
    Code:
    #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
    c ya,
    Tobias

  9. #9
    Registrierter Benutzer Avatar von Trillian
    Registriert seit
    26.04.2001
    Beiträge
    180
    Hehe, ich habs mittlerweile auch rausgekriegt!

    gdk_flush()

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •