Yabu.log

ITなどの雑記

30日OS自作本24日以降のXボタンの影がおかしい

OS自作本24日目以降、Xボタンの色がおかしいことに気がつきました。

f:id:yuyubu:20180624004128p:plain
ボタンの影の部分が濃い灰色ではなく濃い青色になっている

f:id:yuyubu:20180626182115p:plain
参考:23日目終了時点でのXボタン
24日目(harib21e)に追加したウインドウの非アクティブ・アクティブを切り替えるchange_wtitle8ですが

  • 非アクティブ時のウインドウのバーの濃い灰色(COL8_848484)をアクティブ時に濃い青色(COL8_000084)に上書き
  • 非アクティブ時のウインドウとXボタンの影が同じ色(濃い灰色=COL8_848484)
  • この処理は色でしか判断しておらずXボタンの影が青く塗られてしまう。

という問題がありXボタンの影が24日目以降変です。

f:id:yuyubu:20180624003957p:plain

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') {

結果

www.youtube.com

hariboteOSをベースに自作OSを作成されている方は一度見直してみることをお勧めします。