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