bonjour, je voudrais savoir s'il existe des signaux pour le redimensionnement d'une gtk_window (via le bouton redimensionner/restaurer ou via les bords de la fenêtre).
J'affiche un gdkpixbuf et j'aimerais le redimensionner automatiquement.
bonjour, je voudrais savoir s'il existe des signaux pour le redimensionnement d'une gtk_window (via le bouton redimensionner/restaurer ou via les bords de la fenêtre).
J'affiche un gdkpixbuf et j'aimerais le redimensionner automatiquement.
Bonjour,
Je dirais size-request ou size-allocate, à tester![]()
j'ai essayé sans succès...après j'ai certainement un problème dans mon code mais je ne le vois pas:
ma fenetre est difinit comme suit
et le callback est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 f->win=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(f->win),titre); gtk_window_set_position(GTK_WINDOW(f->win),GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(f->win),TRUE); gtk_widget_set_size_request(f->win,10,10); gtk_window_set_default_size(GTK_WINDOW(f->win),largeur,hauteur); gtk_container_set_border_width(GTK_CONTAINER(f->win),0); gtk_window_set_position(GTK_WINDOW(f->win),GTK_WIN_POS_CENTER_ON_PARENT); g_signal_connect(G_OBJECT(f->win),"size-request",G_CALLBACK(redim_int_fen),f); g_signal_connect(G_OBJECT(f->win),"destroy",G_CALLBACK(gtk_main_quit),NULL)
PS : je précise que le code marche sans le callback "redim_int_fen".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 void redim_auto(int n,fenetre *f) { int largeur=0,hauteur=0; if (n>=0) { if (abs(gdk_pixbuf_get_width(f->pixbuf_aff[n])-((f->onglets)->allocation.width-largeur_onglets))>auto_min) { largeur=1+((f->onglets)->allocation.width)-largeur_onglets; hauteur=1+(int)(gdk_pixbuf_get_height(f->pixbuf_aff[n])*(((f->onglets)->allocation.width)-largeur_onglets)/gdk_pixbuf_get_width(f->pixbuf_aff[n])); f->pixbuf_aff[n]=gdk_pixbuf_scale_simple(f->pixbuf[n],largeur,hauteur,GDK_INTERP_HYPER); gtk_image_set_from_pixbuf(GTK_IMAGE(f->images[n]),f->pixbuf_aff[n]); } if ((gdk_pixbuf_get_height(f->pixbuf_aff[n])-(((f->onglets)->allocation.height)-hauteur_onglets))>auto_min) { largeur=1+(int)(gdk_pixbuf_get_width(f->pixbuf_aff[n])*(((f->onglets)->allocation.height)-hauteur_onglets)/gdk_pixbuf_get_height(f->pixbuf_aff[n])); hauteur=1+((f->onglets)->allocation.height)-hauteur_onglets; f->pixbuf_aff[n]=gdk_pixbuf_scale_simple(f->pixbuf[n],largeur,hauteur,GDK_INTERP_HYPER); gtk_image_set_from_pixbuf(GTK_IMAGE(f->images[n]),f->pixbuf_aff[n]); } } } void redim_int_fen(GtkWidget *widget,GtkAllocation *allocation,gpointer d) { fenetre *f=(fenetre *) d; redim_auto(gtk_notebook_get_current_page(GTK_NOTEBOOK(f->onglets)),f); }
Tu n'expliques même pas ce qui ne marche pas. C'est à nous de deviner si ça ne compile pas, si ça plante à l'exécution, si tout semble fonctionner mais que ton callback ne fait pas ce que tu aimerais qu'il fasse, ... ? Est-ce que ton callback est appelé quand ut le souhaites déjà ?
Je rajouterai aussi qu'il serait bien plus simple de t'aider en ayant un code complet et simple : tu crées une fenêtre avec une fonction callback qui affiche un message avec g_print et c'est tout. ça limitera déjà les causes d'erreur.Envoyé par teuf13
c'est vrai que je n'est pas était trés clair ; ce qu'il ne marche pas ? le programme se lance puis selon le signal utilisé soit le callback ne fait rien soit le programme bloque ("size-allocate").
je suis en train de reprendre mon code pour autre chose, c'est pour ça que je n'ai pas fait un "programme test" ni posté l'intégralité de mon code (qui commence à être un peu long d'ailleurs).
Voilà ce que j'appelle un code simple et complet :
Bizarrement ça fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <gtk/gtk.h> static void size_request (void) { g_print ("OK\n"); } int main (int argc, char **argv) { GtkWidget *p_window = NULL; gtk_init (&argc, &argv); p_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (p_window), "delete-event", gtk_main_quit, NULL); g_signal_connect (G_OBJECT (p_window), "size-request", size_request, NULL); gtk_widget_show_all (p_window); gtk_main (); return 0; }
effectivement, après avoir regardé mon code, c'est ma fonction callback qui ne marche pas.
le prototype de la fonction callback est
le mien est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 void user_function (GtkWidget *widget, GtkRequisition *requisition, gpointer user_data)
le problème est au niveau de f mais je ne sais pas pourquoi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void redim_int_fen(GtkWidget *widget,GtkRequisition *requisition,gpointer d) { fenetre *f=(fenetre *) d; redim_auto(gtk_notebook_get_current_page(GTK_NOTEBOOK(f->onglets)),f); }
c'est étrange parce que j'arrive à accéder à f->win mais pas f->pixbuf[0].
Encore plus étrange, quand je (dé)maximise, il n'y a pas qu'un signal (c'est peut-être du à compiz..)
personne ?
avec le size-request, j'ai une erreur de segmentation :
voila mes sources : http://rniamo-filters.2007.fr/Rniamo-Imaging_banKl.zip(gdb) backtrace
#0 0xb774034c in memcpy () from /lib/tls/i686/cmov/libc.so.6
#1 0xb7b1d131 in gdk_pixbuf_copy () from /usr/lib/libgdk_pixbuf-2.0.so.0
#2 0x0805cf70 in redim_int_fen ()
#3 0xb78c6049 in g_cclosure_marshal_VOID__BOXED ()
from /usr/lib/libgobject-2.0.so.0
#4 0xb78b962b in g_closure_invoke () from /usr/lib/libgobject-2.0.so.0
#5 0xb78ca103 in ?? () from /usr/lib/libgobject-2.0.so.0
#6 0x080c5c30 in ?? ()
#7 0x00000000 in ?? ()
Encore une fois, compile avec -g3 -ggdb3 dans tes flags de compil, ça file des infos plus sympa... Visiblement, c'est ton tableau de pixbuf dans tes f->pixbuf[..] qui contient des données incorrectes, c'est à toi d'essayer de comprendre pourquoi... Par exemple en mettant des printf un peu partout dans ton code, en particulier dans les parties de code qui sont censées initialiser ce tableau.
je n'ai rien de plus avec cette option de compilation...
sinon pourquoi mes f->pixbuf seraient incorrecte alors que le programme marche sans la ligne "size-request".
Si, tu auras des trucs en plus sur cette ligne (après avoir fait un make clean pour que le programme soit recompilé)
#2 0x0805cf70 in redim_int_fen ()
C'est peut être le seul endroit où tu as du code qui essaie de lire le contenu du pixbuf. Ca peut aussi être de la chance. Ou bien le bug peut être autre part. Mais tout ça, c'est à toi de creuser un peuDes printf des adresses des différents objets que tu crées, de l'adresse de f->pixbuf, ... à divers endroits de ton programme peuvent te permettre de vérifier que le programme fait bien ce que tu penses, et que tu manipules bien les objets que tu penses.
pour les printf, je regarderais dans une dizaine de jours (pas trop le temps avant) mais en ajoutant tes options de compilation dans le makefile, je n'ai pas eu plus d'information, je les ait peut-être mal placée :
PS : je me demande si mon problème de pixbuf ne vient pas de la fonction callback. Je veux récupérer une donnée autre (f) via le gpointer mais je ne sais pas trop quoi faire du gtkrequisition
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 # Makefile Rniamo-Imaging # Chemins : DSRC = 0_src DINC = 1_inc DOBJ = 2_obj DEXE = 3_exe DLIB = /usr/include # drapeaux de compilation CFLAGS = -I$(DINC) # Outils CC = gcc -c -g3 -ggdb3 -Wall $(CFLAGS) CO = gcc -o RM = rm CR = mkdir -p CP = cp DROITS = chmod -R 777 # Liste du projet OBJS = $(DOBJ)/def.o \ $(DOBJ)/conversions-operations.o \ $(DOBJ)/filtres_interfaces.o \ $(DOBJ)/filtres.o \ $(DOBJ)/interface.o \ $(DOBJ)/main.o \ # Tout construire all : $(DEXE)/image # Installer install : @$(CR) ~/.Rniamo && \ $(CR) ~/.Rniamo/Images && \ $(CP) -R $(DEXE)/Images/* ~/.Rniamo/Images && \ $(CP) $(DEXE)/Rniamo-Imaging /usr/bin && \ $(DROITS) ~/.Rniamo/ \ # Désinstaller uninstall : @$(RM) /usr/bin/Rniamo-Imaging && \ $(RM) -R ~/.Rniamo \ # Tout nettoyer clean : @$(RM) $(DOBJ)/*.o && \ $(RM) $(DEXE)/Rniamo-Imaging \ # Cible principale $(DEXE)/image : $(OBJS) @$(CO) $(DEXE)/Rniamo-Imaging $(OBJS) `pkg-config --cflags --libs gtk+-2.0` # Objets $(DOBJ)/def.o : @$(CC) $(DSRC)/def.c -o$(DOBJ)/def.o `pkg-config --cflags gtk+-2.0` $(DOBJ)/conversions-operations.o : @$(CC) $(DSRC)/conversions-operations.c -o$(DOBJ)/conversions-operations.o `pkg-config --cflags gtk+-2.0` $(DOBJ)/filtres.o : @$(CC) $(DSRC)/filtres.c -o$(DOBJ)/filtres.o `pkg-config --cflags gtk+-2.0` $(DOBJ)/filtres_interfaces.o : @$(CC) $(DSRC)/filtres_interfaces.c -o$(DOBJ)/filtres_interfaces.o `pkg-config --cflags gtk+-2.0` $(DOBJ)/interface.o : @$(CC) $(DSRC)/interface.c -o$(DOBJ)/interface.o `pkg-config --cflags gtk+-2.0` $(DOBJ)/main.o : @$(CC) $(DSRC)/main.c -o$(DOBJ)/main.o `pkg-config --cflags gtk+-2.0`
j'ai modifié mon code pour juste récupérer un entier mais sans succès :
j'obtient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 void redim_int_fen(GtkWidget *window, GtkRequisition *requisition, gpointer d) { /*fenetre *f=(fenetre *) d; int n=gtk_notebook_get_current_page(GTK_NOTEBOOK(f->onglets)); f->pixbuf_aff[n]=gdk_pixbuf_copy(f->pixbuf[n]); gtk_image_set_from_pixbuf(GTK_IMAGE(f->images[n]),f->pixbuf[n]); gtk_widget_show_all(f->win);*/ int *v=(int *) d; g_print("%d-adresse :%d\n",*v,(int)v); } void creation_fenetre(fenetre *f,const gchar *titre,int largeur,int hauteur) { int i=0; gchar *home; home=getenv("HOME"); f->win=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(f->win),titre); gtk_window_set_position(GTK_WINDOW(f->win),GTK_WIN_POS_CENTER); gtk_window_set_resizable(GTK_WINDOW(f->win),TRUE); gtk_widget_set_size_request(f->win,10,10); gtk_window_set_default_size(GTK_WINDOW(f->win),largeur,hauteur); gtk_container_set_border_width(GTK_CONTAINER(f->win),0); gtk_window_set_position(GTK_WINDOW(f->win),GTK_WIN_POS_CENTER_ON_PARENT); int valeur_bidon=69; g_signal_connect(G_OBJECT(f->win),"size-request",G_CALLBACK(redim_int_fen),&valeur_bidon); //////*********ICI************/////////// g_signal_connect(G_OBJECT(f->win),"destroy",G_CALLBACK(gtk_main_quit),NULL); ... }
69-adresse :-1075831464
69-adresse :-1075831464
-1211015269-adresse :-1075831464
-1211015269-adresse :-1075831464
Ecoute, ton "les printf je verrai ça dans 15 jours", je comprends ça comme "j'ai pas vraiment envie de passer du temps à debugger mon code maintenant, je vous laisse passer qques heures dessus à ma place", donc t'es bien gentil, mais personnellement j'ai ni le temps ni l'envie de faire ça.
faut plutôt comprendre ça comme "les printf c'est long et en ce moment l'info c'est juste entre deux révisions pour les rattrapages".
Concernant le problème de compilation du petit code c'est just le G_CALLBACK() qui manque. par contre dans mon programme la valeur pointée passé à la fonctionchange de valeur : j'obtient 2 fois la bonne puis aprés elle est différente (mais constante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part g_signal_connect(G_OBJECT(f->win),"size-request",G_CALLBACK(redim_int_fen),&valeur_bidon);
bon j'ai un peu avancé mais j'ai un autre problème :
la fonction callback est constemment en fonctionnement...mais j'ai pas de boucle apparente
le code en faute est :
si je met un printf à la place du if {} c'est bon.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void redim_int_fen(GtkWidget *window, GtkRequisition *requisition, gpointer d) { fenetre *f=(fenetre *) d; int n=gtk_notebook_get_current_page(GTK_NOTEBOOK(f->onglets)); printf("%d\n",n); if (n>=0) { f->pixbuf_aff[n]=gdk_pixbuf_new_from_file("/home/rniamo/image.jpg",NULL); gtk_image_set_from_pixbuf(GTK_IMAGE(f->images[n]),f->pixbuf_aff[n]);printf("oui\n"); } }
Edit : la ligne en faute est gtk_image_set_from_pixbuf(GTK_IMAGE(f->images[n]),f->pixbuf_aff[n]);printf("oui\n");
Partager