]> Pileus Git - ~andy/gtk/blobdiff - tests/testcombo.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / tests / testcombo.c
index b5e105bd85b8075fbfa5517d6953e5458bca948a..9a80ed32e18530a8e1d8d214ad62d6bfe2ad978a 100644 (file)
@@ -1,6 +1,21 @@
+/* testcombo.c
+ * Copyright (C) 2003  Kristian Rietveld
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "config.h"
 #include <gtk/gtk.h>
-#include <gtk/gtkcellview.h>
-#include <gtk/gtkcellviewmenuitem.h>
 
 #include <string.h>
 #include <stdio.h>
@@ -14,30 +29,28 @@ static GdkPixbuf *
 create_color_pixbuf (const char *color)
 {
         GdkPixbuf *pixbuf;
-        GdkColor col;
+        GdkRGBA rgba;
 
         int x;
         int num;
-        int rowstride;
         guchar *pixels, *p;
 
-        if (!gdk_color_parse (color, &col))
+        if (!gdk_rgba_parse (&rgba, color))
                 return NULL;
 
         pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
                                  FALSE, 8,
                                  16, 16);
 
-        rowstride = gdk_pixbuf_get_rowstride (pixbuf);
         p = pixels = gdk_pixbuf_get_pixels (pixbuf);
 
         num = gdk_pixbuf_get_width (pixbuf) *
                 gdk_pixbuf_get_height (pixbuf);
 
         for (x = 0; x < num; x++) {
-                p[0] = col.red / 65535 * 255;
-                p[1] = col.green / 65535 * 255;
-                p[2] = col.blue / 65535 * 255;
+                p[0] = rgba.red * 255;
+                p[1] = rgba.green * 255;
+                p[2] = rgba.blue * 255;
                 p += 3;
         }
 
@@ -45,16 +58,17 @@ create_color_pixbuf (const char *color)
 }
 
 static GtkWidget *
-create_combo_box_grid_demo ()
+create_combo_box_grid_demo (void)
 {
         GtkWidget *combo;
         GtkTreeIter iter;
+        GdkPixbuf *pixbuf;
         GtkCellRenderer *cell = gtk_cell_renderer_pixbuf_new ();
         GtkListStore *store;
 
         store = gtk_list_store_new (1, GDK_TYPE_PIXBUF);
 
-        combo = gtk_combo_box_new (GTK_TREE_MODEL (store));
+        combo = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));
         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo),
                                     cell, TRUE);
         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo),
@@ -63,52 +77,72 @@ create_combo_box_grid_demo ()
                                       3);
 
         /* first row */
+        pixbuf = create_color_pixbuf ("red");
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
-                            0, create_color_pixbuf ("red"),
+                            0, pixbuf,
                             -1);
+        g_object_unref (pixbuf);
 
+        pixbuf = create_color_pixbuf ("green");
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
-                            0, create_color_pixbuf ("green"),
+                            0, pixbuf,
                             -1);
+        g_object_unref (pixbuf);
 
+        pixbuf = create_color_pixbuf ("blue");
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
-                            0, create_color_pixbuf ("blue"),
+                            0, pixbuf,
                             -1);
+        g_object_unref (pixbuf);
 
         /* second row */
+        pixbuf = create_color_pixbuf ("yellow");
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
-                            0, create_color_pixbuf ("yellow"),
+                            0, pixbuf,
                             -1);
+        g_object_unref (pixbuf);
 
+        pixbuf = create_color_pixbuf ("black");
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
-                            0, create_color_pixbuf ("black"),
+                            0, pixbuf,
                             -1);
+        g_object_unref (pixbuf);
 
+        pixbuf = create_color_pixbuf ("white");
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
-                            0, create_color_pixbuf ("white"),
+                            0, pixbuf,
                             -1);
+        g_object_unref (pixbuf);
 
         /* third row */
+        pixbuf = create_color_pixbuf ("gray");
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
-                            0, create_color_pixbuf ("gray"),
+                            0, pixbuf,
                             -1);
+        g_object_unref (pixbuf);
 
+        pixbuf = create_color_pixbuf ("snow");
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
-                            0, create_color_pixbuf ("snow"),
+                            0, pixbuf,
                             -1);
+        g_object_unref (pixbuf);
 
+        pixbuf = create_color_pixbuf ("magenta");
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
-                            0, create_color_pixbuf ("magenta"),
+                            0, pixbuf,
                             -1);
+        g_object_unref (pixbuf);
+
+        g_object_unref (store);
 
         gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
 
@@ -117,7 +151,78 @@ create_combo_box_grid_demo ()
 
 /* blaat */
 static GtkTreeModel *
