--- /dev/null
+#include <stdc.h>
+#include <utf.h>
+#include <edit.h>
+#include <sys/socket.h>
+#ifdef __linux__
+ #include <pty.h>
+#else
+ #include <util.h>
+#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;
+}
#include <win.h>
#include <x11.h>
#include <io.h>
+#include <xpty.h>
#include <draw.h>
#include <locale.h>
#include <sys/wait.h>
free(input);
if (op == '&')
{
-// xpty_init(win_view(EDIT), execcmd);
+ xpty_run(win_view(EDIT), execcmd);
}
else
{