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 config_save(char* filename, PCONFIGURATION config) { FILE* fd = fopen(filename, "w"); if (fd == NULL) { fprintf(stderr, "Can't open configuration file: %s\n", filename); exit(EXIT_FAILURE); } if (config->stream.width != 1280) write_config_int(fd, "width", config->stream.width); if (config->stream.height != 720) write_config_int(fd, "height", config->stream.height); if (config->stream.fps != 60) write_config_int(fd, "fps", config->stream.fps); if (config->stream.bitrate != -1) write_config_int(fd, "bitrate", config->stream.bitrate); if (config->stream.packetSize != 1024) write_config_int(fd, "packetsize", config->stream.packetSize); if (!config->sops) write_config_bool(fd, "sops", config->sops); if (config->localaudio) write_config_bool(fd, "localaudio", config->localaudio); if (strcmp(config->app, "Steam") != 0) write_config_string(fd, "app", config->app); fclose(fd); }
void archive_enter_subdir(const char *subdir, struct_panel *panel) { char *path, *temp; TRACE("archive_enter_subdir '%s'\n", subdir); temp=panel->archive_cwd; panel->archive_cwd=xconcat(temp, subdir); free(temp); if ( panel == &top_panel ) write_config_string("top_panel.archive_cwd", panel->archive_cwd); else write_config_string("bottom_panel.archive_cwd", panel->archive_cwd); update(panel); /* Перерисовываем список */ move_selection("0", panel); /* Выбираем первый элемент */ 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); }
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); } }
int find_next_archive_directory(struct_panel *panel) { char **directories_list; int i=0; char *slash=NULL, *up_dir; up_dir=strdup(panel->archive_cwd); trim_line(up_dir); /* Удяляем последний символ (слэш) из текущего имени */ slash=strrchr(up_dir, '/'); /* Ищем последний слэш в пути */ if (slash==NULL) /* Если значение пути вырождается в NULL (слэша больше не оказалось) */ up_dir[0]='\0'; /* То делаем archive_cwd нулевой строкой */ else /* А иначе просто обрезаем путь в архиве на один уровень */ *(slash+1)='\0'; directories_list=archive_get_directories_list(panel, up_dir); while (TRUE) { if (directories_list[i]==NULL) { free(directories_list); return FALSE; /* Если достигли конца списка */ } else { #ifdef debug_printf printf ("Checking '%s', need '%s'\n", directories_list[i], panel->archive_cwd); #endif } if (strcmp (directories_list[i], panel->archive_cwd) == 0) /* Сравниваем строку с текущим каталогом */ { if (directories_list[i+1][0] == '\0') /* Если следующая строка пустая - */ { #ifdef debug_printf printf ("Matched dirname '%s', stay here\n", directories_list[i]); #endif free(directories_list[i]); free(directories_list[i+1]); free(directories_list); return FALSE; /* То возвращаем что переход не удался */ } else { free(panel->archive_cwd); panel->archive_cwd=strdup(directories_list[i+1]); if ( panel == &top_panel ) write_config_string("top_panel.archive_cwd", panel->archive_cwd); else write_config_string("bottom_panel.archive_cwd", panel->archive_cwd); #ifdef debug_printf printf("JUMPING TO %s\n", panel->archive_cwd); #endif /*Очищаем оставшийся список каталогов*/ do free(directories_list[i++]); while (directories_list[i] != NULL); free(directories_list); return TRUE; /* Иначе возвращаем успех */ } } #ifdef debug_printf printf ("NOT matched dirname '%s', need '%s'\n", directories_list[i], panel->archive_cwd); #endif free(directories_list[i]); i++; } #ifdef debug_printf printf ("Dirname not matched!\n"); #endif /*Очищаем оставшийся список каталогов*/ do free(directories_list[i++]); while (directories_list[i] != NULL); free(directories_list); return FALSE; /* И возвращаем значение текущего каталога */ }