-create_blaat ()
+create_tree_blaat (void)
+{
+        GdkPixbuf *pixbuf;
+        GtkWidget *cellview;
+        GtkTreeIter iter, iter2;
+        GtkTreeStore *store;
+
+        cellview = gtk_cell_view_new ();
+
+       store = gtk_tree_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN);
+
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_DIALOG_WARNING,
+                                                GTK_ICON_SIZE_BUTTON);
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter,
+                            0, pixbuf,
+                            1, "gtk-stock-dialog-warning",
+                           2, FALSE,
+                            -1);
+
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_STOP,
+                                                GTK_ICON_SIZE_BUTTON);
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, pixbuf,
+                            1, "gtk-stock-stop",
+                           2, FALSE,
+                            -1);
+
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_NEW,
+                                                GTK_ICON_SIZE_BUTTON);
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, pixbuf,
+                            1, "gtk-stock-new",
+                           2, FALSE,
+                            -1);
+
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_CLEAR,
+                                                GTK_ICON_SIZE_BUTTON);
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter,
+                            0, pixbuf,
+                            1, "gtk-stock-clear",
+                           2, FALSE,
+                            -1);
+
+#if 0
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter,
+                            0, NULL,
+                            1, "separator",
+                           2, TRUE,
+                            -1);
+#endif
+
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_OPEN,
+                                                GTK_ICON_SIZE_BUTTON);
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter,
+                            0, pixbuf,
+                            1, "gtk-stock-open",
+                           2, FALSE,
+                            -1);
+
+        gtk_widget_destroy (cellview);
+
+        return GTK_TREE_MODEL (store);
+}
+
+static GtkTreeModel *
+create_empty_list_blaat (void)
 {
         GdkPixbuf *pixbuf;
         GtkWidget *cellview;
@@ -128,72 +233,852 @@ create_blaat ()
 
         store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
 
-        pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_DIALOG_WARNING,
-                                         GTK_ICON_SIZE_BUTTON, NULL);
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_DIALOG_WARNING,
+                                                GTK_ICON_SIZE_BUTTON);
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
                             0, pixbuf,
                             1, "gtk-stock-dialog-warning",
                             -1);
 
-        pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_STOP,
-                                         GTK_ICON_SIZE_BUTTON, NULL);
+        gtk_widget_destroy (cellview);
+
+        return GTK_TREE_MODEL (store);
+}
+
+static void
+populate_list_blaat (gpointer data)
+{
+  GtkComboBox *combo_box = GTK_COMBO_BOX (data);
+  GtkListStore *store;
+  GdkPixbuf *pixbuf;
+  GtkWidget *cellview;
+  GtkTreeIter iter;
+  
+  store = GTK_LIST_STORE (gtk_combo_box_get_model (combo_box));
+
+  gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter);
+
+  if (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter))
+    return;
+
+  cellview = gtk_cell_view_new ();
+  
+  pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_STOP,
+                                         GTK_ICON_SIZE_BUTTON);
+  gtk_list_store_append (store, &iter);                               
+  gtk_list_store_set (store, &iter,
+                     0, pixbuf,
+                     1, "gtk-stock-stop",
+                     -1);
+  
+  pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_NEW,
+                                         GTK_ICON_SIZE_BUTTON);
+  gtk_list_store_append (store, &iter);                               
+  gtk_list_store_set (store, &iter,
+                     0, pixbuf,
+                     1, "gtk-stock-new",
+                     -1);
+  
+  pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_CLEAR,
+                                         GTK_ICON_SIZE_BUTTON);
+  gtk_list_store_append (store, &iter);
+  gtk_list_store_set (store, &iter,
+                     0, pixbuf,
+                     1, "gtk-stock-clear",
+                     -1);
+  
+  gtk_list_store_append (store, &iter);
+  gtk_list_store_set (store, &iter,
+                     0, NULL,
+                     1, "separator",
+                     -1);
+  
+  pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_OPEN,
+                                         GTK_ICON_SIZE_BUTTON);
+  gtk_list_store_append (store, &iter);
+  gtk_list_store_set (store, &iter,
+                     0, pixbuf,
+                     1, "gtk-stock-open",
+                     -1);
+  
+  gtk_widget_destroy (cellview);  
+}
+
+static GtkTreeModel *
+create_list_blaat (void)
+{
+        GdkPixbuf *pixbuf;
+        GtkWidget *cellview;
+        GtkTreeIter iter;
+        GtkListStore *store;
+
+        cellview = gtk_cell_view_new ();
+
+        store = gtk_list_store_new (2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
+
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_DIALOG_WARNING,
+                                                GTK_ICON_SIZE_BUTTON);
         gtk_list_store_append (store, &iter);
+        gtk_list_store_set (store, &iter,
+                            0, pixbuf,
+                            1, "gtk-stock-dialog-warning",
+                            -1);
+
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_STOP,
+                                                GTK_ICON_SIZE_BUTTON);
+        gtk_list_store_append (store, &iter);                         
         gtk_list_store_set (store, &iter,
                             0, pixbuf,
                             1, "gtk-stock-stop",
                             -1);
 
