Gtk3のキーリストとキーボードショートカットの多重設定

Gtk3のキーリストとキーボードショートカットの多重設定

ベクター・グラフィックス・エディタ Vecterionのコーディング作業中に得た知見です。

1. Gtkのキーリストはソースコードを参照。Webからも見れる。
2. Gtkのキーボードショートカットは別のキーで同じ関数を呼び出す設定ができる。






# 事の発端

Plus(+),Minus(-)KeyはキーボードとTenKeyの両方にあるが、キーコードが異なるためGtk内部では別のキーとして扱っている。
Vecterionではこれらを区別しないで、両方のキーに同じアクセラレータ(GtkのMenu連動キーボード・ショートカット機能)を紐付けたい。


# GTKキーボード定数値一覧

GTK(GDK)のキーボード定数と定数値の一覧は以下
//! key list: https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h


## キーボード定数値を検索する方法

アプリケーションでGtkコールバックのkeyvalを取得し、実際に押下して16進数値でデバッグ出力して上記の一覧を検索するとよいです。

```
debug: _cb_key_press()[98]: keyval=0x002b status=0x0005
debug: slot_et_etaion_from_key_action()[270]: no use:43

debug: _cb_key_press()[98]: keyval=0xffab status=0x0000
debug: slot_et_etaion_from_key_action()[270]: no use:65451
```

# 2重のキーボード・ショートカット

TenKeyとキーボードのPlus(+),Minus(-)Keyは内部的には別のキーですが、両方のキーにそれぞれ、同じ関数を呼ぶショートカットを設定してやると、ユーザは両方とも同じキーとして扱えるので混乱しないと思います。

```
1846 ¬
1847 static GtkWidget *_pv_get_menuitem_new_tree_of_view_zoom(GtkAccelGroup *accel_group)¬
1848 {¬
1849 >-------GtkWidget *menuitem_root;¬
1850 >-------GtkWidget *menuitem;¬
1851 >-------GtkWidget *menu;¬
1852 ¬
1853 >-------menuitem_root = gtk_menu_item_new_with_label ("_Zoom");¬
1854 >-------gtk_menu_item_set_use_underline (GTK_MENU_ITEM (menuitem_root), TRUE);¬
1855 ¬
1856 >-------menu = gtk_menu_new ();¬
1857 >-------gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_root), menu);¬
1858 ¬
1859 >-------// ** Accel to "/_View/_Zoom/Zoom _In (Ctrl++)"¬
1860 >-------menuitem = gtk_menu_item_new_with_label ("Zoom _In");¬
1861 >-------gtk_menu_item_set_use_underline (GTK_MENU_ITEM (menuitem), TRUE);¬
1862 >-------gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);¬
1863 >-------g_signal_connect(menuitem, "activate", G_CALLBACK(_cb_menu_view_zoom_in), NULL);¬
1864 >-------gtk_widget_add_accelerator (menuitem, "activate", accel_group,¬
1865 >------->------->-------GDK_KEY_plus, (GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE);¬
1866 >-------gtk_widget_add_accelerator (menuitem, "activate", accel_group,¬
1867 >------->------->-------GDK_KEY_KP_Add, (GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE); // in ten key.¬
1868 ¬
1869 >-------// ** Accel to "/_View/_Zoom/Zoom _Out (Ctrl+-)"¬
1870 >-------menuitem = gtk_menu_item_new_with_label ("Zoom _Out");¬
1871 >-------gtk_menu_item_set_use_underline (GTK_MENU_ITEM (menuitem), TRUE);¬
1872 >-------gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);¬
1873 >-------g_signal_connect(menuitem, "activate", G_CALLBACK(_cb_menu_view_zoom_out), NULL);¬
1874 >-------gtk_widget_add_accelerator (menuitem, "activate", accel_group,¬
1875 >------->------->-------GDK_KEY_minus, (GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE);¬
1876 >-------gtk_widget_add_accelerator (menuitem, "activate", accel_group,¬
1877 >------->------->-------GDK_KEY_KP_Subtract, (GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE); // in ten key.¬
1878 ¬
1879 >-------return menuitem_root;¬
1880 }¬
1881 ¬
```

このブログの人気の投稿

squid3プロキシサーバの設定(Ubuntu13.10)

Ubuntu13.04で使える動画編集ソフト一覧

GIMP2.8でイラストにペン入れを行う