discovered that running freeamp outside of the build tree caused an unresolved symbol old_path
This fixes it in ui/freeamp/unix/src/GTKFileSelector.cpp change extern char old_path[PATH_MAX]; to char old_path[PATH_MAX]; this patch includes that change. Anyone who can tell me how to access preference values from fileselector.cpp would be wonderful and greatly appreciated.
diff -urN -x corba -x CVS -x config.status -x configure -x config.h -x config.log -x Makefile* -x aclocal* -x config.cache ./freeamp/base/include/preferences.h ./freeamp-patched/base/include/preferences.h --- ./freeamp/base/include/preferences.h Tue Oct 16 01:23:08 2001 +++ ./freeamp-patched/base/include/preferences.h Sun Mar 31 17:23:11 2002 @@ -81,6 +81,7 @@ extern const char* kViewMusicBrowserPref; extern const char* kWelcomePref; extern const char* kPlayImmediatelyPref; +extern const char* kSetLastResumePref; extern const char* kNumberOfURLsToRememberPref; extern const char* kCDDevicePathPref; extern const char* kCheckCDAutomaticallyPref; diff -urN -x corba -x CVS -x config.status -x configure -x config.h -x config.log -x Makefile* -x aclocal* -x config.cache ./freeamp/base/src/preferences.cpp ./freeamp-patched/base/src/preferences.cpp --- ./freeamp/base/src/preferences.cpp Tue Oct 16 01:23:08 2001 +++ ./freeamp-patched/base/src/preferences.cpp Sun Mar 31 17:32:10 2002 @@ -79,6 +79,7 @@ const char* kWindowModePref = "WindowMode"; const char* kWelcomePref = "Welcome"; const char* kPlayImmediatelyPref = "PlayImmediately"; +const char* kSetLastResumePref = "SetLastResume"; const char* kNumberOfURLsToRememberPref = "NumberOfURLsToRemember"; const char* kCDDevicePathPref = "CDDevice"; const char* kCheckCDAutomaticallyPref = "AutoUpdateCD"; @@ -156,6 +157,7 @@ const bool kDefaultViewMusicBrowser = true; const bool kDefaultWelcome = true; const bool kDefaultPlayImmediately = true; +const bool kDefaultSetLastResume = true; const int32 kDefaultNumberOfURLsToRemember = 10; const char* kDefaultMBServer = "http://www.musicbrainz.org:80"; const bool kDefaultConvertUnderscoresToSpaces = true; @@ -346,6 +348,9 @@ if (GetPrefBoolean(kPlayImmediatelyPref, &dummyBool) == kError_NoPrefValue) SetPrefBoolean(kPlayImmediatelyPref, kDefaultPlayImmediately); + + if (GetPrefBoolean(kSetLastResumePref, &dummyBool) == kError_NoPrefValue) + SetPrefBoolean(kSetLastResumePref, kDefaultSetLastResume); if (GetPrefInt32(kNumberOfURLsToRememberPref, &dummyInt) == kError_NoPrefValue) SetPrefInt32(kNumberOfURLsToRememberPref, kDefaultNumberOfURLsToRemember); diff -urN -x corba -x CVS -x config.status -x configure -x config.h -x config.log -x Makefile* -x aclocal* -x config.cache ./freeamp/lmc/vorbis/src/vorbislmc.cpp ./freeamp-patched/lmc/vorbis/src/vorbislmc.cpp --- ./freeamp/lmc/vorbis/src/vorbislmc.cpp Wed Feb 13 03:11:49 2002 +++ ./freeamp-patched/lmc/vorbis/src/vorbislmc.cpp Sun Mar 31 19:19:00 2002 @@ -172,7 +172,7 @@ m_section = -1; m_pContext->prefs->GetPrefInt32(kOutputBufferSizePref, &iNewSize); - iNewSize = max(iNewSize, iInitialOutputBufferSize); + iNewSize = max(iNewSize, iMinimumOutputBufferSize); iNewSize *= 1024; result = m_pOutputBuffer->Resize(iNewSize, iNewSize / 6); diff -urN -x corba -x CVS -x config.status -x configure -x config.h -x config.log -x Makefile* -x aclocal* -x config.cache ./freeamp/ui/freeamp/unix/include/GTKPreferenceWindow.h ./freeamp-patched/ui/freeamp/unix/include/GTKPreferenceWindow.h --- ./freeamp/ui/freeamp/unix/include/GTKPreferenceWindow.h Tue Oct 16 01:03:41 2001 +++ ./freeamp-patched/ui/freeamp/unix/include/GTKPreferenceWindow.h Sun Mar 31 18:32:34 2002 @@ -77,6 +77,7 @@ bool useImages; bool savePlaylistOnExit; bool playImmediately; + bool setLastResume; bool allowMultipleInstances; string saveMusicDirectory; @@ -107,6 +108,7 @@ convertUnderscores == pref.convertUnderscores && allowMultipleInstances == pref.allowMultipleInstances && playImmediately == pref.playImmediately && + setLastResume == pref.setLastResume && useTextLabels == pref.useTextLabels && useImages == pref.useImages && savePlaylistOnExit == pref.savePlaylistOnExit && @@ -316,6 +318,7 @@ void SetToolbar(bool text, bool pics); void SaveOnExitToggle(int active); void PlayImmediatelyToggle(int active); + void SetLastResumeToggle(int active); void AllowMultipleToggle(int active); void ConvertUnderscoresToggle(int active); void ReclaimTypesToggle(int active); diff -urN -x corba -x CVS -x config.status -x configure -x config.h -x config.log -x Makefile* -x aclocal* -x config.cache ./freeamp/ui/freeamp/unix/src/GTKFileSelector.cpp ./freeamp-patched/ui/freeamp/unix/src/GTKFileSelector.cpp --- ./freeamp/ui/freeamp/unix/src/GTKFileSelector.cpp Wed May 24 13:08:34 2000 +++ ./freeamp-patched/ui/freeamp/unix/src/GTKFileSelector.cpp Sun Mar 31 19:23:54 2002 @@ -23,6 +23,9 @@ #include "GTKFileSelector.h" #include <unistd.h> +#include <dirent.h> + +char old_path[PATH_MAX]; GTKFileSelector::GTKFileSelector(const char *windowtitle) { @@ -51,6 +54,34 @@ p->CancelEvent(); } +string GTKrecursive_path(char subdirs[PATH_MAX], string returnpath,int *sub_rnum) +{ + DIR *dir=NULL; + struct dirent *current=NULL; + if ((dir = opendir(subdirs))!=NULL){ + current = readdir(dir); + current = readdir(dir); + while((current=readdir(dir))!=NULL){ + if(current->d_type==DT_DIR){ + char temp_subdir[PATH_MAX]; + strncpy(temp_subdir, subdirs,PATH_MAX); + strcat(temp_subdir,"/"); + strncat(temp_subdir,current->d_name,FILENAME_MAX); + returnpath = GTKrecursive_path(temp_subdir,returnpath,sub_rnum); + } + else { + returnpath += "\n"; + returnpath += subdirs; + returnpath += "/"; + returnpath += current->d_name; + sub_rnum++; + } + } + } + closedir(dir); + return (returnpath); +} + void GTKFileSelector::CancelEvent() { gtk_widget_destroy(filesel); @@ -64,6 +95,7 @@ char *raw_path = NULL; GList *row = GTK_CLIST(gfile->file_list)->row_list; gint rownum = 0; + gint sub_rnum = 0; char *temp, *path_temp; returnpath = gtk_file_selection_get_filename(gfile); @@ -78,23 +110,33 @@ tempdir[0] = '\0'; raw_path = gtk_entry_get_text(GTK_ENTRY(gfile->selection_entry)); - while (row) { - if (GTK_CLIST_ROW(row)->state == GTK_STATE_SELECTED) { - if (gtk_clist_get_cell_type(GTK_CLIST(gfile->file_list), rownum, 0) - == GTK_CELL_TEXT) { - gtk_clist_get_text(GTK_CLIST(gfile->file_list), rownum, 0, &temp); - if (!strcmp(temp, raw_path)) - goto next_iter; - returnpath += "\n"; - returnpath += path_temp; - returnpath += "/"; - returnpath += temp; - } - } - next_iter: - rownum++; - row = g_list_next(row); + strncpy(old_path,path_temp,PATH_MAX); + if(row){ + while (row) { + if (GTK_CLIST_ROW(row)->state == GTK_STATE_SELECTED) { + if (gtk_clist_get_cell_type(GTK_CLIST(gfile->file_list), rownum, 0) + == GTK_CELL_TEXT) { + gtk_clist_get_text(GTK_CLIST(gfile->file_list), rownum, 0, &temp); + if (!strcmp(temp, raw_path)) + goto next_iter; + returnpath += "\n"; + returnpath += path_temp; + returnpath += "/"; + returnpath += temp; + } + } + next_iter: + rownum++; + row = g_list_next(row); + } + } + else { + char subdirs[PATH_MAX]; + strncpy(subdirs,old_path,PATH_MAX); + returnpath=""; + returnpath = GTKrecursive_path(subdirs,returnpath,&sub_rnum); } + rownum += sub_rnum; gtk_widget_destroy(GTK_WIDGET(gfile)); free(path_temp); @@ -108,7 +150,8 @@ gdk_threads_enter(); filesel = gtk_file_selection_new(title.c_str()); - +// if(SetLastResume) + gtk_file_selection_set_filename (GTK_FILE_SELECTION (filesel), old_path); gtk_window_set_modal(GTK_WINDOW(filesel), TRUE); gtk_signal_connect(GTK_OBJECT(filesel), "destroy", GTK_SIGNAL_FUNC(filesel_destroy), (gpointer)runMain); diff -urN -x corba -x CVS -x config.status -x configure -x config.h -x config.log -x Makefile* -x aclocal* -x config.cache ./freeamp/ui/freeamp/unix/src/GTKPreferenceWindow.cpp ./freeamp-patched/ui/freeamp/unix/src/GTKPreferenceWindow.cpp --- ./freeamp/ui/freeamp/unix/src/GTKPreferenceWindow.cpp Tue Oct 16 01:03:41 2001 +++ ./freeamp-patched/ui/freeamp/unix/src/GTKPreferenceWindow.cpp Sun Mar 31 18:35:44 2002 @@ -447,6 +447,9 @@ prefs->GetPrefBoolean(kShowToolbarImagesPref, &values->useImages); prefs->GetPrefBoolean(kSaveCurrentPlaylistOnExitPref, &values->savePlaylistOnExit); prefs->GetPrefBoolean(kPlayImmediatelyPref, &values->playImmediately); + + prefs->GetPrefBoolean(kSetLastResumePref, &values->setLastResume); + prefs->GetPrefBoolean(kAllowMultipleInstancesPref, &values->allowMultipleInstances); if(kError_BufferTooSmall == prefs->GetPrefString(kSaveMusicDirPref, buffer, &size)) @@ -540,6 +543,9 @@ prefs->SetPrefBoolean(kShowToolbarImagesPref, values->useImages); prefs->SetPrefBoolean(kSaveCurrentPlaylistOnExitPref, values->savePlaylistOnExit); prefs->SetPrefBoolean(kPlayImmediatelyPref, values->playImmediately); + + prefs->SetPrefBoolean(kSetLastResumePref, values->setLastResume); + prefs->SetPrefBoolean(kAllowMultipleInstancesPref, values->allowMultipleInstances); prefs->SetPrefBoolean(kAskToReclaimFiletypesPref, values->askReclaimFiletypes); prefs->SetPrefBoolean(kReclaimFiletypesPref, values->reclaimFiletypes); @@ -657,6 +663,19 @@ p->PlayImmediatelyToggle(i); } +void GTKPreferenceWindow::SetLastResumeToggle(int active) +{ + proposedValues.setLastResume = active; + if(!firsttime) + gtk_widget_set_sensitive(applyButton,TRUE); +} + +static void set_last_toggle(GtkWidget *w, GTKPreferenceWindow *p) +{ + int i = GTK_TOGGLE_BUTTON(w)->active; + p->SetLastResumeToggle(i); +} + void GTKPreferenceWindow::AllowMultipleToggle(int active) { proposedValues.allowMultipleInstances = active; @@ -789,6 +808,14 @@ GTK_SIGNAL_FUNC(play_now_toggle), this); if (!originalValues.playImmediately) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE); + gtk_widget_show(check); + + check = gtk_check_button_new_with_label("Open File to Last Selected"); + gtk_box_pack_start(GTK_BOX(vbox), check, FALSE,FALSE,0); + gtk_signal_connect(GTK_OBJECT(check), "toggled", + GTK_SIGNAL_FUNC(set_last_toggle), this); + if(originalValues.setLastResume) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), TRUE); gtk_widget_show(check); frame = gtk_frame_new("Miscellaneous"); diff -urN -x corba -x CVS -x config.status -x configure -x config.h -x config.log -x Makefile* -x aclocal* -x config.cache ./freeamp/ui/musicbrowser/unix/src/fileselector.cpp ./freeamp-patched/ui/musicbrowser/unix/src/fileselector.cpp --- ./freeamp/ui/musicbrowser/unix/src/fileselector.cpp Thu Sep 28 04:08:03 2000 +++ ./freeamp-patched/ui/musicbrowser/unix/src/fileselector.cpp Sun Mar 31 18:24:01 2002 @@ -24,6 +24,7 @@ #include "config.h" #include <unistd.h> +#include <dirent.h> #ifdef __QNX__ #include <strings.h> @@ -32,6 +33,8 @@ #include "fileselector.h" #include "utility.h" +char old_path[PATH_MAX]="/\0"; + FileSelector::FileSelector(const char *windowtitle) { title = windowtitle; @@ -59,6 +62,34 @@ p->CancelEvent(); } +string recursive_path(char subdirs[PATH_MAX], string returnpath,int *sub_rnum) +{ + DIR *dir=NULL; + struct dirent *current=NULL; + if ((dir = opendir(subdirs))!=NULL){ + current = readdir(dir); + current = readdir(dir); + while((current=readdir(dir))!=NULL){ + if(current->d_type==DT_DIR){ + char temp_subdir[PATH_MAX]; + strncpy(temp_subdir, subdirs,PATH_MAX); + strcat(temp_subdir,"/"); + strncat(temp_subdir,current->d_name,FILENAME_MAX); + returnpath = recursive_path(temp_subdir,returnpath,sub_rnum); + } + else { + returnpath += "\n"; + returnpath += subdirs; + returnpath += "/"; + returnpath += current->d_name; + sub_rnum++; + } + } + } + closedir(dir); + return (returnpath); +} + void FileSelector::CancelEvent() { gtk_widget_destroy(filesel); @@ -72,6 +103,7 @@ char *raw_path = NULL; GList *row = GTK_CLIST(gfile->file_list)->row_list; gint rownum = 0; + gint sub_rnum = 0; char *temp, *path_temp; char *rawtext = gtk_entry_get_text(GTK_ENTRY(gfile->selection_entry)); @@ -79,7 +111,6 @@ !strncasecmp("rtp://", rawtext, 6)) { returnpath = strdup_new(rawtext); gtk_widget_destroy(GTK_WIDGET(gfile)); - ok = true; done = true; @@ -88,33 +119,41 @@ returnpath = gtk_file_selection_get_filename(gfile); path_temp = strdup(returnpath.c_str()); - + raw_path = gtk_entry_get_text(GTK_ENTRY(gfile->selection_entry)); char *tempdir = strrchr(path_temp, '/'); + strncpy(old_path,path_temp,PATH_MAX); if (!tempdir) { strcpy(path_temp, "./"); path_temp = (char *)realloc(path_temp, strlen(path_temp) + 1); } else tempdir[0] = '\0'; - - raw_path = gtk_entry_get_text(GTK_ENTRY(gfile->selection_entry)); - while (row) { - if (GTK_CLIST_ROW(row)->state == GTK_STATE_SELECTED) { - if (gtk_clist_get_cell_type(GTK_CLIST(gfile->file_list), rownum, 0) - == GTK_CELL_TEXT) { - gtk_clist_get_text(GTK_CLIST(gfile->file_list), rownum, 0, &temp); - if (!strcmp(temp, raw_path)) - goto next_iter; - returnpath += "\n"; - returnpath += path_temp; - returnpath += "/"; - returnpath += temp; - } - } - next_iter: - rownum++; - row = g_list_next(row); + if(row){ + while (row) { + if (GTK_CLIST_ROW(row)->state == GTK_STATE_SELECTED) { + if (gtk_clist_get_cell_type(GTK_CLIST(gfile->file_list), rownum, 0) + == GTK_CELL_TEXT) { + gtk_clist_get_text(GTK_CLIST(gfile->file_list), rownum, 0, &temp); + if (!strcmp(temp, raw_path)) + goto next_iter; + returnpath += "\n"; + returnpath += path_temp; + returnpath += "/"; + returnpath += temp; + } + } + next_iter: + rownum++; + row = g_list_next(row); + } + } + else { + char subdirs[PATH_MAX]; + strncpy(subdirs,old_path,PATH_MAX); + returnpath=""; + returnpath = recursive_path(subdirs, returnpath,&sub_rnum); } + rownum += sub_rnum; gtk_widget_destroy(GTK_WIDGET(gfile)); free(path_temp); @@ -124,11 +163,13 @@ bool FileSelector::Run(bool runMain) { + bool dummyBool; if (!runMain) gdk_threads_enter(); filesel = gtk_file_selection_new(title.c_str()); - +// if(GetPrefBoolean(kSetLastResumePref, &dummyBool)) + gtk_file_selection_set_filename (GTK_FILE_SELECTION (filesel), old_path); gtk_window_set_modal(GTK_WINDOW(filesel), TRUE); gtk_signal_connect(GTK_OBJECT(filesel), "destroy", GTK_SIGNAL_FUNC(filesel_destroy), (gpointer)runMain);
