Mercurial > dwindows
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. |