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 ¬
```

Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換する

 Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換することができるが、上手く変換されない場合がある。   以前作った魔法陣イラスト素材をイラスト素材ストックサイトへ登録しようと思い立ち、改めて素材用にラスタライズ変換をかけようとした。   ラスタライズ変換...