ウィンドウのキーボード入力を切り替える
1 はじめに
キーボードの入力フォーカス切り替えを実装しましたが、コントロールコンソールが起動しているにもかかわらず
キーボードをタップすると、文字入力が前のメッセージ ボックスに残っていることがわかります。
このセクションでは、切り替えられたウィンドウにキーボード ストロークの内容を入力します。
実装のアイデアは次のとおりです。タスクごとに入力キューを構成します。
ウィンドウがアクティブ化され、キーボード入力があると、メイン プロセスはまずキーボード データを取得します。
次に、どのウィンドウが現在アクティブになっているかを判断し、実行中のウィンドウに対応するプロセス オブジェクトを見つけます。
プロセス オブジェクトを通じて対応する入力キューを取得し、キーボードからの情報を入力キューに入れて、対応するプロセス オブジェクトをアクティブにします。
2.コード
コードを変更する
まずはmulti_task.hです
struct TASK {
int sel, flags;
int priority;
int level;
struct FIFO8 fifo;
struct TSS32 tss;
};
上記の変更は、入力情報を取得するためのキューを追加することです。
次に変更するのはメイン プロセスの CMain 関数です。キーボード イベントが発生すると、
CMain がアクティブになり、受信した文字を対応するウィンドウ プロセスのキューに入れることができます。
void CMain(void) {
....
for(;;) {
....
else if (key_to == 0) {
if (keytable[data] != 0 && cursor_x < 144) {
boxfill8(shtMsgBox->buf, shtMsgBox->bxsize, COL8_FFFFFF,cursor_x,
28, cursor_x + 7, 43);
sheet_refresh(shtctl, shtMsgBox, cursor_x, 28, cursor_x+8, 44);
char buf[2] = {keytable[data], 0};
showString(shtctl, shtMsgBox, cursor_x, 28, COL8_000000, buf);
cursor_x += 8;
stop_task_A = 1;
boxfill8(shtMsgBox->buf, shtMsgBox->bxsize, cursor_c, cursor_x,
28, cursor_x + 7, 43);
sheet_refresh(shtctl, shtMsgBox, cursor_x, 28, cursor_x+8, 44);
}
} else {
task_sleep(task_a);
fifo8_put(&task_cons->fifo, data);
}
}
....
}
....
}
現在アクティブなウィンドウがメッセージ ボックスの場合、文字はテキスト ボックスに直接表示されます。
それ以外の場合は、現在のメインプロセスを一時停止します
次に、fifo8_put を通じてコンソール プロセスに対応するキューにキーボード データを置きます。
忘れずにメイン プロセスを一時停止する必要があります。そうしないと、メイン プロセスが常に CPU リソースを占有することになります。
その結果、コンソール プロセスを実行できなくなり、キーボード データを時間内に処理できなくなります。
コンソールプロセスの変更
void console_task(struct SHEET *sheet) {
....
else {
if (i == 0x0e && cursor_x > 8) {
boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cursor_x,
28, cursor_x + 7, 43);
sheet_refresh(shtctl, sheet, cursor_x, 28, cursor_x+8, 44);
cursor_x -= 8;
boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cursor_x,
28, cursor_x + 7, 43);
sheet_refresh(shtctl, sheet, cursor_x, 28, cursor_x+8, 44);
} else {
if (cursor_x < 240 &&i< 0x54 && keytable[i] != 0) {
boxfill8(sheet->buf, sheet->bxsize, COL8_000000, cursor_x,
28, cursor_x + 7, 43);
sheet_refresh(shtctl, sheet, cursor_x, 28, cursor_x+8, 44);
s[0] = keytable[i];
s[1] = 0;
showString(shtctl, sheet, cursor_x, 28, COL8_FFFFFF, s);
cursor_x += 8;
}
}
}
....
}
変数 i の値は、CMain によって渡されるキーボード データです。
i の値が 0x0e の場合、キーボード ボタンがバックスペース キーであることを意味します。
このキーを受け取ったときにしなければならないことは、カーソルの前の文字を削除することです。
文字を削除するときに注意しなければならないのは、カーソルの扱いです。
カーソル効果は白い四角を描いてから黒い四角を描くことで実現されるので、
バックスペースでカーソルが白い四角になった場合
次に、カーソルを 1 文字前に移動すると、カーソルの元の位置に白い四角形が残ります。
したがって、カーソルを前方に移動する前に、最初にカーソルの元の位置に背景色で同じサイズの正方形を描画する必要があります。
白い四角が覆われているため、cursor_x -= 8;
このステートメントの前にウィンドウを描画するステートメントが 3 つあります。
カーソルを 1 文字前に移動すると、カーソルの前の文字がカーソル四角形で覆われ、文字削除の特殊効果が得られます。
他の文字を入力した場合も同様です。
まずカーソルの現在位置を背景色で覆い、文字を表示します。
次に、カーソルを 1 文字後ろに移動し、新しい位置にカーソルを四角形で交互に描画します。