changeset 777:c0e7200dad31

More work on comboboxes, listboxes and containers. Comboboxes now display the list properly. Also switched from using pure X11 code to GTK code to set window manager hints.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sun, 20 Mar 2011 09:22:11 +0000
parents 425f3d46b75f
children 99ce0ea1f271
files gtk3/dw.c
diffstat 1 files changed, 79 insertions(+), 113 deletions(-) [+]
line wrap: on
line diff
--- a/gtk3/dw.c	Sun Mar 20 05:21:09 2011 +0000
+++ b/gtk3/dw.c	Sun Mar 20 09:22:11 2011 +0000
@@ -3542,6 +3542,11 @@
    return tree;
 }
 
+#define _DW_TREE_TYPE_CONTAINER  1
+#define _DW_TREE_TYPE_TREE       2
+#define _DW_TREE_TYPE_LISTBOX    3
+#define _DW_TREE_TYPE_COMBOBOX   4
+
 /*
  * Create a container object to be packed.
  * Parameters:
@@ -3559,7 +3564,7 @@
       DW_MUTEX_UNLOCK;
       return 0;
    }
-   g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)1);
+   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));
    gtk_widget_show(tmp);   
@@ -3590,7 +3595,7 @@
    }
    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)2);
+   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();
 
@@ -3749,14 +3754,19 @@
 {
    GtkWidget *tmp;
    GtkListStore *store;
+   GtkCellRenderer *renderer;
    int sigid, _locked_by_me = FALSE;
    gint cid;
 
    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_widget_show(tmp);
-   g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)3);
+   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));
    DW_MUTEX_UNLOCK;
    return tmp;
@@ -4067,7 +4077,7 @@
    }
    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)3);
+   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();
@@ -7703,26 +7713,6 @@
    }
 }
 
-#ifdef GDK_WINDOWING_X11
-static void _size_allocate(GtkWindow *window)
-{
-  XSizeHints sizehints;
-
-  sizehints.base_width = 1;
-  sizehints.base_height = 1;
-  sizehints.width_inc = 1;
-  sizehints.height_inc = 1;
-  sizehints.min_width = 8;
-  sizehints.min_height = 8;
-
-  sizehints.flags = (PBaseSize|PMinSize|PResizeInc);
-  
-  XSetWMNormalHints (gdk_x11_display_get_xdisplay(gdk_display_get_default()),
-                     GDK_WINDOW_XID(gtk_widget_get_window(GTK_WIDGET(window))),&sizehints);
-  gdk_flush ();
-}
-#endif
-
 /*
  * Sets the size of a given window (widget).
  * Parameters:
@@ -7742,15 +7732,19 @@
    DW_MUTEX_LOCK;
    if(GTK_IS_WINDOW(handle))
    {
+      GdkGeometry hints;
+      
       if ( width == 0 )
          default_width = -1;
       if ( height == 0 )
          default_height = -1;
          
-#ifdef GDK_WINDOWING_X11
-      _size_allocate(GTK_WINDOW(handle));
-#endif
-
+      hints.base_width = hints.base_height = 1;
+      hints.min_width = hints.min_height = 8;
+      hints.width_inc = hints.height_inc = 1;
+
+      gtk_window_set_geometry_hints(GTK_WINDOW(handle), NULL, &hints, GDK_HINT_RESIZE_INC|GDK_HINT_MIN_SIZE|GDK_HINT_BASE_SIZE);
+                                
       if(gtk_widget_get_window(handle) && default_width > 0 && default_height > 0)
          gdk_window_resize(gtk_widget_get_window(handle), default_width , default_height );
 
@@ -8289,52 +8283,38 @@
 void dw_listbox_insert(HWND handle, char *text, int pos)
 {
    GtkWidget *handle2 = handle;
-   int _locked_by_me = FALSE;
-
-   DW_MUTEX_LOCK;
+   GtkTreeIter *iter;
+   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
-   g_object_set_data(G_OBJECT(handle), "_dw_appending", GINT_TO_POINTER(1));
-   if(GTK_IS_LIST(handle2))
-   {
-      GtkWidget *list_item;
-      GList *tmp;
-      char *font = (char *)g_object_get_data(G_OBJECT(handle), "_dw_font");
-      GdkColor *fore = (GdkColor *)g_object_get_data(G_OBJECT(handle2), "_dw_foregdk");
-      GdkColor *back = (GdkColor *)g_object_get_data(G_OBJECT(handle2), "_dw_backgdk");
-
-      list_item=gtk_list_item_new_with_label(text);
-
-      if(font)
-         _set_font(GTK_LIST_ITEM(list_item)->item.bin.child, font);
-      if(fore && back)
-         _set_color(GTK_LIST_ITEM(list_item)->item.bin.child,
-                  DW_RGB(fore->red, fore->green, fore->blue),
-                  DW_RGB(back->red, back->green, back->blue));
-
-      tmp  = g_list_insert(NULL, list_item, pos);
-      gtk_widget_show(list_item);
-      gtk_list_append_items(GTK_LIST(handle2),tmp);
-   }
-   else if(GTK_IS_COMBO_BOX(handle2))
-   {
-      GList *tmp = (GList *)gtk_object_get_user_data(GTK_OBJECT(handle2));
-      char *addtext = strdup(text);
-
-      if(addtext)
-      {
-         tmp = g_list_insert(tmp, addtext, pos);
-         g_object_set_data(GTK_OBJECT(handle2), "_dw_user", tmp);
-         gtk_combo_set_popdown_strings(GTK_COMBO_BOX(handle2), tmp);
-      }
-   }
-   g_object_set_data(G_OBJECT(handle), "_dw_appending", NULL);
-#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") == _DW_TREE_TYPE_LISTBOX)
+         store = (GtkTreeStore *)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));
+      
+      if(!store)
+      {
+         DW_MUTEX_UNLOCK;
+         return;
+      }
+      
+      /* Insert an entry at the end */
+      iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter));
+
+      gtk_list_store_append(store, iter);
+      gtk_list_store_set (store, iter, 0, text, -1);
+   }
    DW_MUTEX_UNLOCK;
 }
 
