changeset 779:d67d2f626c33

More code and cleanups for listboxes/combobox and event handling... Fixed the ok and cancel buttons on the color chooser.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 20 Mar 2011 23:40:34 +0000
parents 99ce0ea1f271
children fda93b441c4d
files gtk3/dw.c
diffstat 1 files changed, 151 insertions(+), 165 deletions(-) [+]
line wrap: on
line diff
--- a/gtk3/dw.c	Sun Mar 20 18:27:59 2011 +0000
+++ b/gtk3/dw.c	Sun Mar 20 23:40:34 2011 +0000
@@ -142,8 +142,6 @@
 #define DEFAULT_SIZE_HEIGHT 6
 #define DEFAULT_TITLEBAR_HEIGHT 22
 
-static GdkVisual *_dw_cmap = NULL;
-
 /* Signal forwarder prototypes */
 static gint _button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
 static gint _button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
@@ -154,9 +152,8 @@
 static gint _configure_event(GtkWidget *widget, GdkEventConfigure *event, gpointer data);
 static gint _activate_event(GtkWidget *widget, gpointer data);
 static gint _container_select_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
-static gint _container_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
 static gint _item_select_event(GtkWidget *widget, GtkWidget *child, gpointer data);
-static gint _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data);
+static gint _expose_event(GtkWidget *widget, cairo_t *cr, gpointer data);
 static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data);
 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
 static gint _value_changed_event(GtkAdjustment *adjustment, gpointer user_data);
@@ -252,8 +249,7 @@
    { _activate_event,          "activate" },
    { _generic_event,           DW_SIGNAL_CLICKED },
    { _container_select_event,  DW_SIGNAL_ITEM_ENTER },
-   { _container_context_event, DW_SIGNAL_ITEM_CONTEXT },
-   { _tree_context_event,      "tree-context" },
+   { _tree_context_event,      DW_SIGNAL_ITEM_CONTEXT },
    { _item_select_event,       DW_SIGNAL_LIST_SELECT },
    { _tree_select_event,       DW_SIGNAL_ITEM_SELECT },
    { _set_focus_event,         DW_SIGNAL_SET_FOCUS },
@@ -336,9 +332,11 @@
 static void gtk_mdi_init(GtkMdi *mdi);
 
 static void gtk_mdi_realize(GtkWidget *widget);
+static void gtk_mdi_size_allocate(GtkWidget *widget, GtkAllocation *allocation);
+#if 0
 static void gtk_mdi_size_request(GtkWidget *widget, GtkRequisition *requisition);
-static void gtk_mdi_size_allocate(GtkWidget *widget, GtkAllocation *allocation);
 static gint gtk_mdi_expose(GtkWidget *widget, GdkEventExpose *event);
+#endif
 
 /* Callbacks */
 static gboolean move_child_callback(GtkWidget *widget, GdkEvent *event, gpointer data);
@@ -747,6 +745,7 @@
    gtk_style_set_background (gtk_widget_get_style(widget), gtk_widget_get_window(widget), GTK_STATE_NORMAL);
 }
 
+#if 0
 static void gtk_mdi_size_request (GtkWidget *widget, GtkRequisition *requisition)
 {
    GtkMdi *mdi;
@@ -770,6 +769,7 @@
       }
    }
 }
+#endif
 
 static void gtk_mdi_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
 {
@@ -852,9 +852,9 @@
    }
 }
 
+#if 0 /* TODO: Is this needed... propogate expose is no longer supported */
 static gint gtk_mdi_expose(GtkWidget *widget, GdkEventExpose *event)
 {
-#if 0 /* TODO: Is this needed... propogate expose is no longer supported */
    GtkMdiChild *child;
    GList *children;
    GtkMdi *mdi;
@@ -871,9 +871,9 @@
                               child->widget,
                               event);
    }
+   return FALSE;
+}
 #endif
-   return FALSE;
-}
 
 static void gtk_mdi_add(GtkContainer *container, GtkWidget *widget)
 {
@@ -1435,7 +1435,7 @@
    return retval;
 }
 
