GtkScrolledWindowのスクロール位置をアプリケーション側から変更して中央寄せするコードです。
===
static void et_scrolled_window_centering_(GtkScrolledWindow *scrolled_window)
{
{
GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment (scrolled_window);
double v = (gtk_adjustment_get_upper(vadj) - gtk_adjustment_get_page_size(vadj)) / 2.0;
gtk_adjustment_set_value (vadj, v);
}
{
GtkAdjustment *hadj = gtk_scrolled_window_get_hadjustment (scrolled_window);
double h = (gtk_adjustment_get_upper(hadj) - gtk_adjustment_get_page_size(hadj)) / 2.0;
gtk_adjustment_set_value (hadj, h);
}
}
===
問題はこのスクロール位置指定の実行タイミングで、スクロール位置を変更するにはScrolledWindowの中でスクロールされる内側Widgetが再描画済みでサイズが確定していなければならないのですが、Widgetコールバックの設計によっては、スクロール位置の変更コードを呼び出すタイミングがその内側Widgetの再描画コールバック("draw"イベント)内しかない場合があって。
仕方がないので最初の再描画コールバック内でフラグをカウントアップして"draw"イベントを再度コールするようにしたのですが、作成中のアプリケーションはそうしなくても都合により外部からすぐ再描画コールバックが呼ばれるので、これで本当に正しいのか正直不明です。
===
static gboolean _cb_expose_event (GtkWidget *widget, cairo_t *cr, gpointer data)
{
(中略)
switch(self->centering_control){
case 0:
self->centering_control++;
// kick to re draw event, because only need centering.
gtk_widget_queue_draw(self->canvas);
break;
case 1:
self->centering_control++;
debug_print_adjustment_(self);
et_scrolled_window_centering_(GTK_SCROLLED_WINDOW(self->scroll));
break;
default:
break;
}
}
return FALSE;
}
===
以上です。
登録:
投稿 (Atom)
食洗機の分岐水栓をDIY工事はあきらめてお願いした(結果的によかった)
食洗機の『プチ食洗(NP-TCR3)』を購入しました。 食洗機にはビルトイン・据え置き水栓・据え置きタンク式、がありますが、購入したのは水栓をつなげる必要がある機種です。 わたしが購入前に参考にしたブログでは『買って取り付ければ終了だよ』で、『分岐水栓を取り付ける必要があるけれ...


-
RENAULT LIGHT10 RENAULT LIGHT10 を購入 しました。Web上にあまり開封写真等の詳細がなかったので残しておきます。 開封 モノが大きいためか、知らない運送会社でおくられてきた。 ...
-
ノートPCの液晶保護フィルムが100円で買えるなんて、良い時代になりました。 ダイソーに行ったら、ノートPCで使えそうな液晶保護フィルムがあったため、衝動的に購入。 A4サイズと書いてあります。私が使っている13インチワイドのノートPCで使えるかどうかわからなかっ...
-
プログラマならば家の掃除は自動化せよという風潮に習い、遅ればせながらロボット掃除機ILIFE V3s Proを導入しました。 その2ヶ月使用のレビューです。 主な使用環境 - 一人部屋 - 掃除するのは玄関・廊下・キッチン・部屋 - 風呂場・トイレは掃除させない ...
