Bonjour à tous,

Les GtkEntry sont des widgets qui semblent simples mais qui continuent à me poser des problèmes. Voici par exemple un code-exemple qui explique le problème que j'ai.

Après saisie de la première entry, je fais les deux choses suivantes :

  1. Je positionne le focus sur la deuxième entry (gtk_widget_grab_focus), et
  2. Cette seconde entry possède déjà une chaine pré-saisie.


Le problème est que le positionnement du focus sur la seconde entry a pour effet secondaire de sélectionner tout le texte déjà saisi. Du coup, alors qu'on s'attendrait à ce qu'un simple retour-charriot de l'utilisateur valide cette seconde entry (si le texte pré-saisi convient), en fait il l'efface !

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
/* 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* pVbox=NULL;
    GtkWidget* pButton=NULL;
 
    gboolean entree1(GtkWidget *pEntry, gpointer data); /* callback si saisie entree 1 */
    gboolean 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 entry */
    pEntry1=gtk_entry_new();
    pEntry2=gtk_entry_new();
    gtk_entry_set_text(pEntry2, "texte");
    /* creation du bouton */
    pButton=gtk_button_new_with_label("Ok..");
    /* on place tout ca dans une boxe */
    pVbox=gtk_vbox_new(FALSE, 0);
    gtk_box_pack_start(GTK_BOX(pVbox), pEntry1, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(pVbox), pEntry2, TRUE, TRUE, 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(pEntry1), "activate", G_CALLBACK(entree1), NULL);
    g_signal_connect(G_OBJECT(pEntry2), "activate", G_CALLBACK(entree2), NULL);
    /* Affichage de la fenêtré et de tout ce qu'il contient */
    gtk_widget_grab_focus(pEntry1);
    gtk_widget_show_all(pWindow);
    gtk_main();
    return EXIT_SUCCESS;
}
gboolean entree1(GtkWidget *pEntry, gpointer data)
{
    const gchar *text;
    /* Recuperation du texte contenu dans le GtkEntry */
    text=gtk_entry_get_text(GTK_ENTRY(pEntry1));
    /* On verouille */
    gtk_widget_set_sensitive(pEntry1, FALSE);
    /* On met le focus sur le second widget */
    gtk_widget_grab_focus(pEntry2);
    return TRUE;
}
gboolean entree2(GtkWidget *pEntry, gpointer data)
{
    const gchar *text;
    /* Recuperation du texte contenu dans le GtkEntry */
    text=gtk_entry_get_text(GTK_ENTRY(pEntry2));
    /* On verouille */
    gtk_widget_set_sensitive(pEntry2, FALSE);
    return TRUE;
}
Existerait-il un moyen d'éviter que le texte pré-saisi soit sélection entièrement par le gtk_widget_grab_focus, et que le curseur soit donc - au contraire - positionné à la fin (pour valider, ou bien pour modifier la chaine pré-saisie)?

D'avance merci pour toute aide sur ce point.

Cordialement, Eric.