Usermode/GUITerminal - Progressing, compiles and runs but stubbed
authorJohn Hodge (sonata) <[email protected]>
Sun, 20 Jan 2013 06:29:48 +0000 (14:29 +0800)
committerJohn Hodge (sonata) <[email protected]>
Sun, 20 Jan 2013 06:29:48 +0000 (14:29 +0800)
Usermode/Applications/gui_shell_src/Makefile
Usermode/Applications/gui_shell_src/display.c [new file with mode: 0644]
Usermode/Applications/gui_shell_src/include/display.h
Usermode/Applications/gui_shell_src/main.c
Usermode/Applications/gui_shell_src/vt100.c

index 7ccfff4..a38f135 100644 (file)
@@ -2,9 +2,9 @@
 
 -include ../Makefile.cfg
 
-LDFLAGS += -laxwin3
+LDFLAGS += -laxwin3 -lunicode
 
-OBJ = main.o
+OBJ = main.o vt100.o display.o
 BIN = terminal
 DIR := Apps/AxWin/3.0
 
diff --git a/Usermode/Applications/gui_shell_src/display.c b/Usermode/Applications/gui_shell_src/display.c
new file mode 100644 (file)
index 0000000..750f98d
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * 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();
+}
+
index 80bc69c..648a2de 100644 (file)
@@ -8,6 +8,8 @@
 #ifndef _DISPLAY_H_
 #define _DISPLAY_H_
 
+#include <stdint.h>
+
 extern void    Display_AddText(int Length, const char *UTF8Text);
 extern void    Display_Newline(int bCarriageReturn);
 extern void    Display_SetCursor(int Row, int Col);
@@ -16,6 +18,11 @@ extern void  Display_ClearLine(int Dir);     // 0: All, 1: Forward, -1: Reverse
 extern void    Display_ClearLines(int Dir);    // 0: All, 1: Forward, -1: Reverse
 extern void    Display_SetForeground(uint32_t RGB);
 extern void    Display_SetBackground(uint32_t RGB);
+/**
+ * \brief Ensure that recent updates are flushed to the server
+ * \note Called at the end of an "input" buffer
+ */
+extern void    Display_Flush(void);
 
 #endif
 
index c7aac85..3729d70 100644 (file)
@@ -8,14 +8,19 @@
 #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;
@@ -55,19 +60,26 @@ int main(int argc, char *argv[], const char **envp)
        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
@@ -81,9 +93,10 @@ int main(int argc, char *argv[], const char **envp)
                
                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);
@@ -101,10 +114,10 @@ int Term_KeyHandler(tHWND Window, int bPress, uint32_t KeySym, uint32_t Translat
        #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;
        }
@@ -112,25 +125,36 @@ int Term_KeyHandler(tHWND Window, int bPress, uint32_t KeySym, uint32_t Translat
 
        // 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;
 }
 
@@ -156,5 +180,7 @@ void Term_HandleOutput(int Len, const char *Buf)
                Len -= esc_len;
                ofs += esc_len;
        }
+       
+       Display_Flush();
 }
 
index 51c8016..190f42c 100644 (file)
@@ -2,22 +2,28 @@
  * 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;
@@ -28,16 +34,18 @@ int Term_HandleVT100(int Len, const char *Buf)
        {
        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;

UCC git Repository :: git.ucc.asn.au