comparison gtk3/dw.c @ 780:fda93b441c4d

Lots of listbox/combobox/container fixes. Things are starting to come together.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 21 Mar 2011 01:33:51 +0000
parents d67d2f626c33
children df6091308b3f
comparison
equal deleted inserted replaced
779:d67d2f626c33 780:fda93b441c4d
139 #define DW_MUTEX_UNLOCK { if(pthread_self() != _dw_thread && _locked_by_me == TRUE) { gdk_threads_leave(); _dw_mutex_locked[_find_thread_index(dw_thread_id())] = FALSE; _locked_by_me = FALSE; } } 139 #define DW_MUTEX_UNLOCK { if(pthread_self() != _dw_thread && _locked_by_me == TRUE) { gdk_threads_leave(); _dw_mutex_locked[_find_thread_index(dw_thread_id())] = FALSE; _locked_by_me = FALSE; } }
140 140
141 #define DEFAULT_SIZE_WIDTH 12 141 #define DEFAULT_SIZE_WIDTH 12
142 #define DEFAULT_SIZE_HEIGHT 6 142 #define DEFAULT_SIZE_HEIGHT 6
143 #define DEFAULT_TITLEBAR_HEIGHT 22 143 #define DEFAULT_TITLEBAR_HEIGHT 22
144
145 #define _DW_TREE_TYPE_CONTAINER 1
146 #define _DW_TREE_TYPE_TREE 2
147 #define _DW_TREE_TYPE_LISTBOX 3
148 #define _DW_TREE_TYPE_COMBOBOX 4
144 149
145 /* Signal forwarder prototypes */ 150 /* Signal forwarder prototypes */
146 static gint _button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data); 151 static gint _button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
147 static gint _button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer data); 152 static gint _button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer data);
148 static gint _motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data); 153 static gint _motion_notify_event(GtkWidget *widget, GdkEventMotion *event, gpointer data);
1445 { 1450 {
1446 DWExpose exp; 1451 DWExpose exp;
1447 int (*exposefunc)(HWND, DWExpose *, void *) = work.func; 1452 int (*exposefunc)(HWND, DWExpose *, void *) = work.func;
1448 1453
1449 exp.x = exp.y = 0; 1454 exp.x = exp.y = 0;
1450 exp.width = egtk_widget_get_allocated_width(widget); 1455 exp.width = gtk_widget_get_allocated_width(widget);
1451 exp.height = gtk_widget_get_allocated_height(widget); 1456 exp.height = gtk_widget_get_allocated_height(widget);
1452 retval = exposefunc(work.window, &exp, work.data); 1457 retval = exposefunc(work.window, &exp, work.data);
1453 } 1458 }
1454 return retval; 1459 return retval;
1455 } 1460 }
1518 if(widget && GTK_IS_TREE_VIEW(widget)) 1523 if(widget && GTK_IS_TREE_VIEW(widget))
1519 { 1524 {
1520 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); 1525 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
1521 GtkTreeIter iter; 1526 GtkTreeIter iter;
1522 1527
1523 if(sel && gtk_tree_selection_get_selected(sel, NULL, &iter)) 1528 if(sel && gtk_tree_selection_get_mode(sel) != GTK_SELECTION_MULTIPLE &&
1529 gtk_tree_selection_get_selected(sel, NULL, &iter))
1524 { 1530 {
1525 GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget)); 1531 GtkTreeModel *store = (GtkTreeModel *)gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
1526 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1); 1532
1533 if(g_object_get_data(G_OBJECT(widget), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_TREE))
1534 {
1535 gtk_tree_model_get(store, &iter, 0, &text, 2, &itemdata, -1);
1536 }
1537 else
1538 {
1539 gtk_tree_model_get(store, &iter, 0, &text, -1);
1540 }
1527 } 1541 }
1528 } 1542 }
1529 1543
1530 retval = contextfunc(work.window, text, event->x, event->y, work.data, itemdata); 1544 retval = contextfunc(work.window, text, event->x, event->y, work.data, itemdata);
1531 } 1545 }
3514 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tmp), tree); 3528 gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tmp), tree);
3515 g_object_set_data(G_OBJECT(tmp), "_dw_user", (gpointer)tree); 3529 g_object_set_data(G_OBJECT(tmp), "_dw_user", (gpointer)tree);
3516 return tree; 3530 return tree;
3517 } 3531 }
3518 3532
3519 #define _DW_TREE_TYPE_CONTAINER 1
3520 #define _DW_TREE_TYPE_TREE 2
3521 #define _DW_TREE_TYPE_LISTBOX 3
3522 #define _DW_TREE_TYPE_COMBOBOX 4
3523
3524 /* 3533 /*
3525 * Create a container object to be packed. 3534 * Create a container object to be packed.
3526 * Parameters: 3535 * Parameters:
3527 * id: An ID to be used for getting the resource from the 3536 * id: An ID to be used for getting the resource from the
3528 * resource file. 3537 * resource file.
3566 return 0; 3575 return 0;
3567 } 3576 }
3568 store = gtk_tree_store_new(4, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER, G_TYPE_POINTER); 3577 store = gtk_tree_store_new(4, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_POINTER, G_TYPE_POINTER);
3569 tree = _tree_setup(tmp, GTK_TREE_MODEL(store)); 3578 tree = _tree_setup(tmp, GTK_TREE_MODEL(store));
3570 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_TREE); 3579 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_TREE);
3580 g_object_set_data(G_OBJECT(tree), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_TREE);
3571 col = gtk_tree_view_column_new(); 3581 col = gtk_tree_view_column_new();
3572 3582
3573 rend = gtk_cell_renderer_pixbuf_new(); 3583 rend = gtk_cell_renderer_pixbuf_new();
3574 gtk_tree_view_column_pack_start(col, rend, FALSE); 3584 gtk_tree_view_column_pack_start(col, rend, FALSE);
3575 gtk_tree_view_column_add_attribute(col, rend, "pixbuf", 1); 3585 gtk_tree_view_column_add_attribute(col, rend, "pixbuf", 1);
3723 */ 3733 */
3724 HWND dw_combobox_new(char *text, unsigned long id) 3734 HWND dw_combobox_new(char *text, unsigned long id)
3725 { 3735 {
3726 GtkWidget *tmp; 3736 GtkWidget *tmp;
3727 GtkListStore *store; 3737 GtkListStore *store;
3728 GtkCellRenderer *renderer; 3738 int _locked_by_me = FALSE;
3729 int sigid, _locked_by_me = FALSE;
3730 gint cid;
3731 3739
3732 DW_MUTEX_LOCK; 3740 DW_MUTEX_LOCK;
3733 store = gtk_list_store_new(1, G_TYPE_STRING); 3741 store = gtk_list_store_new(1, G_TYPE_STRING);
3734 tmp = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store)); 3742 tmp = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(store));
3735 gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(tmp), 0); 3743 gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(tmp), 0);
4044 return 0; 4052 return 0;
4045 } 4053 }
4046 store = gtk_list_store_new(1, G_TYPE_STRING); 4054 store = gtk_list_store_new(1, G_TYPE_STRING);
4047 tree = _tree_setup(tmp, GTK_TREE_MODEL(store)); 4055 tree = _tree_setup(tmp, GTK_TREE_MODEL(store));
4048 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_LISTBOX); 4056 g_object_set_data(G_OBJECT(tmp), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_LISTBOX);
4057 g_object_set_data(G_OBJECT(tree), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_LISTBOX);
4049 4058
4050 col = gtk_tree_view_column_new(); 4059 col = gtk_tree_view_column_new();
4051 rend = gtk_cell_renderer_text_new(); 4060 rend = gtk_cell_renderer_text_new();
4052 gtk_tree_view_column_pack_start(col, rend, TRUE); 4061 gtk_tree_view_column_pack_start(col, rend, TRUE);
4053 gtk_tree_view_column_add_attribute(col, rend, "text", 0); 4062 gtk_tree_view_column_add_attribute(col, rend, "text", 0);
5336 static int _dw_container_setup(HWND handle, unsigned long *flags, char **titles, int count, int separator, int extra) 5345 static int _dw_container_setup(HWND handle, unsigned long *flags, char **titles, int count, int separator, int extra)
5337 { 5346 {
5338 int z; 5347 int z;
5339 GtkWidget *tree; 5348 GtkWidget *tree;
5340 GtkListStore *store; 5349 GtkListStore *store;
5341 GtkTreeViewColumn *col; 5350 GtkTreeViewColumn *col, *expander = NULL;
5342 GtkCellRenderer *rend; 5351 GtkCellRenderer *rend;
5343 GtkTreeSelection *sel; 5352 GtkTreeSelection *sel;
5344 int _locked_by_me = FALSE; 5353 int _locked_by_me = FALSE;
5345 GType *array = calloc(count, sizeof(gint)); 5354 GType *array = calloc(count + 2, sizeof(gint));
5346 5355 unsigned long *newflags = calloc(count, sizeof(unsigned long));
5347 DW_MUTEX_LOCK; 5356
5357 memcpy(newflags, flags, count * sizeof(unsigned long));
5358
5359 DW_MUTEX_LOCK;
5360 /* Save some of the info so it is easily accessible */
5361 g_object_set_data(G_OBJECT(handle), "_dw_cont_col_flags", (gpointer)newflags);
5362 g_object_set_data(G_OBJECT(handle), "_dw_cont_columns", GINT_TO_POINTER(count));
5363
5364 /* First param is row title/data */
5365 array[0] = G_TYPE_POINTER;
5348 /* First loop... create array to create the store */ 5366 /* First loop... create array to create the store */
5349 for(z=0;z<count;z++) 5367 for(z=0;z<count;z++)
5350 { 5368 {
5351 if(flags[z] & DW_CFA_BITMAPORICON) 5369 if(flags[z] & DW_CFA_BITMAPORICON)
5352 { 5370 {
5353 array[z] = GDK_TYPE_PIXBUF; 5371 array[z+1] = GDK_TYPE_PIXBUF;
5354 } 5372 }
5355 else if(flags[z] & DW_CFA_STRING) 5373 else if(flags[z] & DW_CFA_STRING)
5356 { 5374 {
5357 array[z] = G_TYPE_STRING; 5375 array[z+1] = G_TYPE_STRING;
5358 } 5376 }
5359 else if(flags[z] & DW_CFA_ULONG) 5377 else if(flags[z] & DW_CFA_ULONG)
5360 { 5378 {
5361 array[z] = G_TYPE_ULONG; 5379 array[z+1] = G_TYPE_ULONG;
5362 } 5380 }
5363 else if(flags[z] & DW_CFA_TIME) 5381 else if(flags[z] & DW_CFA_TIME)
5364 { 5382 {
5365 array[z] = G_TYPE_STRING; 5383 array[z+1] = G_TYPE_STRING;
5366 } 5384 }
5367 else if(flags[z] & DW_CFA_DATE) 5385 else if(flags[z] & DW_CFA_DATE)
5368 { 5386 {
5369 array[z] = G_TYPE_STRING; 5387 array[z+1] = G_TYPE_STRING;
5370 } 5388 }
5371 } 5389 }
5372 /* Create the store and then the tree */ 5390 /* Create the store and then the tree */
5373 store = gtk_list_store_newv(count, array); 5391 store = gtk_list_store_newv(count+1, array);
5374 tree = _tree_setup(handle, GTK_TREE_MODEL(store)); 5392 tree = _tree_setup(handle, GTK_TREE_MODEL(store));
5393 g_object_set_data(G_OBJECT(tree), "_dw_tree_type", (gpointer)_DW_TREE_TYPE_CONTAINER);
5375 /* Second loop... create the columns */ 5394 /* Second loop... create the columns */
5376 for(z=0;z<count;z++) 5395 for(z=0;z<count;z++)
5377 { 5396 {
5378 col = gtk_tree_view_column_new(); 5397 col = gtk_tree_view_column_new();
5379 if(flags[z] & DW_CFA_BITMAPORICON) 5398 if(flags[z] & DW_CFA_BITMAPORICON)
5380 { 5399 {
5381 rend = gtk_cell_renderer_pixbuf_new(); 5400 rend = gtk_cell_renderer_pixbuf_new();
5382 gtk_tree_view_column_pack_start(col, rend, FALSE); 5401 gtk_tree_view_column_pack_start(col, rend, FALSE);
5383 gtk_tree_view_column_add_attribute(col, rend, "pixbuf", z); 5402 gtk_tree_view_column_add_attribute(col, rend, "pixbuf", z+1);
5384 } 5403 }
5385 else if(flags[z] & DW_CFA_STRING) 5404 else if(flags[z] & DW_CFA_STRING)
5386 { 5405 {
5406 if(!expander)
5407 {
5408 expander = col;
5409 }
5387 rend = gtk_cell_renderer_text_new(); 5410 rend = gtk_cell_renderer_text_new();
5388 gtk_tree_view_column_pack_start(col, rend, TRUE); 5411 gtk_tree_view_column_pack_start(col, rend, TRUE);
5389 gtk_tree_view_column_add_attribute(col, rend, "text", z); 5412 gtk_tree_view_column_add_attribute(col, rend, "text", z+1);
5390 } 5413 }
5391 else if(flags[z] & DW_CFA_ULONG) 5414 else if(flags[z] & DW_CFA_ULONG)
5392 { 5415 {
5393 rend = gtk_cell_renderer_text_new(); 5416 rend = gtk_cell_renderer_text_new();
5394 gtk_tree_view_column_pack_start(col, rend, TRUE); 5417 gtk_tree_view_column_pack_start(col, rend, TRUE);
5395 gtk_tree_view_column_add_attribute(col, rend, "text", z); 5418 gtk_tree_view_column_add_attribute(col, rend, "text", z+1);
5396 } 5419 }
5397 else if(flags[z] & DW_CFA_TIME) 5420 else if(flags[z] & DW_CFA_TIME)
5398 { 5421 {
5399 rend = gtk_cell_renderer_text_new(); 5422 rend = gtk_cell_renderer_text_new();
5400 gtk_tree_view_column_pack_start(col, rend, TRUE); 5423 gtk_tree_view_column_pack_start(col, rend, TRUE);
5401 gtk_tree_view_column_add_attribute(col, rend, "text", z); 5424 gtk_tree_view_column_add_attribute(col, rend, "text", z+1);
5402 } 5425 }
5403 else if(flags[z] & DW_CFA_DATE) 5426 else if(flags[z] & DW_CFA_DATE)
5404 { 5427 {
5405 rend = gtk_cell_renderer_text_new(); 5428 rend = gtk_cell_renderer_text_new();
5406 gtk_tree_view_column_pack_start(col, rend, TRUE); 5429 gtk_tree_view_column_pack_start(col, rend, TRUE);
5407 gtk_tree_view_column_add_attribute(col, rend, "text", z); 5430 gtk_tree_view_column_add_attribute(col, rend, "text", z+1);
5408 } 5431 }
5432 gtk_tree_view_column_set_title(col, titles[z]);
5409 gtk_tree_view_append_column(GTK_TREE_VIEW (tree), col); 5433 gtk_tree_view_append_column(GTK_TREE_VIEW (tree), col);
5410 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(tree), col); 5434 gtk_tree_view_set_expander_column(GTK_TREE_VIEW(tree), col);
5411 } 5435 }
5412 /* Finish up */ 5436 /* Finish up */
5413 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE); 5437 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE);
5452 int dw_filesystem_setup(HWND handle, unsigned long *flags, char **titles, int count) 5476 int dw_filesystem_setup(HWND handle, unsigned long *flags, char **titles, int count)
5453 { 5477 {
5454 char **newtitles = malloc(sizeof(char *) * (count + 2)); 5478 char **newtitles = malloc(sizeof(char *) * (count + 2));
5455 unsigned long *newflags = malloc(sizeof(unsigned long) * (count + 2)); 5479 unsigned long *newflags = malloc(sizeof(unsigned long) * (count + 2));
5456 5480
5457 newtitles[0] = "Filename"; 5481 newtitles[0] = "Icon";
5458 newflags[0] = DW_CFA_STRINGANDICON | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR; 5482 newflags[0] = DW_CFA_BITMAPORICON | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR;
5483 newtitles[1] = "Filename";
5484 newflags[1] = DW_CFA_STRING | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR;
5459 5485
5460 memcpy(&newtitles[2], titles, sizeof(char *) * count); 5486 memcpy(&newtitles[2], titles, sizeof(char *) * count);
5461 memcpy(&newflags[2], flags, sizeof(unsigned long) * count); 5487 memcpy(&newflags[2], flags, sizeof(unsigned long) * count);
5462 5488
5463 _dw_container_setup(handle, newflags, newtitles, count + 1, 1, 1); 5489 _dw_container_setup(handle, newflags, newtitles, count + 1, 1, 1);
6190 GtkWidget *colorw, *ok_button, *cancel_button; 6216 GtkWidget *colorw, *ok_button, *cancel_button;
6191 int _locked_by_me = FALSE; 6217 int _locked_by_me = FALSE;
6192 DWDialog *dwwait; 6218 DWDialog *dwwait;
6193 GtkColorSelection *colorsel; 6219 GtkColorSelection *colorsel;
6194 GdkColor color = _internal_color(value); 6220 GdkColor color = _internal_color(value);
6195 GObject *part;
6196 unsigned long dw_color; 6221 unsigned long dw_color;
6197 6222
6198 DW_MUTEX_LOCK; 6223 DW_MUTEX_LOCK;
6199 6224
6200 /* The DW mutex should be sufficient for 6225 /* The DW mutex should be sufficient for
8572 else if(GTK_IS_COMBO_BOX(handle2)) 8597 else if(GTK_IS_COMBO_BOX(handle2))
8573 store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2)); 8598 store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
8574 8599
8575 if(store) 8600 if(store)
8576 { 8601 {
8577 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(handle2)); 8602 if(GTK_IS_TREE_VIEW(handle2))
8578 GList *list = gtk_tree_selection_get_selected_rows(sel, NULL);
8579 if(list)
8580 { 8603 {
8581 GtkTreePath *path = g_list_nth_data(list, 0); 8604 GtkTreeSelection *sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(handle2));
8582 gint *indices = gtk_tree_path_get_indices(path); 8605 GList *list = gtk_tree_selection_get_selected_rows(sel, NULL);
8606 if(list)
8607 {
8608 GtkTreePath *path = g_list_nth_data(list, 0);
8609 gint *indices = gtk_tree_path_get_indices(path);
8610
8611 if(indices)
8612 {
8613 retval = indices[0];
8614 }
8615
8616 g_list_foreach(list, (GFunc) gtk_tree_path_free, NULL);
8617 g_list_free(list);
8618 }
8619 }
8620 else
8621 {
8622 GtkTreeIter iter;
8623 GtkTreePath *path;
8624 gint *indices;
8583 8625
8626 gtk_combo_box_get_active_iter(GTK_COMBO_BOX(handle2), &iter);
8627 path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
8628 indices = gtk_tree_path_get_indices(path);
8629
8584 if(indices) 8630 if(indices)
8585 { 8631 {
8586 retval = indices[0]; 8632 retval = indices[0];
8587 } 8633 }
8588 8634 gtk_tree_path_free(path);
8589 g_list_foreach(list, (GFunc) gtk_tree_path_free, NULL);
8590 g_list_free(list);
8591 } 8635 }
8592 } 8636 }
8593 } 8637 }
8594 DW_MUTEX_UNLOCK; 8638 DW_MUTEX_UNLOCK;
8595 return retval; 8639 return retval;
8638 gtk_tree_selection_select_iter(sel, &iter); 8682 gtk_tree_selection_select_iter(sel, &iter);
8639 } 8683 }
8640 else 8684 else
8641 { 8685 {
8642 /* Deselect the item */ 8686 /* Deselect the item */
8643 gtk_tree_selection_deselect_iter(sel, &iter); 8687 gtk_tree_selection_unselect_iter(sel, &iter);
8644 } 8688 }
8645 } 8689 }
8646 } 8690 }
8647 } 8691 }
8648 DW_MUTEX_UNLOCK; 8692 DW_MUTEX_UNLOCK;
8669 handle2 = tmp; 8713 handle2 = tmp;
8670 } 8714 }
8671 if(handle2) 8715 if(handle2)
8672 { 8716 {
8673 /* Make sure it is the correct tree type */ 8717 /* Make sure it is the correct tree type */
8674 if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == _DW_TREE_TYPE_LISTBOX) 8718 if(GTK_IS_TREE_VIEW(handle2) && g_object_get_data(G_OBJECT(handle2), "_dw_tree_type") == GINT_TO_POINTER(_DW_TREE_TYPE_LISTBOX))
8675 store = (GtkTreeStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2)); 8719 store = (GtkListStore *)gtk_tree_view_get_model(GTK_TREE_VIEW(handle2));
8676 else if(GTK_IS_COMBO_BOX(handle2)) 8720 else if(GTK_IS_COMBO_BOX(handle2))
8677 store = (GtkTreeStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2)); 8721 store = (GtkListStore *)gtk_combo_box_get_model(GTK_COMBO_BOX(handle2));
8678 8722
8679 if(store) 8723 if(store)
8680 { 8724 {
8681 GtkTreeIter iter; 8725 GtkTreeIter iter;
8682 8726