mirror of
				https://gitlab.com/sortix/sortix.git
				synced 2023-02-13 20:55:38 -05:00 
			
		
		
		
	Ported the user-space programs to use stdin for keyboard access.
The old keyboard API is hereby deprecated and unused.
This commit is contained in:
		
							parent
							
								
									fa9c7007b4
								
							
						
					
					
						commit
						c4264d9c2a
					
				
					 10 changed files with 277 additions and 267 deletions
				
			
		| 
						 | 
				
			
			@ -1,10 +1,7 @@
 | 
			
		|||
#include <libmaxsi/platform.h>
 | 
			
		||||
#include <libmaxsi/io.h>
 | 
			
		||||
#include <libmaxsi/thread.h>
 | 
			
		||||
#include <libmaxsi/keyboard.h>
 | 
			
		||||
#include <libmaxsi/string.h>
 | 
			
		||||
#include <libmaxsi/sortix-vga.h>
 | 
			
		||||
#include <libmaxsi/sortix-keyboard.h>
 | 
			
		||||
#include <sys/keycodes.h>
 | 
			
		||||
#include <sys/termmode.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -13,9 +10,6 @@
 | 
			
		|||
#include <error.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
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();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,11 @@
 | 
			
		|||
#include <libmaxsi/platform.h>
 | 
			
		||||
#include <libmaxsi/io.h>
 | 
			
		||||
#include <libmaxsi/thread.h>
 | 
			
		||||
#include <libmaxsi/keyboard.h>
 | 
			
		||||
#include <libmaxsi/string.h>
 | 
			
		||||
#include <libmaxsi/sortix-vga.h>
 | 
			
		||||
#include <libmaxsi/sortix-keyboard.h>
 | 
			
		||||
#include <libmaxsi/sortix-sound.h>
 | 
			
		||||
#include <sys/keycodes.h>
 | 
			
		||||
#include <sys/termmode.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -15,7 +15,6 @@
 | 
			
		|||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
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); }
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,7 @@
 | 
			
		|||
#include <libmaxsi/platform.h>
 | 
			
		||||
#include <libmaxsi/io.h>
 | 
			
		||||
#include <libmaxsi/thread.h>
 | 
			
		||||
#include <libmaxsi/keyboard.h>
 | 
			
		||||
#include <libmaxsi/sortix-vga.h>
 | 
			
		||||
#include <libmaxsi/sortix-keyboard.h>
 | 
			
		||||
#include <sys/keycodes.h>
 | 
			
		||||
#include <sys/termmode.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -12,9 +10,6 @@
 | 
			
		|||
#include <error.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
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();
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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] )
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,11 @@
 | 
			
		|||
#include <sys/keycodes.h>
 | 
			
		||||
#include <sys/termmode.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <error.h>
 | 
			
		||||
#include <libmaxsi/sortix-keyboard.h>
 | 
			
		||||
 | 
			
		||||
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';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										288
									
								
								utils/editor.cpp
									
										
									
									
									
								
							
							
						
						
									
										288
									
								
								utils/editor.cpp
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,17 +1,18 @@
 | 
			
		|||
#include <sys/keycodes.h>
 | 
			
		||||
#include <sys/termmode.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <error.h>
 | 
			
		||||
#include <libmaxsi/platform.h>
 | 
			
		||||
#include <libmaxsi/sortix-keyboard.h>
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,9 +4,9 @@
 | 
			
		|||
#include <errno.h>
 | 
			
		||||
#include <error.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <libmaxsi/platform.h>
 | 
			
		||||
#include <libmaxsi/process.h>
 | 
			
		||||
#include <libmaxsi/thread.h>
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
#include <sys/wait.h>
 | 
			
		||||
#include <sys/termmode.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -8,8 +9,6 @@
 | 
			
		|||
#include <fcntl.h>
 | 
			
		||||
#include <libmaxsi/platform.h>
 | 
			
		||||
#include <libmaxsi/process.h>
 | 
			
		||||
#include <libmaxsi/sortix-keyboard.h>
 | 
			
		||||
#include <libmaxsi/string.h>
 | 
			
		||||
 | 
			
		||||
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];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,5 @@
 | 
			
		|||
#include <sys/keycodes.h>
 | 
			
		||||
#include <sys/termmode.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -5,10 +7,6 @@
 | 
			
		|||
#include <fcntl.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <error.h>
 | 
			
		||||
#include <libmaxsi/platform.h>
 | 
			
		||||
#include <libmaxsi/sortix-keyboard.h>
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue