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 :

Détecter appuis sur dalle tactile


Sujet :

GTK+ avec C & C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2009
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Détecter appuis sur dalle tactile
    Bonjour,
    Je développe une application avec GTK3 et je suis novice dans cet environnement.

    Ce que je veux faire et que je n'arrive pas : détecter simplement un appuis sur la dalle quelque soit la position sur l'écran.
    Sur ma page principale différents éléments sont affichés (label, graphiques) tous ces composants sont posés sur une une gtk_grid qui recouvre tout l'écran.
    L'appuis sur l'écran donne accès une page de menu classique.
    J'ai aussi une tache cyclique lancée toutes les 100 ms

    J'imagine plusieurs possibilités pour obtenir ce fonctionnement.

    S1 Positionner un gtk_button qui couvre toute la page, mais bloquer le dessin du bouton.
    Je ne sais pas si avec GTK on peut intercepter le dessin du bouton.

    S2 Créer un évènement clic sur la gtk_grid. j'ai vu qu'il y a un composant GtkEventBox, je n'ai pas bien compris son usage.

    S3 Dans la tâche cyclique aller lire l'état de la dalle.

    Je suis intéressé pour connaître toute solution (propre) pour faire ce fonctionnement.
    Merci d'avance pour toute suggestion ou remarque.

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

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

    Informations forums :
    Inscription : février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Je ne suis pas sûr de bien comprendre le problème. Soit tu n’as aucune interaction entre l’écran et ton application soit les clics sur l’écran fonctionnent et tu n’arrives pas à connecter les clics à tes callbacks.

    Je vais partir du principe que c’est l’interaction qui fait défaut. A priori, je n’ai jamais eu à programmer avec un écran tactile, il faut passer par les DeviceManager pour activer ton écran pour qu’il soit pris en compte comme un device esclave :

    https://docs.gtk.org/gdk3/class.DeviceManager.html

    Si je comprends bien la documentation normalement tous les périphériques sont pris en charge mais on ne sait jamais…

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2009
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Bonjour Gerald,
    Merci pour ta réponse mais je n'ais pas de problème de connexion avec les callbacks.
    Ce que j'explique est que le composant gtk_grid ne traite pas le signal "clicked".

    Grâce à ta réponse j'ai été voir différentes choses sur le device manager, notamment comment lire la position du curseur mais je n'ai pas trouvé comment lire l'état du curseur (appuyé ou pas), c'est certainement possible mais ça ne saute pas au yeux comment faire.

    La solution que j'ai retenue : passer un bouton en transparent avec la ligne gtk_widget_set_opacity( pGrosBouton , 0 );

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      windowdev = gtk_application_window_new ( application ) ;
      gtk_window_set_default_size ( GTK_WINDOW ( windowdev ), 1024, 600 );
    //___________________ création grille	
      pGrid = gtk_grid_new ( );		
      gtk_grid_set_row_homogeneous ( GTK_GRID ( pGrid ), TRUE) ;
      gtk_grid_set_column_homogeneous ( GTK_GRID ( pGrid ), TRUE );
      gtk_container_add ( GTK_CONTAINER ( windowdev ), GTK_WIDGET ( pGrid ) );
    //________________________________________________ affectation globale  de la grille
    GtkWidget *pGrosBouton ;
      pGrosBouton = gtk_button_new_with_label("");
      gtk_widget_set_opacity(  pGrosBouton , 0  );  									// bouton non visible
      g_signal_connect( pGrosBouton, "clicked", G_CALLBACK ( button_X_callback ), "fond" );
      gtk_grid_attach( GTK_GRID ( pGrid ) , pGrosBouton, 0, 0, 10, 10 ) ;                                   // bouton étalé sur toute la grille

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

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

    Informations forums :
    Inscription : février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Je vais approfondir ma réponse 😁.

    Le GdkEventBox est un widget transparent auquel tu peux demander d’écouter certains signaux. Ainsi, si un widget particulier tel que le GtkGrid n’accepte pas le clic de la souris tu peux passer par cette astuce.
    Tu insères un GtkEventBox puis dans ce dernier ton GtkGrid. Ensuite tu utilises gtk_widget_add_event() pour ajouter des écouteurs tels que GDK_BUTTON_PRESS et GDK_BUTTON_RELEASE au GdkEventBox.
    Pour finir il ne te reste plus qu’à affecter un callback au signal «*button-press-event*» et au signal «*button-release-event*» pour simuler un clic.

    Actuellement je suis en déplacement et ne peux te faire un code exemple. Si d’ici samedi tu n’as pas réussi je te transmettrai un code exemple fonctionnel.

    Édit : je viens de penser que le GtkGrid peut peut-être accepter directement les écouteurs pré-cités. Ce qui éviterai l’utilisation d’un GtkEventBox. À essayer.

    Au vu de ton code j’ai tout de même l’impression que tu tentes d’avoir un comportement façon tableur. Si c’est la finalité ce ne sera alors pas la bonne démarche. Confirme-moi si c’est bien ça. On pourra alors revoir la copie 😉.

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

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

    Informations forums :
    Inscription : février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Nous sommes samedi et comme promis me voila pour te donner un exemple concret.

    J'ai testé l'ajout de signaux à un GtkGrid. Ce n'est pas possible. Nous passerons donc par les GtkEventBox.

    Le code présenté ci-dessous insère dans un GtkWindow un GtkEventBox dans lequel vient un GtkGrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    GtkWindow
          |
          |---GtkEventBox
                    |
                    |---GtkGrid
    Nous ajoutons au GtkEventBox deux signaux "button-press-event" et "button-release-event" auquel nous connectons un callback respectif.

    Pour l'exemple j'affiche en console l'état du bouton de la souris (ou du touché sur l'écran) par le nom des callbacks appelés.
    Le code est minimaliste pour être le plus clair possible.

    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
    #include <stdio.h>
    #include <gtk/gtk.h>
     
    gboolean
    press_event_CB (GtkWidget *widget,
                   GdkEvent  *event,
                   gpointer   user_data)
    {
      g_printerr ("Enter in %s();\n", __func__);
     
      return FALSE;
    }
     
    gboolean
    release_event_CB (GtkWidget *widget,
                   GdkEvent  *event,
                   gpointer   user_data)
    {
      g_printerr ("Enter in %s();\n", __func__);
     
      return FALSE;
    }
     
    gint
    main(gint argc, gchar** argv)
    {
      gtk_init (&argc, &argv);
     
      GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_window_set_default_size (GTK_WINDOW (window), 1024, 600);
      g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
      // __________________ Création d'un GtkEventBox et ajout des signaux pour un clic
      GtkWidget *eventbox = gtk_event_box_new ();
      gtk_widget_add_events (eventbox, GDK_BUTTON_PRESS|GDK_BUTTON_RELEASE);
      g_signal_connect (G_OBJECT (eventbox), "button-press-event", G_CALLBACK (press_event_CB), NULL);
      g_signal_connect (G_OBJECT (eventbox), "button-release-event", G_CALLBACK (release_event_CB), NULL);
      gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (eventbox));
     
      //___________________ création grille
      GtkWidget *pGrid = gtk_grid_new ( );
      gtk_grid_set_row_homogeneous (GTK_GRID (pGrid), TRUE) ;
      gtk_grid_set_column_homogeneous (GTK_GRID (pGrid), TRUE);
      gtk_container_add (GTK_CONTAINER (eventbox), pGrid);
     
      gtk_widget_show_all (window);
     
      gtk_main ();
     
      return 0;
    }

Discussions similaires

  1. [WD20] Détecter appui sur une touche dans une fenêtre
    Par Delphi-ne dans le forum WinDev
    Réponses: 4
    Dernier message: 28/08/2018, 12h54
  2. [C#] Comment détecter l'appui sur 'Entrée' ?
    Par ArHacKnIdE dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/01/2008, 17h05
  3. Réponses: 2
    Dernier message: 20/03/2006, 18h05
  4. Comment détecter quand un utilisateur appuie sur le bouton Power ?
    Par Millenod dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 22/09/2005, 21h05
  5. Détecter l'appui sur la touche de fonction F2
    Par titiyo dans le forum Composants VCL
    Réponses: 6
    Dernier message: 18/06/2003, 11h07

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