The insert-text signal handler can optionally alter the text to be inserted. It may

  • Return no values for no change. Be sure to end with an empty return.

    sub my_insert_text_handler {
      my ($widget, $text, $len, $pos, $userdata) = @_;
      print "inserting '$text' at char position '$pos'\n";
      return;  # no values
    }
  • Return two values ($text, $pos) which are the new text and character position.

    sub my_insert_text_handler {
      my ($widget, $text, $len, $pos, $userdata) = @_;
      return (uc($text), $pos);  # force to upper case
    }
  • Return no values and modify the text in $_[1] and/or position in $_[3]. For example,

    sub my_insert_text_handler {
      $_[1] = uc($_[1]);   # force to upper case
      $_[3] = 0;           # force position to the start
      return;  # no values
    }

Note that currently in a Perl subclass of a Gtk2::Editable widget, a class closure (ie. class default signal handler) for insert-text does not work this way. It instead sees the C level ($text, $len, $pos_pointer), where $pos_pointer is a machine address and cannot be used easily. Hopefully this will change in the future. A signal_chain_from_overridden with the args as passed works, but for anything else the suggestion is to use a signal_connect instead.