Bonjour
Est-ce vous pensez qu'il serait une bonne idée de développer mon pense-bête que je complète petit à petit pour en faire un article :
1) Mettre une fenêtre «*Niveaux supérieurs->Fenêtres*» («*Toplevels->Window*») sur l'écran principal.
2) Poser un contenant au choix sur la fenêtre pouvant contenir un menu (si le choix ne convient pas*: le supprimer et recommencer) .Je choisis «*boite*» («*Box*») dans «*Conteneur*» («*containers*») car la hauteur et la largeur s'adaptent automatiquement. Si j'ai besoin d'un autre conteneur pour placer mes futurs items, je les mettrai dans une case de la boite qui ne peut avoir que deux cases*: celle du menu et celle qui contient le conteneur que vous souhaitez avoir.
3) Je place le menu dans la boite du haut*: «*Barre de menu*» dans «*Conteneur*». Vous pouvez la mettre en bas si vous préférez, voir même à gauche ou à droite si vous modifiez la boite Général->Orientation->Horizontal.
4) Tester le système de fenêtres
a) Le programme C qui correspond*:
Le makefile*:
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 #include <stdio.h> #include <stdlib.h> #include <glib.h> #include <gtk/gtk.h> struct widgets { GtkWidget *window; }; void cb_quit(void); static void get_widgets(struct widgets *widgets, GtkBuilder *builder); int main(int argc, char **argv) { GtkBuilder *builder; GError *error = NULL; struct widgets *widgets; gtk_init(&argc, &argv); builder = gtk_builder_new(); if (!gtk_builder_add_from_file(builder, "test_menu1.glade", &error)) { g_warning("%s", error->message); exit(EXIT_FAILURE); } widgets = g_slice_new(struct widgets); get_widgets(widgets, builder); gtk_builder_connect_signals(builder, widgets); g_object_unref(G_OBJECT(builder)); g_signal_connect (widgets->window, "destroy", G_CALLBACK (cb_quit), NULL); gtk_widget_show(widgets->window); gtk_main(); g_slice_free(struct widgets, widgets); exit(EXIT_SUCCESS); } void cb_quit(void) { gtk_main_quit(); } static void get_widgets(struct widgets *widgets, GtkBuilder *builder) { widgets->window = GTK_WIDGET(gtk_builder_get_object(builder,"window1")); }
La compilation*:
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 CC=gcc CFLAGS= -Wshadow -Winit-self -Wredundant-decls -Wcast-align -Wundef -Wfloat-equal -Winline -Wunreachable-code -Wmissing-declarations -Wmissing-include-dirs -Wswitch-enum -Wswitch-default -Wmain -Wall `pkg-config gtk+-3.0 cflags` -export-dynamic LDFLAGS=`pkg-config gtk+-3.0 libs` -export-dynamic EXEC=test SRC= $(wildcard *.c) OBJ= $(SRC:.c=.o) all: $(EXEC) $(EXEC) : $(OBJ) $(CC) -o $@ $^ $(LDFLAGS) %.o: %.c $(CC) -o $@ -c $< $(CFLAGS) clean: rm *.o mrproper: clean rm $(EXEC)
L'exécution*:
Code : Sélectionner tout - Visualiser dans une fenêtre à part make
5) En l'état ça marche, mais quand je ferme la fenêtre, ça ne me rend pas la main dans la ligne de commande.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ./test
6) Connecter les signaux
C'est pour cela que l'option -export-dynamic est indispensable lors de la compilation. Sinon, les signaux du fichier glade n'arrivent pas à se connecter.
a) fermer gtk après la fermeture de la fenêtre
Il faut sélectionner la fenêtre d'origine et l'onglet Signaux->GtkWidjet->destroy. Dans gestionnaire, j'ai mis le nom de la fonction qui ferme gtk*: cb_quit .
b) Tester un item du menu
Je choisis le premier item du premier menu. Voici la liste des fenêtres à ouvrir*: windows1->box1->menuitem1->menu1>imagemenuitem1 . Je vais dans l'onglet signaux->activate et j'indique la fonction «*affiche*» dans le gestionnaire. Je la rajoute dans mon main*:
Dès que j'active le premier item du menu, j'ai un «*1*» qui s'affiche dans la ligne de commande.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void affiche(GtkWidget *p_widget, gpointer param) { printf("1\n"); (void) p_widget; (void) param; }
Comprendre.
7) Lire l'arborescence du menu et des fenêtres.
Une petite fonction à améliorer*:
appelée comme ça*:
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 void arboscence(GtkWidget * window,unsigned short niveau) { GList * G_List; unsigned short i; guint nb_s,f; char espace[1024]; G_List= gtk_container_get_children(window); while (G_List) { for (i=0;i<niveau;i++) espace[i]=' '; espace [i]=0; printf("\n%s%s\n",espace,gtk_widget_get_name(G_List->data)); //if ( !GTK_IS_ACCEL_LABEL(G_List->data) && !GTK_IS_MENU_ITEM(G_List->data) && !GTK_IS_MENU_BAR(G_List->data) && !GTK_IS_BOX(G_List->data) ) { /* trouver la liste des propriétés d'un item */ GParamSpec ** l_spec=g_object_class_list_properties(G_OBJECT_GET_CLASS(G_List->data),&nb_s); for (f=0;f<nb_s;f++) /* afficher la liste des propriétés */ { printf("%s| %s \n",espace,l_spec[f]->name); } printf("%s|____________\n",espace); } if ( GTK_IS_CONTAINER(G_List->data) ) arboscence(G_List->data,niveau+1); G_List=G_List->next; } }
8) Modifier le menu avec glade
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 printf("%s\n",gtk_widget_get_name(widgets->window)); arboscence(widgets->window,1);
Dans la fenêtre où est affichée la hiérarchie des objets gtk, nous allons éditer les différents éléments du menu.
Sur la barre de menu, ou tout élément de ce menu*: clic droit sur Menubar->Edit, onglet Hiérarchie, nous ouvrons la boite de dialogue pour travailler le menu. Un clic droit sur un élément du menu ouvre une boite de dialogue
Ajout de boutons radio dans un menuitem
faire un clic droit sur l'entrée du menu et choisir «*ajouter un élément fils radio*» pour entrer un item radio de plus dans le menu ou sur un item du menu «*ajouter élément radio*» pour ajouter un item près l'item courant dans le menu. Les boutons radios doivent être regroupés en famille qui ne doit avoir qu'un et qu'un seul élément sélectionné. Pour ceci, il faut sélectionner un bouton radio, dans l'onglet hiérarchie, à la propriété groupe cliquer sur le bouton de droite*: tous les boutons radios apparaissent avec une cache à cocher à gauche (sauf celui sur lequel on travaille), activer la cache d'un bouton qui est dans son groupe et valider.
Vous pouvez aller dans la fenêtre principale de glade pour tester le groupe de bouton. Attention, il se peut qu'avant la création du groupe vous ayez sélectionné plusieurs boutons radio du groupe*: ils seront encore sélectionnés, commencez à réduire à un le nombre de boutons radios activés en cliquant sur les boutons sélectionnés.
Menu de Fichiers récents
Il faut rajouter un fils à un item Élément. Si cet élément ne peut pas avoir de fils, vous aurez alors une fenêtre qui s'ouvrira pour vous prévenir. Ce menu peut être mis par exemple sur un élément image ou un élément normal.
On peut ensuite effectuer un tri sur les fichiers récents*: par défaut il n'y en a pas. Il faut sélectionner l'entrée Menu de fichiers récents (recentchoosemenu) dans la fenêtre «*inspecteur*» et ensuite dans la fenêtre «*propriétés*» choisir un filtre. S'il n'y en a pas ou si vous en voulez un nouveau cliquez sur [nouveau]. Affectez le bon filtre à votre menu.
Après, il faut configurer le filtre. Dans la fenêtre «*inspecteur*», le filtre est apparu en bas*: cliquez dessus et confectionnez votre filtre. Le type MIME indiquera les type que vous souhaiter voir apparaître «*text/plain*» ou «*image/**» par exemple. L'entrée Motifs fera un filtre sur vos fichiers comme «**.add*» ou «**.pers*». Attention, vous afficherez les fichiers validant au moins une des conditions.
Pour les autres éléments la manipulation est la même, mais un peu plus simple*: il n'y a pas à créer de groupe. La différence entre un «*élément image*» («*imagemenuitem*») et un «*élément normal*» («*menuitem*») est qu'on peut attribuer une image au premier un dessin qui sera soit une image prédéfinie («*élément de la collection*») ou une image personnelle («*Étiquette et image personnalisées*»).
Quoi qu'il en soit, on peut modifier après coup le type d'entrée avec l'entrée type juste en dessous du nom.
9) Le fichier xml généré.
C'est un fichier xml assez facilement compréhensible et modifiable.
10) Rajouter/modifier la configuration avec le programme.
A ) Rajouter élément dans arborescence hors menu
Si vous avez utilisé glade juste pour faire votre menu, vous pouvez ensuite facilement construire votre fenêtre.
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 G_List= gtk_container_get_children(GTK_CONTAINER(widgets->window)); while ( !GTK_IS_BOX(G_List->data) ) { G_List=G_List->next; } /* le fichier est conçu pour que le menu soit dans un vbox, en dessous, on met ce qu'on veut */ if ( GTK_IS_BOX(G_List->data) ) { /* ici, je mets un bouton */ bouton = gtk_button_new_with_label ("test"); gtk_box_pack_start (GTK_BOX (G_List->data), bouton, TRUE, TRUE, 0); gtk_widget_show(bouton); } else { printf("problème\n"); }
Partager