From e1ab8e58a52a6ced3a6190d6994a3901bc532666 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Mon, 11 Nov 2019 22:32:20 -0500 Subject: [PATCH] sketched out xpty interface --- inc/xpty.h | 4 +++ src/lib/xpty.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/tide.c | 3 ++- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 inc/xpty.h create mode 100644 src/lib/xpty.c diff --git a/inc/xpty.h b/inc/xpty.h new file mode 100644 index 0000000..dac4530 --- /dev/null +++ b/inc/xpty.h @@ -0,0 +1,4 @@ +bool xpty_active(void); +int xpty_run(View* view, char** cmd); +void xpty_send(uint32_t key); + diff --git a/src/lib/xpty.c b/src/lib/xpty.c new file mode 100644 index 0000000..f729ac0 --- /dev/null +++ b/src/lib/xpty.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include +#ifdef __linux__ + #include +#else + #include +#endif + +static View* EditView = NULL; +static int Pty_Fd = -1; + +static void xpty_read(Job* job) +{ + char buffer[16385]; + long nread = read(job->fd, buffer, sizeof(buffer)-1); + if (nread <= 0) + { + job->readfn = NULL; + buf_logstop(&EditView->buffer); + Pty_Fd = -1; + EditView = NULL; + } + else if (nread > 0) + { + buffer[nread] = '\0'; + buf_logstart(&EditView->buffer); + view_putstr(EditView, buffer); + } +} + +static void xpty_write(Job* job) +{ + job->writefn = NULL; + shutdown(job->fd, SHUT_WR); +} + +bool xpty_active(void) +{ + return (Pty_Fd >= 0); +} + +int xpty_run(View* view, char** cmd) +{ + (void)view; + int fd = -1; + if (Pty_Fd < 0) + { + pid_t pid = forkpty(&fd, NULL, NULL, NULL); + if (pid == 0) + { + exit(execvp(cmd[0], cmd)); + } + else if (pid < 0 ) + { + fd = -1; + } + else + { + Pty_Fd = fd; + EditView = view; + job_spawn(Pty_Fd, xpty_read, xpty_write, NULL); + } + } + return fd; +} + +void xpty_send(uint32_t key) +{ + (void)key; +} diff --git a/src/tide.c b/src/tide.c index d9ee15d..3148f70 100644 --- a/src/tide.c +++ b/src/tide.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -458,7 +459,7 @@ static void cmd_exec(char* cmd) free(input); if (op == '&') { -// xpty_init(win_view(EDIT), execcmd); + xpty_run(win_view(EDIT), execcmd); } else { -- 2.52.0