VitaでZAVASやりたくて(12)

前回のあらすじ

数々の困難を乗り越えてVita版Retroarchへタッチ機能を搭載するという野望を達成した私は、ついに念願のソフトウェアキーボードを手に入れることに成功。
しかし正常動作させることには失敗してしまうのであった。
どれくらいの失敗かというとテンキーが欲しくてソフトウェアキーボードを実装したのにテンキーが効かないぐらいの失敗だよ。
いったいどうなってしまうのか!

ソフトウェアキーボードを色々触ってみる

まずは敵を知ることからはじめよと言うのは孫氏のお言葉である。(ソフトバンクとは関係ない方の)
現状ではとにかく訳が分からないのでとりあえず色々と触ってみることにします。
すると、これもそれもあれもどれも色々おかしい。
触ってみればみるほど訳が分からなくなるほどおかしい。

すぐに気が付くおかしいところ

  • 数字は全然押せない。テンキーもメイン側も同じ。

  • 英字はASDFの横一列だけなんでか常に大文字。

  • 記号がいろいろ押せない。

  • テンキーの「-」を押すと「-,+」。「+」を押すと「,+」。なんか知らんが同時に複数入力される。それどころか「Enter」も「,+」。わけがわからないよ。

  • テンキーのDeleteは「=」。何を言ってるか分からねえと思うが俺だって分からん。

  • 意外にもファンクションキーは押せる。(これは別に変ではないか)

おいおいまてまて何が起こっているんだ。

オーバーレイの設定ファイル「US-101.cfg」を見てみる

ソフトウェアキーボードの設定ファイルは、Vita上だと「ux0:data/retroarch/overlays/keyboards」に、ソースコード上だと「media/overlays/keyboards」以下に格納されているらしい。
いわゆる普通のキーボードは「US-101」で、設定ファイル「US-101.cfg」はこんな感じ。

overlays = 6
overlay0_name = landscape-qwerty
overlay0_normalized = true
overlay0_full_screen = true
overlay0_descs = 105
overlay0_overlay = landscape-qwerty.png
...
overlay0_desc0 = "retrok_escape,0.0220,0.5390,rect,0.0240,0.0360"
overlay0_desc1 = "retrok_f1,0.1130,0.5390,rect,0.0240,0.0360"

公式ドキュメントにフォーマットの解説があるのでそれを参考にすると、

