changeset 25012:c2c2189a98c4 v8.2.3043

patch 8.2.3043: Amiga: cannot get the shell size on MorphOS and AROS Commit: https://github.com/vim/vim/commit/d415d269130b233c0f198c75cc159bee721aa55c Author: ola.soder@axis.com <ola.soder@axis.com> Date: Wed Jun 23 22:05:27 2021 +0200 patch 8.2.3043: Amiga: cannot get the shell size on MorphOS and AROS Problem: Amiga: cannot get the shell size on MorphOS and AROS. Solution: Use control sequences. (Ola S?der, closes https://github.com/vim/vim/issues/8438)
author Bram Moolenaar <Bram@vim.org>
date Wed, 23 Jun 2021 22:15:03 +0200
parents e3abe2f3ad90
children 5dc82450efc5
files src/os_amiga.c src/version.c
diffstat 2 files changed, 55 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/os_amiga.c
+++ b/src/os_amiga.c
@@ -1008,7 +1008,58 @@ mch_settmode(tmode_T tmode)
 #endif
 
 /*
- * try to get the real window size
+ * Get console size in a system friendly way on AROS and MorphOS.
+ * Return FAIL for failure, OK otherwise
+ */
+#if defined(__AROS__) || defined(__MORPHOS__)
+    int
+mch_get_shellsize(void)
+{
+    if (!term_console)
+        return FAIL;
+
+    if (raw_in && raw_out)
+    {
+        // Save current console mode.
+        int old_tmode = cur_tmode;
+        char ctrl[] = "\x9b""0 q";
+
+        // Set RAW mode.
+        mch_settmode(TMODE_RAW);
+
+        // Write control sequence to console.
+        if (Write(raw_out, ctrl, sizeof(ctrl)) == sizeof(ctrl))
+        {
+            char scan[] = "\x9b""1;1;%d;%d r",
+                 answ[sizeof(scan) + 8] = { '\0' };
+
+            // Read return sequence from input.
+            if (Read(raw_in, answ, sizeof(answ) - 1) > 0)
+            {
+                // Parse result and set Vim globals.
+                if (sscanf(answ, scan, &Rows, &Columns) == 2)
+                {
+                    // Restore console mode.
+                    mch_settmode(old_tmode);
+                    return OK;
+                }
+            }
+        }
+
+        // Restore console mode.
+        mch_settmode(old_tmode);
+    }
+
+    // I/O error. Default size fallback.
+    term_console = FALSE;
+    Columns = 80;
+    Rows = 24;
+
+    return FAIL;
+}
+#else
+/*
+ * Try to get the real window size,
  * return FAIL for failure, OK otherwise
  */
     int
@@ -1040,13 +1091,8 @@ mch_get_shellsize(void)
 	OUT_STR("\233t\233u");	// CSI t CSI u
     out_flush();
 
-#ifdef __AROS__
-    if (!Info(raw_out, id)
-		 || (wb_window = (struct Window *) id->id_VolumeNode) == NULL)
-#else
     if (dos_packet(MP(raw_out), (long)ACTION_DISK_INFO, ((ULONG) id) >> 2) == 0
 	    || (wb_window = (struct Window *)id->id_VolumeNode) == NULL)
-#endif
     {
 	// it's not an amiga window, maybe aux device
 	// terminal type should be set
@@ -1081,6 +1127,7 @@ out:
 
     return FAIL;
 }
+#endif
 
 /*
  * Try to set the real window size to Rows and Columns.
--- a/src/version.c
+++ b/src/version.c
@@ -756,6 +756,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3043,
+/**/
     3042,
 /**/
     3041,