LINUX.ORG.RU

[gtk] Рисование в gtk и сигнал expose_event

 


0

0

Короче, задача нарисовать в gtk картинку из примитивов, ну я все вроде сделал, оно даже работает. Только вот я заметил, что процессор сильно грузится. Использую сигнал expose_event

g_signal_connect(G_OBJECT(drawingArea), "expose_event",G_CALLBACK(expose_event_callback), NULL);

Как я понял, оно (expose_event) генерируется, когда окно находится в визибле, то есть почти постоянно, если работать с ним. Отсюда и загрузка процессора. Отсюда вопрос, как этого избежать? Все же хочется чтобы окно после перекрытия другим все же перерисовывалось.

★★★★★

Оно генерируется когда надо. Может у вас графика тяжелая? Мало инфы.

По поему еще compiz на это влияет. Хотя не утверждаю, не проверял, просто это логично, что компиз может в памяти картинки окон держать и ничего не перерисовывать. Или наоборот.

vertexua ★★★★★
()
Ответ на: комментарий от ananas
gboolean
expose_event_callback (GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
  gdk_draw_arc (widget->window,
                widget->style->fg_gc[gtk_widget_get_state (widget)],
                TRUE,
                0, 0, widget->allocation.width, widget->allocation.height,
                0, 64 * 360);
  return TRUE;
}
[...]
  GtkWidget *drawing_area = gtk_drawing_area_new ();
  gtk_widget_set_size_request (drawing_area, 100, 100);
  g_signal_connect (G_OBJECT (drawing_area), "expose_event",
                    G_CALLBACK (expose_event_callback), NULL);

Примерно так, тут отрывок из доки по gtk. Кстати если добавить в начало expose_event_callback printf(«111\n»); то мы увидим мноооого единц, даже если просто запустить.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

во-первых - просто формируйте нужный pixmap вне обработчика, а в обработчике используйте gdk_draw_drawable()

во-вторых - return FALSE; чтобы запретить дальнейшее дерганье обработчика сигнала

и для примера - посмотрите код снипета «Drawing Area» в gtk-demo

ananas ★★★★★
()
Ответ на: комментарий от ananas

>во-первых - просто формируйте нужный pixmap вне обработчика, а в обработчике используйте gdk_draw_drawable()

Что так делать можно это понятно, только вот проблема не в этом.

во-вторых - return FALSE; чтобы запретить дальнейшее дерганье обработчика сигнала

Не помогло

и для примера - посмотрите код снипета «Drawing Area» в gtk-demo

Ну этот пример я вообще брал из офциальной доки по drawing area.

Dudraug ★★★★★
() автор топика

Хм, интересно. Возможно это зависит от вашего WM, я с compiz тестировал только. Я в своей софтине рисовал в expose event достаточно тяжелые вещи и процессор это не грузило.

У меня работало все согласно документации: перерисовка шла только тогда, когда это было нужно. Даже перемещение окна и перемещение сверху другого окна перерисовку не вызывали (хотя теоретически наверно имели право).

Вот выдержка из дока: The ::expose-event signal is emitted when an area of a previously obscured GdkWindow is made visible and needs to be redrawn.

snizovtsev ★★★★★
()

Я нашел ошибку, не понятно зачем я использовал gtk_widget_queue_draw(), отсюда и постоянная генерация expose_event, теперь убрал, все работает. Всем спасибо.

Dudraug ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.