2013-09-07 2 views
3

Почему этот фрагмент кода не перемещает курсор на последний символ записи?gtk entry set_position не перемещает курсор

use Gtk2 '-init'; 
my $window = Gtk2::Window->new; 
my $entry = Gtk2::Entry->new; 

my $handler; 
$handler = $entry->signal_connect ('insert-text' => 
    sub { 
     my (
      $entry, 
      $chrs, 
      $len, 
      $pos_strange, 
      $handler, 
     ) = @_; 
     $entry->signal_handler_block ($$handler); 
     $entry->set_text ('tryme'); 
     $entry->signal_stop_emission_by_name ('insert-text'); 
     $entry->signal_handler_unblock ($$handler); 
     $entry->set_position (-1); 
    }, 
    \$handler 
); 

$window->set_size_request (200, 100); 
$window->add ($entry); 
$window->set_position ('center_always'); 
$window->show_all; 
$window->signal_connect (delete_event => sub { Gtk2->main_quit; }); 
Gtk2->main; 
+0

Возможно, Gtk2 меняет положение после выполнения обработчика? Чтобы обойти это, вы можете попытаться отложить настройку положения, например. используя что-то вроде «Glib :: Idle-> add (sub {$ entry-> set_position (-1)});' –

+0

Другая возможность: вместо вызова 'set_text' самостоятельно и защиты от inifinite петель в обработке сигналов, вы можете просто верните '($ new_text, $ new_position)'. По какой-то причине «-1», похоже, не работает, но работает следующее: '(« tryme », length ($ entry-> get_text.« Tryme »))' –

ответ

3

Когда последний insert-text обработчик возвращает Gtk обновляет позицию курсора, используя значение pos поэтому код перемещает курсор, а затем Gtk движется снова. Вы можете использовать обратный вызов в режиме ожидания, как было предложено выше, но, вероятно, было бы проще обновить pos в вашем обработчике. Вы хотите сделать perl-эквивалент *pos = g_utf8_strlen ("tryme"), 0) вместо $entry->set_position (-1);

Смежные вопросы