CursorMovement

This commit is contained in:
y4my4my4m 2023-05-10 16:16:34 +09:00
parent eb4bd2f932
commit 860702d685

View file

@ -15,7 +15,7 @@
#define SUPPRESS_GO_AHEAD 0x03 #define SUPPRESS_GO_AHEAD 0x03
#define TERMINAL_TYPE 0x18 #define TERMINAL_TYPE 0x18
#define LINEMODE 0x22 #define LINEMODE 0x22
#define NAWS 0x1F // NAWS (Negotiate About Window Size) #define NAWS 0x1F // (Negotiate About Window Size)
#define IS 0x00 #define IS 0x00
#define SB 0xFA #define SB 0xFA
#define SE 0xF0 #define SE 0xF0
@ -115,7 +115,7 @@ U0 HandleControlCodes(U8 ch) {
} }
"%c", ch; "%c", ch;
} }
} }
I64 TelnetOpen(U8 *host, U16 port) { I64 TelnetOpen(U8 *host, U16 port) {
I64 sock; I64 sock;
@ -142,6 +142,7 @@ U0 InputTask(U0 *args) {
DocTermNew; DocTermNew;
DocPrint(, "$$WW,1$$"); DocPrint(, "$$WW,1$$");
// DocCursor; // DocCursor;
// WinBorder(OFF);
U8 input_buffer[BUF_SIZE]; U8 input_buffer[BUF_SIZE];
U8 *temp, ch; U8 *temp, ch;
@ -171,22 +172,28 @@ U0 InputTask(U0 *args) {
TCPSocketSendString(sock, 0x27); TCPSocketSendString(sock, 0x27);
break; break;
} }
// else if (ch == CH_BACKSPACE) { else if (ch == CH_BACKSPACE) {
// TCPSocketSendString(sock, 0x08); // if (input_len > 0) {
// break; // // Decrease the length of the input
// input_len--;
// // Remove the character from the input buffer
// input_buffer[input_len] = '\0';
// DocClear;
// DocBottom(input_task->put_doc);
// "\n$$RED$$$BK,1$Input$BK,0$$$BLACK$$:";
// temp = MStrPrint("%s", input_buffer);
// DocPrint(input_task->put_doc, "%s", temp);
// } // }
}
else if (ch == 0x0F) { // TAB? else if (ch == 0x0F) { // TAB?
TCPSocketSendString(sock, 0x09); TCPSocketSendString(sock, 0x09);
break; break;
} }
else { else {
input_buffer[input_len++] = ch; input_buffer[input_len++] = ch;
// "%c", ch;
// DocBottom(input_task->put_doc);
DocPrint(input_task->put_doc, "%c", ch); DocPrint(input_task->put_doc, "%c", ch);
} }
} }
// input_buffer[input_len++] = '\0';
if (!force_disconnect) { if (!force_disconnect) {
SysLog(input_buffer); SysLog(input_buffer);
@ -216,6 +223,7 @@ U0 Telnet(U8 *host, U16 port=TELNET_PORT) {
I64 window_left = (GR_WIDTH - window_width) / 2; I64 window_left = (GR_WIDTH - window_width) / 2;
I64 window_top = (Fs->win_bottom - Fs->win_top - window_height) / 2; I64 window_top = (Fs->win_bottom - Fs->win_top - window_height) / 2;
DocPrint(, "$$WW,1$$");
WinHorz(Fs->win_left, Fs->win_left+window_width, Fs); WinHorz(Fs->win_left, Fs->win_left+window_width, Fs);
WinVert(Fs->win_top + window_top, Fs->win_top + window_top + window_height, Fs); WinVert(Fs->win_top + window_top, Fs->win_top + window_top + window_height, Fs);
// DocCursor(OFF); // DocCursor(OFF);
@ -354,21 +362,21 @@ U0 Telnet(U8 *host, U16 port=TELNET_PORT) {
} else if (ansi_code >= 40 && ansi_code <= 47) { } else if (ansi_code >= 40 && ansi_code <= 47) {
color_code = ansi_code - 40; // Set background color color_code = ansi_code - 40; // Set background color
} }
// else { else if (ansi_code < 10) {
// switch (ansi_code) { switch (ansi_code) {
// case 0: "$$BG$$$$FG$$"; break; // reset case 0: "$$BG$$$$FG$$"; break; // reset
// // case 1: ""; break; // TODO: bold // case 1: ""; break; // TODO: bold
// // case 2: ""; break; // TODO: dim // case 2: ""; break; // TODO: dim
// // case 3: ""; break; // TODO: italic // case 3: ""; break; // TODO: italic
// // case 4: "$$UL,1$$" + string + "$$UL,0$$"; break; // TODO: underline // case 4: "$$UL,1$$" + string + "$$UL,0$$"; break; // TODO: underline
// // case 5: "$$"; break; // TODO: blink // case 5: "$$"; break; // TODO: blink
// // case 6: ""; break; // TODO: fast blink // case 6: ""; break; // TODO: fast blink
// // case 7: "$$IV,1$$" + string + "$$IV,0$$"; break; // TODO: invert // case 7: "$$IV,1$$" + string + "$$IV,0$$"; break; // TODO: invert
// // case 8: ""; break; // TODO: hide (rare) // case 8: ""; break; // TODO: hide (rare)
// // case 9: ""; break; // TODO: strikethrough // case 9: ""; break; // TODO: strikethrough
// // case 10: ""; break; // TODO: primary font // case 10: ""; break; // TODO: primary font
// } }
// } }
switch (color_code) { switch (color_code) {
case 0: "$$BLACK$$"; break; case 0: "$$BLACK$$"; break;
case 1: "$$RED$$"; break; case 1: "$$RED$$"; break;
@ -384,13 +392,14 @@ U0 Telnet(U8 *host, U16 port=TELNET_PORT) {
ptr++; ptr++;
break; break;
} else if (*ptr == 'A') { } else if (*ptr == 'A') {
//CursorInWin(Fs, 0, -1); // Cursor Up // Cursor Up
"$$CM+LY,0,-%d$$", ansi_code;
ptr++; ptr++;
} else if (*ptr == 'B') { } else if (*ptr == 'B') {
//CursorInWin(Fs, 0, 1); // Cursor Down // Cursor Down
"$$CM+LY,0,+%d$$", ansi_code;
ptr++; ptr++;
} else if (*ptr == 'C') { } else if (*ptr == 'C') {
// Cursor Right
I64 i; I64 i;
// I64 move_count = 0; // I64 move_count = 0;
// while (IsDigit(*ptr)) { // while (IsDigit(*ptr)) {
@ -400,27 +409,71 @@ U0 Telnet(U8 *host, U16 port=TELNET_PORT) {
// if (move_count == 0) { // if (move_count == 0) {
// move_count = 1; // Default value if no number is provided // move_count = 1; // Default value if no number is provided
// } // }
for (i = 0; i < ansi_code; i++) { // for (i = 0; i < ansi_code; i++) {
Print(" "); // Print(" ");
} // }
// CursorInWin(Fs, move_count, 0); // Cursor Right
// Cursor Right
"$$CM+LX,+%d,0$$", ansi_code;
ptr++; ptr++;
} else if (*ptr == 'D') { } else if (*ptr == 'D') {
// CursorInWin(Fs, -1, 0); // Cursor Left // Cursor Left
"$$CM+LX,-%d,0$$", ansi_code;
ptr++; ptr++;
} else if (*ptr == 'E') { } else if (*ptr == 'E') {
"\n"; "\n";
ptr++; ptr++;
} else if (*ptr == 'H' || *ptr == 'f') { } else if (*ptr == 'H' || *ptr == 'f') {
// TODO: Cursor Position I64 row = 1, col = 1; // default values
// CursorInWin(Fs, arg1, arg2); U8 *next_ptr = ptr + 1;
ptr++;
// Parse the row number
if (IsDigit(*next_ptr)) {
row = ToI64(next_ptr);
while (IsDigit(*next_ptr)) next_ptr++; // Advance the pointer
}
// If there's a semicolon, parse the column number
if (*next_ptr == ';') {
next_ptr++;
if (IsDigit(*next_ptr)) {
col = ToI64(next_ptr);
while (IsDigit(*next_ptr)) next_ptr++; // Advance the pointer
}
}
// Now you can use row and col
Print("$$CM,%d,%d$$", row, col);
ptr = next_ptr; // update ptr to point to the character after the parsed sequence
} else if (*ptr == 'J') { } else if (*ptr == 'J') {
// Erase in Display // Erase in Display
if (ansi_code == 0) {
// Erase from cursor to end of display
// DocDelToNum(Fs->display_doc, Fs->display_doc->cur_entry->line_num);
} else if (ansi_code == 1) {
// Erase from cursor to beginning of display
// DocDelToEntry(Fs->display_doc, Fs->display_doc->cur_entry, FALSE);
} else if (ansi_code == 2) {
// Erase entire display
DocClear; DocClear;
}
ptr++; ptr++;
} else if (*ptr == 'K') { } else if (*ptr == 'K') {
// TODO: Erase in Line // Erase in Line
CDocEntry *cur_entry = Fs->display_doc->cur_entry;
CDocEntry *next_entry = cur_entry->next;
// Delete the current entry
if (!(cur_entry->de_flags & (DOCEF_HOLD | DOCEF_FILTER_SKIP))) {
Fs->display_doc->cur_entry = next_entry;
Fs->display_doc->cur_col = next_entry->min_col;
DocEntryDel(Fs->display_doc, cur_entry);
}
// Create a new entry (line) in its place
CDocEntry *new_entry = DocEntryNew(Fs->display_doc, DOCT_TEXT, "", 0);
DocInsEntry(Fs->display_doc, new_entry);
ptr++; ptr++;
} else if (*ptr == 'S') { } else if (*ptr == 'S') {
// TODO: Scroll Up // TODO: Scroll Up
@ -478,6 +531,7 @@ U0 Telnet(U8 *host, U16 port=TELNET_PORT) {
} }
} }
} }
// is this handled by the client or the server?
else if (*ptr == '|') { else if (*ptr == '|') {
// U8 code[3]; // U8 code[3];
// code[0] = ptr++; // code[0] = ptr++;
@ -514,7 +568,6 @@ U0 Telnet(U8 *host, U16 port=TELNET_PORT) {
"Telnet connection closed.\n"; "Telnet connection closed.\n";
} }
class CHostForm { class CHostForm {
U8 host[256] format "$$DA-P,LEN=255,A=\"Host:%s\"$$"; U8 host[256] format "$$DA-P,LEN=255,A=\"Host:%s\"$$";
U16 port format "A=\"Port:%d\""; U16 port format "A=\"Port:%d\"";
@ -530,43 +583,6 @@ U0 TelnetPrompt() {
} }
} }
// Telnet("mbrserver.com");
// Telnet("freechess.org");
// Telnet("dura-bbs.net", 6359);
// Telnet("darkrealms.ca");
// good to test refresh, line feed, etc
// Telnet("20forbeers.com", 1337);
// view public IP
// Telnet("telnetmyip.com")
// time
// Telnet("india.colorado.edu", 13);
// telehack
// Telnet("telehack.com");
// star trek game
// Telnet("mtrek.com", 1701);
// Telnet("xmltrek.com", 1701);
// Telnet("bbs.archaicbinary.net"); // Archaic Binary
// Telnet("ateraan.com", 4002); // New Worlds - Ateraan
// Telnet("avalon-rpg.com"); // Avalon: The Legend Lives
// Telnet("aardmud.org", 4000); // Aardwolf MUD
// Telnet("TextMMOde.com"); // Sands of Time / Deep Space MMO
// Telnet("legendofthereddragon.ca"); // Legend of the Red Dragon (Canada)
// Telnet("lord.stabs.org"); // Legend of the Red Dragon
// Telnet("thehatshop.mudhosting.net", 3000); // Hallowed Halls
// Telnet("batmud.bat.org"); // BatMUD
// Telnet("forgottenkingdoms.org", 4000); // Forgotten Kingdoms
// Telnet("igormud.org", 1701);// Igor MUD
// Telnet("achaea.com"); // Achaea, Dreams of Divine Lands
// Telnet("gcomm.com"); // Galacticomm BBS
// Telnet("1984.ws"); // 1984
// Telnet("telnet.holdfastbbs.ca", 2323);
// dev server // dev server
Telnet("localhost", 8888); Telnet("localhost", 8888);
// Telnet("bbs.bottomlessabyss.net", 2023);