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", ""); } }
void archive_go_upper(struct_panel *panel) /* Переходим на уровень выше внутри архива */ { if (panel->archive_cwd[0] == '\0') /* Если на верхнем уровне архива - то покидаем его*/ leave_archive(panel); else /* А если нет - */ { char *slash=NULL, *path, *iter; trim_line(panel->archive_cwd); /* Удяляем последний символ (слэш) из текущего имени */ archive_cwd_prev=xconcat(basename(panel->archive_cwd),"/"); slash=strrchr(panel->archive_cwd, '/'); /* Ищем последний слэш в пути */ if (slash==NULL) /* Если значение пути вырождается в NULL (слэша больше не оказалось) то делаем archive_cwd нулевой строкой*/ panel->archive_cwd[0]='\0'; else /* А иначе просто обрезаем путь в архиве на один уровень */ *(slash+1)='\0'; if (panel == &top_panel) { write_config_string("top_panel.archive_cwd", panel->archive_cwd); top_panel.last_name[0]='\0'; write_config_string("top_panel.last_name", top_panel.last_name); } else { write_config_string("bottom_panel.archive_cwd", panel->archive_cwd); bottom_panel.last_name[0]='\0'; write_config_string("bottom_panel.last_name", bottom_panel.last_name); } update(panel); /* Перерисовываем список */ iter=iter_from_filename (archive_cwd_prev, panel); move_selection(iter, panel); /* И выделяем предыдущий каталог в архиве */ free(iter); path=xconcat_path_file(panel->archive_stack[panel->archive_depth],panel->archive_cwd); gtk_label_set_text (GTK_LABEL(panel->path_label), path); /* Пишем имя архива с путём в поле снизу */ free(path); } }