現在、物理キーボードとソフトウェア・キーボードの英語/日本語対応機能はソースコード(クラス内部)に
決め打ち(ハードコーディング)した情報を切り替えることで実現しています。
もともとソースコードレベルで日本語/英語を用意していたので、他の言語に対応しようとするとその言語用に
修正したソースコードを提供してもらい、ビルドし直す必要がありました。
この場合ソースコードの中身を理解しないと新しい言語に対応できませんし、気軽にテストも出来ません。
これを改善するため、現在決め打ちしている情報を外部テキストファイルとして用意し、特定のディレクトリに
配置すれば起動時に読み込むという感じにしようと思います。
#といっても日本語/英語以外が今必要なのか否か謎ですけど。
力技で外部ファイル解析出来ないことはないでしょうけど、後々のためflexとbisonで字句解析/構文解析
すればいいかなと思います。
(追記)
今の所flexでの字句解析までテスト用コードで確認しました。
==========================================================================================
[概要]
==========================================================================================
言語情報ファイルは以下の3つのフェーズからなる。
1. 言語情報フェーズ
Qt Brynhildrが言語情報として識別するための情報群
2. 物理キーボード定義フェーズ
Qt::Key_* と VK_* の対応情報、SHIFTキーの要/不要/関係なし, プラットフォーム指定 の情報
3. ソフトウェア・キーボード定義フェーズ
ソフトウェアのキーとキートップ文字列の対応情報(通常時、SHIFTキー押下時、Fnキー押下時)
==========================================================================================
[詳細]
==========================================================================================
------------------------------------------------------------------------------------------
0. 全体について
------------------------------------------------------------------------------------------
(1) '#'以降は改行までコメントとみなす。
(2) 空白、タブは無視する。
(3) 各情報はフェーズ名([General]/[Keys]/[SoftKeys])で区切る。
(4) 文字コードはUTF-8Nを想定
(5) 不明なKey_名, VK_名はエラーとする。ただしVK_NONE_00は0とみなす。
------------------------------------------------------------------------------------------
1. 言語情報 (内容は要検討)
------------------------------------------------------------------------------------------
言語名 :
作成者名 :
------------------------------------------------------------------------------------------
2. 物理キーボード定義フェーズ
------------------------------------------------------------------------------------------
一行に以下の3つの情報を','で区切って記述する。ここで定義されないQt::Key_*キーは無視される。
プラットフォーム指定が必要な場合は','で区切ってプラットフォーム名を追加する。
Qt::Key_名 : Qt namespace に示されている定数Key_*の文字列、Qt::は不要
VK_名 : windowsの仮想キーコード文字列
SHIFTKEY_INFO : "SHIFTKEY_NEED" : SHIFTキーが押されている必要がある
"SHIFTKEY_NONEED" : SHIFTキーが押されていない必要がある
"SHIFTKEY_THROUGHT": SHIFTキーの状態は関係しない
プラットフォーム指定 : 指定されたプラットフォーム上の時だけ指定が有効となる。
同じKeyに関する指定があった場合はより下の行の設定が優先となる。
Windows/macOS/Linux が指定可能
なし -> すべてのプラットフォームで有効
macOS -> macOSのみで有効
Key_Control, VK_CONTROL, SHIFTKEY_THROUGH
Key_Control, VK_LWIN, SHIFTKEY_THROUGH, macOS # override on macOS
コントロールキーに関する指定である上記の場合、macOS以外の場合はVK_CONTROLが送出されるが
macOSの時はVK_LWINが送出される。
ex.)
[Keys]
Key_Escape, VK_ESCAPE, SHIFTKEY_THROUGH
Key_Tab, VK_TAB, SHIFTKEY_THROUGH
Key_Backspace, VK_BACK, SHIFTKEY_THROUGH
Key_QuoteDbl, VK_2, SHIFTKEY_NEED # for JP keyboard
------------------------------------------------------------------------------------------
3. ソフトウェア・キーボード定義フェーズ
------------------------------------------------------------------------------------------
一行に以下の6つの情報を','で区切って記述する。
1, キーID
2., "キートップ文字列(通常)"
3, "キートップ文字列(シフトキー押下時)"
4, 仮想キーコード名、
5, "キートップ文字列(Fn押下時)"
6, Fnキー押下時に送る仮想キーコード名
キーID : SoftwareKeyboardクラスで定義されるキーID
キートップ文字列(通常) : 通常時に表示する文字列
キートップ文字列(シフトキー押下時) : シフトキー押下時に表示する文字列
仮想キーコード名 : 送出する仮想キーコード名
キートップ文字列(Fn押下時) : Fn押下時に表示する文字列
Fn押下時に送る仮想キーコード名 : Fn押下時に送出する仮想キーコード名
すべてのソフトウェア・キーについて定義しなければならない。足りない場合はエラーとする。
ex.)
[SoftKeys]
1, "Esc", "Esc", VK_ESCAPE, "Esc", VK_ESCAPE
2, "1", "!", VK_1, "F1", VK_F1
3, "2", "\"", VK_2, "F2", VK_F2
日本語キーボードのサンプルを作ってみました。
============================ ここから ================================================
# japanese keyboard layout sample file
# Copyright (c) 2017 FunFun
# spec version 0.0.1
[General]
[Keys]
Key_Escape, VK_ESCAPE, SHIFTKEY_THROUGH
Key_Tab, VK_TAB, SHIFTKEY_THROUGH
Key_Backspace, VK_BACK, SHIFTKEY_THROUGH
Key_Return, VK_RETURN, SHIFTKEY_THROUGH
Key_Enter, VK_RETURN, SHIFTKEY_THROUGH
Key_Insert, VK_INSERT, SHIFTKEY_THROUGH
Key_Delete, VK_DELETE, SHIFTKEY_THROUGH
Key_Pause, VK_PAUSE, SHIFTKEY_THROUGH
Key_Print, VK_SNAPSHOT, SHIFTKEY_THROUGH
Key_SysReq, VK_SNAPSHOT, SHIFTKEY_THROUGH
Key_Clear, VK_CLEAR, SHIFTKEY_THROUGH
Key_Home, VK_HOME, SHIFTKEY_THROUGH
Key_End, VK_END, SHIFTKEY_THROUGH
Key_Left, VK_LEFT, SHIFTKEY_THROUGH
Key_Up, VK_UP, SHIFTKEY_THROUGH
Key_Right, VK_RIGHT, SHIFTKEY_THROUGH
Key_Down, VK_DOWN, SHIFTKEY_THROUGH
Key_PageUp, VK_PRIOR, SHIFTKEY_THROUGH
Key_PageDown, VK_NEXT, SHIFTKEY_THROUGH
Key_Shift, VK_SHIFT, SHIFTKEY_THROUGH
Key_Meta, VK_LWIN, SHIFTKEY_THROUGH
Key_Meta, VK_CONTROL, SHIFTKEY_THROUGH, macOS # override on macOS
Key_Control, VK_CONTROL, SHIFTKEY_THROUGH
Key_Control, VK_LWIN, SHIFTKEY_THROUGH, macOS # override on macOS
Key_Alt, VK_MENU, SHIFTKEY_THROUGH
Key_CapsLock, VK_CAPITAL, SHIFTKEY_THROUGH
Key_NumLock, VK_NUMLOCK, SHIFTKEY_THROUGH
Key_ScrollLock, VK_SCROLL, SHIFTKEY_THROUGH
Key_F1, VK_F1, SHIFTKEY_THROUGH
Key_F2, VK_F2, SHIFTKEY_THROUGH
Key_F3, VK_F3, SHIFTKEY_THROUGH
Key_F4, VK_F4, SHIFTKEY_THROUGH
Key_F5, VK_F5, SHIFTKEY_THROUGH
Key_F6, VK_F6, SHIFTKEY_THROUGH
Key_F7, VK_F7, SHIFTKEY_THROUGH
Key_F8, VK_F8, SHIFTKEY_THROUGH
Key_F9, VK_F9, SHIFTKEY_THROUGH
Key_F10, VK_F10, SHIFTKEY_THROUGH
Key_F11, VK_F11, SHIFTKEY_THROUGH
Key_F12, VK_F12, SHIFTKEY_THROUGH
Key_F13, VK_F13, SHIFTKEY_THROUGH
Key_F14, VK_F14, SHIFTKEY_THROUGH
Key_F15, VK_F15, SHIFTKEY_THROUGH
Key_F16, VK_F16, SHIFTKEY_THROUGH
Key_F17, VK_F17, SHIFTKEY_THROUGH
Key_F18, VK_F18, SHIFTKEY_THROUGH
Key_F19, VK_F19, SHIFTKEY_THROUGH
Key_F20, VK_F20, SHIFTKEY_THROUGH
Key_F21, VK_F21, SHIFTKEY_THROUGH
Key_F22, VK_F22, SHIFTKEY_THROUGH
Key_F23, VK_F23, SHIFTKEY_THROUGH
Key_F24, VK_F24, SHIFTKEY_THROUGH
Key_0, VK_0, SHIFTKEY_NONEED
Key_1, VK_1, SHIFTKEY_NONEED
Key_2, VK_2, SHIFTKEY_NONEED
Key_3, VK_3, SHIFTKEY_NONEED
Key_4, VK_4, SHIFTKEY_NONEED
Key_5, VK_5, SHIFTKEY_NONEED
Key_6, VK_6, SHIFTKEY_NONEED
Key_7, VK_7, SHIFTKEY_NONEED
Key_8, VK_8, SHIFTKEY_NONEED
Key_9, VK_9, SHIFTKEY_NONEED
Key_A, VK_A, SHIFTKEY_THROUGH
Key_B, VK_B, SHIFTKEY_THROUGH
Key_C, VK_C, SHIFTKEY_THROUGH
Key_D, VK_D, SHIFTKEY_THROUGH
Key_E, VK_E, SHIFTKEY_THROUGH
Key_F, VK_F, SHIFTKEY_THROUGH
Key_G, VK_G, SHIFTKEY_THROUGH
Key_H, VK_H, SHIFTKEY_THROUGH
Key_I, VK_I, SHIFTKEY_THROUGH
Key_J, VK_J, SHIFTKEY_THROUGH
Key_K, VK_K, SHIFTKEY_THROUGH
Key_L, VK_L, SHIFTKEY_THROUGH
Key_M, VK_M, SHIFTKEY_THROUGH
Key_N, VK_N, SHIFTKEY_THROUGH
Key_O, VK_O, SHIFTKEY_THROUGH
Key_P, VK_P, SHIFTKEY_THROUGH
Key_Q, VK_Q, SHIFTKEY_THROUGH
Key_R, VK_R, SHIFTKEY_THROUGH
Key_S, VK_S, SHIFTKEY_THROUGH
Key_T, VK_T, SHIFTKEY_THROUGH
Key_U, VK_U, SHIFTKEY_THROUGH
Key_V, VK_V, SHIFTKEY_THROUGH
Key_W, VK_W, SHIFTKEY_THROUGH
Key_X, VK_X, SHIFTKEY_THROUGH
Key_Y, VK_Y, SHIFTKEY_THROUGH
Key_Z, VK_Z, SHIFTKEY_THROUGH
Key_Space, VK_SPACE, SHIFTKEY_THROUGH
Key_Exclam, VK_1, SHIFTKEY_NEED # '!'
Key_QuoteDbl, VK_2, SHIFTKEY_NEED # '"'
Key_NumberSign, VK_3, SHIFTKEY_NEED # '#'
Key_Dollar, VK_4, SHIFTKEY_NEED # '$'
Key_Percent, VK_5, SHIFTKEY_NEED # '%'
Key_Ampersand, VK_6, SHIFTKEY_NEED # '&'
Key_Apostrophe, VK_7, SHIFTKEY_NEED # '''
Key_ParenLeft, VK_8, SHIFTKEY_NEED # '('
Key_ParenRight, VK_9, SHIFTKEY_NEED # ')'
Key_Asterisk, VK_OEM_1, SHIFTKEY_NEED # '*'
Key_Plus, VK_OEM_PLUS, SHIFTKEY_NEED # '+'
Key_Comma, VK_OEM_COMMA, SHIFTKEY_NONEED # ','
Key_Minus, VK_OEM_MINUS, SHIFTKEY_NONEED # '-'
Key_Period, VK_OEM_PERIOD, SHIFTKEY_NONEED # '.'
Key_Slash, VK_OEM_2, SHIFTKEY_NONEED # '/'
Key_Colon, VK_OEM_1, SHIFTKEY_NONEED # ':'
Key_Semicolon, VK_OEM_PLUS, SHIFTKEY_NONEED # ';'
Key_Less, VK_OEM_COMMA, SHIFTKEY_NEED # '<'
Key_Equal, VK_OEM_MINUS, SHIFTKEY_NEED # '='
Key_Greater, VK_OEM_PERIOD, SHIFTKEY_NEED # '>'
Key_Question, VK_OEM_2, SHIFTKEY_NEED # '?'
Key_At, VK_OEM_3, SHIFTKEY_NONEED # '@'
Key_QuoteLeft, VK_OEM_3, SHIFTKEY_NEED # '`'
Key_BracketLeft, VK_OEM_4, SHIFTKEY_NONEED # '['
Key_BraceLeft, VK_OEM_4, SHIFTKEY_NEED # '{'
Key_Backslash, VK_OEM_5, SHIFTKEY_NONEED # '\'
Key_yen, VK_OEM_5, SHIFTKEY_NONEED # '\'
Key_Bar, VK_OEM_5, SHIFTKEY_NEED # '|'
Key_Underscore, VK_OEM_102, SHIFTKEY_NEED # '_'
Key_BracketRight, VK_OEM_6, SHIFTKEY_NONEED # ']'
Key_BraceRight, VK_OEM_6, SHIFTKEY_NEED # '}'
Key_AsciiTilde, VK_OEM_7, SHIFTKEY_NEED # '~'
Key_AsciiCircum, VK_OEM_7, SHIFTKEY_NONEED # '^'
Key_Henkan, VK_CONVERT, SHIFTKEY_THROUGH # Convert
Key_Muhenkan, VK_NONCONVERT, SHIFTKEY_THROUGH # NonConvert
Key_Zenkaku_Hankaku, VK_KANJI, SHIFTKEY_THROUGH # Zenkaku_Hankaku
Key_Back, VK_BROWSER_BACK, SHIFTKEY_THROUGH
Key_Forward, VK_BROWSER_FORWARD, SHIFTKEY_THROUGH
Key_Refresh, VK_BROWSER_REFRESH, SHIFTKEY_THROUGH
Key_Stop, VK_BROWSER_STOP, SHIFTKEY_THROUGH
Key_Search, VK_BROWSER_SEARCH, SHIFTKEY_THROUGH
Key_Favorites, VK_BROWSER_FAVORITES, SHIFTKEY_THROUGH
Key_HomePage, VK_BROWSER_HOME, SHIFTKEY_THROUGH
Key_Forward, VK_BROWSER_FORWARD, SHIFTKEY_THROUGH
Key_VolumeMute, VK_VOLUME_MUTE, SHIFTKEY_THROUGH
Key_VolumeDown, VK_VOLUME_DOWN, SHIFTKEY_THROUGH
Key_VolumeUp, VK_VOLUME_UP, SHIFTKEY_THROUGH
Key_MediaNext, VK_MEDIA_NEXT_TRACK, SHIFTKEY_THROUGH
Key_MediaPrevious, VK_MEDIA_PREV_TRACK, SHIFTKEY_THROUGH
Key_MediaStop, VK_MEDIA_STOP, SHIFTKEY_THROUGH
Key_MediaTogglePlayPause, VK_MEDIA_PLAY_PAUSE, SHIFTKEY_THROUGH
Key_LaunchMail, VK_LAUNCH_MAIL, SHIFTKEY_THROUGH
[SoftKeys]
# 1st row
1, "Esc", "Esc", VK_ESCAPE, "Esc", VK_ESCAPE
2, "1", "!", VK_1, "F1", VK_F1
3, "2", "\"", VK_2, "F2", VK_F2
4, "3", "#", VK_3, "F3", VK_F3
5, "4", "$", VK_4, "F4", VK_F4
6, "5", "%", VK_5, "F5", VK_F5
7, "6", "&", VK_6, "F6", VK_F6
8, "7", "'", VK_7, "F7", VK_F7
9, "8", "(", VK_8, "F8", VK_F8
10, "9", ")", VK_9, "F9", VK_F9
11, "0", "", VK_0, "F10", VK_F10
12, "-", "=", VK_OEM_MINUS, "F11", VK_F11
13, "^", "~", VK_OEM_7, "F12", VK_F12
14, "¥", "|", VK_OEM_5, "Ins", VK_INSERT
15, "BS", "BS", VK_BACK, "Del", VK_DELETE
# 2nd row
16, "Tab", "Tab", VK_TAB, "Tab", VK_TAB
17, "Q", "Q", VK_Q, "Q", VK_Q
18, "W", "W", VK_W, "W", VK_W
19, "E", "E", VK_E, "E", VK_E
20, "R", "R", VK_R, "R", VK_R
21, "T", "T", VK_T, "T", VK_T
22, "Y", "Y", VK_Y, "Y", VK_Y
23, "U", "U", VK_U, "U", VK_U
24, "I", "I", VK_I, "I", VK_I
25, "O", "O", VK_O, "O", VK_O
26, "P", "P", VK_P, "P", VK_P
27, "@", "`", VK_OEM_3, "", VK_NONE_00
28, "[", "{", VK_OEM_4, "", VK_NONE_00
29, "RET", "RET", VK_RETURN, "RET", VK_RETURN
# 3rd row
30, "Ctrl", "Ctrl", VK_LCONTROL, "Ctrl", VK_LCONTROL
31, "A", "A", VK_A, "A", VK_A
32, "S", "S", VK_S, "S", VK_S
33, "D", "D", VK_D, "D", VK_D
34, "F", "F", VK_F, "F", VK_F
35, "G", "G", VK_G, "G", VK_G
36, "H", "H", VK_H, "H", VK_H
37, "J", "J", VK_J, "J", VK_J
38, "K", "K", VK_K, "K", VK_K
39, "L", "L", VK_L, "L", VK_L
40, ";", "+", VK_OEM_PLUS, "", VK_NONE_00
41, ":", "*", VK_OEM_1, "Pause",VK_PAUSE
42, "]", "}", VK_OEM_6, "PrtS", VK_SNAPSHOT
# 4th row
43, "Shift","Shift",VK_LSHIFT, "Shift",VK_LSHIFT
44, "Z", "Z", VK_Z, "Z", VK_A
45, "X", "X", VK_X, "X", VK_Z
46, "C", "C", VK_C, "C", VK_C
47, "V", "V", VK_V, "V", VK_V
48, "B", "B", VK_B, "B", VK_B
49, "N", "N", VK_N, "N", VK_N
50, "M", "M", VK_M, "M", VK_M
51, ",", "<", VK_OEM_COMMA, "", VK_NONE_00
52, ".", ">", VK_OEM_PERIOD, "", VK_NONE_00
53, "/", "?", VK_OEM_2, "", VK_NONE_00
54, "¥", "_", VK_OEM_102, "", VK_NONE_00
55, "↑", "↑", VK_UP, "PgU", VK_PRIOR
56, "Shift","Shift",VK_RSHIFT, "Shift",VK_RSHIFT
# 5th row
57, "Fn", "Fn", VK_NONE_00, "Fn", VK_NONE_00
58, "Alt", "Alt", VK_LMENU, "Alt", VK_LMENU
59, "Win", "Win", VK_LWIN, "Win", VK_LWIN
60, "JP", "JP", VK_KANJI, "JP", VK_KANJI
61, "Space","Space",VK_SPACE, "Space",VK_SPACE
62, "Ctrl", "Ctrl", VK_RCONTROL, "Ctrl", VK_RCONTROL
63, "Alt", "Alt", VK_RMENU, "Alt", VK_RMENU
64, "Fn", "Fn", VK_NONE_00, "Fn", VK_NONE_00
65, "←", "←", VK_LEFT, "Home", VK_HOME
66, "↓", "↓", VK_DOWN, "PgD", VK_NEXT
67, "→", "→", VK_RIGHT, "End", VK_END
============================ ここまで ================================================
最近のコメント