[gnome-builder] build-tools: workaround assertion failure in gtktextview



commit bcbded04c8903f15e6a50f5fa66f2665e1b4af7b
Author: Christian Hergert <chergert redhat com>
Date:   Mon Feb 15 22:43:26 2016 -0800

    build-tools: workaround assertion failure in gtktextview
    
    This was happening on a second call to Build, or other commands.
    Instead, we now just destroy the view and re-create it.

 plugins/build-tools/gbp-build-log-panel.c  |   54 +++++++++++++++++----------
 plugins/build-tools/gbp-build-log-panel.ui |    9 +----
 2 files changed, 35 insertions(+), 28 deletions(-)
---
diff --git a/plugins/build-tools/gbp-build-log-panel.c b/plugins/build-tools/gbp-build-log-panel.c
index 6cfe715..8e13762 100644
--- a/plugins/build-tools/gbp-build-log-panel.c
+++ b/plugins/build-tools/gbp-build-log-panel.c
@@ -27,16 +27,17 @@
 
 struct _GbpBuildLogPanel
 {
-  GtkBin          parent_instance;
+  GtkBin             parent_instance;
 
-  IdeBuildResult *result;
-  EggSignalGroup *signals;
-  GtkCssProvider *css;
-  GSettings      *settings;
+  IdeBuildResult    *result;
+  EggSignalGroup    *signals;
+  GtkCssProvider    *css;
+  GSettings         *settings;
+  GtkTextBuffer     *buffer;
 
-  GtkTextBuffer  *buffer;
-  GtkTextView    *text_view;
-  GtkTextTag     *stderr_tag;
+  GtkScrolledWindow *scroller;
+  GtkTextView       *text_view;
+  GtkTextTag        *stderr_tag;
 };
 
 enum {
@@ -50,19 +51,34 @@ G_DEFINE_TYPE (GbpBuildLogPanel, gbp_build_log_panel, GTK_TYPE_BIN)
 static GParamSpec *properties [LAST_PROP];
 
 static void
-gbp_build_log_panel_reset_buffer (GbpBuildLogPanel *self)
+gbp_build_log_panel_reset_view (GbpBuildLogPanel *self)
 {
+  GtkStyleContext *context;
+
   g_assert (GBP_IS_BUILD_LOG_PANEL (self));
 
   g_clear_object (&self->buffer);
 
+  if (self->text_view != NULL)
+    gtk_widget_destroy (GTK_WIDGET (self->text_view));
+
   self->buffer = gtk_text_buffer_new (NULL);
   self->stderr_tag = gtk_text_buffer_create_tag (self->buffer,
                                                  "stderr-tag",
                                                  "foreground", "#ff0000",
                                                  "weight", PANGO_WEIGHT_BOLD,
                                                  NULL);
-  gtk_text_view_set_buffer (self->text_view, self->buffer);
+
+  self->text_view = g_object_new (GTK_TYPE_TEXT_VIEW,
+                                  "buffer", self->buffer,
+                                  "monospace", TRUE,
+                                  "visible", TRUE,
+                                  NULL);
+  context = gtk_widget_get_style_context (GTK_WIDGET (self->text_view));
+  gtk_style_context_add_provider (context,
+                                  GTK_STYLE_PROVIDER (self->css),
+                                  GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+  gtk_container_add (GTK_CONTAINER (self->scroller), GTK_WIDGET (self->text_view));
 }
 
 static void
@@ -71,6 +87,7 @@ gbp_build_log_panel_log (GbpBuildLogPanel  *self,
                          const gchar       *message,
                          IdeBuildResult    *result)
 {
+  GtkTextMark *insert;
   GtkTextIter iter;
 
   g_assert (GBP_IS_BUILD_LOG_PANEL (self));
@@ -94,7 +111,8 @@ gbp_build_log_panel_log (GbpBuildLogPanel  *self,
       gtk_text_buffer_apply_tag (self->buffer, self->stderr_tag, &begin, &iter);
     }
 
-  g_signal_emit_by_name (self->text_view, "move-cursor", GTK_MOVEMENT_BUFFER_ENDS, 1, FALSE);
+  insert = gtk_text_buffer_get_insert (self->buffer);
+  gtk_text_view_scroll_to_mark (self->text_view, insert, 0.0, TRUE, 0.0, 0.0);
 }
 
 void
@@ -106,7 +124,7 @@ gbp_build_log_panel_set_result (GbpBuildLogPanel *self,
 
   if (g_set_object (&self->result, result))
     {
-      gbp_build_log_panel_reset_buffer (self);
+      gbp_build_log_panel_reset_view (self);
       egg_signal_group_set_target (self->signals, result);
     }
 }
@@ -209,7 +227,7 @@ gbp_build_log_panel_class_init (GbpBuildLogPanelClass *klass)
 
   gtk_widget_class_set_css_name (widget_class, "buildlogpanel");
   gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/builder/plugins/build-tools-plugin/gbp-build-log-panel.ui");
-  gtk_widget_class_bind_template_child (widget_class, GbpBuildLogPanel, text_view);
+  gtk_widget_class_bind_template_child (widget_class, GbpBuildLogPanel, scroller);
 
   properties [PROP_RESULT] =
     g_param_spec_object ("result",
@@ -224,10 +242,12 @@ gbp_build_log_panel_class_init (GbpBuildLogPanelClass *klass)
 static void
 gbp_build_log_panel_init (GbpBuildLogPanel *self)
 {
-  GtkStyleContext *context;
+  self->css = gtk_css_provider_new ();
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
+  gbp_build_log_panel_reset_view (self);
+
   self->signals = egg_signal_group_new (IDE_TYPE_BUILD_RESULT);
 
   egg_signal_group_connect_object (self->signals,
@@ -236,12 +256,6 @@ gbp_build_log_panel_init (GbpBuildLogPanel *self)
                                    self,
                                    G_CONNECT_SWAPPED);
 
-  self->css = gtk_css_provider_new ();
-  context = gtk_widget_get_style_context (GTK_WIDGET (self->text_view));
-  gtk_style_context_add_provider (context,
-                                  GTK_STYLE_PROVIDER (self->css),
-                                  GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
-
   self->settings = g_settings_new ("org.gnome.builder.terminal");
   g_signal_connect_object (self->settings,
                            "changed::font-name",
diff --git a/plugins/build-tools/gbp-build-log-panel.ui b/plugins/build-tools/gbp-build-log-panel.ui
index 3dee976..299fc55 100644
--- a/plugins/build-tools/gbp-build-log-panel.ui
+++ b/plugins/build-tools/gbp-build-log-panel.ui
@@ -1,15 +1,8 @@
 <interface>
   <template class="GbpBuildLogPanel" parent="GtkBin">
     <child>
-      <object class="GtkScrolledWindow">
+      <object class="GtkScrolledWindow" id="scroller">
         <property name="visible">true</property>
-        <child>
-          <object class="GtkTextView" id="text_view">
-            <property name="cursor-visible">false</property>
-            <property name="editable">false</property>
-            <property name="visible">true</property>
-          </object>
-        </child>
       </object>
     </child>
   </template>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]