+/* Helper function: turn on paging for this textview */
+static void
+start_paging(GtkTextView *textview)
+{
+ currently_paging = TRUE;
+ g_signal_handler_unblock(textview, expose_handler);
+ g_signal_handler_unblock(textview, pager_handler);
+}
+
+/* Helper function: turn off paging for this textview */
+static void
+stop_paging(GtkTextView *textview)
+{
+ currently_paging = FALSE;
+ g_signal_handler_block(textview, expose_handler);
+ g_signal_handler_block(textview, pager_handler);
+}
+
+/* Update the pager position after new text is inserted in the buffer */
+static void
+after_insert(GtkTextBuffer *buffer, GtkTextIter *location, gchar *text, gint len, GtkTextView *textview)
+{
+ while(gtk_events_pending())
+ gtk_main_iteration();
+
+ /* Move the pager to the last visible character in the buffer */
+ gint scroll_distance = move_pager_and_get_scroll_distance(textview);
+
+ if(scroll_distance > 0 && !currently_paging)
+ start_paging(textview);
+}
+
+static void
+adjustment_changed(GtkAdjustment *adjustment, GtkTextView *textview)
+{
+ while(gtk_events_pending())
+ gtk_main_iteration();
+
+ /* Move the pager, etc. */
+ gint scroll_distance = move_pager_and_get_scroll_distance(textview);
+
+ if(scroll_distance > 0 && !currently_paging)
+ start_paging(textview);
+ else if(scroll_distance == 0 && currently_paging)
+ stop_paging(textview);
+
+ /* Refresh the widget so that any extra "more" prompts disappear */
+ gtk_widget_queue_draw(GTK_WIDGET(textview));
+}
+
+/* Handle key press events in the textview while paging is active */