30日OS自作本24日以降のXボタンの影がおかしい
OS自作本24日目以降、Xボタンの色がおかしいことに気がつきました。
24日目(harib21e)に追加したウインドウの非アクティブ・アクティブを切り替えるchange_wtitle8
ですが
- 非アクティブ時のウインドウのバーの濃い灰色(
COL8_848484
)をアクティブ時に濃い青色(COL8_000084
)に上書き - 非アクティブ時のウインドウとXボタンの影が同じ色(濃い灰色=
COL8_848484
) - この処理は色でしか判断しておらずXボタンの影が青く塗られてしまう。
という問題がありXボタンの影が24日目以降変です。
void change_wtitle8(struct SHEET *sht, char act) { int x, y, xsize = sht->bxsize; char c, tc_new, tbc_new, tc_old, tbc_old, *buf = sht->buf; if (act != 0) { tc_new = COL8_FFFFFF; tbc_new = COL8_000084; tc_old = COL8_C6C6C6; tbc_old = COL8_848484; } else { tc_new = COL8_C6C6C6; tbc_new = COL8_848484; tc_old = COL8_FFFFFF; tbc_old = COL8_000084; } for (y = 3; y <= 20; y++) { for (x = 3; x <= xsize - 4; x++) { c = buf[y * xsize + x]; if (c == tc_old && x <= xsize - 22) { c = tc_new; } else if (c == tbc_old) { c = tbc_new; } buf[y * xsize + x] = c; } } sheet_refresh(sht, 3, 3, xsize, 21); return; }
解決策をいくつか考えて見ました。
- 1.SHEET構造体にtitleという属性を持たせて
change_wtitle8
の代わりにtilte引数付きでmake_window8
を呼ぶ - 2.232色の中からxボタンの影として濃い灰色
COL8_000084
と似た色を選ぶ - 3.233色目に濃い灰色を
COL8_000084
と同じ色を登録してxボタンの影にし、else if(c == tbc_old)
この文の処理対象とさせない
下に行くほど付け焼き刃対応になります。工数がかかりますが、本来は一番上の選択肢を取るべきでしょう。 メモリ破壊とかそういう危険なバグではないので、とりあえず一番下で直して見ました。
- graphic.cのinit_palette()の末尾に追加
static unsigned char table_2[3] = { 0x84, 0x84, 0x84 /* 15:暗い灰色 */ }; set_palette(233, 233, table_2);
- window.cのmake_wtitle8()の一部を変更
if (c == '@') { c = COL8_000000; } else if (c == '$') { //c = COL8_848484;//←消す c = 233;//←入れる } else if (c == 'Q') {
結果
hariboteOSをベースに自作OSを作成されている方は一度見直してみることをお勧めします。