Thumbnail

rani/cscroll.git

Clone URL: https://git.buni.party/rani/cscroll.git

commit 02cbbe6e46673d176e0a6201ec5629040c05846a Author: rani <clagv.randomgames@gmail.com> Date: Sat Jan 03 16:16:51 2026 +0000 Add: file opening diff --git a/include/config.h b/include/config.h index 53790ab..3d777b8 100644 --- a/include/config.h +++ b/include/config.h @@ -296 +297 @@ typedef struct {   enum dir_sort_dirs dir_sort_dirs;   enum dir_sortby dir_sortby;   enum dir_sort dir_sort; + char * opener;  } config_t;    extern config_t config; diff --git a/include/dir.h b/include/dir.h index 0704293..e01ac22 100644 --- a/include/dir.h +++ b/include/dir.h @@ -935 +936 @@ const char * dirent_prettymode(const dirent_t * de);  const char * dirent_size_unit(const dirent_t * de);  size_t dirent_subfiles(const dirent_t * de); // number of sub entries in a dir  int dirent_delete(const dirent_t * de); +int dirent_open(const dirent_t * de);    #endif /* DIR_H */ diff --git a/include/ui.h b/include/ui.h index 6568227..c097623 100644 --- a/include/ui.h +++ b/include/ui.h @@ -336 +337 @@ typedef const char * const prompt_opts_t[];    void ui_init(void);  void ui_deinit(void); +void ui_reinit(void);  void ui_set_title(const char * title);  void ui_status_info(const char * status);  void ui_status_error(const char * status); diff --git a/src/config.c b/src/config.c index f4e35f2..2b8c506 100644 --- a/src/config.c +++ b/src/config.c @@ -114 +116 @@ config_t config = {   .dir_sortby = DIR_SORTBY_NAME,   .dir_sort = DIR_SORT_INCREASING,   .dir_sort_dirs = DIR_SORT_DIRS_FIRST, + + .opener = "xdg-open",  }; diff --git a/src/dir.c b/src/dir.c index 8fe8866..7b22d2f 100644 --- a/src/dir.c +++ b/src/dir.c @@ -15 +16 @@  #include <sys/resource.h>  #include <sys/stat.h> +#include <sys/wait.h>  #include <stdbool.h>  #include <strings.h>  #include <dirent.h> @@ -1187 +1197 @@ int dir_list(const char * path, dir_t * dir) {   }     closedir(dp); - + dir_sort(dir);   return 0;  }   @@ -5653 +56621 @@ int dirent_delete(const dirent_t * de) {   return 0;   }  } + +int dirent_open(const dirent_t * de) { + pid_t pid = fork(); + if (pid < 0) return -errno; + + if (!pid) { + // detach everything from this terminal basically + int fd = open("/dev/null", O_RDWR); + dup2(fd, STDOUT_FILENO); + dup2(fd, STDIN_FILENO); + execvp(config.opener, (char*[]){config.opener, de->name, NULL}); + close(fd); + exit(0); + } + + waitpid(pid, NULL, 0); + return 0; +} diff --git a/src/main.c b/src/main.c index 8463892..7dbd870 100644 --- a/src/main.c +++ b/src/main.c @@ -147 +146 @@ int main(int argc, char ** argv) {     dir_t dir;   dir_list(cwd, &dir); - dir_sort(&dir);     ui_init();   size_t cursor = 0; @@ -597 +586 @@ int main(int argc, char ** argv) {   if (ret < 0) {   ui_status_error(strerror(-ret));   } else { - dir_sort(&dir);   if (basename) {   size_t idx;   int i = dir_search_name(&dir, basename, &idx); @@ -7421 +7225 @@ int main(int argc, char ** argv) {   break;   }   case KEY_RIGHT: { - if (cur_de && (cur_de->type == DE_DIR || (cur_de->type == DE_LINK - && cur_de->linktype == DE_DIR))) { + ui_status_info(""); + if (!cur_de) break; + if (cur_de->type == DE_DIR || (cur_de->type == DE_LINK + && cur_de->linktype == DE_DIR)) {   int ret = dir_cd(cwd, cur_de->name);   if (ret >= 0) {   cursor = 0;   cwd = dir_get_cwd();   dir_free(&dir);   dir_list(cwd, &dir); - dir_sort(&dir);   if (dirlen == 0) ui_status_info("Empty Directory");   } else {   ui_status_error(strerror(-ret));   }   } else { - ui_status_info(""); + ui_deinit(); + int ret = dirent_open(cur_de); + if (ret < 0) ui_status_error(strerror(-ret)); + ui_reinit();   }   break;   } @@ -1667 +1686 @@ int main(int argc, char ** argv) {     dir_free(&dir);   dir_list(cwd, &dir); - dir_sort(&dir);   dirlen = dir_len(&dir);   if (dirlen == 0) cursor = 0;   else if (cursor > dirlen - 1) cursor = dirlen - 1; diff --git a/src/ui.c b/src/ui.c index 4077db4..af8751f 100644 --- a/src/ui.c +++ b/src/ui.c @@ -906 +9011 @@ void ui_deinit(void) {   endwin();  }   +void ui_reinit(void) { + refresh(); + ui_refresh(); +} +  void win_set(WINDOW * win, const char * str, int attrs) {   werase(win);   wattron(win, attrs);