aboutsummaryrefslogtreecommitdiff
path: root/vis-cmds.c
diff options
context:
space:
mode:
authorMarc André Tanner <mat@brain-dump.org>2016-04-03 17:14:39 +0200
committerMarc André Tanner <mat@brain-dump.org>2016-04-03 21:38:05 +0200
commitc90aa3e9e45ad38760e6c75b76478511dadf7329 (patch)
tree0f41dfe44bd8d645127adf6aa2ca9e63113b7776 /vis-cmds.c
parentf47ecc3518e243ffb19b2628f5f9eb1e31fa27d8 (diff)
downloadvis-c90aa3e9e45ad38760e6c75b76478511dadf7329.tar.gz
vis-c90aa3e9e45ad38760e6c75b76478511dadf7329.tar.xz
vis: reimplement file open dialog
Diffstat (limited to 'vis-cmds.c')
-rw-r--r--vis-cmds.c67
1 files changed, 29 insertions, 38 deletions
diff --git a/vis-cmds.c b/vis-cmds.c
index b3a2df7..245139e 100644
--- a/vis-cmds.c
+++ b/vis-cmds.c
@@ -251,46 +251,37 @@ static bool is_file_pattern(const char *pattern) {
}
static const char *file_open_dialog(Vis *vis, const char *pattern) {
- /* FIXME/TODO rewrite this mess */
- return NULL;
-#if 0
+ static char name[PATH_MAX];
+ name[0] = '\0';
+
if (!is_file_pattern(pattern))
return pattern;
- /* this is a bit of a hack, we temporarily replace the text/view of the active
- * window such that we can use cmd_filter as is */
- char vis_open[512];
- static char filename[PATH_MAX];
- Filerange range = text_range_empty();
- Win *win = vis->win;
- File *file = win->file;
- Text *txt_orig = file->text;
- View *view_orig = win->view;
- Text *txt = text_load(NULL);
- View *view = view_new(txt, NULL);
- filename[0] = '\0';
- snprintf(vis_open, sizeof(vis_open)-1, "vis-open %s", pattern ? pattern : "");
-
- if (!txt || !view)
- goto out;
- win->view = view;
- file->text = txt;
-
- if (cmd_filter(vis, win, &range, CMD_OPT_NONE, (const char *[]){ "open", vis_open, NULL })) {
- size_t len = text_size(txt);
- if (len >= sizeof(filename))
- len = 0;
- if (len > 0)
- text_bytes_get(txt, 0, --len, filename);
- filename[len] = '\0';
- }
-
-out:
- view_free(view);
- text_free(txt);
- win->view = view_orig;
- file->text = txt_orig;
- return filename[0] ? filename : NULL;
-#endif
+
+ Buffer bufcmd, bufout, buferr;
+ buffer_init(&bufcmd);
+ buffer_init(&bufout);
+ buffer_init(&buferr);
+
+ if (!buffer_put0(&bufcmd, "vis-open ") || !buffer_append0(&bufcmd, pattern ? pattern : ""))
+ return NULL;
+
+ Filerange empty = text_range_empty();
+ int status = vis_pipe(vis, &empty, (const char*[]){ buffer_content0(&bufcmd), NULL },
+ &bufout, read_buffer, &buferr, read_buffer);
+
+ if (status == 0)
+ strncpy(name, buffer_content0(&bufout), sizeof(name)-1);
+ else
+ vis_info_show(vis, "Command failed %s", buffer_content0(&buferr));
+
+ buffer_release(&bufcmd);
+ buffer_release(&bufout);
+ buffer_release(&buferr);
+
+ for (char *end = name+strlen(name)-1; end >= name && isspace((unsigned char)*end); end--)
+ *end = '\0';
+
+ return name[0] ? name : NULL;
}
static bool openfiles(Vis *vis, const char **files) {