難しく考えすぎていたかも…「親指同時シフト」→「親指タイムシフト(HDDビデオなどでお馴染みのアレ)」とか。

 キーリピートの処理については解らないので無視することとして(苦笑)、ひとまず「全く新規に作るならば」こういうモードを用意する事から始めるべきなのかも。


 この方法ならば、前に書いた仮想の「アンシフト親指キー」方式など使わなくとも、何とかなりそうな予感が。


 名前を付けるとすると「同時シフト」ではなく「タイムシフト(HDDビデオなどでお馴染みのアレ)」方式って名前がそのままでいいかも…。
 親指キーを「押した瞬間」と「離した瞬間」について、そこから「遡って」同時打鍵判定時間内に押されたキーについては「既に親指キー操作が完了しているものとみなして」動作する、ってことですから。
 書き分けるならば、

  • 「文字キー押す→ほんの少し前後に親指シフトを【押す】」ならば、親指シフトを【押してから】文字キーを操作したものと見なして動作する。それ以降も同様(連続的にシフト状態が続く)。
  • 「文字キー押す→ほんの少し前後に親指シフトを【離す】」ならば、親指シフトを【離してから】文字キーを操作したものと見なして動作する。それ以降も同様(連続的にアンシフト状態が続く)。

という挙動を示して欲しいわけです。
 (元々親指シフトは見なし動作を行っているだけに、今まで勝手に言っていた「みなし同時シフト」ってゆー言い方は不適切なはずなので)

 「親指タイムシフト」方式って名前であれば、何となくどういう動きか想像できて良さそう(少なくとも誤解されるおそれがない)な感じがします。
 で、これと「連続シフト」は全く無関係なので、「連続シフト」という言葉自体はやっぱり必要なようです。


 キー状態については、「off:押していない on:押している down:押した瞬間 up:離した瞬間 alive:有効となっているキー」という意味で書いています。


 モードは…こんな感じか。

  • [L:off-R:off]無シフト↓状態
    • [L:on-R:off][L:off-R:on]から移行しうる。
    • [L:on-R:off][L:off-R:on]へ移行しうる。
  • [L:off-R:on]右シフト↓状態
    • [L:off-R:off][L:on-R:on-R:alive][L:on-R:on-L:alive]から移行しうる。
    • [L:off-R:off][L:on-R:on-L:alive]へ移行しうる。
    • [L:off-R:off]から[L:off-R:off]へと戻る場合に限り、本来のキーコードを吐いてから戻る。
  • [L:on-R:on]左シフト↓状態
    • [L:off-R:off][L:on-R:on-R:alive][L:on-R:on-L:alive]から移行しうる。
    • [L:off-R:off][L:on-R:on-R:alive]へ移行しうる。
    • [L:off-R:off]から[L:off-R:off]へと戻る場合に限り、本来のキーコードを吐いてから戻る。
  • [L:on-R:on-L:alive]右シフト↓[→]左シフト↓同時打鍵状態(後から押した左シフトが有効)
    • [L:off-R:on]から移行しうる。
    • [L:on-R:off][L:off-R:on]へ移行しうる。
  • [L:on-R:on-R:alive]左シフト↓[→]右シフト↓同時打鍵状態(後から押した右シフトが有効)
    • [L:on-R:off]から移行しうる。
    • [L:on-R:off][L:off-R:on]へ移行しうる。
  • それぞれに、キーレピートルーチンへの処理を含める…べきなのか?


 動作内容は…こんな感じか。
 (同時打鍵判定時間に付いては、従来式に固定値(Down判定とUp判定の遡上時間は同一)でもかまわない。ただし可能ならば、ひゅんQのドキュメントにあるように「2つのキーDown間隔を測定して、その中央の値を毎回採用する」のが理想、で最大遡上時間を500msとするなどの制限値を設定する。)

  • 単独の親指シフトキーを離す。
    • [L:up-R:off]左シフト「離す」・右シフト「押していない」
      • 左シフトを「離した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的なアンシフト」と見なしてアンシフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。
    • [L:off-R:up]左シフト「押していない」・右シフト「離す」
      • 右シフトを「離した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的なアンシフト」と見なしてアンシフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。
  • 単独の親指シフトキーを押す。
    • [L:down-R:off]左シフト「押す」・右シフト「押していない」
      • (従来通り)左シフトを「押した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的な左シフト」と見なして左シフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。
    • [L:off-R:down]左シフト「押していない」・右シフト「押す」
      • (従来通り)右シフトを「押した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的な右シフト」と見なして右シフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。
  • 片方の親指シフトキーを押しながら、もう片方の親指シフトキーを押す。
    • [L:down-R:on]左シフト「押す」・右シフト「押したまま」
      • 左シフトを「押した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的な左シフト」と見なして左シフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。
    • [L:on-R:down]左シフト「押したまま」・右シフト「押す」
      • 右シフトを「押した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的な右シフト」と見なして右シフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。
    • 両者は操作する側から見れば「両方押し」の結果を生むが、操作後に有効となる連続シフト面が同一ではないので、混用すべきではない。
  • 両方の親指シフトキーを押し「左シフトが有効となっている」状態から、片方の親指シフトキーを離す。
    • [L:up-R:on]左シフト有効・左シフト「離す」・右シフト「押したまま」
      • 左シフトを「離した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的な右シフト」と見なして右シフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。
    • [L:on-R:up]左シフト有効・左シフト「押したまま」・右シフト「離す」
      • 右シフトを「離した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的な左シフト」と見なして左シフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。
  • 両方の親指シフトキーを押し「右シフトが有効となっている」状態から、片方の親指シフトキーを離す。
    • [L:up-R:on]右シフト有効・左シフト「離す」・右シフト「押したまま」
      • 左シフトを「離した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的な右シフト」と見なして右シフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。
    • [L:on-R:up]右シフト有効・左シフト「押したまま」・右シフト「離す」
      • 右シフトを「離した」時点から遡って、同時打鍵判定時間以内に文字キーが押されていた場合は、「明示的な左シフト」と見なして左シフトの文字を出す。それ以降も同様(連続的にシフト状態が続く)。


 …いや、私はPG/SEのいずれでもないので、細かいことは解らないんですけどね。
 ついでにこれも単なる妄言ですので。


 というか、これでは既存のソフトを弄って実現するのはかなり面倒そうな感じかも…この処理を丸々作り直すことになりそうですし。
 というか、こんなとんでもない提案を作り上げてしまって申し訳ありません…
 #あ、再検証してみたのですが、少々挙動は異なるものの、ひとまずNICOLAでも使えそうです。