-        pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_NEW,
-                                         GTK_ICON_SIZE_BUTTON, NULL);
-        gtk_list_store_append (store, &iter);
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_NEW,
+                                                GTK_ICON_SIZE_BUTTON);
+        gtk_list_store_append (store, &iter);                         
         gtk_list_store_set (store, &iter,
                             0, pixbuf,
                             1, "gtk-stock-new",
                             -1);
 
-        pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_CLEAR,
-                                         GTK_ICON_SIZE_BUTTON, NULL);
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_CLEAR,
+                                                GTK_ICON_SIZE_BUTTON);
         gtk_list_store_append (store, &iter);
         gtk_list_store_set (store, &iter,
                             0, pixbuf,
                             1, "gtk-stock-clear",
                             -1);
 
+        gtk_list_store_append (store, &iter);
+        gtk_list_store_set (store, &iter,
+                            0, NULL,
+                            1, "separator",
+                            -1);
+
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_OPEN,
+                                                GTK_ICON_SIZE_BUTTON);
+        gtk_list_store_append (store, &iter);
+        gtk_list_store_set (store, &iter,
+                            0, pixbuf,
+                            1, "gtk-stock-open",
+                            -1);
+
         gtk_widget_destroy (cellview);
 
         return GTK_TREE_MODEL (store);
 }
 
+
 static GtkTreeModel *
-create_text_store ()
+create_list_long (void)
 {
         GtkTreeIter iter;
         GtkListStore *store;
 
-        store = GTK_LIST_STORE (gtk_list_store_new (1, G_TYPE_STRING));
+        store = gtk_list_store_new (1, G_TYPE_STRING);
 
         gtk_list_store_append (store, &iter);
-        gtk_list_store_set (store, &iter, 0, "dum de dum", -1);
+        gtk_list_store_set (store, &iter,
+                            0, "here is some long long text that grows out of the combo's allocation",
+                            -1);
 
-        gtk_list_store_append (store, &iter);
-        gtk_list_store_set (store, &iter, 0, "la la la", -1);
 
         gtk_list_store_append (store, &iter);
-        gtk_list_store_set (store, &iter, 0, "la la la dum de dum la la la la la la boom de da la la", -1);
+        gtk_list_store_set (store, &iter,
+                            0, "with at least a few of these rows",
+                            -1);
 
         gtk_list_store_append (store, &iter);
-        gtk_list_store_set (store, &iter, 0, "bloop", -1);
+        gtk_list_store_set (store, &iter,
+                            0, "so that we can get some ellipsized text here",
+                            -1);
 
         gtk_list_store_append (store, &iter);
-        gtk_list_store_set (store, &iter, 0, "bleep", -1);
+        gtk_list_store_set (store, &iter,
+                            0, "and see the combo box menu being allocated without any constraints",
+                            -1);
+
+        return GTK_TREE_MODEL (store);
+}
 
+static GtkTreeModel *
+create_food_list (void)
+{
+        GtkTreeIter iter;
+        GtkListStore *store;
+
+        store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
         gtk_list_store_append (store, &iter);
-        gtk_list_store_set (store, &iter, 0, "klaas", -1);
+        gtk_list_store_set (store, &iter,
+                            0, "Pepperoni",
+                            1, "Pizza",
+                            -1);
+
+        gtk_list_store_append (store, &iter);                         
+        gtk_list_store_set (store, &iter,
+                            0, "Cheese",
+                            1, "Burger",
+                            -1);
+
+        gtk_list_store_append (store, &iter);                         
+        gtk_list_store_set (store, &iter,
+                            0, "Pineapple",
+                            1, "Milkshake",
+                            -1);
+
+        gtk_list_store_append (store, &iter);                         
+        gtk_list_store_set (store, &iter,
+                            0, "Orange",
+                            1, "Soda",
+                            -1);
+
+        gtk_list_store_append (store, &iter);                         
+        gtk_list_store_set (store, &iter,
+                            0, "Club",
+                            1, "Sandwich",
+                            -1);
 
         return GTK_TREE_MODEL (store);
 }
 