-static gint _expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
+static gint _expose_event(GtkWidget *widget, cairo_t *cr, gpointer data)
 {
    SignalHandler work = _get_signal_handler(widget, data);
    int retval = FALSE;
@@ -1446,10 +1446,9 @@
       DWExpose exp;
       int (*exposefunc)(HWND, DWExpose *, void *) = work.func;
 
-      exp.x = event->area.x;
-      exp.y = event->area.y;
-      exp.width = event->area.width;
-      exp.height = event->area.height;
+      exp.x = exp.y = 0;
+      exp.width = egtk_widget_get_allocated_width(widget);
+      exp.height = gtk_widget_get_allocated_height(widget);
       retval = exposefunc(work.window, &exp, work.data);
    }
    return retval;
@@ -1502,31 +1501,6 @@
    return retval;
 }
 
-static gint _container_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
-{
-   SignalHandler work = _get_signal_handler(widget, data);
-   int retval = FALSE;
-
-#if 0
-   if ( dbgfp != NULL ) _dw_log("%s %d: %s\n",__FILE__,__LINE__,__func__);
-   if(work.window)
-   {
-      if(event->button == 3)
-      {
-         int (*contextfunc)(HWND, char *, int, int, void *, void *) = work.func;
-         char *text;
-         int row, col;
-
-         gtk_clist_get_selection_info(GTK_CLIST(widget), event->x, event->y, &row, &col);
-
-         text = (char *)gtk_clist_get_row_data(GTK_CLIST(widget), row);
-         retval = contextfunc(work.window, text, event->x, event->y, work.data, NULL);
-      }
-   }
-#endif
-   return retval;
-}
-
 static gint _tree_context_event(GtkWidget *widget, GdkEventButton *event, gpointer data)
 {
    SignalHandler work = _get_signal_handler(widget, data);
@@ -3566,7 +3540,6 @@
    }
    g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_CONTAINER);
    g_object_set_data(G_OBJECT(tmp), "_dw_multi_sel", GINT_TO_POINTER(multi));
-   g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
    DW_MUTEX_UNLOCK;
    return tmp;
 }
@@ -3595,7 +3568,6 @@
    store = gtk_tree_store_new(4, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER, G_TYPE_POINTER);
    tree = _tree_setup(tmp, GTK_TREE_MODEL(store));
    g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_TREE);
-   g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
    col = gtk_tree_view_column_new();
 
    rend = gtk_cell_renderer_pixbuf_new();
@@ -3760,10 +3732,7 @@
    DW_MUTEX_LOCK;
    store = gtk_list_store_new(1, G_TYPE_STRING);
    tmp = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store));
-   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", 0, NULL);
-   gtk_combo_box_set_id_column(GTK_COMBO_BOX(tmp), 0);
+   gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(tmp), 0);
    gtk_widget_show(tmp);
    g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_COMBOBOX);
    g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
@@ -4077,7 +4046,6 @@
    store = gtk_list_store_new(1, G_TYPE_STRING);
    tree = _tree_setup(tmp, GTK_TREE_MODEL(store));
    g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_LISTBOX);
-   g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
    
    col = gtk_tree_view_column_new();
    rend = gtk_cell_renderer_text_new();
