]> Pileus Git - ~andy/gtk/commitdiff
Use GtkTreeViewRowSeparatorFunc instead of GtkCellRendererSepText.
authorMatthias Clasen <maclas@gmx.de>
Sat, 7 Aug 2004 22:21:25 +0000 (22:21 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Sat, 7 Aug 2004 22:21:25 +0000 (22:21 +0000)
Sat Aug  7 18:19:03 2004  Matthias Clasen  <maclas@gmx.de>

* gtk/gtkfilechooserdefault.c (save_folder_combo_create):
(shortcuts_list_create): Use GtkTreeViewRowSeparatorFunc
instead of GtkCellRendererSepText.  (#147864)

* gtk/gtkcellrendererseptext.[hc]: Removed.

* gtk/Makefile.am: Remove gtkcellrendererseptext.[hc]

Sat Aug  7 18:15:15 2004  Matthias Clasen  <maclas@gmx.de>

* gtk/gtkcombobox.c (gtk_combo_box_menu_row_deleted):
(gtk_combo_box_menu_row_inserted):
(gtk_combo_box_menu_row_changed): Correctly handle
insertion and deletion of separators in menu mode.

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/Makefile.am
gtk/gtkcellrendererseptext.c [deleted file]
gtk/gtkcellrendererseptext.h [deleted file]
gtk/gtkcombobox.c
gtk/gtkfilechooserdefault.c

index 568009ee422f806f1d440b9702b5502e7e837d51..729529f3f92ff9d30482b481848f6c29a0d53bae 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+Sat Aug  7 18:19:03 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkfilechooserdefault.c (save_folder_combo_create): 
+       (shortcuts_list_create): Use GtkTreeViewRowSeparatorFunc 
+       instead of GtkCellRendererSepText.  (#147864)
+
+       * gtk/gtkcellrendererseptext.[hc]: Removed.
+
+       * gtk/Makefile.am: Remove gtkcellrendererseptext.[hc]
+       
+Sat Aug  7 18:15:15 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkcombobox.c (gtk_combo_box_menu_row_deleted): 
+       (gtk_combo_box_menu_row_inserted): 
+       (gtk_combo_box_menu_row_changed): Correctly handle
+       insertion and deletion of separators in menu mode.
+
 2004-08-07  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/win32/gdkevents-win32.c (handle_configure_event,
index 568009ee422f806f1d440b9702b5502e7e837d51..729529f3f92ff9d30482b481848f6c29a0d53bae 100644 (file)
@@ -1,3 +1,20 @@
+Sat Aug  7 18:19:03 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkfilechooserdefault.c (save_folder_combo_create): 
+       (shortcuts_list_create): Use GtkTreeViewRowSeparatorFunc 
+       instead of GtkCellRendererSepText.  (#147864)
+
+       * gtk/gtkcellrendererseptext.[hc]: Removed.
+
+       * gtk/Makefile.am: Remove gtkcellrendererseptext.[hc]
+       
+Sat Aug  7 18:15:15 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkcombobox.c (gtk_combo_box_menu_row_deleted): 
+       (gtk_combo_box_menu_row_inserted): 
+       (gtk_combo_box_menu_row_changed): Correctly handle
+       insertion and deletion of separators in menu mode.
+
 2004-08-07  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/win32/gdkevents-win32.c (handle_configure_event,
index 568009ee422f806f1d440b9702b5502e7e837d51..729529f3f92ff9d30482b481848f6c29a0d53bae 100644 (file)
@@ -1,3 +1,20 @@
+Sat Aug  7 18:19:03 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkfilechooserdefault.c (save_folder_combo_create): 
+       (shortcuts_list_create): Use GtkTreeViewRowSeparatorFunc 
+       instead of GtkCellRendererSepText.  (#147864)
+
+       * gtk/gtkcellrendererseptext.[hc]: Removed.
+
+       * gtk/Makefile.am: Remove gtkcellrendererseptext.[hc]
+       
+Sat Aug  7 18:15:15 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkcombobox.c (gtk_combo_box_menu_row_deleted): 
+       (gtk_combo_box_menu_row_inserted): 
+       (gtk_combo_box_menu_row_changed): Correctly handle
+       insertion and deletion of separators in menu mode.
+
 2004-08-07  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/win32/gdkevents-win32.c (handle_configure_event,
index 568009ee422f806f1d440b9702b5502e7e837d51..729529f3f92ff9d30482b481848f6c29a0d53bae 100644 (file)
@@ -1,3 +1,20 @@
+Sat Aug  7 18:19:03 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkfilechooserdefault.c (save_folder_combo_create): 
+       (shortcuts_list_create): Use GtkTreeViewRowSeparatorFunc 
+       instead of GtkCellRendererSepText.  (#147864)
+
+       * gtk/gtkcellrendererseptext.[hc]: Removed.
+
+       * gtk/Makefile.am: Remove gtkcellrendererseptext.[hc]
+       
+Sat Aug  7 18:15:15 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkcombobox.c (gtk_combo_box_menu_row_deleted): 
+       (gtk_combo_box_menu_row_inserted): 
+       (gtk_combo_box_menu_row_changed): Correctly handle
+       insertion and deletion of separators in menu mode.
+
 2004-08-07  Tor Lillqvist  <tml@iki.fi>
 
        * gdk/win32/gdkevents-win32.c (handle_configure_event,
index 914356076a2c7b4874eaaf74ef6a649a71ece94f..599bb52766c18e0cda697c9a9fbe7d6863c16c08 100644 (file)
@@ -276,7 +276,6 @@ gtk_semi_private_h_sources =    \
 
 # GTK+ header files that don't get installed
 gtk_private_h_sources =         \
-       gtkcellrendererseptext.h\
        gtkentryprivate.h       \
        gtkfilechooserembed.h   \
        gtkfilechooserentry.h   \
@@ -327,7 +326,6 @@ gtk_c_sources =                 \
        gtkcellrenderercombo.c  \
        gtkcellrendererpixbuf.c \
        gtkcellrendererprogress.c \
-       gtkcellrendererseptext.c\
        gtkcellrenderertext.c   \
        gtkcellrenderertoggle.c \
        gtkcellview.c           \
diff --git a/gtk/gtkcellrendererseptext.c b/gtk/gtkcellrendererseptext.c
deleted file mode 100644 (file)
index f76a15b..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/* GTK - The GIMP Toolkit
- * gtkcellrendererseptext.h: Cell renderer for text or a separator
- * Copyright (C) 2003, Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#include <config.h>
-#include "gtkcellrendererseptext.h"
-
-static void gtk_cell_renderer_sep_get_size (GtkCellRenderer *cell,
-                                            GtkWidget       *widget,
-                                            GdkRectangle    *cell_area,
-                                            gint            *x_offset,
-                                            gint            *y_offset,
-                                            gint            *width,
-                                            gint            *height);
-
-static void gtk_cell_renderer_sep_text_render (GtkCellRenderer      *cell,
-                                              GdkWindow            *window,
-                                              GtkWidget            *widget,
-                                              GdkRectangle         *background_area,
-                                              GdkRectangle         *cell_area,
-                                              GdkRectangle         *expose_area,
-                                              GtkCellRendererState  flags);
-
-static GtkCellRendererTextClass *parent_class;
-
-static void
-gtk_cell_renderer_sep_text_class_init (GtkCellRendererSepTextClass *class)
-{
-  GtkCellRendererClass *cell_renderer_class;
-
-  cell_renderer_class = GTK_CELL_RENDERER_CLASS (class);
-
-  parent_class = g_type_class_peek_parent (class);
-
-  cell_renderer_class->get_size = gtk_cell_renderer_sep_get_size;
-  cell_renderer_class->render = gtk_cell_renderer_sep_text_render;
-}
-
-GType
-_gtk_cell_renderer_sep_text_get_type (void)
-{
-  static GType cell_type = 0;
-
-  if (!cell_type)
-    {
-      static const GTypeInfo cell_info =
-      {
-        sizeof (GtkCellRendererSepTextClass),
-       NULL,           /* base_init */
-       NULL,           /* base_finalize */
-        (GClassInitFunc) gtk_cell_renderer_sep_text_class_init,
-       NULL,           /* class_finalize */
-       NULL,           /* class_data */
-        sizeof (GtkCellRendererSepText),
-       0,              /* n_preallocs */
-        NULL,          /* instance_init */
-       NULL,           /* value_table */
-      };
-
-      cell_type = g_type_register_static (GTK_TYPE_CELL_RENDERER_TEXT, "GtkCellRendererSepText",
-                                         &cell_info, 0);
-    }
-
-  return cell_type;
-}
-
-static void
-gtk_cell_renderer_sep_get_size (GtkCellRenderer *cell,
-                               GtkWidget       *widget,
-                               GdkRectangle    *cell_area,
-                               gint            *x_offset,
-                               gint            *y_offset,
-                               gint            *width,
-                               gint            *height)
-{
-  GtkCellRendererSepText *st;
-  const char *text;
-
-  st = GTK_CELL_RENDERER_SEP_TEXT (cell);
-
-  text = st->renderer_text.text;
-
-  if (!text)
-    {
-      if (width)
-       *width = cell->xpad * 2 + 1;
-      
-      if (height)
-       *height = cell->ypad * 2 + 1;
-
-      if (x_offset) *x_offset = 0;
-      if (y_offset) *y_offset = 0;
-    }
-  else
-    {
-      GTK_CELL_RENDERER_CLASS (parent_class)->get_size (cell, widget, cell_area, x_offset, y_offset, width, height);
-    }
-}
-
-static void
-gtk_cell_renderer_sep_text_render (GtkCellRenderer      *cell,
-                                  GdkWindow            *window,
-                                  GtkWidget            *widget,
-                                  GdkRectangle         *background_area,
-                                  GdkRectangle         *cell_area,
-                                  GdkRectangle         *expose_area,
-                                  GtkCellRendererState  flags)
-{
-  GtkCellRendererSepText *st;
-  const char *text;
-
-  st = GTK_CELL_RENDERER_SEP_TEXT (cell);
-
-  text = st->renderer_text.text;
-
-  if (!text)
-    gtk_paint_hline (gtk_widget_get_style (widget),
-                    window,
-                    GTK_WIDGET_STATE (widget),
-                    expose_area,
-                    widget,
-                    NULL,
-                    cell_area->x,
-                    cell_area->x + cell_area->width,
-                    cell_area->y + cell_area->height / 2);
-  else
-    GTK_CELL_RENDERER_CLASS (parent_class)->render (cell, window, widget, background_area, cell_area, expose_area, flags);
-}
-
-GtkCellRenderer *
-_gtk_cell_renderer_sep_text_new (void)
-{
-  return g_object_new (GTK_TYPE_CELL_RENDERER_SEP_TEXT, NULL);
-}
diff --git a/gtk/gtkcellrendererseptext.h b/gtk/gtkcellrendererseptext.h
deleted file mode 100644 (file)
index b593968..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/* GTK - The GIMP Toolkit
- * gtkcellrendererseptext.h: Cell renderer for text or a separator
- * Copyright (C) 2003, Ximian, Inc.
- *
- * Author: Federico Mena-Quintero <federico@ximian.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-#ifndef __GTK_CELL_RENDERER_SEP_TEXT_H__
-#define __GTK_CELL_RENDERER_SEP_TEXT_H__
-
-#include <gtk/gtkcellrenderertext.h>
-
-G_BEGIN_DECLS
-
-#define GTK_TYPE_CELL_RENDERER_SEP_TEXT                   (_gtk_cell_renderer_sep_text_get_type ())
-#define GTK_CELL_RENDERER_SEP_TEXT(obj)                   (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_CELL_RENDERER_SEP_TEXT, GtkCellRendererSepText))
-#define GTK_CELL_RENDERER_SEP_TEXT_CLASS(klass)           (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_CELL_RENDERER_SEP_TEXT, GtkCellRendererSepTextClass))
-#define GTK_IS_CELL_RENDERER_SEP_TEXT(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_CELL_RENDERER_SEP_TEXT))
-#define GTK_IS_CELL_RENDERER_SEP_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CELL_RENDERER_SEP_TEXT))
-#define GTK_CELL_RENDERER_SEP_TEXT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CELL_RENDERER_SEP_TEXT, GtkCellRendererSepTextClass))
-
-typedef struct _GtkCellRendererSepText GtkCellRendererSepText;
-typedef struct _GtkCellRendererSepTextClass GtkCellRendererSepTextClass;
-
-struct _GtkCellRendererSepText
-{
-  GtkCellRendererText renderer_text;
-};
-
-struct _GtkCellRendererSepTextClass
-{
-  GtkCellRendererTextClass parent_class;
-};
-
-GType _gtk_cell_renderer_sep_text_get_type (void) G_GNUC_CONST;
-
-GtkCellRenderer *_gtk_cell_renderer_sep_text_new (void);
-
-G_END_DECLS
-
-#endif
index 01d79e86b5b9598e4853269a22b97d1087483f19..351f72eb6d858ba9734bf7132c6823ab24282354 100644 (file)
@@ -2361,7 +2361,13 @@ gtk_combo_box_menu_fill_level (GtkComboBox *combo_box,
        is_separator = FALSE;
       
       if (is_separator)
-       item = gtk_separator_menu_item_new ();
+       {
+         item = gtk_separator_menu_item_new ();
+         g_object_set_data_full (G_OBJECT (item),
+                                 "gtk-combo-box-item-path",
+                                 gtk_tree_model_get_path (model, &iter),
+                                 (GDestroyNotify)gtk_tree_path_free);
+       }
       else
        {
          item = gtk_cell_view_menu_item_new (combo_box, model, &iter);
@@ -2523,8 +2529,7 @@ static void
 gtk_combo_box_relayout (GtkComboBox *combo_box)
 {
   GList *list, *j;
-  GtkWidget *menu, *item;
-  gint row, col, width;
+  GtkWidget *menu;
 
   menu = combo_box->priv->popup_widget;
   
@@ -2726,7 +2731,11 @@ find_menu_by_path (GtkWidget   *menu,
   item = NULL;
   for (i = list; i; i = i->next)
     {
-      if (GTK_IS_CELL_VIEW (GTK_BIN (i->data)->child))
+      if (GTK_IS_SEPARATOR_MENU_ITEM (i->data))
+       {
+         mpath = gtk_tree_path_copy (g_object_get_data (G_OBJECT (i->data), "gtk-combo-box-item-path"));
+       }
+      else if (GTK_IS_CELL_VIEW (GTK_BIN (i->data)->child))
        {
          if (skip)
            {
@@ -2735,32 +2744,35 @@ find_menu_by_path (GtkWidget   *menu,
            }
 
          mpath = gtk_cell_view_get_displayed_row (GTK_CELL_VIEW (GTK_BIN (i->data)->child));
-         /* this case is necessary, since the row reference of
-          * the cell view may already be updated after a deletion
-          */
-         if (!mpath)
-           {
-             item = i->data;
-             break;
-           }
-         if (gtk_tree_path_compare (mpath, path) == 0)
+       }
+      else 
+       continue;
+
+      /* this case is necessary, since the row reference of
+       * the cell view may already be updated after a deletion
+       */
+      if (!mpath)
+       {
+         item = i->data;
+         break;
+       }
+      if (gtk_tree_path_compare (mpath, path) == 0)
+       {
+         gtk_tree_path_free (mpath);
+         item = i->data;
+         break;
+       }
+      if (gtk_tree_path_is_ancestor (mpath, path))
+       {
+         submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (i->data));
+         if (submenu != NULL)
            {
              gtk_tree_path_free (mpath);
-             item = i->data;
+             item = find_menu_by_path (submenu, path, TRUE);
              break;
            }
-         if (gtk_tree_path_is_ancestor (mpath, path))
-           {
-             submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (i->data));
-             if (submenu != NULL)
-               {
-                 gtk_tree_path_free (mpath);
-                 item = find_menu_by_path (submenu, path, TRUE);
-                 break;
-               }
-           }
-         gtk_tree_path_free (mpath);
        }
+      gtk_tree_path_free (mpath);
     }
   
   g_list_free (list);  
@@ -2808,6 +2820,7 @@ gtk_combo_box_menu_row_inserted (GtkTreeModel *model,
   GtkTreePath *ppath;
   GtkTreeIter piter;
   gint depth, pos;
+  gboolean is_separator;
 
   if (!combo_box->priv->popup_widget)
     return;
@@ -2854,13 +2867,30 @@ gtk_combo_box_menu_row_inserted (GtkTreeModel *model,
        pos += 1;
     }
   
-  item = gtk_cell_view_menu_item_new (combo_box, model, iter);
-  gtk_widget_show (item);
+  if (combo_box->priv->row_separator_func)
+    is_separator = (*combo_box->priv->row_separator_func) (model, iter,
+                                                          combo_box->priv->row_separator_data);
+  else
+    is_separator = FALSE;
 
-  g_signal_connect (item, "activate",
-                    G_CALLBACK (gtk_combo_box_menu_item_activate),
-                    combo_box);
+  if (is_separator)
+    {
+      item = gtk_separator_menu_item_new ();
+      g_object_set_data_full (G_OBJECT (item),
+                             "gtk-combo-box-item-path",
+                             gtk_tree_path_copy (path),
+                             (GDestroyNotify)gtk_tree_path_free);
+    }
+  else
+    {
+      item = gtk_cell_view_menu_item_new (combo_box, model, iter);
+      
+      g_signal_connect (item, "activate",
+                       G_CALLBACK (gtk_combo_box_menu_item_activate),
+                       combo_box);
+    }
 
+  gtk_widget_show (item);
   gtk_menu_shell_insert (GTK_MENU_SHELL (menu), item, pos);
 }
 
@@ -2902,16 +2932,28 @@ gtk_combo_box_menu_row_changed (GtkTreeModel *model,
   GtkComboBox *combo_box = GTK_COMBO_BOX (user_data);
   GtkWidget *item;
   gint width;
+  gboolean is_separator;
 
   if (!combo_box->priv->popup_widget)
     return;
 
-  if (combo_box->priv->wrap_width)
+  item = find_menu_by_path (combo_box->priv->popup_widget, path, FALSE);
+
+  if (combo_box->priv->row_separator_func)
+    is_separator = (*combo_box->priv->row_separator_func) (model, iter,
+                                                          combo_box->priv->row_separator_data);
+  else
+    is_separator = FALSE;
+
+  if (is_separator != GTK_IS_SEPARATOR_MENU_ITEM (item))
     {
-      item = find_menu_by_path (combo_box->priv->popup_widget, path, FALSE);
-      gtk_combo_box_relayout_item (combo_box, item, iter, NULL);
+      gtk_combo_box_menu_row_deleted (model, path, combo_box);
+      gtk_combo_box_menu_row_inserted (model, path, iter, combo_box);
     }
 
+  if (combo_box->priv->wrap_width)
+    gtk_combo_box_relayout_item (combo_box, item, iter, NULL);
+
   width = gtk_combo_box_calc_requested_width (combo_box, path);
 
   if (width > combo_box->priv->width)
index 7564d28784948c972a83b0b4b4fcccc523948970..f17362f3f9a5da8b1c908c59ef4960fe4346aeb0 100644 (file)
@@ -25,7 +25,7 @@
 #include "gtkbutton.h"
 #include "gtkcelllayout.h"
 #include "gtkcellrendererpixbuf.h"
-#include "gtkcellrendererseptext.h"
+#include "gtkcellrenderertext.h"
 #include "gtkcellrenderertext.h"
 #include "gtkcheckmenuitem.h"
 #include "gtkcombobox.h"
@@ -2546,6 +2546,24 @@ shortcuts_selection_changed_cb (GtkTreeSelection      *selection,
   bookmarks_check_remove_sensitivity (impl);
 }
 
+static gboolean
+shortcuts_row_separator_func (GtkTreeModel *model,
+                             GtkTreeIter  *iter,
+                             gpointer      data)
+{
+  gint column = GPOINTER_TO_INT (data);
+  gchar *text;
+
+  gtk_tree_model_get (model, iter, column, &text, -1);
+  
+  if (!text)
+    return TRUE;
+
+  g_free (text);
+
+  return FALSE;
+}
+
 /* Creates the widgets for the shortcuts and bookmarks tree */
 static GtkWidget *
 shortcuts_list_create (GtkFileChooserDefault *impl)
@@ -2630,12 +2648,17 @@ shortcuts_list_create (GtkFileChooserDefault *impl)
                                       "visible", SHORTCUTS_COL_PIXBUF_VISIBLE,
                                       NULL);
 
-  renderer = _gtk_cell_renderer_sep_text_new ();
+  renderer = gtk_cell_renderer_text_new ();
   gtk_tree_view_column_pack_start (column, renderer, TRUE);
   gtk_tree_view_column_set_attributes (column, renderer,
                                       "text", SHORTCUTS_COL_NAME,
                                       NULL);
 
+  gtk_tree_view_set_row_separator_func (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view),
+                                       shortcuts_row_separator_func,
+                                       GINT_TO_POINTER (SHORTCUTS_COL_NAME),
+                                       NULL);
+
   gtk_tree_view_append_column (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view), column);
 
   return swin;
@@ -3094,13 +3117,18 @@ save_folder_combo_create (GtkFileChooserDefault *impl)
                                  "sensitive", SHORTCUTS_COL_PIXBUF_VISIBLE,
                                  NULL);
 
-  cell = _gtk_cell_renderer_sep_text_new ();
+  cell = gtk_cell_renderer_text_new ();
   gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), cell, TRUE);
   gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo), cell,
                                  "text", SHORTCUTS_COL_NAME,
                                  "sensitive", SHORTCUTS_COL_PIXBUF_VISIBLE,
                                  NULL);
 
+  gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combo),
+                                       shortcuts_row_separator_func,
+                                       GINT_TO_POINTER (SHORTCUTS_COL_NAME),
+                                       NULL);
+
   g_signal_connect (combo, "changed",
                    G_CALLBACK (save_folder_combo_changed_cb), impl);