diff --git a/games/conway.cpp b/games/conway.cpp index d47d9254..3a97ab75 100644 --- a/games/conway.cpp +++ b/games/conway.cpp @@ -1,10 +1,7 @@ #include -#include -#include -#include -#include #include -#include +#include +#include #include #include #include @@ -13,9 +10,6 @@ #include #include -using namespace Maxsi; -using namespace Maxsi::Keyboard; - const int width = 80; const int height = 25; @@ -118,24 +112,28 @@ void Render() void Update() { // Read the keyboard input from the user. - unsigned method = System::Keyboard::POLL; - uint32_t codepoint; - while ( (codepoint = System::Keyboard::ReceiveKeystroke(method) ) != 0 ) + unsigned termmode = TERMMODE_KBKEY + | TERMMODE_UNICODE + | TERMMODE_SIGNAL + | TERMMODE_NONBLOCK; + if ( settermmode(0, termmode) ) { error(1, errno, "settermmode"); } + while ( true ) { - bool keyup = codepoint & DEPRESSED; - if ( keyup ) { continue; } - codepoint &= ~DEPRESSED; - - if ( codepoint == 'r' || codepoint == 'R' ) { running = !running; } - - if ( !running ) + uint32_t codepoint; + ssize_t numbytes = read(0, &codepoint, sizeof(codepoint)); + if ( !numbytes ) { break; } + if ( numbytes < 0 ) { break; } + int kbkey = KBKEY_DECODE(codepoint); + if ( kbkey == KBKEY_R ) { running = !running; } + if ( running ) { continue; } + if ( kbkey == KBKEY_C ) { Clear(); } + if ( kbkey == KBKEY_W ) { if ( posy > 1 ) { posy--; } } + if ( kbkey == KBKEY_A ) { if ( posx > 1 ) { posx--; } } + if ( kbkey == KBKEY_S ) { if ( posy < height ) { posy++; } } + if ( kbkey == KBKEY_D ) { if ( posx < width ) { posx++; } } + if ( kbkey == KBKEY_SPACE ) { - if ( codepoint == 'c' || codepoint == 'C' ) { Clear(); } - if ( codepoint == 'w' || codepoint == 'W' ) { if ( posy > 1 ) { posy--; } } - if ( codepoint == 's' || codepoint == 'S' ) { if ( posy < height ) { posy++; } } - if ( codepoint == 'a' || codepoint == 'A' ) { if ( posx > 1 ) { posx--; } } - if ( codepoint == 'd' || codepoint == 'D' ) { if ( posx < width ) { posx++; } } - if ( codepoint == ' ' ) { lastframe[posy * rowstride + posx] = 1 - lastframe[posy * rowstride + posx]; } + lastframe[posy * rowstride + posx] = 1 - lastframe[posy * rowstride + posx]; } } @@ -161,11 +159,11 @@ int main(int argc, char* argv[]) int sleepms = 50; for ( int i = 1; i < argc; i++ ) { - if ( String::Compare(argv[i], "--help") == 0 ) { return usage(argc, argv); } - if ( String::Compare(argv[i], "--usage") == 0 ) { return usage(argc, argv); } - if ( String::Compare(argv[i], "--speed") == 0 && 1 < argc-i ) + if ( strcmp(argv[i], "--help") == 0 ) { return usage(argc, argv); } + if ( strcmp(argv[i], "--usage") == 0 ) { return usage(argc, argv); } + if ( strcmp(argv[i], "--speed") == 0 && 1 < argc-i ) { - sleepms = String::ToInt(argv[++i]); + sleepms = atoi(argv[++i]); } } @@ -175,7 +173,7 @@ int main(int argc, char* argv[]) // Update the game every 50th milisecond. while ( true ) { - Thread::USleep(sleepms * 1000); + usleep(sleepms * 1000); Update(); } diff --git a/games/pong.cpp b/games/pong.cpp index bd3ff331..58662baf 100644 --- a/games/pong.cpp +++ b/games/pong.cpp @@ -1,11 +1,11 @@ #include #include #include -#include #include #include -#include #include +#include +#include #include #include #include @@ -15,7 +15,6 @@ #include using namespace Maxsi; -using namespace Maxsi::Keyboard; int Init(); void Reset(); @@ -196,18 +195,24 @@ void Update() void ReadInput() { - unsigned method = System::Keyboard::POLL; - uint32_t codepoint; - while ( (codepoint = System::Keyboard::ReceiveKeystroke(method) ) != 0 ) + unsigned termmode = TERMMODE_KBKEY + | TERMMODE_UNICODE + | TERMMODE_SIGNAL + | TERMMODE_NONBLOCK; + if ( settermmode(0, termmode) ) { error(1, errno, "settermmode"); } + while ( true ) { - bool keyup = codepoint & DEPRESSED; - codepoint &= ~DEPRESSED; - - if ( codepoint == '\n' && keyup ) { Reset(); } - if ( codepoint == 'w' || codepoint == 'W' ) { p1vup = !keyup; } - if ( codepoint == 's' || codepoint == 'S' ) { p1vdown = !keyup; } - if ( codepoint == UP ) { p2vup = !keyup; } - if ( codepoint == DOWN ) { p2vdown = !keyup; } + uint32_t codepoint; + ssize_t numbytes = read(0, &codepoint, sizeof(codepoint)); + if ( !numbytes ) { return; } + if ( numbytes < 0 ) { return; } + int kbkey = KBKEY_DECODE(codepoint); + int abskbkey = (kbkey < 0) ? -kbkey : kbkey; + if ( kbkey == KBKEY_ENTER ) { Reset(); } + if ( abskbkey == KBKEY_W ) { p1vup = (0 < kbkey); } + if ( abskbkey == KBKEY_S ) { p1vdown = (0 < kbkey); } + if ( abskbkey == KBKEY_UP ) { p2vup = (0 < kbkey); } + if ( abskbkey == KBKEY_DOWN ) { p2vdown = (0 < kbkey); } } } diff --git a/games/snake.cpp b/games/snake.cpp index ce8d9f07..c2b7ce9e 100644 --- a/games/snake.cpp +++ b/games/snake.cpp @@ -1,9 +1,7 @@ #include -#include -#include -#include #include -#include +#include +#include #include #include #include @@ -12,9 +10,6 @@ #include #include -using namespace Maxsi; -using namespace Maxsi::Keyboard; - const int width = 80; const int height = 25; @@ -99,21 +94,25 @@ void Update() int newvely = vely; // Read the keyboard input from the user. - unsigned method = System::Keyboard::POLL; - uint32_t codepoint; - while ( (codepoint = System::Keyboard::ReceiveKeystroke(method) ) != 0 ) + unsigned termmode = TERMMODE_KBKEY + | TERMMODE_UNICODE + | TERMMODE_SIGNAL + | TERMMODE_NONBLOCK; + if ( settermmode(0, termmode) ) { error(1, errno, "settermmode"); } + while ( true ) { - if ( tabhack && codepoint == '\t' ) { tabhacking = true; } - if ( tabhack && codepoint == ('\t' | DEPRESSED ) ) { tabhacking = false; } - bool keyup = codepoint & DEPRESSED; - if ( keyup ) { continue; } - codepoint &= ~DEPRESSED; - - if ( codepoint == '\n' ) { Reset(); return; } - if ( codepoint == 'w' || codepoint == 'W' ) { newvelx = 0; newvely = -1; } - if ( codepoint == 'a' || codepoint == 'A' ) { newvelx = -1; newvely = 0; } - if ( codepoint == 's' || codepoint == 'S' ) { newvelx = 0; newvely = 1; } - if ( codepoint == 'd' || codepoint == 'D' ) { newvelx = 1; newvely = 0; } + uint32_t codepoint; + ssize_t numbytes = read(0, &codepoint, sizeof(codepoint)); + if ( !numbytes ) { break; } + if ( numbytes < 0 ) { break; } + int kbkey = KBKEY_DECODE(codepoint); + int abskbkey = (kbkey < 0) ? -kbkey : kbkey; + if ( tabhack && abskbkey == KBKEY_TAB ) { tabhacking = (0 < kbkey); } + if ( kbkey == KBKEY_ENTER ) { Reset(); return; } + if ( kbkey == KBKEY_W ) { newvelx = 0; newvely = -1; } + if ( kbkey == KBKEY_A ) { newvelx = -1; newvely = 0; } + if ( kbkey == KBKEY_S ) { newvelx = 0; newvely = 1; } + if ( kbkey == KBKEY_D ) { newvelx = 1; newvely = 0; } } if ( tabhack && tabhacking ) @@ -196,7 +195,7 @@ int main(int argc, char* argv[]) // Update the game every once in a while. while ( true ) { - Thread::USleep(speed * 1000); + usleep(speed * 1000); Update(); FlushVGA(); } diff --git a/sortix/fs/devfs.cpp b/sortix/fs/devfs.cpp index 3147e21d..3d534eed 100644 --- a/sortix/fs/devfs.cpp +++ b/sortix/fs/devfs.cpp @@ -370,6 +370,8 @@ namespace Sortix { } + extern DevTerminal* tty; + Device* DevDevFS::Open(const char* path, int flags, mode_t mode) { if ( (flags & O_LOWERFLAGS) == O_SEARCH ) @@ -380,7 +382,7 @@ namespace Sortix } if ( String::Compare(path, "/null") == 0 ) { return new DevNull; } - if ( String::Compare(path, "/tty") == 0 ) { return new DevLogTTY; } + if ( String::Compare(path, "/tty") == 0 ) { tty->Refer(); return tty; } if ( String::Compare(path, "/vga") == 0 ) { return new DevVGA; } if ( path[0] == '/' && path[1] == 'a' && path[2] == 't' && path[3] == 'a' && path[4] && !path[5] ) { diff --git a/sortix/keyboard.cpp b/sortix/keyboard.cpp index f109d45b..59241932 100644 --- a/sortix/keyboard.cpp +++ b/sortix/keyboard.cpp @@ -28,15 +28,16 @@ #include "keyboard.h" #include "kb/ps2.h" #include "kb/layout/us.h" -#include "kbapiadapter.h" +#include "logterminal.h" namespace Sortix { - KBAPIAdapter* tty; + DevTerminal* tty; uint32_t SysReceiveKeystroke() { - return tty->DequeueKeystroke(); + // TODO: Deprecated, please remove this. + return 0; } void Keyboard::Init() @@ -47,7 +48,7 @@ namespace Sortix KeyboardLayout* kblayout = new KBLayoutUS; if ( !kblayout ) { Panic("Could not allocate keyboard layout driver"); } - tty = new KBAPIAdapter(keyboard, kblayout); + tty = new LogTerminal(keyboard, kblayout); if ( !tty ) { Panic("Could not allocate a simple terminal"); } Syscall::Register(SYSCALL_RECEIVE_KEYSTROKE, (void*) SysReceiveKeystroke); diff --git a/utils/cat.cpp b/utils/cat.cpp index bbbc9565..cc90b3ba 100644 --- a/utils/cat.cpp +++ b/utils/cat.cpp @@ -1,10 +1,11 @@ +#include +#include #include #include #include #include #include #include -#include int cat(int argc, char* argv[]) { @@ -55,19 +56,27 @@ int main(int argc, char* argv[]) bool lastwasesc = false; - while (true) + // TODO: This is just compatibility with how cat worked in early versions of + // Sortix. Ideally, this should be removed and just cat the raw stdin. + // Read the keyboard input from the user. + unsigned termmode = TERMMODE_KBKEY | TERMMODE_UNICODE | TERMMODE_SIGNAL; + if ( settermmode(0, termmode) ) { error(1, errno, "settermmode"); } + while ( true ) { - unsigned method = System::Keyboard::POLL; - uint32_t codepoint = System::Keyboard::ReceiveKeystroke(method); - - if ( codepoint == 0 ) { continue; } - if ( codepoint & Maxsi::Keyboard::DEPRESSED ) { continue; } - if ( codepoint == Maxsi::Keyboard::UP ) { printf("\e[A"); fflush(stdout); continue; } - if ( codepoint == Maxsi::Keyboard::DOWN ) { printf("\e[B"); fflush(stdout); continue; } - if ( codepoint == Maxsi::Keyboard::RIGHT ) { printf("\e[C"); fflush(stdout); continue; } - if ( codepoint == Maxsi::Keyboard::LEFT ) { printf("\e[D"); fflush(stdout); continue; } - if ( codepoint == Maxsi::Keyboard::ESC ) { printf("\e["); fflush(stdout); lastwasesc = true; continue; } + uint32_t codepoint; + ssize_t numbytes = read(0, &codepoint, sizeof(codepoint)); + if ( !numbytes ) { break; } + if ( numbytes < 0 ) { break; } + int kbkey = KBKEY_DECODE(codepoint); + if ( kbkey < 0 ) { continue; } + if ( kbkey == KBKEY_UP ) { printf("\e[A"); fflush(stdout); continue; } + if ( kbkey == KBKEY_DOWN ) { printf("\e[B"); fflush(stdout); continue; } + if ( kbkey == KBKEY_RIGHT ) { printf("\e[C"); fflush(stdout); continue; } + if ( kbkey == KBKEY_LEFT ) { printf("\e[D"); fflush(stdout); continue; } + if ( kbkey == KBKEY_ESC ) { printf("\e["); fflush(stdout); lastwasesc = true; continue; } + if ( kbkey ) { continue; } if ( lastwasesc && codepoint == '[' ) { continue; } + if ( codepoint >= 0x80 ) { continue; } char msg[2]; msg[0] = codepoint; msg[1] = '\0'; diff --git a/utils/editor.cpp b/utils/editor.cpp index 20a669ba..d9fbf4b0 100644 --- a/utils/editor.cpp +++ b/utils/editor.cpp @@ -1,17 +1,18 @@ +#include +#include #include +#include #include #include #include #include #include -#include -#include -const int MODE_QUIT = 0; -const int MODE_TEXT = 1; -const int MODE_CONFIRM_QUIT = 2; -const int MODE_SAVE = 3; -const int MODE_LOAD = 4; +const int MODE_QUIT = 1; +const int MODE_TEXT = 2; +const int MODE_CONFIRM_QUIT = 3; +const int MODE_SAVE = 4; +const int MODE_LOAD = 5; const unsigned WIDTH = 80; const unsigned HEIGHT = 24; @@ -23,7 +24,7 @@ unsigned numlines = 1; char filename[256]; -bool bufferchanged; +bool bufferchanged = false; void clearbuffers() { @@ -35,14 +36,56 @@ void clearbuffers() bufferchanged = true; } -using namespace Maxsi; - void cursorto(unsigned x, unsigned y) { printf("\e[%u;%uH", y+1+1, x+1); fflush(stdout); } +char* readline(int fd) +{ + unsigned oldtermmode; + if ( gettermmode(fd, &oldtermmode) ) { return NULL; } + + unsigned termmode = TERMMODE_UNICODE + | TERMMODE_SIGNAL + | TERMMODE_UTF8 + | TERMMODE_LINEBUFFER + | TERMMODE_ECHO; + if ( settermmode(fd, termmode) ) { return NULL; } + + size_t lineused = 0; + size_t linelength = 32UL; + char* line = new char[linelength + 1]; + line[0] = '\0'; + + while ( true ) + { + char c; + ssize_t numbytes = read(fd, &c, sizeof(c)); + if ( numbytes < 0 ) { delete[] line; line = NULL; break; } + if ( !numbytes ) { break; } + if ( c == '\n' ) { break; } + + if ( lineused == linelength ) + { + size_t newlinelength = 2 * linelength; + char* newline = new char[newlinelength]; + if ( !newline ) { delete[] line; line = NULL; break; } + memcpy(newline, line, lineused * sizeof(*line)); + delete[] line; + line = newline; + linelength = newlinelength; + } + + line[lineused++] = c; + line[lineused] = '\0'; + } + + if ( settermmode(fd, oldtermmode) ) { delete[] line; line = NULL; } + return line; +} + void drawtextmode() { const char* printfilename = ( strlen(filename) > 0 ) ? filename : "New Buffer"; @@ -64,6 +107,7 @@ unsigned textmode() drawtextmode(); bool ctrl = false; + unsigned dectrlmode = 0; int oldcursorx = -1; int oldcursory = -1; @@ -76,46 +120,63 @@ unsigned textmode() oldcursory = cursory; } - unsigned method = System::Keyboard::POLL; - uint32_t codepoint = System::Keyboard::ReceiveKeystroke(method); + unsigned termmode = TERMMODE_KBKEY | TERMMODE_UNICODE | TERMMODE_SIGNAL; + if ( settermmode(0, termmode) ) { error(1, errno, "settermmode"); } - if ( codepoint == 0 ) { continue; } - if ( codepoint & Keyboard::DEPRESSED ) + uint32_t codepoint = 0; + ssize_t numbytes = read(0, &codepoint, sizeof(codepoint)); + if ( !numbytes ) { break; } + if ( numbytes < 0 ) { error(1, errno, "read stdin"); } + if ( numbytes < sizeof(codepoint) ) { + printf("unexpectedly got %zi bytes\n", numbytes); + printf("bytes: %x\n", codepoint); + + +fprintf(stderr, "bad stdin data\n"); exit(1); } + if ( !codepoint ) { continue; } + int kbkey = KBKEY_DECODE(codepoint); + if ( kbkey ) { - if ( codepoint == Keyboard::CTRL | Keyboard::DEPRESSED ) { ctrl = false; } + if ( kbkey == -KBKEY_LCTRL && dectrlmode ) { return dectrlmode; } + int abskbkey = (kbkey < 0) ? -kbkey : kbkey; + if ( abskbkey == KBKEY_LCTRL ) { ctrl = (0 < kbkey); continue; } + switch ( kbkey ) + { + case -KBKEY_ESC: + return MODE_CONFIRM_QUIT; + break; + case KBKEY_UP: + if ( cursory ) { cursory--; } + break; + case KBKEY_DOWN: + if ( cursory < numlines-1 ) { cursory++; } + break; + case KBKEY_LEFT: + if ( cursorx ) { cursorx--; } + break; + case KBKEY_RIGHT: + if ( cursorx < WIDTH-1 ) { cursorx++; } + break; + case KBKEY_O: + if ( ctrl ) { dectrlmode = MODE_SAVE; } + break; + case KBKEY_R: + if ( ctrl ) { dectrlmode = MODE_LOAD; } + break; + case KBKEY_X: + if ( ctrl ) { dectrlmode = MODE_CONFIRM_QUIT; } + break; + } continue; } - if ( ctrl ) - { - if ( codepoint == 'o' || codepoint == 'O' ) { return MODE_SAVE; } - if ( codepoint == 'r' || codepoint == 'R' ) { return MODE_LOAD; } - if ( codepoint == 'x' || codepoint == 'X' ) { return MODE_CONFIRM_QUIT; } - continue; - } + if ( ctrl ) { continue; } switch ( codepoint ) { - case Keyboard::ESC: - return MODE_CONFIRM_QUIT; - break; - case Keyboard::CTRL: - ctrl = true; - break; - case Keyboard::UP: - if ( cursory ) { cursory--; } - break; case '\n': cursorx = 0; - if ( cursory < HEIGHT-1 ) { numlines++; } - case Keyboard::DOWN: - if ( cursory < numlines-1 ) { cursory++; } - break; - case Keyboard::LEFT: - if ( cursorx ) { cursorx--; } - break; - case Keyboard::RIGHT: - if ( cursorx < WIDTH-1 ) { cursorx++; } + if ( cursory < HEIGHT-1 ) { numlines++; cursory++; } break; case '\b': if ( cursorx ) @@ -179,24 +240,32 @@ unsigned confirmquit() printf("\e37m\e40m\e[2J\e[H"); printf("There are unsaved changes: Are you sure you want to quit? (Y/N)\n"); + if ( settermmode(0, TERMMODE_KBKEY | TERMMODE_SIGNAL | TERMMODE_ECHO) ) + { + error(1, errno, "settermmode"); + } + while ( true ) { - unsigned method = System::Keyboard::POLL; - uint32_t codepoint = System::Keyboard::ReceiveKeystroke(method); + uint32_t codepoint; + ssize_t numbytes = read(0, &codepoint, sizeof(codepoint)); + if ( !numbytes ) { exit(0); } + if ( numbytes < 0 ) { error(1, errno, "read stdin"); } + if ( numbytes < sizeof(codepoint) ) { fprintf(stderr, "bad stdin data\n"); exit(1); } + if ( !codepoint ) { continue; } - if ( codepoint == 0 ) { continue; } - if ( codepoint & Keyboard::DEPRESSED ) { continue; } + int kbkey = KBKEY_DECODE(codepoint); + if ( !kbkey ) { continue; } + if ( 0 < kbkey ) { continue; } - switch ( codepoint ) + switch ( kbkey ) { - case Keyboard::ESC: + case -KBKEY_ESC: return MODE_QUIT; break; - case 'n': - case 'N': + case -KBKEY_N: return MODE_TEXT; - case 'y': - case 'Y': + case -KBKEY_Y: return MODE_QUIT; default: printf("Would you like to quit? N for No, Y for Yes\n"); @@ -219,6 +288,7 @@ bool savetofile(const char* path) } if ( close(fd) ) { error(0, errno, "close: %s", path); return false; } + strcpy(filename, path); return true; } @@ -226,54 +296,21 @@ int savemode() { printf("\e37m\e40m\e[2J\e[H"); printf("Please enter the filename you wish to save the text to and press " - "enter. Type an empty filename or press ESC to abort.\n\n"); + "enter. Type an empty filename to abort.\n\n"); - char writefilename[256]; - strcpy(writefilename, filename); + char* storage = NULL; -retry: - size_t len = strlen(writefilename); - printf("File Name to Write: %s", writefilename); - fflush(stdout); - - bool readytosave = false; - - while ( !readytosave ) + do { - unsigned method = System::Keyboard::POLL; - uint32_t codepoint = System::Keyboard::ReceiveKeystroke(method); + delete[] storage; + printf("File to Write: "); + fflush(stdout); + storage = readline(0); + if ( !storage ) { error(1, errno, "readline"); } + if ( !storage[0] ) { delete[] storage; return MODE_TEXT; } + } while ( !savetofile(storage) ); + delete[] storage; - if ( codepoint == 0 ) { continue; } - if ( codepoint & Keyboard::DEPRESSED ) { continue; } - - switch ( codepoint ) - { - case Keyboard::ESC: - return MODE_TEXT; - break; - case '\b': - if ( 0 < len ) { printf("\b"); fflush(stdout); writefilename[--len] = 0; } - break; - case '\n': - if ( len == 0 ) { return MODE_TEXT; } - readytosave = true; - printf("\n"); - break; - default: - if ( 0x80 <= codepoint ) { continue; } - writefilename[len++] = codepoint; - writefilename[len+1] = 0; - char msg[2]; - msg[0] = codepoint; - msg[1] = 0; - printf("%s", msg); - fflush(stdout); - } - } - - if ( !savetofile(writefilename) ) { goto retry; } - - strcpy(filename, writefilename); bufferchanged = false; printf("Succesfully saved\n"); @@ -318,6 +355,8 @@ bool loadfromfile(const char* path) cursorx = 0; cursory = 0; + strcpy(filename, path); + return true; } @@ -325,60 +364,21 @@ int loadmode() { printf("\e37m\e40m\e[2J\e[H"); printf("Please enter the filename you wish to load text from and press " - "enter. Type an empty filename or press ESC to abort.\n\n"); + "enter. Type an empty filename to abort.\n\n"); - char loadfilename[256]; - loadfilename[0] = 0; + char* storage = NULL; -retry: - size_t len = strlen(loadfilename); - printf("File Name to Load: %s", loadfilename); - fflush(stdout); - - bool readytoload = false; - - while ( !readytoload ) + do { - unsigned method = System::Keyboard::POLL; - uint32_t codepoint = System::Keyboard::ReceiveKeystroke(method); + delete[] storage; + printf("File to Load: "); + fflush(stdout); + storage = readline(0); + if ( !storage ) { error(1, errno, "readline"); } + if ( !storage[0] ) { delete[] storage; return MODE_TEXT; } + } while ( !loadfromfile(storage) ); + delete[] storage; - if ( codepoint == 0 ) { continue; } - if ( codepoint & Keyboard::DEPRESSED ) { continue; } - - switch ( codepoint ) - { - case Keyboard::ESC: - return MODE_TEXT; - break; - case '\b': - if ( 0 < len ) { printf("\b"); fflush(stdout); loadfilename[--len] = 0; } - break; - case '\n': - if ( len == 0 ) { return MODE_TEXT; } - readytoload = true; - printf("\n"); - break; - default: - if ( 0x80 <= codepoint ) { continue; } - loadfilename[len++] = codepoint; - loadfilename[len+1] = 0; - char msg[2]; - msg[0] = codepoint; - msg[1] = 0; - printf("%s", msg); - fflush(stdout); - } - } - - if ( !loadfromfile(loadfilename) ) - { - clearbuffers(); - cursorx = 0; - cursory = 0; - goto retry; - } - - strcpy(filename, loadfilename); bufferchanged = false; return MODE_TEXT; diff --git a/utils/init.cpp b/utils/init.cpp index e255c4ea..825597ae 100644 --- a/utils/init.cpp +++ b/utils/init.cpp @@ -4,9 +4,9 @@ #include #include #include +#include #include #include -#include using namespace Maxsi; @@ -39,7 +39,7 @@ int main(int argc, char* argv[]) printf("\r\e[m\e[J"); fflush(stdout); - pid_t childpid = Process::Fork(); + pid_t childpid = fork(); if ( childpid < 0 ) { perror("fork"); return 2; } return ( childpid == 0 ) ? child() : parent(childpid); diff --git a/utils/mxsh.cpp b/utils/mxsh.cpp index 73c21025..68e82378 100644 --- a/utils/mxsh.cpp +++ b/utils/mxsh.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -8,8 +9,6 @@ #include #include #include -#include -#include using namespace Maxsi; @@ -17,6 +16,13 @@ int status = 0; void command() { + unsigned termmode = TERMMODE_UNICODE + | TERMMODE_SIGNAL + | TERMMODE_UTF8 + | TERMMODE_LINEBUFFER + | TERMMODE_ECHO; + settermmode(0, termmode); + const size_t CWD_SIZE = 512; char cwd[CWD_SIZE]; const char* wd = getcwd(cwd, CWD_SIZE); @@ -31,35 +37,23 @@ void command() while (true) { - unsigned method = System::Keyboard::POLL; - uint32_t codepoint = System::Keyboard::ReceiveKeystroke(method); - - if ( codepoint == 0 ) { continue; } - if ( codepoint & Maxsi::Keyboard::DEPRESSED ) { continue; } - if ( codepoint >= 0x80 ) { continue; } - - if ( codepoint == '\b' ) - { - if ( 0 < commandused ) { printf("\b"); fflush(stdout); commandused--; } - continue; - } - - if ( commandsize <= commandused && codepoint != '\n' ) { continue; } - - char msg[2]; msg[0] = codepoint; msg[1] = '\0'; - printf("%s", msg); - fflush(stdout); - - if ( codepoint == '\n' ) { command[commandused] = '\0'; break; } - - command[commandused++] = codepoint; + char c; + ssize_t bytesread = read(1, &c, sizeof(c)); + if ( bytesread < 0 ) { error(64, errno, "read stdin"); } + if ( !bytesread ) { break; } + if ( !c ) { continue; } + if ( c == '\n' ) { break; } + if ( commandsize <= commandused ) { continue; } + command[commandused++] = c; } + command[commandused] = '\0'; + if ( command[0] == '\0' ) { return; } - if ( String::Compare(command, "$?") == 0 ) { printf("%u\n", status); status = 0; return; } - if ( String::Compare(command, "$$") == 0 ) { printf("%u\n", Process::GetPID()); status = 0; return; } - if ( String::Compare(command, "$PPID") == 0 ) { printf("%u\n", Process::GetParentPID()); status = 0; return; } + if ( strcmp(command, "$?") == 0 ) { printf("%u\n", status); status = 0; return; } + if ( strcmp(command, "$$") == 0 ) { printf("%u\n", Process::GetPID()); status = 0; return; } + if ( strcmp(command, "$PPID") == 0 ) { printf("%u\n", Process::GetParentPID()); status = 0; return; } int argc = 0; const char* argv[256]; diff --git a/utils/pager.cpp b/utils/pager.cpp index e9544491..74318269 100644 --- a/utils/pager.cpp +++ b/utils/pager.cpp @@ -1,3 +1,5 @@ +#include +#include #include #include #include @@ -5,10 +7,6 @@ #include #include #include -#include -#include - -using namespace Maxsi; int main(int argc, char* argv[]) { @@ -45,17 +43,21 @@ int main(int argc, char* argv[]) { printf("\n--pager--"); fflush(stdout); - uint32_t codepoint; + settermmode(0, TERMMODE_KBKEY | TERMMODE_SIGNAL); bool doexit = false; + int kbkey; do { - unsigned method = System::Keyboard::POLL; - codepoint = System::Keyboard::ReceiveKeystroke(method); - if ( codepoint == Keyboard::DOWN ) { break; } - if ( codepoint == Keyboard::PGDOWN ) { linesleft = HEIGHT-1; break; } - if ( codepoint == 'q' ) { doexit = true; break; } - } - while ( codepoint != '\n' ); + uint32_t codepoint; + ssize_t numbytes = read(0, &codepoint, sizeof(codepoint)); + if ( !numbytes ) { exit(0); } + if ( numbytes < 0 ) { error(1, errno, "read(stdin)"); } + if ( numbytes < sizeof(codepoint) ) { error(1, errno, "bad stdin"); } + if ( !(kbkey = KBKEY_DECODE(codepoint)) ) { continue; } + if ( kbkey == KBKEY_DOWN ) { break; } + if ( kbkey == KBKEY_PGDOWN ) { linesleft = HEIGHT-1; break; } + if ( kbkey == -KBKEY_Q ) { doexit = true; break; } + } while ( kbkey != KBKEY_ENTER ); printf("\r\e[J"); if ( doexit ) { exit(result); } continue;