@@ -4212,7 +4180,7 @@
  */
 void dw_window_set_bitmap_from_data(HWND handle, unsigned long id, char *data, int len)
 {
-   GdkPixbuf *tmp;
+   GdkPixbuf *tmp = NULL;
    int _locked_by_me = FALSE;
    char *file;
    FILE *fp;
@@ -5909,7 +5877,7 @@
 int dw_container_get_column_type(HWND handle, int column)
 {
    char numbuf[10];
-   int flag, rc;
+   int flag, rc = 0;
 #if 0
    GtkWidget *clist;
    int _locked_by_me = FALSE;
@@ -6219,7 +6187,7 @@
  */
 unsigned long API dw_color_choose(unsigned long value)
 {
-   GtkWidget *colorw;
+   GtkWidget *colorw, *ok_button, *cancel_button;
    int _locked_by_me = FALSE;
    DWDialog *dwwait;
    GtkColorSelection *colorsel;
@@ -6245,11 +6213,9 @@
    dwwait = dw_dialog_new((void *)colorw);
 
    colorsel = (GtkColorSelection *)gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(colorw));
-#if 0 /* TODO */  
-   part = gtk_buildable_get_internal_child(GTK_BUILDABLE(colorsel, 
-   g_signal_connect(G_OBJECT(colorsel->ok_button), "clicked", G_CALLBACK(_gtk_color_ok), dwwait);
-   g_signal_connect(G_OBJECT(colorsel->cancel_button), "clicked", G_CALLBACK(_gtk_color_cancel), dwwait);
-#endif
+   g_object_get(G_OBJECT(colorw), "ok-button", &ok_button, "cancel-button", &cancel_button, NULL);
+   g_signal_connect(G_OBJECT(ok_button), "clicked", G_CALLBACK(_gtk_color_ok), dwwait);
+   g_signal_connect(G_OBJECT(cancel_button), "clicked", G_CALLBACK(_gtk_color_cancel), dwwait);
 
    gtk_color_selection_set_previous_color(colorsel,&color);
    gtk_color_selection_set_current_color(colorsel,&color);
@@ -8249,10 +8215,10 @@
       GtkTreeIter iter;
       
       /* Make sure it is the correct tree type */
-      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == _DW_TREE_TYPE_LISTBOX)
-         store = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
+      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_LISTBOX))
+         store = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
       else if(GTK_IS_COMBO_BOX(handle2))
-         store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
+         store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
       
       if(!store)
       {
@@ -8302,10 +8268,10 @@
       GtkTreeIter iter;
       
       /* Make sure it is the correct tree type */
-      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == _DW_TREE_TYPE_LISTBOX)
-         store = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
+      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_LISTBOX))
+         store = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
       else if(GTK_IS_COMBO_BOX(handle2))
-         store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
+         store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
       
       if(!store)
       {
@@ -8345,10 +8311,10 @@
    if(handle2)
    {
       /* Make sure it is the correct tree type */
-      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == _DW_TREE_TYPE_LISTBOX)
-         store = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
+      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_LISTBOX))
+         store = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
       else if(GTK_IS_COMBO_BOX(handle2))
-         store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
+         store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
       
       if(!store)
       {
@@ -8384,10 +8350,10 @@
    if(handle2)
    {
       /* Make sure it is the correct tree type */
-      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == _DW_TREE_TYPE_LISTBOX)
-         store = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
+      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_LISTBOX))
+         store = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
       else if(GTK_IS_COMBO_BOX(handle2))
-         store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
+         store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
       
       if(store)
       {
@@ -8462,26 +8428,28 @@
    if(handle2)
    {
       /* Make sure it is the correct tree type */
-      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == _DW_TREE_TYPE_LISTBOX)
-         store = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
+      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_LISTBOX))
+         store = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
       else if(GTK_IS_COMBO_BOX(handle2))
-         store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
+         store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
       
-      if(store)
-      {
-         GtkTreePath *path = gtk_tree_path_new_from_indices(index);
+      if(store && index < gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL))
+      {
          GtkTreeIter iter;
-         GValue value;
-         char *out;
          
-         /* Get the number of children at the top level */
-         gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path);
-         gtk_tree_model_get_value(GTK_TREE_MODEL(store), &iter, 0, &value);
-         out = g_value_get_string(&value);
-         strncpy(buffer, out, length);
-         g_object_unref(G_OBJECT(path));
-      }
-   }
+         /* Get the nth child at the top level */
+         if(gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, index))
+         {
+            /* Get the text */
+            gchar *text;
+            gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, 0, &text, -1);
+            strncpy(buffer, text, length);
+            DW_MUTEX_UNLOCK;
+            return;
+         }
+      }
+   }
+   buffer[0] = '\0';
    DW_MUTEX_UNLOCK;
 }
 
