]> git.armaanb.net Git - st.git/blobdiff - st.c
st now runs on Linux, OpenBSD and FreeBSD.
[st.git] / st.c
diff --git a/st.c b/st.c
index ebe896cd75854f5ec81d0eb5914cb9f153a158df..9ca032f5a34a221787ca53235fc5021e9ffd2cb0 100644 (file)
--- a/st.c
+++ b/st.c
 #include <X11/keysym.h>
 #include <X11/Xutil.h>
 
+#if   defined(LINUX)
+ #include <pty.h>
+#elif defined(OPENBSD)
+ #include <util.h>
+#elif defined(FREEBSD)
+ #include <libutil.h>
+#endif
+
 /* Arbitrary sizes */
 #define ESC_TITLE_SIZ 256
 #define ESC_BUF_SIZ   256
@@ -34,7 +42,7 @@
 #define BETWEEN(x, a, b)  ((a) <= (x) && (x) <= (b))
 #define LIMIT(x, a, b)    (x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x)
 #define ATTRCMP(a, b) ((a).mode != (b).mode || (a).fg != (b).fg || (a).bg != (b).bg)
-#define IS_SET(flag) (term.mode & flag)
+#define IS_SET(flag) (term.mode & (flag))
 
 /* Attribute, Cursor, Character state, Terminal mode, Screen draw mode */
 enum { ATTR_NULL=0 , ATTR_REVERSE=1 , ATTR_UNDERLINE=2, ATTR_BOLD=4, ATTR_GFX=8 };
@@ -242,19 +250,12 @@ sigchld(int a) {
 void
 ttynew(void) {
        int m, s;
-       char *pts;
-
-       if((m = posix_openpt(O_RDWR | O_NOCTTY)) < 0)
-               die("openpt failed: %s\n", SERRNO);
-       if(grantpt(m) < 0)
-               die("grantpt failed: %s\n", SERRNO);
-       if(unlockpt(m) < 0)
-               die("unlockpt failed: %s\n", SERRNO);
-       if(!(pts = ptsname(m)))
-               die("ptsname failed: %s\n", SERRNO);
-       if((s = open(pts, O_RDWR | O_NOCTTY)) < 0)
-               die("Couldn't open slave: %s\n", SERRNO);
-       fcntl(s, F_SETFL, O_NDELAY);
+       
+       /* seems to work fine on linux, openbsd and freebsd */
+       struct winsize w = {term.row, term.col, 0, 0};
+       if(openpty(&m, &s, NULL, NULL, &w) < 0)
+               die("openpty failed: %s\n", SERRNO);
+
        switch(pid = fork()) {
        case -1:
                die("fork failed\n");
@@ -1078,10 +1079,9 @@ xhints(void)
 
 void
 xinit(void) {
-       xw.dis = XOpenDisplay(NULL);
-       xw.scr = XDefaultScreen(xw.dis);
-       if(!xw.dis)
+       if(!(xw.dis = XOpenDisplay(NULL)))
                die("Can't open display\n");
+       xw.scr = XDefaultScreen(xw.dis);
        
        /* font */
        if(!(dc.font = XLoadQueryFont(xw.dis, FONT)) || !(dc.bfont = XLoadQueryFont(xw.dis, BOLDFONT)))