diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-08 17:12:23 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2023-02-08 17:12:23 +0100 |
| commit | b97ec93748902c90f25524116d3d189f1b263474 (patch) | |
| tree | c1ef2d49937c0e5df28fefe4e88222783adaf3cf | |
| parent | 262322f9742ee925fe135038a9bbb631acd56b36 (diff) | |
make ls cooler
| -rw-r--r-- | core/ls.c | 26 | ||||
| -rw-r--r-- | lib/aec/Makefile | 2 | ||||
| -rw-r--r-- | lib/aec/aec.c | 33 | ||||
| -rw-r--r-- | lib/aec/aec.h | 5 | ||||
| -rw-r--r-- | lib/tctl/tctl.c | 12 | ||||
| -rw-r--r-- | lib/tctl/tctl.h | 12 |
6 files changed, 84 insertions, 6 deletions
@@ -3,6 +3,8 @@ #include "../lib/io/io.h" #include "../lib/list/list.h" #include "../lib/arg/arg.h" +#include "../lib/tctl/tctl.h" +#include "../lib/cstr/cstr.h" #define BUF_SIZE sizeof(struct dirent) * 32 @@ -43,6 +45,10 @@ int main(int argc, const char *argv[]) char d_type; char buf[BUF_SIZE]; long nread; + u8 istty = isatty(); + i64 maxwidth = istty ? tctl_get_window_size().width : -1; + i64 current_width = 0; + struct dirent *d; dirs = new_list(); @@ -65,8 +71,21 @@ int main(int argc, const char *argv[]) for (u64 bpos = 0; bpos < nread;) { d = (struct dirent*) (buf + bpos); - if (filter_entry(d)) - wstdf("%s\n", d->d_name); + if (filter_entry(d)) { + if (!istty) { + wstdf("%s\n", d->d_name); + } else { + current_width += cstr_length(d->d_name) + 2; + if (current_width > maxwidth) { + wstd("\n"); + wstd(d->d_name); + wstd(" "); + current_width = cstr_length(d->d_name) + 2; + } else { + wstdf("%s ", d->d_name); + } + } + } bpos += d->d_reclen; } } @@ -74,5 +93,8 @@ int main(int argc, const char *argv[]) close(fd); } + if (istty) + wstd("\n"); + return 0; } diff --git a/lib/aec/Makefile b/lib/aec/Makefile index c7f78b6..e2179f8 100644 --- a/lib/aec/Makefile +++ b/lib/aec/Makefile @@ -1,3 +1,3 @@ unit_test: - gcc aec.c ../io/io.c ../cstr/cstr.c ../env/env.c ../sys/start.S -o test -static -nostdlib -fno-stack-protector -Wno-implicit-function-declaration -fno-builtin -DAEC_UNIT_TEST -g + gcc aec.c ../malloc/malloc.c ../io/io.c ../cstr/cstr.c ../env/env.c ../sys/start.S -o test -static -nostdlib -fno-stack-protector -Wno-implicit-function-declaration -fno-builtin -DAEC_UNIT_TEST -g ./test diff --git a/lib/aec/aec.c b/lib/aec/aec.c index 92a1f08..2d3d47c 100644 --- a/lib/aec/aec.c +++ b/lib/aec/aec.c @@ -2,7 +2,7 @@ #include "../io/io.h" -#define csi() wstd("\033["); +#define csi() wstd("\033[") void sgr(const char *attrs) { @@ -29,9 +29,40 @@ void background(const char *code) wstd("m"); } + +void clear_screen() +{ + csi(); + wstd("2J"); +} + + +void clear_line() +{ + csi(); + wstd("2K"); +} + + +void move_cursor(int x, int y) +{ + csi(); + wstdf("%i;%iH", y, x); +} + + +void cursor_enabled(int is_enabled) +{ + csi(); + wstd("?25"); + wstd(is_enabled ? "h" : "l"); +} + #ifdef AEC_UNIT_TEST int main() { + clear_screen(); + move_cursor(1, 1); sgr(SGR_BOLD); wstd("Hallo"); sgr(SGR_RESET); diff --git a/lib/aec/aec.h b/lib/aec/aec.h index 70c2706..b273e4a 100644 --- a/lib/aec/aec.h +++ b/lib/aec/aec.h @@ -38,4 +38,9 @@ void sgr(const char *attrs); void foreground(const char *code); void background(const char *code); +void clear_screen(); +void clear_line(); +void move_cursor(int x, int y); +void cursor_enabled(int is_enabled); + #endif diff --git a/lib/tctl/tctl.c b/lib/tctl/tctl.c index 54034f4..187d1a9 100644 --- a/lib/tctl/tctl.c +++ b/lib/tctl/tctl.c @@ -3,16 +3,24 @@ #define GET_WIN_SIZE 0x5413 #define SET_WIN_SIZE 0x5414 +#define TC_GET_ATTR 0x5401 window_size_t tctl_get_window_size() { window_size_t ws; - ioctl(0, GET_WIN_SIZE, &ws); + ioctl(1, GET_WIN_SIZE, &ws); return ws; } void tctl_set_window_size(window_size_t size) { - ioctl(0, SET_WIN_SIZE, &size); + ioctl(1, SET_WIN_SIZE, &size); +} + + +int isatty() +{ + termios_t term; + return ioctl(1, TC_GET_ATTR, &term) == 0; } diff --git a/lib/tctl/tctl.h b/lib/tctl/tctl.h index d106818..bdcdb66 100644 --- a/lib/tctl/tctl.h +++ b/lib/tctl/tctl.h @@ -8,7 +8,19 @@ typedef struct { unsigned short int ws_ypixel; } window_size_t; +typedef struct { + unsigned int c_iflag; + unsigned int c_oflag; + unsigned int c_cflag; + unsigned int c_lflag; + unsigned char c_line; + unsigned char c_cc[32]; + unsigned int c_ispeed; + unsigned int c_ospeed; +} termios_t; + window_size_t tctl_get_window_size(); void tctl_set_window_size(window_size_t size); +int isatty(); #endif |