summaryrefslogtreecommitdiffstats
path: root/src/os_amiga.c
diff options
context:
space:
mode:
authorola.soder@axis.com <ola.soder@axis.com>2021-06-23 22:05:27 +0200
committerBram Moolenaar <Bram@vim.org>2021-06-23 22:05:27 +0200
commitd415d269130b233c0f198c75cc159bee721aa55c (patch)
tree3d0bf3b295ed290b4000a9e726a6fed39cfbce67 /src/os_amiga.c
parent6738fd2000f0bea4d40f4a8651e0e1f4b0503bb3 (diff)
patch 8.2.3043: Amiga: cannot get the shell size on MorphOS and AROSv8.2.3043
Problem: Amiga: cannot get the shell size on MorphOS and AROS. Solution: Use control sequences. (Ola Söder, closes #8438)
Diffstat (limited to 'src/os_amiga.c')
-rw-r--r--src/os_amiga.c59
1 files changed, 53 insertions, 6 deletions
diff --git a/src/os_amiga.c b/src/os_amiga.c
index c36206c82f..7609ef73b6 100644
--- 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.