+
+/* blaat */
+static GtkTreeModel *
+create_phylogenetic_tree (void)
+{
+        GtkTreeIter iter, iter2, iter3;
+        GtkTreeStore *store;
+
+       store = gtk_tree_store_new (1,G_TYPE_STRING);
+
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter,
+                            0, "Eubacteria",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Aquifecales",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Thermotogales",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Thermodesulfobacterium",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Thermus-Deinococcus group",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Chloroflecales",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Cyanobacteria",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Firmicutes",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Leptospirillium Group",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Synergistes",
+                            -1);
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Chlorobium-Flavobacteria group",
+                            -1);
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Chlamydia-Verrucomicrobia group",
+                            -1);
+
+        gtk_tree_store_append (store, &iter3, &iter2);                        
+        gtk_tree_store_set (store, &iter3,
+                            0, "Verrucomicrobia",
+                            -1);
+        gtk_tree_store_append (store, &iter3, &iter2);                        
+        gtk_tree_store_set (store, &iter3,
+                            0, "Chlamydia",
+                            -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Flexistipes",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Fibrobacter group",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "spirocheteus",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Proteobacteria",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter3, &iter2);                        
+        gtk_tree_store_set (store, &iter3,
+                            0, "alpha",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter3, &iter2);                        
+        gtk_tree_store_set (store, &iter3,
+                            0, "beta",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter3, &iter2);                        
+        gtk_tree_store_set (store, &iter3,
+                            0, "delta ",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter3, &iter2);                        
+        gtk_tree_store_set (store, &iter3,
+                            0, "epsilon",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter3, &iter2);  
+        gtk_tree_store_set (store, &iter3,
+                            0, "gamma ",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter, NULL);                           
+        gtk_tree_store_set (store, &iter,
+                            0, "Eukaryotes",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Metazoa",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Bilateria",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Myxozoa",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Cnidaria",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Ctenophora",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Placozoa",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Porifera",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "choanoflagellates",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Fungi",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Microsporidia",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Aleveolates",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Stramenopiles",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Rhodophyta",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Viridaeplantae",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "crytomonads et al",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter, NULL);                           
+        gtk_tree_store_set (store, &iter,
+                            0, "Archaea ",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Korarchaeota",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Crenarchaeota",
+                            -1);
+
+
+        gtk_tree_store_append (store, &iter2, &iter);                         
+        gtk_tree_store_set (store, &iter2,
+                            0, "Buryarchaeota",
+                            -1);
+
+        return GTK_TREE_MODEL (store);
+}
+
+
+/* blaat */
+static GtkTreeModel *
+create_capital_tree (void)
+{
+        GtkTreeIter iter, iter2;
+        GtkTreeStore *store;
+
+       store = gtk_tree_store_new (1, G_TYPE_STRING);
+
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter, 0, "A - B", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Albany", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Annapolis", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Atlanta", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Augusta", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Austin", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Baton Rouge", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Bismarck", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Boise", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Boston", -1);
+
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter, 0, "C - D", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Carson City", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Charleston", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Cheyenne", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Columbia", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Columbus", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Concord", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Denver", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Des Moines", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Dover", -1);
+
+
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter, 0, "E - J", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Frankfort", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Harrisburg", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Hartford", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Helena", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Honolulu", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Indianapolis", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Jackson", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Jefferson City", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Juneau", -1);
+
+
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter, 0, "K - O", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Lansing", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Lincoln", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Little Rock", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Madison", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Montgomery", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Montpelier", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Nashville", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Oklahoma City", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Olympia", -1);
+
+
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter, 0, "P - S", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Phoenix", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Pierre", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Providence", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Raleigh", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Richmond", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Sacramento", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Salem", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Salt Lake City", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Santa Fe", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Springfield", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "St. Paul", -1);
+
+
+        gtk_tree_store_append (store, &iter, NULL);
+        gtk_tree_store_set (store, &iter, 0, "T - Z", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Tallahassee", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Topeka", -1);
+
+        gtk_tree_store_append (store, &iter2, &iter);
+        gtk_tree_store_set (store, &iter2, 0, "Trenton", -1);
+
+        return GTK_TREE_MODEL (store);
+}
+
+static void
+capital_sensitive (GtkCellLayout   *cell_layout,
+                  GtkCellRenderer *cell,
+                  GtkTreeModel    *tree_model,
+                  GtkTreeIter     *iter,
+                  gpointer         data)
+{
+  gboolean sensitive;
+
+  sensitive = !gtk_tree_model_iter_has_child (tree_model, iter);
+
+  g_object_set (cell, "sensitive", sensitive, NULL);
+}
+
+static gboolean
+capital_animation (gpointer data)
+{
+  static gint insert_count = 0;
+  GtkTreeModel *model = GTK_TREE_MODEL (data);
+  GtkTreePath *path;
+  GtkTreeIter iter, parent;
+
+  switch (insert_count % 8)
+    {
+    case 0:
+      gtk_tree_store_insert (GTK_TREE_STORE (model), &iter, NULL, 0);
+      gtk_tree_store_set (GTK_TREE_STORE (model), 
+                         &iter,
+                         0, "Europe", -1);
+      break;
+
+    case 1:
+      path = gtk_tree_path_new_from_indices (0, -1);
+      gtk_tree_model_get_iter (model, &parent, path);
+      gtk_tree_path_free (path);
+      gtk_tree_store_insert (GTK_TREE_STORE (model), &iter, &parent, 0);
+      gtk_tree_store_set (GTK_TREE_STORE (model), 
+                         &iter,
+                         0, "Berlin", -1);
+      break;
+
+    case 2:
+      path = gtk_tree_path_new_from_indices (0, -1);
+      gtk_tree_model_get_iter (model, &parent, path);
+      gtk_tree_path_free (path);
+      gtk_tree_store_insert (GTK_TREE_STORE (model), &iter, &parent, 1);
+      gtk_tree_store_set (GTK_TREE_STORE (model), 
+                         &iter,
+                         0, "London", -1);
+      break;
+
+    case 3:
+      path = gtk_tree_path_new_from_indices (0, -1);
+      gtk_tree_model_get_iter (model, &parent, path);
+      gtk_tree_path_free (path);
+      gtk_tree_store_insert (GTK_TREE_STORE (model), &iter, &parent, 2);
+      gtk_tree_store_set (GTK_TREE_STORE (model), 
+                         &iter,
+                         0, "Paris", -1);
+      break;
+
+    case 4:
+      path = gtk_tree_path_new_from_indices (0, 2, -1);
+      gtk_tree_model_get_iter (model, &iter, path);
+      gtk_tree_path_free (path);
+      gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
+      break;
+
+    case 5:
+      path = gtk_tree_path_new_from_indices (0, 1, -1);
+      gtk_tree_model_get_iter (model, &iter, path);
+      gtk_tree_path_free (path);
+      gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
+      break;
+
+    case 6:
+      path = gtk_tree_path_new_from_indices (0, 0, -1);
+      gtk_tree_model_get_iter (model, &iter, path);
+      gtk_tree_path_free (path);
+      gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
+      break;
+
+    case 7:
+      path = gtk_tree_path_new_from_indices (0, -1);
+      gtk_tree_model_get_iter (model, &iter, path);
+      gtk_tree_path_free (path);
+      gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
+      break;
+
+    default: ;
+
+    }
+  insert_count++;
+
+  return TRUE;
+}
+
+static void
+setup_combo_entry (GtkComboBoxText *combo)
+{
+  gtk_combo_box_text_append_text (combo,
+                                  "dum de dum");
+  gtk_combo_box_text_append_text (combo,
+                                  "la la la");
+  gtk_combo_box_text_append_text (combo,
+                                  "la la la dum de dum la la la la la la boom de da la la");
+  gtk_combo_box_text_append_text (combo,
+                                  "bloop");
+  gtk_combo_box_text_append_text (combo,
+                                  "bleep");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas0");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas1");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas2");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas3");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas4");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas5");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas6");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas7");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas8");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas9");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaasa");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaasb");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaasc");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaasd");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaase");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaasf");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas10");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas11");
+  gtk_combo_box_text_append_text (combo,
+                                  "klaas12");
+}
+
+static void
+set_sensitive (GtkCellLayout   *cell_layout,
+              GtkCellRenderer *cell,
+              GtkTreeModel    *tree_model,
+              GtkTreeIter     *iter,
+              gpointer         data)
+{
+  GtkTreePath *path;
+  gint *indices;
+  gboolean sensitive;
+
+  path = gtk_tree_model_get_path (tree_model, iter);
+  indices = gtk_tree_path_get_indices (path);
+  sensitive = indices[0] != 1;
+  gtk_tree_path_free (path);
+
+  g_object_set (cell, "sensitive", sensitive, NULL);
+}
+
+static gboolean
+is_separator (GtkTreeModel *model,
+             GtkTreeIter  *iter,
+             gpointer      data)
+{
+  GtkTreePath *path;
+  gboolean result;
+
+  path = gtk_tree_model_get_path (model, iter);
+  result = gtk_tree_path_get_indices (path)[0] == 4;
+  gtk_tree_path_free (path);
+
+  return result;
+  
+}
+
+static void
+displayed_row_changed (GtkComboBox *combo,
+                       GtkCellView *cell)
+{
+  gint row;
+  GtkTreePath *path;
+
+  row = gtk_combo_box_get_active (combo);
+  path = gtk_tree_path_new_from_indices (row, -1);
+  gtk_cell_view_set_displayed_row (cell, path);
+  gtk_tree_path_free (path);
+}
+
 int
 main (int argc, char **argv)
 {
@@ -202,65 +1087,120 @@ main (int argc, char **argv)
         GtkWidget *tmp, *boom;
         GtkCellRenderer *renderer;
         GdkPixbuf *pixbuf;
-        GValue value = {0, };
+        GtkTreeModel *model;
+       GtkTreePath *path;
+       GtkTreeIter iter;
+       GdkRGBA color;
+       GtkCellArea *area;
 
         gtk_init (&argc, &argv);
 
+       if (g_getenv ("RTL"))
+         gtk_widget_set_default_direction (GTK_TEXT_DIR_RTL);
+
+       if (g_getenv ("LISTMODE"))
+         {
+           GtkCssProvider *provider = gtk_css_provider_new ();
+
+           gtk_css_provider_load_from_data (provider,
+                                            "* { -GtkComboBox-appears-as-list: true; }", 
+                                            -1, NULL);
+
+           gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
+                                                      GTK_STYLE_PROVIDER (provider),
+                                                      GTK_STYLE_PROVIDER_PRIORITY_FALLBACK);
+
+         }
+
         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
         gtk_container_set_border_width (GTK_CONTAINER (window), 5);