@@ -8509,22 +8477,21 @@
    if(handle2)
    {
       /* Make sure it is the correct tree type */
-      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == _DW_TREE_TYPE_LISTBOX)
-         store = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
+      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_LISTBOX))
+         store = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
       else if(GTK_IS_COMBO_BOX(handle2))
-         store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
+         store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
       
-      if(store)
-      {
-         GtkTreePath *path = gtk_tree_path_new_from_indices(index);
+      if(store && index < gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL))
+      {
          GtkTreeIter iter;
-         GValue value;
-         char *out;
          
-         /* Get the number of children at the top level */
-         gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path);
-         gtk_list_store_set(store, &iter, buffer);
-         g_object_unref(G_OBJECT(path));
+         /* Get the nth child at the top level */
+         if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, index))
+         {
+            /* Update the text */
+            gtk_list_store_set(store, &iter, buffer);
+         }
       }
    }
    DW_MUTEX_UNLOCK;
@@ -8585,43 +8552,45 @@
 unsigned int dw_listbox_selected(HWND handle)
 {
    GtkWidget *handle2 = handle;
-   int retval = DW_LIT_NONE;
-   int _locked_by_me = FALSE;
-
-   DW_MUTEX_LOCK;
+   GtkListStore *store = NULL;
+   int _locked_by_me = FALSE;
+   unsigned int retval = 0;
+
+   DW_MUTEX_LOCK;
+   /* Get the inner handle for scrolled controls */
    if(GTK_IS_SCROLLED_WINDOW(handle))
    {
       GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_user");
       if(tmp)
          handle2 = tmp;
    }
-#if 0
-   else if(GTK_IS_COMBO_BOX(handle))
-   {
-      retval = (unsigned int)g_object_get_data(G_OBJECT(handle), "_dw_item");
-      DW_MUTEX_UNLOCK;
-      return retval;
-   }
-   if(GTK_IS_LIST(handle2))
-   {
-      int counter = 0;
-      GList *list = GTK_LIST(handle2)->children;
-
-      while(list)
-      {
-         GtkItem *item = (GtkItem *)list->data;
-
-         if(item && item->bin.container.widget.state == GTK_STATE_SELECTED)
+   if(handle2)
+   {
+      /* Make sure it is the correct tree type */
+      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_LISTBOX))
+         store = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
+      else if(GTK_IS_COMBO_BOX(handle2))
+         store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
+      
+      if(store)
+      {
+         GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(handle2));
+         GList *list = gtk_tree_selection_get_selected_rows(sel, NULL);
+         if(list)
          {
-            retval = counter;
-            break;
+            GtkTreePath *path = g_list_nth_data(list, 0);
+            gint *indices = gtk_tree_path_get_indices(path);
+            
+            if(indices)
+            {
+               retval = indices[0];
+            }
+            
+            g_list_foreach(list, (GFunc) gtk_tree_path_free, NULL);
+            g_list_free(list);
          }
-
-         list = list->next;
-         counter++;
-      }
-   }
-#endif
+      }
+   }
    DW_MUTEX_UNLOCK;
    return retval;
 }
@@ -8636,28 +8605,46 @@
 void dw_listbox_select(HWND handle, int index, int state)
 {
    GtkWidget *handle2 = handle;
-   int _locked_by_me = FALSE;
-
-   DW_MUTEX_LOCK;
+   GtkListStore *store = NULL;
+   int _locked_by_me = FALSE;
+
+   DW_MUTEX_LOCK;
+   /* Get the inner handle for scrolled controls */
    if(GTK_IS_SCROLLED_WINDOW(handle))
    {
       GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_user");
       if(tmp)
          handle2 = tmp;
    }
-#if 0
-   else if(GTK_IS_COMBO_BOX(handle))
-   {
-      handle2 = GTK_COMBO_BOX(handle)->list;
-   }
-   if(GTK_IS_LIST(handle2))
-   {
-      if(state)
-         gtk_list_select_item(GTK_LIST(handle2), index);
-      else
-         gtk_list_unselect_item(GTK_LIST(handle2), index);
-   }
-#endif
+   if(handle2)
+   {
+      /* Make sure it is the correct tree type */
+      if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_LISTBOX))
+         store = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
+      else if(GTK_IS_COMBO_BOX(handle2))
+         store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
+      
+      if(store && index < gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL))
+      {
+         GtkTreeIter iter;
+         
+         /* Get the nth child at the top level */
+         if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, index))
+         {
+            GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(handle2));
+            if(state)
+            {
+               /* Select the item */
+               gtk_tree_selection_select_iter(sel, &iter);
+            }
+            else
+            {
+               /* Deselect the item */
+               gtk_tree_selection_deselect_iter(sel, &iter);
+            }
+         }
+      }
+   }
    DW_MUTEX_UNLOCK;
 }
 