@@ -8348,57 +8328,43 @@
 void dw_listbox_list_append(HWND handle, char **text, int count)
 {
    GtkWidget *handle2 = handle;
-   int _locked_by_me = FALSE;
-
-   if ( count == 0 )
-      return;
-
-   DW_MUTEX_LOCK;
+   GtkTreeIter *iter;
+   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
-   g_object_set_data(G_OBJECT(handle), "_dw_appending", GINT_TO_POINTER(1));
-   if(GTK_IS_LIST(handle2))
-   {
-      GtkWidget *list_item;
-      GList *tmp;
-      char *font = (char *)g_object_get_data(G_OBJECT(handle), "_dw_font");
-      GdkColor *fore = (GdkColor *)g_object_get_data(G_OBJECT(handle2), "_dw_foregdk");
-      GdkColor *back = (GdkColor *)g_object_get_data(G_OBJECT(handle2), "_dw_backgdk");
-
-      list_item=gtk_list_item_new_with_label(*text);
-
-      if(font)
-         _set_font(GTK_LIST_ITEM(list_item)->item.bin.child, font);
-      if(fore && back)
-         _set_color(GTK_LIST_ITEM(list_item)->item.bin.child,
-                  DW_RGB(fore->red, fore->green, fore->blue),
-                  DW_RGB(back->red, back->green, back->blue));
-
-      tmp  = g_list_append(NULL, list_item);
-      gtk_widget_show(list_item);
-      gtk_list_append_items(GTK_LIST(handle2),tmp);
-   }
-   else if(GTK_IS_COMBO_BOX(handle2))
-   {
-      GList *tmp = (GList *)gtk_object_get_user_data(GTK_OBJECT(handle2));
-      char *addtext;
-      int i;
-
-      for (i=0;i<count;i++)
-      {
-         addtext = strdup(text[i]);
-         tmp = g_list_append(tmp, addtext);
-      }
-      g_object_set_data(GTK_OBJECT(handle2), "_dw_user", tmp);
-      gtk_combo_set_popdown_strings(GTK_COMBO_BOX(handle2), tmp);
-   }
-   g_object_set_data(G_OBJECT(handle), "_dw_appending", NULL);
-#endif
+   if(handle2)
+   {
+      int z;
+      
+      /* 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));
+      else if(GTK_IS_COMBO_BOX(handle2))
+         store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
+      
+      if(!store)
+      {
+         DW_MUTEX_UNLOCK;
+         return;
+      }
+      
+      /* Insert entries at the end */
+      for(z=0;z<count;z++)
+      {
+         iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter));
+
+         gtk_list_store_append(store, iter);
+         gtk_list_store_set (store, iter, 0, text[z], -1);
+      }
+   }
    DW_MUTEX_UNLOCK;
 }