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 :

gtk_entry_get_selection_bounds with gtk_editable_set_position


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    3D CGI R&D
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : 3D CGI R&D
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Par défaut gtk_entry_get_selection_bounds with gtk_editable_set_position
    Bonjour,

    Essayant de porter mon code Windows sous Linux - concernant des widgets subclassés - j'essaye de trouver le moyen de faire fonctionner correctement gtk_entry_get_selection_bounds avec gtk_editable_set_position.

    En effet, pour les besoins d'une 'feature' permettant à l'utilisateur de faire scroller horizontalement le texte d'un entry/editable lorsque ce texte est plus long que le champ visible, j'ai besoin de connaitre la position en pixel du premier caractère lorsque le curseur est complètement à droite, en fin de texte, et ce, quelque soit la position courante du curseur.

    Je commence donc par utiliser gtk_entry_get_selection_bounds avec le curseur courant et j'obtiens les bonnes valeurs, ensuite je fais un gtk_editable_set_position( w, -1 ) pour positionner le curseur en fin de texte (donc supposément le text a scrollé à gauche pour montrer le dernier character), puis je refais un gtk_entry_get_selection_bounds pour obtenir le nouvel offset à gauche.

    Seulement voilà, quand je fais ces opérations à la suite, l'offset du deuxième appel à gtk_entry_get_selection_bounds ne change pas, j'obtiens le même que le premier, comme si le déplacement du curseur n'avait pas été pris en compte.

    J'imagine que c'est en fait le cas, et qu'il doit y avoir quelque chose à faire pour mettre à jour le layout avec la nouvelle position de curseur (avant de quitter ma fonction et de réafficher le widget) ?

    Est-ce que quelqu'un a une idée sur la question ?

    Merci par avance,
    Cordialement,
    Guy.
    --
    guy rabiller | radfac founder / ceo

  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
    Bonjour.

    Je n'ai jamais essayé ce genre de manipulation mais gtk_editable_get_selection_bounds (); te renvoie la position de départ et de fin du texte sélectionné. Le fait de déplacer le curseur à la fin du texte ne change pas forcément la sélection précédente. Enfin il me semble.

    Peut être qu'en sélectionnant tout le texte avec la fonction gtk_editable_select_region (); réglerait le problème...

  3. #3
    Futur Membre du Club
    Homme Profil pro
    3D CGI R&D
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : 3D CGI R&D
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Par défaut
    Bonjour,

    Oui j'ai déjà essayé avec gtk_editable_get_selection_bounds() et gtk_editable_select_region() et le problème reste le même.

    Il semble que le PangoLayout ne soit pas mis à jour tant que le widget n'est pas repaint, et ce, quelques soient les manips de curseur que l'on peut faire avant, malheureusement.

    Il y a peut-être une manip à faire sur le layout lui-même pour le forcer à se mettre à jour avant que le widget ne soit repaint, mais je n'ai pas encore trouvé comment.

    Cordialement,
    Guy.
    --
    guy rabiller | radfac founder / ceo

  4. #4
    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,

    Ta question me laisse un peu perplexe car chez moi GtkEntry semble faire le travail tout seul:
    • Quand je tape un texte et que j'arrive sur le bord droit de la zone de capture, la chaîne est translatée sur la gauche chaque fois que j'ajoute un caractère
    • Idem si je sélectionne avec la souris, la chaîne défile aussi.
    • Idem si j'utilise les flèches gauche et droite.

    Par contre, cela ne laisse aucun caractère blanc sur la droite, ce qui peut être déroutant.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    3D CGI R&D
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : 3D CGI R&D
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Par défaut
    Bonjour,

    Oui évidemment, quand l'utilisateur manipule le widget ça marche tout seul.

    J'aurai du préciser que j'essaye d'utiliser les fonctions sus-mentionnées à partir d'un callback d'un autre widget, et que j'essaye, dans ce callback, d'obtenir des infos et de manipuler le widget 'editable'.

    Mais il semble que tant que le widget 'editable' n'a pas reçu l'ordre de se peindre, le PangoLayout qui gère l'aspect graphique du texte n'est pas mis à jour, et ce, quelques soient les manipulations (*par programmation*) faites sur ce widget.

    Cordialement,
    Guy.

  6. #6
    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
    Je n'ai pas de solution pour ton problème, mais j'ai fait une petite expérience d'où je tire la conclusion suivante: je trouve contestable le comportement de gtk_entry_set_alignment() qui aurait dû être la solution si il avait fonctionné comme je l'espérais.
    Avec ce petit programe, on voit que si la fenêtre est plus large que la chaîne, cette dernière se balade de droite à gauche dans la fenêtre quand le paramètre d'alignement varie entre 0 et 1, mais que ce dernier n'a plus aucun effet si la fenêtre est plus étroite que la chaîne.
    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
     
    #include<stdlib.h>
    #include<gtk/gtk.h>
    static GtkWidget *spin ,*entry;
     
    static void spin_CB (GtkSpinButton *spin ,gpointer p)
    {
      gdouble align = gtk_spin_button_get_value (spin);
      printf ("align = %f \n" ,align);
      gtk_entry_set_alignment (GTK_ENTRY (entry) ,align);
    }
     
    int main(int argc,char **argv)
    {
      GtkWidget *pwindow = NULL;
      GtkWidget *vbox;
      gtk_init(&argc,&argv);
      pwindow = gtk_window_new	(GTK_WINDOW_TOPLEVEL);
      gtk_window_set_default_size	(GTK_WINDOW	(pwindow),100,100);
      vbox = gtk_vbox_new		(FALSE, 0);
      gtk_container_add		(GTK_CONTAINER	(pwindow),vbox);
     
      entry = gtk_entry_new ();
      gtk_entry_set_text (GTK_ENTRY (entry) ,"123456789abcdefghijklmnopqrstuvwxyz");
      gtk_box_pack_start (GTK_BOX (vbox) ,entry ,TRUE, TRUE, 0);
     
      spin = gtk_spin_button_new_with_range (-1.0 ,1.0 ,0.05);
      gtk_box_pack_start (GTK_BOX (vbox) ,spin ,TRUE, TRUE, 0);
     
      gtk_widget_show_all(pwindow);
     
      g_signal_connect (spin    ,"value-changed" ,G_CALLBACK (spin_CB) 	 ,NULL);
      g_signal_connect (pwindow ,"destroy"	     ,G_CALLBACK (gtk_main_quit) ,NULL);
      gtk_main();
      return EXIT_SUCCESS;
    }

Discussions similaires

  1. [C#] Calendar Popup with TextBox and Image?
    Par Nadaa dans le forum ASP.NET
    Réponses: 15
    Dernier message: 04/02/2009, 11h59
  2. [debutant sous eclipse] surround with try catch
    Par Alwin dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 26/06/2004, 20h03
  3. [MSDE] Not associated with a trusted connection...
    Par tiboleo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/06/2004, 15h08
  4. [Débutant] Utilisation de FOP - Register Fonts with FOP
    Par Johnbob dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 31/01/2004, 00h27
  5. installation php avec option --with-pgsql: marche pô.
    Par phil25 dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/01/2004, 15h59

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