]> git.mdlowis.com Git - projs/tide.git/commitdiff
sketched out xpty interface
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 12 Nov 2019 03:32:20 +0000 (22:32 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 12 Nov 2019 03:32:20 +0000 (22:32 -0500)
inc/xpty.h [new file with mode: 0644]
src/lib/xpty.c [new file with mode: 0644]
src/tide.c

diff --git a/inc/xpty.h b/inc/xpty.h
new file mode 100644 (file)
index 0000000..dac4530
--- /dev/null
@@ -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 (file)
index 0000000..f729ac0
--- /dev/null
@@ -0,0 +1,72 @@
+#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;
+}
index d9ee15d309fc1bf794c8d725d8fbe8b196b28e93..3148f70df9a32c14908a6dc4f74d4954ff9c47a6 100644 (file)
@@ -5,6 +5,7 @@
 #include <win.h>
 #include <x11.h>
 #include <io.h>
+#include <xpty.h>
 #include <draw.h>
 #include <locale.h>
 #include <sys/wait.h>
@@ -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
         {