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.