ウィンドゥを持つGUIは大抵これを装備しているよねぇ。
我がザビたんもそーゆーのできないもんかなぁ・・・
ちょっと妄想してみる。
例えばウィンドゥ。現状のはりぼてではウィンドゥが作られる時点で大きさを決定or決め打ちしてるよね?。そのため、バッファも確保している。
仮にだけど、これを常に画面の最大サイズとして確保したらどーなるだろ??
画素が16ビット(256色)モードだと過程すると・・・・
1枚のSHEETに必要なメモリは640x480×2バイトだから・・・150KBかぁ・・・ シートを50枚作るとすると・・・約7MB・・・ うーーーん・・・
可変が起こったら別にメモリを確保して、一気にコピー! そしてシートのアドレスをドンと切り替えてしまう!!!
・・・速度的にはどうなんだろう・・・
また、オイラにそんな高度なことができるだろうか・・・
まあいいや。
とにもかくにもちょっとやってみよう。
・・・ええと・・・まずは・・・・・
SHEETに、現在の大きさ・最大の大きさというパラメータを付け加えてみよう。
・・・それと・・・
現在、はりぼての設計では256枚シートが作れる。で、この中に特別なシートがあるよね。
マウスのシート。こいつだけは別格で、絶対にこれの上にシートがこないようになっている。(つまりマウスの上にシートなりウィンドゥがこない)
こういうシートをもう一枚設けてみる。マウスのシートのすぐ下。かならずマウスの1個だけ下になるシートと・・・ (これはなんのためか。いずれ搭載したいメニューとウィンドィの可変時に描画される四角を書く為)
・・・うーむ。そうなると、ウインドィにカッコだけでも可変ポイントを設けないといけないなぁ・・・
うはぁ!! そういう所いじってたけど、現状のはりぼての設計だとちょっと問題が・・・
ウィンドゥの大きさとはどこの大きさのことか? の定義があいまいだなぁ・・・
ちょっと一旦、新しいmake_window関数を考えてみる。
現状、窓を作る手続きはというと・・・(open_consoleの内容から)
- まずSHEETをallocする
- SHEETに使うバッファをallocする
- バッファ用のメモリを確保する
- 確保したメモリをSHEETに接続する
- make_window8関数でバッファの中に窓を作る
こんなところだよね?
うーん。これを一発で出来るようにするには・・・
WINDOWという構造体を作ってそこで一括管理するってーのはどうだろう??
SHEETはSHEETで管理しなくちゃいけない。(マウス等ウィンドゥじゃないシートが当然存在するんだろうから)
うーむ。そう妄想すると、こんな感じかなぁ???
struct WINDOW { struct SHEET sheet; //使っているシート struct TASK task; //どのタスクに所属しているか? int c_xsize; //クライアント領域の横サイズ int c_ysize; //クライアント領域の横サイズ char have_tb; //タイトルバーを所有しているか? char have_fr; //フレームを所有しているか? char have_fb; //フットバーを所有しているか? }
あっれえぇ?
ちょっとうまくいかないなぁ・・・