@@ -8691,15 +8678,13 @@
       
       if(store)
       {
-         GtkTreePath *path = gtk_tree_path_new_from_indices(index);
          GtkTreeIter iter;
-         GValue value;
-         char *out;
          
-         /* Get the number of children at the top level */
-         gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path);
-         gtk_list_store_remove(store, &iter);
-         g_object_unref(G_OBJECT(path));
+         /* Get the nth child at the top level */
+         if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, index))
+         {
+            gtk_list_store_remove(store, &iter);
+         }
       }
    }
    DW_MUTEX_UNLOCK;
@@ -9940,38 +9925,39 @@
       thiswindow = (HWND)g_object_get_data(G_OBJECT(window), "_dw_user");
    }
 
-   if (GTK_IS_MENU_ITEM(thiswindow) && strcmp(signame, DW_SIGNAL_CLICKED) == 0)
+   if (strcmp(signame, DW_SIGNAL_EXPOSE) == 0)
+   {
+      thisname = "draw";
+   }
+   else if (GTK_IS_MENU_ITEM(thiswindow) && strcmp(signame, DW_SIGNAL_CLICKED) == 0)
    {
       thisname = "activate";
       thisfunc = _findsigfunc(thisname);
    }
    else if (GTK_IS_TREE_VIEW(thiswindow)  && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0)
    {
-      thisfunc = _findsigfunc("tree-context");
-
       sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc);
       cid = g_signal_connect(G_OBJECT(thiswindow), "button_press_event", G_CALLBACK(thisfunc), (gpointer)sigid);
       _set_signal_handler_id(thiswindow, sigid, cid);
 
-#if 0
-      sigid = _set_signal_handler(window, window, sigfunc, data, thisfunc);
-      cid = g_signal_connect(G_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), (gpointer)sigid);
-      _set_signal_handler_id(window, sigid, cid);
-#endif
-
       DW_MUTEX_UNLOCK;
       return;
    }
-   else if (GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0)
-   {
-      GtkWidget *treeview = thiswindow;
-
-      thiswindow = (GtkWidget *)gtk_tree_view_get_selection(GTK_TREE_VIEW(thiswindow));
+   else if ((GTK_IS_TREE_VIEW(thiswindow) || GTK_IS_COMBO_BOX(thiswindow))
+             && (strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0 || strcmp(signame, DW_SIGNAL_LIST_SELECT) == 0))
+   {
+      GtkWidget *widget = thiswindow;
+
       thisname = "changed";
-
-      sigid = _set_signal_handler(treeview, window, sigfunc, data, thisfunc);
-      cid = g_signal_connect(G_OBJECT(thiswindow), thisname, (GCallback)thisfunc, (gpointer)sigid);
-      _set_signal_handler_id(treeview, sigid, cid);
+      
+      sigid = _set_signal_handler(widget, window, sigfunc, data, thisfunc);
+      if(GTK_IS_TREE_VIEW(thiswindow))
+      {
+         thiswindow = (GtkWidget *)gtk_tree_view_get_selection(GTK_TREE_VIEW(thiswindow));
+         cid = g_signal_connect(G_OBJECT(thiswindow), thisname, G_CALLBACK(thisfunc), (gpointer)sigid);
+         _set_signal_handler_id(widget, sigid, cid);
+      }
+
       DW_MUTEX_UNLOCK;
       return;
    }