-        g_signal_connect (window, "delete_event", gtk_main_quit, NULL);
+        g_signal_connect (window, "destroy", gtk_main_quit, NULL);
 
-        mainbox = gtk_vbox_new (FALSE, 2);
+        mainbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
         gtk_container_add (GTK_CONTAINER (window), mainbox);
 
-
         /* GtkCellView */
         tmp = gtk_frame_new ("GtkCellView");
         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
 
-        boom = gtk_vbox_new (FALSE, 0);
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
         gtk_container_add (GTK_CONTAINER (tmp), boom);
 
         cellview = gtk_cell_view_new ();
         renderer = gtk_cell_renderer_pixbuf_new ();
-        pixbuf = gtk_widget_render_icon (cellview, GTK_STOCK_DIALOG_WARNING,
-                                         GTK_ICON_SIZE_BUTTON, NULL);
+        pixbuf = gtk_widget_render_icon_pixbuf (cellview, GTK_STOCK_DIALOG_WARNING,
+                                                GTK_ICON_SIZE_BUTTON);
 
         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
                                     renderer,
                                     FALSE);
-        g_value_init (&value, GDK_TYPE_PIXBUF);
-        g_value_set_instance (&value, pixbuf);
-        gtk_cell_view_set_values (GTK_CELL_VIEW (cellview),
-                                  renderer,
-                                  "pixbuf", &value,
-                                  NULL);
-        g_value_unset (&value);
+        g_object_set (renderer, "pixbuf", pixbuf, NULL);
 
         renderer = gtk_cell_renderer_text_new ();
         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (cellview),
                                     renderer,
                                     TRUE);
