Mercurial > dwindows
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 /* |