comparison gtk/dw.c @ 482:89b1b40d7e12

Initial port of the OS/2 folder browser to unix. dw_tree_get_parent() seems to be broken in GTK 2.x at the moment... will see what the problem is.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Wed, 15 Oct 2003 21:31:14 +0000
parents 8832ad52486f
children 1cb1b87bbd30
comparison
equal deleted inserted replaced
481:97c2c560f829 482:89b1b40d7e12
14 #include <stdarg.h> 14 #include <stdarg.h>
15 #include <stdio.h> 15 #include <stdio.h>
16 #include <unistd.h> 16 #include <unistd.h>
17 #include <errno.h> 17 #include <errno.h>
18 #include <sys/time.h> 18 #include <sys/time.h>
19 #include <dirent.h>
20 #include <sys/stat.h>
19 #include "config.h" 21 #include "config.h"
20 #include <gdk/gdkkeysyms.h> 22 #include <gdk/gdkkeysyms.h>
21 #ifdef USE_IMLIB 23 #ifdef USE_IMLIB
22 #include <gdk_imlib.h> 24 #include <gdk_imlib.h>
23 #endif 25 #endif
4281 if(!handle || !item) 4283 if(!handle || !item)
4282 return text; 4284 return text;
4283 4285
4284 DW_MUTEX_LOCK; 4286 DW_MUTEX_LOCK;
4285 #if GTK_MAJOR_VERSION > 1 4287 #if GTK_MAJOR_VERSION > 1
4286 GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_tree_store"); 4288 GtkWidget *tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
4287 4289 GtkTreeModel *store;
4288 gtk_tree_model_get(store, (GtkTreeIter *)item, 0, &text, -1); 4290
4291 if(tree && GTK_IS_TREE_VIEW(tree) &&
4292 (store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_store")))
4293 gtk_tree_model_get(store, (GtkTreeIter *)item, 0, &text, -1);
4289 #else 4294 #else
4290 text = (char *)gtk_object_get_data(GTK_OBJECT(item), "_dw_text"); 4295 text = (char *)gtk_object_get_data(GTK_OBJECT(item), "_dw_text");
4291 #endif 4296 #endif
4292 DW_MUTEX_UNLOCK; 4297 DW_MUTEX_UNLOCK;
4293 return text; 4298 return text;
4307 if(!handle || !item) 4312 if(!handle || !item)
4308 return parent; 4313 return parent;
4309 4314
4310 DW_MUTEX_LOCK; 4315 DW_MUTEX_LOCK;
4311 #if GTK_MAJOR_VERSION > 1 4316 #if GTK_MAJOR_VERSION > 1
4312 GtkTreeModel *store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(handle), "_dw_tree_store"); 4317 GtkWidget *tree = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
4313 4318 GtkTreeModel *store;
4314 gtk_tree_model_get(store, (GtkTreeIter *)item, 4, &parent, -1); 4319
4320 if(tree && GTK_IS_TREE_VIEW(tree) &&
4321 (store = (GtkTreeModel *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_tree_store")))
4322 {
4323 gtk_tree_model_get(store, (GtkTreeIter *)item, 4, &parent, -1);
4324 }
4315 #else 4325 #else
4316 parent = (HTREEITEM)gtk_object_get_data(GTK_OBJECT(item), "_dw_parent"); 4326 parent = (HTREEITEM)gtk_object_get_data(GTK_OBJECT(item), "_dw_parent");
4317 #endif 4327 #endif
4318 DW_MUTEX_UNLOCK; 4328 DW_MUTEX_UNLOCK;
4319 return parent; 4329 return parent;
6032 6042
6033 *handle = dlopen(newname, RTLD_NOW); 6043 *handle = dlopen(newname, RTLD_NOW);
6034 if(*handle == NULL) 6044 if(*handle == NULL)
6035 { 6045 {
6036 strncpy(errorbuf, dlerror(), 1024); 6046 strncpy(errorbuf, dlerror(), 1024);
6037 printf("%s\n", errorbuf); 6047 printf("%s\n", errorbuf);
6038 sprintf(newname, "lib%s.so", name); 6048 sprintf(newname, "lib%s.so", name);
6039 *handle = dlopen(newname, RTLD_NOW); 6049 *handle = dlopen(newname, RTLD_NOW);
6040 } 6050 }
6041 6051
6042 free(newname); 6052 free(newname);
7738 _dw_file_active = 0; 7748 _dw_file_active = 0;
7739 dw_dialog_dismiss(dwwait, NULL); 7749 dw_dialog_dismiss(dwwait, NULL);
7740 return FALSE; 7750 return FALSE;
7741 } 7751 }
7742 7752
7753 /* The next few functions are support functions for the UNIX folder browser */
7754 static void _populate_directory(HWND tree, HTREEITEM parent, char *path)
7755 {
7756 struct dirent *dent;
7757 HTREEITEM item;
7758 DIR *hdir;
7759
7760 if((hdir = opendir(path)))
7761 {
7762 while((dent = readdir(hdir)))
7763 {
7764 struct stat bleah;
7765
7766 stat(dent->d_name, &bleah);
7767
7768 if(S_ISDIR(bleah.st_mode) && strcmp(dent->d_name, ".") && strcmp(dent->d_name, ".."))
7769 {
7770 int len = strlen(path);
7771 char *folder = malloc(len + strlen(dent->d_name) + 2);
7772 HTREEITEM tempitem;
7773
7774 strcpy(folder, path);
7775 strcpy(&folder[len-1], dent->d_name);
7776
7777 item = dw_tree_insert(tree, dent->d_name, 0, parent, (void *)parent);
7778 tempitem = dw_tree_insert(tree, "", 0, item, 0);
7779 dw_tree_set_data(tree, item, (void *)tempitem);
7780
7781 strcat(folder, "/");
7782
7783 free(folder);
7784 }
7785 }
7786 closedir(hdir);
7787 }
7788 }
7789
7790 static int DWSIGNAL _dw_folder_ok_func(HWND window, void *data)
7791 {
7792 DWDialog *dwwait = (DWDialog *)data;
7793 void *treedata;
7794
7795 if(!dwwait)
7796 return FALSE;
7797
7798 treedata = dw_window_get_data((HWND)dwwait->data, "_dw_tree_selected");
7799 dw_window_destroy((HWND)dwwait->data);
7800 dw_dialog_dismiss(dwwait, treedata);
7801 return FALSE;
7802 }
7803
7804 static int DWSIGNAL _dw_folder_cancel_func(HWND window, void *data)
7805 {
7806 DWDialog *dwwait = (DWDialog *)data;
7807
7808 if(!dwwait)
7809 return FALSE;
7810
7811 dw_window_destroy((HWND)dwwait->data);
7812 dw_dialog_dismiss(dwwait, NULL);
7813 return FALSE;
7814 }
7815
7816 static char *_tree_folder(HWND tree, HTREEITEM item)
7817 {
7818 char *folder=strdup("");
7819 HTREEITEM parent = item;
7820
7821 while(parent)
7822 {
7823 char *temp, *text = dw_tree_get_title(tree, parent);
7824
7825 if(text)
7826 {
7827 temp = malloc(strlen(text) + strlen(folder) + 3);
7828 strcpy(temp, text);
7829 if(strcmp(text, "/"))
7830 strcat(temp, "/");
7831 strcat(temp, folder);
7832 free(folder);
7833 folder = temp;
7834 }
7835 parent = dw_tree_get_parent(tree, parent);
7836 }
7837 return folder;
7838 }
7839
7840 static int DWSIGNAL _item_select(HWND window, HTREEITEM item, char *text, void *data, void *itemdata)
7841 {
7842 DWDialog *dwwait = (DWDialog *)data;
7843 char *treedata = (char *)dw_window_get_data((HWND)dwwait->data, "_dw_tree_selected");
7844
7845 text = text; itemdata = itemdata;
7846 if(treedata)
7847 free(treedata);
7848
7849 treedata = _tree_folder(window, item);
7850 dw_window_set_data((HWND)dwwait->data, "_dw_tree_selected", (void *)treedata);
7851
7852 return FALSE;
7853 }
7854
7855 static int DWSIGNAL _tree_expand(HWND window, HTREEITEM item, void *data)
7856 {
7857 DWDialog *dwwait = (DWDialog *)data;
7858 HWND tree = (HWND)dw_window_get_data((HWND)dwwait->data, "_dw_tree");
7859 HTREEITEM tempitem = (HTREEITEM)dw_tree_get_data(tree, item);
7860
7861 if(tempitem)
7862 {
7863 char *folder = _tree_folder(tree, item);
7864
7865 dw_tree_set_data(tree, item, 0);
7866 dw_tree_delete(tree, tempitem);
7867
7868 if(*folder)
7869 _populate_directory(tree, item, folder);
7870 free(folder);
7871 }
7872
7873 return FALSE;
7874 }
7875
7743 /* 7876 /*
7744 * Opens a file dialog and queries user selection. 7877 * Opens a file dialog and queries user selection.
7745 * Parameters: 7878 * Parameters:
7746 * title: Title bar text for dialog. 7879 * title: Title bar text for dialog.
7747 * defpath: The default path of the open dialog. 7880 * defpath: The default path of the open dialog.
7756 { 7889 {
7757 GtkWidget *filew; 7890 GtkWidget *filew;
7758 int _locked_by_me = FALSE; 7891 int _locked_by_me = FALSE;
7759 DWDialog *dwwait; 7892 DWDialog *dwwait;
7760 7893
7761 DW_MUTEX_LOCK; 7894 if(flags == DW_DIRECTORY_OPEN)
7762 7895 {
7763 /* The DW mutex should be sufficient for 7896 HWND window, hbox, vbox, tree, button;
7764 * insuring no thread changes this unknowingly. 7897 HTREEITEM item, tempitem;
7765 */ 7898
7766 if(_dw_file_active) 7899 window = dw_window_new( HWND_DESKTOP, title, DW_FCF_SHELLPOSITION | DW_FCF_TITLEBAR | DW_FCF_SIZEBORDER | DW_FCF_MINMAX);
7767 { 7900
7901 vbox = dw_box_new(DW_VERT, 5);
7902
7903 dw_box_pack_start(window, vbox, 0, 0, TRUE, TRUE, 0);
7904
7905 tree = dw_tree_new(60);
7906
7907 dw_box_pack_start(vbox, tree, 1, 1, TRUE, TRUE, 0);
7908 dw_window_set_data(window, "_dw_tree", (void *)tree);
7909
7910 hbox = dw_box_new(DW_HORZ, 0);
7911
7912 dw_box_pack_start(vbox, hbox, 0, 0, TRUE, FALSE, 0);
7913
7914 dwwait = dw_dialog_new((void *)window);
7915
7916 dw_signal_connect(tree, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_item_select), (void *)dwwait);
7917 dw_signal_connect(tree, DW_SIGNAL_TREE_EXPAND, DW_SIGNAL_FUNC(_tree_expand), (void *)dwwait);
7918
7919 button = dw_button_new("Ok", 1001L);
7920 dw_box_pack_start(hbox, button, 50, 30, TRUE, FALSE, 3);
7921 dw_signal_connect(button, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(_dw_folder_ok_func), (void *)dwwait);
7922
7923 button = dw_button_new("Cancel", 1002L);
7924 dw_box_pack_start(hbox, button, 50, 30, TRUE, FALSE, 3);
7925 dw_signal_connect(button, DW_SIGNAL_CLICKED, DW_SIGNAL_FUNC(_dw_folder_cancel_func), (void *)dwwait);
7926
7927 item = dw_tree_insert(tree, "/", 0, NULL, 0);
7928 tempitem = dw_tree_insert(tree, "", 0, item, 0);
7929 dw_tree_set_data(tree, item, (void *)tempitem);
7930
7931 dw_window_set_usize(window, 225, 300);
7932 dw_window_show(window);
7933 }
7934 else
7935 {
7936 DW_MUTEX_LOCK;
7937
7938 /* The DW mutex should be sufficient for
7939 * insuring no thread changes this unknowingly.
7940 */
7941 if(_dw_file_active)
7942 {
7943 DW_MUTEX_UNLOCK;
7944 return NULL;
7945 }
7946
7947 _dw_file_active = 1;
7948
7949 filew = gtk_file_selection_new(title);
7950
7951 dwwait = dw_dialog_new((void *)filew);
7952
7953 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", (GtkSignalFunc) _gtk_file_ok, dwwait);
7954 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button), "clicked", (GtkSignalFunc) _gtk_file_cancel, dwwait);
7955
7956 if(defpath)
7957 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), defpath);
7958
7959 gtk_widget_show(filew);
7960
7768 DW_MUTEX_UNLOCK; 7961 DW_MUTEX_UNLOCK;
7769 return NULL; 7962 }
7770 }
7771
7772 _dw_file_active = 1;
7773
7774 filew = gtk_file_selection_new(title);
7775
7776 dwwait = dw_dialog_new((void *)filew);
7777
7778 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", (GtkSignalFunc) _gtk_file_ok, dwwait);
7779 gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button), "clicked", (GtkSignalFunc) _gtk_file_cancel, dwwait);
7780
7781 if(defpath)
7782 gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), defpath);
7783
7784 gtk_widget_show(filew);
7785
7786 DW_MUTEX_UNLOCK;
7787
7788 return (char *)dw_dialog_wait(dwwait); 7963 return (char *)dw_dialog_wait(dwwait);
7789 } 7964 }
7790 7965
7791 7966
7792 /* 7967 /*