patch 8.0.0753: no size reports to a job running in a terminal

Problem:    A job running in a terminal does not get notified of changes in
            the terminal size.
Solution:   Use ioctl() and SIGWINCH to report the terminal size.
diff --git a/src/terminal.c b/src/terminal.c
index 212b400..f3cb124 100644
--- a/src/terminal.c
+++ b/src/terminal.c
@@ -12,10 +12,11 @@
  *
  * There are three parts:
  * 1. Generic code for all systems.
+ *    Uses libvterm for the terminal emulator.
  * 2. The MS-Windows implementation.
- *    Uses a hidden console for the terminal emulator.
+ *    Uses winpty.
  * 3. The Unix-like implementation.
- *    Uses libvterm for the terminal emulator directly.
+ *    Uses pseudo-tty's (pty's).
  *
  * For each terminal one VTerm is constructed.  This uses libvterm.  A copy of
  * that library is in the libvterm directory.
@@ -32,8 +33,6 @@
  * while, if the terminal window is visible, the screen contents is drawn.
  *
  * TODO:
- * - When 'termsize' is set and dragging the separator the terminal gets messed
- *   up.
  * - set buffer options to be scratch, hidden, nomodifiable, etc.
  * - set buffer name to command, add (1) to avoid duplicates.
  * - Add a scrollback buffer (contains lines to scroll off the top).
@@ -605,9 +604,32 @@
      */
     if ((!term->tl_rows_fixed && term->tl_rows != wp->w_height)
 	    || (!term->tl_cols_fixed && term->tl_cols != wp->w_width))
-	vterm_set_size(vterm,
-		term->tl_rows_fixed ? term->tl_rows : wp->w_height,
-		term->tl_cols_fixed ? term->tl_cols : wp->w_width);
+    {
+	int rows = term->tl_rows_fixed ? term->tl_rows : wp->w_height;
+	int cols = term->tl_cols_fixed ? term->tl_cols : wp->w_width;
+
+	vterm_set_size(vterm, rows, cols);
+	ch_logn(term->tl_job->jv_channel, "Resizing terminal to %d lines",
+									 rows);
+
+#if defined(UNIX)
+	/* Use an ioctl() to report the new window size to the job. */
+	if (term->tl_job != NULL && term->tl_job->jv_channel != NULL)
+	{
+	    int fd = -1;
+	    int part;
+
+	    for (part = PART_OUT; part < PART_COUNT; ++part)
+	    {
+		fd = term->tl_job->jv_channel->ch_part[part].ch_fd;
+		if (isatty(fd))
+		    break;
+	    }
+	    if (part < PART_COUNT && mch_report_winsize(fd, rows, cols) == OK)
+		mch_stop_job(term->tl_job, (char_u *)"winch");
+	}
+#endif
+    }
 
     /* The cursor may have been moved when resizing. */
     vterm_state_get_cursorpos(state, &pos);