[geary] Fix crash when conversation scrolled window child changes.



commit 07966a11561b55c594a0030353911d1bb4c3882d
Author: Michael James Gratton <mike vee net>
Date:   Tue Feb 28 21:18:07 2017 +1100

    Fix crash when conversation scrolled window child changes.
    
    This is a workaround for GTK+ Bug 778190.
    
    * src/client/conversation-viewer/conversation-viewer.vala
      (ConversationViewer): Replace the whole conversation scrolled window
      when changing the conversation, not just the viewport.
    
    * ui/conversation-viewer.ui: Remove the ScrolledWindow for now since we
      are constructing it manually.

 .../conversation-viewer/conversation-viewer.vala   |   34 +++++++++++++------
 ui/conversation-viewer.ui                          |   19 +----------
 2 files changed, 25 insertions(+), 28 deletions(-)
---
diff --git a/src/client/conversation-viewer/conversation-viewer.vala 
b/src/client/conversation-viewer/conversation-viewer.vala
index d18284c..8ddfb0e 100644
--- a/src/client/conversation-viewer/conversation-viewer.vala
+++ b/src/client/conversation-viewer/conversation-viewer.vala
@@ -42,7 +42,6 @@ public class ConversationViewer : Gtk.Stack {
     [GtkChild]
     private Gtk.Grid composer_page;
 
-    [GtkChild]
     private Gtk.ScrolledWindow conversation_scroller;
 
     [GtkChild]
@@ -97,6 +96,9 @@ public class ConversationViewer : Gtk.Stack {
         );
         this.empty_search_page.add(empty_search);
 
+        // XXX GTK+ Bug 778190 workaround
+        new_conversation_scroller();
+
         // XXX Do this in Glade when possible.
         this.conversation_find_bar.connect_entry(this.conversation_find_entry);
     }
@@ -192,7 +194,7 @@ public class ConversationViewer : Gtk.Stack {
             account.information,
             location.special_folder_type == Geary.SpecialFolderType.DRAFTS,
             ((MainWindow) get_ancestor(typeof(MainWindow))).application.config,
-            conversation_scroller.get_vadjustment()
+            this.conversation_scroller.get_vadjustment()
         );
 
         // Need to fire this signal early so the the controller
@@ -250,15 +252,9 @@ public class ConversationViewer : Gtk.Stack {
 
     // Remove any existing conversation list, cancelling its loading
     private void remove_current_list() {
-        // Remove the viewport that contains the current list
-        Gtk.Widget? scrolled_child = this.conversation_scroller.get_child();
-        if (scrolled_child != null) {
-            scrolled_child.destroy();
-        }
-
-        // Reset the scrollbars to their initial positions
-        this.conversation_scroller.hadjustment.set_value(0);
-        this.conversation_scroller.vadjustment.set_value(0);
+        // XXX GTK+ Bug 778190 workaround
+        this.conversation_scroller.destroy();
+        new_conversation_scroller();
 
         // Notify that the current list was removed
         if (this.current_list != null) {
@@ -267,6 +263,22 @@ public class ConversationViewer : Gtk.Stack {
         }
     }
 
+    private void new_conversation_scroller() {
+        // XXX Work around for GTK+ Bug 778190: Instead of replacing
+        // the Viewport that contains the current list, replace the
+        // complete ScrolledWindow. Need to put remove this method and
+        // put the settings back into conversation-viewer.ui when we
+        // can rely on it being fixed again.
+        Gtk.ScrolledWindow scroller = new Gtk.ScrolledWindow(null, null);
+        scroller.get_style_context().add_class("geary-conversation-scroller");
+        scroller.hscrollbar_policy = Gtk.PolicyType.NEVER;
+        scroller.set_hexpand(true);
+        scroller.set_vexpand(true);
+        scroller.show();
+        this.conversation_scroller = scroller;
+        this.conversation_page.add(scroller);
+    }
+
     /**
      * Sets the currently visible page of the stack.
      */
diff --git a/ui/conversation-viewer.ui b/ui/conversation-viewer.ui
index e666ea2..b67be0e 100644
--- a/ui/conversation-viewer.ui
+++ b/ui/conversation-viewer.ui
@@ -39,6 +39,7 @@
       <object class="GtkGrid" id="conversation_page">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
         <child>
           <object class="GtkSearchBar" id="conversation_find_bar">
             <property name="visible">True</property>
@@ -119,23 +120,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkScrolledWindow" id="conversation_scroller">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hexpand">True</property>
-            <property name="vexpand">True</property>
-            <property name="hscrollbar_policy">never</property>
-            <child>
-              <placeholder/>
-            </child>
-            <style>
-              <class name=".geary-conversation-scroller"/>
-            </style>
-          </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
-          </packing>
+          <placeholder/>
         </child>
       </object>
       <packing>


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