-        g_value_init (&value, G_TYPE_STRING);
-        g_value_set_string (&value, "la la la");
-        gtk_cell_view_set_values (GTK_CELL_VIEW (cellview),
-                                  renderer,
-                                  "text", &value,
-                                  NULL);
-        g_value_unset (&value);
+        g_object_set (renderer, "text", "la la la", NULL);
         gtk_container_add (GTK_CONTAINER (boom), cellview);
 
+        /* GtkComboBox list */
+        tmp = gtk_frame_new ("GtkComboBox (list)");
+        gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
+
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+        gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
+        gtk_container_add (GTK_CONTAINER (tmp), boom);
+
+        model = create_list_blaat ();
+        combobox = gtk_combo_box_new_with_model (model);
+       gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
+        g_object_unref (model);
+        gtk_container_add (GTK_CONTAINER (boom), combobox);
 
-        /* GtkComboBox */
-        tmp = gtk_frame_new ("GtkComboBox");
+        renderer = gtk_cell_renderer_pixbuf_new ();
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
+                                    renderer,
+                                    FALSE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "pixbuf", 0,
+                                        NULL);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
+                                           renderer,
+                                           set_sensitive,
+                                           NULL, NULL);
+
+        renderer = gtk_cell_renderer_text_new ();
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
+                                    renderer,
+                                    TRUE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "text", 1,
+                                        NULL);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
+                                           renderer,
+                                           set_sensitive,
+                                           NULL, NULL);
+       gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), 
+                                             is_separator, NULL, NULL);
+                                               
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
+
+        /* GtkComboBox dynamic list */
+        tmp = gtk_frame_new ("GtkComboBox (dynamic list)");
         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
 
