言語依存データの外部ファイル化について考える その1
現在、物理キーボードとソフトウェア・キーボードの英語/日本語対応機能はソースコード(クラス内部)に
決め打ち(ハードコーディング)した情報を切り替えることで実現しています。
もともとソースコードレベルで日本語/英語を用意していたので、他の言語に対応しようとするとその言語用に 修正したソースコードを提供してもらい、ビルドし直す必要がありました。
この場合ソースコードの中身を理解しないと新しい言語に対応できませんし、気軽にテストも出来ません。 これを改善するため、現在決め打ちしている情報を外部テキストファイルとして用意し、特定のディレクトリに 配置すれば起動時に読み込むという感じにしようと思います。
#といっても日本語/英語以外が今必要なのか否か謎ですけど。
力技で外部ファイル解析出来ないことはないでしょうけど、後々のためflexとbisonで字句解析/構文解析 すればいいかなと思います。
(追記)
今の所flexでの字句解析までテスト用コードで確認しました。
============================ ここから ================================================
============================ ここまで ================================================
もともとソースコードレベルで日本語/英語を用意していたので、他の言語に対応しようとするとその言語用に 修正したソースコードを提供してもらい、ビルドし直す必要がありました。
この場合ソースコードの中身を理解しないと新しい言語に対応できませんし、気軽にテストも出来ません。 これを改善するため、現在決め打ちしている情報を外部テキストファイルとして用意し、特定のディレクトリに 配置すれば起動時に読み込むという感じにしようと思います。
#といっても日本語/英語以外が今必要なのか否か謎ですけど。
力技で外部ファイル解析出来ないことはないでしょうけど、後々のため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
============================ ここまで ================================================
« macOS 版のアプリケーションメニューの日本語化 | トップページ | Ver.1.6.7 リリース »
コメント