GTK3 GtkLayout с Каиром, не может получить регион обновления - PullRequest
1 голос
/ 30 декабря 2011

Я пытаюсь нарисовать 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 следующим образом также не работает (это функция arg для g_signal_connect):

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

Все, что передается, не GtkLayout из g_signal_connect, а что-то еще.

================= ОБНОВЛЕНИЕ ====================

Я нашелспособ сделать то, что я хочу, без использования 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));
...