IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

Structures, variables globales et GtkBuilder


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 16
    Par défaut Structures, variables globales et GtkBuilder
    Bonjour,

    J'ai construit l'interface de mon application avec Glade. GtkBuilder me permet d'en récupérer une instance lors de la création de ma fenêtre principale. Au besoin, je passe en paramètre des callbacks un pointeur sur ce GtkBuilder. D'autre part, j'ai eu besoin de créer une structure contenant les variables utiles pour stocker des informations de l'application (gboolean pour sauvegarde nécessaire, gchar* pour le chemin du fichier ouvert, etc.). Cette structure est déclarée en global. J'ai lu plusieurs fois sur ce forum ce genre d'idée :
    Citation Envoyé par gerald3d Voir le message
    Pour répondre plus génériquement, la dernière variable de la fonction g_signal_connect(); permet de transmettre à la fonction CALLBACK une donnée utilisateur sous la forme d'un pointeur.
    La plupart des développeurs crée une structure dans laquelle on trouve tous les widgets nécessaires à l'interface, déclare ensuite une variable du type de cette structure et la transmette comme pointeur.
    Ainsi on peut accéder à tout moment à un widget de l'interface dans n'importe quel CALLBACK en s'affranchissant d'une déclaration en global.
    J'ai bien compris le concept mais comment combiner les widgets "associés" au GtkBuilder et la structure (ce qui éviterait l'emploi de variables globales) ? Utiliser GSList* gtk_builder_get_objects (GtkBuilder *builder); peut-il me faire avancer vers une solution satisfaisante ? J'aurais besoin d'une description pratique de l'utilisation d'une structure principale faisant référence à la fois à la sous-structure et au GtkBuilder. Je pourrais ensuite transmettre cette structure et éviter des variables globales superflues.

    Merci !

    PS : si j'utilise la fonction gtk_builder_get_objects ( ), à quel moment faut-il libérer la GSList avec g_slist_free( ) ?

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Si j'ai bien compris il suffit de faire comme suit. Tu déclares une structure de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct
    {
      GtkBuilder *builder;
      int var1;
      char *var2;
      .
      .
      .
      int varn;
    } MainData;
    Ensuite dans la fonction main(); tu peux soit déclarer une variable du type MainData soit allouer dans le tas. Tu initialises le pointeur builder avec les fonctions GtkBuilder ad-hoc. Voila les deux solutions :

    Solution 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
      MainData userdata;
      ...
      g_signal_connect(G_Object(button), "clicked", GCallback(callback), &userdata);
      ...
      exit 0;
    Solution 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
      MainData *userdata;
      userdata = g_new(MainData, 1);
      ...
      g_signal_connect(G_Object(button), "clicked", GCallback(callback), userdata);
      ...
      g_free(userdata);
      exit 0;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 16
    Par défaut
    Merci Gerald pour ton aide, je pense pouvoir m'en sortir avec ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. structure en variable globale
    Par Armen2281 dans le forum Débuter
    Réponses: 8
    Dernier message: 01/04/2015, 14h02
  2. Réponses: 14
    Dernier message: 28/02/2013, 19h33
  3. Structure en variable globale : question de performance
    Par Merillym dans le forum Débuter
    Réponses: 4
    Dernier message: 28/01/2010, 16h06
  4. Des Structures comme variables Globales
    Par mr_samurai dans le forum MATLAB
    Réponses: 3
    Dernier message: 11/01/2008, 19h27
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo