Centaring GtkScrolledWindow

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;
}

===

以上です。

Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換する

 Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換することができるが、上手く変換されない場合がある。   以前作った魔法陣イラスト素材をイラスト素材ストックサイトへ登録しようと思い立ち、改めて素材用にラスタライズ変換をかけようとした。   ラスタライズ変換...