GdkRectangle pagerpos, endpos, visiblerect;
GtkTextIter oldpager, newpager, end;
GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
GdkRectangle pagerpos, endpos, visiblerect;
GtkTextIter oldpager, newpager, end;
GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
/* Get an iter at the lower right corner of the visible part of the buffer */
gtk_text_view_get_visible_rect(textview, &visiblerect);
/* Get an iter at the lower right corner of the visible part of the buffer */
gtk_text_view_get_visible_rect(textview, &visiblerect);
- gtk_text_view_get_iter_at_location(textview, &newpager, visiblerect.x + visiblerect.width, visiblerect.y + visiblerect.height);
+ gtk_text_view_get_iter_at_location(
+ textview,
+ &newpager,
+ visiblerect.x + visiblerect.width,
+ visiblerect.y + visiblerect.height
+ );
gtk_text_buffer_get_iter_at_mark(buffer, &oldpager, pager);
gtk_text_buffer_move_mark(buffer, pager, &newpager);
gtk_text_buffer_get_iter_at_mark(buffer, &oldpager, pager);
gtk_text_buffer_move_mark(buffer, pager, &newpager);
-/* Update the pager position after new text is inserted in the buffer and the
-text view has calculated where it is */
-void
-pager_after_size_allocate(GtkTextView *view, GtkAllocation *allocation, winid_t win)
+/* Check whether paging should be done. This function is called inside the
+ * idle handler, after the textview has finished updating. */
+gboolean
+pager_check(gpointer data)
/* Move the pager to the last visible character in the buffer */
gint view_height, scroll_distance;
move_pager_and_get_scroll_distance( GTK_TEXT_VIEW(win->widget), &view_height, &scroll_distance );
if(view_height <= 1)
/* Paging is unusable when window is too small */
/* Move the pager to the last visible character in the buffer */
gint view_height, scroll_distance;
move_pager_and_get_scroll_distance( GTK_TEXT_VIEW(win->widget), &view_height, &scroll_distance );
if(view_height <= 1)
/* Paging is unusable when window is too small */
}
else if(scroll_distance > 0) {
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(win->widget));
}
else if(scroll_distance > 0) {
GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(win->widget));
- gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(win->widget), gtk_text_buffer_get_mark(buffer, "end_position"));
- while( gtk_events_pending() ) {
- gtk_main_iteration();
- }
+ GtkTextMark *end = gtk_text_buffer_get_mark(buffer, "end_position");
+
+ gdk_threads_enter();
+ gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(win->widget), end);
+ gdk_threads_leave();
/* Move the pager, etc. */
gint scroll_distance, view_height;
move_pager_and_get_scroll_distance( GTK_TEXT_VIEW(win->widget), &view_height, &scroll_distance );
/* Move the pager, etc. */
gint scroll_distance, view_height;
move_pager_and_get_scroll_distance( GTK_TEXT_VIEW(win->widget), &view_height, &scroll_distance );