Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I've been able to set several keybord shortcuts for a GtkTextView and a GtkTextEntry using the new css provider system. I'm finding, though, that I only seem to be able to establish keybindings for combinations including a modifier key. The widget doesn't respond to any bindings I set up that use:

  • the delete key
  • the escape key
  • individual letter or punctuation keys alone

Here's the code where I set up the css provider for the keybindings:

   #set up style context
    keys = Gtk.CssProvider()
    keys.load_from_path(os.path.join(data_path, 'keybindings.css'))

    #set up style contexts and css providers
    widgets = {'window': self.window, 'vbox': self.vbox,
                'toolbar': self.toolbar, 'search_entry': self.search_entry,
                'paned': self.paned,
                'notelist_treeview': self.notelist_treeview,
                'notelist_window': self.notelist_window,
                'notetext_window': self.notetext_window,
                'editor': self.editor,
                'statusbar': self.statusbar
                }
    for l, w in widgets.iteritems():
        w.get_style_context().add_provider(keys,
                                        Gtk.STYLE_PROVIDER_PRIORITY_USER)

Then in keybindings.css this is an example of what works:

@binding-set gtk-vi-text-view
{
    bind "<ctrl>b" { "move-cursor" (display-lines, -5, 0) };     /* 5 lines up */
    bind "<ctrl>k" { "move-cursor" (display-lines, -1, 0) };     /* down */
    bind "<ctrl>j" { "move-cursor" (display-lines, 1, 0) };      /* up */
}

Part of what I'm trying to do is just add proper delete-key function to the text widgets (right now the delete key does nothing at all). So if I add a binding like one of these, nothing happens:

bind "Delete" { "delete-selection" () };
bind "Delete" { "delete-from-cursor" (chars, 1) };

The other part of what I want to do is more elaborate. I want to set up something like Vim's command and visual modes. So at the moment I'm just playing around with (a) setting the widget to editable=false by hitting the esc key; and (b) using homerow letters to move the cursor (as a proof-of-concept exercise). So far there's no response from the escape key or from the letter keys, even though the bindings work when I apply them to modifier-key combinations.

For example, I do this in the css for the text-widget:

bind "j" { "move-cursor" (display-lines, 1, 0) };            /* down */
bind "k" { "move-cursor" (display-lines, -1, 0) };           /* up */
bind "l" { "move-cursor" (logical-positions, 1, 0) };        /* right */
bind "h" { "move-cursor" (logical-positions, -1, 0) };       /* left */

but none of these bindings does anything, even if other bindings in the same set are respected.

What's especially odd is that the vim-like movement bindings above are respected when I attach them to a GtkTreeView widget for navigating the tree-view options:

@binding-set gtk-vi-tree-view {
    bind "j" { "move-cursor" (display-lines, 1) };               /* selection down */
    bind "k" { "move-cursor" (display-lines, -1) };              /* selection up */ }

So it seems like there are limitations or overrides of some kind on keybindings for the TextView widget (and for the del key?), but I can't find documentation of anything like that. Are these just things that can't be done with the css providers? If so, what are my alternatives for non-modified keybindings?

Thanks.

share|improve this question
    
It kind of makes sense that if the TextView widget is listening for normal key input to insert text, that those keys wouldn't be bindable for other purposes. Does making the TextView object uneditable with Gtk.TextView.set_editable(False) change things? –  Ian B. Oct 12 '12 at 14:08
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.