From: Michael D. Lowis Date: Tue, 12 Nov 2019 03:32:20 +0000 (-0500) Subject: sketched out xpty interface X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=e1ab8e58a52a6ced3a6190d6994a3901bc532666;p=projs%2Ftide.git sketched out xpty interface --- 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 {