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