diff --git a/src/configure.in b/src/configure.in
index 81404eb6e0487e99889d12f1ed53470718d66376..09b0e5379de3000e9675889348dfe12813670349 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -3308,9 +3308,17 @@ AC_CHECK_HEADERS(winsock2.h sys/rusage.h time.h sys/time.h sys/types.h \
 #ifdef HAVE_SYS_PARAM_H
 # include <sys/param.h>
 #endif
+/* Necessary to find struct winsize. */
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#elif defined(HAVE_SYS_TERMIOS_H)
+/* NB: Deprecated by <termios.h> above. */
+#include <sys/termios.h>
+#endif
 ])
 
-AC_CHECK_TYPES([HPCON, LPPROC_THREAD_ATTRIBUTE_LIST, LPSTARTUPINFOEXW],,,[
+AC_CHECK_TYPES([HPCON, LPPROC_THREAD_ATTRIBUTE_LIST, LPSTARTUPINFOEXW,
+                struct winsize],,,[
 #if (defined(__WINNT__) || defined(__WIN32__)) && !defined(__NT__)
 #define __NT__
 #endif
diff --git a/src/fdlib.c b/src/fdlib.c
index 13d4d4b8a71a98479c4ee59dc1b04fe9b18818cc..680dbcf85cb06abe95ec7af860e810c55800b3ae 100644
--- a/src/fdlib.c
+++ b/src/fdlib.c
@@ -2775,12 +2775,14 @@ PMOD_EXPORT const char *debug_fd_inet_ntop(int af, const void *addr,
 PMOD_EXPORT int debug_fd_openpty(int *master, int *slave,
 				 char *ignored_name,
 				 void *ignored_term,
-				 void *ignored_winp)
+				 struct winsize *winp)
 {
   struct my_pty *master_pty = NULL;
   struct my_pty *slave_pty = NULL;
   int master_fd = -1;
   int slave_fd = -1;
+  COORD sz;
+
   if (!Pike_NT_CreatePseudoConsole) {
     errno = ENOENT;
     return -1;
@@ -2817,9 +2819,18 @@ PMOD_EXPORT int debug_fd_openpty(int *master, int *slave,
     goto fail;
   }
 
+  /* Some reasonable defaults. */
+  sz.X = 80;
+  sz.Y = 25;
+
+  if (winp) {
+    sz.X = winp->ws_col;
+    sz.y = winp->ws_row;
+  }
+
   if (FAILED(Pike_NT_CreatePseudoConsole(sz, slave_pty->write_pipe,
 					 slave_pty->read_pipe,
-					 0, &master->pty))) {
+					 0, &master_pty->conpty))) {
     goto fail;
   }
 
diff --git a/src/fdlib.h b/src/fdlib.h
index 7d5c301e4e21866ac8b4da0c2f93befe01d73718..74bfdf3ce0d7b609859032ca8fb639ee9d1b2170 100644
--- a/src/fdlib.h
+++ b/src/fdlib.h
@@ -109,6 +109,13 @@ typedef struct _STARTUPINFOEXW
 } STARTUPINFOEXW, *LPSTARTUPINFOEXW;
 #endif
 
+#ifndef HAVE_STRUCT_WINSIZE
+/* Typically found in <termios.h>. */
+struct winsize {
+  unsigned short ws_row, ws_col, ws_xpixel, ws_ypixel;
+};
+#endif
+
 #define SOCKFUN1(NAME,T1) PMOD_EXPORT int PIKE_CONCAT(debug_fd_,NAME) (FD,T1);
 #define SOCKFUN2(NAME,T1,T2) PMOD_EXPORT int PIKE_CONCAT(debug_fd_,NAME) (FD,T1,T2);
 #define SOCKFUN3(NAME,T1,T2,T3) PMOD_EXPORT int PIKE_CONCAT(debug_fd_,NAME) (FD,T1,T2,T3);
@@ -214,7 +221,7 @@ PMOD_EXPORT const char *debug_fd_inet_ntop(int af, const void *addr,
 PMOD_EXPORT int debug_fd_openpty(int *master, int *slave,
 				 char *ignored_name,
 				 void *ignored_term,
-				 void *ignored_winp);
+				 struct winsize *winp);
 /* Prototypes end here */
 
 #undef SOCKFUN1