Как узнать, когда GtkWidget был проверен в Gtk+2

Мне нужно знать, когда GtkWidget был перерисован и проверен после того, как я изменил его содержимое (запланировал перерисовку).

В любом случае, чтобы узнать, полностью ли он перерисован, или нужно подождать больше, чтобы перерисовать.


person sandun dhammika    schedule 08.11.2016    source источник
comment
Почему, и можете ли вы дать некоторый контекст о том, где это будет полезно. Есть быстрые грязные хаки, чтобы решить это, но перерисовка происходит довольно быстро.   -  person Errol van de l'Isle    schedule 08.11.2016
comment
У меня есть виджет GtkTextView, и он предназначен для ведения журнала. И есть функция автопрокрутки. Существует функция опроса, которая будет вызываться каждые 20 миллисекунд. прокрутка должна произойти сразу после проверки GetTextView. Выполнение этого раньше не приведет к полной автоматической прокрутке до конца.   -  person sandun dhammika    schedule 08.11.2016


Ответы (1)


Способ обойти то, что вам нужно, - отложить прокрутку до тех пор, пока GTK не узнает, насколько велика область прокрутки. Вероятно, самый простой способ — использовать g_idle_add(). Добавленные в него обратные вызовы будут выполняться в порядке приоритета, когда нет необходимости выполнять другие задачи. GTK использует функции бездействия с высоким приоритетом для перерисовки, но приоритет по умолчанию вас вполне устроит.

gboolena my_delayed_function(gpointer user_data)
{
    // The function that does the scroll goes here.

    return FALSE;
}

void my_function_that_shows_something()
{
    // Do some drawing.

    // ...

    // Schedule a scroll.
    g_idle_add(my_delayed_function, NULL);
}

В качестве примечания вы должны вернуть FALSE из этого обратного вызова, иначе он будет вызываться повторно.

person Errol van de l'Isle    schedule 10.11.2016