]> granicus.if.org Git - handbrake/commitdiff
merge LinGui: fix activity window scrolling
authorjstebbins <jstebbins.hb@gmail.com>
Thu, 26 Mar 2015 18:28:58 +0000 (18:28 +0000)
committerjstebbins <jstebbins.hb@gmail.com>
Thu, 26 Mar 2015 18:28:58 +0000 (18:28 +0000)
Yet another work-around for a gtk+-3 problem.  They now delay updating
the scrollbar adjustment to an idle loop callback.  So I must delay
my scroll-to-bottom code so that it occurrs after their update.

git-svn-id: svn://svn.handbrake.fr/HandBrake/branches/0.10.x@7018 b64f7644-9d1e-0410-96f1-a4d463321fa5

gtk/src/callbacks.c

index 1d2ea0c46fbb4439f791fcd7b637ea74e063b8f9..afe0a560d671f8f2bf75c27e396ce27b7a336285 100644 (file)
@@ -3392,6 +3392,35 @@ ghb_timer_cb(gpointer data)
     return TRUE;
 }
 
+gboolean scroll_at_bottom(signal_user_data_t *ud, const char *scroll)
+{
+    GtkScrolledWindow *window;
+    GtkAdjustment *adj;
+    double val, upper, ps;
+
+    window = GTK_SCROLLED_WINDOW(GHB_WIDGET(ud->builder, scroll));
+    adj = gtk_scrolled_window_get_vadjustment(window);
+    val = gtk_adjustment_get_value(adj);
+    upper = gtk_adjustment_get_upper(adj);
+    ps = gtk_adjustment_get_page_size(adj);
+    return val >= upper - ps;
+}
+
+G_MODULE_EXPORT gboolean
+activity_scroll_to_bottom(signal_user_data_t *ud)
+{
+    GtkScrolledWindow *window;
+    GtkAdjustment *adj;
+    double upper, ps;
+
+    window = GTK_SCROLLED_WINDOW(GHB_WIDGET(ud->builder, "activity_scroll"));
+    adj = gtk_scrolled_window_get_vadjustment(window);
+    upper = gtk_adjustment_get_upper(adj);
+    ps = gtk_adjustment_get_page_size(adj);
+    gtk_adjustment_set_value(adj, upper - ps);
+    return FALSE;
+}
+
 G_MODULE_EXPORT gboolean
 ghb_log_cb(GIOChannel *source, GIOCondition cond, gpointer data)
 {
@@ -3400,7 +3429,6 @@ ghb_log_cb(GIOChannel *source, GIOCondition cond, gpointer data)
     GtkTextView *textview;
     GtkTextBuffer *buffer;
     GtkTextIter iter;
-    GtkTextMark *mark;
     GError *gerror = NULL;
     GIOStatus status;
 
@@ -3413,36 +3441,12 @@ ghb_log_cb(GIOChannel *source, GIOCondition cond, gpointer data)
         length--;
     if (text != NULL && length > 0)
     {
-        GdkWindow *window;
-        gint width, height;
-        gint x, y;
         gboolean bottom = FALSE;
         gchar *utf8_text;
 
+        bottom = scroll_at_bottom(ud, "activity_scroll");
         textview = GTK_TEXT_VIEW(GHB_WIDGET (ud->builder, "activity_view"));
         buffer = gtk_text_view_get_buffer (textview);
-        // I would like to auto-scroll the window when the scrollbar
-        // is at the bottom,
-        // must determine whether the insert point is at
-        // the bottom of the window
-        window = gtk_text_view_get_window(textview, GTK_TEXT_WINDOW_TEXT);
-        if (window != NULL)
-        {
-            width = gdk_window_get_width(window);
-            height = gdk_window_get_height(window);
-            gtk_text_view_window_to_buffer_coords(textview,
-                GTK_TEXT_WINDOW_TEXT, width, height, &x, &y);
-            gtk_text_view_get_iter_at_location(textview, &iter, x, y);
-            if (gtk_text_iter_is_end(&iter))
-            {
-                bottom = TRUE;
-            }
-        }
-        else
-        {
-            // If the window isn't available, assume bottom
-            bottom = TRUE;
-        }
         gtk_text_buffer_get_end_iter(buffer, &iter);
         utf8_text = g_convert_with_fallback(text, -1, "UTF-8", "ISO-8859-1",
                                             "?", NULL, &length, NULL);
@@ -3451,10 +3455,16 @@ ghb_log_cb(GIOChannel *source, GIOCondition cond, gpointer data)
             gtk_text_buffer_insert(buffer, &iter, utf8_text, -1);
             if (bottom)
             {
-                gtk_text_buffer_get_end_iter(buffer, &iter);
-                mark = gtk_text_buffer_create_mark(buffer, NULL, &iter, FALSE);
-                gtk_text_view_scroll_mark_onscreen(textview, mark);
-                gtk_text_buffer_delete_mark(buffer, mark);
+                static guint scroll_tok = 0;
+                GSource *source = NULL;
+                if (scroll_tok > 0)
+                    source = g_main_context_find_source_by_id(NULL, scroll_tok);
+                if (source != NULL)
+                {
+                    g_source_remove(scroll_tok);
+                }
+                scroll_tok = g_idle_add((GSourceFunc)activity_scroll_to_bottom,
+                                        ud);
             }
 #if defined(_WIN32)
             gsize one = 1;