-        boom = gtk_vbox_new (FALSE, 0);
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
         gtk_container_add (GTK_CONTAINER (tmp), boom);
 
-        combobox = gtk_combo_box_new (create_blaat ());
+        model = create_empty_list_blaat ();
+        combobox = gtk_combo_box_new_with_model (model);
+       g_signal_connect (combobox, "notify::popup-shown", 
+                         G_CALLBACK (populate_list_blaat), combobox);
+
+       gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
+        g_object_unref (model);
         gtk_container_add (GTK_CONTAINER (boom), combobox);
 
         renderer = gtk_cell_renderer_pixbuf_new ();
@@ -270,6 +1210,10 @@ main (int argc, char **argv)
         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
                                         "pixbuf", 0,
                                         NULL);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
+                                           renderer,
+                                           set_sensitive,
+                                           NULL, NULL);
 
         renderer = gtk_cell_renderer_text_new ();
         gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
@@ -278,15 +1222,127 @@ main (int argc, char **argv)
         gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
                                         "text", 1,
                                         NULL);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
+                                           renderer,
+                                           set_sensitive,
+                                           NULL, NULL);
+       gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), 
+                                             is_separator, NULL, NULL);
+                                               
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
+       gtk_combo_box_set_title (GTK_COMBO_BOX (combobox), "Dynamic list");
+
+        /* GtkComboBox custom entry */
+        tmp = gtk_frame_new ("GtkComboBox (custom)");
+        gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
 
-        gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 1);
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+        gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
+        gtk_container_add (GTK_CONTAINER (tmp), boom);
 
+        model = create_list_blaat ();
+        combobox = gtk_combo_box_new_with_model (model);
+       gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
+        g_object_unref (model);
+        gtk_container_add (GTK_CONTAINER (boom), combobox);
+
+        renderer = gtk_cell_renderer_pixbuf_new ();
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
+                                    renderer,
+                                    FALSE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "pixbuf", 0,
+                                        NULL);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
+                                           renderer,
+                                           set_sensitive,
+                                           NULL, NULL);
+
+        renderer = gtk_cell_renderer_text_new ();
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
+                                    renderer,
+                                    TRUE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "text", 1,
+                                        NULL);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
+                                           renderer,
+                                           set_sensitive,
+                                           NULL, NULL);
+       gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), 
+                                             is_separator, NULL, NULL);
+                                               
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
+
+        tmp = gtk_cell_view_new ();
+        gtk_widget_show (tmp);
+        gtk_cell_view_set_model (GTK_CELL_VIEW (tmp), model);
+
+        renderer = gtk_cell_renderer_text_new ();
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (tmp), renderer, TRUE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (tmp), renderer,
+                                        "text", 1,
+                                        NULL);
+        color.red = 1.0;
+        color.blue = 1.0;
+        color.green = 0;
+        color.alpha = 1.0;
+        gtk_cell_view_set_background_rgba (GTK_CELL_VIEW (tmp), &color);
+        displayed_row_changed (GTK_COMBO_BOX (combobox), GTK_CELL_VIEW (tmp));
+        g_signal_connect (combobox, "changed", G_CALLBACK (displayed_row_changed), tmp); 
+           
+        gtk_container_add (GTK_CONTAINER (combobox), tmp);
+
+        /* GtkComboBox tree */
+        tmp = gtk_frame_new ("GtkComboBox (tree)");
+        gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
+
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+        gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
+        gtk_container_add (GTK_CONTAINER (tmp), boom);
+
+        model = create_tree_blaat ();
+        combobox = gtk_combo_box_new_with_model (model);
+       gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
+        g_object_unref (model);
+        gtk_container_add (GTK_CONTAINER (boom), combobox);
+
+        renderer = gtk_cell_renderer_pixbuf_new ();
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
+                                    renderer,
+                                    FALSE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "pixbuf", 0,
+                                        NULL);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
+                                           renderer,
+                                           set_sensitive,
+                                           NULL, NULL);
+
+        renderer = gtk_cell_renderer_text_new ();
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
+                                    renderer,
+                                    TRUE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "text", 1,
+                                        NULL);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
+                                           renderer,
+                                           set_sensitive,
+                                           NULL, NULL);
+       gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox), 
+                                             is_separator, NULL, NULL);
+                                               
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
+#if 0
+       g_timeout_add (1000, (GSourceFunc) animation_timer, model);
+#endif
 
         /* GtkComboBox (grid mode) */
         tmp = gtk_frame_new ("GtkComboBox (grid mode)");
         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
 
