How to use accelerators in Gtk?
Could you please clarify whether you want mnemonics (keyboard shortcuts for gui widgets i.e. ctrl-q) or accelerators (keyboard shortcuts for activating menu items i.e. alt-f q). As far as I understand these are two different things, so setting a mnemonic for a menu item will not also form a accelerator for it.
In any case, for the accelerators you can form them by simply creating your menu items with a different function: Gtk.MenuItem.with_mnemonic("_File");
in stead of Gtk.MenuItem.with_label("File")
. It is then re-definable with e.g. the file.set_label('Fil_e') function
For the mnemonics, I'm not exactly sure why it doesn't work, as I'm totally new to vala. But I was able to piggy bag of of this c-example and get it to work using accelerator groups in stead of the accelerator map. So I replaced
// Register a new accelerator with the global accelerator map
Gtk.AccelMap.add_entry("<MyWindow>/File/Quit", 'Q', Gdk.ModifierType.CONTROL_MASK);
quit_mi.set_accel_path("<MyWindow>/File/Quit");enter code here
with
var accel_group = new Gtk.AccelGroup();
this.add_accel_group(accel_group);
quit_mi.add_accelerator("activate", accel_group, 'R', Gdk.ModifierType.CONTROL_MASK, Gtk.AccelFlags.VISIBLE);
and that seems to do the trick.
I hope it helps. Regards TLE
Related videos on Youtube
LuisABOL
Updated on September 18, 2022Comments
-
LuisABOL over 1 year
I need to make an application in Vala, using Gtk, that supports keyboard accelerators that can be changed by the user.
First, I add an entry to the global Gtk.AccelMap and then set the accel_path for the Gtk.MenuItems. But, it doesn't work. The accels don't appear in the items of the menubar. To clear what I'm trying to do, here is a sample code:
// main.vala public class MyWindow: Gtk.Window { public MyWindow() { this.set_default_size(500, 500); var main_box = new Gtk.VBox(false, 0); this.add(main_box); // Menubar var menubar = new Gtk.MenuBar(); main_box.pack_start(menubar, false, false, 0); var file = new Gtk.MenuItem.with_label("File"); menubar.add(file); var file_menu = new Gtk.Menu(); file.set_submenu(file_menu); var quit_mi = new Gtk.MenuItem.with_label("Quit"); file_menu.append(quit_mi); // Register a new accelerator with the global accelerator map Gtk.AccelMap.add_entry("<MyWindow>/File/Quit", 'Q', Gdk.ModifierType.CONTROL_MASK); quit_mi.set_accel_path("<MyWindow>/File/Quit"); // Connect signals quit_mi.activate.connect(Gtk.main_quit); // Label var label = new Gtk.Label("My Window"); main_box.pack_start(label, true, true, 0); this.destroy.connect(Gtk.main_quit); } } int main(string[] args) { Gtk.init(ref args); var win = new MyWindow(); win.show_all(); Gtk.main(); return 0; }
I use:
valac main.vala -o main --pkg gtk+-3.0
to compile the source code.
So, the question is: what's missing in the code? I think I need to do something else, but I don't know what.
-
LuisABOL almost 12 yearsYou inverted the meaning of the words: what you said to be an accelerator is, actually, a mnemonic, and vice-versa.
-
LuisABOL almost 12 yearsI already tried to do what you suggested, but I wanna know how to use an AccelMap to load the ACCELERATORS.
-
TLE almost 12 yearsAhh I followed the wording on this page. In any case I think there is still some confusion. You want accelerators (cleared up to be a general shortcut to activate a widget), but at the same time you ask why it does not show a mnemonic. I don't think those are linked, after all what would happen then if you make an accelerator for a menuitem using a key (letter) that is not in the label? In any case, I regret not being able to help you as I don't know much about the accelerator maps. Good luck.