Re: intercepting accelerator keypresses

Jason Hildebrand <[email protected]>
Newsgroups gmane.comp.gnome.components,gmane.comp.gnome.gtk+.devel.general
Message-ID <1049157579.5102.16.camel@localhost>
On Mon, 2003-03-31 at 01:57, Alexander Larsson wrote:
> On 28 Mar 2003, Michael Meeks wrote:
> 
> > Hi Jason,
> > 
> > On Thu, 2003-03-20 at 19:45, Jason Hildebrand wrote:
> > > I'm implementing the NautilusView interface for vim, so that vim can be
> > > used to view/edit a file in Nautilus, and have run into a snag wrt
> > > keypresses.
> > > 
> > > Nautilus uses "Escape" as an accelerator for the "View->Stop" menu item.
> > > This prevents the use of Esc within the embedded Vim to jump back to
> > > command-mode, since Nautilus seems to swallow this keypress (even when
> > > the menu item is insensitive).  There are other accelerators which
> > > conflict with vim keypresses as well.
> > > 
> > > Is there a way for the control to get first dibs on handling these
> > > keypresses?
> > 
> > 	AFAIK no - the event comes from X itself, to the toplevel window and
> > thus it gets first go at it. Of course - if you have the focus in the
> > child window then the same thing applies in reverse - you get the first
> > go at it. I'm afraid I don't fully understand the focus handling issues
> > with Controls / Window Managers / Sloppy focus etc. ;-) but Federico
> > does, so I'd bother him about it if you can find a spare moment from
> > him.
> 
> The escape accelerator for view->stop has been removed in CVS head. It 
> conflicted with several other uses of escape in Nautilus and was only 
> introduced (semi-)recently.

Hi Alexander,

Thanks for the tip.  Unfortunately, though, this doesn't solve the
problem in general.  There are several other Nautilus accels which I
need to intercept.

For anyone who's interested, I came up with a (somewhat broken)
solution, after much digging through gtk/bonobo source code.

It seems like if you create an accelerator group in the control and
attach it to the GtkPlug, like this:

    group = gtk_accel_group_new();
    plug = (BonoboPlug *)bonobo_control_get_plug(control);
    gtk_window_add_accel_group(GTK_WINDOW(plug), group);
    closure = g_cclosure_new (G_CALLBACK (key_press_event), NULL,
(GClosureNotify)g_free);
    gtk_accel_group_connect(group, GDK_Escape, 0, 0, closure);
    closure = g_cclosure_new (G_CALLBACK (key_press_event), NULL,
(GClosureNotify)g_free);

Then those specific keys will be intercepted and passed to the control.

Unfortunately the code which supports this (located in
GtkSocket/GtkPlug) is broken in current gtk versions.  I provided a
small patch to fix it and filed a bug
(http://bugzilla.gnome.org/show_bug.cgi?id=108927) , so hopefully it'll
work again soon. :)

peace,
Jason
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.