commit 02cbbe6e46673d176e0a6201ec5629040c05846a
Author: rani <clagv.randomgames@gmail.com>
Date: Sat Jan 03 16:16:51 2026 +0000
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);