Re: Entry / TextBuffer that does not listen to accelerators?



Am Freitag 30 September 2005 15:14 schrieb Jan Hudec:
On Fri, Sep 30, 2005 at 14:51:40 +0200, Stephan Brunner wrote:
Hi all,

I'd thought this is a common problem, but didn't find a solution in the
docs or via google:

In  my application, I would like to have some "fast and simple"
accelerators like <u> or <delete>. On the other hand, I have some
Gtk2::Entry and Gtk2::TextBuffer for text editing. Of course, I still do
want to be able to insert 'u' in those...

It should work. Out of the box. Have you _tried_ it?

I tried it - see the following short example:

*** snip ***

#!/usr/bin/perl
use warnings;
use strict;
use Gtk2 '-init';

my %Top;
$Top{window} = Gtk2::Window->new;
$Top{window}->signal_connect (destroy => sub { Gtk2->main_quit; });
$Top{window}->set_default_size(300, 100);

my %Menu;
$Menu{string} = <<"EOS";
<ui>
  <menubar name='Menu'>
    <menu action='File'>
    <menuitem action='u_action'/>
    </menu>
  </menubar>
</ui>
EOS

# Actions
$Menu{actions} = [
     [ 'File', undef, 'File' ], 
     [ "u_action",  undef,    "Do nothing", "u", undef, \&u_action ]
   ];
$Menu{action_group} = Gtk2::ActionGroup->new('Menu');
$Menu{action_group}->add_actions($Menu{actions});

# UIManager
$Menu{manager} = Gtk2::UIManager->new();

# Actions -> UIManager
$Menu{manager}->insert_action_group($Menu{action_group}, 0);

# Menu{string} -> UIManager
$Menu{manager}->add_ui_from_string($Menu{string});

# Accelerators -> Top{window}
$Top{window}->add_accel_group($Menu{manager}->get_accel_group());

# VBox -> Top{window}
$Top{vbox} = Gtk2::VBox->new();
$Top{window}->add($Top{vbox});

# Menu -> VBox
$Top{vbox}->pack_start($Menu{manager}->get_widget('/Menu'), 0, 0, 0);

# Entry -> VBox
my $Entry = Gtk2::Entry->new();
$Entry->set_text("Enter some text (try 'u'!)");
$Top{vbox}->pack_start($Entry, 0, 0, 0);

# Run
$Top{window}->show_all;
Gtk2->main;

# the action
{       
        my $count;
        sub u_action {
                $count++;
                print "$count: This is sub u_action...\n";
        }
}

*** snap ***

I am not able to enter any 'u' into the Entry.

The reason this should work is, that the active widget gets the input.
If the widget does not handle it, it passes it on to it's parent. And so
on up to the window, which handles the accels.

Reading this, I wonder even more why I can't get it to work the way I want to. 
Is there some subtle mistake or usage-error in my code?

Stephan



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]