comparison gtk3/dw.c @ 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 5ec50e403a8a
children 99ce0ea1f271
comparison
equal deleted inserted replaced
776:425f3d46b75f 777:c0e7200dad31
3540 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tmp), tree); 3540 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tmp), tree);
3541 g_object_set_data(G_OBJECT(tmp), "_dw_user", (gpointer)tree); 3541 g_object_set_data(G_OBJECT(tmp), "_dw_user", (gpointer)tree);
3542 return tree; 3542 return tree;
3543 } 3543 }
3544 3544
3545 #define _DW_TREE_TYPE_CONTAINER 1
3546 #define _DW_TREE_TYPE_TREE 2
3547 #define _DW_TREE_TYPE_LISTBOX 3
3548 #define _DW_TREE_TYPE_COMBOBOX 4
3549
3545 /* 3550 /*
3546 * Create a container object to be packed. 3551 * Create a container object to be packed.
3547 * Parameters: 3552 * Parameters:
3548 * id: An ID to be used for getting the resource from the 3553 * id: An ID to be used for getting the resource from the
3549 * resource file. 3554 * resource file.
3557 if(!(tmp = _tree_create(id))) 3562 if(!(tmp = _tree_create(id)))
3558 { 3563 {
3559 DW_MUTEX_UNLOCK; 3564 DW_MUTEX_UNLOCK;
3560 return 0; 3565 return 0;
3561 } 3566 }
3562 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)1); 3567 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_CONTAINER);
3563 g_object_set_data(G_OBJECT(tmp), "_dw_multi_sel", GINT_TO_POINTER(multi)); 3568 g_object_set_data(G_OBJECT(tmp), "_dw_multi_sel", GINT_TO_POINTER(multi));
3564 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); 3569 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
3565 gtk_widget_show(tmp); 3570 gtk_widget_show(tmp);
3566 DW_MUTEX_UNLOCK; 3571 DW_MUTEX_UNLOCK;
3567 return tmp; 3572 return tmp;
3588 DW_MUTEX_UNLOCK; 3593 DW_MUTEX_UNLOCK;
3589 return 0; 3594 return 0;
3590 } 3595 }
3591 store = gtk_tree_store_new(4, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER, G_TYPE_POINTER); 3596 store = gtk_tree_store_new(4, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER, G_TYPE_POINTER);
3592 tree = _tree_setup(tmp, GTK_TREE_MODEL(store)); 3597 tree = _tree_setup(tmp, GTK_TREE_MODEL(store));
3593 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)2); 3598 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_TREE);
3594 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); 3599 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
3595 col = gtk_tree_view_column_new(); 3600 col = gtk_tree_view_column_new();
3596 3601
3597 rend = gtk_cell_renderer_pixbuf_new(); 3602 rend = gtk_cell_renderer_pixbuf_new();
3598 gtk_tree_view_column_pack_start(col, rend, FALSE); 3603 gtk_tree_view_column_pack_start(col, rend, FALSE);
3747 */ 3752 */
3748 HWND dw_combobox_new(char *text, unsigned long id) 3753 HWND dw_combobox_new(char *text, unsigned long id)
3749 { 3754 {
3750 GtkWidget *tmp; 3755 GtkWidget *tmp;
3751 GtkListStore *store; 3756 GtkListStore *store;
3757 GtkCellRenderer *renderer;
3752 int sigid, _locked_by_me = FALSE; 3758 int sigid, _locked_by_me = FALSE;
3753 gint cid; 3759 gint cid;
3754 3760
3755 DW_MUTEX_LOCK; 3761 DW_MUTEX_LOCK;
3756 store = gtk_list_store_new(1, G_TYPE_STRING); 3762 store = gtk_list_store_new(1, G_TYPE_STRING);
3757 tmp = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store)); 3763 tmp = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store));
3764 renderer = gtk_cell_renderer_text_new ();
3765 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT(tmp), renderer, TRUE);
3766 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(tmp), renderer, "text", 0, NULL);
3767 gtk_combo_box_set_id_column(GTK_COMBO_BOX(tmp), 0);
3758 gtk_widget_show(tmp); 3768 gtk_widget_show(tmp);
3759 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)3); 3769 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_COMBOBOX);
3760 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); 3770 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
3761 DW_MUTEX_UNLOCK; 3771 DW_MUTEX_UNLOCK;
3762 return tmp; 3772 return tmp;
3763 } 3773 }
3764 3774
4065 DW_MUTEX_UNLOCK; 4075 DW_MUTEX_UNLOCK;
4066 return 0; 4076 return 0;
4067 } 4077 }
4068 store = gtk_list_store_new(1, G_TYPE_STRING); 4078 store = gtk_list_store_new(1, G_TYPE_STRING);
4069 tree = _tree_setup(tmp, GTK_TREE_MODEL(store)); 4079 tree = _tree_setup(tmp, GTK_TREE_MODEL(store));
4070 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)3); 4080 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_LISTBOX);
4071 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id)); 4081 g_object_set_data(G_OBJECT(tmp), "_dw_id", GINT_TO_POINTER(id));
4072 4082
4073 col = gtk_tree_view_column_new(); 4083 col = gtk_tree_view_column_new();
4074 rend = gtk_cell_renderer_text_new(); 4084 rend = gtk_cell_renderer_text_new();
4075 gtk_tree_view_column_pack_start(col, rend, TRUE); 4085 gtk_tree_view_column_pack_start(col, rend, TRUE);
7701 if ( height == 0 && vsize == FALSE ) 7711 if ( height == 0 && vsize == FALSE )
7702 dw_messagebox("dw_box_pack_end()", DW_MB_OK|DW_MB_ERROR, "Height and expand Vertical both unset for box: %x item: %x",box,item); 7712 dw_messagebox("dw_box_pack_end()", DW_MB_OK|DW_MB_ERROR, "Height and expand Vertical both unset for box: %x item: %x",box,item);
7703 } 7713 }
7704 } 7714 }
7705 7715
7706 #ifdef GDK_WINDOWING_X11
7707 static void _size_allocate(GtkWindow *window)
7708 {
7709 XSizeHints sizehints;
7710
7711 sizehints.base_width = 1;
7712 sizehints.base_height = 1;
7713 sizehints.width_inc = 1;
7714 sizehints.height_inc = 1;
7715 sizehints.min_width = 8;
7716 sizehints.min_height = 8;
7717
7718 sizehints.flags = (PBaseSize|PMinSize|PResizeInc);
7719
7720 XSetWMNormalHints (gdk_x11_display_get_xdisplay(gdk_display_get_default()),
7721 GDK_WINDOW_XID(gtk_widget_get_window(GTK_WIDGET(window))),&sizehints);
7722 gdk_flush ();
7723 }
7724 #endif
7725
7726 /* 7716 /*
7727 * Sets the size of a given window (widget). 7717 * Sets the size of a given window (widget).
7728 * Parameters: 7718 * Parameters:
7729 * handle: Window (widget) handle. 7719 * handle: Window (widget) handle.
7730 * width: New width in pixels. 7720 * width: New width in pixels.
7740 return; 7730 return;
7741 7731
7742 DW_MUTEX_LOCK; 7732 DW_MUTEX_LOCK;
7743 if(GTK_IS_WINDOW(handle)) 7733 if(GTK_IS_WINDOW(handle))
7744 { 7734 {
7735 GdkGeometry hints;
7736
7745 if ( width == 0 ) 7737 if ( width == 0 )
7746 default_width = -1; 7738 default_width = -1;
7747 if ( height == 0 ) 7739 if ( height == 0 )
7748 default_height = -1; 7740 default_height = -1;
7749 7741
7750 #ifdef GDK_WINDOWING_X11 7742 hints.base_width = hints.base_height = 1;
7751 _size_allocate(GTK_WINDOW(handle)); 7743 hints.min_width = hints.min_height = 8;
7752 #endif 7744 hints.width_inc = hints.height_inc = 1;
7753 7745
7746 gtk_window_set_geometry_hints(GTK_WINDOW(handle), NULL, &hints, GDK_HINT_RESIZE_INC|GDK_HINT_MIN_SIZE|GDK_HINT_BASE_SIZE);
7747
7754 if(gtk_widget_get_window(handle) && default_width > 0 && default_height > 0) 7748 if(gtk_widget_get_window(handle) && default_width > 0 && default_height > 0)
7755 gdk_window_resize(gtk_widget_get_window(handle), default_width , default_height ); 7749 gdk_window_resize(gtk_widget_get_window(handle), default_width , default_height );
7756 7750
7757 gtk_window_set_default_size(GTK_WINDOW(handle), default_width , default_height ); 7751 gtk_window_set_default_size(GTK_WINDOW(handle), default_width , default_height );
7758 if(!g_object_get_data(G_OBJECT(handle), "_dw_size")) 7752 if(!g_object_get_data(G_OBJECT(handle), "_dw_size"))
8287 * pos: 0-based index into listbox. -1 will append 8281 * pos: 0-based index into listbox. -1 will append
8288 */ 8282 */
8289 void dw_listbox_insert(HWND handle, char *text, int pos) 8283 void dw_listbox_insert(HWND handle, char *text, int pos)
8290 { 8284 {
8291 GtkWidget *handle2 = handle; 8285 GtkWidget *handle2 = handle;
8292 int _locked_by_me = FALSE; 8286 GtkTreeIter *iter;
8293 8287 GtkListStore *store = NULL;
8294 DW_MUTEX_LOCK; 8288 int _locked_by_me = FALSE;
8289
8290 DW_MUTEX_LOCK;
8291 /* Get the inner handle for scrolled controls */
8295 if(GTK_IS_SCROLLED_WINDOW(handle)) 8292 if(GTK_IS_SCROLLED_WINDOW(handle))
8296 { 8293 {
8297 GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_user"); 8294 GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_user");
8298 if(tmp) 8295 if(tmp)
8299 handle2 = tmp; 8296 handle2 = tmp;
8300 } 8297 }
8301 #if 0 8298 if(handle2)
8302 g_object_set_data(G_OBJECT(handle), "_dw_appending", GINT_TO_POINTER(1)); 8299 {
8303 if(GTK_IS_LIST(handle2)) 8300 /* Make sure it is the correct tree type */
8304 { 8301 if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == _DW_TREE_TYPE_LISTBOX)
8305 GtkWidget *list_item; 8302 store = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
8306 GList *tmp; 8303 else if(GTK_IS_COMBO_BOX(handle2))
8307 char *font = (char *)g_object_get_data(G_OBJECT(handle), "_dw_font"); 8304 store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
8308 GdkColor *fore = (GdkColor *)g_object_get_data(G_OBJECT(handle2), "_dw_foregdk"); 8305
8309 GdkColor *back = (GdkColor *)g_object_get_data(G_OBJECT(handle2), "_dw_backgdk"); 8306 if(!store)
8310 8307 {
8311 list_item=gtk_list_item_new_with_label(text); 8308 DW_MUTEX_UNLOCK;
8312 8309 return;
8313 if(font) 8310 }
8314 _set_font(GTK_LIST_ITEM(list_item)->item.bin.child, font); 8311
8315 if(fore && back) 8312 /* Insert an entry at the end */
8316 _set_color(GTK_LIST_ITEM(list_item)->item.bin.child, 8313 iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter));
8317 DW_RGB(fore->red, fore->green, fore->blue), 8314
8318 DW_RGB(back->red, back->green, back->blue)); 8315 gtk_list_store_append(store, iter);
8319 8316 gtk_list_store_set (store, iter, 0, text, -1);
8320 tmp = g_list_insert(NULL, list_item, pos); 8317 }
8321 gtk_widget_show(list_item);
8322 gtk_list_append_items(GTK_LIST(handle2),tmp);
8323 }
8324 else if(GTK_IS_COMBO_BOX(handle2))
8325 {
8326 GList *tmp = (GList *)gtk_object_get_user_data(GTK_OBJECT(handle2));
8327 char *addtext = strdup(text);
8328
8329 if(addtext)
8330 {
8331 tmp = g_list_insert(tmp, addtext, pos);
8332 g_object_set_data(GTK_OBJECT(handle2), "_dw_user", tmp);
8333 gtk_combo_set_popdown_strings(GTK_COMBO_BOX(handle2), tmp);
8334 }
8335 }
8336 g_object_set_data(G_OBJECT(handle), "_dw_appending", NULL);
8337 #endif
8338 DW_MUTEX_UNLOCK; 8318 DW_MUTEX_UNLOCK;
8339 } 8319 }
8340 8320
8341 /* 8321 /*
8342 * Appends the specified text items to the listbox's (or combobox) entry list. 8322 * Appends the specified text items to the listbox's (or combobox) entry list.
8346 * count: Number of text strings to append 8326 * count: Number of text strings to append
8347 */ 8327 */
8348 void dw_listbox_list_append(HWND handle, char **text, int count) 8328 void dw_listbox_list_append(HWND handle, char **text, int count)
8349 { 8329 {
8350 GtkWidget *handle2 = handle; 8330 GtkWidget *handle2 = handle;
8351 int _locked_by_me = FALSE; 8331 GtkTreeIter *iter;
8352 8332 GtkListStore *store = NULL;
8353 if ( count == 0 ) 8333 int _locked_by_me = FALSE;
8354 return; 8334
8355 8335 DW_MUTEX_LOCK;
8356 DW_MUTEX_LOCK; 8336 /* Get the inner handle for scrolled controls */
8357 if(GTK_IS_SCROLLED_WINDOW(handle)) 8337 if(GTK_IS_SCROLLED_WINDOW(handle))
8358 { 8338 {
8359 GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_user"); 8339 GtkWidget *tmp = (GtkWidget *)g_object_get_data(G_OBJECT(handle), "_dw_user");
8360 if(tmp) 8340 if(tmp)
8361 handle2 = tmp; 8341 handle2 = tmp;
8362 } 8342 }
8363 #if 0 8343 if(handle2)
8364 g_object_set_data(G_OBJECT(handle), "_dw_appending", GINT_TO_POINTER(1)); 8344 {
8365 if(GTK_IS_LIST(handle2)) 8345 int z;
8366 { 8346
8367 GtkWidget *list_item; 8347 /* Make sure it is the correct tree type */
8368 GList *tmp; 8348 if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == _DW_TREE_TYPE_LISTBOX)
8369 char *font = (char *)g_object_get_data(G_OBJECT(handle), "_dw_font"); 8349 store = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
8370 GdkColor *fore = (GdkColor *)g_object_get_data(G_OBJECT(handle2), "_dw_foregdk"); 8350 else if(GTK_IS_COMBO_BOX(handle2))
8371 GdkColor *back = (GdkColor *)g_object_get_data(G_OBJECT(handle2), "_dw_backgdk"); 8351 store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
8372 8352
8373 list_item=gtk_list_item_new_with_label(*text); 8353 if(!store)
8374 8354 {
8375 if(font) 8355 DW_MUTEX_UNLOCK;
8376 _set_font(GTK_LIST_ITEM(list_item)->item.bin.child, font); 8356 return;
8377 if(fore && back) 8357 }
8378 _set_color(GTK_LIST_ITEM(list_item)->item.bin.child, 8358
8379 DW_RGB(fore->red, fore->green, fore->blue), 8359 /* Insert entries at the end */
8380 DW_RGB(back->red, back->green, back->blue)); 8360 for(z=0;z<count;z++)
8381 8361 {
8382 tmp = g_list_append(NULL, list_item); 8362 iter = (GtkTreeIter *)malloc(sizeof(GtkTreeIter));
8383 gtk_widget_show(list_item); 8363
8384 gtk_list_append_items(GTK_LIST(handle2),tmp); 8364 gtk_list_store_append(store, iter);
8385 } 8365 gtk_list_store_set (store, iter, 0, text[z], -1);
8386 else if(GTK_IS_COMBO_BOX(handle2)) 8366 }
8387 { 8367 }
8388 GList *tmp = (GList *)gtk_object_get_user_data(GTK_OBJECT(handle2));
8389 char *addtext;
8390 int i;
8391
8392 for (i=0;i<count;i++)
8393 {
8394 addtext = strdup(text[i]);
8395 tmp = g_list_append(tmp, addtext);
8396 }
8397 g_object_set_data(GTK_OBJECT(handle2), "_dw_user", tmp);
8398 gtk_combo_set_popdown_strings(GTK_COMBO_BOX(handle2), tmp);
8399 }
8400 g_object_set_data(G_OBJECT(handle), "_dw_appending", NULL);
8401 #endif
8402 DW_MUTEX_UNLOCK; 8368 DW_MUTEX_UNLOCK;
8403 } 8369 }
8404 8370
8405 /* 8371 /*
8406 * Clears the listbox's (or combobox) list of all entries. 8372 * Clears the listbox's (or combobox) list of all entries.