#include <string.h>\r
#include <net.h>\r
#include <readline.h>\r
+#include <acess/devices/pty.h>\r
\r
// === TYPES ===\r
typedef struct sServer {\r
\r
int ProcessIncoming(tServer *Server);\r
// --- Helpers\r
- int SetCursorPos(int Row, int Col);\r
+void SetCursorPos(int Row, int Col);\r
int writef(int FD, const char *Format, ...);\r
int OpenTCP(const char *AddressString, short PortNumber);\r
char *GetValue(char *Str, int *Ofs);\r
\r
atexit(ExitHandler);\r
\r
- giTerminal_Width = _SysIOCtl(1, 5, NULL); // getset_width\r
- giTerminal_Height = _SysIOCtl(1, 6, NULL); // getset_height\r
+ {\r
+ struct ptydims dims;\r
+ if( _SysIOCtl(1, PTY_IOCTL_GETDIMS, &dims) ) {\r
+ perror("Can't get terminal dimensions");\r
+ return 1;\r
+ }\r
+ \r
+ giTerminal_Width = dims.W;\r
+ giTerminal_Height = dims.H;\r
+ }\r
\r
printf("\x1B[?1047h");\r
printf("\x1B[%i;%ir", 0, giTerminal_Height-1);\r
\r
SetCursorPos(giTerminal_Height-1, 0);\r
printf("[(status)] ");\r
+ fflush(stdout);\r
readline_info = Readline_Init(1);\r
\r
for( ;; )\r
maxFD = srv->FD;\r
}\r
\r
- rv = select(maxFD+1, &readfds, 0, &errorfds, NULL);\r
+ rv = _SysSelect(maxFD+1, &readfds, 0, &errorfds, NULL, 0);\r
if( rv == -1 ) break;\r
\r
if(FD_ISSET(0, &readfds))\r
printf("[%s:%s] ", gpCurrentWindow->Server->Name, gpCurrentWindow->Name);\r
else\r
printf("[(status)] ");\r
+ fflush(stdout);\r
}\r
}\r
\r
\r
tMessage *Message_Append(tServer *Server, int Type, const char *Source, const char *Dest, const char *Message)\r
{\r
- tMessage *ret;\r
tWindow *win = NULL;\r
int msgLen = strlen(Message);\r
\r
- // NULL servers are internal messages\r
+ // Server==NULL indicates an internal message\r
if( Server == NULL || Source[0] == '\0' )\r
{\r
win = &gWindow_Status;\r
}\r
- // Determine if it's a channel or PM message\r
+ // Determine if it's a channel or PM\r
else if( Dest[0] == '#' || Dest[0] == '&' ) // TODO: Better determining here\r
{\r
for(win = gpWindows; win; win = win->Next)\r
win = Window_Create(Server, Dest);\r
}\r
}\r
- \r
+\r
+ // Create message cache \r
+ _SysDebug("Win (%s) msg: <%s> %s", win->Name, Source, Message);\r
+ tMessage *ret;\r
ret = malloc( sizeof(tMessage) + msgLen + 1 + strlen(Source) + 1 );\r
ret->Source = ret->Data + msgLen + 1;\r
strcpy(ret->Source, Source);\r
ret->Type = Type;\r
ret->Server = Server;\r
\r
- // TODO: Append to window message list\r
+ // Append to window message list\r
ret->Next = win->Messages;\r
win->Messages = ret;\r
\r
- //TODO: Set location\r
- \r
+ // Print now if current window\r
+ if( win == gpCurrentWindow )\r
{\r
- int pos = SetCursorPos(giTerminal_Height-2, 0);\r
- if( win == gpCurrentWindow ) {\r
- int prefixlen = strlen(Source) + 3;\r
- int avail = giTerminal_Width - prefixlen;\r
- int msglen = strlen(Message);\r
- printf("\x1B[T"); // Scroll down 1 (free space below)\r
- printf("[%s] %.*s\n", Source, avail, Message);\r
- while( msglen > avail ) {\r
- msglen -= avail;\r
- Message += avail;\r
- printf("\x1B[T");\r
- SetCursorPos(giTerminal_Height-2, prefixlen);\r
- printf("%.*s\n", avail, Message);\r
- }\r
+ printf("\x1b[s");\r
+ SetCursorPos(giTerminal_Height-2, 0);\r
+ int prefixlen = strlen(Source) + 3;\r
+ int avail = giTerminal_Width - prefixlen;\r
+ int msglen = strlen(Message);\r
+ printf("\x1B[T"); // Scroll down 1 (free space below)\r
+ printf("[%s] %.*s\n", Source, avail, Message);\r
+ while( msglen > avail ) {\r
+ msglen -= avail;\r
+ Message += avail;\r
+ printf("\x1B[T");\r
+ SetCursorPos(giTerminal_Height-2, prefixlen);\r
+ printf("%.*s\n", avail, Message);\r
}\r
- SetCursorPos(-1, pos);\r
+ printf("\x1b[u");\r
}\r
\r
return ret;\r
int pos = 0;\r
char *ident, *cmd;\r
\r
- _SysDebug("[%s] %s", Server->Name, Line); \r
+// _SysDebug("[%s] %s", Server->Name, Line); \r
\r
// Message?\r
if( *Line == ':' )\r
return ret;\r
}\r
\r
-int SetCursorPos(int Row, int Col)\r
+void SetCursorPos(int Row, int Col)\r
{\r
- int rv;\r
- if( Row == -1 ) {\r
- Row = Col / giTerminal_Width;\r
- Col = Col % giTerminal_Width;\r
- }\r
- rv = _SysIOCtl(1, 9, NULL); // Ugh, constants\r
printf("\x1B[%i;%iH", Col, Row);\r
- return rv;\r
}\r
\r
static inline int isdigit(int ch)\r