X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Firc_src%2Fpseudo_curses.c;h=23ee1371b2c0880d1953ceee807158183f8a5cfd;hb=13078002b01ee4f63eb2001d2ef479a2a006ea32;hp=bdcb3cf973ab7a7af0bafa3af5c32328aee67277;hpb=fcb22b3d1770e7f441385198cde6ddda3953e38b;p=tpg%2Facess2.git diff --git a/Usermode/Applications/irc_src/pseudo_curses.c b/Usermode/Applications/irc_src/pseudo_curses.c index bdcb3cf9..23ee1371 100644 --- a/Usermode/Applications/irc_src/pseudo_curses.c +++ b/Usermode/Applications/irc_src/pseudo_curses.c @@ -1,26 +1,71 @@ /* */ #include "pseudo_curses.h" +#include #include #include #include +// === PROTOTYPES === +bool ACurses_GetDims_Acess(void); +bool ACurses_GetDims_SerialTermHack(void); + +// === GLOBALS === int giTerminal_Width = 80; int giTerminal_Height = 25; +// === CODE === void ACurses_Init(void) { - if( _SysIOCtl(1, DRV_IOCTL_TYPE, NULL) != DRV_TYPE_TERMINAL ) { + if( ACurses_GetDims_Acess() ) { + } + else if( ACurses_GetDims_SerialTermHack() ) { + } + else { _SysDebug("note: assuming 80x25, can't get terminal dimensions"); giTerminal_Width = 80; giTerminal_Height = 25; } - else { - struct ptydims dims; - _SysIOCtl(1, PTY_IOCTL_GETDIMS, &dims); - giTerminal_Width = dims.W; - giTerminal_Height = dims.H; - } +} + +bool ACurses_GetDims_Acess(void) +{ + if( _SysIOCtl(1, DRV_IOCTL_TYPE, NULL) != DRV_TYPE_TERMINAL ) + return false; + + struct ptydims dims; + if( _SysIOCtl(1, PTY_IOCTL_GETDIMS, &dims) == -1 ) + return false; + giTerminal_Width = dims.W; + giTerminal_Height = dims.H; + return true; +} + +bool ACurses_GetDims_SerialTermHack(void) +{ + _SysDebug("ACurses_GetDims_SerialTermHack: Trying"); + // Set cursor to 1000,1000 , request cursor position, reset cursor to 0,0 + static const char req[] = "\033[1000;1000H\033[6n\033[H"; + fflush(stdin); + _SysWrite(1, req, sizeof(req)); + int64_t timeout = 1000; + fd_set fds; + FD_ZERO(&fds); + FD_SET(0, &fds); + _SysSelect(1, &fds, NULL, NULL, &timeout, 0); + if( !FD_ISSET(0, &fds) ) + return false; + + if( fgetc(stdin) != '\x1b' ) + return false; + if( fgetc(stdin) != '[' ) + return false; + if( fscanf(stdin, "%i;%i", &giTerminal_Width, &giTerminal_Height) != 2 ) + return false; + if( fgetc(stdin) != 'R' ) + return false; + + return true; } void SetCursorPos(int Row, int Col)