こんばんは、川合です。
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/