diff --git a/src/bin/tyls.c b/src/bin/tyls.c index 86472965..7e8644c1 100644 --- a/src/bin/tyls.c +++ b/src/bin/tyls.c @@ -725,6 +725,162 @@ list_dir(const char *dir, Tyls_Options *options) EINA_LIST_FREE(files, s) free(s); } +static Eina_List *files_list = NULL; + +static void +list_file(const char *dir, Tyls_Options *options EINA_UNUSED) +{ + char *file = strdup(dir); + files_list = eina_list_append(files_list, file); +} + +static void +flush_file(Tyls_Options *options) +{ + Eina_List *l; + char *s, **names, *s2; + int maxlen = 0, i, num, stuff; + + if (!files_list) return; + names = calloc(eina_list_count(files_list) * 2, sizeof(char *)); + if (!names) return; + i = 0; + EINA_LIST_FOREACH(files_list, l, s) + { + int len; + + s2 = strrchr(s, '/'); + if (!s2) continue; + s2++; + len = eina_unicode_utf8_get_len(s2); + if (len > maxlen) maxlen = len; + names[i] = s; + i++; + } + num = i; + stuff = 0; + if (options->mode == SMALL) stuff += 2; + else if (options->mode == MEDIUM) stuff += 4; + stuff += 5; // xxxx[ /K/M/G/T/P...] + stuff += 1; // spacer at start + // name + stuff += 1; // type [@/*/|/=...] + stuff += 1; // spacer + maxlen += stuff; + if (maxlen > 0) + { + int rows; + int cols = tw / maxlen; + + if (cols < 1) cols = 1; + if (cols == 1) + { + maxlen--; + stuff--; + } + if (cols > num) cols = num; + if (cols == 0) cols = 1; + rows = ((num + (cols - 1)) / cols); + for (i = 0; i < rows; i++) + { + const char *icon; + int c, j, cw; + + if (options->mode == SMALL) + { + for (c = 0; c < cols; c++) + { + char sz[6], szch = ' '; + long long size; + + s = names[(c * rows) + i]; + if (!s) continue; + s2 = strrchr(s, '/'); + if (!s2) continue; + s2++; + int len = eina_unicode_utf8_get_len(s2); + icon = fileicon(s); + cw = tw / cols; + size = ecore_file_size(s); + size_print(sz, sizeof(sz), &szch, size); + len += stuff; + if (icon) + printf("%c}it#%i;%i;%s\n%s%c", 0x1b, 2, 1, s, icon, 0); + else + printf("%c}it#%i;%i;%s%c", 0x1b, 2, 1, s, 0); + printf("%c}ib%c", 0x1b, 0); + printf("##"); + printf("%c}ie%c", 0x1b, 0); + sizeprint(sz, szch); + printf(" "); + fileprint(s, s2, EINA_TRUE); + for (j = 0; j < (cw - len); j++) printf(" "); + } + printf("\n"); + } + else if (options->mode == MEDIUM) + { + for (c = 0; c < cols; c++) + { + s = names[(c * rows) + i]; + if (!s) continue; + s2 = strrchr(s, '/'); + if (!s2) continue; + s2++; + int len = eina_unicode_utf8_get_len(s2); + icon = fileicon(s); + cw = tw / cols; + len += 3; + if (cols > 1) len += 1; + if (icon) + printf("%c}it%c%i;%i;%s\n%s%c", 0x1b, 33 + c, 4, 2, s, icon, 0); + else + printf("%c}it%c%i;%i;%s%c", 0x1b, 33 + c, 4, 2, s, 0); + printf("%c}ib%c", 0x1b, 0); + printf("%c%c%c%c", 33 + c, 33 + c, 33 + c, 33 + c); + printf("%c}ie%c", 0x1b, 0); + fileprint(s, s2, EINA_FALSE); + if (c < (cols - 1)) + { + for (j = 0; j < (cw - len); j++) printf(" "); + } + } + printf("\n"); + for (c = 0; c < cols; c++) + { + char sz[6], szch = ' '; + long long size; + int len; + + s = names[(c * rows) + i]; + if (!s) continue; + cw = tw / cols; + s2 = strrchr(s, '/'); + if (!s2) continue; + s2++; + size = ecore_file_size(s); + size_print(sz, sizeof(sz), &szch, size); + len = eina_unicode_utf8_get_len(sz) + 2 + 4; + if (cols > 1) len += 1; + printf("%c}ib%c", 0x1b, 0); + printf("%c%c%c%c", 33 + c, 33 + c, 33 + c, 33 + c); + printf("%c}ie%c", 0x1b, 0); + sizeprint(sz, szch); + printf(" "); + fileprint(s, NULL, EINA_TRUE); + if (c < (cols - 1)) + { + for (j = 0; j < (cw - len); j++) printf(" "); + } + } + printf("\n"); + } + } + } + free(names); + EINA_LIST_FREE(files_list, s) free(s); +} + static void print_usage(const char *argv0) { @@ -810,13 +966,20 @@ main(int argc, char **argv) { char *rp; - if ((rp = ecore_file_realpath(path)) - && ecore_file_is_dir(rp)) + rp = ecore_file_realpath(path); + if (rp) { - list_dir(rp, &options); + if (ecore_file_is_dir(rp)) + { + flush_file(&options); + list_dir(rp, &options); + } + else + list_file(rp, &options); free(rp); } } + flush_file(&options); fflush(stdout); ecore_evas_free(ee); }