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

Ada Discussion :

Réferencement de Callbacks problématiques GtkAda 18.2 + Glade 3 sur Ubuntu 19.10


Sujet :

Ada

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Réferencement de Callbacks problématiques GtkAda 18.2 + Glade 3 sur Ubuntu 19.10
    Bonjour à toutes t à tous,

    J'aborde gtk et me suis basé sur le header du fichier gtkada-builder.ads :
    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
     
    --  <description>
    --
    --  This package provides a high-level API for using Gtk.Builder and
    --  user interface files produced with the GUI builder glade-3.
    --
    --  Here is how to use this package:
    --
    --     Step 1: create a Builder and add the XML data, just as you would a
    --             standard Gtk.Builder:
    --
    --             declare
    --                Builder : Gtkada_Builder;
    --                Error   : GError;
    --             begin
    --                Gtk_New (Builder);
    --                Error := Add_From_File (Builder, Default_Filename);
    --
    --     Step 2: add calls to "Register_Handler" to associate your handlers
    --             with your callbacks.
    --
    --                Register_Handler
    --                   (Builder      => Builder,
    --                    Handler_Name => "my_handler_id",
    --                    Handler      => My_Handler'Access);
    --
    --             Where:
    --              - Builder is your Gtkada_Builder,
    --              - "my_handler_id" is the name of the handler as specified in
    --                  Glade-3, in the "Handler" column of the "Signals" tab for
    --                  your object,
    --              - Handler is your Ada subprogram.
    --
    --              You will need one call to "Register_Handler" per handler
    --              declared in the Glade-3 interface. If there is one or more
    --              handler declared in Glade-3 which does not have an associated
    --              call to Register_Handler, an ASSERT_FAILURE will be raised by
    --              the Gtk main loop.
    --
    --              There are multiple way to call Register_Handler, see below.
    --
    --     Step 3: call Do_Connect.
    --
    --     Step 4: when the application terminates or all Windows described through
    --             your builder should be closed, call Unref to free memory
    --             associated with the Builder.
    --
    Je cherche sans trouver un exemple fonctionnel de GtkAda pour mon environnement.
    Je trouve fréquemment des exemples pour des environnements antérieurs et systématiquement cela ne marche pas.

    Le problème semble venir de register_handler. Je précise que j'ai obtenu un programme "fonctionnel" ... sans events.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
       Gtk_New(Builder);
     
       Ret_Error := Add_From_File(Builder, "test.glade", Error);
       if Error /= null then Put_Line ("Error"); end if;
     
       Register_Handler (Builder      => Builder,
                            Handler_Name => "on_button1_clicked",
                         Handler      => (On_Button1_Clicked_Cb'Access);
     
       Do_Connect(Builder);
     
       --  Signal handling loop
       Gtk.Main.Main;
    Voici mon prototype pour récupérer l'event d'un bouton. Je me suis perdu dans les pointeurs de procedure et de function : le type de Self est le dernier de mes tests.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        procedure On_Button1_Clicked_Cb(Self : Gtkada_Builder_Record);
    dans Glade 3, il n'y a pas de user_data dans mon signal .

    Que vous faudrait-il pour m'aiguiller dans la bonne direction ?

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 29
    Points : 43
    Points
    43
    Par défaut
    Hello !

    Ça fait un moment que je n'ai pas fait de GTK, mais bon je vais essayer de te répondre.

    Quelle est l'erreur que tu as ?

    As-tu essayé avec Gtk_New_From_File pour créer ton instance, et les Connect pour associer tes callback à tes évènements ?

    C'est ce que j'avais fait sur un de mes projets, je viens de le recompiler sur un GNAT CE 2019 et ça fonctionne.
    Il faut juste penser à virer le flag gnatg du core.gpr, ou s'amuser à corriger tous les warnings à la main. Je n’avais pas fait quelque chose de très propre à l'époque.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup Yoratheon de te pencher sur mon problème .

    J'ai lu les sources de ton projet, mais tu n'utilises pas GtkAda en fait, tu utilises Gtk.
    La lecture de tes sources m'a donné de nouvelles idées pour mon problème. Je me rends compte que mon message initial est un peu brouillon du fait que je ne voyais où résidait mon problème.

    Mon main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       ...
       Gtkada.Builder.Initialize(Builder);
       Ret_Error := Add_From_File(Builder, "test.glade", Error);
       Gtkada.Builder.Register_Handler (Builder      => Builder,
                         Handler_Name => "on_button1_clicked",
                         Handler      => Button1_Clicked_Cb);
     
       Do_Connect(Builder);
       ...
    L'ads
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    package Gtk_Handlers is
       On_Button1_Clicked_Cb : Builder_Handler;
       procedure Button1_Clicked_Cb(Self : Gtkada_Builder); 
    end Gtk_Handlers;
    l'adb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    package body Gtk_Handlers is
       Button1_Clicked_Cb := On_Button1_Clicked_Cb'Access;
       procedure On_Button1_Clicked_Cb(Self : Gtkada_Builder) is
       begin
          null;
       end On_Button1_Clicked_Cb;
    end Gtk_Handlers;
    Le passage de gtkada-builder qui m'importe est le suivant :
    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
     
      type Gtkada_Builder_Record is new
         Gtk.Builder.Gtk_Builder_Record with private;
       type Gtkada_Builder is access all Gtkada_Builder_Record'Class;
     
       ...
     
       type Builder_Handler is access procedure
         (Builder : access Gtkada_Builder_Record'Class);
     
       type Builder_Return_Handler is access function
         (User_Data : access Gtkada_Builder_Record'Class) return Boolean;
     
       procedure Register_Handler
         (Builder      : access Gtkada_Builder_Record'Class;
          Handler_Name : String;
          Handler      : Builder_Handler);
     
       procedure Register_Handler
         (Builder      : access Gtkada_Builder_Record'Class;
          Handler_Name : String;
          Handler      : Builder_Return_Handler);
     
    -- + 2 autres procédures Register_Handler traitant du cas d'un signal avec user_data
    J'ai compris que je dois accrocher le premier Register_Handler parce que dans mon glade je n'ai pas de user_data. Je n'y arrive pas
    Mon message d'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    gprbuild -d -P/home/xavier/Documents/WORKSPACE_ADA/Test Glade/squelette.gpr
    Compile
       [Ada]          main.adb
    main.adb:36:18: no candidate interpretations match the actuals:
    main.adb:38:38: expected type "Object_Return_Handler" defined at gtkada-builder.ads:129
    main.adb:38:38: found procedure name, possibly missing Access attribute
    main.adb:38:38:   ==> in call to "Register_Handler" at gtkada-builder.ads:137
    main.adb:38:38:   ==> in call to "Register_Handler" at gtkada-builder.ads:132
    main.adb:38:38:   ==> in call to "Register_Handler" at gtkada-builder.ads:112
    main.adb:38:38:   ==> in call to "Register_Handler" at gtkada-builder.ads:107 
    gprbuild: *** compilation phase failed
    [2020-04-25 11:17:48] process exited with status 4, elapsed time: 01.23s
    [2020-04-25 11:17:53] The selected rows in the Locations view cannot be exported, please select files and/or categories.
    il n'accroche pas le Register_Handler de la ligne 107. J'ai essayé de resserrer mon propos.
    Il me dit en quelque sorte de caster mon résultat mais je n'ai pas réussi à obtenir quoi que se soit qui soit syntaxiquement correct.

    Est-ce plus clair pour vous ?

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 29
    Points : 43
    Points
    43
    Par défaut
    Je ne suis pas un expert GTK et encore moins GTKAda. Je ne vois pas la plus-value à utiliser GtkAda au lieu de Gtk, ça semble faire sensiblement la même chose sur la partie instanciation. Lorsque j'avais écrit mon code, je m'étais basé sur les doc C et Ptyhon pour trouver les procédures et fonctions à appeler, ainsi que leurs arguments, etc. (en plus du guide de référence GTKAda).

    Pour revenir à ton problème, le message d'erreur dit explicitement le problème : il ne comprend pas ce que tu tentes de lui passer en paramètre.

    Ton problème semble venir de "On_Button1_Clicked_Cb" où tu devrais plutôt avoir quelque chose comme cela (je n'ai pas testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    package body Gtk_Handlers is
       procedure On_Button1_Clicked_Cb(Self : access Gtkada_Builder_Record'Class) is
       begin
          null;
       end On_Button1_Clicked_Cb;
    end Gtk_Handlers;
    Puis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Gtkada.Builder.Register_Handler (Builder      => Builder,
                         Handler_Name => "on_button1_clicked",
                         Handler      => On_Button1_Clicked_Cb'Access);

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    J'ai essayé ta proposition toujours sans succès. Je vais regarder du côté GTK pur comme tu me le proposes.
    Je reviendrai expliquer ce que j'aurai trouvé. Merci de ton aide

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bon j'ai avancé un peu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with Glib.Object; use Glib.Object;
    with Gtkada.Builder; use Gtkada.Builder;
    with Gtk.Button; use Gtk.Button;
    -- with Ada.Unchecked_Deallocation;
     
    package Gtk_Handlers is
       procedure On_Button1_Clicked_Cb(Builder : access Gtkada_Builder_Record'Class);
       Acc_Button1_Clicked : Builder_Handler := On_Button1_Clicked_Cb'Access;
    end Gtk_Handlers;
    utilisé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       Gtkada.Builder.Register_Handler (Builder      => Builder,
                                        Handler_Name => "on_button1_clicked",
                                        Handler      => Acc_Button1_Clicked);
    Désormais cela compile. Mais à l'execution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (process:9754): Gtk-CRITICAL **: 19:58:33.190: _gtk_style_provider_private_get_settings: assertion 'GTK_IS_STYLE_PROVIDER_PRIVATE (provider)' failed
    (process:9754): Gtk-CRITICAL **: 19:58:33.190: _gtk_style_provider_private_get_settings: assertion 'GTK_IS_STYLE_PROVIDER_PRIVATE (provider)' failed
    (process:9754): Gtk-CRITICAL **: 19:58:33.190: _gtk_style_provider_private_get_settings: assertion 'GTK_IS_STYLE_PROVIDER_PRIVATE (provider)' failed
     
    raised STORAGE_ERROR : stack overflow or erroneous memory access
    [2020-05-01 19:58:33] process exited with status 1, elapsed time: 00.24s
    Auriez vous une piste pour surmonter cet écueil ? m'indiquer où ou comment faire pour avoir des informations plus détaillées ?

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 29
    Points : 43
    Points
    43
    Par défaut
    Bonsoir,

    Tu est sur quel OS ?

    Si tu est sur Linux, as tu installer GTK ? Pas celui fournis avec GNAT (qui est requis pour Ada) mais la lib GTK de base ?

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Oui je suis sous linux - Ubuntu 20.04 pour être précis - de quels packets parles tu précisément Yoratheon ? Avant traitement des signaux, j'ai obtenu un affichage d'une fenêtre GTK issue de Glade 3. Faut-il un packet particulier pour que les signaux fonctionnent ?
    Après recherche j'ai 6 libgtk-3-*, et j'ai aussi des libgtk-2.0-*.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 29
    Points : 43
    Points
    43
    Par défaut
    Si tu a les libgtk d'installer alors tu a bien tout pour fonctionner.

    Là l'erreur semble plus être liée à GTK ou à son utilisation. Quelques recherches de ce côté pourraient t'apporter des éléments de réponse (en faisant abstraction d'Ada). D'autres personnes ont dû avoir ce problème (je l'espère, sinon il faudra remonter le problème aux dev de GTK).

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci Yoratheon,

    Je vais fouiller par moi même ce qui cloche maintenant que celà compile c'est forcément un mesusage de ma part qui provoque cette erreur. Je vais revoir entièrement les docs sur l'usage des pointeurs dans Ada je soupçonne que c'est là iù cela coince.

    Encore merci pour ta patience je mets en résolu car le sujet du thread l'est

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

Discussions similaires

  1. [XL-2007] Problématique de recherches et de copie sur des noms de fichiers
    Par stroutz dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 26/06/2013, 16h00
  2. GtkAboutDialog, glade, gtkada
    Par christianf dans le forum GTK+
    Réponses: 7
    Dernier message: 18/10/2012, 15h04
  3. gtkada glade callbacks documentation
    Par christianf dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 09/10/2012, 19h22
  4. générer du code gtkada avec glade 3
    Par christianf dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 04/10/2012, 14h35
  5. projet GTK+/Glade "callbacks.c"
    Par autre dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 28/01/2012, 13h15

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