とりあえず普通の 2 進か BCD かの選択は config panel で選べるようにするべきだろう,というわけで config panel の実装に手をつけてみる.
gkbinclock は,構造としては panel 1 枚でできていて,そこに LED の decal が配置されている(gkrellm_create_decal_pixmap で座標を指定して生成).これを config panel で入れ換えたい.ややこしいのは,普通の binary と BCD で panel の縦サイズが変わってしまう点であった.
とりあえず,decal だけ destroy して create し直して, gkrellm_panel_panel_configure, gkrellm_panel_panel_create してみた. GKrellM 2.2.4 だと動いているように見えるのだが,1.2 だと panel のリサイズがうまくいかない.具体的には,大きくはなるんだけど小さくなってくれない.そして,何度かやってると segv で落ちてしまう.結局,panel ごと一旦 destroy して,gkrellm_panel_new0,decal の生成,panel の configure と create,callback の connect し直し,と一通りやり直すのが正解っぽい.
ちなみに gkrellm_panel_create を呼ぶときの最初の引数には,その panel の親 widget を指定しなければならないんだけど,これは plugin の create_monitor が呼ばれるときに引数として渡される仕組みになっているので,他から呼ぶにはさてどうしましょう,とちょっと悩んだが,えいやっとこんな感じで済ます.
static GtkWidget *main_vbox; static void create_plugin(GtkWidget *vbox, gint first_create) { main_vbox = vbox; create_led_panel(first_create); }
とりあえず手元では動いているけど,これでいいのかよく分からない. builtin なモジュールの実装を眺めてみると,create_monitor の中でもう 1 個箱を作るなんていう面倒なことをやっていた.もしかしたら何か落とし穴があるのかも.少し様子見てからリリースする方がいいかな.
ついでなので LED 用の decal を LED1, LED0, BLANK から選べるようにする.以前,theme によっては点灯と消灯が逆に見えるという指摘をもらったことがあったので,それに対するとりあえずの対応.
こっちは object を壊したり作ったりリサイズしたりする必要はなかったので楽だったが,「前の描画時刻から比べて変化していないビットの描画処理は省略する」という自己満足な最適化を入れていたのを忘れていて,しばしはまる _| ̄|○
最終更新時間: 2009-01-04 15:31