Skip to content
Snippets Groups Projects
Commit b9ee6b4f authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

inkey() now returns TERM_KEY_* constants (left, right, up, down, etc.)

Use the same terminal ctrl key values as sbbs.
getstr() might need some love here (especiall left/right arrow).
parent 45c826ae
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* Synchronet External Program Software Development Kit */ /* Synchronet External Program Software Development Kit */
/* $Id: xsdk.c,v 1.41 2016/08/13 18:57:00 rswindell Exp $ */ /* $Id: xsdk.c,v 1.41 2020/09/20 18:57:00 rswindell Exp $ */
/**************************************************************************** /****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.tab-size 4 (Plain Text/Source Code File Header) *
...@@ -581,6 +581,7 @@ int keyhit() ...@@ -581,6 +581,7 @@ int keyhit()
char inkey(long mode) char inkey(long mode)
{ {
static in_ctrl_p; static in_ctrl_p;
static ansi_len;
uchar ch=0,hour,min,sec; uchar ch=0,hour,min,sec;
long tleft; long tleft;
int i=0; int i=0;
...@@ -621,19 +622,19 @@ char inkey(long mode) ...@@ -621,19 +622,19 @@ char inkey(long mode)
i=stdin_getch(); i=stdin_getch();
switch(i) { switch(i) {
case 0x47: /* Home - Same as Ctrl-B */ case 0x47: /* Home - Same as Ctrl-B */
return(2); /* ctrl-b beginning of line */ return TERM_KEY_HOME; /* ctrl-b beginning of line */
case 0x4b: /* Left Arrow - same as ctrl-] */ case 0x4b: /* Left Arrow - same as ctrl-] */
return(0x1d); return TERM_KEY_LEFT;
case 0x4d: /* Right Arrow - same as ctrl-f */ case 0x4d: /* Right Arrow - same as ctrl-f */
return(6); return TERM_KEY_RIGHT;
case 0x48: /* Up arrow - same as ctrl-^ */ case 0x48: /* Up arrow - same as ctrl-^ */
return(0x1e); return TERM_KEY_UP;
case 0x50: /* Down arrow - same as CR */ case 0x50: /* Down arrow - same as CR */
return(CR); return TERM_KEY_DOWN;
case 0x4f: /* End - same as Ctrl-E */ case 0x4f: /* End - same as Ctrl-E */
return(5); /* ctrl-e - end of line */ return TERM_KEY_END;
case 0x52: /* Insert */ case 0x52: /* Insert */
return(0x1f); /* ctrl-minus - insert mode */ return TERM_KEY_INSERT; /* ctrl-minus - insert mode */
case 0x53: /* Delete */ case 0x53: /* Delete */
return(0x7f); /* ctrl-bkspc - del cur char */ return(0x7f); /* ctrl-bkspc - del cur char */
} }
...@@ -641,6 +642,44 @@ char inkey(long mode) ...@@ -641,6 +642,44 @@ char inkey(long mode)
ch=i; ch=i;
} }
if(ch == ESC) {
ansi_len = !ansi_len;
}
else if(ansi_len == 1) {
if(ch == '[')
ansi_len++;
else
ansi_len = 0;
}
else if(ansi_len == 2) {
ansi_len =0 ;
switch(ch) {
case 'A':
return TERM_KEY_UP;
case 'B':
return TERM_KEY_DOWN;
case 'C':
return TERM_KEY_RIGHT;
case 'D':
return TERM_KEY_LEFT;
case 'H':
return TERM_KEY_HOME;
case 'V':
return TERM_KEY_PAGEUP;
case 'U':
return TERM_KEY_PAGEDN;
case 'F':
case 'K':
return TERM_KEY_END;
case '@':
return TERM_KEY_INSERT;
default:
return 0;
}
}
if(ansi_len)
return 0;
if(ch==0x10 || ch==0x1e) { /* Ctrl-P or Ctrl-^ */ if(ch==0x10 || ch==0x1e) { /* Ctrl-P or Ctrl-^ */
if(in_ctrl_p || !ctrl_dir[0]) /* keep from being recursive */ if(in_ctrl_p || !ctrl_dir[0]) /* keep from being recursive */
return(0); return(0);
...@@ -974,7 +1013,7 @@ int getstr(char *strout, size_t maxlen, long mode) ...@@ -974,7 +1013,7 @@ int getstr(char *strout, size_t maxlen, long mode)
} }
outchar(str1[i++]=1); outchar(str1[i++]=1);
break; break;
case 2: /* Ctrl-B Beginning of Line */ case TERM_KEY_HOME: /* Ctrl-B Beginning of Line */
if(user_misc&ANSI && i) { if(user_misc&ANSI && i) {
bprintf("\x1b[%dD",i); bprintf("\x1b[%dD",i);
i=0; i=0;
...@@ -1005,7 +1044,7 @@ int getstr(char *strout, size_t maxlen, long mode) ...@@ -1005,7 +1044,7 @@ int getstr(char *strout, size_t maxlen, long mode)
l-=x-i; /* l=new length */ l-=x-i; /* l=new length */
} }
break; break;
case 5: /* Ctrl-E End of line */ case TERM_KEY_END: /* Ctrl-E End of line */
if(user_misc&ANSI && i<l) { if(user_misc&ANSI && i<l) {
bprintf("\x1b[%dC",l-i); /* move cursor right one */ bprintf("\x1b[%dC",l-i); /* move cursor right one */
i=l; i=l;
...@@ -1687,7 +1726,7 @@ int nopen(const char *str, int access) ...@@ -1687,7 +1726,7 @@ int nopen(const char *str, int access)
bprintf("\r\nNOPEN COLLISION - File: %s Count: %d\r\n" bprintf("\r\nNOPEN COLLISION - File: %s Count: %d\r\n"
,str,count); ,str,count);
if(file==-1 && errno==EACCES) if(file==-1 && errno==EACCES)
bputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); bprintf("\7\r\nNOPEN: ACCESS DENIED: %s\r\n\7", str);
return(file); return(file);
} }
......
...@@ -2,13 +2,13 @@ ...@@ -2,13 +2,13 @@
/* Synchronet XSDK constants, macros, and type definitions */ /* Synchronet XSDK constants, macros, and type definitions */
/* $Id: xsdkdefs.h,v 1.10 2009/01/01 12:45:59 deuce Exp $ */ /* $Id: xsdkdefs.h,v 1.11 2020/09/20 12:45:59 deuce Exp $ */
/**************************************************************************** /****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* * * *
* Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * * Copyright Rob Swindell - http://www.synchro.net/copyright.html *
* * * *
* This library is free software; you can redistribute it and/or * * This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License * * modify it under the terms of the GNU Lesser General Public License *
...@@ -290,6 +290,19 @@ enum { /* Node Action */ ...@@ -290,6 +290,19 @@ enum { /* Node Action */
#define KEY_BUFSIZE 256 #define KEY_BUFSIZE 256
#endif #endif
/* Special terminal key mappings */
#define TERM_KEY_HOME CTRL_B
#define TERM_KEY_END CTRL_E
#define TERM_KEY_UP CTRL_CARET
#define TERM_KEY_DOWN CTRL_J
#define TERM_KEY_LEFT CTRL_CLOSE_BRACKET
#define TERM_KEY_RIGHT CTRL_F
#define TERM_KEY_INSERT CTRL_V
#define TERM_KEY_DELETE DEL
#define TERM_KEY_ABORT CTRL_C
#define TERM_KEY_PAGEUP CTRL_P
#define TERM_KEY_PAGEDN CTRL_N
#define CRLF { outchar(CR); outchar(LF); } #define CRLF { outchar(CR); outchar(LF); }
#define SYSOP (user_level>=sysop_level) /* Is current user sysop t/f macro */ #define SYSOP (user_level>=sysop_level) /* Is current user sysop t/f macro */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment