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 :

Filtrer, focus, et police sur gtkEntry


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut Filtrer, focus, et police sur gtkEntry
    Bonjour à tous,

    Je n'arrive pas à "customiser" mes entrées de chaines de caractères avec des gtkentry. Il y trois points que je n'arrive pas à faire.

    1) Je voudrais "filtrer" la chaine saisie par l'utilisateur. Par exemple, je voudrais que certains caractères (comme par exemple le white space, ou d'autres) ne puisse pas être saisis. En d'autres termes, si un caractère non autorisé est saisie au clavier, il ne dois se passer rien, rien d'affiché, par de déplacement du curseur, etc. Est-ce possible de faire ça, ou bien dois-je recoder ceci à la base en lisant, traitant, et affichant si ok chaque caractère un à un ? Ca me parait bien lourd, et de toute façon, je ne vois même pas bien comme faire ça (même si j'ai quelques idées possibles à explorer).

    2) Y a t'il y moyen de contrôler l'affichage de ce qui est saisi au moment où c'est saisi, je veux dire : font, couleur, etc. J'avais l'idée d'utiliser la librairie Pango et l'encodage UTF8, mais j'ai l'impression qu'il est impossible d'avoir la main sur ce qui est affiché lors de la saisie.

    3) Je n'arrive pas à gérer le focus lors de la saisie. Prenons l'exemple suivant - bidon - ou deux champs de saisie sont positionnés.

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    /* travail sur les gtk_entry */
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
    GtkWidget* pEntry1=NULL;
    GtkWidget* pEntry2=NULL;
     
    int main(int argc,char **argv)
    {
        GtkWidget* pWindow=NULL;
        GtkWidget* pLabel1=NULL;
        GtkWidget* pLabel2=NULL;
        GtkWidget* pHbox1=NULL;
        GtkWidget* pHbox2=NULL;
        GtkWidget* pVbox=NULL;
     
        void entree1(GtkWidget *pEntry, gpointer data); /* callback si saisie entree 1 */
        void entree2(GtkWidget *pEntry, gpointer data); /* callback si saisie entree 2 */
     
        gtk_init(&argc,&argv);
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "travail sur les gtk_entry");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        /* Creation des labels */
        pLabel1=gtk_label_new("en attente 1");
        pLabel2=gtk_label_new("En attente 2");
        /* creation des entry */
        pEntry1=gtk_entry_new();
        pEntry2=gtk_entry_new();
        /* on place tout ca dans des boxes */
        pHbox1=gtk_hbox_new(FALSE, 0);
        pHbox2=gtk_hbox_new(FALSE, 0);
        pVbox=gtk_vbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pHbox1), pLabel1, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(pHbox1), pEntry1, TRUE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pHbox2), pLabel2, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(pHbox2), pEntry2, TRUE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pVbox), pHbox1, TRUE, TRUE, 0);
        gtk_box_pack_start(GTK_BOX(pVbox), pHbox2, TRUE, TRUE, 0);
        /* On verse ca dans la fenetre principale */
        gtk_container_add(GTK_CONTAINER(pWindow), pVbox);
        /* Connexion des signaux */
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
        g_signal_connect(G_OBJECT(pEntry1), "activate", G_CALLBACK(entree1), (GtkWidget*) pLabel1);
        g_signal_connect(G_OBJECT(pEntry2), "activate", G_CALLBACK(entree2), (GtkWidget*) pLabel2);
        /* Affichage de la fenêtré et de tout ce qu'elle contient */
        gtk_widget_show_all(pWindow);
        gtk_main();
        return EXIT_SUCCESS;
    }
    void entree1(GtkWidget *pEntry, gpointer data)
    {
        const gchar *text;
        /* Recuperation du texte contenu dans le GtkEntry */
        text=gtk_entry_get_text(GTK_ENTRY(pEntry1));
        /* Modification du texte contenu dans le GtkLabel */
        gtk_label_set_text(GTK_LABEL((GtkWidget*)data), text);
        /* et on vide la gtk_entry */
        gtk_entry_set_text(GTK_ENTRY(pEntry1), "");
    }
    void entree2(GtkWidget *pEntry, gpointer data)
    {
        const gchar *text;
        /* Recuperation du texte contenu dans le GtkEntry */
        text=gtk_entry_get_text(GTK_ENTRY(pEntry2));
        /* Modification du texte contenu dans le GtkLabel */
        gtk_label_set_text(GTK_LABEL((GtkWidget*)data), text);
        /* et on vide la gtk_entry */
        gtk_entry_set_text(GTK_ENTRY(pEntry2), "");
    }
    Au lancement de l'appli, le focus est sur la premier gtkEntry. Ca ok. En revanche, une fois une saisie réalisée (appuie sur la touche ENTREE), le focus reste sur cette gtkEntry, ce qui oblige l'utilisateur à cliquer sur la seconde avant de pouvoir la saisir. Y aurait-il un moyen de basculer le focus directement sur une autre gtkEntry lorsque une saisie est terminée quelque part ? J'ai bien essayé de jongler avec des gtk_entry_set_activates_default, mais ça ne change rien, et j'ai l'impression d'être à coté du problème à résoudre ici.

    D'avance merci pour toute aide sur ces trois points.

    Eric.

  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
    Filtrer la saisie sur un GtkEntry :

    Le sujet a déjà été traité de mon souvenir mais je n'ai pas pris le temps de rechercher sur le forum. Je te laisse le soin de le faire.
    Maintenant les GtkEntry héritent des GtkWidget. Tu peux peut-être utiliser le signal "key-press-event" pour connecter une fonction callback qui fera le tri sur le dernier caractère saisi.

    Focus :

    Peut-être en utilisant la fonction gtk_widget_grab_focus(); ?

    Police, couleur :

    Il existe la fonction gtk_entry_set_attributes(); qui peut sûrement apporter un début de réponse.

  3. #3
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Filtrer la saisie sur un GtkEntry :

    Le sujet a déjà été traité de mon souvenir mais je n'ai pas pris le temps de rechercher sur le forum. Je te laisse le soin de le faire.
    Maintenant les GtkEntry héritent des GtkWidget. Tu peux peut-être utiliser le signal "key-press-event" pour connecter une fonction callback qui fera le tri sur le dernier caractère saisi.
    J'ai évidement cherché avant de poster, mais n'ai rien trouvé sur ca dans le forum (et ailleurs, d'ailleurs). Je suis preneur d'un lien. Ceci dit, ok, je vais voir et travailler ca en utilisant une fonction callback pour faire le tri. Je ne manquerai pas de donner une solution si j'en trouve une.

    Focus :

    Peut-être en utilisant la fonction gtk_widget_grab_focus(); ?
    Super ! Ca marche au poil. Un problème de résolu. Merci !!

    Police, couleur :

    Il existe la fonction gtk_entry_set_attributes(); qui peut sûrement apporter un début de réponse.
    Je code sous GTK 2. gtk_entry_set_attributes() semble spécifique de GTK 3. Ca ne colle pas. Connaitriez vous une solution utilisable dans GTK 2 ?

    Encore merci pour toute aide sur ce point.

    Eric.

  4. #4
    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
    Pour la police et plus généralement le style du texte peut-être faut-il passer par les fonctions des GtkWidget :



    Plus généralement il est aussi possible d'utiliser gtk_widget_create_pango_layout();.

  5. #5
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Pour la police et plus généralement le style du texte peut-être faut-il passer par les fonctions des GtkWidget :



    Plus généralement il est aussi possible d'utiliser gtk_widget_create_pango_layout();.
    Merci! Encore une fois gtk_widget_create_pango_layout semble être spécifique que GTK 3, ce qui ne colle pas.

    J'ai commencé à creuser l'usage de - par exemple - gtk_widget_modify_font. Ceci me conduit à devoir renseigner (et argumenter) un pointeur sur une struct de type PangoFontDescription ou GtkStyle. Pour ce faire, si j'ai bien compris, je dois utiliser des fonctions comme par exemple pango_font_description_set_weight, etc. Impossible de compiler du code avec ces fonctions qui ne sont pas référencées chez moi (je suis en 2.24.0). Bref, je suis (encore) complètement coincé. Des exemples de codes (comme par exemple ici) serait les bienvenus.

    Encore merci pour votre aide,

    Cordialement, Eric.

  6. #6
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Filtrer la saisie sur un GtkEntry :
    Maintenant les GtkEntry héritent des GtkWidget. Tu peux peut-être utiliser le signal "key-press-event" pour connecter une fonction callback qui fera le tri sur le dernier caractère saisi.
    Euhh, le signal "key-press-event" n'est pas un signal qui peut être émit par un GtkEntry, aux dires de la documentation officielle (https://developer.gnome.org/gtk3/3.4...kEntry.signals). J'ai loupé quelque chose ?

    Encore merci pour votre aide,

    Eric.

  7. #7
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    GtkEntry derive de GtkWidget et "key-press-event" est un signal de GtkWidget.

    Pour ce qui est d'utiliser Pango avec GTK2 il me semble que c'est gtk_widget_create_pango_context () qui peut servir.

  8. #8
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par pvincent Voir le message
    GtkEntry derive de GtkWidget et "key-press-event" est un signal de GtkWidget.

    Pour ce qui est d'utiliser Pango avec GTK2 il me semble que c'est gtk_widget_create_pango_context () qui peut servir.
    Ok, je vais essayer de voir si je peux capturer le signal "key-press-event".

    Pour le second point, en cherchant sur le web, il semble bien que gtk_widget_create_pango_context soit également spécifique de GTK3, ce qui ne me convient pas. Encore une fois, et de toute façon, des exemples de code seraient utiles pour changer la font dans un GtkEntry.. Je n'arrive pas à en trouver sur le web.

    Même si ces deux questions ne sont pour moi pas encore résolues, merci encore pour votre aide.

    Si d'autres ont des idées..

    Cordialement, ric.

  9. #9
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    gtk_widget_create_pango_layout () et gtk_widget_create_pango_context () semblent exister dans GTK2 depuis pas mal de temps: https://developer.gnome.org/gtk2/sta...e-pango-layout
    Je ne sais pas dans quel environnement tu travaille, mais sous Linux, l'installation de devhelp facilite la recherche dans la documentation GTK.
    D'autre part, en affichant l'index général pour GTK on peut faire une recherche de la chaîne "pango" dans cet index,(aussi bien avec devhelp qu'avec firefox: Ctl-F), ce qui conduit aux fonctions ci-dessus.

  10. #10
    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
    Citation Envoyé par eric1708 Voir le message
    Merci! Encore une fois gtk_widget_create_pango_layout semble être spécifique que GTK 3, ce qui ne colle pas.
    Si tu regardes bien le lien de cette fonction elle est issue de Gtk+ v2.24.

  11. #11
    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
    Un petit programme pour te montrer comment on récupère la saisie clavier sur un GtkEntry.

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*-  */
    /*
     * main.c
     * Copyright (C) 2013 Gerald Dumas <gerald.dumas@laposte.net>
     * 
     * gtkentry is free software: you can redistribute it and/or modify it
     * under the terms of the GNU General Public License as published by the
     * Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     * 
     * gtkentry is distributed in the hope that it will be useful, but
     * WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     * See the GNU General Public License for more details.
     * 
     * You should have received a copy of the GNU General Public License along
     * with this program.  If not, see <http://www.gnu.org/licenses/>.
     */
     
    #include <config.h>
    #include <gtk/gtk.h>
     
     
    gboolean callback_key_press_event_signal(GtkWidget *entry1, GdkEvent  *event, gpointer user_data)
    {
    	g_printerr ("La fonction callback est bien appelée à chaque saisie d'un caractère dans le GtkEntry !\n");
     
    	/* On récupère le GtkEntry dans le pointeur entry1. Tu peux en faire ce que tu veux à partir de là */
     
     
     
    	return FALSE;
    }
     
    static GtkWidget*
    create_window (void)
    {
    	GtkWidget *window;
    	GtkWidget* pEntry1=NULL;
     
    	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title (GTK_WINDOW (window), "gtkentry");
     
    	/* creation des entry */
    	pEntry1=gtk_entry_new();
     
    	/* On verse ca dans la fenetre principale */
    	gtk_container_add(GTK_CONTAINER(window), pEntry1);
     
    	/* Connexion des signaux */
      g_signal_connect(G_OBJECT(pEntry1), "key-press-event", G_CALLBACK(callback_key_press_event_signal), NULL);
    	g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
     
    	return window;
    }
     
     
    int
    main (int argc, char *argv[])
    {
     	GtkWidget *window;
     
     
     
    	gtk_init (&argc, &argv);
     
    	window = create_window ();
    	gtk_widget_show_all (window);
     
    	gtk_main ();
     
    	return 0;
    }

  12. #12
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Ok, merci pour cet exemple et les infos sur gtk_widget_create_pango_layout() et gtk_widget_create_pango_context().

    Ok pour récupérer un key-press-event. L'exemple de code que je sollicitais était plutôt - comme je l'expliquais - pour l'usage des fonctions de modification de font pour des GtkEntry. J'ai notamment - entre autre - l'impression que ces fonctions et celles qui vont avec ne sont pas reconnues dans mon environnement de travail (GTK 2.24.0). Je vais regarder ca en détail prochainement (je n'ai pas le temps à présent), mais je ne manquerai pas de répondre à tout ça ici, en espérant que je me sortirai de ces questions prochainement.

    Merci encore, en tout cas pour votre aide !

    Eric.

  13. #13
    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
    Je vais voir ce que je peux faire comme exemple pour la gestion de la police.

  14. #14
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Un petit programme pour te montrer comment on récupère la saisie clavier sur un GtkEntry.

    Bonjour,

    Je relance ce post (un peu tardivement) car je reprends à présent ce problème sans encore vraiment aboutir à la solution recherchée.

    Je rappelle que je souhaite filtrer les caractères saisis dans un GtkEntry en en acceptant certains en en refusant d'autres. J'ai progressé, et j'arrive au code exemple ci-dessous, où ne sont acceptés que les caractères alpha-numériques principaux.

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    /* travail sur les gtk_entry */
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
    GtkWidget* pEntry=NULL;
    char tempo[500];
    guint valeur=0; /* pour le numéro de la touche saisie au clavier */
     
    int main(int argc,char **argv)
    {
        GtkWidget* pWindow=NULL;
        GtkWidget* pButton=NULL;
        GtkWidget* pVbox=NULL;
        void entree(GtkWidget *pEntry, GdkEventKey *event, gpointer data); /* callback si saisie entree */
     
        gtk_init(&argc,&argv);
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(pWindow), "travail sur les gtk_entry");
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
        /* creation de la gtkentry */
        pEntry=gtk_entry_new();
        /* creation du bouton */
        pButton=gtk_button_new_with_label("Quit..");
        /* on place  ca dans la verticale box */
        pVbox=gtk_vbox_new(FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pVbox), pEntry, TRUE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(pVbox), pButton, FALSE, FALSE, 0);
        gtk_widget_grab_focus(GTK_ENTRY(pEntry));
        /* On verse ca dans la fenetre principale */
        gtk_container_add(GTK_CONTAINER(pWindow), pVbox);
        (void)strcpy(tempo,"");
        /* Connexion des signaux */
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
        g_signal_connect(G_OBJECT(pButton), "clicked", G_CALLBACK(gtk_main_quit), NULL);
        g_signal_connect(G_OBJECT(pEntry), "key-press-event", G_CALLBACK(entree), NULL);
        /* Affichage de la fenêtré et de tout ce qu'il contient */
        gtk_widget_show_all(pWindow);
        gtk_main();
        return EXIT_SUCCESS;
    }
     
    void entree(GtkWidget *pEntry, GdkEventKey *event, gpointer data)
    {
        const gchar *text;
        valeur=event->keyval;
        /* test si caractère accepté */
        if (
                ((valeur>=97)&&(valeur<=122)) /* "a" à "z" */
            ||  ((valeur>=65)&&(valeur<=90))  /* "A" à "Z" */
            ||  ((valeur>=48)&&(valeur<=57))  /* "0" à "9" */
            ||  ((valeur>=65456)&&(valeur<=65465))  /* "0" à "9" du pavé numérique */
            ||  (valeur==45)  /* "-" */
            ||  (valeur==65453)  /* "-" du pavé numérique */
            ||  (valeur==95)  /* "_" */
            ||  (valeur==40)  /* "(" */
            ||  (valeur==41)  /* ")" */
            ||  (valeur==123)  /* "{" */
            ||  (valeur==125)  /* "}" */
            ||  (valeur==91)  /* "[" */
            ||  (valeur==93)  /* "]" */
            ||  (valeur==61)  /* "=" */
            ||  (valeur==46)  /* "." */
            )
            {
                (void)strcat(tempo,event->string);
                gtk_entry_set_text(GTK_ENTRY(pEntry),tempo);
            }
     
    }
    Ca marche bien, à un seul problème prêt: Le curseur reste en position 0 (i.e., au début de la ligne tout le temps, de sorte que si la chaîne saisie est trop longue elle sort du champs de la GtkEntry. Ma question est simple donc: Comment repousser à chaque fois le curseur en fin de chaîne ? Impossible de trouver l'info sur le web..

    L'autre partie de ma question était de modifier les font, couleur, etc. de l'affichage de ce qui est saisi au moment où c'est saisi. Je n'ai toujours pas trouvé de solution statisfaisante pour ca, et des exemples de code seraient les bienvenus.

    Merci d'avance pour toute réponse.

    Cordialement, Eric.

  15. #15
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par eric1708 Voir le message
    Bonjour,

    Je relance ce post (un peu tardivement) car je reprends à présent ce problème sans encore vraiment aboutir à la solution recherchée.

    Je rappelle que je souhaite filtrer les caractères saisis dans un GtkEntry en en acceptant certains en en refusant d'autres. J'ai progressé, et j'arrive au code exemple ci-dessous, où ne sont acceptés que les caractères alpha-numériques principaux.

    [...]

    L'autre partie de ma question était de modifier les font, couleur, etc. de l'affichage de ce qui est saisi au moment où c'est saisi. Je n'ai toujours pas trouvé de solution statisfaisante pour ca, et des exemples de code seraient les bienvenus.

    Merci d'avance pour toute réponse.

    Cordialement, Eric.
    Bon, je continus à creuser ce problème et ne trouve pas de solution. Plus précisément, mon intervention ici repose (encore) sur deux questions. Il me semble plus simple de faire à présent deux posts séparés.

    Celui-ci est sur comment mettre le curseur à la fin du texte dans un GtkEntry (voir ma question dans mon message précédent).

    J'ouvre dans la minute un autre post sur l'histoire de la modification des fonts dans un GtkEntry.

    Merci, ici donc, pour toute âme charitable qui pourra m'orienter sur la manière de gérer la position du curseur dans un GtkEntry.

    Eric.

  16. #16
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    Bonjour,
    Tout d'abord la signature de ton callback n'est pas correcte: il est void alors qu'il doit retourner un booléen et en fait, c'est ce qui va te servir pour obtenir le comportement souhaité.
    En effet, le remplissage de ta GtkEntry est fait par un callback système appelé après le tiens et la règle est que si ton callback retourne FALSE, le callback suivant dans la liste est appelé, s'il retourne TRUE, les callbacks suivants sont ignorés.
    J'ai donc modifié ton code pour qu'il ignore le caractère B
    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
    52
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <string.h>
     
    GtkWidget* pEntry=NULL;
     
    guint valeur=0; /* pour le numéro de la touche saisie au clavier */
     
    gboolean entree (GtkWidget *pEntry, GdkEventKey *event, gpointer data)
    {
      valeur=event->keyval;
      /* test si caractère accepté */
      printf ("\t %s\n" ,event->string;
      if (valeur == 'B') {
        printf (" B detect\n");
        return TRUE;
      }
      return FALSE;
    }
     
    int main(int argc,char **argv)
    {
      GtkWidget* pWindow=NULL;
      GtkWidget* pButton=NULL;
      GtkWidget* pVbox=NULL;
     
      gtk_init(&argc,&argv);
      pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_title(GTK_WINDOW(pWindow), "travail sur les gtk_entry");
      gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
      /* creation de la gtkentry */
      pEntry=gtk_entry_new();
      /* creation du bouton */
      pButton=gtk_button_new_with_label("Quit..");
      /* on place  ca dans la verticale box */
      pVbox=gtk_vbox_new(FALSE, 0);
      gtk_box_pack_start(GTK_BOX(pVbox), pEntry, TRUE, FALSE, 0);
      gtk_box_pack_start(GTK_BOX(pVbox), pButton, FALSE, FALSE, 0);
     
      /* On verse ca dans la fenetre principale */
      gtk_container_add(GTK_CONTAINER(pWindow), pVbox);
     
      /* Connexion des signaux */
      g_signal_connect (G_OBJECT(pWindow), "destroy"	  , G_CALLBACK(gtk_main_quit), NULL);
      g_signal_connect (G_OBJECT(pButton), "clicked"	  , G_CALLBACK(gtk_main_quit), NULL);
      g_signal_connect (G_OBJECT(pEntry) , "key-press-event", G_CALLBACK(entree)	     , NULL);
      /* Affichage de la fenêtre et de tout ce qu'elle contient */
      gtk_widget_show_all(pWindow);
      gtk_main();
      return EXIT_SUCCESS;
    }

  17. #17
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par pvincent Voir le message
    Bonjour,
    Tout d'abord la signature de ton callback n'est pas correcte: il est void alors qu'il doit retourner un booléen et en fait, c'est ce qui va te servir pour obtenir le comportement souhaité.
    En effet, le remplissage de ta GtkEntry est fait par un callback système appelé après le tiens et la règle est que si ton callback retourne FALSE, le callback suivant dans la liste est appelé, s'il retourne TRUE, les callbacks suivants sont ignorés.
    J'ai donc modifié ton code pour qu'il ignore le caractère B
    Excellent !

    C'est exactement la réponse à ma question ! et tout devient limpide.

    Effectivement le typage de ma fonction callback était érroné, mais ca c'est juste une erreur d'étourderie (issue d'un copier/coller malheureux). Pour le reste, je n'aurais pas pu trouver la solution tout seul, notamment le fait que d'autres callback système sont envoyés après le mien. Mais où peut-on trouver ce genre d'info sur le fonctionnement de GTK ?

    En tout cas, merci pour votre aide. Je place ce post en "résolu".

    Eric.

  18. #18
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    Dans la documentation de référence, il faut décoder ce qui est raconté sur les signaux, ce qui n'est pas facile, mais je conseil de lire le tutoriel et l'on trouve la réponse ici
    https://developer.gnome.org/gtk-tuto...ble/x1810.html

  19. #19
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par pvincent Voir le message
    Dans la documentation de référence, il faut décoder ce qui est raconté sur les signaux, ce qui n'est pas facile, mais je conseil de lire le tutoriel et l'on trouve la réponse ici
    https://developer.gnome.org/gtk-tuto...ble/x1810.html
    Thank you!

    Eric.

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

Discussions similaires

  1. Police sur text
    Par Livingstone dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/01/2006, 15h36
  2. Taille de police sur onglets
    Par stigma dans le forum Access
    Réponses: 8
    Dernier message: 13/01/2006, 16h44
  3. Changement de couleur de police sur une partie d'un caption
    Par kobe dans le forum Composants VCL
    Réponses: 3
    Dernier message: 11/07/2005, 10h18
  4. [Font] utiliser une même police sur Windows et sur Linux ?
    Par iubito dans le forum Interfaces Graphiques en Java
    Réponses: 6
    Dernier message: 10/05/2005, 16h41

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