1

cairo を使用して GtkLayout を描画しようとしています。レイアウトが巨大で、コンテナ ウィンドウに表示されている部分を取得して、その部分だけを更新する必要があります。GTK2 では、イベント データを公開するだけで十分でした。GTK3 ではうまくいきません。

「描画」イベントを処理する関数では、次のことを行いました。

GdkWindow              *gdkwin;              //  window to draw
cairo_region_t         *cregion;             //  update regions
cairo_rectangle_int_t  crect;                //  enclosing rectangle

gdkwin = gtk_layout_get_bin_window(GTK_LAYOUT(layout));
cregion = gdk_window_get_update_area(gdkwin);
cairo_region_get_extents(cregion,&crect);
expy1 = crect.y;                             //  top of update area
expy2 = expy1 + crect.height;                //  bottom of update area

問題は、cregion にゴミがあることです。gdk_window_get_update_area() にバグがあるか、正しい描画ウィンドウを使用していません。

次のように GtkLayout を渡すことも機能しません (これは g_signal_connect の関数引数です)。

void draw_function(GtkWidget *layout, cairo_t *cr, void *userdata)

渡されるものは、g_signal_connect からの GtkLayout ではなく、別のものです。

================= 更新 ====================

GtkLayout を使用せずにやりたいことを行う方法を見つけました。ビューポート内で GtkDrawingArea を使用しています。大きなグラフィック レイアウト内の任意のウィンドウにスクロールして、そのウィンドウのみを更新できます。不可解なドキュメントを理解したら、うまく機能します。

scrwing = gtk_scrolled_window_new(0,0); 
gtk_container_add(GTK_CONTAINER(vboxx),scrwing);  
drwing = gtk_drawing_area_new();   
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrwing),drwing);
gtk_scrolled_window_set_policy(SCROLLWIN(scrwing),ALWAYS,ALWAYS);
scrollbar = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrwing));
4

0 に答える 0