| 12
 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
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 
 | #include <gtk/gtk.h>
#include <string.h>
 
// Déclaration en global. Comme on peut le voir pas de déclaration autre!
GSList *liste=NULL;
 
/******************************************************************************/
/* Les fonctions qui permettent la gestion des widget en fct d'un nom         */
/******************************************************************************/
GSList *gtk_data_list_add_by_name(GSList *list, gpointer data, gchar *name)
{
	/* Déclaration d'une structure interne pour mémoriser le pointeur du widget
	ainsi que son nom.*/
	struct Struct_list_widget
	{
		gpointer Sdata;
		gchar *Sname;
	};
	struct Struct_list_widget *Slist_widget=NULL;
 
	// Allocation mémoire d'une nouvelle structure. Le transtypage n'est
	// nécessaire que si vous compilez en C++.
	Slist_widget=(struct Struct_list_widget*)
		g_malloc(sizeof(struct Struct_list_widget));
	// Affection des valeurs
	Slist_widget->Sdata=data;
	Slist_widget->Sname=g_strdup(name);
 
	// Ajout des nouvelles données à la liste.
	list=g_slist_append(list, Slist_widget);
 
	return list;
}
 
GSList *gtk_data_list_remove_by_name(GSList *list, gchar *name)
{
	GSList *tmp_list=NULL;
	/* Déclaration d'une structure interne pour mémoriser le pointeur du widget
	ainsi que son nom.*/
	struct Struct_list_widget
	{
		gpointer Sdata;
		gchar *Sname;
	};
 
	// Recherche de l'objet dans la liste
	tmp_list=list;
	while (tmp_list)
	{
		if (strcmp(((struct Struct_list_widget*)(tmp_list->data))->Sname,name)==0)
		{
			// Supression de l'objet
			g_free(((struct Struct_list_widget*)(tmp_list->data))->Sname);
			g_free((struct Struct_list_widget*)(tmp_list->data));
			list=g_slist_remove_link(list, tmp_list);
			g_slist_free_1(tmp_list);
			return list;
		}
		tmp_list=g_slist_next(tmp_list);
	}
 
	return NULL;
}
 
gpointer *gtk_data_list_get_by_name(GSList *list, gchar *name)
{
	GSList *tmp_list=NULL;
	/* Déclaration d'une structure interne pour mémoriser le pointeur du widget
	ainsi que son nom.*/
	struct Struct_list_widget
	{
		gpointer Sdata;
		gchar *Sname;
	};
 
	// Recherche de l'objet dans la liste
	tmp_list=list;
	while (tmp_list)
	{
		if (strcmp(((struct Struct_list_widget*)(tmp_list->data))->Sname,name)==0)
			return ((struct Struct_list_widget*)(tmp_list->data))->Sdata;
		tmp_list=g_slist_next(tmp_list);
	}
 
	return NULL;
}
 
void gtk_data_list_remove_all(GSList *list)
{
	GSList *tmp_list=list;
	/* Déclaration d'une structure interne pour mémoriser le pointeur du widget
	ainsi que son nom.*/
	struct Struct_list_widget
	{
		gpointer Sdata;
		gchar *Sname;
	};
 
	while (tmp_list)
	{
		// Supression de l'objet
		g_free(((struct Struct_list_widget*)(tmp_list->data))->Sname);
		g_free((struct Struct_list_widget*)(tmp_list->data));
		tmp_list=g_slist_next(tmp_list);
	}
	g_slist_free(list);
}
 
/******************************************************************************/
 
void fenetre_fille()
{
	GtkWidget *Window_parent;
	GtkWidget *Window_fille;
 
	/* Nous allons tout d'abord récupérer le GtkWidget de la fenêtre principale
     en fonction du nom donné dans la fonction main();.
	   Remarque importante : du fait que la donnée transmise est du type gpointer
	   il faut transtyper cette donnée lors de sa récupération.*/
	Window_parent=(GtkWidget*)gtk_data_list_get_by_name(liste, "fenetre principale");
 
	// Création de la fenêtre fille
	Window_fille = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(Window_fille), "Fenêtre fille");
	gtk_window_set_default_size(GTK_WINDOW(Window_fille), 400, 300);
	// Ici j'utilise le GtkWidget de la fenêtre parente récupérer dans la liste.
	gtk_window_set_transient_for(GTK_WINDOW(Window_fille), GTK_WINDOW(Window_parent));
 
	// Signaux associées à la fenêtre fille pour la fermer.
	g_signal_connect(G_OBJECT(Window_fille), "destroy", G_CALLBACK(gtk_widget_destroy), NULL);
	g_signal_connect(G_OBJECT(Window_fille), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL);
 
	// Affichage de la fenêtre fille
	gtk_widget_show_all(Window_fille);
}
 
/******************************************************************************/
/* Nous déclarons ici un GtkWidget *pWindow. Nous l'ajout à la liste avec le  */
/* nom "fenetre principale".                                                  */
/******************************************************************************/
gint main(int argc, char **argv)
{
	GtkWidget *pWindow;
 
	// Initialisation des librairies GTK+
	gtk_init(&argc, &argv);
 
	// Création d'une fenêtre principale.
	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(pWindow), "Fenêtre principale");
	gtk_window_set_default_size(GTK_WINDOW(pWindow), 800, 600);
 
	// Mémorisation du pointeur pWindow dans la liste.
	liste=gtk_data_list_add_by_name(liste, pWindow, "fenetre principale");
 
	// Signaux associées à la fenêtre principale pour quitter.
	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(G_OBJECT(pWindow), "delete_event", G_CALLBACK(gtk_main_quit), NULL);
 
	/* Appel d'une fonction pour créer une deuxième fenêtre fille de pWindow.
	   Il serait possible de transmettre directement pWindow mais ce n'est le but
	   de cet exemple!*/
	fenetre_fille();
 
	// Boucle principale GTK+
	gtk_widget_show_all(pWindow);
	gtk_main();
 
	// On supprime la liste avant de quitter
	gtk_data_list_remove_all(liste);
 
	return 0;
} | 
Partager