Hi,

On Wed, Apr 30, 2008 at 8:04 AM, muppet <[EMAIL PROTECTED]> wrote:
>
>  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.

As a Perl programmer I think I should be able to trap every exception,
even if that
occurs in the C-level code beneath.

I think it would be better if the Perl binding would trap these and
throw them as
exceptions in the Perl code.

Please consider adding this to future releases of Gtk2.


>
> > 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);

While I actually already found a solution to the problem I had then
I am sure I'll encounter similar issues later.

Would it be possible to add the above convenience function to the standard
Gtk2 Perl distribution?

Thanks anyway

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

Reply via email to