diff options
Diffstat (limited to 'x11-libs/gtk+/files/gtk+-1.2.8-advanced-gtkfilesel.patch')
-rw-r--r-- | x11-libs/gtk+/files/gtk+-1.2.8-advanced-gtkfilesel.patch | 1407 |
1 files changed, 1407 insertions, 0 deletions
diff --git a/x11-libs/gtk+/files/gtk+-1.2.8-advanced-gtkfilesel.patch b/x11-libs/gtk+/files/gtk+-1.2.8-advanced-gtkfilesel.patch new file mode 100644 index 0000000..278e99a --- /dev/null +++ b/x11-libs/gtk+/files/gtk+-1.2.8-advanced-gtkfilesel.patch @@ -0,0 +1,1407 @@ +*** ../old/gtk+-1.2.8/gtk/gtkfilesel.h Sun Feb 13 01:59:45 2000 +--- gtk/gtkfilesel.h Wed Jul 26 10:19:19 2000 +*************** +*** 57,69 **** +--- 57,73 ---- + GtkWidget *selection_text; + GtkWidget *main_vbox; + GtkWidget *ok_button; + GtkWidget *cancel_button; + GtkWidget *help_button; ++ ++ /* These are not used. Just fillers in the class structure */ + GtkWidget *history_pulldown; + GtkWidget *history_menu; + GList *history_list; ++ /* ***************** */ ++ + GtkWidget *fileop_dialog; + GtkWidget *fileop_entry; + gchar *fileop_file; + gpointer cmpl_state; + +*************** +*** 71,81 **** + GtkWidget *fileop_del_file; + GtkWidget *fileop_ren_file; + + GtkWidget *button_area; + GtkWidget *action_area; +! + }; + + struct _GtkFileSelectionClass + { + GtkWindowClass parent_class; +--- 75,92 ---- + GtkWidget *fileop_del_file; + GtkWidget *fileop_ren_file; + + GtkWidget *button_area; + GtkWidget *action_area; +! +! GtkWidget *history_combo; +! GList *prev_history; +! GList *next_history; +! GtkWidget *mask_entry; +! gchar *mask; +! gchar *saved_entry; +! + }; + + struct _GtkFileSelectionClass + { + GtkWindowClass parent_class; +*** ../old/gtk+-1.2.8/gtk/gtkfilesel.c Thu Jan 27 09:39:54 2000 +--- gtk/gtkfilesel.c Wed Jul 26 10:19:19 2000 +*************** +*** 52,61 **** +--- 52,63 ---- + #include "gtkmenu.h" + #include "gtkmenuitem.h" + #include "gtkoptionmenu.h" + #include "gtkclist.h" + #include "gtkdialog.h" ++ #include "gtkcombo.h" ++ #include "gtkframe.h" + #include "gtkintl.h" + + #define DIR_LIST_WIDTH 180 + #define DIR_LIST_HEIGHT 180 + #define FILE_LIST_WIDTH 180 +*************** +*** 150,159 **** +--- 152,165 ---- + */ + gchar *text; + gint is_a_completion; + gint is_directory; + ++ gint file_size; ++ gint file_time; ++ gint uid; ++ gint gid; + /* Private fields + */ + gint text_alloc; + }; + +*************** +*** 304,318 **** + gint column, + GdkEventButton *bevent, + gpointer user_data); + + static void gtk_file_selection_dir_button (GtkWidget *widget, +! gint row, +! gint column, + GdkEventButton *bevent, + gpointer data); + + static void gtk_file_selection_populate (GtkFileSelection *fs, + gchar *rel_path, + gint try_complete); + static void gtk_file_selection_abort (GtkFileSelection *fs); + +--- 310,330 ---- + gint column, + GdkEventButton *bevent, + gpointer user_data); + + static void gtk_file_selection_dir_button (GtkWidget *widget, +! gint row, +! gint column, + GdkEventButton *bevent, + gpointer data); + ++ static void gtk_file_selection_undir_button (GtkWidget *widget, ++ gint row, ++ gint column, ++ GdkEventButton *bevent, ++ gpointer data); ++ + static void gtk_file_selection_populate (GtkFileSelection *fs, + gchar *rel_path, + gint try_complete); + static void gtk_file_selection_abort (GtkFileSelection *fs); + +*************** +*** 321,337 **** +--- 333,447 ---- + + static void gtk_file_selection_create_dir (GtkWidget *widget, gpointer data); + static void gtk_file_selection_delete_file (GtkWidget *widget, gpointer data); + static void gtk_file_selection_rename_file (GtkWidget *widget, gpointer data); + ++ static gboolean gtk_file_selection_history_combo_callback (GtkWidget *widget, GdkEventKey *event, gpointer data); ++ static gboolean gtk_file_selection_history_combo_list_key_handler(GtkWidget *widget, ++ GdkEventKey *event, ++ gpointer user_data); ++ static gboolean gtk_file_selection_history_combo_list_callback (GtkWidget *thelist, ++ GdkEventButton *event, ++ gpointer user_data); ++ static void gtk_file_selection_mask_entry_callback (GtkWidget *widget, gpointer data); ++ static void gtk_file_selection_create_dir (GtkWidget *widget, gpointer data); ++ static void gtk_file_selection_delete_file (GtkWidget *widget, gpointer data); ++ static void gtk_file_selection_rename_file (GtkWidget *widget, gpointer data); ++ static void gtk_file_selection_home_button (GtkWidget *widget, gpointer data); ++ static void gtk_file_selection_up_button (GtkWidget *widget, gpointer data); ++ static void gtk_file_selection_prev_button (GtkWidget *widget, gpointer data); ++ static void gtk_file_selection_next_button (GtkWidget *widget, gpointer data); ++ static void gtk_file_selection_refresh_button (GtkWidget *widget, gpointer data); ++ ++ static gint gtk_file_selection_match_char (gchar, gchar *mask); ++ static gint gtk_file_selection_match_mask (gchar *,gchar *); + + + static GtkWindowClass *parent_class = NULL; + + /* Saves errno when something cmpl does fails. */ + static gint cmpl_errno; + ++ /* General notes: ++ * Make prev and next inactive if their respective * ++ * histories are empty. ++ * Add facilities for handling hidden files and * ++ * directories * ++ * Add an api to access the mask, and hidden files * ++ * check box? (prob not in 1.2.x series) * ++ */ ++ ++ /* Routine for applying mask to filenames * ++ * Need to be optimized to minimize recursion * ++ * help the for loop by looking for the next * ++ * instance of the mask character following * ++ * the '*'. ei *.c -- look for '.' * ++ * Also, swap all *? pairs (-> ?*), as that * ++ * will make it possible to look ahead (? * ++ * makes it very nondeterministic as in *?.c * ++ * which really is ?*.c * ++ * Allow multiply masks, separted by commas * ++ * Allow more flexible [] handling (ie [a-zA-Z] * ++ * * ++ */ ++ static gint gtk_file_selection_match_char (gchar text, gchar *mask){ ++ gchar *maskc; ++ gint x; ++ gint s; ++ ++ if (mask[0] == '[') ++ { ++ if (!strchr (mask,']')) return 0; ++ maskc = g_strdup(mask + 1); /* get the portion of mask inside []*/ ++ ++ (*(strchr (maskc,']'))) = 0; ++ s = strlen ((char *)maskc); ++ ++ for (x = 0; x < s; x++){ ++ if (text == maskc[x]) ++ { ++ g_free (maskc); ++ return s + 2; ++ } ++ } ++ g_free (maskc); ++ return 0; ++ } ++ ++ if (mask[0] == '?') return 1; ++ if (mask[0] == text) return 1; ++ ++ return 0; ++ } ++ ++ ++ static gint gtk_file_selection_match_mask (gchar *text, gchar *mask){ ++ ++ int mc; ++ int tc; ++ ++ tc = 0; mc = 0; ++ ++ if (mask[0] == 0 && text[0] == 0) return 1; ++ ++ if (mask[0] == '*') ++ { ++ for (tc = 0; tc <= strlen(text); tc++) ++ { ++ if (gtk_file_selection_match_mask (text + tc, mask + 1)) ++ return 1; ++ } ++ return 0; ++ } ++ mc = gtk_file_selection_match_char (text[0], mask); ++ ++ if(mc) ++ return gtk_file_selection_match_mask (text + 1, mask + mc); ++ else ++ return 0; ++ } ++ + GtkType + gtk_file_selection_get_type (void) + { + static GtkType file_selection_type = 0; + +*************** +*** 372,389 **** +--- 482,514 ---- + { + GtkWidget *entry_vbox; + GtkWidget *label; + GtkWidget *list_hbox; + GtkWidget *confirm_area; ++ GtkWidget *vbox; ++ GtkWidget *hbox; + GtkWidget *pulldown_hbox; + GtkWidget *scrolled_win; ++ GtkWidget *mask_label; ++ GtkWidget *bigframe; ++ GtkWidget *label_lookingin; ++ GtkWidget *up_button; ++ GtkWidget *home_button; ++ GtkWidget *prev_button; ++ GtkWidget *next_button; ++ GtkWidget *refresh_button; + + char *dir_title [2]; + char *file_title [2]; + + filesel->cmpl_state = cmpl_init_state (); + ++ filesel->mask=NULL; ++ filesel->prev_history=NULL; ++ filesel->next_history=NULL; ++ filesel->saved_entry=NULL; ++ + /* The dialog-sized vertical box */ + filesel->main_vbox = gtk_vbox_new (FALSE, 10); + gtk_container_set_border_width (GTK_CONTAINER (filesel), 10); + gtk_container_add (GTK_CONTAINER (filesel), filesel->main_vbox); + gtk_widget_show (filesel->main_vbox); +*************** +*** 397,440 **** + gtk_widget_show (filesel->button_area); + + gtk_file_selection_show_fileop_buttons(filesel); + + /* hbox for pulldown menu */ +! pulldown_hbox = gtk_hbox_new (TRUE, 5); + gtk_box_pack_start (GTK_BOX (filesel->main_vbox), pulldown_hbox, FALSE, FALSE, 0); + gtk_widget_show (pulldown_hbox); + +! /* Pulldown menu */ +! filesel->history_pulldown = gtk_option_menu_new (); +! gtk_widget_show (filesel->history_pulldown); +! gtk_box_pack_start (GTK_BOX (pulldown_hbox), filesel->history_pulldown, +! FALSE, FALSE, 0); +! + /* The horizontal box containing the directory and file listboxes */ + list_hbox = gtk_hbox_new (FALSE, 5); +! gtk_box_pack_start (GTK_BOX (filesel->main_vbox), list_hbox, TRUE, TRUE, 0); + gtk_widget_show (list_hbox); + + /* The directories clist */ + dir_title[0] = _("Directories"); + dir_title[1] = NULL; + filesel->dir_list = gtk_clist_new_with_titles (1, (gchar**) dir_title); + gtk_widget_set_usize (filesel->dir_list, DIR_LIST_WIDTH, DIR_LIST_HEIGHT); + gtk_signal_connect (GTK_OBJECT (filesel->dir_list), "select_row", +! (GtkSignalFunc) gtk_file_selection_dir_button, + (gpointer) filesel); + gtk_clist_column_titles_passive (GTK_CLIST (filesel->dir_list)); + + scrolled_win = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (scrolled_win), filesel->dir_list); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); +! gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5); +! gtk_box_pack_start (GTK_BOX (list_hbox), scrolled_win, TRUE, TRUE, 0); + gtk_widget_show (filesel->dir_list); + gtk_widget_show (scrolled_win); + + /* The files clist */ + file_title[0] = _("Files"); + file_title[1] = NULL; + filesel->file_list = gtk_clist_new_with_titles (1, (gchar**) file_title); + gtk_widget_set_usize (filesel->file_list, FILE_LIST_WIDTH, FILE_LIST_HEIGHT); +--- 522,654 ---- + gtk_widget_show (filesel->button_area); + + gtk_file_selection_show_fileop_buttons(filesel); + + /* hbox for pulldown menu */ +! pulldown_hbox = gtk_hbox_new (FALSE, 5); + gtk_box_pack_start (GTK_BOX (filesel->main_vbox), pulldown_hbox, FALSE, FALSE, 0); + gtk_widget_show (pulldown_hbox); + +! /* The combo box that replaces the pulldown menu */ +! label_lookingin = gtk_label_new (_("Looking in:")); +! gtk_widget_show (label_lookingin); +! gtk_box_pack_start (GTK_BOX (pulldown_hbox), label_lookingin, FALSE, FALSE, 0); +! +! filesel->history_combo = gtk_combo_new(); +! gtk_widget_show(filesel->history_combo); +! gtk_combo_set_value_in_list(GTK_COMBO(filesel->history_combo),FALSE,FALSE); +! gtk_box_pack_start (GTK_BOX(pulldown_hbox),filesel->history_combo, +! TRUE,TRUE, 0); +! gtk_signal_connect(GTK_OBJECT(((GtkCombo *)filesel->history_combo)->entry),"key-press-event", +! (GtkSignalFunc) gtk_file_selection_history_combo_callback, +! (gpointer) filesel); +! +! gtk_signal_connect(GTK_OBJECT(((GtkCombo *)filesel->history_combo)->list),"button-press-event", +! (GtkSignalFunc) gtk_file_selection_history_combo_list_callback, +! (gpointer) filesel); +! +! gtk_signal_connect(GTK_OBJECT(((GtkCombo *)filesel->history_combo)->list),"key-press-event", +! (GtkSignalFunc) gtk_file_selection_history_combo_list_key_handler, +! (gpointer) filesel); +! +! /* frame to put the following hbox in */ +! bigframe = gtk_frame_new (NULL); +! gtk_widget_show (bigframe); +! gtk_box_pack_start (GTK_BOX (filesel->main_vbox), bigframe, TRUE, TRUE, 0); +! + /* The horizontal box containing the directory and file listboxes */ + list_hbox = gtk_hbox_new (FALSE, 5); +! gtk_container_add (GTK_CONTAINER(bigframe), list_hbox); +! gtk_container_set_border_width (GTK_CONTAINER (list_hbox), 5); + gtk_widget_show (list_hbox); + ++ /* vbox to put the buttons and directory listing in */ ++ vbox = gtk_vbox_new (FALSE, 0); ++ gtk_widget_show (vbox); ++ gtk_box_pack_start (GTK_BOX (list_hbox), vbox, FALSE, FALSE, 0); ++ ++ hbox = gtk_hbox_new (FALSE, 0); ++ gtk_widget_show (hbox); ++ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); ++ ++ home_button = gtk_button_new_with_label (_("Home")); ++ gtk_widget_show (home_button); ++ gtk_signal_connect (GTK_OBJECT (home_button), "clicked", ++ (GtkSignalFunc) gtk_file_selection_home_button, ++ (gpointer) filesel); ++ gtk_box_pack_start (GTK_BOX (hbox), home_button, TRUE,TRUE, 0); ++ ++ prev_button = gtk_button_new_with_label (_("Prev")); ++ gtk_signal_connect (GTK_OBJECT (prev_button), "clicked", ++ (GtkSignalFunc) gtk_file_selection_prev_button, ++ (gpointer) filesel); ++ gtk_widget_show (prev_button); ++ gtk_box_pack_start (GTK_BOX (hbox), prev_button, TRUE,TRUE, 0); ++ ++ up_button = gtk_button_new_with_label (_("Up")); ++ gtk_signal_connect (GTK_OBJECT (up_button), "clicked", ++ (GtkSignalFunc) gtk_file_selection_up_button, ++ (gpointer) filesel); ++ gtk_widget_show (up_button); ++ gtk_box_pack_start (GTK_BOX (hbox), up_button, TRUE,TRUE, 0); ++ ++ next_button = gtk_button_new_with_label (_("Next")); ++ gtk_widget_show (next_button); ++ gtk_signal_connect (GTK_OBJECT (next_button), "clicked", ++ (GtkSignalFunc) gtk_file_selection_next_button, ++ (gpointer) filesel); ++ gtk_box_pack_start (GTK_BOX (hbox), next_button, TRUE,TRUE, 0); ++ ++ refresh_button = gtk_button_new_with_label (_("Refresh")); ++ gtk_widget_show (refresh_button); ++ gtk_signal_connect (GTK_OBJECT (refresh_button), "clicked", ++ (GtkSignalFunc) gtk_file_selection_refresh_button, ++ (gpointer) filesel); ++ gtk_box_pack_start (GTK_BOX (hbox), refresh_button, TRUE, TRUE, 0); ++ + /* The directories clist */ + dir_title[0] = _("Directories"); + dir_title[1] = NULL; + filesel->dir_list = gtk_clist_new_with_titles (1, (gchar**) dir_title); + gtk_widget_set_usize (filesel->dir_list, DIR_LIST_WIDTH, DIR_LIST_HEIGHT); + gtk_signal_connect (GTK_OBJECT (filesel->dir_list), "select_row", +! (GtkSignalFunc) gtk_file_selection_dir_button, +! (gpointer) filesel); +! gtk_signal_connect (GTK_OBJECT (filesel->dir_list), "unselect_row", +! (GtkSignalFunc) gtk_file_selection_undir_button, + (gpointer) filesel); + gtk_clist_column_titles_passive (GTK_CLIST (filesel->dir_list)); + + scrolled_win = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (scrolled_win), filesel->dir_list); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); +! gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE,TRUE, 5); + gtk_widget_show (filesel->dir_list); + gtk_widget_show (scrolled_win); + ++ /* vbox area for mask entry and files clist */ ++ vbox = gtk_vbox_new (FALSE, 0); ++ gtk_widget_show (vbox); ++ gtk_box_pack_start (GTK_BOX (list_hbox), vbox, TRUE, TRUE, 0); ++ ++ hbox = gtk_hbox_new (FALSE, 5); ++ gtk_widget_show (hbox); ++ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); ++ ++ mask_label = gtk_label_new (_("Mask:")); ++ gtk_widget_show (mask_label); ++ gtk_box_pack_start (GTK_BOX (hbox), mask_label, FALSE, FALSE, 0); ++ ++ filesel->mask_entry = gtk_entry_new (); ++ gtk_widget_show (filesel->mask_entry); ++ gtk_signal_connect(GTK_OBJECT(filesel->mask_entry),"activate", ++ (GtkSignalFunc) gtk_file_selection_mask_entry_callback, ++ (gpointer) filesel); ++ gtk_box_pack_start (GTK_BOX (hbox),filesel->mask_entry, TRUE, TRUE, 0); ++ ++ + /* The files clist */ + file_title[0] = _("Files"); + file_title[1] = NULL; + filesel->file_list = gtk_clist_new_with_titles (1, (gchar**) file_title); + gtk_widget_set_usize (filesel->file_list, FILE_LIST_WIDTH, FILE_LIST_HEIGHT); +*************** +*** 445,456 **** + + scrolled_win = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (scrolled_win), filesel->file_list); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); +! gtk_container_set_border_width (GTK_CONTAINER (scrolled_win), 5); +! gtk_box_pack_start (GTK_BOX (list_hbox), scrolled_win, TRUE, TRUE, 0); + gtk_widget_show (filesel->file_list); + gtk_widget_show (scrolled_win); + + /* action area for packing buttons into. */ + filesel->action_area = gtk_hbox_new (TRUE, 0); +--- 659,669 ---- + + scrolled_win = gtk_scrolled_window_new (NULL, NULL); + gtk_container_add (GTK_CONTAINER (scrolled_win), filesel->file_list); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_win), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); +! gtk_box_pack_start (GTK_BOX (vbox), scrolled_win, TRUE, TRUE, 5); + gtk_widget_show (filesel->file_list); + gtk_widget_show (scrolled_win); + + /* action area for packing buttons into. */ + filesel->action_area = gtk_hbox_new (TRUE, 0); +*************** +*** 653,698 **** + + void + gtk_file_selection_complete (GtkFileSelection *filesel, + const gchar *pattern) + { + g_return_if_fail (filesel != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); + g_return_if_fail (pattern != NULL); + + if (filesel->selection_entry) + gtk_entry_set_text (GTK_ENTRY (filesel->selection_entry), pattern); +! gtk_file_selection_populate (filesel, (gchar*) pattern, TRUE); + } + + static void + gtk_file_selection_destroy (GtkObject *object) + { + GtkFileSelection *filesel; + GList *list; +- HistoryCallbackArg *callback_arg; + + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (object)); + + filesel = GTK_FILE_SELECTION (object); + + if (filesel->fileop_dialog) +! gtk_widget_destroy (filesel->fileop_dialog); + +! if (filesel->history_list) + { +! list = filesel->history_list; + while (list) +! { +! callback_arg = list->data; +! g_free (callback_arg->directory); +! g_free (callback_arg); + list = list->next; +! } +! g_list_free (filesel->history_list); +! filesel->history_list = NULL; + } + + cmpl_free_state (filesel->cmpl_state); + filesel->cmpl_state = NULL; + +--- 866,949 ---- + + void + gtk_file_selection_complete (GtkFileSelection *filesel, + const gchar *pattern) + { ++ gchar *new_pattern; ++ gint x; ++ + g_return_if_fail (filesel != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (filesel)); + g_return_if_fail (pattern != NULL); + + if (filesel->selection_entry) + gtk_entry_set_text (GTK_ENTRY (filesel->selection_entry), pattern); +! +! if(strchr(pattern,'*') || strchr(pattern,'?')) +! { +! for(x=strlen(pattern);x>=0;x--) +! { +! if(pattern[x]=='/') break; +! } +! gtk_entry_set_text(GTK_ENTRY(filesel->mask_entry),g_strdup(pattern+x+1)); +! +! if(filesel->mask) g_free(filesel->mask); +! +! filesel->mask=g_strdup(pattern+x+1); +! new_pattern=g_strdup(pattern); +! new_pattern[x+1]=0; +! gtk_file_selection_populate (filesel, (gchar*) new_pattern, TRUE); +! g_free(new_pattern); +! } +! else +! { +! gtk_file_selection_populate (filesel, (gchar*) pattern, TRUE); +! } + } + + static void + gtk_file_selection_destroy (GtkObject *object) + { + GtkFileSelection *filesel; + GList *list; + + g_return_if_fail (object != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (object)); + + filesel = GTK_FILE_SELECTION (object); + + if (filesel->fileop_dialog) +! gtk_widget_destroy (filesel->fileop_dialog); + +! if (filesel->next_history) + { +! list = filesel->next_history; + while (list) +! { +! g_free (list->data); + list = list->next; +! } +! } +! g_list_free (filesel->next_history); +! filesel->next_history = NULL; +! +! if (filesel->prev_history) +! { +! list = filesel->prev_history; +! while (list) +! { +! g_free (list->data); +! list = list->next; +! } +! } +! g_list_free (filesel->prev_history); +! filesel->prev_history = NULL; +! +! if (filesel->mask) +! { +! g_free (filesel->mask); +! filesel->mask = NULL; + } + + cmpl_free_state (filesel->cmpl_state); + filesel->cmpl_state = NULL; + +*************** +*** 1091,1103 **** + char *text; + + g_return_val_if_fail (widget != NULL, FALSE); + g_return_val_if_fail (event != NULL, FALSE); + + if (event->keyval == GDK_Tab) + { +- fs = GTK_FILE_SELECTION (user_data); + text = gtk_entry_get_text (GTK_ENTRY (fs->selection_entry)); + + text = g_strdup (text); + + gtk_file_selection_populate (fs, text, TRUE); +--- 1342,1355 ---- + char *text; + + g_return_val_if_fail (widget != NULL, FALSE); + g_return_val_if_fail (event != NULL, FALSE); + ++ fs = GTK_FILE_SELECTION (user_data); ++ + if (event->keyval == GDK_Tab) + { + text = gtk_entry_get_text (GTK_ENTRY (fs->selection_entry)); + + text = g_strdup (text); + + gtk_file_selection_populate (fs, text, TRUE); +*************** +*** 1106,1217 **** + + gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event"); + + return TRUE; + } + + return FALSE; + } + + + static void +! gtk_file_selection_history_callback (GtkWidget *widget, gpointer data) +! { + GtkFileSelection *fs = data; +- HistoryCallbackArg *callback_arg; + GList *list; + + g_return_if_fail (fs != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); + +! list = fs->history_list; +! +! while (list) { +! callback_arg = list->data; +! +! if (callback_arg->menu_item == widget) +! { +! gtk_file_selection_populate (fs, callback_arg->directory, FALSE); +! break; +! } +! +! list = list->next; +! } + } + +! static void +! gtk_file_selection_update_history_menu (GtkFileSelection *fs, +! gchar *current_directory) +! { +! HistoryCallbackArg *callback_arg; +! GtkWidget *menu_item; + GList *list; +! gchar *current_dir; +! gint dir_len; +! gint i; +! + g_return_if_fail (fs != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); +- g_return_if_fail (current_directory != NULL); +- +- list = fs->history_list; + +! if (fs->history_menu) + { +! while (list) { +! callback_arg = list->data; +! g_free (callback_arg->directory); +! g_free (callback_arg); +! list = list->next; +! } +! g_list_free (fs->history_list); +! fs->history_list = NULL; + +- gtk_widget_destroy (fs->history_menu); + } +! +! fs->history_menu = gtk_menu_new(); + +! current_dir = g_strdup (current_directory); + +! dir_len = strlen (current_dir); + +! for (i = dir_len; i >= 0; i--) + { +! /* the i == dir_len is to catch the full path for the first +! * entry. */ +! if ( (current_dir[i] == '/') || (i == dir_len)) +! { +! /* another small hack to catch the full path */ +! if (i != dir_len) +! current_dir[i + 1] = '\0'; +! menu_item = gtk_menu_item_new_with_label (current_dir); +! +! callback_arg = g_new (HistoryCallbackArg, 1); +! callback_arg->menu_item = menu_item; +! +! /* since the autocompletion gets confused if you don't +! * supply a trailing '/' on a dir entry, set the full +! * (current) path to "" which just refreshes the filesel */ +! if (dir_len == i) { +! callback_arg->directory = g_strdup (""); +! } else { +! callback_arg->directory = g_strdup (current_dir); +! } +! +! fs->history_list = g_list_append (fs->history_list, callback_arg); +! +! gtk_signal_connect (GTK_OBJECT (menu_item), "activate", +! (GtkSignalFunc) gtk_file_selection_history_callback, +! (gpointer) fs); +! gtk_menu_append (GTK_MENU (fs->history_menu), menu_item); +! gtk_widget_show (menu_item); + } + } + +! gtk_option_menu_set_menu (GTK_OPTION_MENU (fs->history_pulldown), +! fs->history_menu); + g_free (current_dir); + } + + static void + gtk_file_selection_file_button (GtkWidget *widget, +--- 1358,1617 ---- + + gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event"); + + return TRUE; + } ++ if (fs->saved_entry) ++ { ++ gtk_clist_unselect_all ((GtkCList *) (fs->dir_list)); ++ gtk_entry_set_text(GTK_ENTRY(fs->selection_entry),fs->saved_entry); ++ g_free (fs->saved_entry); ++ fs->saved_entry = NULL; ++ } ++ + + return FALSE; + } + ++ static void ++ gtk_file_selection_home_button (GtkWidget *widget, gpointer data){ ++ GList *list; ++ ++ GtkFileSelection *fs=data; ++ ++ list = fs->next_history; ++ if (list) ++ { ++ g_free (list->data); ++ list = list->next; ++ } ++ g_list_free (fs->next_history); ++ fs->next_history = NULL; ++ ++ gtk_file_selection_populate (fs,"~/",FALSE); ++ } + + static void +! gtk_file_selection_up_button (GtkWidget *widget, gpointer data){ + GtkFileSelection *fs = data; + GList *list; + + g_return_if_fail (fs != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); + +! list = fs->next_history; +! if (list) +! { +! g_free (list->data); +! list = list->next; +! } +! g_list_free (fs->next_history); +! fs->next_history = NULL; +! +! gtk_file_selection_populate (fs, "../", FALSE); /*change directories. */ +! + } + +! static void +! gtk_file_selection_prev_button (GtkWidget *widget, gpointer data){ +! GtkFileSelection *fs = data; + GList *list; +! GList *first; +! gchar *path; +! + g_return_if_fail (fs != NULL); + g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); + +! list = fs->prev_history; +! +! if (list && g_list_length(list) > 1) + { +! first = list; /* get first element */ +! list = list->next; /* pop off current directory */ +! +! list->prev = NULL; /* make this the new head. */ +! +! fs->prev_history = list; /* update prev_history list */ +! fs->next_history = g_list_prepend(fs->next_history,first->data); /* put it on next_history */ +! +! first->next = NULL; /* orphan the old first node */ +! g_list_free (first); /* free the node (data is now in use by next_history) */ +! +! +! +! path = g_malloc(strlen(list->data)+4); /* plenty of space */ +! strcpy(path,list->data); /* get the 2nd path in the history */ +! strcat(path,"/"); /* append a '/' */ +! gtk_file_selection_populate (fs, path, FALSE); /* change directories. */ +! g_free (path); +! } +! } +! +! static void +! gtk_file_selection_next_button (GtkWidget *widget, gpointer data){ +! GtkFileSelection *fs = data; +! GList *list; +! GList *first; +! gchar *path; +! +! g_return_if_fail (fs != NULL); +! g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); +! +! list = fs->next_history; +! +! if (list && g_list_length(list) > 0) +! { +! first = list; /*get first element*/ +! list = list->next; /*pop off current directory*/ +! +! if (list) +! list->prev = NULL; +! +! fs->next_history = list; /*update prev_history list*/ +! +! path = g_malloc(strlen(first->data)+4); /*plenty of space*/ +! strcpy(path,first->data); +! strcat(path,"/"); /*append a / */ +! gtk_file_selection_populate (fs, path, FALSE); /*change directories.*/ +! g_free(path); +! +! first->next = NULL; /* orphan the old first node */ +! g_list_free (first); /* free the node (data is now in use by next_history) */ + + } +! } + +! void static +! gtk_file_selection_refresh_button (GtkWidget *widget, gpointer data){ +! GtkFileSelection *fs = data; + +! g_return_if_fail (fs != NULL); +! g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); +! +! gtk_file_selection_populate (fs,"",FALSE); +! } + +! static void +! gtk_file_selection_mask_entry_callback (GtkWidget *widget, gpointer data){ +! GtkFileSelection *fs = data; +! +! if(fs->mask) +! g_free (fs->mask); +! +! fs->mask = g_strdup(gtk_entry_get_text (GTK_ENTRY(fs->mask_entry))); +! +! if (strlen(fs->mask) == 0) + { +! g_free (fs->mask); +! fs->mask = NULL; +! } +! +! gtk_file_selection_refresh_button (widget,data); +! } +! +! static gboolean gtk_file_selection_history_combo_list_key_handler(GtkWidget *widget, +! GdkEventKey *event, +! gpointer user_data) +! { +! /* +! g_print("Key pressed! \n"); +! */ +! +! return TRUE; +! } +! +! static gboolean gtk_file_selection_history_combo_list_callback (GtkWidget *thelist, +! GdkEventButton *event, +! gpointer user_data) +! { +! +! GtkFileSelection *fs = user_data; +! GList *list; +! gchar *path; +! +! list = fs->next_history; +! if(list) +! { +! g_free (list->data); +! list = list->next; +! } +! g_list_free (fs->next_history); +! fs->next_history = NULL; +! +! path = g_malloc(strlen(gtk_entry_get_text(GTK_ENTRY (((GtkCombo *)fs->history_combo)->entry)))+4); +! strcpy (path,gtk_entry_get_text(GTK_ENTRY( ((GtkCombo *)fs->history_combo)->entry))); +! strcat (path,"/"); +! +! gtk_file_selection_populate (fs,path,TRUE); +! +! g_free (path); +! +! return TRUE; +! } +! +! static gboolean +! gtk_file_selection_history_combo_callback (GtkWidget *widget, GdkEventKey *event, gpointer data) +! { +! GtkEntry *entry=(GtkEntry *)widget; +! GtkFileSelection *fs=data; +! GList *list; +! gchar *path; +! +! g_return_val_if_fail (fs != NULL,FALSE); +! g_return_val_if_fail (GTK_IS_FILE_SELECTION (fs),FALSE); +! +! +! if (event->keyval == GDK_Return) +! { +! list = fs->next_history; +! if (list) +! { +! g_free (list->data); +! list = list->next; + } ++ g_list_free (fs->next_history); ++ fs->next_history = NULL; ++ ++ path = g_malloc(strlen(gtk_entry_get_text(entry))+4); ++ strcpy (path,gtk_entry_get_text(entry)); ++ strcat (path,"/"); ++ gtk_file_selection_populate (fs,path,TRUE); ++ g_free (path); ++ gtk_signal_emit_stop_by_name (GTK_OBJECT (widget), "key_press_event"); ++ return TRUE; + } ++ else ++ { ++ return FALSE; ++ } ++ ++ } ++ ++ static void ++ gtk_file_selection_update_history_menu (GtkFileSelection *fs, ++ gchar *current_directory) ++ { ++ gchar *current_dir; + +! g_return_if_fail (fs != NULL); +! g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); +! g_return_if_fail (current_directory != NULL); +! +! current_dir = g_strdup (current_directory); +! +! if(fs->prev_history) +! { +! if (strcmp((fs->prev_history)->data,current_dir)) +! { /*if this item isn't on the top of the list */ +! fs->prev_history = g_list_prepend(fs->prev_history,g_strdup(current_dir)); +! } +! } else { +! fs->prev_history = g_list_prepend(fs->prev_history,g_strdup(current_dir)); +! } +! +! gtk_combo_set_popdown_strings (GTK_COMBO (fs->history_combo),fs->prev_history); +! + g_free (current_dir); + } + + static void + gtk_file_selection_file_button (GtkWidget *widget, +*************** +*** 1245,1255 **** + gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); + break; + } + else + gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); +! + g_free (filename); + } + } + + static void +--- 1645,1655 ---- + gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); + break; + } + else + gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); +! + g_free (filename); + } + } + + static void +*************** +*** 1257,1266 **** +--- 1657,1667 ---- + gint row, + gint column, + GdkEventButton *bevent, + gpointer user_data) + { ++ GList *list; + GtkFileSelection *fs = NULL; + gchar *filename, *temp = NULL; + + g_return_if_fail (GTK_IS_CLIST (widget)); + +*************** +*** 1275,1293 **** + { + if (bevent) + switch (bevent->type) + { + case GDK_2BUTTON_PRESS: + gtk_file_selection_populate (fs, filename, FALSE); + break; +! + default: +! gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); + break; + } + else + gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); + + g_free (filename); + } + } + +--- 1676,1758 ---- + { + if (bevent) + switch (bevent->type) + { + case GDK_2BUTTON_PRESS: ++ list = fs->next_history; ++ if (list) ++ { ++ g_free (list->data); ++ list = list->next; ++ } ++ g_list_free (fs->next_history); ++ fs->next_history = NULL; ++ + gtk_file_selection_populate (fs, filename, FALSE); ++ gtk_entry_set_text(GTK_ENTRY(fs->selection_entry),fs->saved_entry); ++ g_free (fs->saved_entry); ++ fs->saved_entry = NULL; + break; +! + default: +! /* here we need to add the "filename" to the beginning of what's already +! in the entry. Save what's in the entry, then restore it on the double click +! */ +! if (fs->saved_entry) g_free (fs->saved_entry); +! fs->saved_entry=g_strdup(gtk_entry_get_text(GTK_ENTRY (fs->selection_entry))); +! +! temp=g_strconcat(filename,fs->saved_entry,NULL); +! gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), temp); +! g_free (temp); +! + break; + } + else + gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); ++ ++ g_free (filename); ++ } ++ } ++ ++ static void ++ gtk_file_selection_undir_button (GtkWidget *widget, ++ gint row, ++ gint column, ++ GdkEventButton *bevent, ++ gpointer user_data) ++ { ++ GtkFileSelection *fs = NULL; ++ gchar *filename, *temp = NULL; ++ ++ g_return_if_fail (GTK_IS_CLIST (widget)); ++ ++ fs = GTK_FILE_SELECTION (user_data); ++ g_return_if_fail (fs != NULL); ++ g_return_if_fail (GTK_IS_FILE_SELECTION (fs)); ++ ++ gtk_clist_get_text (GTK_CLIST (fs->dir_list), row, 0, &temp); ++ filename = g_strdup (temp); ++ ++ if (filename) ++ { ++ if (bevent) ++ switch (bevent->type) ++ { ++ default: ++ /* here we need to add the "filename" to the beginning of what's already ++ in the entry. Save what's in the entry, then restore it on the double click ++ */ ++ if (fs->saved_entry) ++ { ++ gtk_entry_set_text (GTK_ENTRY (fs->selection_entry),fs->saved_entry); ++ g_free (fs->saved_entry); ++ fs->saved_entry = NULL; ++ } ++ break; ++ } ++ else ++ gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), filename); //????? + + g_free (filename); + } + } + +*************** +*** 1344,1388 **** + gtk_clist_set_column_width(GTK_CLIST(fs->file_list),0,file_list_width); + + while (poss) + { + if (cmpl_is_a_completion (poss)) +! { +! possible_count += 1; +! +! filename = cmpl_this_completion (poss); + + text[0] = filename; + +! if (cmpl_is_directory (poss)) +! { +! if (strcmp (filename, "./") != 0 && +! strcmp (filename, "../") != 0) + { + int width = gdk_string_width(fs->dir_list->style->font, + filename); + row = gtk_clist_append (GTK_CLIST (fs->dir_list), text); + if(width > dir_list_width) + { + dir_list_width = width; + gtk_clist_set_column_width(GTK_CLIST(fs->dir_list),0, + width); + } +! } + } +! else + { +! int width = gdk_string_width(fs->file_list->style->font, +! filename); +! row = gtk_clist_append (GTK_CLIST (fs->file_list), text); +! if(width > file_list_width) +! { +! file_list_width = width; +! gtk_clist_set_column_width(GTK_CLIST(fs->file_list),0, +! width); +! } +! } + } + + poss = cmpl_next_completion (cmpl_state); + } + +--- 1809,1871 ---- + gtk_clist_set_column_width(GTK_CLIST(fs->file_list),0,file_list_width); + + while (poss) + { + if (cmpl_is_a_completion (poss)) +! { +! possible_count += 1; +! +! filename = cmpl_this_completion (poss); + + text[0] = filename; + +! if (cmpl_is_directory (poss)) +! { +! if (strcmp (filename, "./") != 0 && +! strcmp (filename, "../") != 0) + { + int width = gdk_string_width(fs->dir_list->style->font, + filename); + row = gtk_clist_append (GTK_CLIST (fs->dir_list), text); + if(width > dir_list_width) + { + dir_list_width = width; + gtk_clist_set_column_width(GTK_CLIST(fs->dir_list),0, + width); + } +! } + } +! else + { +! if(fs->mask) +! { +! if (gtk_file_selection_match_mask(filename,fs->mask)) +! { +! int width = gdk_string_width(fs->file_list->style->font, +! filename); +! row = gtk_clist_append (GTK_CLIST (fs->file_list), text); +! if(width > file_list_width) +! { +! file_list_width = width; +! gtk_clist_set_column_width(GTK_CLIST(fs->file_list),0, +! width); +! } +! } +! } +! else +! { +! int width = gdk_string_width(fs->file_list->style->font, +! filename); +! row = gtk_clist_append (GTK_CLIST (fs->file_list), text); +! if(width > file_list_width) +! { +! file_list_width = width; +! gtk_clist_set_column_width(GTK_CLIST(fs->file_list),0, +! width); +! } +! } +! } + } + + poss = cmpl_next_completion (cmpl_state); + } + +*************** +*** 1430,1440 **** + } + } + else + { + if (fs->selection_entry) +! gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), ""); + } + + if (!did_recurse) + { + if (fs->selection_entry) +--- 1913,1925 ---- + } + } + else + { + if (fs->selection_entry) +! /* Here we need to take the old filename and keep it!*/ +! /*gtk_entry_set_text (GTK_ENTRY (fs->selection_entry), "");*/ +! ; + } + + if (!did_recurse) + { + if (fs->selection_entry) +*************** +*** 1448,1462 **** + + gtk_label_set_text (GTK_LABEL (fs->selection_text), sel_text); + g_free (sel_text); + } + +! if (fs->history_pulldown) +! { +! gtk_file_selection_update_history_menu (fs, cmpl_reference_position (cmpl_state)); +! } +! + } + } + + static void + gtk_file_selection_abort (GtkFileSelection *fs) +--- 1933,1944 ---- + + gtk_label_set_text (GTK_LABEL (fs->selection_text), sel_text); + g_free (sel_text); + } + +! gtk_file_selection_update_history_menu (fs, cmpl_reference_position (cmpl_state)); +! + } + } + + static void + gtk_file_selection_abort (GtkFileSelection *fs) +*************** +*** 2758,2762 **** +--- 3240,3306 ---- + if(err == CMPL_ERRNO_TOO_LONG) + return "Name too long"; + else + return g_strerror (err); + } ++ ++ ++ /* Testing area */ ++ #ifdef TORRIE_DEBUG ++ ++ /* Get the selected filename and print it to the console */ ++ void file_ok_sel( GtkWidget *w, ++ GtkFileSelection *fs ) ++ { ++ g_print ("%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs))); ++ } ++ ++ void destroy( GtkWidget *widget, ++ gpointer data ) ++ { ++ gtk_main_quit (); ++ } ++ ++ int main( int argc, ++ char *argv[] ) ++ { ++ GtkWidget *filew; ++ ++ gtk_init (&argc, &argv); ++ ++ /* Create a new file selection widget */ ++ filew = gtk_file_selection_new ("Michael's Glorious File Selector"); ++ // gtk_file_selection_complete(GTK_FILE_SELECTION(filew),"bob"); ++ ++ ++ gtk_signal_connect (GTK_OBJECT (filew), "destroy", ++ (GtkSignalFunc) destroy, &filew); ++ /* Connect the ok_button to file_ok_sel function */ ++ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (filew)->ok_button), ++ "clicked", (GtkSignalFunc) file_ok_sel, filew ); ++ ++ /* Connect the cancel_button to destroy the widget */ ++ gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION ++ (filew)->cancel_button), ++ "clicked", (GtkSignalFunc) gtk_widget_destroy, ++ GTK_OBJECT (filew)); ++ ++ ++ gtk_widget_show(filew); ++ ++ /* ++ g_print("%d",gtk_file_selection_match_mask("mask.c","m*.c")); ++ g_print("%d",gtk_file_selection_match_mask("mask.c","m???.c")); ++ g_print("%d",gtk_file_selection_match_mask("mask.c","m??*.c")); ++ g_print("%d",gtk_file_selection_match_mask("mask.cout","m*.c")); ++ g_print("%d",gtk_file_selection_match_mask("mask.cout","m*.c???")); ++ g_print("%d",gtk_file_selection_match_mask("mask.cout","m*.c*")); ++ g_print("%d",gtk_file_selection_match_mask("mask.cout","n*.c???")); ++ g_print("%d",gtk_file_selection_match_mask("mask.c","[mn]*")); ++ g_print("%d",gtk_file_selection_match_mask("COPYING","*.xpm")); ++ */ ++ gtk_main (); ++ ++ return 0; ++ } ++ /* example-end */ ++ #endif |