void enter_archive(const char *name, struct_panel *panel, int update_config) { char *saved_work_dir=xgetcwd(NULL); #ifdef debug_printf printf("Entering into '%s'\n", name); #endif (void)chdir(panel->path); /* Переходим в каталог где лежит архив */ if (get_archive_list(name, panel->archive_list)) { char *text; if(update_config) { panel->archive_depth++; strcpy(panel->archive_stack[panel->archive_depth], name); if ( panel == &top_panel ) write_archive_stack("top_panel.archive_stack", &top_panel); else write_archive_stack("bottom_panel.archive_stack", &bottom_panel); (void)chdir(saved_work_dir); /* Переходим в каталог откуда нас дёрнули */ } update(panel); /* Строим список */ move_selection("1", panel); /* Переходим на первый же файл в списке, чтобы не прокручивать */ text=xconcat_path_file(panel->archive_stack[panel->archive_depth],panel->archive_cwd); gtk_label_set_text (GTK_LABEL(panel->path_label), text); /* Пишем имя архива с путём в поле снизу */ free(text); } free(saved_work_dir); }
void leave_archive(struct_panel *panel) { char *iter; TRACE("Leaving archive '%s' to dir '%s'\n",panel->archive_stack[panel->archive_depth], panel->path); panel->archive_depth=panel->archive_depth-1; archive_list_free(panel->archive_list); if (panel->archive_depth > 0) /* Если мы ешё не достигли ФС */ { (void)remove(panel->archive_stack[panel->archive_depth+1]); /* То удаляем архив который покинули - он был вложеным! */ enter_archive(panel->archive_stack[panel->archive_depth], panel, FALSE); } else { update(panel); /* Обновляем список файлов */ gtk_label_set_text (GTK_LABEL(panel->path_label), panel->path); /* Пишем текущий каталог в поле снизу */ } TRACE("move_selection call '%s'\n",panel->archive_stack[panel->archive_depth+1]); iter=iter_from_filename (panel->archive_stack[panel->archive_depth+1], panel); move_selection(iter, panel); /* И выбираем файл архива курсором FIXME: Сработает только если покинутый вложенный архив в корне родительского архива, или же при покидании архива в реальную ФС. FIXME: этот прискорбный баг породит глюки при автоматическом переходе в следующий каталог! */ free(iter); panel->archive_stack[panel->archive_depth+1][0]='\0'; /*Затираем имя покидаемого архива в стеке */ if (panel == &top_panel) { write_archive_stack("top_panel.archive_stack", &top_panel); write_config_string("top_panel.archive_cwd", ""); /* FIXME: По идее надо бы завести ещё и стек путей в архивах, но это геморно( */ } else { write_archive_stack("bottom_panel.archive_stack", &bottom_panel); write_config_string("bottom_panel.archive_cwd", ""); } }
int enter_archive(const char *name, struct_panel *panel, int update_config) { char *saved_work_dir=xgetcwd(NULL); TRACE("Entering into '%s'\n", name); if (chdir(panel->path) == -1) /* Переходим в каталог где лежит архив */ { char *message; asprintf(&message, UNABLE_TO_CHANGE_DIRECTORY_TO, panel->path, strerror(errno)); Message(ERROR, message); free (message); return FALSE; } if (access(name, R_OK) == -1 ) { char *message; asprintf(&message, UNABLE_TO_ACCESS_FILE, name, strerror(errno)); Message(ERROR, message); free (message); return FALSE; } int res = FALSE; if (archive_supported(name)) { char *text; if(update_config) { panel->archive_depth++; strcpy(panel->archive_stack[panel->archive_depth], name); if ( panel == &top_panel ) write_archive_stack("top_panel.archive_stack", &top_panel); else write_archive_stack("bottom_panel.archive_stack", &bottom_panel); (void)chdir(saved_work_dir); /* Переходим в каталог откуда нас дёрнули */ } panel->archive_list=archive_list_get(name); update(panel); /* Строим список */ move_selection("0", panel); /* Переходим на первый же файл в списке */ text=xconcat_path_file(panel->archive_stack[panel->archive_depth],panel->archive_cwd); gtk_label_set_text (GTK_LABEL(panel->path_label), text); /* Пишем имя архива с путём в поле снизу */ free(text); res = TRUE; } else { TRACE("Archive is unsupported: %s", name); } free(saved_work_dir); return res; }