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

Interfaces Graphiques Perl Discussion :

Gtk-CRITICAL **: gtk_text_buffer_emit_insert:


Sujet :

Interfaces Graphiques Perl

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 23
    Points
    23
    Par défaut Gtk-CRITICAL **: gtk_text_buffer_emit_insert:
    Bonjour.

    Quand dans un Gtk2::TextBuffer j'essaie d'afficher des données binaires
    contenant un octet 00 j'obtient;

    Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)
    Petit exemple:

    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
        use Gtk2 -init;
     
        my $w = Gtk2::Window->new();
        $w->set_size_request(300, 200);
     
        my $line =  pack("CCCC",3,2,1,0);
     
        my $v = Gtk2::TextView->new();
        my $b = Gtk2::TextBuffer->new();
        $v->set_buffer($b);
        $b->set_text($line);
     
        $w->add($v);
        $w->show_all();
        Gtk2->main();

    Vous allez me dire quel intérêt d'afficher des données binaires que l'on ne peut
    pas éditer.

    C'est juste que je trouve ça fun. Voir http://pagesperso-orange.fr/philippe...EADMEterm.html

    Plus sérieusement, ai je fait quelque chose de mal, est ce un bug ... ?

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    J'ai jamais fais de GTK, mais uniquement TK.

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 23
    Points
    23
    Par défaut Gtk2::TextBuffer
    Bonjour.

    Merci djibril pour la remise en page de mon message. Je vais essayé de m'appliquer.

    Moi aussi j'aime bien TK. Si j'utilise GTK, c'est juste qu'il permet
    d'éditer un fichier simultanément dans plusieurs vues, et Gtk2::SourceView rajoute
    la coloration syntaxique.

    Dans la doc C de GTK:

    gtk_text_buffer_set_text ()

    void gtk_text_buffer_set_text (GtkTextBuffer *buffer,
    const gchar *text,
    gint len);

    Deletes current contents of buffer, and inserts text instead. If len is -1, text must be nul-terminated. text must be valid UTF-8.

    buffer : a GtkTextBuffer
    text : UTF-8 text to insert
    len : length of text in bytes
    Deux possibilitées pour afficher du texte, un tableau de caractéres suivi de la taille du
    tableau, ou une chaîne en UTF-8 suivie d'un octet 00 comme en C.

    Exemple en C:

    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
     
        #include <gtk/gtk.h>
     
        int main( int   argc, char *argv[] ) {
     
            GtkWidget *window, *view;
            GtkTextBuffer *buffer;
     
            gtk_init (&argc, &argv);
     
            window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
            g_signal_connect (G_OBJECT (window), "delete_event", gtk_main_quit, NULL);
     
            view   = gtk_text_view_new();
            buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
     
            char line [132];
            int i;
     
            // ASCII  01 à 127
            for ( i=1; i<=127; i++ ) {
                line[i-1] = i ;
            }
     
            // UTF-8  é
            line[127] = 0xC3;
            line[128] = 0xA9;
     
            // UTF-8  smiley 
            line[129] = 0xE2;
            line[130] = 0x98;
            line[131] = 0xBA;
     
            gtk_text_buffer_set_text (buffer, (gchar*)&line, 132);
     
            gtk_container_add (GTK_CONTAINER (window), view);    
            gtk_widget_show_all (window);       
            gtk_main ();    
            return 0;
        }
    J'affiche dans un gtk_text_view, les caractéres ASCII de 01 à 127, suivis des caractéres
    UNICODE codés en UTF-8 un é et un smiley.
    Il est impossible d'afficher le caractére 00. Donc si ça marche pas en C ça risque pas en Perl.

    Pour mémoire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     asci    e         101   01100101                           65    
             DEL       127   01111111 	                    7F
     
     latin-1                   
             é         233   11101001                           E9
             ÿ         255   11111111                           FF   
     
     utf8    e         101   01100101                           65  
             é         233   11000011 10101001               C3 A9
             smiley   9786   11100010 10011000 10111010   E2 98 BA
    Pour mon Editeur de commandes, pour éviter d'avoir un message d'erreur.
    A l'ouverture de chaque fichier, je vérifie s'il contient des octets 00
    et si c'est le cas je les remplace par des espaces et rend le fichier
    non éditatable dans le gtk_text_view.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        if ( $lines =~ s/\x00/ /g ) {
            MyGtk::message_box( -type    => 'warning',
                                -buttons => 'ok',
                                -label   => "Not editable,\n$filename");    
            $editable = 0;
        }
    Pour le moment j'ai pas touvé mieux.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    En utilisant le module Encode, tu ne peux pas résoudre ton souci ? Sans oublier dans ton script.

    Sinon qu'entends tu pas coloration syntaxique ? Tu veux la coloration dans quel langage ?
    En Tk, tu as Tk::CodeText, Tk::TextHighlight

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 23
    Points
    23
    Par défaut
    Par coloration syntaxique, j'entend coloration du texte tapé dans un éditeur comme gvim.

    Ce que fait Tk::CodeText et Tk::TextHighlight que je ne connaissais pas. Ils font même
    mieux que Gtk2::SourceView, fonctions d'indentation et de commentaire.

    Bon mais au point ou j'en suis, je ne vais pas tout recommencer avec Perl-Tk.

    De plus en Gtk on a une édition multiple d'un même buffer dans plusieurs vues,
    et ça je ne pense pas que se soit possible avec Tk.

    Le Gtk2::TextBuffer qui contient le texte édité est lié pour l'affichage à autant de
    widget Gtk2::TextView que voulu. Et chaque modification dans un TextView se répercute automatiquement
    dans tous les autres TextView.


    Pour ce qui est de "use utf8" dans perluniintro:


    Starting from Perl 5.8.0, the use of "use utf8" is no longer necessary.
    ...
    Only one case remains where an explicit "use utf8" is needed: if your
    Perl script itself is encoded in UTF-8, you can use UTF-8 in your
    identifier names, and in string and regular expression literals, by
    saying "use utf8". This is not the default because scripts with legacy
    8-bit data in them would break. See utf8.

    Si j'ai bien compris. Si le fichier Perl est enregistré sur le disque
    dur en utf8 et que ce script contient des caractères autre que
    de l'ASCII pur (127), alors et alors seulement on utilise "use utf8".

    Ce qui n'est pas mon cas. Je lis des fichiers sur le disque dans des chaines Perl,
    que je passe ensuite à Gtk.


    Le module Encode, je l'utile pour vérifier si le fichier est en utf8 et le convertir vers le
    format interne de Perl comme suit:

    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
     
     
       # Lecture fichier 
        open(FD, "$filename") or MyGtk::message_box( -type    => 'error',
                                                     -buttons => 'close',
                                                     -label   => "$filename $!"), 
                                 return;      
        my $octets = do { local $/; <FD> };  
        close(FD);  
     
        my $lines;  
     
        # Vérification si utf8
        if ( ! eval { $lines = decode("utf-8-strict", $octets, Encode::FB_CROAK) } && $octets ne '' ) {
     
            if ( MyGtk::message_box( -type    => 'warning',
                                     -buttons => 'yes-no',
                    	         -label   => "Not UTF8 encoding, $filename.\nOpen anyway ?")
                 eq 'no' ) { return; }
     
            $lines = $octets;       
        }
    pas sur que ce soit la bonne méthode ?


    Mon problème n'est pas d'écrire un éditeur de fichiers binaires, mais un éditeur qui ne
    plante pas, si par malheur j'ouvre un fichier de type *.jpg *.o *.pdf...

    Un fichier binaire ne correspond à aucun encodage utf8, iso-8859 ... pas de
    conversion possible avec le module Encode, tout les octets de 00 à FF y sont
    présents.

    C'est l'octet 00 qui pose problème, en langage C il indique la fin
    d'une chaîne.

    Pour s'en convaicre 2 petits scripts l'un en Perl-Gtk l'autre Perl-Tk.
    A chaque fois j'affiche les octets de 01 à FF suivie d'un é et d'un smiley en utf-8.

    Si je place un 00 dans la chaîne affichée, Gtk bugge et Tk arrête l'affichage
    à cet octet.

    A remarquer que à partir de l'octet 128 Perl convertie automatiquement
    les octets de Latin-1 vers leurs représentation en utf-8.


    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
     
     
        use Gtk2 -init;
        use utf8;    
     
        my $w = Gtk2::Window->new();
        $w->set_size_request(340, 250);
     
        my $line =  pack("C*", (1..255));
     
        for (my $i=40; $i < length($line); $i+=20) {
            substr($line, $i, 0) = "\n";
        }
     
        $line .= "é";
        $line .= pack("U", 9786);  
     
        my $v = Gtk2::TextView->new();
        my $b = Gtk2::TextBuffer->new();
        $v->set_buffer($b);
        $b->set_text($line);
     
        $w->add($v);
        $w->show_all();
        Gtk2->main();



    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
     
     
        use Tk;
        use utf8;
     
        my $main = MainWindow->new();
     
        my $text = $main->Text()->pack;
     
        my $line =  pack("C*", (1..255));
     
        for (my $i=40; $i < length($line); $i+=20) {
            substr($line, $i, 0) = "\n";
        }
     
        $line .= "é";
        $line .= pack("U", 9786);
     
        $text->insert('end', $line);
     
        MainLoop;

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Pourquoi ne pas tout simplement tester si le fichier est binaire ou non ? S'il est binaire, tu ne l'ouvres pas avec ton éditeur et tu affiches un popup d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( -B $fichier ) {
      print "fichier $fichier binaire\n";
    }
    Voir les tests sur les fichiers ici.

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 18
    Points : 23
    Points
    23
    Par défaut
    Bonsoir.

    2 caractères en seulement 2 caractères -B , le problèmes est résolue. J'ai l'air malin moi,
    merci djibril. Bon allez je vais lire les FAQs Perl, avant de me coucher.

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    n'oublies pas de mettre ton post en résolu.

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

Discussions similaires

  1. Erreur Gtk-CRITICAL dans une fenêtre secondaire
    Par Ridbark dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 03/05/2011, 20h10
  2. Réponses: 23
    Dernier message: 17/03/2011, 17h50
  3. erreur gtk critical
    Par muskachew dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 27/06/2009, 09h46
  4. (<unknown>:7854): Gtk-CRITICAL etc (Swing)
    Par rXpCH dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 24/10/2008, 14h59
  5. Problème de debuggage : Gtk-CRITICAL
    Par thibane dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 20/03/2007, 17h54

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