引き続きサンプルアプリケーションを作りつつフレームワークや画面側を試験している。作っているサンプルは画像ビューアなのだがスライドショー的動作は確認できた。これは最終的な仕様からは外れる動作確認的なものだ。
アプリケーションは画面からのイベントで受動的に動作するのでTB::Threadをアプリケーションクラスの親に追加しない限り能動的には動作しない。試しにスレッドを使わず初期化ハンドラの中で延々と処理させていたら、アプリケーションがいつまでもメッセージを受信しなくて画面側がイベントを送れなくなって画面ごと固まるというラバストネス的によろしくない動作になった。
そのうちアプリが固まってる時の処理を書かねばなるまい。Windowsで窓が白くなるアレだ。送信もスレッド化して送信しようとした時にキューにメッセージがあったら固まってると認識していいだろう。
課題はもうひとつ。テクスチャの更新など時間がかかる処理があるのでメッセージ処理系は描画コンテキストを複製して描画それ自体とは別のスレッドにする必要がある...しかし...もうどんなスレッドがあるかとかだいたいしかわかんねーよ。
2017年6月27日火曜日
2017年6月25日日曜日
TB::Prefsは設定を変数のように扱えて便利だが...。
サンプルアプリケーションを書いてたらなかなか根の深い問題を掘り当ててしまった。TB::Prefsはお手軽に使えるけど複数箇所から同じキーでアクセスするということができないので共通な設定を拾えない。使い方で悩むよりTB::Prefsを直すかなー。
「既に同じキーで値が登録されていたらそいつへの参照として振る舞う」的な...型違ったらどうするかなー。
「既に同じキーで値が登録されていたらそいつへの参照として振る舞う」的な...型違ったらどうするかなー。
2017年6月8日木曜日
2017年6月7日水曜日
Xのキャプチャ
ルート窓を取り込むためのGLXコンテキストを作って、スレッドでカレントにするとsegfaultで、X越しに設定するとBadMatchでおっ死ぬのだが...スレッドなのでBadMatchってのはないと思うのだが...と悩んでいたのだが、manに「drawable が None なのに ctx が NULL でない場合」にも起きるとの記述がある。この場合drawableはルート窓なので...。
もしやと思いルート窓用のコンテキストを先に作って、それを描画先窓のコンテキストで共有するようにしたらX越しに設定すると相変わらずBadMatchは起きるものの直接設定した時にはsegfaultは起きなくなった。
もっとも、キャプチャできていないんだけど(ダメジャン
2017年6月6日火曜日
そのうちwebkitもやっとかなきゃだなー。と調べてみたところportにCairo-Windowsがある。wOCEの描画関連はCairoベースだが実行環境はLinux系なのでクッソ惜しい。wOCEのサーバにはXがないのでgtkのportで丸々持ってこられても困るんだが...これは窓用でも同じか。
webkitの概要はこのへんがわかりやすいと思うのでメモ。
webkitの概要はこのへんがわかりやすいと思うのでメモ。
2017年6月5日月曜日
根窓に直接描画するようにすると画面真っ暗というのはどうもxfce4の仕様が変わったのが原因な気がする。デスクトップの背景に記憶になかった「透明」ってのがある(指定したけど変わらなかった)。
窓を作って描画するとキャプチャが非常に面倒になるので避けたいのだが...キャプチャ自体はできるのだけれどGLXのコンテキストにはXのdrawableを指定する必要があって、描画対象の窓が別になると別のコンテキストになる。
親子関係があれば別コンテキストでリソースを共有できるので別コンテキストであること自体はいいのだが、GLXのコンテキストはスレッドにくっついてるのでスムーズに切り替えるには別スレッドにしとく必要がある(単一スレッドで切り替えるといちいちコンテキストの解放、作成を繰り返すことになるので非常に遅い)。逆に言えば別スレッドであればフレームバッファ切り替えの隙を突く必要もなくなるわけだが...。
窓を作って描画するとキャプチャが非常に面倒になるので避けたいのだが...キャプチャ自体はできるのだけれどGLXのコンテキストにはXのdrawableを指定する必要があって、描画対象の窓が別になると別のコンテキストになる。
親子関係があれば別コンテキストでリソースを共有できるので別コンテキストであること自体はいいのだが、GLXのコンテキストはスレッドにくっついてるのでスムーズに切り替えるには別スレッドにしとく必要がある(単一スレッドで切り替えるといちいちコンテキストの解放、作成を繰り返すことになるので非常に遅い)。逆に言えば別スレッドであればフレームバッファ切り替えの隙を突く必要もなくなるわけだが...。
2017年6月4日日曜日
もうひとつの問題も解決。
結局のところ「親指定がないときの動作が間違っていた」に尽きる。画面側ではアプリケーションに対応するクラス(DM::App)はWidget関連の処理を纏めるためにWidgetの一種として作られているが、アプリケーション側ではアプリケーションを代表するクラス(App::App)はWidgetではなく、そこが間違いの原因だった。
App::Appはmainより早く初期化されるので親にWidgetを付けるわけには行かなくてそうなっているのだが、App::Widgetのコンストラクタで親がないときにはApp::AppのIDを親に指定してパケットを作るところがDM::AppWidgetを作るようになってた。
...orz
結局のところ「親指定がないときの動作が間違っていた」に尽きる。画面側ではアプリケーションに対応するクラス(DM::App)はWidget関連の処理を纏めるためにWidgetの一種として作られているが、アプリケーション側ではアプリケーションを代表するクラス(App::App)はWidgetではなく、そこが間違いの原因だった。
App::Appはmainより早く初期化されるので親にWidgetを付けるわけには行かなくてそうなっているのだが、App::Widgetのコンストラクタで親がないときにはApp::AppのIDを親に指定してパケットを作るところがDM::AppWidgetを作るようになってた。
...orz
C++の委員には科学者はいても工学者はいない。
そんな感じでC++は改版されてもデフォルトではちっともお手軽セキュアにならないから困る。
と、wOCEで使ってるtoolboxのcontainerを使う度に思う。例えばTB::List<T>のNodeはデストラクタで自分でリストから外れてくれるのでリストにゴミが残らない。リスト自体が消えた時の処理を書けたり指定すれば一緒に消えてくれるおまけ付きだ。
だがstdのリストにポインタを収めてしまうと自分の反復子を知らないと簡単には外せないし外す処理をリストにポインタを置くクラス全部に書かなきゃならん。かと言って現物を突っ込むと勝手にdeleteできない。もうね、アホかと(ry
なんか「コンピュータ・サイエンス」の連中、間違った方向に進んでねぇか?
そんな感じでC++は改版されてもデフォルトではちっともお手軽セキュアにならないから困る。
と、wOCEで使ってるtoolboxのcontainerを使う度に思う。例えばTB::List<T>のNodeはデストラクタで自分でリストから外れてくれるのでリストにゴミが残らない。リスト自体が消えた時の処理を書けたり指定すれば一緒に消えてくれるおまけ付きだ。
だがstdのリストにポインタを収めてしまうと自分の反復子を知らないと簡単には外せないし外す処理をリストにポインタを置くクラス全部に書かなきゃならん。かと言って現物を突っ込むと勝手にdeleteできない。もうね、アホかと(ry
なんか「コンピュータ・サイエンス」の連中、間違った方向に進んでねぇか?
登録:
投稿 (Atom)
引っ越すことにした。
引っ越し先。 見えるかな。