gdk kérdések

gdk kérdések

Hozzászólások

Sziasztok!

Mostanában el kezdtem gdk-t használó programokat írni, de már egyből problémákba is akadtam, kettőt fel is sorolnék:
Nem értem hogy mi a különbség a GdkPixmap és a GdkPixbuf struktúrák között (a forrást én is meg tudom nézni de arra lennék kíváncsi hogy használatukban mi a különbség).
Másik gondom az, hogy ha egy gdk_draw_pixbuf függvénynek GdkDrawable gyanánt a window->window-ot adom meg, akkor az miért nem működik, miért kell egy background-nak beállított GdkPixmap-et használni ehhez.
Na és egy utolsó: gdk-ban miért van mindennek a logikával ellentétes sorrendje, például miért a gdk_gc_set_clip_mask()-ot hívjuk meg először, aztán a gdk_gc_set_clip_origin()-t, miért nem fordítva.

Ha ezekre valaki nekem adna válaszokat akkor megköszönném.
Laci

[quote:47a827cca6="lacipac"]Sziasztok!

Mostanában el kezdtem gdk-t használó programokat írni, de már egyből problémákba is akadtam, kettőt fel is sorolnék:
Nem értem hogy mi a különbség a GdkPixmap és a GdkPixbuf struktúrák között (a forrást én is meg tudom nézni de arra lennék kíváncsi hogy használatukban mi a különbség).
Másik gondom az, hogy ha egy gdk_draw_pixbuf függvénynek GdkDrawable gyanánt a window->window-ot adom meg, akkor az miért nem működik, miért kell egy background-nak beállított GdkPixmap-et használni ehhez.
Na és egy utolsó: gdk-ban miért van mindennek a logikával ellentétes sorrendje, például miért a gdk_gc_set_clip_mask()-ot hívjuk meg először, aztán a gdk_gc_set_clip_origin()-t, miért nem fordítva.

Ha ezekre valaki nekem adna válaszokat akkor megköszönném.
Laci

Nos. Nem vagyok nagy GDK expert, de GTK-ba viszonylag sokat programoztam. Konkret megoldast nem irok :)

De javaslom a GDK API atbongeszeset (nem a forraset :) ) talan az segit,

http://developer.gnome.org/doc/API/2.0/gdk/index.html

Valamint javaslom az irc.gimp.org -> #gtk+ nevu csatornat. Ha okosan kerdez az ember es nem tunik lamanak :) es turelmes, akkor szoktak valaszolni es segitokeszek. Sok problemara talaltam mar "naluk" megoldast.

Ennyit tudok hirtelen javasloni. :)

udv
-krix-

Annak a 68 embernek aki megnézte a topicot: A
[code:1:c4398f2971]gdk_pixbuf_render_pixmap_and_mask (pixbufalpha, &pixmap, &mask, 1);
...
gdk_gc_set_clip_mask(gc, mask);
gdk_gc_set_clip_origin(gc, 5, 5);
[/code:1:c4398f2971]függvények feleslegesek voltak, és utána a pixbufalpha-t kellett kirajzolni.

GDK API-t mostanában elég nagy rendszerességgel olvasgattam, de sokra nem jutottam vele.
Megkérdezek valakit a #gtk+-on.

Mivel a #gtk+-on nem nagyon válaszoltak jó idő elteltével sem, ezért megkérdezem itt. Van a következő program, amivel a program végén a gdk_draw_drawable függvénnyel a pixmap-ot ki tudom rajzolni és működik a maszk is, de amint gdk_draw_pixbuf()-fal rajzolnám ki a pixbuf -ot akkor kirajzolja ugyan, de maszkot nem húz reá. Valaki aki tudja miért kérem informáljon fel.
Szóval a program:
[code:1:6325e19b57]
#include <gtk/gtk.h>

GtkWidget *window;
GdkPixmap *bg;
GdkGC *gc;

static gboolean delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
g_print ("delete event occurred\n");

return FALSE;
}

static void destroy(GtkWidget *widget, gpointer data)
{
gtk_main_quit ();
}

int main(int argc, char **argv)
{
GdkPixmap *pixmap;
GdkPixbuf *pixbuf, *pixbufalpha;
GdkBitmap *mask;

gtk_init(&argc, &argv);
gtk_set_locale();

pixbuf = gdk_pixbuf_new_from_file("main.png", NULL);
if (pixbuf == NULL) {
g_printerr("error loading file \n");
return 1;
}

pixbufalpha = gdk_pixbuf_add_alpha(pixbuf, TRUE, 0xFF, 0, 0xFF);
gdk_pixbuf_render_pixmap_and_mask (pixbufalpha, &pixmap, &mask, 1);
g_object_unref(pixbufalpha);

window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_realize(window);
if (window == NULL) {
g_printerr("window null\n");
return 1;
}
if (window->window == NULL) {
g_printerr("window->window NULL\n");
return 1;
}

gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
gtk_window_set_decorated(GTK_WINDOW(window), FALSE);
gtk_widget_set_app_paintable(window, TRUE);
g_signal_connect(G_OBJECT(window), "delete_event",
G_CALLBACK(delete_event), NULL);

g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(destroy), NULL);

gc = gdk_gc_new(window->window);
bg = gdk_pixmap_new(window->window,
gdk_pixbuf_get_width(pixbuf),
gdk_pixbuf_get_height(pixbuf),
gdk_visual_get_best_depth());

gtk_widget_set_usize(window,
gdk_pixbuf_get_width(pixbuf),
gdk_pixbuf_get_height(pixbuf));

gdk_draw_pixbuf(bg, gc, pixbuf, 0, 0, 0, 0, -1, -1, 0, 0, 0);
gdk_window_set_back_pixmap(window->window, bg, FALSE);
gtk_widget_shape_combine_mask(window, mask, 0, 0);

pixbuf = gdk_pixbuf_new_from_file("exit.png", NULL);
if (pixbuf == NULL) {
g_printerr("error loading file \n");
return 1;
}

mask= NULL;
pixbufalpha = gdk_pixbuf_add_alpha(pixbuf, TRUE, 0xFF, 0, 0xFF);
gdk_pixbuf_render_pixmap_and_mask (pixbufalpha, &pixmap, &mask, 1);
if (mask == NULL)
g_printerr("mask\n");

gdk_gc_set_clip_mask(gc, mask);
gdk_gc_set_clip_origin(gc, 5, 5);
gdk_draw_pixbuf(bg, gc, pixbuf, 0, 0, 5, 5, -1, -1, 0, 0, 0);

// g_object_unref(pixbufalpha);
// g_object_unref(mask);
// g_object_unref(pixbuf);

gtk_widget_show(GTK_WIDGET(window));
gtk_main();

return 0;
}
[/code:1:6325e19b57]

EDIT: És légyszi ne azt írjátok hogy "És miért nem jó a pixmap kirajzolása?" mert egy működő programban is így van megoldva és nagyon nem értem nálam miért nem működik. Köszi :wink: