--- /dev/null
+/*
+ * Acess GUI Terminal
+ * - By John Hodge (thePowersGang)
+ *
+ * display.c
+ * - Abstract display manipulation methods
+ */
+#include "include/display.h"
+#include <acess/sys.h> // _SysDebug
+#include <stdlib.h> // exit
+
+#define UNIMPLIMENTED() do{_SysDebug("UNIMPLIMENTED %s", __func__); exit(-1);}while(0)
+
+#define MAX_LINES 100
+
+// === GLOBALS ===
+ int giCurrentLine;
+ int giCurrentLinePos; // byte offset, not column
+ int giCurrentCol;
+ int giFirstLine; // Ring buffer start
+char **gasDisplayLines;
+
+// === CODE ===
+void Display_Init(void)
+{
+ gasDisplayLines = malloc( sizeof(char*) * MAX_LINES );
+}
+
+void Display_AddText(int Length, const char *UTF8Text)
+{
+ _SysDebug("%i '%.*s'", Length, Length, UTF8Text);
+ UNIMPLIMENTED();
+}
+
+void Display_Newline(int bCarriageReturn)
+{
+ UNIMPLIMENTED();
+}
+
+void Display_SetCursor(int Row, int Col)
+{
+ UNIMPLIMENTED();
+}
+
+void Display_MoveCursor(int RelRow, int RelCol)
+{
+ UNIMPLIMENTED();
+}
+
+void Display_ClearLine(int Dir) // 0: All, 1: Forward, -1: Reverse
+{
+ UNIMPLIMENTED();
+}
+
+void Display_ClearLines(int Dir) // 0: All, 1: Forward, -1: Reverse
+{
+ UNIMPLIMENTED();
+}
+
+void Display_SetForeground(uint32_t RGB)
+{
+ UNIMPLIMENTED();
+}
+
+void Display_SetBackground(uint32_t RGB)
+{
+ UNIMPLIMENTED();
+}
+
+void Display_Flush(void)
+{
+ UNIMPLIMENTED();
+}
+
#include <axwin3/axwin.h>
#include <axwin3/menu.h>
#include <axwin3/richtext.h>
+#include <axwin3/keysyms.h>
#include <stdio.h>
+#include <acess/sys.h>
#include "include/display.h"
#include "include/vt100.h"
+#include <string.h>
+#include <unicode.h>
// === PROTOTYPES ===
int main(int argc, char *argv[], const char **envp);
int Term_KeyHandler(tHWND Window, int bPress, uint32_t KeySym, uint32_t Translated);
int Term_MouseHandler(tHWND Window, int bPress, int Button, int Row, int Col);
+void Term_HandleOutput(int Len, const char *Buf);
// === GLOBALS ===
tHWND gMainWindow;
AxWin3_RichText_SendLine(gMainWindow, 2, "Third line! \x01""ff0000A red");
// </testing>
- AxWin3_ResizeWindow(gMainWindow, 600, 400);
- AxWin3_MoveWindow(gMainWindow, 50, 50);
+ AxWin3_ResizeWindow(gMainWindow, 80*8, 25*16);
+ AxWin3_MoveWindow(gMainWindow, 20, 50);
AxWin3_ShowWindow(gMainWindow, 1);
AxWin3_FocusWindow(gMainWindow);
// Spawn shell
- giChildStdout = open("/Devices/FIFO/anon", O_RDWR);
- giChildStdin = open("/Devices/FIFO/anon", O_RDWR);
+ giChildStdin = _SysOpen("/Devices/fifo/anon", OPENFLAG_READ|OPENFLAG_WRITE);
+ giChildStdout = _SysOpen("/Devices/fifo/anon", OPENFLAG_READ|OPENFLAG_WRITE);
+ if( giChildStdout == -1 || giChildStdin == -1 ) {
+ perror("Oh, fsck");
+ _SysDebug("out,in = %i,%i", giChildStdout, giChildStdin);
+ return -1;
+ }
{
int fds[] = {giChildStdin, giChildStdout, giChildStdout};
const char *argv[] = {"CLIShell", NULL};
- _SysSpawn("/Acess/Bin/CLIShell", argv, envp, 3, fds, NULL);
+ int pid = _SysSpawn("/Acess/Bin/CLIShell", argv, envp, 3, fds, NULL);
+ if( pid < 0 )
+ _SysDebug("ERROR: Shell spawn failed");
}
// Main loop
if( FD_ISSET(giChildStdout, &fds) )
{
+ _SysDebug("Activity on child stdout");
// Read and update screen
char buf[32];
- int len = read(giChildStdout, buf, sizeof(buf));
+ int len = _SysRead(giChildStdout, buf, sizeof(buf));
if( len <= 0 ) break;
Term_HandleOutput(len, buf);
#define _bitset(var,bit,set) do{if(set)var|=1<<(bit);else var&=1<<(bit);}while(0)
switch(KeySym)
{
- case KEY_LCTRL:
+ case KEYSYM_LEFTCTRL:
_bitset(ctrl_state, 0, bPress);
return 0;
- case KEY_RCTRL:
+ case KEYSYM_RIGHTCTRL:
_bitset(ctrl_state, 0, bPress);
return 0;
}
// Handle shortcuts
// - Ctrl-A -- Ctrl-Z
- if( ctrl_state && KeySym >= KEY_a && KeySym <= KEY_z )
+ if( ctrl_state && KeySym >= KEYSYM_a && KeySym <= KEYSYM_z )
{
- Translated = KeySym - KEY_a + 1;
+ Translated = KeySym - KEYSYM_a + 1;
}
if( Translated )
{
+ char buf[6];
+ int len;
+
// Encode and send
+ len = WriteUTF8(buf, Translated);
+
+ _SysWrite(giChildStdin, buf, len);
return 0;
}
// No translation, look for escape sequences to send
+ const char *str = NULL;
switch(KeySym)
{
- case KEY_LEFTARROW:
- // str = "\x1b[D";
+ case KEYSYM_LEFTARROW:
+ str = "\x1b[D";
break;
}
+ if( str )
+ {
+ _SysWrite(giChildStdin, str, strlen(str));
+ }
return 0;
}
Len -= esc_len;
ofs += esc_len;
}
+
+ Display_Flush();
}
* Acess GUI Terminal
* - By John Hodge (thePowersGang)
*
- * main.c
- * - Core
+ * vt100.c
+ * - VT100/xterm Emulation
*/
#include <string.h>
+#include <limits.h>
#include "include/vt100.h"
#include "include/display.h"
+static inline int min(int a, int b)
+{
+ return a < b ? a : b;
+}
+
int Term_HandleVT100(int Len, const char *Buf)
{
- const int max_length = 16;
- static char inc_buf[max_length]
+ #define MAX_VT100_ESCAPE_LEN 16
+ static char inc_buf[MAX_VT100_ESCAPE_LEN];
static int inc_len = 0;
if( inc_len > 0 || *Buf == '\x1b' )
{
- memcpy(inc_buf + inc_len, Buf, min(max_length - inc_len, Len));
+ memcpy(inc_buf + inc_len, Buf, min(MAX_VT100_ESCAPE_LEN - inc_len, Len));
// Handle VT100 (like) escape sequence
inc_len = 0;
{
case '\b':
// TODO: Backspace
+ Display_MoveCursor(-1, 0);
return 1;
case '\t':
- // TODO: tab
+ // TODO: tab (get current cursor pos, space until multiple of 8)
return 1;
case '\n':
Display_Newline(1);
return 1;
case '\r':
// TODO: Carriage return
- return ;
+ Display_MoveCursor(INT_MIN, 0);
+ return 1;
}
int ret = 0;