キーボードとかの絵を何枚か用意しておいて(overlays=6だと6枚)、その絵ごとに(overlay#_xxxxの「#」で何番目の絵か表してる)どこを押したらどうなるとかを色々設定していくらしい。
「overlay0_desc0」とかいうのが一番メインになるキーマッピングの設定で、ざっくり言えば「何を押したことにするか」「場所」「形」「大きさ」を必要な数だけずらずらと記述するようです。
とりあえずテンキーあたりを見てみましょうかね。
キーボードの絵とテンキーあたりの設定はこうなってます。

overlay0_desc84 = "retrok_numlock,0.8392,0.6245,rect,0.0240,0.0360"
overlay0_desc85 = "retrok_kp_divide,0.8842,0.6245,rect,0.0240,0.0360"
overlay0_desc86 = "retrok_kp_multiply,0.9290,0.6245,rect,0.0240,0.0360"
overlay0_desc87 = "retrok_kp_minus,0.9760,0.6245,rect,0.0240,0.0360"
overlay0_desc88 = "retrok_kp7,0.8392,0.7082,rect,0.0240,0.0360"
overlay0_desc89 = "retrok_kp8,0.8842,0.7082,rect,0.0240,0.0360"
overlay0_desc90 = "retrok_kp9,0.9290,0.7082,rect,0.0240,0.0360"
overlay0_desc91 = "retrok_kp_plus,0.9760,0.7500,rect,0.0240,0.762"
overlay0_desc92 = "retrok_kp4,0.8392,0.8100,rect,0.0240,0.0360"
overlay0_desc93 = "retrok_kp5,0.8842,0.8100,rect,0.0240,0.0360"
overlay0_desc94 = "retrok_kp6,0.9290,0.8100,rect,0.0240,0.0360"
overlay0_desc95 = "retrok_kp1,0.8392,0.8775,rect,0.0240,0.0360"
overlay0_desc96 = "retrok_kp2,0.8842,0.8775,rect,0.0240,0.0360"
overlay0_desc97 = "retrok_kp3,0.9290,0.8775,rect,0.0240,0.0360"
overlay0_desc98 = "retrok_kp_enter,0.9760,0.9602,rect,0.0240,0.762"
overlay0_desc99 = "retrok_kp0,0.8630,0.9602,rect,0.9134,0.0360"
overlay0_desc100 = "retrok_kp_equals,0.9290,0.9552,rect,0.0240,0.0360"

ふうむ。さっぱりわからん。
「kp」ってのはKeyPadの事なのかなあ…
などと思いつつ、しばらくぼんやりと眺めていた私は、ある重大な事実に気が付いてしまったのである。

overlay0_desc100 = "retrok_kp_equals,0.9290,0.9552,rect,0.0240,0.0360"

「retrok_kp_equals」

「retrok_kp_equals」??

「Delete」のことかーーーーーーっ!!!!

だってDeleteの設定どこにもないもんね。お前しかおらん。

これはちょっと急展開です。
まさかそんな初歩的なところで間違ってるとは思わないよ。
もう世の中の何も信じないぞ。

こうなったら他のところも全部怪しく感じてきます。
ところがどっこい、一通り見直してみても他にはっきりとおかしそうなのは見当たらない。
さてどうしたものか。
例によっていつもなら春のgrep祭りを開催するところですが、今回ちょっと面白いツールがあるのに気が付きました。
まずはそっちで見てみることに。(ただしこれではまだ本題は解決しないよ)

RetroArch Overlay Editor

公式?と言っていいのか分かんないんですけど、LibRetroのサイトからリンクされてるオーバーレイエディタがあります。

ただしリンクのURLが間違ってるので注意。書いてる時点ではファイル名が「OverlayEditor_Win64.zip」に代わってました。(また変わるかもしれないのでアップされてるフォルダを適宜漁ってみるべし)

これを使って「US-101.cfg」を開いてみましょう。

おーなんか設定したとこが赤で出てるのかなーこれはすばらしいー

んー?
なんか色へんだよね??
こんな汚くなるもんなの???

もはやDeleteがどうとかはどこかに行ってしまった。
とにかく変な見た目なのが気になって仕方がないのでちょっと確認してみると、

ちょっと見にくいですけど、右側の巨大テトリス棒が「retrok_kp_plus」らしいです。(マウスで選択して「Actions」->「Set Object Name」すると名前を確認できます)

うそでしょ。そんなわけない。俺は信じないぞ。

同様に英字ASDFの行の横テトリス棒は「retrok_capslock」、そしてなんと一番下には画面の端から端までの世界最大級横テトリス棒があってそれがなんと「retrok_kp0」。ちなみに「retrok_kp_plus」の裏には「retrok_kp_enter」という影武者が隠れています。どうもこのへんの影響で押した覚えのないキーが押されるもよう。
ここまで来ると信じるか信じないかはわたし次第などと言っている場合ではない。
他もいろいろサイズがおかしいな。
いやもうサイズとかどうでもいいわ。そういう次元の話ではなくなっとる。
(なお、もはやどうでもいいDeleteは案の定「retrok_kp_equals」になってました)

ではなんでテトリス棒になってるか確認すべくもう一度「retrok_kp_plus」の設定を見てみましょう。

overlay0_desc88 = "retrok_kp7,0.8392,0.7082,rect,0.0240,0.0360"
overlay0_desc89 = "retrok_kp8,0.8842,0.7082,rect,0.0240,0.0360"
overlay0_desc90 = "retrok_kp9,0.9290,0.7082,rect,0.0240,0.0360"
overlay0_desc91 = "retrok_kp_plus,0.9760,0.7500,rect,0.0240,0.762"
overlay0_desc92 = "retrok_kp4,0.8392,0.8100,rect,0.0240,0.0360"
overlay0_desc93 = "retrok_kp5,0.8842,0.8100,rect,0.0240,0.0360"
overlay0_desc94 = "retrok_kp6,0.9290,0.8100,rect,0.0240,0.0360"

「0.0360」「0.0360」「0.0360」「0.762」「0.0360」…

「0.07…「0.762」…? ?!

桁違いの間違いとはこの事か。もはや感動すら覚えるな。

0.762 / 0.0360 = 21.16666666666667(21マスのテトリス棒)

高見山でも2倍!2倍!だったというのに20倍超えとは自重しなさいよ。
他にも同様のサイズ間違い、位置のずれ、あとDeleteの名前間違いと、間違いの見本市が開催されているのであった。

結論。
公式の「US-100.cfg」設定ファイルは使い物にならない。

押せないキーはまだ押せない

しかしまだ問題は何も解決していません。
もとから押せないキーはやはり押せない。
レイアウトを修正していくら見た目が奇麗になったところでテンキーが押せないのでは本末転倒です。
寄り道したけど結局なんで押せないのかは地道に調べるしかないようです。
しかしオーバーレイってだいぶ間違ってるっぽいぞ、と心の準備ができただけで案外役に立つこともあるのだ。

春のgrep祭り

押せるのと押せないのとは何が違うのだろう

とにかく押せるキーと押せないキーで何かが違うはず。
設定ファイルで押せるのと押せないのとを1個ずつピックアップしてそれぞれでgrepしてみます。
(説明に都合のいいのをチョイスして)押せる代表「retrok_escape」押せない代表「retrok_kp7」。

検索文字列 "retrok_escape" (21 件が 7 個のファイル内で一致しました。検索ファイル数は 9044 個)
  C:\xxx\RetroArch-master\config.def.keybinds.h (3 件の一致)
	行番号 633:       MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_ESCAPE,
	行番号 1524:       MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY, RETROK_ESCAPE,
	行番号 1532:       MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE,
  C:\xxx\RetroArch-master\input\drivers\rwebinput_input.c (1 件の一致)
	行番号 131:    { "Escape", RETROK_ESCAPE },
  C:\xxx\RetroArch-master\input\input_keymaps.c (13 件の一致)
	行番号 96:    { "escape", RETROK_ESCAPE },
	行番号 238:    { HidKeyboardKey_Escape, RETROK_ESCAPE },
	行番号 329:    { 0x029, RETROK_ESCAPE },
	行番号 469:    { SDLK_ESCAPE, RETROK_ESCAPE },
	行番号 665:    { DIK_ESCAPE, RETROK_ESCAPE },
	行番号 798:    { 41, RETROK_ESCAPE },
	行番号 869:    { XFVK_ESC, RETROK_ESCAPE },
	行番号 1003:    { KEY_ESC, RETROK_ESCAPE },
	行番号 1149:    { AKEYCODE_ESCAPE, RETROK_ESCAPE },
	行番号 1337:    { KEY_Escape, RETROK_ESCAPE },
	行番号 1479:    { DOSKEY_ESCAPE, RETROK_ESCAPE },
	行番号 1603:    { KB_RAWKEY_ESCAPE, RETROK_ESCAPE },
	行番号 1706:    { SC_ESCAPE, RETROK_ESCAPE },
  C:\xxx\RetroArch-master\libretro-common\include\libretro.h (1 件の一致)
	行番号 330:    RETROK_ESCAPE         = 27,
  C:\xxx\RetroArch-master\menu\menu_driver.c (1 件の一致)
	行番号 102:    {RETROK_ESCAPE,        "Escape"},
  C:\xxx\RetroArch-master\pkg\apple\OnScreenKeyboard\CocoaView+KeyboardSupport.swift (1 件の一致)
	行番号 51:             EmulatorKeyboardKey(label: "ESC", code: Int(RETROK_ESCAPE.rawValue), imageName: "escape"),
  C:\xxx\RetroArch-master\uwp\uwp_main.cpp (1 件の一致)
	行番号 69:    { (unsigned int)VirtualKey::Escape, RETROK_ESCAPE },

----------------------------------------------------------------------------------------

検索文字列 "retrok_kp7" (17 件が 5 個のファイル内で一致しました。検索ファイル数は 9044 個)
  C:\xxx\RetroArch-master\input\drivers\rwebinput_input.c (1 件の一致)
	行番号 165:    { "Numpad7", RETROK_KP7 },
  C:\xxx\RetroArch-master\input\input_keymaps.c (13 件の一致)
	行番号 132:    { "keypad7", RETROK_KP7 },
	行番号 269:    { HidKeyboardKey_NumPad7, RETROK_KP7 },
	行番号 402:    { 0x05F, RETROK_KP7 },
	行番号 543:    { SDLK_KP_7, RETROK_KP7 },
	行番号 554:    { SDLK_KP7, RETROK_KP7 },
	行番号 681:    { DIK_NUMPAD7, RETROK_KP7 },
	行番号 850:    { 95, RETROK_KP7 },
	行番号 970:    { XFVK_KP7, RETROK_KP7 },
	行番号 1078:    { KEY_KP7, RETROK_KP7 },
	行番号 1210:    { AKEYCODE_NUMPAD_7, RETROK_KP7 },
	行番号 1411:    { KP_7, RETROK_KP7 },
	行番号 1633:    { KB_RAWKEY_KPAD_7, RETROK_KP7 },
	行番号 1766:    { SC_KP7, RETROK_KP7 },
  C:\xxx\RetroArch-master\libretro-common\include\libretro.h (1 件の一致)
	行番号 408:    RETROK_KP7            = 263,
  C:\xxx\RetroArch-master\menu\menu_driver.c (1 件の一致)
	行番号 176:    {RETROK_KP7,           "Numpad 7"},
  C:\xxx\RetroArch-master\uwp\uwp_main.cpp (1 件の一致)
	行番号 130:    { (unsigned int)VirtualKey::NumberPad7, RETROK_KP7 },

微妙に違う部分はあれどほぼ一緒で根本的な違いみたいなのは特に無さげ。
(しかし実はここに重大な秘密が隠されていたのを後で知ることになる)
「input/input_keymaps.c」でやたら引っ掛かってるのはキーマッピング用構造体の定義のようです。

const struct input_key_map input_config_key_map[] = {
   ...
   { "escape", RETROK_ESCAPE },
   ...
   { "keypad7", RETROK_KP7 },
   ...

#ifdef HAVE_LIBNX
const struct rarch_key_map rarch_key_map_switch[] = {
   ...
   { HidKeyboardKey_Escape, RETROK_ESCAPE },
   ...
   { HidKeyboardKey_NumPad7, RETROK_KP7 },
   ...
#endif

#ifdef VITA
const struct rarch_key_map rarch_key_map_vita[] = {
   ...
   { 0x029, RETROK_ESCAPE },
   ...
   { 0x05F, RETROK_KP7 },
   ...
#endif

...

ここまでは特に違いのようなものは見受けられないので、この構造体を参照する側で何か違う処理をしてるとかでしょうか。
ということで今度は「input_config_key_map」でgrep。

検索文字列 "input_config_key_map" (9 件が 4 個のファイル内で一致しました。検索ファイル数は 9044 個)
  C:\xxx\RetroArch-master\gfx\common\win32_common.c (1 件の一致)
	行番号 2105:          const struct input_key_map* entry = &input_config_key_map[i];
  C:\xxx\RetroArch-master\input\input_driver.c (3 件の一致)
	行番号 2082:    for (i = 0; input_config_key_map[i].str; i++)
	行番号 2084:       if (string_is_equal_noncase(input_config_key_map[i].str, str))
	行番号 2085:          return input_config_key_map[i].key;
  C:\xxx\RetroArch-master\input\input_keymaps.c (4 件の一致)
	行番号 79: const struct input_key_map input_config_key_map[] = {
	行番号 1912:    for (i = 0; input_config_key_map[i].str; i++)
	行番号 1914:       if (input_config_key_map[i].key != key)
	行番号 1917:       strlcpy(buf, input_config_key_map[i].str, size);
  C:\xxx\RetroArch-master\input\input_keymaps.h (1 件の一致)
	行番号 41: extern const struct input_key_map input_config_key_map[];

win32なんとかはひとまず忘れて、引っ掛かったのは「input_config_translate_str_to_rk」と「input_keymaps_translate_rk_to_str」という関数。
これは構造体中の文字列表現とキーの値(キーコードじゃなくて内部定義したものかな?)との相互変換をするものらしい。
参考までに「input_config_translate_str_to_rk」だけ載せておきます。アルファベットは直で変換してるのも分かりますね。言われてみれば確かに構造体には定義がないな。

/**
 * input_config_translate_str_to_rk:
 * @str                            : String to translate to key ID.
 *
 * Translates tring representation to key identifier.
 *
 * Returns: key identifier.
 **/
enum retro_key input_config_translate_str_to_rk(const char *str)
{
   size_t i;
   if (strlen(str) == 1 && ISALPHA((int)*str))
      return (enum retro_key)(RETROK_a + (TOLOWER((int)*str) - (int)'a'));
   for (i = 0; input_config_key_map[i].str; i++)
   {
      if (string_is_equal_noncase(input_config_key_map[i].str, str))
         return input_config_key_map[i].key;
   }

   RARCH_WARN("[Input]: Key name \"%s\" not found.\n", str);
   return RETROK_UNKNOWN;
}

設定ファイルから読み込んでどうにかする場合は文字列→キーの値へ変換するはずなので、続いてこの「input_config_translate_str_to_rk」でgrep。

検索文字列 "input_config_translate_str_to_rk" (5 件が 3 個のファイル内で一致しました。検索ファイル数は 9044 個)
  C:\xxx\RetroArch-master\input\input_driver.c (3 件の一致)
	行番号 2070:  * input_config_translate_str_to_rk:
	行番号 2077: enum retro_key input_config_translate_str_to_rk(const char *str)
	行番号 3094:             bind->key               = input_config_translate_str_to_rk(
  C:\xxx\RetroArch-master\input\input_remapping.h (1 件の一致)
	行番号 162: enum retro_key input_config_translate_str_to_rk(const char *str);
  C:\xxx\RetroArch-master\tasks\task_overlay.c (1 件の一致)
	行番号 192:       desc->retro_key_idx = input_config_translate_str_to_rk(key + 7);

こちらで引っ掛かったのは「config_read_keybinds_conf」と「task_overlay_load_desc」。
むむむ。

keybindsなんとかは今回はあまり関係なさそうなのでひとまず放置して、「task_overlay_load_desc」はあからさまに怪しい。
なんせ「overlay」だし「desc」だかんね。
ヒット位置のちょっと手前から眺めてみます。

static bool task_overlay_load_desc(
      overlay_loader_t *loader,
      struct overlay_desc *desc,
      struct overlay *input_overlay,
      unsigned ol_idx, unsigned desc_idx,
      unsigned width, unsigned height,
      bool normalized, float alpha_mod, float range_mod)
{
   ...

   string_list_initialize(&list);
   if (!string_split_noalloc(&list, overlay, ", "))
   {
      RARCH_ERR("[Overlay]: Failed to split overlay desc.\n");
      ret = false;
      goto end;
   }

   if (list.size < 6)
   {
      RARCH_ERR("[Overlay]: Overlay desc is invalid. Requires at least 6 tokens.\n");
      ret = false;
      goto end;
   }

   key            = list.elems[0].data;
   x              = list.elems[1].data;
   y              = list.elems[2].data;
   box            = list.elems[3].data;

   desc->retro_key_idx = 0;
   BIT256_CLEAR_ALL(desc->button_mask);

   if (string_is_equal(key, "analog_left"))
      desc->type          = OVERLAY_TYPE_ANALOG_LEFT;
   else if (string_is_equal(key, "analog_right"))
      desc->type          = OVERLAY_TYPE_ANALOG_RIGHT;
   else if (strstr(key, "retrok_") == key)
   {
      desc->type          = OVERLAY_TYPE_KEYBOARD;
      desc->retro_key_idx = input_config_translate_str_to_rk(key + 7);
   }
   else
   {
      ...

手前の処理の概要は、設定ファイルの右辺(「=」の後ろ)をsplitしたのが「list」、それを取り出したのが「key」「x」「y」「box」で、あとはそれを見ながらどうにかしろという事ですね。
ではさて「input_config_translate_str_to_rk」はどんな風に呼ばれるのかしら…

『「key」から"retrok_"を探して、えーとなんだこれは、あーそうか、先頭から"retrok_"だったらってことか、そんでkey+7というのは、はいはい、"retrok_"を読み飛ばしてその後の文字列を渡すのね、なるほどなるほど…』

僕の頭の中をお楽しみください

なぬーーーーーーーーーーーーーーーー!!!!

その刹那、稲妻に撃たれたかのような衝撃!
膨大なソースコードの記憶が走馬灯のように駆け巡る!

ややもすれば見逃してしまったであろう些細な文字の並びの違和感を、もう何もかもを疑いの目で見ていた私の「目grep」は見逃さなかったのである。

{ "keypad7", RETROK_KP7 },

overlay0_desc88 = "retrok_kp7,0.8392,0.7082,rect,0.0240,0.0360"

お分かりいただけただろうか。

"keypad7"

"kp7"

"keypad7"
"kp7"

"keypad7"と"kp7"

まだピンときていない場合は一度コーヒーでも飲んで落ち着いて考えてみて欲しい。なんなら一晩寝てからでもいいよ。すっかり忘れてこの話なんかどうでもよくなってるはずさ!

"keypad7"と"kp7"。
まさかの坂がこんなところにあろうとは人生とは分からないものだ。
もう大抵のことでは驚かないと自負していたのだが、流石にこれにはおどろ木ももの木この木なんの木。
え?まさかまだピンときてない?仕方ない説明しよう!

【要約】
設定ファイルでテンキーの7は「retrok_keypad7」だよ。忘れないでね!

システムが知っているのは「"retrok_" + "keypad7"」すなわち「retrok_keypad7」だけなのである。

「retrok_kp7」ってなんやねんそれ。まちごうとるで自分。
そんなものを押しても反応するわけがなかったのだッ!

もはや、そうきたかーと笑う元気もありません。

ため息混じりでソース上の定義と設定ファイルを見比べると、案の定他にも色々間違ってますね。
この際なので現状の設定ファイルで使ってるキー名について本当にちゃんと使えるものかどうか調べてみました。
結果がこちら。使えるものかどうかで先頭に「o」「x」付けてます。

o:retrok_escape
o:retrok_f1
o:retrok_f2
o:retrok_f3
o:retrok_f4
o:retrok_f5
o:retrok_f6
o:retrok_f7
o:retrok_f8
o:retrok_f9
o:retrok_f10
o:retrok_f11
o:retrok_f12
x:retrok_print
x:retrok_scrollock
o:retrok_pause
o:retrok_period
x:retrok_1
x:retrok_2
x:retrok_3
x:retrok_4
x:retrok_5
x:retrok_6
x:retrok_7
x:retrok_8
x:retrok_9
x:retrok_0
o:retrok_minus
o:retrok_equals
o:retrok_backspace
o:retrok_tab
o:retrok_q
o:retrok_w
o:retrok_e
o:retrok_r
o:retrok_t
o:retrok_y
o:retrok_u
o:retrok_i
o:retrok_o
o:retrok_p
o:retrok_leftbracket
o:retrok_rightbracket
o:retrok_backslash
o:retrok_capslock
o:retrok_a
o:retrok_s
o:retrok_d
o:retrok_f
o:retrok_g
o:retrok_h
o:retrok_j
o:retrok_k
o:retrok_l
o:retrok_semicolon
o:retrok_quote
o:retrok_enter
x:retrok_lshift
o:retrok_z
o:retrok_x
o:retrok_c
o:retrok_v
o:retrok_b
o:retrok_n
o:retrok_m
o:retrok_comma
o:retrok_period
o:retrok_slash
o:retrok_rshift
x:retrok_lctrl
x:retrok_lalt
o:retrok_space
o:retrok_ralt
o:retrok_rctrl
o:retrok_insert
o:retrok_home
o:retrok_pageup
x:retrok_delete
o:retrok_end
o:retrok_pagedown
o:retrok_up
o:retrok_left
o:retrok_down
o:retrok_right
o:retrok_numlock
x:retrok_kp_divide
x:retrok_kp_multiply
o:retrok_kp_minus
x:retrok_kp7
x:retrok_kp8
x:retrok_kp9
o:retrok_kp_plus
x:retrok_kp4
x:retrok_kp5
x:retrok_kp6
x:retrok_kp1
x:retrok_kp2
x:retrok_kp3
o:retrok_kp_enter
x:retrok_kp0
o:retrok_kp_equals

数字は全滅。
記号はちょいちょい変。
ちょっと意外だったのはテンキーじゃない方の本家の「Delete」もそっちはそっちで間違ってて正しくは「retrok_del」にしないといけない。

オーバーレイで使えるキー名一覧

参考までにオーバーレイで使えるキー名一覧も載せときます。
現時点ではこれ以外を指定しても無効です。
(※画面遷移などの特殊キーは除く)

retrok_a から retrok_z

retrok_left
retrok_right
retrok_up
retrok_down
retrok_enter
retrok_kp_enter
retrok_tab
retrok_insert
retrok_del
retrok_end
retrok_home
retrok_rshift
retrok_shift
retrok_ctrl
retrok_alt
retrok_space
retrok_escape
retrok_add
retrok_subtract
retrok_kp_plus
retrok_kp_minus
retrok_f1
retrok_f2
retrok_f3
retrok_f4
retrok_f5
retrok_f6
retrok_f7
retrok_f8
retrok_f9
retrok_f10
retrok_f11
retrok_f12
retrok_num0
retrok_num1
retrok_num2
retrok_num3
retrok_num4
retrok_num5
retrok_num6
retrok_num7
retrok_num8
retrok_num9
retrok_pageup
retrok_pagedown
retrok_keypad0
retrok_keypad1
retrok_keypad2
retrok_keypad3
retrok_keypad4
retrok_keypad5
retrok_keypad6
retrok_keypad7
retrok_keypad8
retrok_keypad9
retrok_period
retrok_capslock
retrok_numlock
retrok_backspace
retrok_multiply
retrok_divide
retrok_print_screen
retrok_scroll_lock
retrok_tilde
retrok_backquote
retrok_pause
retrok_quote
retrok_comma
retrok_minus
retrok_slash
retrok_semicolon
retrok_equals
retrok_leftbracket
retrok_backslash
retrok_rightbracket
retrok_kp_period
retrok_kp_equals
retrok_rctrl
retrok_ralt
retrok_caret
retrok_underscore
retrok_exclaim
retrok_quotedbl
retrok_hash
retrok_dollar
retrok_ampersand
retrok_leftparen
retrok_rightparen
retrok_asterisk
retrok_plus
retrok_colon
retrok_less
retrok_greater
retrok_question
retrok_at
retrok_f13
retrok_f14
retrok_f15
retrok_rmeta
retrok_lmeta
retrok_lsuper
retrok_rsuper
retrok_mode
retrok_compose
retrok_help
retrok_sysreq
retrok_break
retrok_menu
retrok_power
retrok_euro
retrok_undo
retrok_clear
retrok_oem102
retrok_nul

補足:特殊キーについては「configuration.c」の「input_config_bind_map」の値が使えるようだ。後で追記しよう。(現状の実装だと小文字限定。ちなみに通常のキー名は"retrok_"の「後ろ」は実は大文字小文字どちらでも良かったりするが(後ろだけだよ!つまり"retrok_LEFT"とか)混乱を招くだけなので小文字で指定するのをお勧めする)

ソフトウェアキーボードをちゃんとする

生まれ変わった「US-101.cfg」

さんざんgrepしまくってたどり着いた結論は、結局、設定間違ってるだけだったのだぜ。
しかし待ってほしい。
少し落ち着いて考えてみると間違っていたのは「US-101.cfg」ではなくてRetroarch本体側のような気もする。
これだって普通"kp7"にするやろがいと言わざるを得ない。

{ "keypad7", RETROK_KP7 },

ソース上では同様の表記ブレが他にも多数見られます。
前述のDeleteとかもまた然りで、なんか気持ち悪いというか落ち着かないというか、妙なコードになってる。

ただ本体側を修正すると他のオーバーレイが逆に動かない可能性だってあるので迂闊にはいじれないのである。
後ろ髪惹かれる思いではあるが、ここは設定ファイルの修正でお茶を濁すのが大人の対応というものであろう。(心の声「もうめんどくさい」)

まあどうせ誤魔化しだからね、ということで、とりあえずテンキーだけ使えるよう「US-101.cfg」をちゃちゃっと修正して(レイアウト変なのと記号変なのは放置してます)、

overlay0_desc88 = "retrok_keypad7,0.8392,0.7082,rect,0.0240,0.0360"
overlay0_desc89 = "retrok_keypad8,0.8842,0.7082,rect,0.0240,0.0360"
overlay0_desc90 = "retrok_keypad9,0.9290,0.7082,rect,0.0240,0.0360"
overlay0_desc92 = "retrok_keypad4,0.8392,0.8100,rect,0.0240,0.0360"
overlay0_desc93 = "retrok_keypad5,0.8842,0.8100,rect,0.0240,0.0360"
overlay0_desc94 = "retrok_keypad6,0.9290,0.8100,rect,0.0240,0.0360"
overlay0_desc95 = "retrok_keypad1,0.8392,0.8775,rect,0.0240,0.0360"
overlay0_desc96 = "retrok_keypad2,0.8842,0.8775,rect,0.0240,0.0360"
overlay0_desc97 = "retrok_keypad3,0.9290,0.8775,rect,0.0240,0.0360"
overlay0_desc99 = "retrok_keypad0,0.8630,0.9602,rect,0.9134,0.0360"

いざVitaへ持っていくぞッ!

念願のソフトウェアキーボードを手に入れたのかな?

準備は万端。
おもむろにRetroarchを起動しZAVASを開始します。
オープニングをスキップして少しの待ち時間。
超絶パワーアップしたQUASI88の調子も上々です。
ゲームは順調に立ち上がり、さあ、出でよヨランタ!
今度こそッ!寄進できるまでッ!寄進するのをやめないッ!

いいことあるんだってー!やったぜ!なんせ悪いこと続きだったからな!!

数値入力もちゃんとできてるよ!

ついにやった。
ちゃんと動いている。
もちろん動くように頑張っていたわけだが。
私はいま猛烈に感動しているとともに、不思議と一抹の寂しさをも感じている。
ラスボス倒したあとってなんだか寂しいよね。
もう終わって欲しいのにまだ終わって欲しくないような。そんな気分。

さあ、感傷に浸るのはそれくらいにして、

今度こそ宣言してしまっても大丈夫だろう。

念願のソフトウェアキーボードを手に入れたぞ!

そして!

これは!

文字が小さすぎて打てない!(打てなくはないんだけど使いにくいよ)

なぜもっと早く気が付かなかったんだろう。
見ればわかるじゃん。
ちっちぇえってさ。
技術屋の陥りやすい罠とでも言おうか、目の前に謎を突き付けられると謎に夢中で大局を見失ってしまいがちである。

まあこれでも十分使えるんですけどね、ただタッチの狙いを定めるのにわりと気を遣わねばならず、お世辞にも快適にプレイできるとは言えません。
そもそもZAVASやるだけならキーボード全部は要らなくてテンキーといくつかのキーがあるだけで十分なんだよね。
よーし専用のオーバーレイ作っちゃうか。
どうせやるなら快適に遊べるところまでやるぞ。
早くも裏ボスのご登場と相成ったりである。

次回予告

せっかく念願のソフトウェアキーボードを手に入れたんだし、それで満足しとけよって話なんだけど、ここまで来たらもうね、やれるだけのことはやっときたいよね。やれたじゃねえかって言って終わりたいよね。
というわけでいよいよ最後のネタかな?自作オーバーレイのお話。
次回、ぼくのかんがえたさいきょうのオーバーレイ、果たして冒険の旅に終止符を打つことは出来るのか?!

この記事が気に入ったらサポートをしてみませんか?