em1keyを使って「飛鳥カナ配列」の「同期連続シフト」を実現するための改造ポイントに関するメモ。
まずは、一番わけのわからない定数が並んでいる「キーのバッファリング」部分に、コメントを一揃い付けてみました。
こうしてコメントを付けてみれば「なぜこういう定数名を採用したのか」が良く解るようです。
「キーバッファの送信」部分についても、CALLVARについてのみコメントを追加しました。
ここで何が起きているのかを理解できないと、そもそもoyayubiwmの挙動を理解できない(逆に言えば、ここさえ解ればある程度は理解できる)ので、「暗記はせずに流れをつかむ」とよいのかも。
oyayubiwm(v1.42)/line1851-1912/動作説明の追加。
#------------------------------------------------------------------------------ # 親指シフトの実行ロジック #------------------------------------------------------------------------------ # KeyBuffer # 一般キーの情報をバッファリングする func TABLE_FUNC _subPushKey TESTGSTATE _gs_ISLEFT # ←左親指押下中は1、右親指押下中は0。 STOREVAR _KB_ISLEFT # →_subFlushAll で_OB_ISLEFTと比較。 LOADVAR _IN_DF_FUNC # ←LOADVAR 0(無シフト文字)。 STOREVAR _KB_DF_FUNC # →_subFlushKeyでCALLVARされる。 LOADVAR _IN_OS_FUNC # ←LOADVAR 1(同手シフト文字)。 STOREVAR _KB_OS_FUNC # →_subFlushAllでCALLVARされる。 LOADVAR _IN_CR_FUNC # ←LOADVAR 2(対手シフト文字)。 STOREVAR _KB_CR_FUNC # →_subFlushAllでCALLVARされる。 LOADVAR _IN_SH_FUNC # ←LOADVAR 3(小指シフト文字)。 STOREVAR _KB_SH_FUNC # →_subFlushKeyでCALLVARされる。 LOADVAR GVAR_KEYCODE # ←VAR37(呼び出し時キーコード)保管。 STOREVAR _KB_KEYCODE # →_subExecKeyで自分自身か否か判定。 LOADVAR GVAR_EVENTTIME # ←VAR38(キー呼び出し時刻)保管。 STOREVAR _KB_TIME # →_subExecKeyでOB_TIMEから引き算。 SETGSTATE _gs_KEYBUFFER # →宣言「文字バッファがあるよ!」 RETURN 0 endfunc # OSBuffer # 親指シフトキーをバッファリングする func TABLE_FUNC _subPushOS TESTGSTATE _gs_ISLEFT # ←左親指押下中は1、右親指押下中は0。 STOREVAR _OB_ISLEFT # _subFlushAll で_KB_ISLEFTと比較。 LOADVAR _IN_DF_FUNC # ←LOADVAR 0(無シフト文字)。 STOREVAR _OB_FUNC # _subFlushKeyでCALLVARされる。 LOADVAR GVAR_KEYCODE # ←VAR37(呼び出し時キーコード)保管。 STOREVAR _OB_KEYCODE # _subExecKeyで自分自身か否か判定。 LOADVAR GVAR_EVENTTIME # ←VAR38(キー呼び出し時刻)保管。 STOREVAR _OB_TIME # →_subExecKeyでOB_TIMEから引き算。 SETGSTATE _gs_OSBUFFER # →宣言「親指バッファがあるよ!」 RETURN 0 endfunc # キーバッファの送信を行う # シフト無しの送信のみ、親指シフト状態は変更しない。 func TABLE_FUNC _subFlushKey #_subFlushAllから呼ばれる関数。 TESTGSTATE _gs_KEYBUFFER IF_FALSE 80 # キーバッファが無い場合は飛ぶ(何もしない) IF_SHIFT 60 # 小指シフトなら飛ぶ # デフォルトコード送信 ifsw LOS_ALT_PATCH_ENABLE1 RAWUP VK_LMENU endif CALLVAR _KB_DF_FUNC # 通常コード実行(VAR 0=無シフト文字) RESETGSTATE _gs_KEYBUFFER # キーバッファをクリア LABEL 80 RETURN 0 LABEL 60 # 小指シフト RAWUP VK_SHIFT # 小指shift キーのキャンセル CALLVAR _KB_SH_FUNC # 小指shift 実行(VAR 3=小指シフト文字) RESETGSTATE _gs_KEYBUFFER # キーバッファをクリア RETURN 0 endfunc
つぎに、「同期(=同時)」シフトを「同期連続」シフトへと改造するために、シフトのキャンセル部分をコメントアウトしました。
「同期(=同時)」シフトでは「文字→シフト→文字」の順でキーが押された場合に、シフトが仮に前の文字を修飾すれば「後ろの文字は修飾せずアンシフトにして出す」仕掛けになっています。
「同期連続」シフトではこの場合、「シフトを離すまでずっと、シフトは全ての文字を修飾し続ける」ので、ここでシフトの状態をクリアされてしまっては困ります……ということで、その部分を弄ってみました。
もとのスクリプトでは、「RESETGSTATE _gs_OSBUFFER」という部分で親指シフトのバッファ(があることを示すフラグ)をリセットしているのですが、これをリセットしないようにしました……とはいっても、元の命令の頭に###をつけて、単にコメント化しただけです^^;。
oyayubiwm(v1.42)/line1915-1957/同期シフト→同期連続シフトへの改造。
# キーバッファの送信する # バッファをすべて解消する。親指シフトがあれば考慮する。 func TABLE_FUNC _subFlushAll TESTGSTATE _gs_KEYBUFFER IF_FALSE 80 # キーバッファが無い場合は飛ぶ # キーバッファあり TESTGSTATE _gs_OSBUFFER IF_TRUE 20 # 親指シフトありなら飛ぶ # シフトなし、キーバッファのみ CALL _subFlushKey RETURN 0 LABEL 20 # キーバッファも親指シフトもある場合 # クロスシフト判定 LOADVAR _OB_ISLEFT CMPVAR_EQ _KB_ISLEFT IF_FALSE 40 # クロスならとぶ # 通常親指シフト ifsw LOS_ALT_PATCH_ENABLE1 RAWUP VK_LMENU endif CALLVAR _KB_OS_FUNC # 親指シフト実行(VAR 1=同手シフト文字) RESETGSTATE _gs_KEYBUFFER # キーバッファをクリア ### RESETGSTATE _gs_OSBUFFER # 親指shift状態をクリア★★飛鳥では不使用★★ RETURN 0 LABEL 40 # クロス親指シフト ifsw LOS_ALT_PATCH_ENABLE1 RAWUP VK_LMENU endif CALLVAR _KB_CR_FUNC # クロスシフトの実行(VAR 2=対手シフト文字) RESETGSTATE _gs_KEYBUFFER # キーバッファをクリア ### RESETGSTATE _gs_OSBUFFER # 親指shift状態をクリア★★飛鳥では不使用★★ RETURN 0 LABEL 80 # キーバッファが無い場合 TESTGSTATE _gs_OSBUFFER IF_FALSE 60 # 親指シフトが無ければ飛ぶ CALLVAR _OB_FUNC # 親指シフト単独機能の実行 RESETGSTATE _gs_OSBUFFER # 親指shift状態をクリア★★飛鳥でも使用★★ LABEL 60 RETURN 0 endfunc
さて、上の修正のみを行った状態で、実際にスクリプトを走らせてみた……のですが、特定のシーケンスでキー操作をすると「シフトがかかったまま、親指キーを離してもシフトが外れない」状態になりました(当たり前ですね……^^;)。
「同期連続」シフトでは、「シフトを離すまでずっと、シフトは全ての文字を修飾し続ける」ので、逆に言えば「シフトを離したときには、問答無用でバッファをフラッシュして、かつ親指シフト状態をクリアすればよい」ことになります。
親指シフトキーに関する「キーイベントでドライブされる関数」は、オプションの関数を含めて「ほぼ同じ内容のものが」6つあります。
6つの関数の冒頭に、それぞれ「キーUpの場合のみ、バッファをフラッシュして、かつ親指シフト状態をクリアする」ための記述を行いました。
バッファのフラッシュは「_subFlushAll」をCALLするだけでよいようになっていますので、まさに上に書いたまま「キーDownなら処理を無視→バッファフラッシュ→親指シフト状態をクリア」をそのまま記述してみました。
oyayubiwm(v1.42)/line2946-3041/同期シフト→同期連続シフトへの改造。
#------------------------------------------------------------------------------ # 親指シフトキー #------------------------------------------------------------------------------ # 親指シフトキーはいくつでも設定できます # 左親指シフト1 func _TABLE_OS LOS_KEYCODE1 IF_DOWN 100 #キーUp以外では直下の行を無視。 #★★飛鳥用に必要★★ CALL _subFlushAll #★★飛鳥用に必要★★ RESETGSTATE _gs_OSBUFFER # 親指shift状態をクリア★★飛鳥ではここで使用★★ LABEL 100 #★★飛鳥用に必要★★ ifsw LOS_ALT_PATCH_ENABLE1 # 左親指シフトキーに ALT を割り当てた場合の処理。かなり強引。 IF_UP 10 RAWUP VK_LMENU LABEL 10 endif ALLOCVSTATE 0 SETGSTATE _gs_ISLEFT # 左 SETVAR0 LOS_SHARE_FUNC1 CALL _subExecOS endfunc # 左親指シフト2 ifsw LOS_KEYCODE2 func _TABLE_OS LOS_KEYCODE2 IF_DOWN 100 #キーUp以外では直下の行を無視。 #★★飛鳥用に必要★★ CALL _subFlushAll #★★飛鳥用に必要★★ RESETGSTATE _gs_OSBUFFER # 親指shift状態をクリア★★飛鳥ではここで使用★★ LABEL 100 #★★飛鳥用に必要★★ ALLOCVSTATE 0 SETGSTATE _gs_ISLEFT # 左 SETVAR0 LOS_SHARE_FUNC2 CALL _subExecOS endfunc endif # 左親指シフト3 ifsw LOS_KEYCODE3 func _TABLE_OS LOS_KEYCODE3 IF_DOWN 100 #キーUp以外では直下の行を無視。 #★★飛鳥用に必要★★ CALL _subFlushAll #★★飛鳥用に必要★★ RESETGSTATE _gs_OSBUFFER # 親指shift状態をクリア★★飛鳥ではここで使用★★ LABEL 100 #★★飛鳥用に必要★★ ALLOCVSTATE 0 SETGSTATE _gs_ISLEFT # 左 SETVAR0 LOS_SHARE_FUNC3 CALL _subExecOS endfunc endif # 右親指シフト1 func _TABLE_OS ROS_KEYCODE1 IF_DOWN 100 #キーUp以外では直下の行を無視。 #★★飛鳥用に必要★★ CALL _subFlushAll #★★飛鳥用に必要★★ RESETGSTATE _gs_OSBUFFER # 親指shift状態をクリア★★飛鳥ではここで使用★★ LABEL 100 #★★飛鳥用に必要★★ ALLOCVSTATE 0 RESETGSTATE _gs_ISLEFT # 右 SETVAR0 ROS_SHARE_FUNC1 CALL _subExecOS endfunc # 右親指シフト2 ifsw ROS_KEYCODE2 func _TABLE_OS ROS_KEYCODE2 IF_DOWN 100 #キーUp以外では直下の行を無視。 #★★飛鳥用に必要★★ CALL _subFlushAll #★★飛鳥用に必要★★ RESETGSTATE _gs_OSBUFFER # 親指shift状態をクリア★★飛鳥ではここで使用★★ LABEL 100 #★★飛鳥用に必要★★ ALLOCVSTATE 0 RESETGSTATE _gs_ISLEFT # 右 SETVAR0 ROS_SHARE_FUNC2 CALL _subExecOS endfunc endif # 右親指シフト3 ifsw ROS_KEYCODE3 func _TABLE_OS ROS_KEYCODE3 IF_DOWN 100 #キーUp以外では直下の行を無視。 #★★飛鳥用に必要★★ CALL _subFlushAll #★★飛鳥用に必要★★ RESETGSTATE _gs_OSBUFFER # 親指shift状態をクリア★★飛鳥ではここで使用★★ LABEL 100 #★★飛鳥用に必要★★ ALLOCVSTATE 0 RESETGSTATE _gs_ISLEFT # 右 SETVAR0 ROS_SHARE_FUNC3 CALL _subExecOS endfunc endif
テストをした時点では、まだ文字配列をNICOLAのままにしていました……ので、NICOLAの連続シフトになってしまいました^^;。
とりあえず、「oyayubiwmを弄ってつくる方法であれば」連続シフト化は容易に達成できるようです。
とはいえ、これらの変更部分を ifsw〜endif や ifnsw〜endif で囲んで「定数でスイッチしよう」とすると、なぜかうまくいかないんですよね……うーん、なぜだろうorz。
ついでに言うと、フルスクラッチで作る方は……まだ全く浮かんできません。こっちはまだまだ先になりそうです。