X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Ffilesel.c;h=44f77a48461719f9d0b3756508d4f73c83f6e57f;hp=c7cf96a9d098b5a0c40bc516caee2311277e3aa3;hb=561628aa0791e6457137977362ed0ceaec6c8bc6;hpb=d518eefe676594b630ee8c9936796257f7b33130 diff --git a/src/filesel.c b/src/filesel.c index c7cf96a9d..44f77a484 100644 --- a/src/filesel.c +++ b/src/filesel.c @@ -33,6 +33,7 @@ static GtkWidget *filesel; static gboolean filesel_ack; +static gchar *filesel_oldfilename = NULL; static void filesel_create(const gchar *title, gboolean multiple_files); static void filesel_ok_cb(GtkWidget *widget, gpointer data); @@ -40,11 +41,15 @@ static void filesel_cancel_cb(GtkWidget *widget, gpointer data); static gint delete_event(GtkWidget *widget, GdkEventAny *event, gpointer data); static void key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data); -static void filesel_file_list_select_row(GtkCList *clist, gint row, gint col, - GdkEventButton *event, gpointer userdata); +static void filesel_file_list_select_row_multi(GtkCList *clist, gint row, gint col, + GdkEventButton *event, gpointer userdata); +static void filesel_file_list_select_row_single(GtkCList *clist, gint row, gint col, + GdkEventButton *event, gpointer userdata); -static void filesel_dir_list_select_row(GtkCList *clist, gint row, gint col, - GdkEventButton *event, gpointer userdata); +static void filesel_dir_list_select_row_multi(GtkCList *clist, gint row, gint col, + GdkEventButton *event, gpointer userdata); +static void filesel_dir_list_select_row_single(GtkCList *clist, gint row, gint col, + GdkEventButton *event, gpointer userdata); static GList *filesel_get_multiple_filenames(void); @@ -67,9 +72,11 @@ gchar *filesel_select_file(const gchar *title, const gchar *file) gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), cwd); - if (file) + if (file) { gtk_file_selection_set_filename(GTK_FILE_SELECTION(filesel), file); + filesel_oldfilename = g_strdup(file); + } gtk_widget_show(filesel); @@ -164,35 +171,46 @@ static void filesel_create(const gchar *title, gboolean multiple_files) GTK_SELECTION_MULTIPLE); gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->file_list), "select_row", - GTK_SIGNAL_FUNC(filesel_file_list_select_row), + GTK_SIGNAL_FUNC(filesel_file_list_select_row_multi), NULL); gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->file_list), "unselect_row", - GTK_SIGNAL_FUNC(filesel_file_list_select_row), + GTK_SIGNAL_FUNC(filesel_file_list_select_row_multi), NULL); gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->dir_list), "select_row", - GTK_SIGNAL_FUNC(filesel_dir_list_select_row), + GTK_SIGNAL_FUNC(filesel_dir_list_select_row_multi), + NULL); + } else { + gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->file_list), + "select_row", + GTK_SIGNAL_FUNC(filesel_file_list_select_row_single), NULL); - } - + gtk_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filesel)->dir_list), + "select_row", + GTK_SIGNAL_FUNC(filesel_dir_list_select_row_single), + NULL); + } } static void filesel_ok_cb(GtkWidget *widget, gpointer data) { filesel_ack = TRUE; + g_free(filesel_oldfilename); gtk_main_quit(); } static void filesel_cancel_cb(GtkWidget *widget, gpointer data) { filesel_ack = FALSE; + g_free(filesel_oldfilename); gtk_main_quit(); } static gint delete_event(GtkWidget *widget, GdkEventAny *event, gpointer data) { filesel_cancel_cb(NULL, NULL); + g_free(filesel_oldfilename); return TRUE; } @@ -206,8 +224,8 @@ static void key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data) * entry box to put there the selected file names in. we're not using these * entry box to get the selected file names. instead we use the clist selection. * the entry box is used only to retrieve dir name. */ -static void filesel_file_list_select_row(GtkCList *clist, gint row, gint col, - GdkEventButton *event, gpointer userdata) +static void filesel_file_list_select_row_multi(GtkCList *clist, gint row, gint col, + GdkEventButton *event, gpointer userdata) { /* simple implementation in which we clear the file entry and refill it */ GList *list = clist->selection; @@ -234,8 +252,8 @@ static void filesel_file_list_select_row(GtkCList *clist, gint row, gint col, #undef INVALID_FILENAME_CHARS } -static void filesel_dir_list_select_row(GtkCList *clist, gint row, gint col, - GdkEventButton *event, gpointer userdata) +static void filesel_dir_list_select_row_multi(GtkCList *clist, gint row, gint col, + GdkEventButton *event, gpointer userdata) { GtkEntry *entry = GTK_ENTRY(GTK_FILE_SELECTION(filesel)->selection_entry); GtkCList *file_list = GTK_CLIST(GTK_FILE_SELECTION(filesel)->file_list); @@ -245,6 +263,26 @@ static void filesel_dir_list_select_row(GtkCList *clist, gint row, gint col, gtk_clist_unselect_all(file_list); } +static void filesel_file_list_select_row_single(GtkCList *clist, gint row, gint col, + GdkEventButton *event, gpointer userdata) +{ + GtkEntry *entry = GTK_ENTRY(GTK_FILE_SELECTION(filesel)->selection_entry); + + g_free(filesel_oldfilename); + filesel_oldfilename = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); +} + +static void filesel_dir_list_select_row_single(GtkCList *clist, gint row, gint col, + GdkEventButton *event, gpointer userdata) +{ + GtkEntry *entry = GTK_ENTRY(GTK_FILE_SELECTION(filesel)->selection_entry); + + gtk_editable_delete_text(GTK_EDITABLE(entry), 0, -1); + if(filesel_oldfilename) { + gtk_entry_append_text(entry, filesel_oldfilename); + } +} + static GList *filesel_get_multiple_filenames(void) { /* as noted before we are not using the entry text when selecting