Right"; /* move-words */ unbind "Left"; /* move-words */ unbind "Up"; /* move-lines */ unbind "Down"; /* move-lines */ unbind "Up"; /* move-viewport */ unbind "Down"; /* move-viewport */ bind "Up" { "move-lines...">

How to disable GtkTextView default shortcuts in GTK4? (original) (raw)

Hi,

In fact I want to disable some shortcuts in GtkSourceView5 and rebind some others, in GTK3 era this piece of CSS worked:

/* Unset key bindings */
@binding-set TextViewKeyBindings
{
  unbind "<Alt>Right";     /* move-words */
  unbind "<Alt>Left";      /* move-words */
  unbind "<Alt>Up";        /* move-lines */
  unbind "<Alt>Down";      /* move-lines */
  unbind "<Alt><Shift>Up"; /* move-viewport */
  unbind "<Alt><Shift>Down"; /* move-viewport */

  bind "<Ctrl><Shift>Up"   { "move-lines" (0) };
  bind "<Ctrl><Shift>Down" { "move-lines" (1) };
  bind "<Ctrl>Up"    { "move-viewport" (0, -1) };
  bind "<Ctrl>Down"  { "move-viewport" (0, 1) };
}

textview
{
  -gtk-key-bindings: TextViewKeyBindings;
}

But in GTK4 I get a:

Theme parser error: style.css:90:1-13: Unknown @ rule
Theme parser error: style.css:107:3-20: No property named "-gtk-key-bindings"

What’s the way to go with this in GTK4? I found nothing on Gtk3->4 migration guide and there’s no Gtk – 3.0: Key Bindings on GTK4 docs, so I supposed this feature was removed.

Thanks in advance for any help.

ebassi (Emmanuele Bassi) July 22, 2023, 11:41pm 2

Yes, the “key themes” were removed. There is no replacement, as of this moment. There’s also no plan to re-introduce a way to change existing key bindings. See this comment on GitLab: drop keyboard themes (#1669) · Issues · GNOME / gtk · GitLab

hugopl (Hugo Parente Lima) July 23, 2023, 1:04pm 3

I always found this way of defining shortcuts on CSS files confusing and IMO was a good decision to not move with it to GTK4.

But…. is there not even a ugly workaround to remove these key bindings? like adding a shortcut controller with same shortcuts but doing nothing and activating another action?

GykSourceView uses keybindings that I need to use in my application and if I can’t disable them I can’t use it all, making it impossible to port my app to GTK4 😭

ebassi (Emmanuele Bassi) July 23, 2023, 1:47pm 4

Unlike GTK3, GTK4 has a more complex input model:

You can use a custom ShortcutController for your application, and set it to capture key shortcuts; those will take the precedence over the shortcuts used by other widgets—assuming GtkSourceView does not use the capture phase itself.

hugopl (Hugo Parente Lima) July 23, 2023, 3:14pm 5

Thanks, I’ll give I try later and report the results here.

hugopl (Hugo Parente Lima) July 23, 2023, 8:21pm 6

It worked since GtkSourceView use the bubble phase, thanks!!

Solution (in Crystal lang)

    sc_controller = Gtk::ShortcutController.new(propagation_phase: :capture)
    action = Gtk::CallbackAction.new(->(w  : Gtk::Widget, v : GLib::Variant?){ true })
    trigger = Gtk::ShortcutTrigger.parse_string("<Alt>Up|<Alt>Right|<Alt>Down|<Alt>Left")
    shortcut = Gtk::Shortcut.new(action: action, trigger: trigger)
    sc_controller.add_shortcut(shortcut)

    add_controller(sc_controller)

system (system) Closed August 22, 2023, 8:22pm 7

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.