3 * - By John Hodge (thePowersGang)
8 #include <axwin3/axwin.h>
9 #include <axwin3/menu.h>
10 #include <axwin3/richtext.h>
11 #include <axwin3/keysyms.h>
13 #include <acess/sys.h>
14 #include "include/display.h"
15 #include "include/vt100.h"
20 int main(int argc, char *argv[], const char **envp);
21 int Term_KeyHandler(tHWND Window, int bPress, uint32_t KeySym, uint32_t Translated);
22 int Term_MouseHandler(tHWND Window, int bPress, int Button, int Row, int Col);
23 void Term_HandleOutput(int Len, const char *Buf);
32 int main(int argc, char *argv[], const char **envp)
36 // --- Build up window
37 gMainWindow = AxWin3_RichText_CreateWindow(NULL, 0);
38 AxWin3_SetWindowTitle(gMainWindow, "Terminal"); // TODO: Update title with other info
40 gMenuWindow = AxWin3_Menu_Create(gMainWindow);
41 AxWin3_Menu_AddItem(gMenuWindow, "Copy\tWin+C", NULL, NULL, 0, NULL);
42 AxWin3_Menu_AddItem(gMenuWindow, "Paste\tWin+V", NULL, NULL, 0, NULL);
43 // TODO: Populate menu
48 AxWin3_RichText_SetKeyHandler (gMainWindow, Term_KeyHandler);
49 AxWin3_RichText_SetMouseHandler (gMainWindow, Term_MouseHandler);
50 AxWin3_RichText_SetDefaultColour(gMainWindow, 0xFFFFFF);
51 AxWin3_RichText_SetBackground (gMainWindow, 0x000000);
52 AxWin3_RichText_SetFont (gMainWindow, "#monospace", 10);
53 AxWin3_RichText_SetCursorPos (gMainWindow, 0, 0);
54 AxWin3_RichText_SetCursorType (gMainWindow, AXWIN3_RICHTEXT_CURSOR_INV);
55 AxWin3_RichText_SetCursorBlink (gMainWindow, 1);
58 AxWin3_RichText_SetLineCount(gMainWindow, 3);
59 AxWin3_RichText_SendLine(gMainWindow, 0, "First line!");
60 AxWin3_RichText_SendLine(gMainWindow, 2, "Third line! \1ff0000A red");
63 Display_Init(80, 25, 100);
64 AxWin3_ResizeWindow(gMainWindow, 80*8, 25*16);
65 AxWin3_MoveWindow(gMainWindow, 20, 50);
66 AxWin3_ShowWindow(gMainWindow, 1);
67 AxWin3_FocusWindow(gMainWindow);
70 giChildStdin = _SysOpen("/Devices/fifo/anon", OPENFLAG_READ|OPENFLAG_WRITE);
71 giChildStdout = _SysOpen("/Devices/fifo/anon", OPENFLAG_READ|OPENFLAG_WRITE);
72 if( giChildStdout == -1 || giChildStdin == -1 ) {
74 _SysDebug("out,in = %i,%i", giChildStdout, giChildStdin);
79 int fds[] = {giChildStdin, giChildStdout, giChildStdout};
80 const char *argv[] = {"CLIShell", NULL};
81 int pid = _SysSpawn("/Acess/Bin/CLIShell", argv, envp, 3, fds, NULL);
83 _SysDebug("ERROR: Shell spawn failed");
92 FD_SET(giChildStdout, &fds);
93 AxWin3_MessageSelect(giChildStdout + 1, &fds);
95 if( FD_ISSET(giChildStdout, &fds) )
97 _SysDebug("Activity on child stdout");
98 // Read and update screen
100 int len = _SysRead(giChildStdout, buf, sizeof(buf));
101 if( len <= 0 ) break;
103 Term_HandleOutput(len, buf);
110 int Term_KeyHandler(tHWND Window, int bPress, uint32_t KeySym, uint32_t Translated)
112 static int ctrl_state = 0;
115 #define _bitset(var,bit,set) do{if(set)var|=1<<(bit);else var&=1<<(bit);}while(0)
118 case KEYSYM_LEFTCTRL:
119 _bitset(ctrl_state, 0, bPress!=0);
121 case KEYSYM_RIGHTCTRL:
122 _bitset(ctrl_state, 1, bPress!=0);
128 // - Ctrl-A -- Ctrl-Z
129 if( ctrl_state && KeySym >= KEYSYM_a && KeySym <= KEYSYM_z )
131 Translated = KeySym - KEYSYM_a + 1;
143 len = WriteUTF8(buf, Translated);
145 _SysDebug("Keystroke translated to '%.*s'", len, buf);
146 _SysWrite(giChildStdin, buf, len);
151 // No translation, look for escape sequences to send
152 const char *str = NULL;
155 case KEYSYM_LEFTARROW:
161 _SysWrite(giChildStdin, str, strlen(str));
167 int Term_MouseHandler(tHWND Window, int bPress, int Button, int Row, int Col)
172 void Term_HandleOutput(int Len, const char *Buf)
174 // TODO: Handle graphical / accelerated modes
181 esc_len = Term_HandleVT100(Len - ofs, Buf + ofs);
183 Display_AddText(-esc_len, Buf + ofs);
187 _SysDebug("Len = %i, ofs = %i", Len, ofs);