[OSASK 6639] Re: ウィンドウ移動アルゴリズムについて

  こんばんは、川合です。


FORM-Akkie さんは 2003/11/02 19:08:00 の「[OSASK 6638] FORM: re:
 ウィンドウ移動アルゴリズムについて」で書きました:

> 昨日はこれをやってみました。……グラフィックボックスに
>ついては、更新 (フラッシュ) したかどうか分からない仕様で
>した(;_; ともかく、やれと言われれば差分描画できる状態です。
>バグってなければ。

  いや、ええと、グラフィックボックスも更新していないことは分かり
ますよ。つまり、flushだとか、ラインだとかの際に、windowがアクセ
スイネーブルかどうかを調べる部分がありますが、あそこにelseを追加
して、グラフィックボックス内のフラグ(64バイトのうちの、空いてい
るところを適当に割り振るとして)を立ててやればいいんです。

  もちろん、アプリは勝手にグラフィックボックスをいじることはあり
ますが、flushが来るまでは画面に反映させる義務はpioneerにはないの
で、それは差分再描画の対象から外していいわけです。

> で、winman0のウィンドウ管理について質問です。
>WINDOW構造体には condition, flag0, job_flag0, job_flag1 と、
>フラグがたくさんあります (job_flag1は使われてませんが)。
>各ビットの意味について教えてください。
>これが分からんと、三連休じゃ終わりませんX-P

  あちゃあ・・・。それを説明しなきゃなんないのか・・・。というか
それだと、僕がwinman0を改造するほうが楽になってしまう・・・。

  とりあえず、void job_general1();の頭のところの注釈は参考になり
ませんか?

  ついでに書くと、win->flagsというのは、bit0しか使っていなくて、
意味は次の通りです。

    0:通常
    1:クローズ処理中

  クローズ処理中に入ると、もうこのウィンドウに属する全てのユーザ
からのアクションは停止するはずなのですが、なんか手抜きっぽくて、
そのままのところがたくさんありますね。

  こほん。つまりですね、

#define WINFLG_MUSTREDRAWDIF        0x40000000  /* bit30 */

みたいなのを作って、

        if (flag0 & WINFLG_MUSTREDRAW) {
            pjob->win = win;
            if ((flag0 & (WINFLG_OVERRIDEDISABLED | 0x01)) == 0) {
                sgg_wm0s_accessdisable(&win->sgg);
                win->job_flag0 |= WINFLG_WAITDISABLE;
                pjob->count = 1;
            }
            if ((flag0 & 0x03) != win->condition)
                sgg_wm0s_setstatus(&win->sgg, win->condition = (flag0 & 0x03));
            sgg_wm0s_redraw(&win->sgg);
            win->job_flag0 |= WINFLG_WAITREDRAW;
            pjob->count++;
            return;
        }

の部分を(註:「sgg_wm0s_redraw」をキーにすればすぐ見付かる)、

!       if (flag0 & (WINFLG_MUSTREDRAW | WINFLG_MUSTREDRAWDIF)) {
            pjob->win = win;
            if ((flag0 & (WINFLG_OVERRIDEDISABLED | 0x01)) == 0) {
                sgg_wm0s_accessdisable(&win->sgg);
                win->job_flag0 |= WINFLG_WAITDISABLE;
                pjob->count = 1;
            }
            if ((flag0 & 0x03) != win->condition)
                sgg_wm0s_setstatus(&win->sgg, win->condition = (flag0 & 0x03));
!           if (flag0 & WINFLG_MUSTREDRAW)
!               sgg_wm0s_redraw(&win->sgg);
!           else
!               sgg_wm0s_redrawdif(&win->sgg);
            win->job_flag0 |= WINFLG_WAITREDRAW;
            pjob->count++;
            return;
        }

に変えて、さらにjob_movewin4()の中の、

        do {
            int flag0 = WINFLG_OVERRIDEDISABLED; // override-disabled
            if (overrapwin(win0, win1))
                flag0 = WINFLG_MUSTREDRAW | WINFLG_OVERRIDEDISABLED; // override-disabled & must-redraw
            win1->job_flag0 = flag0;
        } while ((win1 = win1->down) != win0);

の部分を、

        do {
            int flag0 = WINFLG_OVERRIDEDISABLED; // override-disabled
!           if (win->condition & 0x01)
!               flag0 = WINFLG_MUSTREDRAWDIF | WINFLG_OVERRIDEDISABLED;
            if (overrapwin(win0, win1))
                flag0 = WINFLG_MUSTREDRAW | WINFLG_OVERRIDEDISABLED; // override-disabled & must-redraw
            win1->job_flag0 = flag0;
        } while ((win1 = win1->down) != win0);

にすれば目的は達せられると思います。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/



ML番号でジャンプ
ML単語検索