-        boom = gtk_vbox_new (FALSE, 0);
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
         gtk_container_add (GTK_CONTAINER (tmp), boom);
 
@@ -295,17 +1351,131 @@ main (int argc, char **argv)
 
 
         /* GtkComboBoxEntry */
-        tmp = gtk_frame_new ("GtkComboBoxEntry");
+        tmp = gtk_frame_new ("GtkComboBox with entry");
         gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
 
-        boom = gtk_vbox_new (FALSE, 0);
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
         gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
         gtk_container_add (GTK_CONTAINER (tmp), boom);
 
-        comboboxtext = gtk_combo_box_entry_new (create_text_store (), 0);
+        comboboxtext = gtk_combo_box_text_new_with_entry ();
+        setup_combo_entry (GTK_COMBO_BOX_TEXT (comboboxtext));
         gtk_container_add (GTK_CONTAINER (boom), comboboxtext);
 
-        /* done */
+
+        /* Phylogenetic tree */
+        tmp = gtk_frame_new ("What are you ?");
+        gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
+
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+        gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
+        gtk_container_add (GTK_CONTAINER (tmp), boom);
+
+        model = create_phylogenetic_tree ();
+        combobox = gtk_combo_box_new_with_model (model);
+       gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
+        g_object_unref (model);
+        gtk_container_add (GTK_CONTAINER (boom), combobox);
+
+        renderer = gtk_cell_renderer_text_new ();
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
+                                    renderer,
+                                    TRUE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "text", 0,
+                                        NULL);
+       
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
+
+        /* Capitals */
+        tmp = gtk_frame_new ("Where are you ?");
+        gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
+
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+        gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
+        gtk_container_add (GTK_CONTAINER (tmp), boom);
+
+        model = create_capital_tree ();
+       combobox = gtk_combo_box_new_with_model (model);
+       gtk_combo_box_set_add_tearoffs (GTK_COMBO_BOX (combobox), TRUE);
+        g_object_unref (model);
+        gtk_container_add (GTK_CONTAINER (boom), combobox);
+        renderer = gtk_cell_renderer_text_new ();
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox),
+                                    renderer,
+                                    TRUE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "text", 0,
+                                        NULL);
+       gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox),
+                                           renderer,
+                                           capital_sensitive,
+                                           NULL, NULL);
+       path = gtk_tree_path_new_from_indices (0, 8, -1);
+       gtk_tree_model_get_iter (model, &iter, path);
+       gtk_tree_path_free (path);
+        gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combobox), &iter);
+
+#if 1
+       gdk_threads_add_timeout (1000, (GSourceFunc) capital_animation, model);
+#endif
+
+        /* Aligned Food */
+        tmp = gtk_frame_new ("Hungry ?");
+        gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
+
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+        gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
+        gtk_container_add (GTK_CONTAINER (tmp), boom);
+
+        model = create_food_list ();
+       combobox = gtk_combo_box_new_with_model (model);
+        g_object_unref (model);
+        gtk_container_add (GTK_CONTAINER (boom), combobox);
+
+       area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (combobox));
+
+        renderer = gtk_cell_renderer_text_new ();
+       gtk_cell_area_add_with_properties (area, renderer, 
+                                          "align", TRUE, 
+                                          "expand", TRUE, 
+                                          NULL);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "text", 0,
+                                        NULL);
+
+        renderer = gtk_cell_renderer_text_new ();
+       gtk_cell_area_add_with_properties (area, renderer, 
+                                          "align", TRUE, 
+                                          "expand", TRUE, 
+                                          NULL);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "text", 1,
+                                        NULL);
+
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
+
+       /* Ellipsizing growing combos */
+        tmp = gtk_frame_new ("Unconstrained Menu");
+        gtk_box_pack_start (GTK_BOX (mainbox), tmp, FALSE, FALSE, 0);
+
+        boom = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+        gtk_container_set_border_width (GTK_CONTAINER (boom), 5);
+        gtk_container_add (GTK_CONTAINER (tmp), boom);
+
+       model = create_list_long ();
+       combobox = gtk_combo_box_new_with_model (model);
+        g_object_unref (model);
+        gtk_container_add (GTK_CONTAINER (boom), combobox);
+        renderer = gtk_cell_renderer_text_new ();
+       g_object_set (G_OBJECT (renderer), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+
+        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combobox), renderer, TRUE);
+        gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combobox), renderer,
+                                        "text", 0, NULL);
+        gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
+       gtk_combo_box_set_popup_fixed_width (GTK_COMBO_BOX (combobox), FALSE);
+
         gtk_widget_show_all (window);
 
         gtk_main ();