diff options
author | ola.soder@axis.com <ola.soder@axis.com> | 2021-06-23 22:05:27 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-06-23 22:05:27 +0200 |
commit | d415d269130b233c0f198c75cc159bee721aa55c (patch) | |
tree | 3d0bf3b295ed290b4000a9e726a6fed39cfbce67 /src/os_amiga.c | |
parent | 6738fd2000f0bea4d40f4a8651e0e1f4b0503bb3 (diff) | |
download | vim-git-d415d269130b233c0f198c75cc159bee721aa55c.tar.gz |
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.c | 59 |
1 files changed, 53 insertions, 6 deletions
diff --git a/src/os_amiga.c b/src/os_amiga.c index c36206c82..7609ef73b 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. |