On Apr 29, 2008, at 9:48 AM, Gabor Szabo wrote:

> I must be missing something:
>
> I am trying to get an iter on a line.
>
> Sometimes the offset is too big so the below function throws
> an exception:
>
> $end_iter= $buffer->get_iter_at_line_offset($line, $end);
>
> Gtk-ERROR **: Char offset 24 is off the end of the line at ....
>
> The problem is that even if I put the expression in eval it does not
> catch it.

When it says "$somename-ERROR" like that, it's not really an  
exception, but somebody calling g_error() down inside the C code.   
These are considered fatal error conditions.

Sure enough:

$ grep "is off the end of the line" gtk+/gtk/*.c
gtk+/gtk/gtktextiter.c:    g_error ("Byte index %d is off the end of  
the line",
gtk+/gtk/gtktextiter.c:    g_error ("Char offset %d is off the end of  
the line",

Those are in the functions iter_set_from_byte_offset() and  
iter_set_from_char_offset().

The docs for gtk_text_buffer_get_iter_at_line_offset() say:

  * Obtains an iterator pointing to @char_offset within the given
  * line. The @char_offset must exist, offsets off the end of the line
  * are not allowed. Note <emphasis>characters</emphasis>, not bytes;
  * UTF-8 may encode one character as multiple bytes.


> Can I catch this exception somehow?

With some work, yes, you can trap it with a perl handler.  This is not  
really generic, though, and is not a proper solution to your problem.

#!/usr/bin/perl
use strict;
use Glib;

Glib::Log->set_handler ("Foo", [qw/fatal error critical warning/], sub {
        my ($domain, $flags, $message) = @_;
        use Carp;
        die Carp::longmess("$domain: $message");
});

eval {
        Glib->error ("Foo", "holy crap!");
};
if ($@) {
        print "We trapped a g_error() call, whose message was:\n"
            . "  \"[EMAIL PROTECTED]"\n";
}
__END__



> As a workaround, can I get the length of a row from the Text::Buffer?

/**
  * gtk_text_iter_get_chars_in_line:
  * @iter: an iterator
  *
  * Returns the number of characters in the line containing @iter,
  * including the paragraph delimiters.
  *
  * Return value: number of characters in the line
  **/

Looks like your best bet will be

    $iter = $buffer->get_iter_at_line ($line_index);
    $chars_in_line = $iter->get_chars_in_line ();
    if ($chars > $chars_in_line) {
        $chars = $chars_in_line;
    }
    $iter->forward_chars ($chars);


--
So this new album took us quite a while, to get it together, to find a  
title and things like that - and we were travelling quite a bit - we  
made a few sort of gestures in the East, and a few gestures in the  
West, and then we got thrown out because of our gestures - this is  
something that we decided was an apt title for a thing that's called  
'The Song Remains The Same'.
   -- Robert Plant, rambling to introduce a song

_______________________________________________
gtk-perl-list mailing list
gtk-perl-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-perl-list

Reply via email to