added multi-byte and japanese translation support

This commit is contained in:
chombier 2001-05-10 14:42:14 +00:00
parent 8d24259a36
commit ee8511591c
38 changed files with 3496 additions and 1813 deletions

Binary file not shown.

View File

@ -11,7 +11,7 @@
#define VMajor 2
#define VMinor (1 * 16) + 0
#define VStage beta
#define VRelease 5
#define VShortString "2.1b5"
#define VRelease 6
#define VShortString "2.1b6"
#define CopyrightString "©2000-2001 J.-P. Stierlin"

View File

@ -72,41 +72,29 @@ void initLinemode(struct WindRec *tw)
void process_key(unsigned char ascii,struct WindRec *tw)
{
if (tw->litNext) //do no processing on next key
{
if (tw->litNext) {
//do no processing on next key
tw->litNext = FALSE;
if (tw->kblen < (MAXKB -1)) /* Add to buffer if not full */
tw->kbbuf[tw->kblen++] = ascii;
else
{
netpush(tw->port);
netwrite( tw->port, tw->kbbuf, tw->kblen); /* if full send buffer */
tw->kbbuf[0]=ascii;
tw->kblen=1;
}
if (tw->echo)
{
if (ascii>31 && ascii <127) /* add these chars to buffer */
{
kbwrite(tw, &ascii, 1);
if (tw->echo) {
if (ascii>31 && ascii <127) {
/* add these chars to buffer */
parse(tw, &ascii, 1);
return;
}
else
return;
return;
}
}
if (tw->lmodeBits & 2) // TRAPSIG mode active
{
if (tw->lmodeBits & 2) {
// TRAPSIG mode active
unsigned char toSend[2] = {IAC,0};
short whichSignal = 0;
if (ascii == tw->slc[SLC_IP])
{
if (ascii == tw->slc[SLC_IP]) {
whichSignal = SLC_IP;
toSend[1] = TEL_IP; // RAB BetterTelnet 2.0b1
}
else if (ascii == tw->slc[SLC_SUSP]) // RAB BetterTelnet 2.0b1
{
toSend[1] = TEL_IP;
} else if (ascii == tw->slc[SLC_SUSP]) {
whichSignal = SLC_SUSP;
toSend[1] = TEL_SUSP;
}
@ -151,19 +139,9 @@ void process_key(unsigned char ascii,struct WindRec *tw)
if ((tw->lmodeBits & L_SOFT_TAB)&&(ascii == 0x09)) // SOFT_TAB mode active; expand tab into spaces
{
short numSpaces = VSIgetNextTabDistance();
while (numSpaces > 0)
{
while ((numSpaces > 0)&&(tw->kblen < (MAXKB -1)))
{
tw->kbbuf[tw->kblen++] = 0x20; //space
numSpaces--;
}
if (tw->kblen == (MAXKB -1))
{
netpush(tw->port);
netwrite( tw->port, tw->kbbuf, tw->kblen); /* if full send buffer */
tw->kblen=0;
}
unsigned char spacechar = ' ';
while (numSpaces > 0) {
kbwrite(tw, &spacechar, 1);
}
if (tw->echo)
parse(tw, &ascii, 1);
@ -178,11 +156,9 @@ void process_key(unsigned char ascii,struct WindRec *tw)
if (ascii == '\015') //CR
{ //since we are in edit, send the buffer and CR-LF
if (tw->kblen > 0)
netwrite(tw->port, tw->kbbuf, tw->kblen);
kbflush(tw);
netpush(tw->port);
netwrite(tw->port,"\015\012",2);
tw->kblen = 0;
if (tw->echo)
parse(tw,(unsigned char *) "\012\015",2);
return;
@ -218,8 +194,7 @@ void process_key(unsigned char ascii,struct WindRec *tw)
else if ((ascii == tw->slc[SLC_EOF]) && (tw->lmodeBits & 2))
{ //push the buffer, send IAC EOF (RAB BetterTelnet 2.0b1 - only under TRAPSIG)
char eofString[2] = { IAC, TEL_EOF };
if (tw->kblen > 0)
netwrite(tw->port, tw->kbbuf, tw->kblen);
kbflush(tw);
// RAB BetterTelnet 2.0b1 - BAD! BAD! BAD!
// Fix for *BSD (and probably others):
// Putting ^D into Telnet's key buffer after sending an EOF could make it pop up later, so
@ -227,7 +202,6 @@ void process_key(unsigned char ascii,struct WindRec *tw)
// after a cat command which terminated with ^D caused a logout. Yuck.
// tw->kbbuf[0]=ascii;
// tw->kblen=1;
tw->kblen = 0;
netpush(tw->port);
netwrite(tw->port,eofString, 2);
return;
@ -282,26 +256,15 @@ void process_key(unsigned char ascii,struct WindRec *tw)
}
else if ((ascii == tw->slc[SLC_FORW1])||(ascii == tw->slc[SLC_FORW1]))
{
if (tw->kblen > 0)
netwrite(tw->port, tw->kbbuf, tw->kblen);
netpush(tw->port);
kbflush(tw);
netwrite(tw->port,&ascii,1);
tw->kblen = 0;
return;
}
//ok, at this point, we are past all local editing functions. Now, add the character to the buffer.
else
{
if (tw->kblen < (MAXKB -1)) // Add to buffer if not full
tw->kbbuf[tw->kblen++] = ascii;
else
{
netpush(tw->port);
netwrite( tw->port, tw->kbbuf, tw->kblen); // if full send buffer
tw->kbbuf[0]=ascii;
tw->kblen=1;
}
kbwrite(tw, &ascii, 1);
}
}

View File

@ -16,6 +16,7 @@
#include "prefs.proto.h"
#include "mainseg.proto.h" // For quit proto
#include "errors.proto.h"
#include "DlogUtils.proto.h"
FTPServerPrefs* gFTPServerPrefs=NULL;
ApplicationPrefs* gApplicationPrefs=NULL;
@ -90,8 +91,8 @@ OSErr NewPreferences(void)
{
ApplicationPrefs **AppPrefsHdl;
FTPServerPrefs **FTPPrefsHdl;
SessionPrefs **DefaultSessionPrefs;
TerminalPrefs **DefaultTerminalPrefs;
SessionPrefs **sessPrefs;
TerminalPrefs **termPrefs;
// Get the master copies from the application's resource fork
@ -103,13 +104,34 @@ OSErr NewPreferences(void)
if ((ResError() != noErr) || (FTPPrefsHdl == NULL)) return(ResError());
DetachResource((Handle)FTPPrefsHdl);
DefaultSessionPrefs = (SessionPrefs **)GetResource(SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID);
if ((ResError() != noErr) || (DefaultSessionPrefs == NULL)) return(ResError());
DetachResource((Handle)DefaultSessionPrefs);
sessPrefs = (SessionPrefs **)GetResource(SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID);
if ((ResError() != noErr) || (sessPrefs == NULL)) return(ResError());
DetachResource((Handle)sessPrefs);
DefaultTerminalPrefs = (TerminalPrefs **)GetResource(TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID);
if ((ResError() != noErr) || (DefaultTerminalPrefs == NULL)) return(ResError());
DetachResource((Handle)DefaultTerminalPrefs);
termPrefs = (TerminalPrefs **)GetResource(TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID);
if ((ResError() != noErr) || (termPrefs == NULL)) return(ResError());
DetachResource((Handle)termPrefs);
// update a few settings
HLock((Handle)sessPrefs);
HLock((Handle)termPrefs);
if ( GetScriptManagerVariable(smRegionCode) == verJapan ) {
short familyID;
unsigned char *jpfont = "\posaka";
GetFNum( jpfont, &familyID );
if ( familyID ) {
(**termPrefs).fontsize = 12;
(**termPrefs).boldFontSize = 12;
pstrcpy( (**termPrefs).DisplayFont, jpfont );
pstrcpy( (**termPrefs).BoldFont, jpfont );
}
#if GENERATINGPOWERPC
// WARNING: this string must match the one in BuildTranslateMenu
pstrcpy( (**sessPrefs).TranslationTable, "\pJIS (ISO-2022-JP)" );
#endif
}
HUnlock((Handle)sessPrefs);
HUnlock((Handle)termPrefs);
// Add them to the Preferences file
@ -119,9 +141,9 @@ OSErr NewPreferences(void)
if (ResError() != noErr) return(ResError());
AddResource((Handle)FTPPrefsHdl,FTPSERVERPREFS_RESTYPE, FTPSERVERPREFS_ID, "\p");
if (ResError() != noErr) return(ResError());
AddResource((Handle)DefaultSessionPrefs,SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID, "\p<Default>");
AddResource((Handle)sessPrefs,SESSIONPREFS_RESTYPE, SESSIONPREFS_APPID, "\p<Default>");
if (ResError() != noErr) return(ResError());
AddResource((Handle)DefaultTerminalPrefs,TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID, "\p<Default>");
AddResource((Handle)termPrefs,TERMINALPREFS_RESTYPE, TERMINALPREFS_APPID, "\p<Default>");
if (ResError() != noErr) return(ResError());
// Update the preferences file and release the resources
@ -129,8 +151,8 @@ OSErr NewPreferences(void)
UpdateResFile(TelInfo->SettingsFile);
ReleaseResource((Handle)AppPrefsHdl);
ReleaseResource((Handle)FTPPrefsHdl);
ReleaseResource((Handle)DefaultSessionPrefs);
ReleaseResource((Handle)DefaultTerminalPrefs);
ReleaseResource((Handle)sessPrefs);
ReleaseResource((Handle)termPrefs);
return(ResError());
}

View File

@ -28,14 +28,15 @@
#define CVO 0
#define CHO (-2)
#define LOCKWIDTH 16
#define LOCKWIDTH 16 // width of the ssh locker
#define CURS_BLINK_PERIOD 30
#define INFINITY 32000 // Will screens ever be this large?
#define WINDCOLORSIZE 4
#define ANSICOLORSIZE 16
#define PALETTESIZE (WINDCOLORSIZE + ANSICOLORSIZE)
#define INFINITY 20000 // Will screens ever be this large?
#define MAXATTR 16
#define PALSIZE (MAXATTR*2+4*2) //this is ANSI colors plus our four.
/*------------------------------------------------------------------------*/
/* Now we have some externs, packed away neatly from the rest of the code */
@ -98,6 +99,8 @@ struct RSdata {
active; /* true if window is currently active */
short
cursType;
RGBColor
savedColors[16];
};
typedef struct RSdata RSdata;

View File

@ -14,6 +14,7 @@
#include "rsdefs.h"
#include "vsdata.h"
#include "vskeys.h"
#include "wind.h"
#include "rsmac.proto.h"
#include "vsinterf.proto.h"
@ -97,84 +98,103 @@ void RSselect( short w, Point pt, EventRecord theEvent)
static long lastClick = 0;
static Point lastClickLoc = {0,0};
GrafPtr tempwndo;
Point curr, temp;
Point curr, temp, lastm;
long clickTime;
short shift = (theEvent.modifiers & shiftKey);
VSAttrib attrib;
RSsetConst(w);
tempwndo = RSlocal[w].window;
curr = normalize(pt, w, TRUE);
clickTime = LMGetTicks();
if ( ( EqualPt(RSlocal[w].anchor, curr) || EqualPt(RSlocal[w].anchor, RSlocal[w].last) )
&& ((clickTime - lastClick) <= GetDblTime())
&& EqualPt(curr, lastClickLoc)) {
if ( (EqualPt(RSlocal[w].anchor, curr) || EqualPt(RSlocal[w].anchor, RSlocal[w].last))
&& clickTime - lastClick <= GetDblTime()
&& EqualPt(curr, lastClickLoc) ) {
/* NCSA: SB - check to see if this is a special click */
/* NCSA: SB - It has to be in the right time interval, and in the same spot */
curr = RSlocal[w].anchor = RSlocal[w].last = normalize(pt, w,TRUE);
curr = RSlocal[w].anchor = RSlocal[w].last = normalize(pt, w, TRUE);
HandleDoubleClick(w, theEvent.modifiers);
RSlocal[w].selected = 1;
lastClick = clickTime;
lastClickLoc = curr;
}
else if (theEvent.modifiers & cmdKey)
{ // a command click means we should look for a url
if ( RSTextSelected(w) && PointInSelection(curr, w) ) //we have a selection already
} else if ((theEvent.modifiers & cmdKey)) {
// a command click means we should look for a url
if ( RSTextSelected(w) && PointInSelection(curr, w) ) {
// we have a selection already
HandleURL(w);
else
{ // we need to find the url around this pnt
} else {
// we need to find the url around this pnt
if (FindURLAroundPoint(curr, w))
HandleURL(w);
else
SysBeep(1);
}
}
else {
} else {
lastClick = clickTime;
lastClickLoc = curr;
if (RSlocal[w].selected) {
if (!shift) {
RSlocal[w].selected = 0;
/* unhighlight current selection */
RSinvText(w, RSlocal[ w].anchor, RSlocal[w].last, &noConst);
/* start new selection */
curr = RSlocal[w].last = RSlocal[w].anchor = normalize(pt, w,TRUE);
}
else {
// unhighlight current selection
RSinvText(w, RSlocal[w].anchor, RSlocal[w].last, &noConst);
// start new selection
curr = normalize(pt, w, TRUE);
RSlocal[w].last = RSlocal[w].anchor = curr;
} else {
RSsortAnchors(w);
if ((curr.v < RSlocal[w].anchor.v) || ((curr.v == RSlocal[w].anchor.v) && (curr.h < RSlocal[w].anchor.h))) {
temp = RSlocal[w].anchor;
RSlocal[w].anchor = RSlocal[w].last;
RSlocal[w].last = temp;
}
}
} else {
// start new selection
curr = normalize(pt, w, TRUE);
RSlocal[w].anchor = RSlocal[w].last = curr;
}
if (EqualPt(RSlocal[w].anchor, RSlocal[w].last) && RSlocal[w].anchor.h > -1) {
if (VSgetattr(w, RSlocal[w].anchor.h - 1, curr.v, RSlocal[w].anchor.h, curr.v, &attrib, sizeof(VSAttrib))) {
if (VSisansi2b(attrib)) {
--RSlocal[w].anchor.h;
--RSlocal[w].last.h;
}
}
}
while ( StillDown() ) {
// wait for mouse position to change
do {
temp = getlocalmouse(tempwndo);
curr = normalize(temp, w,TRUE);
if ( curr.h > -1 ) {
if (VSgetattr(w, curr.h - 1, curr.v, curr.h, curr.v, &attrib, sizeof(VSAttrib))) {
if (VSisansi2b(attrib)) {
++curr.h;
}
}
}
}
else
{
/* start new selection */
curr = RSlocal[w].anchor = RSlocal[w].last = normalize(pt, w,TRUE);
} while (StillDown() && (EqualPt(curr, RSlocal[w].last) || EqualPt(pt, temp)));
if ( !EqualPt(pt, temp) ) {
// toggle highlight state of text between current and last mouse positions
RSinvText(w, curr, RSlocal[w].last, &noConst);
RSlocal[w].last = curr;
pt = temp;
}
while (StillDown())
{
/* wait for mouse position to change */
do {
curr = normalize(getlocalmouse(tempwndo), w,TRUE);
} while (EqualPt(curr, RSlocal[w].last) && StillDown());
/* toggle highlight state of text between current and last mouse positions */
RSinvText(w, curr, RSlocal[w].last, &noConst);
RSlocal[w].last = curr;
} /* while */
}
}
RSlocal[w].selected = !EqualPt(RSlocal[w].anchor, RSlocal[w].last);
SetMenusForSelection((short)RSlocal[w].selected);
} /* RSselect */
void FlashSelection(short w)
{
} // RSselect
void FlashSelection(short w)
{
short i;
DELAYLONG finalTick;
for (i = 0; i < 2; i++) {
@ -183,7 +203,8 @@ void RSselect( short w, Point pt, EventRecord theEvent)
Delay(5, &finalTick);
RSinvText(w, RSlocal[ w].anchor, RSlocal[w].last, &noConst);
}
}
}
Boolean PointInSelection(Point curr, short w)
{
long beg_offset, end_offset, current_offset;
@ -231,19 +252,19 @@ void RSzoom
ZoomWindow(window, code, shifted);
EraseRect(&window->portRect); /* BYU 2.4.15 */
/* get new window size */
/* get new window size */
h = window->portRect.right - window->portRect.left;
v = window->portRect.bottom - window->portRect.top;
RSsetsize(w, v, h, -1); /* save new size settings and update scroll bars */
/* update the visible region of the virtual screen */
/* update the visible region of the virtual screen */
VSgetrgn(w, &x1, &y1, &x2, &y2);
VSsetrgn(w, x1, y1, (x1 + (h - 16 + CHO) / FWidth -1),
(y1 + (v - 16 + CVO) / FHeight - 1));
VSgetrgn(w, &x1, &y1, &x2, &y2); /* Get new region */
/* refresh the part which has been revealed, if any */
/* refresh the part which has been revealed, if any */
VSredraw(w, 0, 0, x2 - x1 + 1, y2 - y1 + 1);
/* window contents are now completely valid */
/* window contents are now completely valid */
ValidRect(&window->portRect);
} /* RSzoom */
@ -260,8 +281,8 @@ void RSdrawlocker(short w, RgnHandle visRgn)
{
/* draw locker icon */
if ( RSlocal[w].left ) {
short screenIndex = findbyVS(w);
if ( screenIndex >= 0 && screens[screenIndex].protocol == 4 ) {
short sn = findbyVS(w);
if ( sn >= 0 && screens[sn].protocol == 4 ) {
Rect iconRect = (**RSlocal[w].left).contrlRect;
iconRect.top += 1;
iconRect.right = iconRect.left;
@ -410,8 +431,8 @@ short RSsize (GrafPtr window, long *where, long modifiers)
short w, width, lines;
short tw, h, v, x1, x2, y1, y2, th;
Boolean changeVSSize = false;
short screenIndex = 0;
Boolean screenIndexValid = false;
short sn = 0;
Boolean snValid = false;
short err = noErr;
short cwidth;
short oldlines;
@ -422,7 +443,7 @@ short RSsize (GrafPtr window, long *where, long modifiers)
if (modifiers & cmdKey) return (0);
screenIndexValid = (screenIndex = findbyVS(w)) != -1;
snValid = (sn = findbyVS(w)) >= 0;
/* NONO */
/* inverted window-resize behaviour */
@ -435,7 +456,7 @@ short RSsize (GrafPtr window, long *where, long modifiers)
// should be used by default, and option toggles behaviour.
// Maybe it should be user configurable?
#ifndef DONT_DEFAULT_CHANGE_VS_IF_NAWS
if(screenIndexValid && screens[screenIndex].naws) {
if(snValid && screens[sn].naws) {
/* NONO */
/* inverted window-resize behaviour */
/*changeVSSize = (modifiers & optionKey) != optionKey;*/
@ -486,7 +507,7 @@ short RSsize (GrafPtr window, long *where, long modifiers)
SizeWindow(window, h, v, FALSE); /* change it */
}
RSsetsize(w, v, h, screenIndex); /* save new size settings and update scroll bars */
RSsetsize(w, v, h, sn); /* save new size settings and update scroll bars */
/* update the visible region of the virtual screen */
@ -523,13 +544,13 @@ short RSsize (GrafPtr window, long *where, long modifiers)
cwidth = 255;
}
RScalcwsize(w,cwidth);
if (screenIndexValid
if (snValid
&& (oldlines != VSgetlines(w) || oldcols != VSgetcols(w)) ) {
if (screens[screenIndex].naws) {
SendNAWSinfo(&screens[screenIndex], cwidth, (y2-y1+1));
if (screens[sn].naws) {
SendNAWSinfo(&screens[sn], cwidth, (y2-y1+1));
}
if (screens[screenIndex].protocol == 4) {
ssh_glue_wresize(&screens[screenIndex]);
if (screens[sn].protocol == 4) {
ssh_glue_wresize(&screens[sn]);
}
}
return (0);
@ -554,16 +575,36 @@ void RSshow( short w) /* reveals a hidden terminal window. */
ShowWindow(RScurrent->window);
}
/*
* RSresetcolors: back to default ANSI colors
*/
void RSresetcolors( short w )
{
int i;
if ( !TelInfo->haveColorQuickDraw || RSsetwind(w) < 0 )
return;
for ( i = 0; i < ANSICOLORSIZE; i++ ) {
SetEntryColor(RScurrent->pal, i + WINDCOLORSIZE, &RScurrent->savedColors[i]);
}
}
/*
* RSsetcolors: change one of the window/ANSI colors
*/
Boolean RSsetcolors
(
short w, /* window number */
short n, /* color entry number */
RGBColor *color
RGBColor *color
)
/* sets a new value for the specified color entry of a terminal window. */
{
if ( !(TelInfo->haveColorQuickDraw) || (RSsetwind(w) < 0) || (n > 15) || (n < 0))
return(FALSE);
if ( !TelInfo->haveColorQuickDraw || RSsetwind(w) < 0 || n < 0 || n >= PALETTESIZE )
return FALSE;
SetEntryColor(RScurrent->pal, n, color);
@ -595,7 +636,7 @@ Boolean RSsetcolors
return(TRUE);
} /* RSsetcolors */
void RSsendstring
void RSsendstring
(
short w, /* which terminal window */
char *ptr, /* pointer to data */
@ -603,15 +644,18 @@ Boolean RSsetcolors
)
/* sends some data to the host along the connection associated
with the specified window. */
{
short temp;
{
short sn;
WindRecPtr tw;
temp = findbyVS(w);
if (temp < 0)
sn = findbyVS(w);
if (sn)
return;
netpush(screens[temp].port); /* BYU 2.4.18 - for Diab systems? */
netwrite(screens[temp].port, ptr, len);
} /* RSsendstring */
tw = &screens[sn];
netpush(tw->port); /* BYU 2.4.18 - for Diab systems? */
netwrite(tw->port, ptr, len);
} /* RSsendstring */
short RSnewwindow
@ -621,26 +665,17 @@ short RSnewwindow
short width, /* number of characters per text line (80 or 132) */
short lines, /* number of text lines */
StringPtr name, /* window name */
short wrapon, /* autowrap on by default */
short fnum, /* ID of font to use initially */
short fsiz, /* size of font to use initially */
short showit, /* window initially visible or not */
short goaway, /* NCSA 2.5 */
short forcesave, /* NCSA 2.5: force screen save */
short screenNumber,
short allowBold,
short colorBold,
short ignoreBeeps,
short bfnum,
short bfsiz,
short bfstyle,
short realbold,
short oldScrollback,
short jump,
short realBlink
short vtemulation,
unsigned long flags
)
/* creates a virtual screen and a window to display it in. */
{
{
GrafPort gp; /* temp port for getting text parameters */
short w;
@ -653,13 +688,14 @@ short RSnewwindow
WindowPeek front;
WindowPtr behind;
/* create the virtual screen */
w = VSnewscreen(scrollback, (scrollback != 0), /* NCSA 2.5 */
lines, width, forcesave, ignoreBeeps, oldScrollback, jump, realBlink); /* NCSA 2.5 */
/* create the virtual screen */
w = VSnewscreen(vtemulation, scrollback, (scrollback != 0), /* NCSA 2.5 */
lines, width, flags & RSWforcesave, flags & RSWignoreBeeps,
flags & RSWsavelines, flags & RSWjumpscroll, flags & RSWrealBlink);
if (w < 0) { /* problems opening the virtual screen -- tell us about it */
return(-1);
}
}
RScurrent = RSlocal + w;
RScurrent->fnum = fnum;
@ -669,9 +705,9 @@ short RSnewwindow
RScurrent->bfstyle = bfstyle;
OpenPort(&gp);
RScurrent->allowBold = allowBold;
RScurrent->colorBold = colorBold;
RScurrent->realbold = realbold;
RScurrent->allowBold = flags & RSWallowBold;
RScurrent->colorBold = flags & RSWcolorBold;
RScurrent->realbold = flags & RSWrealbold;
RSTextFont(fnum,fsiz,0); /* BYU */
TextSize(fsiz);
RSfontmetrics();
@ -700,26 +736,30 @@ short RSnewwindow
/* create the window */
if (!TelInfo->haveColorQuickDraw) {
RScurrent->window = NewWindow(0L, wDims, name, showit, 8,behind, goaway, (long)w);
RScurrent->window = NewWindow(0L, wDims, name, flags & RSWshowit, 8,behind, flags & RSWgoaway, (long)w);
RScurrent->pal = NULL;
if (RScurrent->window == NULL) {
VSdestroy(w);
return(-2);
}
} else {
RGBColor scratchRGB;
RScurrent->window = NewCWindow(0L, wDims, name, showit, 8,behind, goaway, (long)w);
if ( TelInfo->AnsiColors == NULL ) {
VSdestroy(w);
return(-2);
}
RScurrent->window = NewCWindow(0L, wDims, name, flags & RSWshowit, 8,behind, flags & RSWgoaway, (long)w);
if (RScurrent->window == NULL) {
VSdestroy(w);
return(-2);
}
//note: the ANSI colors are in the top 8 of the palette. The four telnet colors (settable
//in telnet) are in the lower 4 of the palette. These 4 are set later by a call from
//CreateConnectionFromParams to RSsetColor (ick, but I am not going to add 4 more params to
//this ungodly function call (CCP 2.7)
ourColorTableHdl = (CTabHandle) myNewHandle((long) (sizeof(ColorTable) +
PALSIZE * sizeof(CSpecArray)));
(PALETTESIZE - 1) * sizeof(CSpecArray)));
if (ourColorTableHdl == NULL)
{
DisposeWindow(RScurrent->window);
@ -728,25 +768,24 @@ short RSnewwindow
}
HLock((Handle) ourColorTableHdl);
(*ourColorTableHdl)->ctSize = PALSIZE-1; // Number of entries minus 1
(*ourColorTableHdl)->ctSize = PALETTESIZE - 1; // Number of entries minus 1
(*ourColorTableHdl)->ctFlags = 0;
for (i=0; i <4; i++) //set the ctTable.value field to zero for our four
for (i = 0; i < WINDCOLORSIZE; i++) // set the ctTable.value field to zero for our four
(*ourColorTableHdl)->ctTable[i].value = 0;
if (TelInfo->AnsiColors==NULL)
return(-2); //BUGG CHANGE THIS ONCE WE ARE WORKING
for (i=0; i < MAXATTR*2; i++) //get the ANSI colors from the palette
{
GetEntryColor(TelInfo->AnsiColors, i, &(*ourColorTableHdl)->ctTable[i+4].rgb);
(*ourColorTableHdl)->ctTable[i+4].value = 0;
for (i = 0; i < ANSICOLORSIZE; i++) {
// get the ANSI colors from the palette
GetEntryColor(TelInfo->AnsiColors, i, &(*ourColorTableHdl)->ctTable[i + WINDCOLORSIZE].rgb);
(*ourColorTableHdl)->ctTable[i + WINDCOLORSIZE].value = 0;
RScurrent->savedColors[i] = (*ourColorTableHdl)->ctTable[i + WINDCOLORSIZE].rgb;
}
RScurrent->pal = NewPalette(PALSIZE, ourColorTableHdl, pmCourteous, 0);
DisposeHandle((Handle) ourColorTableHdl);
if (RScurrent->pal == NULL)
{
RScurrent->pal = NewPalette(PALETTESIZE, ourColorTableHdl, pmCourteous, 0);
DisposeHandle((Handle)ourColorTableHdl);
if (RScurrent->pal == NULL) {
DisposeWindow(RScurrent->window);
VSdestroy(w);
return(-2);
@ -772,8 +811,6 @@ short RSnewwindow
pRect.bottom = pRect.top + RMAXWINDOWHEIGHT;
/* BlockMoveData(&wstate->stdState, &pRect, 8); uh ? */
/* create scroll bars for window */
pRect.top = -1 + CVO;
pRect.bottom = wheight - 14 + CVO;
@ -820,7 +857,7 @@ short RSnewwindow
else
TextMode(srcCopy);
if (wrapon)
if (flags & RSWwrapon)
/* turn on autowrap */
VSwrite(w, "\033[?7h",5);
@ -844,10 +881,14 @@ void RSkillwindow
)
/* closes a terminal window. */
{
short sn;
WindRecPtr tw;
RSdata *temp;
tw = &screens[findbyVS(w)];
sn = findbyVS(w);
if ( sn < 0 )
return;
tw = &screens[sn];
--((*topLeftCorners)[tw->positionIndex]); //one less window at this position
@ -917,14 +958,14 @@ char **RSGetTextSel
if (realsiz < 0)
realsiz = - realsiz;
realsiz ++; /* lines 2,3 selected can be 2 lines */
realsiz *= (maxwid + 2);
realsiz *= (maxwid * 2 + 2);
charh = myNewHandle(realsiz);
if (charh == 0L)
return((char **) -1L); /* Boo Boo return */
HLock((Handle)charh);
charp = *charh;
realsiz = VSgettext(w, Anchor.h, Anchor.v, Last.h, Last.v,
charp, realsiz, "\015", table);
charp, realsiz, "\015", table, 1);
HUnlock((Handle)charh);
mySetHandleSize((Handle)charh, realsiz);
return(charh);
@ -1058,19 +1099,53 @@ short RSfindvwind
return(i);
} /* RSfindvwind */
void RSdeactivate
(
short w
)
/* handles a deactivate event for the specified window. */
{
/*
* RSactivate
*
* handles an activate event for the specified window
*/
void RSactivate( short w )
{
RSsetConst(w);
/* display the grow icon */
DrawGrowIcon(RSlocal[w].window);
/* and activate the scroll bars */
if (RSlocal[w].scroll != 0L) {
ShowControl(RSlocal[w].scroll);
}
if (RSlocal[w].left != 0L) {
ShowControl(RSlocal[w].left);
}
RSlocal[w].active = 1;
if ( gApplicationPrefs->BlinkCursor ) {
TelInfo->blinktime = LMGetTicks() - CURS_BLINK_PERIOD;
}
} /* RSactivate */
/*
* RSdeactivate
*
* handles a deactivate event for the specified window
*/
void RSdeactivate( short w )
{
GrafPtr port;
GetPort(&port);
SetPort(RSlocal[w].window);
RSsetConst(w);
RScursoff(w);
RSlocal[w].active = 0;
if ( gApplicationPrefs->BlinkCursor ) {
RScursoff( w );
}
BackColor(whiteColor);
@ -1091,8 +1166,6 @@ void RSdeactivate
BackColor(blackColor);
}
RSlocal[w].active = 0;
SetPort(port);
} /* RSdeactivate */
@ -1120,7 +1193,12 @@ void RScursblink( short w )
{
unsigned long now;
if (VSvalids(w) || !VSIcursorvisible())
if (!gApplicationPrefs->BlinkCursor
|| VSvalids(w)
|| !VSIcursorvisible()
|| ((!RSlocal[w].active
|| TelInfo->suspended)
&& !RSlocal[w].cursorstate))
return;
if ( (now = LMGetTicks()) - TelInfo->blinktime >= CURS_BLINK_PERIOD ) {
GrafPtr savePort;
@ -1140,10 +1218,14 @@ void RScursblink( short w )
void RScursblinkon( short w )
{
if (VSvalids(w) || !VSIcursorvisible())
if (!gApplicationPrefs->BlinkCursor
|| VSvalids(w)
|| !VSIcursorvisible()
|| !RSlocal[w].active
|| TelInfo->suspended)
return;
TelInfo->blinktime = LMGetTicks();
if (!RSlocal[w].cursorstate) {
if ( !RSlocal[w].cursorstate ) {
GrafPtr savePort;
GetPort(&savePort);
RSlocal[w].cursorstate = 1;
@ -1160,9 +1242,10 @@ void RScursblinkon( short w )
void RScursblinkoff( short w )
{
if (VSvalids(w) || !VSIcursorvisible())
if (!gApplicationPrefs->BlinkCursor || VSvalids(w) || !VSIcursorvisible())
return;
if (RSlocal[w].cursorstate) {
if ( RSlocal[w].cursorstate ) {
GrafPtr savePort;
GetPort(&savePort);
RSlocal[w].cursorstate = 0;
@ -1301,7 +1384,7 @@ void RScalcwsize(short w, short width)
ValidRect(&RScurrent->window->portRect); /* no need to do it again */
DrawControls(RScurrent->window);
RScursoff(w);
// RScursoff(w);
}
/* handles a click in a terminal window. */
@ -1385,25 +1468,6 @@ short RSclick( GrafPtr window, EventRecord theEvent)
0;
} /* RSclick */
void RSactivate
(
short w
)
/* handles an activate event for the specified window. */
{
RSsetConst(w);
/* display the grow icon */
DrawGrowIcon(RSlocal[w].window);
/* and activate the scroll bars */
if (RSlocal[w].scroll != 0L) {
ShowControl(RSlocal[w].scroll);
}
if (RSlocal[w].left != 0L) {
ShowControl(RSlocal[w].left);
}
RSlocal[w].active = 1;
} /* RSactivate */
/*--------------------------------------------------------------------------*/
/* HandleDoubleClick */
/* This is the routine that does the real dirty work. Since it is not a */
@ -1417,111 +1481,126 @@ static void HandleDoubleClick(short w, short modifiers)
Point leftLoc, rightLoc, curr, oldcurr;
long mySize;
char theChar[5];
short mode = -1, newmode, foundEnd=0;
RSsetConst(w); /* get window dims */
leftLoc = RSlocal[w].anchor; /* these two should be the same */
short mode = -1, newmode, foundEnd=0;
Point pt;
Point temp;
VSAttrib attrib;
RSsetConst(w); // get window dims
leftLoc = RSlocal[w].anchor; // these two should be the same
rightLoc = RSlocal[w].last;
while(!foundEnd) /* scan to the right first */
while(!foundEnd) // scan to the right first
{
mySize = VSgettext(w,rightLoc.h, rightLoc.v, rightLoc.h+1, rightLoc.v,
theChar,(long)1,"\015",0);
if(mySize ==0 || isspace(*theChar)) /* stop if not a letter */
theChar, (long)1, "\015", 0, 0);
if(mySize ==0 || isspace(*theChar)) // stop if not a letter
foundEnd =1;
else rightLoc.h++;
}
foundEnd =0;
while(!foundEnd) /* ...and then scan to the left */
while(!foundEnd) // ...and then scan to the left
{
mySize = VSgettext(w,leftLoc.h-1, leftLoc.v, leftLoc.h, leftLoc.v,
theChar,(long)1,"\015",0);
if(mySize ==0 || isspace(*theChar)) /* STOP! */
theChar, (long)1, "\015", 0, 0);
if(mySize ==0 || isspace(*theChar)) // STOP!
foundEnd =1;
else leftLoc.h--;
}
if (leftLoc.h != rightLoc.h) { /* we selected something */
if (leftLoc.h != rightLoc.h) { // we selected something
HiliteThis(w, leftLoc, rightLoc);
if (modifiers & cmdKey) // Possible URL selection
if (modifiers & cmdKey) // Possible URL selection
HandleURL(w);
else {
curr.h = 0; curr.v = 0;
pt = getlocalmouse(RSlocal[w].window);
while (StillDown()) {
/* wait for mouse position to change */
// wait for mouse position to change
do {
oldcurr = curr;
curr = normalize(getlocalmouse(RSlocal[w].window), w,TRUE);
} while (EqualPt(curr, oldcurr) && StillDown());
temp = getlocalmouse(RSlocal[w].window);
curr = normalize(temp, w,TRUE);
if ( curr.h > -1 ) {
if (VSgetattr(w, curr.h - 1, curr.v, curr.h, curr.v, &attrib, sizeof(VSAttrib))) {
if (VSisansi2b(attrib)) {
++curr.h;
}
}
}
} while (StillDown() && (EqualPt(curr, oldcurr) || EqualPt(pt, temp)));
if ( !EqualPt(pt, temp) ) {
pt = temp;
if ((curr.v < leftLoc.v) || ((curr.v == leftLoc.v) && (curr.h < leftLoc.h))) {
newmode = 1; // up
} else if ((curr.v > leftLoc.v) || ((curr.v == leftLoc.v) && (curr.h > rightLoc.h))) {
newmode = 2; // down
} else
newmode = -1; // inside dbl-clicked word
/* toggle highlight state of text between current and last mouse positions */
if (mode == -1) {
if (newmode == 2) {
RSlocal[w].anchor = leftLoc;
RSinvText(w, curr, rightLoc, &noConst);
RSlocal[w].last = curr;
}
if (newmode == 1) {
RSlocal[w].anchor = rightLoc;
RSinvText(w, curr, leftLoc, &noConst);
RSlocal[w].last = curr;
}
}
if ((curr.v < leftLoc.v) || ((curr.v == leftLoc.v) && (curr.h < leftLoc.h))) {
newmode = 1; // up
}
else if ((curr.v > leftLoc.v) || ((curr.v == leftLoc.v) && (curr.h > rightLoc.h))) {
newmode = 2; // down
}
else
newmode = -1; // inside dbl-clicked word
/* toggle highlight state of text between current and last mouse positions */
if (mode == -1) {
if (newmode == 2) {
RSlocal[w].anchor = leftLoc;
RSinvText(w, curr, rightLoc, &noConst);
RSlocal[w].last = curr;
if (mode == 1) {
if (newmode == 2) {
RSlocal[w].anchor = leftLoc;
RSinvText(w, oldcurr, leftLoc, &noConst);
RSinvText(w, rightLoc, curr, &noConst);
RSlocal[w].last = curr;
}
if (newmode == 1) {
RSlocal[w].anchor = rightLoc;
RSinvText(w, curr, leftLoc, &noConst);
RSlocal[w].last = curr;
if (newmode == -1) {
RSlocal[w].anchor = leftLoc;
RSinvText(w, oldcurr, leftLoc, &noConst);
RSlocal[w].last = rightLoc;
}
}
if (mode == 1) {
if (newmode == 2) {
RSlocal[w].anchor = leftLoc;
RSinvText(w, oldcurr, leftLoc, &noConst);
RSinvText(w, rightLoc, curr, &noConst);
RSlocal[w].last = curr;
}
if (newmode == -1) {
RSlocal[w].anchor = leftLoc;
RSinvText(w, oldcurr, leftLoc, &noConst);
RSlocal[w].last = rightLoc;
}
if (newmode == mode) {
RSinvText(w, oldcurr, curr, &noConst);
RSlocal[w].last = curr;
}
}
if (mode == 2) {
if (newmode == 1) {
RSlocal[w].anchor = rightLoc;
RSinvText(w, oldcurr, rightLoc, &noConst);
RSinvText(w, leftLoc, curr, &noConst);
RSlocal[w].last = curr;
}
if (newmode == -1) {
RSlocal[w].anchor = leftLoc;
RSinvText(w, oldcurr, rightLoc, &noConst);
RSlocal[w].last = rightLoc;
}
if (newmode == mode) {
RSinvText(w, oldcurr, curr, &noConst);
RSlocal[w].last = curr;
if (newmode == mode) {
RSinvText(w, oldcurr, curr, &noConst);
RSlocal[w].last = curr;
}
}
mode = newmode;
} /* while */
if (mode == 2) {
if (newmode == 1) {
RSlocal[w].anchor = rightLoc;
RSinvText(w, oldcurr, rightLoc, &noConst);
RSinvText(w, leftLoc, curr, &noConst);
RSlocal[w].last = curr;
}
if (newmode == -1) {
RSlocal[w].anchor = leftLoc;
RSinvText(w, oldcurr, rightLoc, &noConst);
RSlocal[w].last = rightLoc;
}
if (newmode == mode) {
RSinvText(w, oldcurr, curr, &noConst);
RSlocal[w].last = curr;
}
}
mode = newmode;
}
}
}
}
}
}
Point getlocalmouse(GrafPtr wind)
@ -1856,14 +1935,14 @@ void calculateWindowPosition(WindRec *theScreen,Rect *whereAt, short colsHigh, s
void RSUpdatePalette(void) //called when ANSI colors have changed, and we need to update each
{ //windows palette
GrafPtr oldPort;
int screenIndex;
int sn;
WindRec *w;
GetPort(&oldPort);
for (screenIndex = 0; screenIndex < TelInfo->numwindows; screenIndex++)
for (sn = 0; sn < TelInfo->numwindows; sn++)
{
w = &screens[screenIndex];
w = &screens[sn];
if ((w->active == CNXN_ACTIVE)||
(w->active == CNXN_OPENING))
{

View File

@ -1,6 +1,24 @@
/* rsinterf.proto.h */
void RSunload(void);
/* RSnewwindow Flags */
enum {
RSWwrapon = 0x00000001,
RSWshowit = 0x00000002,
RSWgoaway = 0x00000004,
RSWforcesave = 0x00000008,
RSWallowBold = 0x00000010,
RSWcolorBold = 0x00000020,
RSWignoreBeeps = 0x00000040,
RSWrealbold = 0x00000080,
RSWsavelines = 0x00000100,
RSWjumpscroll = 0x00000200,
RSWrealBlink = 0x00000400
};
void RSunload(void);
void RSselect(short w, Point pt, EventRecord theEvent);
void RSzoom(GrafPtr window, short code, short shifted);
void RSdrawlocker(short w, RgnHandle visRgn);
@ -10,11 +28,12 @@ short RSTextSelected(short w);
void RSskip(short w, Boolean on);
short RSsize(GrafPtr window, long *where, long modifiers);
void RSshow(short w);
void RSresetcolors(short w);
Boolean RSsetcolors(short w, short n, RGBColor *color);
void RSsendstring(short w, char *ptr, short len);
short RSnewwindow(RectPtr wDims,short scrollback, short width, short lines, StringPtr name, short wrapon,
short fnum, short fsiz, short showit, short goaway, short forcesave, short screenNumber, short allowBold,
short colorBold, short ignoreBeeps, short bfnum, short bfsiz, short bfstyle, short realbold, short oldScrollback, short jump, short);
short RSnewwindow(RectPtr wDims, short scrollback, short width, short lines, StringPtr name,
short fnum, short fsiz, short screenNumber, short bfnum, short bfsiz, short bfstyle,
short vtemulation, unsigned long flags);
short RSmouseintext(short w, Point myPoint);
void RSkillwindow(short w);
void RSgetcolors(short w, short n, RGBColor *color);

View File

@ -213,12 +213,14 @@ short RSsetwind
return(0);
} /* RSsetwind */
void RSbell
(
short w
)
/* gives an audible signal associated with the specified window. */
{
/*
* RScursoff
*
* gives an audible signal associated with the specified window.
*/
void RSbell( short w )
{
/* NONO : #@%! bell ! I'm not deaf, It's my autokey buffer... */
static unsigned long sLastBellTicks = 0;
@ -247,34 +249,51 @@ void RSbell
SysBeep(8);
NotifyUser();
} /* RSbell */
} /* RSbell */
void RScursoff
(
short w
)
/* hides the text cursor for the specified window. Assumes it
is currently being shown. */
{
/*
* RScursison
*
*/
Boolean RScursison( short w )
{
return RSlocal[w].cursorstate;
} /* RScursison */
/*
* RScursoff
*
* hides the text cursor for the specified window. Assumes it
* is currently being shown.
*/
void RScursoff( short w )
{
if (RSlocal[w].skip || !RSlocal[w].cursorstate) /* BYU 2.4.11 */
return;
RSsetwind(w);
RScurrent->cursorstate = 0; /* BYU 2.4.11 */
InvertRect(&RScurrent->cursor);
} /* RScursoff */
void RScurson
(
short w,
short la,
short x,
short y
)
/* displays the text cursor for the specified window, at the
specified position. Assumes it isn't currently being shown. */
{
short xw;
RSsetwind(w);
RScurrent->cursorstate = 0; /* BYU 2.4.11 */
InvertRect(&RScurrent->cursor);
} /* RScursoff */
/*
* RScurson
*
* displays the text cursor for the specified window, at the
* specifified position. Assumes it isn't currently being off.
*/
void RScurson( short w, short la, short x, short y )
{
short xw;
VSAttrib attrib;
if ( RSlocal[w].skip || RSlocal[w].cursorstate )
return;
@ -282,23 +301,26 @@ void RScurson
RSsetwind(w);
xw = RScurrent->fwidth;
if ((la & 3)) {
if (VSisdecdwh(la)) {
// double width
xw <<= 1;
if (x > ((VSIw->maxwidth + 1) >> 1) - 1) {
x = ((VSIw->maxwidth + 1) >> 1) - 1;
}
}
RScurrent->cursor.left = x * xw;
RScurrent->cursor.top = y * RScurrent->fheight;
if ( y <= VSIw->lines ) {
if (VSIw->oldScrollback) {
attrib = VSIw->attrst[y]->text[x];
} else {
attrib = VSIw->linest[y]->attr[x];
}
if ((attrib & kVSansi2b)) {
// double width
xw <<= 1;
}
}
switch (RScurrent->cursType) {
case UNDERSCORECURSOR:
RScurrent->cursor.top += RScurrent->fheight;
@ -337,18 +359,12 @@ void RScurson
}
if ( VSIcursorvisible() ) {
if ( !gApplicationPrefs->BlinkCursor ) {
RScurrent->cursorstate = 1;
InvertRect(&RScurrent->cursor);
} else {
if ( RScurrent->cursorstate ) {
// refresh right now
RScurrent->cursorstate = 1;
InvertRect(&RScurrent->cursor);
TelInfo->blinktime = LMGetTicks();
} else {
// refresh as soon as possible
TelInfo->blinktime = LMGetTicks() - CURS_BLINK_PERIOD;
}
RScurrent->cursorstate = 1;
} else if ( w == screens[scrn].vs && RScurrent->active ) {
InvertRect(&RScurrent->cursor);
TelInfo->blinktime = LMGetTicks();
RScurrent->cursorstate = 1;
}
}
} /* RScurson */
@ -369,21 +385,11 @@ void RSsetattr(short la, VSAttrib a)
RSla = la;
RSa = a;
size = ((la & 3)) ? RScurrent->fsiz * 2 : RScurrent->fsiz;
size = (VSisdecdwh(la)) ? RScurrent->fsiz * 2 : RScurrent->fsiz;
if ( VSisgrph(a) ) {
//GetFNum("\p%NCSA VT", &tempFontID); // RAB BetterTelnet 1.0fc4
//TextFont(tempFontID); /* use "NCSA VT" (74) font for special graphics */
TextFont( gNCSAFontID );
} else {
RSTextFont( RScurrent->fnum, size, VSisbold(a) && RScurrent->allowBold );
/*
if ((la & 3)) {
GetFNum( (la & 2) ? "\pANSI/PC Bottom" : "\pANSI/PC Top", &tempFontID);
RSTextFont(tempFontID,RScurrent->fsiz,VSisbold(a) && RScurrent->allowBold);
} else {
RSTextFont(RScurrent->fnum,RScurrent->fsiz,VSisbold(a) && RScurrent->allowBold);
}
*/
}
TextSize(size);
@ -584,7 +590,7 @@ void RSinvText
if (lb.v - ub.v > 1) {
/* highlight extends across more than two lines */
/* highlight complete in-between lines */
/* highlight complete in-between lines */
MYSETRECT
(
temp,
@ -597,11 +603,8 @@ void RSinvText
DoHiliteMode(); /* BYU LSC */
InvertRect(&temp2);
} /* if */
} /* if */
RSsetattr(VSIw->lattrib, VSIw->attrib);
}
}
} /* RSinvText */
@ -633,7 +636,7 @@ void RSdraw
RSsetwind(w);
xw = RScurrent->fwidth;
if ((la & 3)) {
if (VSisdecdwh(la)) {
// double width
xw <<= 1;
}
@ -667,7 +670,7 @@ void RSdraw
if (rect.bottom >= RScurrent->height)
rect.bottom = RScurrent->height;
if ((la & 1)) {
if (VSisdecdhlt(la)) {
// Upper part
ys += RScurrent->fheight;
}
@ -726,20 +729,6 @@ static void ScrollRectInRgn( WindowPtr window, Rect *inRect, short dh, short dv)
}
/*
* RSdefaultattr()
*/
void RSdefaultattr(short w)
{
short screenIndex;
if ( screens[findbyVS(w)].vtemulation < 2 )
RSsetattr(VSIw->lattrib, 0);
else
RSsetattr(VSIw->lattrib, VSIw->attrib);
}
/*
* RSdelcols()
*/
@ -762,7 +751,7 @@ void RSdelcols
xw = RScurrent->fwidth;
/*
if ((la & 3)) {
if (VSisdecdwh(la)) {
// double width
xw <<= 1;
}
@ -809,11 +798,12 @@ void RSdelchars
if (RSlocal[w].skip)
return;
RSsetwind(w);
// RSsetattr(VSIw->lattrib, 0); /* avoid funny pen modes */
RSdefaultattr(w);
// RSsetattr(VSIw->lattrib, VSIw->attrib & ~kVSblnk);
RSsetattr(0, 0);
xw = RScurrent->fwidth;
if ((la & 3)) {
if (VSisdecdwh(la)) {
// double width
xw <<= 1;
}
@ -881,8 +871,9 @@ void RSdellines
RSsetwind(w);
RSsetConst(w);
// RSsetattr(VSIw->lattrib, 0); /* avoid funny pen modes */
RSdefaultattr(w);
// RSsetattr(VSIw->lattrib, VSIw->attrib & ~kVSblnk);
RSsetattr(0, 0);
if (scrolled)
{
@ -910,7 +901,7 @@ void RSdellines
ScrollRectInRgn(RScurrent->window, &rect, 0, -RScurrent->fheight * n);
RSsetattr(VSIw->lattrib, VSIw->attrib); /* restore mode for text drawing */
} /* RSdellines */
} /* RSdellines */
void RSerase
(
@ -929,8 +920,8 @@ void RSerase
return;
RSsetwind(w);
// RSsetattr(VSIw->lattrib, 0); /* avoid funny pen modes */
RSdefaultattr(w);
RSsetattr(VSIw->lattrib, VSIw->attrib & ~kVSblnk);
// RSsetattr(0, 0);
MYSETRECT
(
@ -952,9 +943,9 @@ void RSerase
/* highlight any part of the selection within the cleared area */
RSinvText(w, RScurrent->anchor, RScurrent->last, &rect);
RSsetattr(VSIw->lattrib, VSIw->attrib); /* restore mode for text drawing */
// RSsetattr(VSIw->lattrib, VSIw->attrib); /* restore mode for text drawing */
} /* RSerase */
} /* RSerase */
void RSinslines
(
@ -973,8 +964,9 @@ void RSinslines
return;
RSsetwind(w);
RSsetConst(w);
// RSsetattr(VSIw->lattrib, 0); /* avoid funny pen modes */
RSdefaultattr(w);
// RSsetattr(VSIw->lattrib, VSIw->attrib & ~kVSblnk);
RSsetattr(0, 0);
if (RScurrent->selected && (scrolled < 0))
{
@ -994,7 +986,7 @@ void RSinslines
ScrollRectInRgn(RScurrent->window, &rect, 0, RScurrent->fheight * n);
RSsetattr(VSIw->lattrib, VSIw->attrib); /* restore mode for text drawing */
} /* RSinslines */
} /* RSinslines */
void RSinscols
(
@ -1012,13 +1004,6 @@ void RSinscols
return;
RSsetwind(w);
/*
if ((VSIw->lattrib & 3)) {
// double width
xw <<= 1;
}
*/
MYSETRECT /* bounds of entire text area */
(
rect,
@ -1061,7 +1046,7 @@ void RSinsstring
RSsetwind(w);
xw = RScurrent->fwidth;
if ((la & 3)) {
if (VSisdecdwh(la)) {
// double width
xw <<= 1;
}
@ -1093,7 +1078,7 @@ void RSinsstring
if (rect.left <= 0)
rect.left = 0;
if ((la & 1)) {
if (VSisdecdhlt(la)) {
// Upper part
ys += RScurrent->fheight;
}
@ -1240,45 +1225,35 @@ Point normalize(Point in, short w, Boolean autoScroll)
to the specified window. Constrains the position to lie within
the currently-visible region of the screen, autoscrolling the
screen if necessary (and if autoScroll = TRUE). */
{
if (in.v <0)
{
{
if (in.v < 0) {
in.v = 0;
if (autoScroll)
VSscrolback(w, 1);
} /* if */
if (in.v > RSlocal[w].height)
{
}
if (in.v > RSlocal[w].height) {
in.v = RSlocal[w].height;
if (autoScroll)
VSscrolforward(w, 1);
} /* if */
}
in.v = in.v / FHeight;
if (in.h < 0)
{
in.h = -1;
if (in.h < 0) {
in.h = 0;
if (autoScroll)
VSscrolleft(w, 1);
} /* if */
if (in.h > RSlocal[w].width)
{
} else if (in.h > RSlocal[w].width) {
in.h = RSlocal[w].width;
if (autoScroll)
VSscrolright(w, 1);
} /* if */
/* in.h = (in.h + Fwidthhalf) / FWidth - 1; */
/* the MPW C 3.0 compiler has a bug in its register allocation */
/* which keeps the above line from working. So, replace it with this: */
in.h = in.h + Fwidthhalf;
in.h = in.h / FWidth - 1;
/* note the bug has been fixed in the 3.1 compiler. */
}
in.h = ((in.h + Fwidthhalf) / FWidth) - 1;
/* convert to virtual screen coordinates */
in.v += RSlocal[w].topline;
in.h += RSlocal[w].leftmarg;
return(in);
} /* normalize */
return in;
} /* normalize */
@ -1303,6 +1278,9 @@ void RSsetsize( short w, short v, short h, short screenIndex)
/* saves the new size settings for a window, and repositions
the scroll bars accordingly. */
{
if ( VSIcursorvisible() )
RScursoff( w );
RSlocal[w].height = ((v - 16 + CVO) / FHeight) * FHeight;
RSlocal[w].width = ((h - 16 + CHO) / FWidth) * FWidth;
RSlocal[w].rheight = v - 16;
@ -1328,7 +1306,7 @@ void RSsetsize( short w, short v, short h, short screenIndex)
}
if ( RSlocal[w].left != NULL ) {
short i;
if (screenIndex == -1)
if (screenIndex < 0)
screenIndex = findbyVS(w);
if ( screenIndex >= 0 && screens[screenIndex].protocol == 4 ) {
i = LOCKWIDTH + 1;

View File

@ -7,13 +7,13 @@ void RSinitall(short max);
void RSsetConst(short w);
short RSsetwind(short w);
void RSbell(short w);
Boolean RScursison( short w );
void RScursoff(short w);
void RScurson(short w, short la, short x, short y);
void RSsetattr(short la, VSAttrib a);
void DoHiliteMode(void);
void RSinvText(short w, Point curr, Point last, RectPtr constrain);
void RSdraw(short w, short x, short y, short la, VSAttrib a, short len, char *ptr);
void RSdefaultattr(short w);
void RSdelcols(short w, short n);
void RSdelchars(short w, short la, short x, short y, short n);
void RSdellines(short w, short t, short b, short n, short scrolled);

View File

@ -63,6 +63,10 @@ typedef struct VSattrline //CCP 2.7 ANSI needs shorts
#define DEBUG_CAPTURE
struct VSscrn {
OSType id; // VSCR
short
vtemulation; /* 0:vt100, 1:vt220, 2:ansi, 3:linux */
short
vteightbits; /* true if we accept vt200 8-bit codes */
VSlinePtr
scrntop, /* topmost line of the current screen (= linest[0]) */
buftop, /* top (i e oldest line) of scrollback buffer */
@ -117,7 +121,11 @@ struct VSscrn {
char *tabs; /* pointer to array for tab settings */
/* contains 'x' at each tab position, blanks elsewhere */
unsigned long escflags;
};
short trincount; /* number of chars pending in translation */
short trinx; /* number of characters to draw at left of cursor */
short trintag; /* true if waiting for a second multi-byte character */
unsigned char trinbuf[4];
};
typedef struct VSscrn VSscrn;
@ -129,7 +137,7 @@ struct VSscrndata {
stat; /* status of this screen (0=Uninitialized, */ /* BYU 2.4.18 */
/* 1=In Use */ /* BYU 2.4.18 */
/* 2=Initialized, but not IU */ /* BYU 2.4.18 */
};
};
typedef struct VSscrndata VSscrndata;

View File

@ -275,11 +275,10 @@ void VSIclrbuf
register VSAttrib *ta;
for (i = 0; i <= VSIw->lines; i++)
{
VSIw->linest[i]->lattr = 0;
if (VSIw->oldScrollback) {
VSIw->attrst[i]->lattr = 0;
ta = &VSIw->attrst[i]->text[0];
} else {
VSIw->linest[i]->lattr = 0;
ta = &VSIw->linest[i]->attr[0];
}
tx = &VSIw->linest[i]->text[0];
@ -293,6 +292,7 @@ void VSIclrbuf
short VSnewscreen
(
short vtemulation,
short maxlines, /* max lines to save in scrollback buffer */
short screensave, /* whether to have a scrollback buffer */
short numLines, //numLines initially on screen (CCP 2.7)
@ -305,7 +305,6 @@ short VSnewscreen
)
/* creates a new virtual screen, and returns its number. */
{
if (maxlines < VSDEFLINES)
maxlines = VSDEFLINES;
@ -348,10 +347,13 @@ short VSnewscreen
if ((VSscreens[VSIwn].loc = VSIw = (VSscrn *) myNewPtr(sizeof(VSscrn))) == 0L)
return(-2);
VSIw->vtemulation = vtemulation;
VSIw->oldScrollback = oldScrollback;
VSIw->lines = numLines;
//VSIw->lines = 23; CCP 2.7 set this from the start
VSIw->linest = VSInewlinearray(VSIw->lines + 1);
if (VSIw->linest == NULL)
{
@ -454,10 +456,13 @@ short VSnewscreen
VSIw->savelines = screensave;
VSIw->forcesave = forcesave; /* NCSA 2.5 */
VSIw->attrib = 0;
VSIw->Pattrib = -1; /* initially no saved attribute */
VSIw->Pattrib = 0xffffffff; /* initially no saved attribute */
VSIw->x = 0;
VSIw->y = 0;
VSIw->charset = 0;
VSIw->trincount = 0;
VSIw->trinx = 0;
VSIw->trintag = 0;
VSIw->G0 = 0;
VSIw->G1 = 1;
VSIw->DECAWM = 0;
@ -532,11 +537,10 @@ void VSrealloc(short w)
}
savedTextPtr = savedTextBlock;
for (i = 0; i <= VSIw->lines; i++) {
savedTextPtr->lattr = VSIw->linest[i]->lattr;
if (VSIw->oldScrollback) {
savedTextPtr->lattr = VSIw->attrst[i]->lattr;
BlockMoveData(VSIw->attrst[i]->text, savedTextPtr->attr, (VSIw->allwidth + 1) * sizeof(VSAttrib));
} else {
savedTextPtr->lattr = VSIw->linest[i]->lattr;
BlockMoveData(VSIw->linest[i]->attr, savedTextPtr->attr, (VSIw->allwidth + 1) * sizeof(VSAttrib));
}
if (savedTextPtr->next) savedTextPtr = savedTextPtr->next;
@ -591,7 +595,6 @@ void VSredrawLine(short w) //redraws current line
VSIcuroff(w);
}
short VSredraw
(
short w, // window to redraw */
@ -605,6 +608,10 @@ short VSredraw
VSlinePtr ypt;
short y;
short tx1, tx2, ty1, ty2, tn, offset;
short sx1;
short sx2;
Boolean cursOff;
if (VSvalids(w) != 0)
return(-3);
@ -633,9 +640,12 @@ short VSredraw
tn = -1; // so we include more than 1 line
// if (VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)!=0) return 0; // test clip region
if (VSIcursorenabled())
cursOff = 0;
if ( VSIcursorenabled() && RScursison(w) ) {
cursOff = 1;
VSIcuroff(w); // temporarily hide cursor
}
// draw visible part of scrollback buffer
if (y1 < 0) {
@ -648,6 +658,9 @@ short VSredraw
if (!VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)) {
sx1 = tx1;
sx2 = tx2;
ypt = VSIw->vistop;
for(y=VSIw->Rtop; y<y1; y++)
ypt = ypt->next; // Get pointer to top line we need
@ -657,34 +670,39 @@ short VSredraw
VSAttrib *pa;
VSAttrib lasta;
short x, lastx;
short chw;
pt = ypt->text + VSIw->Rleft;
pa = ypt->attr + VSIw->Rleft;
// if double size, we must shift width
if (ypt->lattr & 3) {
if (VSisdecdwh(ypt->lattr)) {
tx1 >>= 1;
tx2 >>= 1;
}
chw = 2;
} else
chw = 1;
// multi-byte
if ( tx1 > 0 && (pa[tx1-1] & kVSansi2b) )
--tx1;
if ( tx2 < VSIw->maxwidth && (pa[tx2] & kVSansi2b) )
++tx2;
lastx = tx1;
lasta = pa[tx1];
for(x=tx1+1; x<=tx2; x++) {
if (pa[x]!=lasta) {
lasta = pa[tx1] & ~kVSansi2b;
for(x = tx1+1; x <= tx2; x++) {
if ( (pa[x] & ~kVSansi2b) != lasta ) {
RSdraw(w, lastx, y, ypt->lattr, lasta, x-lastx, pt + lastx);
lastx = x;
lasta = pa[x];
lasta = pa[x] & ~kVSansi2b;
}
}
if (lastx<=tx2)
RSdraw(w, lastx, y, ypt->lattr, lasta, tx2-lastx+1, pt + lastx);
// if double size, we must shift width
if (ypt->lattr & 3) {
tx1 <<= 1;
tx2 <<= 1;
}
tx1 = sx1;
tx2 = sx2;
ypt = ypt->next;
}
}
@ -702,6 +720,9 @@ short VSredraw
if (!VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)) {
sx1 = tx1;
sx2 = tx2;
ypt = VSIw->linest[VSIw->Rtop+ty1];
for (y=ty1; y<=ty2; y++) {
@ -709,43 +730,49 @@ short VSredraw
VSAttrib *pa;
VSAttrib lasta;
short x, lastx;
short chw;
pt = ypt->text + VSIw->Rleft;
pa = ypt->attr + VSIw->Rleft;
// if double size, we must shift width
if (ypt->lattr & 3) {
if (VSisdecdwh(ypt->lattr)) {
tx1 >>= 1;
tx2 >>= 1;
}
chw = 2;
} else
chw = 1;
// multi-byte
if ( tx1 > 0 && (pa[tx1-1] & kVSansi2b) )
--tx1;
if ( tx2 < VSIw->maxwidth && (pa[tx2] & kVSansi2b) )
++tx2;
lastx = tx1;
lasta = pa[tx1];
for(x=tx1+1; x<=tx2; x++) {
if (pa[x]!=lasta) {
lasta = pa[tx1] & ~kVSansi2b;
for(x = tx1+1; x <= tx2; x++) {
if ( (pa[x] & ~kVSansi2b) != lasta ) {
RSdraw(w, lastx, y, ypt->lattr, lasta, x-lastx, pt + lastx);
lastx = x;
lasta = pa[x];
lasta = pa[x] & ~kVSansi2b;
}
}
if (lastx<=tx2)
RSdraw(w, lastx, y, ypt->lattr, lasta, tx2-lastx+1, pt + lastx);
// if double size, we must shift width
if (ypt->lattr & 3) {
tx1 <<= 1;
tx2 <<= 1;
}
tx1 = sx1;
tx2 = sx2;
ypt = ypt->next;
}
}
}
if (VSIcursorenabled())
if (VSIcursorenabled() && cursOff)
VSIcurson(w, VSIw->x, VSIw->y, 0); /* restore cursor at original position */
return(0);
} /* VSredraw */
} /* VSredraw */
short VSOredraw
(
@ -761,6 +788,11 @@ short VSOredraw
VSattrlinePtr ypa;
short y;
short tx1, tx2, ty1, ty2, tn, offset;
short sx1;
short sx2;
Boolean cursOff;
// this fails for multi-bytes character set...
if (VSvalids(w) != 0)
return(-3);
@ -786,11 +818,14 @@ short VSOredraw
tn = -1; // so we include more than 1 line
// if (VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)!=0) return 0; // test clip region
if (VSIcursorenabled())
VSIcuroff(w); // temporarily hide cursor
RSerase(w, tx1, ty1, tx2, ty2); // Erase the offending area
cursOff = 0;
if ( VSIcursorenabled() && RScursison(w) ) {
cursOff = 1;
VSIcuroff(w); // temporarily hide cursor
}
// RSerase(w, tx1, ty1, tx2, ty2); // Erase the offending area
// draw visible part of scrollback buffer
if (y1 < 0) {
@ -802,6 +837,9 @@ short VSOredraw
tn = -1;
if (!VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)) {
sx1 = tx1;
sx2 = tx2;
ypt = VSIw->vistop;
for(y=VSIw->Rtop; y<y1; y++)
ypt = ypt->next; // Get pointer to top line we need
@ -809,17 +847,18 @@ short VSOredraw
for (y=ty1; y<=ty2; y++) {
// if double size, we must shift width
if (ypt->lattr & 3) {
tx1 >>= 1;
tx2 >>= 1;
if (VSisdecdwh(ypt->lattr)) {
tx1 = (tx1 & 1) ? (tx1 >> 1) - 1 : (tx1 >> 1);
tx2 = (tx2 & 1) ? (tx2 >> 1) + 1 : (tx2 >> 1);
}
/* no attributes... */
RSdraw(w, tx1, y, ypt->lattr, 0, tn, ypt->text + VSIw->Rleft +tx1);
// if double size, we must shift width
if (ypt->lattr & 3) {
tx1 <<= 1;
tx2 <<= 1;
if (VSisdecdwh(ypt->lattr)) {
tx1 = sx1;
tx2 = sx2;
}
ypt = ypt->next;
@ -839,6 +878,9 @@ short VSOredraw
if (!VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)) {
sx1 = tx1;
sx2 = tx2;
ypt = VSIw->linest[VSIw->Rtop+ty1];
ypa = VSIw->attrst[VSIw->Rtop+ty1];
@ -852,28 +894,34 @@ short VSOredraw
pa = ypa->text + VSIw->Rleft;
// if double size, we must shift width
if (ypa->lattr & 3) {
tx1 >>= 1;
tx2 >>= 1;
if (VSisdecdwh(ypt->lattr)) {
tx1 = (tx1 & 1) ? (tx1 >> 1) - 1 : (tx1 >> 1);
tx2 = (tx2 & 1) ? (tx2 >> 1) + 1 : (tx2 >> 1);
}
lastx = tx1;
lasta = pa[tx1];
lasta = pa[tx1] & ~kVSansi2b;
for(x=tx1+1; x<=tx2; x++) {
if (pa[x]!=lasta) {
RSdraw(w, lastx, y, ypa->lattr, lasta, x-lastx, pt + lastx);
if ( (pa[x] & ~kVSansi2b) != lasta ) {
if (lastx == tx1 && tx1 > 0 && (pa[tx1-1] & kVSansi2b))
RSdraw(w, lastx-1, y, ypt->lattr, lasta, x-lastx+1, pt + lastx-1);
else
RSdraw(w, lastx, y, ypt->lattr, lasta, x-lastx, pt + lastx);
lastx = x;
lasta = pa[x];
lasta = pa[x] & ~kVSansi2b;
}
}
if (lastx<=tx2)
RSdraw(w, lastx, y, ypa->lattr, lasta, tx2-lastx+1, pt + lastx);
if (lastx<=tx2) {
if (lastx == tx1 && tx1 > 0 && (pa[tx1-1] & kVSansi2b))
RSdraw(w, lastx-1, y, ypt->lattr, lasta, tx2-lastx+2, pt + lastx-1);
else
RSdraw(w, lastx, y, ypt->lattr, lasta, tx2-lastx+1, pt + lastx);
}
// if double size, we must shift width
if (ypa->lattr & 3) {
tx1 <<= 1;
tx2 <<= 1;
if (VSisdecdwh(ypt->lattr)) {
tx1 = sx1;
tx2 = sx2;
}
ypt = ypt->next;
@ -882,7 +930,7 @@ short VSOredraw
}
}
if (VSIcursorenabled())
if (VSIcursorenabled() && cursOff)
VSIcurson(w, VSIw->x, VSIw->y, 0); /* restore cursor at original position */
return(0);
@ -896,27 +944,34 @@ short VSwrite
short len /* length of text string */
)
/* sends a stream of characters to the specified window. */
{
{
int cursOff;
// _profile = 1;
if (len == 0)
return 0;
if (VSvalids(w) != 0)
return(-3);
if (VSIcursorenabled())
VSIcuroff(w); /* hide cursor momentarily */
cursOff = 0;
if ( VSIcursorenabled() ) {
cursOff = 1;
VSIcuroff(w); // hide cursor momentarily
}
VSIcursdisable(); // RAB BetterTelnet 2.0b4
VSem((unsigned char *) ptr, len); /* BYU LSC - interpret the character stream */
VSIflush(); // RAB BetterTelnet 2.0b3
VSIcursenable();
if (VSIcursorenabled())
if ( VSIcursorenabled() && cursOff )
VSIcurson(w, VSIw->x, VSIw->y, 1); /* restore cursor, force it to be visible. */
// _profile = 0;
return(0);
} /* VSwrite */
} /* VSwrite */
// RAB BetterTelnet 2.0b3
// The same VSwrite you know and love, except it doesn't flush.
// This is for parse() to use so it doesn't flush every time it hits an escape.
short VSwritefast
(
short w, /* screen to draw into */
@ -926,12 +981,13 @@ short VSwritefast
/* sends a stream of characters to the specified window. */
{
// _profile = 1;
if (len == 0)
if ( len == 0 )
return 0;
if (VSvalids(w) != 0)
if ( VSvalids(w) != 0 )
return(-3);
if (VSIcursorenabled())
if ( VSIcursorenabled() ) {
VSIcuroff(w); /* hide cursor momentarily */
}
VSIcursdisable();
VSem((unsigned char *) ptr, len); /* BYU LSC - interpret the character stream */
@ -951,10 +1007,11 @@ void VSflushwrite(short w) {
VSIflush();
VSIcursenable();
if (VSIcursorenabled())
if ( VSIcursorenabled() ) {
VSIcurson(w, VSIw->x, VSIw->y, 1);
}
}
// Utility routine: BetterTelnet 1.0fc3 (RAB)
void VSsetprintmode(short w, short printMode) {
@ -1066,6 +1123,7 @@ void VSpossend
/* sends a stream of VT100 cursor-movement sequences to move the
cursor on the specified screen to the specified position. */
{
short sn;
static char
VSkbax[] = "\033O ", /* prefix for auxiliary code */
VSkban[] = "\033[ "; /* prefix for arrows normal */
@ -1076,8 +1134,9 @@ void VSpossend
/* NCSA: SB - This would bomb before. You need to get the screens # from the
translation routine before you access the record! */
if (screens[findbyVS(w)].arrowmap) { /* NCSA: SB - get the CORRECT screens # */
translation routine before you access the record! */
sn = findbyVS(w);
if (sn >= 0 && screens[sn].arrowmap) { /* NCSA: SB - get the CORRECT screens # */
VSpossendEM(w,x,y,echo); // MAT-- call our cursor movement routine
return; // MAT-- then exit
}
@ -1147,6 +1206,7 @@ char VSkbsend
// VSkban[] = "\033[ ", /* prefix for arrows normal */
// VSkbfn[] = "\033O ", /* prefix for function keys */ /* BYU 2.4.12 */
// VSk220[] = "\033[ ~"; /* prefix for vt220 keys */ /* BYU 2.4.12 */
short sn;
char *vskptr;
short vskplen;
short macronum;
@ -1154,7 +1214,10 @@ char VSkbsend
if (VSvalids(w) != 0)
return(-3);
if ( screens[findbyVS(w)].arrowmap && (k <= VSLT) && (k >= VSUP) ) // MAT--
sn = findbyVS(w);
if (sn < 0)
return;
if ( screens[sn].arrowmap && (k <= VSLT) && (k >= VSUP) ) // MAT--
// MAT-- important...we need to check this first before
{ // MAT-- the next if(É) statement gets its hands on the string.
switch (k) { // MAT-- do the mapping from arrowkeys -> EMACS ctrl keys.
@ -1239,7 +1302,7 @@ char VSkbsend
else if ((k == VSKE) && !VSIw->DECPAM) // Enter (!AM)
macronum++;
sendmacro(&screens[findbyVS(VSIwn)], macronum); // and actually send it, the NEW way!
sendmacro(&screens[sn], macronum); // and actually send it, the NEW way!
return 0;
} /* VSkbsend */
@ -1636,7 +1699,7 @@ char *VSIstrcopy(char *src, short len, char *dest, short table, short noClip)
p = src + len - 1;
/* skip trailing blanks, but only if !noClip */
if ((!noClip) || table || gApplicationPrefs->clipTrailingSpaces)
if (!noClip && (table || gApplicationPrefs->clipTrailingSpaces))
// RAB BetterTelnet 1.0fc7, 1.1
while ((*p == ' ') && (p >= src))
p--;
@ -1671,7 +1734,8 @@ char *VSIstrcopy(char *src, short len, char *dest, short table, short noClip)
return(dest);
} /* VSIstrcopy */
long VSgettext(short w, short x1, short y1, short x2, short y2, char *charp, long max, char *EOLS, short table)
long VSOgettext(short w, short x1, short y1, short x2, short y2, char *charp, long max, char *EOLS, short table)
/* copies a portion of text from the specified virtual screen into
the *charp buffer. table, if nonzero, is the minimum length of
runs of spaces to be replaced with single tabs. Returns the
@ -1679,11 +1743,11 @@ long VSgettext(short w, short x1, short y1, short x2, short y2, char *charp, lon
length to copy, but this is currently ignored!
EOLS is the end-of-line sequence to insert at line boundaries.
This is currently assumed to be exactly one character long. */
{
{
UNUSED_ARG(max) /* !! */
short EOLlen;
short lx,ly, /* Upper bounds of selection */
ux,uy; /* Lower bounds of selection */
ux,uy; /* Lower bounds of selection */
short maxwid;
char *origcp;
VSlinePtr t;
@ -1694,29 +1758,37 @@ long VSgettext(short w, short x1, short y1, short x2, short y2, char *charp, lon
maxwid = VSIw->maxwidth;
origcp = charp;
if (y1 < -VSIw->numlines)
{
y1 = -VSIw->numlines;
x1 = -1;
} /* if */
if (y1 == y2)
// this fails for multi-bytes character set...
/* Order the lower and upper bounds */
if (x1 < x2) {
ux = x1;
lx = x2;
} else {
ux = x2;
lx = x1;
}
if (y1 < y2) {
uy = y1;
ly = y2;
} else {
uy = y2;
ly = y1;
}
if (uy < -VSIw->numlines) {
uy = -VSIw->numlines;
ux = -1;
}
if (ly < -VSIw->numlines) {
ly = -VSIw->numlines;
}
if (uy == ly)
{
/* copying no more than a single line */
t = VSIGetLineStart(w, y1);
if (x1 < x2) /* Order the lower and upper bounds */
{
ux = x1;
uy = y1;
lx = x2;
ly = y2;
}
else
{
ux = x2;
uy = y2;
lx = x1;
ly = y1;
} /* if */
t = VSIGetLineStart(w, uy);
if ((long)(lx-ux) < max)
charp=VSIstrcopy(&t->text[ux+1], lx-ux, charp, table, 1);
@ -1728,20 +1800,6 @@ long VSgettext(short w, short x1, short y1, short x2, short y2, char *charp, lon
else
{
/* copying more than one line */
if (y1 < y2) /* Order the lower and upper bounds */
{
ux = x1;
uy = y1;
lx = x2;
ly = y2;
}
else
{
ux = x2;
uy = y2;
lx = x1;
ly = y1;
} /* if */
t = VSIGetLineStart(w, uy);
if (((long) (maxwid-ux) < max))
charp=VSIstrcopy(&t->text[ux+1],maxwid-ux,charp,table, 0);
@ -1772,7 +1830,243 @@ long VSgettext(short w, short x1, short y1, short x2, short y2, char *charp, lon
*charp++ = *EOLS; /* assumes it's only one character! */
} /* if */
return(charp - origcp);
} /* VSgettext */
} /* VSgettext */
long VSgettext(short w, short x1, short y1, short x2, short y2,
char *charp, long max, char *EOLS, short table, short clipspaces)
/* copies a portion of text from the specified virtual screen into
the *charp buffer. table, if nonzero, is the minimum length of
runs of spaces to be replaced with single tabs. Returns the
length of the copied text. max is supposed to be the maximum
length to copy, but this is currently ignored!
EOLS is the end-of-line sequence to insert at line boundaries.
This is currently assumed to be exactly one character long. */
{
short mw;
short lx,ly, /* Upper bounds of selection */
ux,uy; /* Lower bounds of selection */
char *origcp;
short elen;
short outlen;
short i;
VSlinePtr ypt;
VSattrlinePtr ypa;
char *pt;
VSAttrib *pa;
if (VSvalids(w) != 0)
return(-3);
if (VSIw->oldScrollback)
return VSOgettext(w, x1, y1, x2, y2, charp, max, EOLS, table);
mw = VSIw->maxwidth;
/* limit the lower and upper bounds */
if (x1 < -1)
x1 = -1;
else if (x1 > mw)
x1 = mw;
if (x2 < -1)
x2 = -1;
else if (x2 > mw)
x2 = mw;
if (y1 < -VSIw->numlines) {
y1 = -VSIw->numlines;
x1 = -1;
} else if (y1 > VSIw->lines) {
y1 = VSIw->lines;
x1 = mw;
}
if (y2 < -VSIw->numlines) {
y2 = -VSIw->numlines;
x2 = -1;
} else if (y2 > VSIw->lines) {
y2 = VSIw->lines;
x2 = mw;
}
origcp = charp;
elen = strlen(EOLS);
/* Order the lower and upper bounds */
ux = x1;
lx = x2;
uy = y1;
ly = y2;
if ( y1 == y2 ) {
if ( x1 > x2 ) {
ux = x2;
lx = x1;
}
} else if (y1 > y2) {
uy = y2;
ly = y1;
ux = x2;
lx = x1;
}
x1 = ux + 1;
// get text from scrollback buffer
if (uy < 0) {
x2 = mw;
y2 = (ly >= 0) ? -1 : ly;
ypt = VSIGetLineStart(w, uy);
for ( y1 = uy; y1 <= y2 && max >= elen; y1++, x1 = 0, x2 = mw, ypt = ypt->next ) {
pt = ypt->text;
// pa = ypt->attr;
if (y1 == ly)
x2 = lx; // end last line
outlen = x2 - x1 + 1;
if (outlen > max) {
outlen = max;
}
charp = VSIstrcopy(pt + x1, outlen, pt = charp, table, !clipspaces);
max -= charp - pt;
if (max >= elen && !VSiswrap(ypt->lattr) && y1 != ly) {
strcpy(charp, EOLS);
charp += elen;
max -= elen;
}
}
uy = 0; // continue with on-screen buffer, if any
}
// get text from on-screen buffer
if (ly >= 0) {
x2 = mw;
ypt = VSIw->linest[uy];
for ( y1 = uy; y1 <= ly && max >= elen; y1++, x1 = 0, x2 = mw, ypt = ypt->next ) {
pt = ypt->text;
// pa = ypt->attr;
if (y1 == ly)
x2 = lx;
outlen = x2 - x1 + 1;
if (outlen > max) {
outlen = max;
}
charp = VSIstrcopy(pt + x1, outlen, pt = charp, table, !clipspaces);
max -= charp - pt;
if (max >= elen && !VSiswrap(ypt->lattr) && y1 != ly) {
strcpy(charp, EOLS);
charp += elen;
max -= elen;
}
}
}
return charp - origcp;
}
long VSgetattr(short w, short x1, short y1, short x2, short y2,
VSAttrib *attrp, long max)
{
short mw;
short lx,ly; // Lower bounds of selection
short ux,uy; // Upper bounds of selection
VSAttrib *origap;
short outlen;
short i;
VSlinePtr ypt;
VSAttrib *pa;
if (VSvalids(w) != 0)
return(-3);
if (VSIw->oldScrollback)
return 0; // not coded...
mw = VSIw->maxwidth;
/* limit the lower and upper bounds */
if (x1 < -1)
x1 = -1;
else if (x1 > mw)
x1 = mw;
if (x2 < -1)
x2 = -1;
else if (x2 > mw)
x2 = mw;
if (y1 < -VSIw->numlines) {
y1 = -VSIw->numlines;
x1 = -1;
} else if (y1 > VSIw->lines) {
y1 = VSIw->lines;
x1 = mw;
}
if (y2 < -VSIw->numlines) {
y2 = -VSIw->numlines;
x2 = -1;
} else if (y2 > VSIw->lines) {
y2 = VSIw->lines;
x2 = mw;
}
origap = attrp;
/* Order the lower and upper bounds */
ux = x1;
lx = x2;
uy = y1;
ly = y2;
if ( y1 == y2 ) {
if ( x1 > x2 ) {
ux = x2;
lx = x1;
}
} else if (y1 > y2) {
uy = y2;
ly = y1;
ux = x2;
lx = x1;
}
x1 = ux + 1;
// get attributes from scrollback buffer
if (uy < 0) {
x2 = mw;
y2 = (ly >= 0) ? -1 : ly;
ypt = VSIGetLineStart(w, uy);
for ( y1 = uy; y1 <= y2 && max >= sizeof(VSAttrib); y1++, x1 = 0, x2 = mw, ypt = ypt->next ) {
pa = ypt->attr;
if (y1 == ly)
x2 = lx; // end last line
outlen = (x2 - x1 + 1) * sizeof(VSAttrib);
if (outlen > max / sizeof(VSAttrib)) {
outlen = max / sizeof(VSAttrib);
}
memcpy(attrp, pa + x1, outlen * sizeof(VSAttrib));
attrp += outlen;
max -= outlen * sizeof(VSAttrib);
}
uy = 0; // continue with on-screen buffer, if any
}
// get attributes from on-screen buffer
if (ly >= 0) {
x2 = mw;
ypt = VSIw->linest[uy];
for ( y1 = uy; y1 <= ly && max >= sizeof(VSAttrib); y1++, x1 = 0, x2 = mw, ypt = ypt->next ) {
pa = ypt->attr;
if (y1 == ly)
x2 = lx;
outlen = (x2 - x1 + 1) * sizeof(VSAttrib);
if (outlen > max / sizeof(VSAttrib)) {
outlen = max / sizeof(VSAttrib);
}
memcpy(attrp, pa + x1, outlen * sizeof(VSAttrib));
attrp += outlen;
max -= outlen * sizeof(VSAttrib);
}
}
return attrp - origap;
}
short VSgetnumlines
(
@ -2073,7 +2367,6 @@ short VSOsetlines
/* initialize the new screen lines to blank text and no attributes */
for (i = 0; i <= lines; i++)
{
VSIw->attrst[i]->lattr = 0;
VSIw->linest[i]->lattr = 0;
tempa = VSIw->attrst[i]->text;
temp = VSIw->linest[i]->text;
@ -2154,6 +2447,8 @@ short VSPulseOne
VSattrlinePtr ypa;
short y;
short tx1, tx2, ty1, ty2, tn, offset;
short sx1;
short sx2;
short cursOff;
if (VSvalids(w) != 0)
@ -2188,8 +2483,11 @@ short VSPulseOne
cursOff = 0;
// draw visible part of scrollback buffer
// we need to access only the visible part
sx1 = tx1;
sx2 = tx2;
ypt = VSIw->vistop;
for(y=VSIw->Rtop; y<y1; y++)
ypt = ypt->next; // Get pointer to top line we need
@ -2204,9 +2502,9 @@ short VSPulseOne
pa = ypt->attr + VSIw->Rleft;
// if double size, we must shift width
if (ypt->lattr & 3) {
tx1 >>= 1;
tx2 >>= 1;
if (VSisdecdwh(ypt->lattr)) {
tx1 = (tx1 & 1) ? (tx1 >> 1) - 1 : (tx1 >> 1);
tx2 = (tx2 & 1) ? (tx2 >> 1) + 1 : (tx2 >> 1);
}
lastx = tx1;
@ -2245,15 +2543,16 @@ short VSPulseOne
}
// if double size, we must shift width
if (ypt->lattr & 3) {
tx1 <<= 1;
tx2 <<= 1;
if (VSisdecdwh(ypt->lattr)) {
tx1 = sx1;
tx2 = sx2;
}
ypt = ypt->next;
}
/* back to default window colors */
RSsetwind(w);
RSsetattr( 0, 0 );
return 0;
@ -2274,6 +2573,8 @@ short VSOPulseOne
short y;
short tx1, tx2, ty1, ty2, tn, offset;
short cursOff;
short sx1;
short sx2;
if (VSvalids(w) != 0)
return(-3);
@ -2304,7 +2605,9 @@ short VSOPulseOne
cursOff = 0;
if(y1<0) y1=0;
if (y1 < 0)
y1 = 0;
// draw visible part of on-screen buffer, taking account of attributes
if (y2 >= 0) {
@ -2316,6 +2619,9 @@ short VSOPulseOne
if (!VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)) {
sx1 = tx1;
sx2 = tx2;
ypt = VSIw->linest[VSIw->Rtop+ty1];
ypa = VSIw->attrst[VSIw->Rtop+ty1];
@ -2329,9 +2635,9 @@ short VSOPulseOne
pa = ypa->text + VSIw->Rleft;
// if double size, we must shift width
if (ypa->lattr & 3) {
tx1 >>= 1;
tx2 >>= 1;
if (VSisdecdwh(ypt->lattr)) {
tx1 = (tx1 & 1) ? (tx1 >> 1) - 1 : (tx1 >> 1);
tx2 = (tx2 & 1) ? (tx2 >> 1) + 1 : (tx2 >> 1);
}
lastx = tx1;
@ -2344,7 +2650,7 @@ short VSOPulseOne
cursOff = 1;
VSIcuroff(w);
}
RSdraw(w, lastx, y, ypa->lattr, lasta, x-lastx, pt + lastx);
RSdraw(w, lastx, y, ypt->lattr, lasta, x-lastx, pt + lastx);
if ( cursOff ) {
// restore cursor at original position
cursOff = 0;
@ -2361,7 +2667,7 @@ short VSOPulseOne
cursOff = 1;
VSIcuroff(w);
}
RSdraw(w, lastx, y, ypa->lattr, lasta, tx2-lastx+1, pt + lastx);
RSdraw(w, lastx, y, ypt->lattr, lasta, tx2-lastx+1, pt + lastx);
if ( cursOff ) {
// restore cursor at original position
cursOff = 0;
@ -2370,9 +2676,9 @@ short VSOPulseOne
}
// if double size, we must shift width
if (ypa->lattr & 3) {
tx1 <<= 1;
tx2 <<= 1;
if (VSisdecdwh(ypt->lattr)) {
tx1 = sx1;
tx2 = sx2;
}
ypt = ypt->next;
@ -2382,7 +2688,10 @@ short VSOPulseOne
}
/* back to default window colors */
RSsetwind(w);
RSsetattr( 0, 0 );
return 0;
}

View File

@ -10,20 +10,21 @@ void VScapture(unsigned char *ptr, short len);
short VSvalids(short w);
VSscrn *VSwhereis(short i);
void VSIclrbuf(void);
short VSnewscreen(short maxlines, short screensave, short numLines, short maxwid, short forcesave, short ignoreBeeps, short oldScrollback, short jump, short blink);
short VSnewscreen(short vtemulation, short maxlines, short screensave, short numLines,
short maxwid, short forcesave, short ignoreBeeps, short oldScrollback, short jump, short blink);
short VSdestroy(short w);
short VSredraw(short w, short x1, short y1, short x2, short y2);
short VSOredraw(short, short, short, short, short);
short VSwrite(short w, char *ptr, short len);
short VSwritefast(short w, char *ptr, short len);
void VSsetprintmode(short, short);
short VSclear(short w);
//short VSclear(short w);
void VSpossendEM(short w, short x, short y, short echo);
void VSpossend(short w, short x, short y, short echo);
char VSkbsend(short w, unsigned char k, short echo, short blah);
short VSclearall(short w);
//short VSclearall(short w);
short VSreset(short w);
char *VSgetline(short w, short y);
//char *VSgetline(short w, short y);
void VSscrolright(short w, short n);
void VSredrawLine(short w);
void VSscrolleft(short w, short n);
@ -35,11 +36,14 @@ short VSscrolcontrol(short w, short scrolon, short offtop);
void VSbeepcontrol(short, short);
void VSenableblink(short w, Boolean enableBlink);
short VSgetrgn(short w, short *x1, short *y1, short *x2, short *y2);
short VSsnapshot(short w);
//short VSsnapshot(short w);
short VSmaxwidth(short w);
VSlinePtr VSIGetLineStart(short w, short y1);
char *VSIstrcopy(char*, short, char*, short, short);
long VSgettext(short w, short x1, short y1, short x2, short y2, char *charp, long max, char *EOLS, short table);
long VSgettext(short w, short x1, short y1, short x2, short y2,
char *charp, long max, char *EOLS, short table, short clipspaces);
long VSgetattr(short w, short x1, short y1, short x2, short y2,
VSAttrib *attrp, long max);
short VSgetlines(short w);
short VSgetnumlines(short w);
short VSsetlines(short w, short lines);

View File

@ -35,6 +35,7 @@
#include "rsmac.proto.h"
#include "rsinterf.proto.h"
#include "maclook.proto.h"
#include "translate.proto.h"
#include "wind.h"
#include "rsdefs.h"
#include "Vers.h"
@ -42,7 +43,7 @@
#define ScrollbackQuantum 100
//#define VSIclrattrib 0
#define VSIclrattrib VSIw->attrib
#define VSIclrattrib (VSIw->attrib & 0x0003ffff)
#include "vsintern.proto.h"
@ -172,11 +173,7 @@ void VSIcurson
if (!VSIw->DECCM) return; // Bri 970610
if (VSIw->disableCursor) return; // RAB BetterTelnet 2.0b4
if (VSIw->oldScrollback) {
lattr = VSIw->attrst[y]->lattr;
} else {
lattr = VSIw->linest[y]->lattr;
}
lattr = VSIw->linest[y]->lattr;
if (!VSIclip(&x, &y, &x2, &y2, &n, &offset)) {
/* cursor already lies within visible region */
@ -240,8 +237,6 @@ short VSIcursorenabled( void )
return 0; // Bri 970610
if (VSIw->disableCursor)
return 0; // RAB BetterTelnet 2.0b4
if (!RSisInFront(VSIwn))
return 0;
return 1;
}
@ -262,6 +257,85 @@ short VSIcursorvisible( void )
return 1;
}
/*
* VScursblink
*/
void VScursblink( short w )
{
unsigned long now;
short
x = VSIw->x,
y = VSIw->y,
x2,
y2,
n = 1,
offset;
if (!gApplicationPrefs->BlinkCursor
|| VSvalids(w)
|| !VSIcursorvisible()
|| ((!RSlocal[w].active || TelInfo->suspended) && !RSlocal[w].cursorstate))
return;
if ( (now = LMGetTicks()) - TelInfo->blinktime >= CURS_BLINK_PERIOD ) {
GrafPtr savePort;
GetPort(&savePort);
TelInfo->blinktime = now;
RSlocal[w].cursorstate ^= 1;
SetPort(RSlocal[w].window);
InvertRect(&RSlocal[w].cursor);
SetPort(savePort);
}
} /* VScursblink */
/*
* VScursblinkon
*/
void VScursblinkon( short w )
{
if (!gApplicationPrefs->BlinkCursor
|| VSvalids(w)
|| !VSIcursorvisible()
|| !RSlocal[w].active
|| TelInfo->suspended)
return;
TelInfo->blinktime = LMGetTicks();
if ( !RSlocal[w].cursorstate ) {
GrafPtr savePort;
GetPort(&savePort);
RSlocal[w].cursorstate = 1;
SetPort(RSlocal[w].window);
InvertRect(&RSlocal[w].cursor);
SetPort(savePort);
}
} /* VScursblinkon */
/*
* VScursblinkoff
*/
void VScursblinkoff( short w )
{
if (!gApplicationPrefs->BlinkCursor || VSvalids(w) || !VSIcursorvisible())
return;
if ( RSlocal[w].cursorstate ) {
GrafPtr savePort;
GetPort(&savePort);
RSlocal[w].cursorstate = 0;
TelInfo->blinktime = LMGetTicks() - CURS_BLINK_PERIOD;
SetPort(RSlocal[w].window);
InvertRect(&RSlocal[w].cursor);
SetPort(savePort);
}
} /* VScursblinkoff */
VSlineArray VSInewlinearray
(
short nrlines
@ -629,11 +703,10 @@ void VSIelo
if (s < 0)
s = VSIw->y;
VSIw->linest[s]->lattr = 0;
if (VSIw->oldScrollback) {
VSIw->attrst[s]->lattr = 0;
ta = &VSIw->attrst[s]->text[0];
} else {
VSIw->linest[s]->lattr = 0;
ta = &VSIw->linest[s]->attr[0];
}
tt = &VSIw->linest[s]->text[0];
@ -730,12 +803,15 @@ void VSIreset
VSIw->DECPAM = 0;
VSIw->DECORG = 0; /* NCSA: SB -- is this needed? */
VSIw->DECCM = 1; // Bri 970610
VSIw->Pattrib = 0xffff; /* NCSA: SB -- is this needed? */
VSIw->Pattrib = 0xffffffff; /* NCSA: SB -- is this needed? */
VSIw->IRM = 0;
VSIw->attrib = 0;
VSIw->x = 0;
VSIw->y = 0;
VSIw->charset = 0;
VSIw->trincount = 0;
VSIw->trinx = 0;
VSIw->trintag = 0;
VSIw->prbuf=0; /* LU */
if (VSIw->prredirect) { /* LU - kill redirection */
VSIw->prredirect=0; /* LU */
@ -851,7 +927,9 @@ void VSOdellines
short i, j;
char *tt;
VSAttrib *ta;
VSlinePtr as, ts, TD, BD, TI, BI, itt, ita;
VSlinePtr as, ts, TD, BD, TI, BI, itt;
VSattrlinePtr ita;
if (s < 0)
s = VSIw->y;
if (s + n - 1 > VSIw->bottom)
@ -897,13 +975,12 @@ void VSOdellines
VSIlistmove(TD, BD, TI, BI);
/* blank out the newly-created replacement lines */
ita = TD; /* start of attribute lines to be blanked out */
ita = (VSattrlinePtr)TD; /* start of attribute lines to be blanked out */
for (i = 0; i < n; i++)
{
ta = ((VSattrlinePtr)ita)->text;
ita->lattr = 0;
itt->lattr = 0;
tt = itt->text;
ta = ita->text;
for (j = 0; j <= VSIw->allwidth; j++)
{
*tt++ = ' ';
@ -1059,10 +1136,9 @@ void VSOinslines
ita = aTD; /* start of attribute lines to be blanked out */
for (i = 0; i < n; i++)
{
itt->lattr = 0;
tt = itt->text;
ta = ita->text;
itt->lattr = 0;
ita->lattr = 0;
for (j = 0; j <= VSIw->allwidth; j++)
{
*tt++ = ' ';
@ -1312,7 +1388,6 @@ void VSOscroll
else
VSIw->vistop = VSIw->vistop->next; /* consistent with changed display */
/* blank out newly-revealed bottom line */
VSIw->attrst[VSIw->lines]->lattr = 0;
VSIw->linest[VSIw->lines]->lattr = 0;
tempa = VSIw->attrst[VSIw->lines]->text;
temp = VSIw->linest[VSIw->lines]->text;
@ -1373,7 +1448,9 @@ void VSIindex
/* moves cursor down one line, unless it's at the bottom of
the scrolling region, in which case scrolls up one. */
// RAB BetterTelnet 2.0b3 - added jump scrolling so it runs faster
{
{
short sn = findbyVS(VSIwn);
if (VSIw->y == VSIw->bottom) { /* BYU - changed "==" to ">=" and back again */
if (VSIw->jumpScroll)
if (VSIw->linesjumped || !RSlocal[VSIwn].skip)
@ -1389,6 +1466,12 @@ void VSIindex
VSIw->lattrib = 0;
// back to default input translation ?
if ( sn >= 0 ) {
WindRec *tw = &screens[sn];
switchintranslation(tw, tw->outnational, tw->outcharset);
}
} /* VSIindex */
void VSIwrapnow(short *xp, short *yp)
@ -1399,7 +1482,7 @@ void VSIwrapnow(short *xp, short *yp)
{
short mw = VSIw->maxwidth;
if ((VSIw->lattrib & 3)) {
if (VSisdecdwh(VSIw->lattrib)) {
mw >>= 1;
if ( !(VSIw->maxwidth & 1) )
mw -= 1;
@ -1448,11 +1531,10 @@ void VSIeeol
}
savedTextPtr = savedTextBlock;
for (i = 0; i <= VSIw->lines; i++) {
savedTextPtr->lattr = VSIw->linest[i]->lattr;
if (VSIw->oldScrollback) {
savedTextPtr->lattr = VSIw->attrst[i]->lattr;
BlockMoveData(VSIw->attrst[i]->text, savedTextPtr->attr, (VSIw->allwidth + 1) * sizeof(VSAttrib));
} else {
savedTextPtr->lattr = VSIw->linest[i]->lattr;
BlockMoveData(VSIw->linest[i]->attr, savedTextPtr->attr, (VSIw->allwidth + 1) * sizeof(VSAttrib));
}
if (savedTextPtr->next) savedTextPtr = savedTextPtr->next;
@ -1467,11 +1549,10 @@ void VSIeeol
}
savedTextPtr = savedTextBlock;
for (i = 0; i <= VSIw->lines; i++) {
VSIw->linest[i]->lattr = savedTextPtr->lattr;
if (VSIw->oldScrollback) {
VSIw->attrst[i]->lattr = savedTextPtr->lattr;
BlockMoveData(savedTextPtr->attr, VSIw->attrst[i]->text, (VSIw->allwidth + 1) * sizeof(VSAttrib));
} else {
VSIw->linest[i]->lattr = savedTextPtr->lattr;
BlockMoveData(savedTextPtr->attr, VSIw->linest[i]->attr, (VSIw->allwidth + 1) * sizeof(VSAttrib));
}
if (savedTextPtr->next) savedTextPtr = savedTextPtr->next;
@ -1482,11 +1563,10 @@ void VSIeeol
VSIwrapnow(&x1, &y1);
y2 = y1;
/* clear out screen line */
//VSIw->linest[y1]->lattr = 0;
if (VSIw->oldScrollback) {
VSIw->attrst[y1]->lattr = 0;
ta = &VSIw->attrst[y1]->text[x1];
} else {
VSIw->linest[y1]->lattr = 0;
ta = &VSIw->linest[y1]->attr[x1];
}
tt = &VSIw->linest[y1]->text[x1];
@ -1496,8 +1576,10 @@ void VSIeeol
*tt++ = ' ';
}
/* update display */
if (!VSIclip(&x1, &y1, &x2, &y2, &n, &offset))
RSerase(VSIwn, x1, y1, x2, y2);
if (!VSIclip(&x1, &y1, &x2, &y2, &n, &offset)) {
//RSerase(VSIwn, x1, y1, x2, y2);
VSredraw(VSIwn, x1, y1, x2, y2);
}
} /* VSIeeol */
void VSIdelchars
@ -1528,12 +1610,11 @@ void VSIdelchars
if (x > VSIw->maxwidth)
x = VSIw->maxwidth;
lattr = VSIw->linest[y1]->lattr;
if (VSIw->oldScrollback) {
tempa = VSIw->attrst[y1]->text;
lattr = VSIw->attrst[y1]->lattr;
} else {
tempa = VSIw->linest[y1]->attr;
lattr = VSIw->linest[y1]->lattr;
}
temp = VSIw->linest[y1]->text;
for (i = x1; i <= VSIw->maxwidth - x; i++)
@ -1635,11 +1716,10 @@ void VSIebol
VSIwrapnow(&x2, &y1);
y2 = y1;
/* clear from beginning of line to cursor */
//VSIw->linest[y1]->lattr = 0;
if (VSIw->oldScrollback) {
//VSIw->attrst[y1]->lattr = 0;
ta = &VSIw->attrst[y1]->text[0];
} else {
//VSIw->attrst[y1]->lattr = 0;
ta = &VSIw->linest[y1]->attr[0];
}
tt = &VSIw->linest[y1]->text[0];
@ -1671,11 +1751,10 @@ void VSIel
x1 = 0;
}
/* clear out line */
//VSIw->linest[s]->lattr = 0;
if (VSIw->oldScrollback) {
//VSIw->attrst[s]->lattr = 0;
ta = &VSIw->attrst[s]->text[0];
} else {
//VSIw->linest[s]->lattr = 0;
ta = &VSIw->linest[s]->attr[0];
}
tt = &VSIw->linest[s]->text[0];
@ -1773,7 +1852,7 @@ void VSIrange
short wrap = (VSIw->DECAWM) ? 1 : 0;
short mw = VSIw->maxwidth;
if ((VSIw->lattrib & 3)) {
if (VSisdecdwh(VSIw->lattrib)) {
mw >>= 1;
if ( !(VSIw->maxwidth & 1) )
mw -= 1;
@ -1803,7 +1882,7 @@ void VTsendpos( void )
y = VSIw->y;
short mw = VSIw->maxwidth;
if ((VSIw->lattrib & 3)) {
if (VSisdecdwh(VSIw->lattrib)) {
mw >>= 1;
if ( !(VSIw->maxwidth & 1) )
mw -= 1;
@ -1872,7 +1951,12 @@ void VTsendstat( void )
void VTsendident( void )
{
if (screens[findbyVS(VSIwn)].vtemulation)
short sn = findbyVS(VSIwn);
if ( sn < 0 )
return;
if (screens[sn].vtemulation)
//RSsendstring(VSIwn, "\033[?62;1;6c", 10); // VT200-series
RSsendstring(VSIwn, "\033[?62;1;2;6;7;8c", 16); // VT200-series
else
@ -2014,7 +2098,8 @@ void VSItab //BUGG
void VSIinschar
(
short x /* number of blanks to insert */
short x, /* number of blanks to insert */
short clear
)
/* inserts the specified number of blank characters at the
current cursor position, moving the rest of the line along,
@ -2031,19 +2116,19 @@ void VSIinschar
else
tempa = VSIw->linest[VSIw->y]->attr;
temp = VSIw->linest[VSIw->y]->text;
for (i = VSIw->maxwidth - x; i >= VSIw->x; i--)
{
/* move along remaining characters on line */
for (i = VSIw->maxwidth - x; i >= VSIw->x; i--) {
/* move along remaining characters on line */
temp[x + i] =temp[i];
tempa[x + i] = tempa[i];
} /* for */
for (i = VSIw->x; i < VSIw->x + x; i++)
{
/* insert appropriate number of blanks */
temp[i] = ' ';
tempa[i] = VSIclrattrib;
} /* for */
} /* VSIinschar */
}
if ( clear ) {
for (i = VSIw->x; i < VSIw->x + x; i++) {
/* insert appropriate number of blanks */
temp[i] = ' ';
tempa[i] = VSIclrattrib;
}
}
} /* VSIinschar */
void VSIinsstring
(
@ -2077,7 +2162,7 @@ void VSIrestore
)
/* restores the last-saved cursor position and attribute settings. */
{
if (VSIw->Pattrib == 0xffff)
if (VSIw->Pattrib == 0xffffffff)
/* no previous save */
return;
@ -2086,7 +2171,9 @@ void VSIrestore
VSIw->x = VSIw->Px;
VSIw->y = VSIw->Py;
VSIrange();
VSIw->attrib = VSinattr(VSIw->Pattrib); /* hmm, this will clear the graphics character set selection */
// keep the graphics character set selection
VSIw->attrib &= kVSgrph;
VSIw->attrib |= VSIw->Pattrib;
} /* VSIrestore */
void VSIdraw

View File

@ -9,6 +9,10 @@ void VSIcurson(short w, short x, short y, short ForceMove);
void VSIcuroff(short w);
short VSIcursorenabled( void );
short VSIcursorvisible(void);
void VScursblink(short w);
void VScursblinkon(short w);
void VScursblinkoff(short w);
VSlineArray VSInewlinearray(short nrlines);
VSlinePtr VSInewlines(short nlines);
VSlinePtr VSOnewlines(short, short);
@ -50,7 +54,7 @@ void VTalign(void);
void VSIapclear(void);
void VSIsetoption(short toggle);
void VSItab(void);
void VSIinschar(short x);
void VSIinschar(short x, short clear);
void VSIinsstring(short len, char *start);
void VSIsave(void);
void VSIrestore(void);

View File

@ -93,48 +93,82 @@ extern unsigned char *VSIkplen; /* BYU 2.4.12 */
/*
* Definition of attribute bits in the Virtual Screen
*
* 0 - Bold
* 1 - faint
* 2 - italic
* 3 - Underline
* 4 - slowly Blinking
* 5 - rapidly Blinking
* 6 - Reverse
* 7 - Graphics character set
* 8 - bit 0 of ansi foreground color index
* 9 - bit 1 of ansi foreground color index
* 10 - bit 2 of ansi foreground color index
* 11 - use ansi foreground color
* 12 - bit 0 of ansi background color index
* 13 - bit 1 of ansi background color index
* 14 - bit 2 of ansi background color index
* 15 - use ansi background color
* 0 - 0x000001 - Bold
* 1 - 0x000002 - faint
* 2 - 0x000004 - italic
* 3 - 0x000008 - Underline
* 4 - 0x000010 - slowly Blinking
* 5 - 0x000020 - rapidly Blinking
* 6 - 0x000040 - Reverse
* 7 - 0x000080 - Graphics character set
* 8 - bit 0 of ansi foreground color index
* 9 - bit 1 of ansi foreground color index
* 10 - bit 2 of ansi foreground color index
* 11 - 0x000800 - use ansi foreground color
* 12 - bit 0 of ansi background color index
* 13 - bit 1 of ansi background color index
* 14 - bit 2 of ansi background color index
* 15 - 0x008000 - use ansi background color
* 16 - 0x010000 - use 2nd ansi foreground color
* 17 - 0x020000 - use 2nd ansi background color
* 18 - 0x040000 - has first character in high byte
*
* 8 higher bits: second character in multibyte mode
*/
/* character attributes */
#define VSa(x) (1 << ((x) - 1))
#define VSisbold(x) ((x) & 0x01)
#define VSisfaint(x) ((x) & 0x02)
#define VSisitalic(x) ((x) & 0x04)
#define VSisundl(x) ((x) & 0x08)
#define VSisblnk(x) ((x) & 0x10)
#define VSisfastblnk(x) ((x) & 0x20)
#define VSisrev(x) ((x) & 0x40)
#define VSisgrph(x) ((x) & 0x80)
#define VSisansifg(x) ((x) & 0x0800)
#define VSisansibg(x) ((x) & 0x08000)
#define VSisansi(x) ((x) & 0x08800)
#define VSisansifg2(x) ((x) & 0x10000)
#define VSisansibg2(x) ((x) & 0x20000)
//#define VSinattr(x) ((x) & 0xd9)
#define VSinattr(x) ((x) & 0xff)
#define kVSbold 0x000001
#define kVSfaint 0x000002
#define kVSitalic 0x000004
#define kVSundl 0x000008
#define kVSblnk 0x000010
#define kVSfastblnk 0x000020
#define kVSrev 0x000040
#define kVSgrph 0x000080
#define kVSansifg 0x000800
#define kVSansibg 0x008000
#define kVSansifg2 0x010000
#define kVSansibg2 0x020000
#define kVSansi2b 0x040000
// 4 bits unused, higher bit (i.e. 0x00800000) MUST be left to 0
#define VSgraph(x) ((x) | 0x80)
#define VSnotgraph(x) ((x) & 0x7F)
#define VSisbold(x) ((x) & kVSbold)
#define VSisfaint(x) ((x) & kVSfaint)
#define VSisitalic(x) ((x) & kVSitalic)
#define VSisundl(x) ((x) & kVSundl)
#define VSisblnk(x) ((x) & kVSblnk)
#define VSisfastblnk(x) ((x) & kVSfastblnk)
#define VSisrev(x) ((x) & kVSrev)
#define VSisgrph(x) ((x) & kVSgrph)
#define VSisansifg(x) ((x) & kVSansifg)
#define VSisansibg(x) ((x) & kVSansibg)
#define VSisansi(x) ((x) & (kVSansifg | kVSansibg))
#define VSisansifg2(x) ((x) & kVSansifg2)
#define VSisansibg2(x) ((x) & kVSansibg2)
#define VSisansi2b(x) ((x) & kVSansi2b)
#define VSansifg(x) ((x) | 0x00800)
#define VSansibg(x) ((x) | 0x08000)
#define VSansifg2(x) ((x) | 0x10800)
#define VSansibg2(x) ((x) | 0x28000)
#define VSgraph(x) ((x) | kVSgrph)
#define VSnotgraph(x) ((x) & ~kVSgrph)
#define VSansifg(x) ((x) | kVSansifg)
#define VSansibg(x) ((x) | kVSansibg)
#define VSansifg2(x) ((x) | (kVSansifg2 | kVSansifg))
#define VSansibg2(x) ((x) | (kVSansibg2 | kVSansibg))
#define VSansi2b(x) ((x) | kVSansi2b)
/* line attributes */
#define kVSdecdhlt 0x0001
#define kVSdecdhlb 0x0002
#define kVSwrap 0x0004
#define VSisdecdhlt(x) (((x) & kVSdecdhlt) && !((x) & kVSdecdhlb))
#define VSisdecdhlb(x) (((x) & kVSdecdhlb) && !((x) & kVSdecdhlt))
#define VSisdecdwl(x) (((x) & (kVSdecdhlt|kVSdecdhlb)) == (kVSdecdhlt|kVSdecdhlb))
#define VSisdecdwh(x) (((x) & (kVSdecdhlt|kVSdecdhlb)) && !VSisdecdwl(x))
//#define VSisdecdw(x) (((x) & (kVSdecdhlt|kVSdecdhlb)))
#define VSiswrap(x) ((x) & kVSwrap)
#endif

View File

@ -6,6 +6,7 @@
#define __WIND__
#include <pthread.h>
#include <TextEncodingConverter.h>
#define MAXKB 256 // BYU mod
@ -48,7 +49,8 @@ short
vtemulation, // 0 = VT100, 1 = VT 220
bsdel, // backspace or delete is default
eightbit, // eight bit font displayed (false is seven bit display
national, // LU/MP: translation table to use for this connection
innational, // translation table to use for this connection for input
outnational, // translation table to use for this connection for output
arrowmap, // MAT: should we allow the arrow keys to be mapped??
showErrors, // show ALL errors if this is set
pgupdwn, // JMB/MAT: should we have page up/down do local window movement?
@ -249,6 +251,18 @@ short
remoteport;
char
remotehost[180];
short
incharset, // current translation state for multi-byte translation
outcharset, // current translation state for multi-byte translation
troutcount;
unsigned char
troutbuf[16]; // chars pending in translation
TECObjectRef
fromconverter,
toconverter;
/* NONO */

View File

@ -209,7 +209,7 @@ short confile( char *s)
break;
case 2: /* HOST */
strncpy(tempCstring, s, 63); /* Move name in */
strncpy(tempCstring, s, sizeof(SetSessionPtr->hostname) - 1); /* Move name in */
CtoPstr(tempCstring);
// Process the hosname string.
@ -375,9 +375,11 @@ short confile( char *s)
TelInfo->CONFstate = 0;
break;
case 26: /* Font Name */
strncpy(tempCstring, s, 63); /* Move name in */
CtoPstr(tempCstring);
BlockMoveData(tempCstring, &(SetTerminalPtr->DisplayFont[0]), tempCstring[0]+1);
// strncpy(tempCstring, s, 63); /* Move name in */
// CtoPstr(tempCstring);
// BlockMoveData(tempCstring, &(SetTerminalPtr->DisplayFont[0]), tempCstring[0]+1);
strncpy((char *) SetTerminalPtr->DisplayFont, s, sizeof(SetTerminalPtr->DisplayFont) - 1);
CtoPstr((char *) SetTerminalPtr->DisplayFont);
TelInfo->CONFstate = 0;
break;
case 27: /* Font Size */
@ -439,7 +441,7 @@ short confile( char *s)
TelInfo->CONFstate = 0; /* NCSA */
break; /* NCSA */
case 38: // translation
strncpy((char *) SetSessionPtr->TranslationTable, s, 32);
strncpy((char *) SetSessionPtr->TranslationTable, s, sizeof(SetSessionPtr->TranslationTable) - 1);
CtoPstr((char *) SetSessionPtr->TranslationTable);
TelInfo->CONFstate=0;
break;
@ -449,7 +451,7 @@ short confile( char *s)
TelInfo->CONFstate=0;
break;
case 40: // answerback
strncpy((char *) SetTerminalPtr->AnswerBackMessage, s, 32);
strncpy((char *) SetTerminalPtr->AnswerBackMessage, s, sizeof(SetTerminalPtr->AnswerBackMessage) - 1);
CtoPstr((char *) SetTerminalPtr->AnswerBackMessage);
TelInfo->CONFstate=0;
break;
@ -573,9 +575,11 @@ short confile( char *s)
TelInfo->CONFstate=0;
break;
case 63: // boldfont
strncpy(tempCstring, s, 63); /* Move name in */
CtoPstr(tempCstring);
BlockMoveData(tempCstring, &(SetTerminalPtr->BoldFont[0]), tempCstring[0]+1);
//strncpy(tempCstring, s, 63); /* Move name in */
//CtoPstr(tempCstring);
//BlockMoveData(tempCstring, &(SetTerminalPtr->BoldFont[0]), tempCstring[0]+1);
strncpy((char *) SetTerminalPtr->BoldFont, s, sizeof(SetTerminalPtr->BoldFont) - 1);
CtoPstr((char *) SetTerminalPtr->BoldFont);
TelInfo->CONFstate = 0;
break;
case 64: // inversebold
@ -604,9 +608,11 @@ short confile( char *s)
TelInfo->CONFstate = 0;
break;
case 69: // otppassword
strncpy(tempCstring, s, 63); /* Move name in */
CtoPstr(tempCstring);
BlockMoveData(tempCstring, &(SetSessionPtr->otppassword[0]), tempCstring[0]+1);
//strncpy(tempCstring, s, 63); /* Move name in */
//CtoPstr(tempCstring);
//BlockMoveData(tempCstring, &(SetSessionPtr->otppassword[0]), tempCstring[0]+1);
strncpy((char *) SetSessionPtr->otppassword, s, sizeof(SetSessionPtr->otppassword) - 1);
CtoPstr((char *) SetSessionPtr->otppassword);
TelInfo->CONFstate = 0;
break;
case 70: // realbold
@ -904,7 +910,7 @@ void SaveSet(short doSaveMacros, short dontSaveTitle)
Rect rect;
Point where;
long junk;
char temp[256], temp2[256]; /* BYU LSC */
char temp[256], temp2[300]; /* BYU LSC */
short fnum,fsiz;
short i;
FSSpec set;
@ -1115,9 +1121,9 @@ void SaveSet(short doSaveMacros, short dontSaveTitle)
CStringToFile(fn, (unsigned char *)temp2);
}
// if (screens[i].national) { // Don't do this if using default translation table
// if (screens[i].outnational) { // Don't do this if using default translation table
// TranslationTable
GetMenuItemText(myMenus[National], screens[i].national+1, scratchPstring);
GetMenuItemText(myMenus[National], screens[i].outnational+1, scratchPstring);
//pstrcpy(scratchPstring, (unsigned char *)TranslationTable);
PtoCstr(scratchPstring);
sprintf(temp2, "translation= \"%s\"\015", scratchPstring);
@ -1229,7 +1235,7 @@ void SaveSetFromSession(SessionPrefs* setSession, TerminalPrefs* setTerminal, sh
Rect rect;
Point where;
long junk;
char temp[256], temp2[256]; /* BYU LSC */
char temp[256], temp2[300]; /* BYU LSC */
short fnum,fsiz, i;
FSSpec set;
OSErr err;

View File

@ -553,6 +553,100 @@ OSErr OpenHelperWithURL (OSType sig, char *url)
}
#define isurlschemechar(c) (isalnum((c)) || c == '+' || c == '.' || c == '-')
/*
* FindURLAroundPoint
*
* called by RSSelect when Command Click has occured outside any selection.
* This routine looks for urls around the current point, makes that the selected area if
* it finds one, and returns TRUE. Otherwise leaves the current selection area untouched
* and returns FALSE.
*/
Boolean FindURLAroundPoint(Point curr, short w)
{
Boolean found;
short columns;
short blockSize;
Handle lblock;
Handle rblock;
Point topleft;
Point botright;
short lblockSize;
short rblockSize;
char *p, *q, cp, cq;
found = FALSE;
columns = VSgetcols(w) + 1; // VSgetcols returns one less than the number of columns
if ( curr.h < 0 )
curr.h = 0;
if ( curr.h >= columns )
curr.h = columns - 1;
topleft.h = curr.h - 255;
topleft.v = curr.v;
while ( topleft.h < 0 ) {
topleft.h += columns;
--topleft.v;
}
blockSize = 255 + (curr.v - topleft.v) + 1;
lblock = myNewHandle(blockSize);
HLock(lblock);
lblockSize = VSgettext(w, topleft.h, topleft.v, curr.h, curr.v, *lblock, blockSize, "\015", 0, 0);
botright.h = curr.h + 255;
botright.v = curr.v;
while ( botright.h >= columns ) {
botright.h -= columns;
++botright.v;
}
blockSize = 255 + (botright.v - curr.v) + 1;
rblock = myNewHandle(blockSize);
HLock(rblock);
rblockSize = VSgettext(w, curr.h, curr.v, botright.h, botright.v, *rblock, blockSize, "\015", 0, 0);
blockSize = lblockSize + rblockSize;
HUnlock(lblock);
SetHandleSize(lblock, blockSize);
HLock(lblock);
BlockMoveData( *rblock, *lblock + lblockSize, rblockSize );
DisposeHandle(rblock);
p = *lblock + lblockSize;
if ( !isLWSPorCR(*p) ) {
topleft.h = curr.h;
topleft.v = curr.v;
while ( p > *lblock && *p != '<' && !isLWSPorCR(p[-1]) && p[-1] != '"') {
--p;
if ( --topleft.h < 0 ) {
topleft.h += columns;
--topleft.v;
}
}
q = *lblock + lblockSize; // check first char of second block
botright.h = curr.h + 1;
botright.v = curr.v;
while ( q < *lblock + blockSize && *q != '>' && !isLWSPorCR(q[1]) && q[1] != '"' ) {
++q;
if ( ++botright.h >= columns ) {
botright.h -= columns;
++botright.v;
}
}
if ( q < *lblock + blockSize ) {
if (p < q && q - p < 256 && ((*p == '<' && *q == '>') || (*p != '<' && *q != '>'))) {
// found something
HiliteThis(w, topleft, botright);
found = TRUE;
}
}
}
DisposeHandle(lblock);
return found;
}
#if 0
Boolean FindURLAroundPoint(Point curr, short w)
{
/* called by RSSelect when Command Click has occured outside any selection.
@ -564,7 +658,6 @@ Boolean FindURLAroundPoint(Point curr, short w)
Handle block;
char *original, *start, *end, *textEnd, *p, *q;
short i, numLines = 1;
char EOLS = CR;
short neededLines, endLine = 0, startLine = 0;
short blockSize;
Point startPoint, endPoint;
@ -606,7 +699,7 @@ Boolean FindURLAroundPoint(Point curr, short w)
textEnd = *block + blockSize;
/* get the lines we need */
VSgettext(w, 0, firstLine, columns-1, lastLine, *block, blockSize, &EOLS, 0);
VSgettext(w, 0, firstLine, columns-1, lastLine, *block, blockSize, "\015", 0, 0);
original = *block;
// RJZ 12/12/97. Fixed so that after
@ -750,3 +843,5 @@ Boolean FindURLAroundPoint(Point curr, short w)
DisposeHandle(block);
return TRUE;
}
#endif

View File

@ -34,6 +34,7 @@
#include "sshglue.proto.h"
#include "errors.proto.h"
#include "macros.proto.h"
#include "translate.proto.h"
/* ssh2.c */
extern void clearcachedpassphrase();
@ -1838,13 +1839,7 @@ Boolean EditSession(StringPtr PrefRecordNamePtr)
UseResFile(TelInfo->ApplicationFile);
SPopup[1].h = NewMenu(667, "\p");
numberOfTerms = CountResources(USER_TRSL);
currentHead = createSortedList2(USER_TRSL,numberOfTerms,NULL);
GetIndString(scratchPstring,MISC_STRINGS,NONE_STRING); //"None" string
AppendMenu(SPopup[1].h,scratchPstring);
addListToMenu/*3*/(SPopup[1].h, currentHead, 2);
EnableItem(SPopup[1].h, 0); // Make sure the entire menu is enabled
deleteList(&currentHead);
BuildTranslateMenu(SPopup[1].h);
UseResFile(TelInfo->SettingsFile);
currentHead = savedList;
@ -1857,9 +1852,8 @@ Boolean EditSession(StringPtr PrefRecordNamePtr)
if (IsDefaultLabel(PrefRecordNamePtr)) {
HideDialogItem(dptr, SessAlias);
HideDialogItem(dptr, SessAliasStatText);
}
}
else {
} else {
SessPrefsHdl = GetDefaultSession();
IsNewPrefRecord = TRUE;
GetIndString(PrefRecordNamePtr, MISC_STRINGS, MISC_NEWSESSION);

View File

@ -459,6 +459,8 @@ WindowPtr GetNewMyDialog(short template,Ptr wStorage,WindowPtr behind,
win = GetNewDialog(template, wStorage, behind);
if (win==nil) return(nil);
SetPort(win);
TextFont(systemFont);
TextSize(12);
/* win->contR = ((GrafPtr)win)->portRect; */
/* win->qWindow.refCon = CREATOR; */
return(win);

View File

@ -29,17 +29,20 @@ void InitDebug(void)
Rect pRect;
TerminalPrefs **termHdl;
Boolean scratchBoolean;
unsigned long flags;
console = (WindRec *) myNewPtr(sizeof(WindRec));
console->vs = -1;
// SetRect(&pRect, 50, 150, 700, 350); // Need to make this a resource!
SetRect(&pRect, 50, 150, 0, 0);
/*
console->vs=RSnewwindow( &pRect, 350, 80, 24,
"\p<console>", 1, DefFONT, DefSIZE, TelInfo->debug,0,0,0,0,0,1, DefFONT, DefSIZE, 0, 0, 1, 0, 0);
*/
console->vs=RSnewwindow( &pRect, 2000, 80, 24,
"\p<console>", 1, DefFONT, DefSIZE, TelInfo->debug,0,0,0,0,0,1, DefFONT, DefSIZE, 0, 0, 1, 0, 0); /* NCSA 2.5 */
flags = RSWwrapon | RSWgoaway | RSWignoreBeeps | RSWsavelines;
if (TelInfo->debug)
flags |= RSWshowit;
console->vs=RSnewwindow( &pRect, 2000, 80, 24, "\p<console>", DefFONT, DefSIZE, 0,
DefFONT, DefSIZE, 0, 0, flags);
console->wind = RSgetwindow( console->vs);
((WindowPeek)console->wind)->windowKind = WIN_CONSOLE;
@ -48,7 +51,10 @@ void InitDebug(void)
console->active=0;
console->port=-1;
console->termstate=VTEKTYPE;
console->national = 0; /* LU: no translation */
console->innational = 0; /* LU: no translation */
console->incharset = -1;
console->outnational = 0;
console->outcharset = -1;
UseResFile(TelInfo->SettingsFile);
termHdl = (TerminalPrefs **)Get1NamedSizedResource
(TERMINALPREFS_RESTYPE, "\p<Default>", sizeof(TerminalPrefs));
@ -87,8 +93,8 @@ void putlln( char *cp, short len )
char buf[256];
short temp;
size = VSgetcols(console->vs) + 1;
while (len > 0) {
size = VSgetcols(console->vs) + 1;
while ( size > 0 && len > 0 ) {
short inlen = 0;
short outlen = 0;
temp = len;

View File

@ -61,6 +61,8 @@ extern char *getprefsd(char *name, char * buf, size_t size, short *vRefNum, long
//extern char *tempspot; /* for temp storage only */
Boolean gInitialized = 0;
extern Cursor *theCursors[];
extern WindRec
@ -111,15 +113,20 @@ void initftplog( void)
TerminalPrefs **termHdl;
Boolean scratchBoolean;
Str255 tempString;
unsigned long flags;
SetRect(&prect, 300,256,512,384);
ftplog = (WindRec *) myNewPtr(sizeof(WindRec));
GetIndString(tempString,MISC_STRINGS,FTP_LOG_STRING);
ftplog->vs=RSnewwindow( &prect, 50, 80, 24,
tempString, 1, DefFONT, DefSIZE, gFTPServerPrefs->ShowFTPlog,
1,0,0,0,0,1, DefFONT, DefSIZE, 0, 0, 1, 0, 0); /* NCSA 2.5 */
flags = RSWwrapon | RSWgoaway | RSWignoreBeeps | RSWsavelines;
if (gFTPServerPrefs->ShowFTPlog)
flags |= RSWshowit;
ftplog->vs=RSnewwindow( &prect, 50, 80, 24, tempString, DefFONT, DefSIZE, 0,
DefFONT, DefSIZE, 0, 0, flags);
ftplog->wind = RSgetwindow( ftplog->vs);
((WindowPeek)ftplog->wind)->windowKind = WIN_LOG;
@ -521,4 +528,5 @@ void init (void)
}
loadWDEF(); //this just loads the WDEF code in so that it doesnt fragment the heap later
loadErrors(); //ditto for the error code
gInitialized = true;
}

View File

@ -29,9 +29,13 @@
#include "vsinterf.proto.h"
#include "macros.proto.h"
#include "netevent.proto.h"
#include "Sets.proto.h" //for CStringToFile
#include "movableModal.h"
#include "PasswordDialog.h"
extern void ssh2_sched();
/* Macro Defines */
#define MACRO_IP 0xff /* Send IP number here */
@ -379,6 +383,9 @@ short sendmacro(struct WindRec *tw, short n) /* send macro number n */
unsigned char myipnum[4];
Handle mh, ph;
short i, num, pos, escape, length;
char *plabel;
Str255 password;
unsigned long startTicks;
// Invalid number
if (n < 0 || n >= NUM_MACROS) {
@ -402,7 +409,7 @@ short sendmacro(struct WindRec *tw, short n) /* send macro number n */
s = (unsigned char *)*mh;
ph = myNewHandle(GetHandleSize(mh));
ph = myNewHandle(GetHandleSize(mh) + 256);
if (!ph) return 0; // ouch
HLock(ph);
first = p = (unsigned char *)*ph;
@ -417,8 +424,7 @@ short sendmacro(struct WindRec *tw, short n) /* send macro number n */
escape = 0;
while ( *s) {
if (((!(*s >= '0' && *s <= '9')) && pos && escape) ||
(escape && (pos >= 3))) {
if (escape == 1 && (((*s < '0' || *s > '9') && pos) || pos >= 3)) {
// do this ONCE -
// it's a kludge to do this in each case
*p++=num;
@ -426,20 +432,20 @@ short sendmacro(struct WindRec *tw, short n) /* send macro number n */
escape = 0;
// now the rest of the code will take care of whatever char this was
}
if (escape) {
if (escape == 1) {
escape = 0;
switch (*s) {
case 'i':
SendStringAsIfTyped(tw, (char *)first, p-first);
sprintf(temp,"%d.%d.%d.%d", myipnum[0], myipnum[1], myipnum[2], myipnum[3]);
SendStringAsIfTyped(tw, temp, strlen(temp));
first = p;
first = p = (unsigned char *)*ph;
break;
case '#':
SendStringAsIfTyped(tw, (char *)first, p-first);
sprintf(temp,"%d", VSgetlines(tw->vs));
SendStringAsIfTyped(tw, temp, strlen(temp));
first = p;
first = p = (unsigned char *)*ph;
break;
case 'n':
*p++='\012';
@ -456,6 +462,9 @@ short sendmacro(struct WindRec *tw, short n) /* send macro number n */
case '\\':
*p++='\\';
break;
case 'k':
escape = 2;
break;
default:
if (*s <='9' && *s >='0' && pos <3) {
num= num*8+( *s -'0');
@ -475,8 +484,37 @@ short sendmacro(struct WindRec *tw, short n) /* send macro number n */
}
break;
}
} else if (escape == 2) {
if (*s == '{') {
escape = 3;
plabel = NULL;
} else {
escape = 0;
}
else {
} else if (escape == 3) {
if (*s != '}') {
if ( plabel == NULL )
plabel = s;
} else {
*s = 0;
if (plabel && SSH2PasswordDialog(plabel, password)) {
SendStringAsIfTyped(tw, (char *)first, p-first);
// better wait for echo off...
startTicks = TickCount();
while (TickCount() - startTicks < 30) {
ssh2_sched();
DoNetEvents();
}
first = p = (unsigned char *)*ph;
SendStringAsIfTyped(tw, (char *)password + 1, password[0]);
} else {
// malformed macro, or pasword cancel
first = p = (unsigned char *)*ph;
break;
}
escape = 0;
}
} else {
if (*s=='\\') {
num=0;
pos=0;

View File

@ -37,6 +37,7 @@
#include "prefs.proto.h"
#include "popup.h"
#include "popup.proto.h"
#include "translate.proto.h"
#include "Connections.proto.h"
#include "tnae.h"
@ -56,6 +57,7 @@ extern Cursor *theCursors[NUMCURS]; /* all the cursors in a nice bundle */
extern WindRec *screens;
extern short scrn;
extern short nNational; // Number of user-installed translation tables
extern short gTableCount;
extern MenuHandle myMenus[];
extern Boolean authOK;
extern Boolean encryptOK;
@ -100,6 +102,10 @@ void OpenPortSpecial(MenuHandle menuh, short item)
success = CreateConnectionFromParams(theParams);
}
static Boolean startautocomplete = false;
static Boolean doneautocomplete = false;
static unsigned long autoTicks;
SIMPLE_UPP(POCdlogfilter, ModalFilter);
pascal short POCdlogfilter( DialogPtr dptr, EventRecord *evt, short *item)
{
@ -143,28 +149,42 @@ pascal short POCdlogfilter( DialogPtr dptr, EventRecord *evt, short *item)
// return(PopupMousedown(dptr, evt, item));
/* NONO */
/*
if ( gApplicationPrefs->parseAliases ) {
editField = ((DialogPeek)dptr)->editField + 1;
if ( editField == NChostname ) {
GetTEText(dptr, NChostname, scratch1Pstring);
GetTEText(dptr, editField, scratch1Pstring);
}
}
*/
/* NONO */
// RAB BetterTelnet 1.2 - we let StdFilterProc handle this now
// return(DLOGwOK_Cancel(dptr, evt, item));
result = CallStdFilterProc(dptr, evt, item);
/* NONO */
/*
if ( gApplicationPrefs->parseAliases ) {
if ( editField == NChostname && (evt->what == keyDown || evt->what == autoKey) ) {
GetTEText(dptr, NChostname, scratch2Pstring);
GetTEText(dptr, editField, scratch2Pstring);
if (memcmp(scratch1Pstring, scratch2Pstring, scratch1Pstring[0] + 1)) {
*item = NChostname;
result = true;
// host name changed
//*item = editField;
//result = true;
autoTicks = LMGetTicks();
startautocomplete = true;
}
}
}
*/
if ( startautocomplete && LMGetTicks() - autoTicks >= 30 ) {
startautocomplete = false;
doneautocomplete = true;
*item = NChostname;
result = -1;
}
/* NONO */
return result;
@ -232,6 +252,7 @@ Boolean PresentOpenConnectionDialog(void)
short ditem, scratchshort, mystrpos;
Boolean success;
long scratchlong;
Str255 hostString;
Str255 scratchPstring, terminalPopupString, scritchPstring;
Handle ItemHandle;
SessionPrefs **tempSessHdl;
@ -316,6 +337,8 @@ Boolean PresentOpenConnectionDialog(void)
BlockMoveData("\p<Default>", scratchPstring, 15);
SetCurrentSession(dptr, scratchPstring);
GetTEText(dptr, NChostname, hostString);
// TerminalIndex = findPopupMenuItem(TermPopupHdl,(**defaultSessHdl).TerminalEmulation);
// TPopup[0].choice = TerminalIndex;
// PopupInit(dptr, TPopup);
@ -326,7 +349,10 @@ Boolean PresentOpenConnectionDialog(void)
ShowWindow(dptr);
while (ditem > NCcancel) {
startautocomplete = false;
doneautocomplete = false;
while (ditem != NCconnect && ditem != NCcancel) {
movableModalDialog(POCdlogfilterUPP, &ditem);
switch(ditem)
{
@ -347,16 +373,25 @@ Boolean PresentOpenConnectionDialog(void)
case NChostname:
if ( gApplicationPrefs->parseAliases ) {
// check if the string matches a favorite name
typedHost = true;
GetTEText(dptr, NChostname, scratchPstring);
scratchshort = FindMenuItemText(SessPopupHdl, scratchPstring);
if ( scratchshort && sessMark != scratchshort ) {
SetItemMark(SessPopupHdl, sessMark, 0);
sessMark = scratchshort;
SetItemMark(SessPopupHdl, sessMark, 18);
GetMenuItemText(SessPopupHdl, scratchshort, scratchPstring);
SetCurrentSession(dptr, scratchPstring);
if (memcmp(scratchPstring, hostString, scratchPstring[0] + 1)) {
// host name changed
autoTicks = LMGetTicks();
startautocomplete = true;
pstrcpy(hostString, scratchPstring);
}
if ( !startautocomplete && doneautocomplete ) {
doneautocomplete = false;
// check if the string matches a favorite name
scratchshort = FindMenuItemText(SessPopupHdl, scratchPstring);
if ( scratchshort /*&& sessMark != scratchshort*/ ) {
SetItemMark(SessPopupHdl, sessMark, 0);
sessMark = scratchshort;
SetItemMark(SessPopupHdl, sessMark, 18);
GetMenuItemText(SessPopupHdl, scratchshort, scratchPstring);
SetCurrentSession(dptr, scratchPstring);
}
}
}
break;
@ -599,6 +634,7 @@ Boolean CreateConnectionFromParams( ConnInitParams **Params)
Boolean scratchBoolean;
WindRec *theScreen;
unsigned char *hostname;
unsigned long flags;
setLastCursor(theCursors[watchcurs]); /* We may be here a bit */
@ -806,17 +842,35 @@ Boolean CreateConnectionFromParams( ConnInitParams **Params)
return(FALSE);
}
GetFNum(TermPtr->DisplayFont, &fontnumber);
GetFNum(TermPtr->BoldFont, &otherfnum);
theScreen->vs = RSnewwindow(&((**Params).WindowLocation),TermPtr->numbkscroll, TermPtr->vtwidth,
TermPtr->vtheight, (**Params).WindowName, TermPtr->vtwrap,
fontnumber, TermPtr->fontsize, 0,
1, SessPtr->forcesave,cur, TermPtr->allowBold, TermPtr->colorBold,
SessPtr->ignoreBeeps, otherfnum, TermPtr->boldFontSize, TermPtr->boldFontStyle,
TermPtr->realbold, TermPtr->oldScrollback, TermPtr->jumpScroll,
TermPtr->realBlink);
flags = 0;
if (TermPtr->vtwrap)
flags |= RSWwrapon;
/*flags |= RSWshowit;*/
flags |= RSWgoaway;
if (SessPtr->forcesave)
flags |= RSWforcesave;
if (TermPtr->allowBold)
flags |= RSWallowBold;
if (TermPtr->colorBold)
flags |= RSWcolorBold;
if (SessPtr->ignoreBeeps)
flags |= RSWignoreBeeps;
if (TermPtr->realbold)
flags |= RSWrealbold;
if (TermPtr->oldScrollback)
flags |= RSWsavelines;
if (TermPtr->jumpScroll)
flags |= RSWjumpscroll;
if (TermPtr->realBlink)
flags |= RSWrealBlink;
theScreen->vs = RSnewwindow(&((**Params).WindowLocation), TermPtr->numbkscroll, TermPtr->vtwidth,
TermPtr->vtheight, (**Params).WindowName, fontnumber,
TermPtr->fontsize, cur, otherfnum, TermPtr->boldFontSize,
TermPtr->boldFontStyle, TermPtr->vtemulation, flags);
if (theScreen->vs <0 ) { /* we have a problem opening up the virtual screen */
OutOfMemory(1011);
@ -876,16 +930,23 @@ Boolean CreateConnectionFromParams( ConnInitParams **Params)
theScreen->termstate=VTEKTYPE; /* BYU */
theScreen->echo = 1;
theScreen->halfdup = SessPtr->halfdup; /* BYU */
theScreen->national = 0; // Default to no translation.
theScreen->innational = 0; // Default to no translation.
theScreen->outnational = 0; // Default to no translation.
theScreen->incharset = 0;
theScreen->outcharset = 0;
theScreen->toconverter = NULL;
theScreen->fromconverter = NULL;
// Now see if the desired translation is available, if not use default translation.
for(scratchshort = 1; scratchshort <= nNational+1; scratchshort++) {
for (scratchshort = 1; scratchshort <= nNational+1; scratchshort++) {
GetMenuItemText(myMenus[National], scratchshort, scratchPstring);
if (EqualString(SessPtr->TranslationTable, scratchPstring, TRUE, FALSE))
theScreen->national = scratchshort-1;
if (EqualString(SessPtr->TranslationTable, scratchPstring, TRUE, FALSE)) {
theScreen->innational = theScreen->outnational = scratchshort - 1;
break;
}
}
inittranslation(theScreen);
// Set up paste related variables
theScreen->incount = 0;
theScreen->outcount = 0;
@ -1263,7 +1324,9 @@ void destroyport(short wind)
auth_encrypt_end((tnParams **)&tw->aedata);
DisposePtr((Ptr)tw->aedata);
}
disposetranslation(tw);
/*
* Get handle to the WDEF patch block, kill the window, and then
* release the handle.
@ -1325,9 +1388,9 @@ void removeport(WindRecPtr tw)
DestroyTickets();
if (!gApplicationPrefs->WindowsDontGoAway) {
short vs = findbyVS(tw->vs);
if ( vs > -1 ) {
destroyport(vs);
short sn = findbyVS(tw->vs);
if ( sn >= 0 ) {
destroyport(sn);
}
} else {
Str255 temp;

View File

@ -27,6 +27,7 @@
#include "VSkeys.h"
#include "wind.h"
#include "translate.h"
#include "event.h" //kxplate moved to its own file (CCP 2.7)
#include "errors.proto.h"
#include "network.proto.h"
@ -36,6 +37,7 @@
#include "InternalEvents.h"
#include "vsdata.h"
#include "vsinterf.proto.h"
#include "vsintern.proto.h"
#include "menuseg.proto.h"
#include "vrrgmac.proto.h"
#include "tekrgmac.proto.h"
@ -69,6 +71,9 @@ extern int gMovableModal;
#include "event.proto.h"
extern void syslog( int priority, const char *format, ...);
extern long dumpln( long base, char *dest, void *src, long len );
// BetterTelnet 2.0fc1 - integrated DJ's changes for real blink (if you want it :-)
/* DJ: Blink global */
short gBlink = 0;
@ -330,33 +335,33 @@ Boolean CheckPageKeys(short code) /* NCSA: SB */
switch (code) /* NCSA: SB */
{ /* NCSA: SB */
case VSPGUP: /* NCSA: SB */
RScursblinkoff(ourW);
VScursblinkoff(ourW);
VSgetrgn(ourW, &x1, &y1, &x2, &y2); // MAT--
VSscrolback(ourW, y2 - y1); /* scroll a whole windowful */ // MAT--
RScursblinkon(ourW);
VScursblinkon(ourW);
return TRUE; // MAT--
break; /* NCSA: SB */
/* NCSA: SB */
case VSPGDN: // MAT--121 is a PAGE DOWN.
RScursblinkoff(ourW); // MAT--in rsmac.c
VScursblinkoff(ourW); // MAT--in rsmac.c
VSgetrgn(ourW, &x1, &y1, &x2, &y2); // MAT--
VSscrolforward(ourW, y2 - y1); /* scroll a whole windowful */ // MAT--
RScursblinkon(ourW);
VScursblinkon(ourW);
return TRUE; // MAT--
break; /* NCSA: SB */
// MAT--
case VSHOME: /* NCSA: SB */
RScursblinkoff(ourW);
VScursblinkoff(ourW);
VSscroltop(ourW); /* JMB 2.6 -- Created VSscroltop just for this purpose */
RScursblinkon(ourW);
VScursblinkon(ourW);
return TRUE; /* NCSA: SB */
break; // MAT--
// MAT--
case VSEND: /* NCSA: SB */
RScursblinkoff(ourW);
VScursblinkoff(ourW);
VSgetrgn(ourW, &x1, &y1, &x2, &y2); // MAT--
VSscrolforward(ourW, 32765); /* scroll a whole BUNCH! */ // MAT-- kludge time again. anyone suggest
RScursblinkon(ourW);
VScursblinkon(ourW);
return TRUE; /* NCSA: SB */
break; // MAT-- a better way to hack this part?
} // MAT--
@ -365,10 +370,13 @@ Boolean CheckPageKeys(short code) /* NCSA: SB */
} /* NCSA: SB */
/* translatekey --
returns ascii code for input code, using the input modifiers. */
/*
* translatekeycode
*
* returns ascii code for input code, using the input modifiers.
*/
static unsigned char translatekey(unsigned char code, long modifiers)
static unsigned char translatekeycode(unsigned char code, long modifiers)
{
Ptr KCHRPtr;
unsigned long state = 0;
@ -387,12 +395,17 @@ static unsigned char translatekey(unsigned char code, long modifiers)
void HandleKeyDown(EventRecord theEvent,struct WindRec *tw)
{
unsigned char ascii, code;
unsigned char sendch;
long menuEquiv;
short enterkey = 0;
Boolean commanddown, optiondown, controldown,shifted;
ObscureCursor();
unsigned char ascii, code;
unsigned char sendch;
long menuEquiv;
short enterkey = 0;
Boolean commanddown, optiondown, controldown,shifted;
unsigned char trbuf[32];
unsigned char *pbuf;
long inlen;
long trlen;
int res;
int i;
ascii = theEvent.message & charCodeMask;
code = ((theEvent.message & keyCodeMask) >> 8);
@ -404,59 +417,26 @@ void HandleKeyDown(EventRecord theEvent,struct WindRec *tw)
if (DebugKeys(commanddown, ascii, tw->vs))
return;
/* NONO : looks like this attempt is more a bug than a fix, and
a goto is maybe not very clean, but in such a code anyway...
ObscureCursor();
// RAB BetterTelnet 2.0b4 - ha ha, no hack hack
// fixed emacs metakey so it works for special keys
// (and got rid of the goto kludge while I was at it)
if ((tw->emacsmeta == 2)&&(optiondown)) {
char temp = ESC;
if ((TelInfo->numwindows < 1) || (tw->active != CNXN_ACTIVE))
return;
optiondown = 0; // pretend we didn't see option
// NONO : was wrong !
//theEvent.modifiers &= (!optionKey);//since we have a valid ASCII anyway from the KCHR
theEvent.modifiers &= ~optionKey;//since we have a valid ASCII anyway from the KCHR
// NONO
// now we fix a couple of broken items in the emacs KCHR
if (code == 0x31) ascii = 32; // space fix
if ((code == 0x32) && !shifted) ascii = 0x60; // backquote fix
if ((code == 0x1B) && shifted) ascii = 0x5F; // underline fix
if (tw->kblen > 0)
{
netwrite( tw->port,tw->kbbuf,tw->kblen);
tw->kblen=0;
}
netpush(tw->port);
netwrite(tw->port, &temp, 1); // send an escape, and deal with the char itself below
}
// goto emacsHack; //ha ha hack hack
*/
if ( tw->emacsmeta == 2 && optiondown ) {
/* option key as emacs meta key: keep shift and control translation */
ascii = translatekey( code, (theEvent.modifiers & (shiftKey|controlKey)) );
goto emacsHack; //ha ha hack hack
// option key as emacs meta key: keep shift and control translation
ascii = translatekeycode( code, (theEvent.modifiers & (shiftKey|controlKey)) );
goto emacsHack;
}
/* NONO */
if ((code == 0x34)&&(ascii == 3)) //fix for PowerBook 540 bad KCHR
ascii = 13; //(map control-c to return)
else if ((controldown)&&(shifted)&&(ascii == '2'))
ascii = 0;//fix bad KCHR control-@
else if ((controldown)&&(shifted)&&(ascii == '6'))
ascii = 0x1e;//fix bad KCHR control-^
if ( code == 0x34 && ascii == 3 ) // fix for PowerBook 540 bad KCHR
ascii = 13; // (map control-c to return)
else if ( controldown && shifted && ascii == '2' )
ascii = 0; // fix bad KCHR control-@
else if ( controldown && shifted && ascii == '6' )
ascii = 0x1e; // fix bad KCHR control-^
if (commanddown) {
if ( commanddown ) {
if (gApplicationPrefs->CommandKeys) {
//if optioned, retranslate so we can do menu commands
if ( optiondown ) {
ascii = translatekey( code, (theEvent.modifiers & shiftKey) );
ascii = translatekeycode( code, (theEvent.modifiers & shiftKey) );
}
menuEquiv = MenuKey(ascii); //handle menu keys first
if ( (menuEquiv & 0xFFFF0000) != 0 ) {
@ -467,36 +447,33 @@ void HandleKeyDown(EventRecord theEvent,struct WindRec *tw)
return;
// Check for EMACS meta key.
if ( tw->emacsmeta && controldown ) {
unsigned char temp[2];
if (ascii <= 32) //control changed the ascii value
ascii |= 0x40; //move back to a non-control
if ( ascii <= 32 ) {
// control changed the ascii value
ascii |= 0x40; // move back to a non-control
}
if ( shifted || ascii == 0x5f ) {
//so we can get meta -
ascii = translatekey( code, (theEvent.modifiers & shiftKey) );
ascii = translatekeycode( code, (theEvent.modifiers & shiftKey) );
}
emacsHack:
trbuf[0] = ESC;
trbuf[1] = ascii;
if ( (tw->clientflags & PASTE_IN_PROGRESS) && tw->pastemethod ) {
// queue this
tw->kbbuf[tw->kblen++] = ESC;
tw->kbbuf[tw->kblen++] = ascii;
return;
kbwrite( tw, trbuf, 2);
}
if (tw->kblen > 0) {
netwrite( tw->port,tw->kbbuf,tw->kblen);
tw->kblen=0;
}
temp[0] = ESC;
temp[1] = ascii;
if (tw->echo && tw->halfdup)
parse(tw,temp,2);
netpush(tw->port);
kbflush( tw );
if ( tw->echo && tw->halfdup )
parse( tw, trbuf, 2 );
netpush( tw->port );
// netwrite(tw->port,temp,2);
netwrite(tw->port,temp,1); // RAB BetterTelnet 2.0b4
// ascii is sent below
netwrite( tw->port, trbuf, 1 ); // RAB BetterTelnet 2.0b4
controldown = 0;
// return; RAB BetterTelnet 2.0b4 - deal with key below
} else if ( ascii >= '0' && ascii <='9' ) {
} else if ( ascii >= '0' && ascii <= '9' ) {
// now look for macros
sendmacro(tw, ascii - '0' + (shifted) ? 10 : 0);
sendmacro(tw, ascii - '0' + ((shifted) ? 10 : 0));
return;
} else if (!((ascii == '`' && gApplicationPrefs->RemapTilde) || code == BScode )) {
// remap cmd-pgup/down
@ -531,7 +508,7 @@ emacsHack:
ascii = NULL; //a @, takes care of Apple not posting NULL key values
// map '`' to ESC if needed
if (ascii == '`' && gApplicationPrefs->RemapTilde && !(commanddown))
if (ascii == '`' && gApplicationPrefs->RemapTilde && !commanddown)
ascii = ESC;
// map Del to ^D if the user wants it
@ -540,38 +517,38 @@ emacsHack:
ascii = 4;
}
if (code == BScode) //handle mapping BS to DEL, flipping on option
{
if (tw->bsdel)
if ((optiondown && tw->emacsmeta != 2)||(commanddown))
if ( code == BScode ) {
// handle mapping BS to DEL, flipping on option
if ( tw->bsdel ) {
if ( (optiondown && tw->emacsmeta != 2) || commanddown )
ascii = BS;
else
ascii = DEL;
else
if ((optiondown && tw->emacsmeta != 2)||(commanddown))
} else {
if ( (optiondown && tw->emacsmeta != 2) || commanddown )
ascii = DEL;
else
ascii = BS;
}
}
if (!tw->enabled) //if we are suspended, and we have negotiated restart_any
{ //with the host, then enable the screen on anything but an XOFF. We will
//eat the XON later if that is what this is. (RFC 1372 --CCP 2.7)
if ((tw->restart_any_flow)&&(ascii != tw->TELstop)) {
tw->enabled = 1;
changeport(scrn, scrn);
}
if ( !tw->enabled && tw->restart_any_flow && ascii != tw->TELstop ) {
// if we are suspended, and we have negotiated restart_any
// with the host, then enable the screen on anything but an XOFF. We will
// eat the XON later if that is what this is. (RFC 1372 --CCP 2.7)
tw->enabled = 1;
changeport(scrn, scrn);
}
/* Remap PgUp,PgDown,Home,End if the user wants it that way */
// RAB BetterTelnet 2.0b3 - we don't check to see if we're using vt220
if (tw->pgupdwn && (code >= KPlowest)) //do page up/down on vt100
if (CheckPageKeys(code)) return;
if (tw->pgupdwn && code >= KPlowest) // do page up/down on vt100
if ( CheckPageKeys(code) )
return;
if (code >= KPlowest) /* BYU - Handle Keypad */
{
if ( code >= KPlowest ) {
/*
if (theWorld.keyBoardType == envStandADBKbd) //standard MacII keyboard has keypad +,-
if (theWorld.keyBoardType == envStandADBKbd) // standard MacII keyboard has keypad +,-
{ // codes switched
if (code == 0x45)
code = 0x4e;
@ -579,162 +556,174 @@ emacsHack:
code = 0x45;
}
*/
// RAB BetterTelnet 2.0b3 - who cares if we're using VT220?
// RAB BetterTelnet 2.0b4 - fix for the fix
// if ((code >= 0x7B)||(code <= 0x60)) //fkeys dont work in vt100
if (1)
{
if ((!tw->keypadmap)||(code == 0x4c)||(code > 0x51)||(code < 0x43)) //dont remap operators
{
if ((tw->clientflags & PASTE_IN_PROGRESS)&&(tw->pastemethod)) //queue this
{
tw->kbbuf[tw->kblen++] = 0;
tw->kbbuf[tw->kblen++] = kpxlate[shifted][code - KPlowest];
return;
}
if (tw->kblen > 0)
{
netwrite( tw->port,tw->kbbuf,tw->kblen);
tw->kblen=0;
}
ascii = kpxlate[shifted][code - KPlowest];
// Should we check here for ascii being zero?
VSkbsend(tw->vs, (unsigned char) ascii, tw->echo, shifted);
if ( !tw->keypadmap || code == 0x4c || code > 0x51 || code < 0x43 ) {
// dont remap operators
if ( (tw->clientflags & PASTE_IN_PROGRESS) && tw->pastemethod ) {
// queue this
trbuf[0] = 0;
trbuf[1] = kpxlate[shifted][code - KPlowest];
kbwrite( tw, trbuf, 2);
return;
}
}
else // we dont handle function keys in vt100
kbflush( tw );
ascii = kpxlate[shifted][code - KPlowest];
// Should we check here for ascii being zero?
VSkbsend(tw->vs, (unsigned char) ascii, tw->echo, shifted);
return;
}
}
// Handle whatever mapping is needed.
mac_nat(&ascii, tw->national); /* LU/PM: Convert char from mac to nat */
if ((tw->clientflags & PASTE_IN_PROGRESS)&&(tw->pastemethod)) //queue this
{
tw->kbbuf[tw->kblen++] = ascii;
// mac_nat(tw, &ascii); // LU/PM: Convert char from mac to nat
if ( GetTranslationIndex(tw->outnational) != kTRJIS ) {
if (tw->troutcount >= sizeof(tw->troutbuf)) {
// !!!! shouldn't occur...
Debugger();
tw->troutcount = 0;
}
pbuf = tw->troutbuf;
pbuf[tw->troutcount++] = ascii;
if ( tw->troutcount < sizeof(tw->troutbuf) - 1 ) {
EventRecord nextEvent;
if ( EventAvail(keyDownMask|autoKeyMask, &nextEvent) ) {
/* wait for next char */
return;
}
}
inlen = tw->troutcount;
trlen = sizeof(trbuf);
res = trbuf_mac_nat( tw, pbuf, &inlen, trbuf, &trlen );
if ( res && res != kTECPartialCharErr ) {
// translation failed, leave data as-is
trlen = tw->troutcount;
} else {
// translation ok, or no data yet
if ( inlen ) {
// keep a few chars
for (i = inlen; i <= tw->troutcount; i++) {
pbuf[i - inlen] = pbuf[i];
}
tw->troutcount -= inlen;
}
if ( !trlen ) {
// nothing yet
if ( tw->troutcount < sizeof(tw->troutbuf) ) {
return;
}
// temp translation buffer full, unable to translate...
// flush data ?
trlen = tw->troutcount;
res = trflush_mac_nat( tw );
} else {
// translation complete
pbuf = trbuf;
}
}
tw->troutcount = 0;
} else {
// send as-is ?
if ( !tw->troutcount && !(ascii & 0x80) ) {
pbuf = &ascii;
trlen = 1;
} else {
pbuf = tw->troutbuf;
pbuf[tw->troutcount++] = ascii;
if ( tw->troutcount == 1 )
// wait for second byte
return;
trlen = tw->troutcount;
tw->troutcount = 0;
}
}
if ( (tw->clientflags & PASTE_IN_PROGRESS) && tw->pastemethod ) {
// queue this
kbwrite( tw, pbuf, trlen);
return;
} else if ( tw->lmode ) {
for (res = 0; res < trlen; ++res) {
// Some form of linemode is active; we dont touch it after them
process_key( pbuf[res], tw );
}
return;
}
if (tw->lmode) // Some form of linemode is active; we dont touch it after them
{
process_key(ascii,tw);
return;
}
// BSD-like mapping.... if we don't want this, set chars to zero and it wont work
//CCP 2.7: this is now AFTER the linemode stuff, so that linemode can handle it differently
if (ascii == tw->TELstop)
{
if (tw->allow_flow) //remote flow control can turn this off
{
if ( ascii == tw->TELstop ) {
if ( tw->allow_flow ) {
// remote flow control can turn this off
tw->enabled = 0;
changeport(scrn,scrn);
changeport( scrn, scrn );
return;
}
}
if (ascii == tw->TELgo)
{
if (tw->allow_flow) //remote flow control can turn this off
{
} else if ( ascii == tw->TELgo ) {
if ( tw->allow_flow ) {
// remote flow control can turn this off
tw->enabled = 1;
changeport(scrn, scrn);
changeport( scrn, scrn );
return;
}
}
if (ascii == tw->TELip)
{
} else if ( ascii == tw->TELip ) {
char *tellUser = "\n\r[Interrupt Process]\n\r";
parse(tw,(unsigned char *)tellUser,23);
netpush(tw->port);
netwrite(tw->port, "\377\364",2); //IAC IP
netpush(tw->port);
netwrite(tw->port, "\377\375\006",3); // send Do TM
tw->timing = 1; // set emulate to TMwait
parse( tw, (unsigned char *)tellUser, 23 );
netpush( tw->port );
netwrite( tw->port, "\377\364", 2 ); //IAC IP
netpush( tw->port );
netwrite( tw->port, "\377\375\006" ,3 ); // send Do TM
tw->timing = 1; // set emulate to TMwait
return;
}
if (tw->echo && !tw->halfdup) // Handle klude-linemode
{
if (ascii>31 && ascii <127 && code < KPlowest)
{
if (tw->kblen < (MAXKB -1)) /* Add to buffer if not full */
tw->kbbuf[tw->kblen++] = ascii;
else
{ /* if full send buffer */
netwrite( tw->port, tw->kbbuf,tw->kblen);
tw->kbbuf[0] = ascii;
tw->kblen=1;
if ( tw->echo && !tw->halfdup ) {
// Handle klude-linemode
if ( ascii > 31 && ascii < 127 && code < KPlowest ) {
// printable key
kbwrite( tw, pbuf, trlen);
parse(tw, pbuf, trlen);
return; // OK, were set...
} else if ( code == BScode ) {
if ( tw->kblen > 0 ) {
--tw->kblen;
parse( tw, (unsigned char *)"\010 \010", 3 );
}
return;
} else if ( ascii == KILLCHAR ) {
while ( tw->kblen > 0 ) {
parse( tw, (unsigned char *)"\010 \010", 3 );
--tw->kblen;
}
return;
} else if ( code < KPlowest ) {
// if full send buffer
kbflush( tw );
if ( ascii != CR ) {
sendch = '@' + ascii;
parse( tw, (unsigned char *)"^", 1 );
parse( tw, &sendch, 1 );
}
}
} //end if klude-linemode
sendch=ascii;
parse(tw, &sendch, 1);
return; /* OK, were set...*/
} //end if printable key
else
{
if ( code == BScode )
{
if (tw->kblen>0)
{
tw->kblen--;
parse(tw,(unsigned char *) "\010 \010",3); /* BYU LSC */
}
return;
}
else if (ascii == KILLCHAR)
{
while (tw->kblen >0)
{
parse(tw,(unsigned char *) "\010 \010",3); /* BYU LSC */
tw->kblen--;
}
return;
}
else if (code <KPlowest)
{
netwrite( tw->port, tw->kbbuf,tw->kblen); /* if full send buffer */
tw->kblen=0;
if (ascii !=CR)
{
sendch='@'+ascii;
parse(tw,(unsigned char *) "^",1); /* BYU LSC */
parse(tw, &sendch, 1);
}
}
}//end else non-printable key
}//end if klude-linemode
if (ascii == '\015') //CR
{
// If crmap is on, send CR-NULL instead of CR-LF.
if (ascii == '\015') {
// CR. If crmap is on, send CR-NULL instead of CR-LF.
SendCRAsIfTyped(tw);
return;
/* netpush(tw->port);
if (tw->crmap)
netwrite(tw->port,"\015\0",2);
else
netwrite(tw->port,"\015\012",2); //UNIVAC fix
if (tw->echo)
parse(tw,(unsigned char *) "\012\015",2); // BYU LSC
return; */
}
if (tw->echo && tw->halfdup)
parse(tw, &ascii, 1);
if (ascii != 255)
netwrite(tw->port,&ascii,1);
else
netwrite(tw->port, "\377\377", 2);
parse( tw, pbuf, trlen );
if ( ascii != 255 ) {
netwrite( tw->port, pbuf, trlen );
} else {
netwrite( tw->port, "\377\377", 2 );
}
}
void HandleMouseDown(EventRecord myEvent)
@ -744,11 +733,14 @@ void HandleMouseDown(EventRecord myEvent)
short growErr, i;
short theItem;
DialogPtr dlogp;
short vs;
code = FindWindow(myEvent.where, &whichWindow);
switch (code) {
case inMenuBar:
if ( gApplicationPrefs->BlinkCursor && (vs = RSfindvwind(FrontWindow())) >= 0 )
VScursblinkoff(vs);
if (myEvent.modifiers & optionKey)
{
switchToOptionMenus(TRUE);
@ -763,6 +755,8 @@ void HandleMouseDown(EventRecord myEvent)
}
else
HandleMenuCommand(MenuSelect(myEvent.where),myEvent.modifiers);
if ( gApplicationPrefs->BlinkCursor && (vs = RSfindvwind(FrontWindow())) >= 0 )
VScursblinkon(vs);
break;
case inSysWindow:
SystemClick(&myEvent, whichWindow);
@ -866,24 +860,20 @@ void DoEvents( EventRecord* theEvent)
if (gotOne) {
/* BYU 2.4.11 - Turn the cursor off when the human makes the slightest move. */
if (gApplicationPrefs->BlinkCursor)
{
if ( (vs=RSfindvwind(FrontWindow())) >= 0)
if (vs == screens[scrn].vs)
if (!(myEvent.modifiers & cmdKey) &&
((myEvent.what == keyDown) || (myEvent.what == autoKey)))
RScursblinkon(vs);
else
RScursblinkoff(vs);
if ( gApplicationPrefs->BlinkCursor ) {
if ( (vs = RSfindvwind(FrontWindow())) >= 0 && vs == screens[scrn].vs ) {
if (!(myEvent.modifiers & cmdKey) &&
(myEvent.what == keyDown || myEvent.what == autoKey))
VScursblinkon(vs);
else
VScursblinkoff(vs);
}
}
HandleEvent(theEvent);
} else if (gApplicationPrefs->BlinkCursor && !TelInfo->suspended) {
if ( (vs = RSfindvwind(FrontWindow())) >= 0 && vs == screens[scrn].vs )
VScursblink(vs);
}
else if (gApplicationPrefs->BlinkCursor && !TelInfo->suspended)
{ /* BYU 2.4.11 */
if ( (vs=RSfindvwind(FrontWindow())) >= 0) /* BYU 2.4.11 */
if (vs == screens[scrn].vs) /* BYU 2.4.11 */
RScursblink(vs); /* BYU 2.4.11 */
} /* BYU 2.4.11 */
if (FrontWindow() != TelInfo->macrosModeless) // RAB BetterTelnet 1.2
updateCursor(0);
@ -1149,9 +1139,6 @@ void HandleEvent(EventRecord *myEvent) //CCP split this from DoEvents so we can
DisposePtr(nRecPtr);
gHaveInstalledNotification = FALSE;
}
// DisableItem( myMenus[Edit],EDcut);
// DisableItem( myMenus[Edit],EDundo);
// DisableItem( myMenus[Edit],EDclear);
window = FrontWindow(); /* Who's on first */
if ( (vs=RSfindvwind(window)) >= 0)
@ -1185,9 +1172,6 @@ void HandleEvent(EventRecord *myEvent) //CCP split this from DoEvents so we can
KeyScript(smRoman);
}
TelInfo->suspended=TRUE; /* We be in waitin' */
// EnableItem( myMenus[Edit],EDcut);
// EnableItem( myMenus[Edit],EDundo);
// EnableItem( myMenus[Edit],EDclear);
window = FrontWindow(); /* Who's on first */
if ((window = FrontWindow()) != nil) {

View File

@ -120,7 +120,7 @@ void main(void)
if (!TelInfo->done) {
DoNetEvents();
}
ssh2_sched();
//ssh2_sched();
memOK = RecoverReserveMemory();
if (memOK)

View File

@ -21,6 +21,7 @@
#include "wind.h"
#include "translate.h"
#include "menuseg.proto.h"
#include "mainseg.proto.h"
#include "Sets.proto.h" /* JMB: For Saved Sets functions */
@ -77,6 +78,7 @@ extern WindRec
*screens, /* The screen array from Maclook */
*ftplog; /* The FTP log screen from Maclook */
extern short nNational;
extern short gTableCount;
void CloseCaptureFile(short w)
{
@ -866,38 +868,30 @@ void paste( void)
long
off, /* offset */
length; /* the lenght of what is on the Scrap */
WindRec *tw = &screens[scrn];
if (screens[scrn].clientflags & PASTE_IN_PROGRESS) { // One paste at a time, please
if (tw->clientflags & PASTE_IN_PROGRESS) { // One paste at a time, please
SysBeep(4);
return;
}
/* Flush the buffer if necessary */ //CCP fix for linemode
if (screens[scrn].kblen>0)
{
netpush(screens[scrn].port);
netwrite( screens[scrn].port, screens[scrn].kbbuf,
screens[scrn].kblen);
screens[scrn].kblen=0;
}
if (GetScrap(0L, 'TEXT', &off)<=0L) /* If there are no TEXT res's */
return; /* then we can't paste it */
return; /* then we can't paste it */
screens[scrn].outhand=myNewHandle(0L); /* create a handle to put chars in */
/* Flush the buffer if necessary */ //CCP fix for linemode
kbflush(tw);
length= GetScrap( screens[scrn].outhand, 'TEXT',&off);
/* Store the scrap into the handle */
screens[scrn].outlen = length; /* Set the length */
HLock(screens[scrn].outhand); /* Lock the Handle down for safety */
screens[scrn].outptr=*screens[scrn].outhand; /* Set the pointer */
screens[scrn].clientflags |= PASTE_IN_PROGRESS;
screens[scrn].isUploading = 0;
screens[scrn].incount = 0;
screens[scrn].outcount = 0;
trbuf_mac_nat((unsigned char *)screens[scrn].outptr,screens[scrn].outlen, screens[scrn].national); /* LU: translate to national chars */
tw->outhand = myNewHandle(0L); /* create a handle to put chars in */
length = GetScrap(tw->outhand, 'TEXT', &off);
if ( GetTranslationIndex(tw->outnational) != kTRJIS )
tw->outhand = htrbuf_mac_nat(tw, tw->outhand);
HLock(tw->outhand);
tw->outptr = *tw->outhand;
tw->outlen = GetHandleSize(tw->outhand);
tw->clientflags |= PASTE_IN_PROGRESS;
tw->isUploading = 0;
tw->incount = 0;
tw->outcount = 0;
pasteText( scrn); /* BYU LSC - routine to paste to net, w/echo if neccessary */
}
@ -908,8 +902,9 @@ void uploadFile(void) // RAB: routine added in BetterTelnet 1.0fc9
StandardFileReply sfr;
OSErr err;
short refNum;
WindRec *tw = &screens[scrn];
if (screens[scrn].clientflags & PASTE_IN_PROGRESS) { // One paste at a time, please
if (tw->clientflags & PASTE_IN_PROGRESS) { // One paste at a time, please
SysBeep(4);
return;
}
@ -921,86 +916,64 @@ void uploadFile(void) // RAB: routine added in BetterTelnet 1.0fc9
if (err) return;
/* Flush the buffer if necessary */ //CCP fix for linemode
if (screens[scrn].kblen>0)
{
netpush(screens[scrn].port);
netwrite( screens[scrn].port, screens[scrn].kbbuf,
screens[scrn].kblen);
screens[scrn].kblen=0;
}
screens[scrn].outhand=myNewHandle(16384); // for now, upload block is 16K
screens[scrn].outptr = *screens[scrn].outhand;
HLock(screens[scrn].outhand); /* Lock the Handle down for safety */
length = 16384;
FSRead(refNum, &length, screens[scrn].outptr);
kbflush(tw);
length = 16384; // for now, upload block is 16K
tw->outhand = myNewHandle(length);
HLock( tw->outhand );
FSRead(refNum, &length, *tw->outhand);
if (length == 0) {
FSClose(refNum);
HUnlock(screens[scrn].outhand);
DisposeHandle(screens[scrn].outhand);
HUnlock(tw->outhand);
DisposeHandle(tw->outhand);
return;
}
screens[scrn].outlen = length; /* Set the length */
HUnlock(screens[scrn].outhand);
SetHandleSize(screens[scrn].outhand, length); // now REALLY set the length
HLock(screens[scrn].outhand);
screens[scrn].clientflags |= PASTE_IN_PROGRESS;
SetHandleSize(tw->outhand, length); // now REALLY set the length
if ( GetTranslationIndex(tw->outnational) != kTRJIS )
tw->outhand = htrbuf_mac_nat(tw, tw->outhand);
HLock(tw->outhand);
tw->outptr = *tw->outhand;
tw->outlen = GetHandleSize(tw->outhand);
tw->clientflags |= PASTE_IN_PROGRESS;
if (length == 16384) {
screens[scrn].isUploading = 1;
screens[scrn].uploadRefNum = refNum;
tw->isUploading = 1;
tw->uploadRefNum = refNum;
} else {
FSClose(refNum);
screens[scrn].isUploading = 0;
}
screens[scrn].incount = 0;
screens[scrn].outcount = 0;
trbuf_mac_nat((unsigned char *)screens[scrn].outptr,screens[scrn].outlen, screens[scrn].national); /* LU: translate to national chars */
tw->incount = 0;
tw->outcount = 0;
pasteText(scrn); /* BYU LSC - routine to paste to net, w/echo if neccessary */
}
void autoPaste(short vs) // RAB: routine added in BetterTelnet 1.0fc6
{
char **charh;
WindRec *tw = &screens[scrn];
if (screens[scrn].clientflags & PASTE_IN_PROGRESS) { // One paste at a time, please
if (tw->clientflags & PASTE_IN_PROGRESS) { // One paste at a time, please
SysBeep(4);
return;
}
/* Flush the buffer if necessary */ //CCP fix for linemode
if (screens[scrn].kblen>0)
{
netpush(screens[scrn].port);
netwrite( screens[scrn].port, screens[scrn].kbbuf,
screens[scrn].kblen);
screens[scrn].kblen=0;
}
kbflush(tw);
charh=RSGetTextSel(vs,0); /* Get the text selection */
charh = RSGetTextSel(vs,0); /* Get the text selection */
if (charh == (char **)-1L)
OutOfMemory(400);
else if (charh != (char **)0L) { /* BYU LSC - Can't do anything without characters */
HLock(charh);
screens[scrn].outhand=charh;
screens[scrn].outlen = GetHandleSize(charh); /* Set the length */
screens[scrn].outptr=*screens[scrn].outhand; /* Set the pointer */
screens[scrn].clientflags |= PASTE_IN_PROGRESS;
screens[scrn].isUploading = 0;
screens[scrn].incount = 0;
screens[scrn].outcount = 0;
trbuf_mac_nat((unsigned char *)screens[scrn].outptr,screens[scrn].outlen, screens[scrn].national); /* LU: translate to national chars */
if ( GetTranslationIndex(tw->outnational) != kTRJIS )
tw->outhand = htrbuf_mac_nat(tw, charh);
HLock(tw->outhand);
tw->outptr = *tw->outhand;
tw->outlen = GetHandleSize(tw->outhand);
tw->clientflags |= PASTE_IN_PROGRESS;
tw->isUploading = 0;
tw->incount = 0;
tw->outcount = 0;
pasteText( scrn); /* BYU LSC - routine to paste to net, w/echo if neccessary */
}
}
@ -1087,7 +1060,10 @@ void changeport(short oldprt, short newprt)
CheckFonts();
CheckNational(screens[newprt].national);
if ( screens[newprt].outnational < 0 )
CheckNational( gTableCount - screens[newprt].outnational );
else
CheckNational( screens[newprt].outnational );
}
// Returns TRUE if the user cancelled the quit
@ -1423,12 +1399,10 @@ void HandleMenuCommand( long mResult, short modifiers)
case EMecho: /* Toggle Local Echo (if poss.) */
if (TelInfo->numwindows < 1) break;
if ( screens[scrn].echo && screens[scrn].kblen > 0 ) {
netwrite( screens[scrn].port, screens[scrn].kbbuf,
screens[scrn].kblen); /* if not empty send buffer */
screens[scrn].kblen = 0;
if ( screens[scrn].echo ) {
kbflush(&screens[scrn]);
}
screens[scrn].echo= !screens[scrn].echo; /* toggle */
screens[scrn].echo = !screens[scrn].echo; /* toggle */
if (screens[scrn].echo) { /* LOCAL ECHO */
if (!(modifiers & optionKey) && (screens[scrn].protocol == 0))
send_dont(screens[scrn].port,1);
@ -1584,11 +1558,9 @@ void HandleMenuCommand( long mResult, short modifiers)
{ char tmpout[30]; /* Basically the same except for */
unsigned char tmp[4]; /* The ftp -n phrase in NEftp */
if (screens[scrn].echo && (screens[scrn].kblen>0)) {
netwrite( screens[scrn].port, screens[scrn].kbbuf,
screens[scrn].kblen);/* if not empty send buffer */
screens[scrn].kblen=0;
}
if ( screens[scrn].echo ) {
kbflush(&screens[scrn]);
}
netgetip(tmp);
if (theItem == NEftp) {
if ((gFTPServerPrefs->ServerState == 1) && !(modifiers & shiftKey))
@ -1848,10 +1820,12 @@ void HandleMenuCommand( long mResult, short modifiers)
case transMenu:
if (TelInfo->numwindows>0) {
CheckNational(theItem-1); // Set up the menu
transBuffer(screens[scrn].national, theItem-1); // Translate the scrollback buffer
//transBuffer(screens[scrn].outnational, theItem-1); // Translate the scrollback buffer
switchintranslation(&screens[scrn], theItem-1, 0);
switchouttranslation(&screens[scrn], theItem-1, 0);
// and redraw the screen
VSredraw(screens[scrn].vs,0,0,VSmaxwidth(screens[scrn].vs),VSgetlines(screens[scrn].vs)-1); /* LU */
screens[scrn].national = theItem-1;
screens[scrn].outnational = theItem-1;
}
break;
case keyMenu:

View File

@ -34,6 +34,7 @@
#include "rsinterf.proto.h"
#include "vrrgmac.proto.h"
#include "tekrgmac.proto.h"
#include "translate.h"
#include "vsdata.h"
#include "vskeys.h"
#include "translate.proto.h"
@ -227,85 +228,81 @@ void pasteText(short scrn)
{
short amount;
long uploadLength;
WindRec *tw = &screens[scrn];
if (!screens[scrn].outlen)
if (!tw->outlen)
return;
if (netpush(screens[scrn].port) != 0) { /* BYU 2.4.16 - wait until not busy */
if (netpush(tw->port) != 0) { /* BYU 2.4.16 - wait until not busy */
netputevent( USERCLASS, PASTELEFT, scrn,0); /* BYU 2.4.16 */
return; /* BYU 2.4.16 */
} /* BYU 2.4.16 */
if (screens[scrn].incount) { /* BYU 2.4.16 */
screens[scrn].incount = 0; /* BYU 2.4.16 */
screens[scrn].outcount = 0; /* BYU 2.4.16 */
if (tw->incount) { /* BYU 2.4.16 */
tw->incount = 0; /* BYU 2.4.16 */
tw->outcount = 0; /* BYU 2.4.16 */
netputevent( USERCLASS, PASTELEFT, scrn,0); /* BYU 2.4.16 */
return; /* BYU 2.4.16 */
} /* BYU 2.4.16 */
if (screens[scrn].outcount < 2) { /* BYU 2.4.16 */
screens[scrn].outcount++; /* BYU 2.4.16 */
if (tw->outcount < 2) { /* BYU 2.4.16 */
tw->outcount++; /* BYU 2.4.16 */
netputevent( USERCLASS, PASTELEFT, scrn,0); /* BYU 2.4.16 */
return; /* BYU 2.4.16 */
}
if (netqlen(screens[scrn].port) > 0) { /* BYU 2.4.16 - wait until not full */
if (netqlen(tw->port) > 0) { /* BYU 2.4.16 - wait until not full */
netputevent( USERCLASS, PASTELEFT, scrn,0); /* BYU 2.4.16 */
return; /* BYU 2.4.16 */
} /* BYU 2.4.16 */
if (!screens[scrn].pastemethod) { // Do this all at once?
amount = netwrite(screens[scrn].port, screens[scrn].outptr,
screens[scrn].outlen);
if (!tw->pastemethod) { // Do this all at once?
amount = netwrite(tw->port, tw->outptr,
tw->outlen);
}
else { // Nope, do it in blocks
if (screens[scrn].pastesize <= screens[scrn].outlen)
amount = screens[scrn].pastesize;
if (tw->pastesize <= tw->outlen)
amount = tw->pastesize;
else
amount = screens[scrn].outlen;
amount = netwrite(screens[scrn].port, screens[scrn].outptr, amount);
amount = tw->outlen;
amount = netwrite(tw->port, tw->outptr, amount);
}
if (screens[scrn].echo)
parse( &screens[scrn],(unsigned char *) screens[scrn].outptr,amount);
if (tw->echo)
parse( tw,(unsigned char *) tw->outptr,amount);
screens[scrn].outlen -= amount;
screens[scrn].outptr += (long) amount;
if ((screens[scrn].isUploading) && (screens[scrn].outlen <= 0)) {
HLock(screens[scrn].outhand); // Lock the Handle down for safety
screens[scrn].outptr = *screens[scrn].outhand;
tw->outlen -= amount;
tw->outptr += (long) amount;
if ( tw->isUploading && tw->outlen <= 0 ) {
uploadLength = 16384;
FSRead(screens[scrn].uploadRefNum, &uploadLength, screens[scrn].outptr);
if (uploadLength > 0) {
screens[scrn].outlen = uploadLength; // Set the length
HUnlock(screens[scrn].outhand);
SetHandleSize(screens[scrn].outhand, uploadLength); // now REALLY set the length
HLock(screens[scrn].outhand);
screens[scrn].clientflags |= PASTE_IN_PROGRESS;
if (uploadLength == 16384) {
screens[scrn].isUploading = 1;
} else {
FSClose(screens[scrn].uploadRefNum);
screens[scrn].isUploading = 0;
HUnlock( tw->outhand );
SetHandleSize(tw->outhand, uploadLength);
HLock( tw->outhand );
FSRead(tw->uploadRefNum, &uploadLength, *tw->outhand);
if ( uploadLength > 0 ) {
SetHandleSize(tw->outhand, uploadLength);
if ( GetTranslationIndex(tw->outnational) != kTRJIS )
tw->outhand = htrbuf_mac_nat(tw, tw->outhand);
HLock(tw->outhand);
tw->outptr = *tw->outhand;
tw->outlen = GetHandleSize(tw->outhand);
tw->clientflags |= PASTE_IN_PROGRESS;
if (uploadLength != 16384) {
tw->isUploading = 0;
FSClose(tw->uploadRefNum);
}
screens[scrn].incount = 0;
screens[scrn].outcount = 0;
trbuf_mac_nat((unsigned char *)screens[scrn].outptr,screens[scrn].outlen, screens[scrn].national); // LU: translate to national chars
tw->incount = 0;
tw->outcount = 0;
//pasteText(scrn);
netputevent(USERCLASS, PASTELEFT, scrn, 0);
return;
}
}
if ( screens[scrn].outlen <=0) {
if ( tw->outlen <= 0) {
int left;
WindRec *tw = &screens[scrn];
tw->clientflags &= ~PASTE_IN_PROGRESS;
if (screens[scrn].isUploading)
FSClose(screens[scrn].uploadRefNum);
if (tw->isUploading)
FSClose(tw->uploadRefNum);
HUnlock(tw->outhand);
DisposeHandle(tw->outhand);
tw->outptr = (char *) 0L;

View File

@ -10,6 +10,7 @@
#include "parse.h" // For our #defines
#include "wind.h" /* For WindRec structure */
#include "translate.h"
/* For putln proto */
#include "ae.proto.h"
@ -42,6 +43,8 @@ static char munger[255];
/*#include <Profiler.h>*/
extern void syslog( int priority, const char *format, ...);
extern short scrn;
extern WindRec *screens;
@ -63,22 +66,102 @@ static void telnet_wont(struct WindRec *tw, short option);
void Parseunload(void) {}
/*
* kbflush
*/
void kbflush(struct WindRec *tw)
{
if ( tw->kblen ) {
netwrite( tw->port, tw->kbbuf, tw->kblen);
tw->kblen = 0;
}
}
/*
* kbwrite
*/
void kbwrite(struct WindRec *tw, unsigned char *string, short len)
{
int i;
for (i = 0; i < len; i++) {
if ( tw->kblen == MAXKB ) {
kbflush(tw);
}
tw->kbbuf[tw->kblen++] = string[i];
}
}
void SendStringAsIfTyped(struct WindRec *tw, char *string, short len)
{
// trbuf_nat_mac((unsigned char *)string, len, tw->national);
trbuf_mac_nat((unsigned char *)string, len, tw->national); // drh - bug fix
unsigned char outbuf[256];
unsigned char trbuf[32];
unsigned char *pbuf;
long inlen;
long outlen;
long buflen;
long trlen;
int i;
int j;
int res;
netpush(tw->port);
trflush_mac_nat(tw);
if (tw->kblen > 0) { /* need to flush buffer */
netwrite(tw->port, tw->kbbuf, tw->kblen);
tw->kblen=0;
while (len) {
buflen = len > sizeof(outbuf) ? sizeof(outbuf) : len;
for ( i = 0, outlen = 0; i < buflen && outlen < sizeof(outbuf); ++i ) {
if ( /*string[i] != ESC &&*/ GetTranslationIndex(tw->outnational) != kTRJIS ) {
pbuf = tw->troutbuf;
if ( tw->troutcount >= sizeof(tw->troutbuf) ) {
// !!!! shouldn't occur...
Debugger();
tw->troutcount = 0;
}
pbuf[tw->troutcount++] = string[i];
inlen = tw->troutcount;
trlen = sizeof(trbuf);
res = trbuf_mac_nat( tw, pbuf, &inlen, trbuf, &trlen );
if ( res && res != kTECPartialCharErr ) {
// translation failed, leave data as-is
trlen = tw->troutcount;
} else {
// translation ok, or no data yet
if ( inlen ) {
// keep a few chars
for (j = inlen; j <= tw->troutcount; j++)
pbuf[j - inlen] = pbuf[j];
tw->troutcount -= inlen;
}
if ( !trlen ) {
// nothing yet
if ( tw->troutcount < sizeof(tw->troutbuf) )
continue;
// temp translation buffer full, unable to translate...
// flush data ?
trlen = tw->troutcount;
res = trflush_mac_nat( tw );
} else {
// translation complete
pbuf = trbuf;
}
}
tw->troutcount = 0;
for ( j = 0; j < trlen; ++j )
outbuf[outlen++] = pbuf[j];
} else {
outbuf[outlen++] = string[i];
}
}
netpush(tw->port);
kbflush( tw );
netwrite(tw->port, outbuf, outlen);
if (tw->echo)
parse(tw, (unsigned char *)outbuf, outlen);
len -= buflen;
string += buflen;
}
netwrite(tw->port, string, len);
if (tw->echo)
parse(tw, (unsigned char *)string, len);
tw->troutcount = 0;
}
// RAB BetterTelnet 2.0b3
@ -544,15 +627,17 @@ void telnet_send_initial_options(WindRec *tw)
if ((tw->protocol >= 1) && (tw->protocol <= 3)) { // initial rlogin stuff
netwrite(tw->port, "\000", 1);
if ((tw->protocol == 3) || (!tw->clientuser[0]))
// rexec sends username, rlogin/rsh need client username
// but we use server username if we don't have a client
// username...
// rexec sends username, rlogin/rsh need client username
// but we use server username if we don't have a client
// username...
netwrite(tw->port, &tw->username[1], tw->username[0]);
else netwrite(tw->port, &tw->clientuser[1], tw->clientuser[0]);
else
netwrite(tw->port, &tw->clientuser[1], tw->clientuser[0]);
netwrite(tw->port, "\000", 1);
if (tw->protocol == 3) // rexec sends password, rlogin/rsh send server username
netwrite(tw->port, &tw->password[1], tw->password[0]);
else netwrite (tw->port, &tw->username[1], tw->username[0]);
else
netwrite (tw->port, &tw->username[1], tw->username[0]);
netwrite(tw->port, "\000", 1);
if (tw->protocol == 1) { // rlogin sends terminal type & speed, rsh/rexec send command
netwrite(tw->port, &tw->answerback[1], tw->answerback[0]);
@ -843,11 +928,7 @@ static void telnet_dont(struct WindRec *tw, short option)
if (tw->lmode)
{
send_wont(tw->port, N_LINEMODE);
if (tw->kblen > 0)
{
netpush(tw->port);
netwrite(tw->port, tw->kbbuf, tw->kblen);
}
kbflush( tw );
tw->lmode = 0;
tw->lmodeBits = 0;
tw->litNext = 0;

View File

@ -1,5 +1,8 @@
/* parse.c */
void kbflush(struct WindRec *tw);
void kbwrite(struct WindRec *tw, unsigned char *string, short len);
void SendStringAsIfTyped(struct WindRec *tw, char *string, short len);
void SendCRAsIfTyped(struct WindRec *tw);
void Parseunload(void);

View File

@ -21,17 +21,30 @@
#include "wind.h"
#include "vsdata.h"
#include "translate.h"
#include "translate.proto.h"
#include "vsinterf.proto.h"
#include "LinkedList.proto.h"
#include "TextCommon.h"
#include "TextEncodingConverter.h"
extern void syslog( int priority, const char *format, ...);
extern long dumpln( long base, char *dest, void *src, long len );
void VSprintf(char *fmt, ...);
void VSdump(char *p, int len);
static void trTECInit();
//#define DEBUG_TRANSLATION
/*************** external variables ***************/
extern WindRec *screens; /* The screen array from maclook.c */
extern short scrn; /* The current screen from maclook.c */
extern int gVSemlogging;
/*************** global variables ***************/
BytePtr DefaultTable,
@ -39,34 +52,9 @@ BytePtr DefaultTable,
FTPoutTable;
Handle transTablesHdl;
short nNational;
short nNational = 0;
short gTableCount;
#if 0
Boolean get_trsl (short id, Byte **table)
{
Handle h;
long size;
h = GetResource (TRSL,id);
if ((h==NULL) || (ResError()!=noErr))
{
DoError(106 | RESOURCE_ERRORCLASS, LEVEL2, NULL);
return (FALSE);
}
size = GetHandleSize(h);
if (size != 256)
{
DoError(107 | RESOURCE_ERRORCLASS, LEVEL2, NULL);
return (FALSE);
}
HLockHi(h);
*table = (Byte *) *h;
return (TRUE);
}
#endif
short transBuffer(short oldtable, short newtable) /* translate entire buffer */
{
@ -102,39 +90,59 @@ short transBuffer(short oldtable, short newtable) /* translate entire buffer */
/*sprintf(tmp,"lineNo:%d, p:%08x, starts with:%c%c%c%c",lineNo,p,*(p->text),*(p->text+1),*(p->text+2),*(p->text+3)); putln(tmp);*/
if (p==NULL) { putln ("p is NULL"); return (-1); }
if (p->text==NULL) { putln ("p->text is NULL"); return (-1); }
// First convert the line back to Mac US format, and then to the new format.
trbuf_nat_mac((unsigned char *)p->text,width, oldtable);
trbuf_mac_nat((unsigned char *)p->text,width, newtable);
// FIXME: cashes with 2 bytes characters...
// switchintranslation
//trbuf_mac_nat(tw, (unsigned char *)p->text, width, (unsigned char *)p->text, &outlen);
// switchintranslation
//trbuf_nat_mac((unsigned char *)p->text, width, (unsigned char *)p->text, &outlen);
p = p->next;
}
sprintf (tmp, "transBuffer:did convert %d lines", lineNo-1); putln (tmp);
return (0);
}
BytePtr GetTranslationResource(short id)
short GetTranslationIndex(short table)
{
Handle h;
h = GetResource(MY_TRSL, id);
if ((h == NULL) || (ResError() != noErr)) {
// Do nasty mean error here. BUGG
}
DetachResource(h);
HLockHi(h);
return((BytePtr) *h);
if ( table > gTableCount ) {
return gTableCount - table;
}
return table;
}
// table #'s 1...n correspond to tables in our master array, table #0 is the default table
BytePtr ReturnTablePtr(short table, Boolean out)
BytePtr GetTranslationResource(short id)
{
if (table > nNational || table < 1) return(DefaultTable + ((out == TRUE) * 256));
return((BytePtr)(*transTablesHdl + ((table - 1) * 512) + ((out == TRUE) * 256)));
Handle h;
h = GetResource(MY_TRSL, id);
if ( h == NULL || ResError() != noErr ) {
return NULL;
}
DetachResource(h);
HLockHi(h);
return (BytePtr)*h;
}
// table #'s 1...n correspond to tables in our master array, table #0 is the default table
BytePtr ReturnTablePtr(short table, Boolean out)
{
BytePtr ptable;
if (table < 1 || table > gTableCount)
ptable = DefaultTable;
else
ptable = (BytePtr)*transTablesHdl + (table - 1) * 512;
if ( out && ptable )
ptable += 256;
return ptable;
}
// The Default table (i.e. no translation) and the two FTP tables are stored in the
// Application's resource fork as resources of type TRSL. The
// tables added and removed by the user are stored in the prefs file as resources of
@ -147,143 +155,563 @@ void Setup_Default_Tables(void)
FTPoutTable = FTPinTable + 256;
}
/*
* Be very careful with calling putln from this procedure, since
* putln uses the translation tables. If the tables are not setup
* garbage output will appear. This is not harmful, but very
* annoying.
*/
void trInit (MenuHandle whichMenu)
void BuildTranslateMenu(MenuHandle whichMenu)
{
Str255 scratchPstring;
short numberOfTerms = CountResources(USER_TRSL);
LinkedListNode *theHead = createSortedList2(USER_TRSL, numberOfTerms, NULL);
GetIndString(scratchPstring, MISC_STRINGS, NONE_STRING); //"None" string
AppendMenu(whichMenu, scratchPstring);
addListToMenu/*3*/(whichMenu, theHead, 2);
EnableItem(whichMenu, 0); // Make sure the entire menu is enabled
deleteList(&theHead);
if ( gTableCount < nNational ) {
// append hard-coded translations
AppendMenu(whichMenu, "\p ");
// WARNING: this string must match the one in NewPreferences
SetMenuItemText(whichMenu, gTableCount + 2, "\pJIS (ISO-2022-JP)");
AppendMenu(whichMenu, "\p ");
SetMenuItemText(whichMenu, gTableCount + 3, "\pEUC-JP");
AppendMenu(whichMenu, "\p ");
SetMenuItemText(whichMenu, gTableCount + 4, "\pShift-JIS");
}
}
#pragma mark -
/*
* Be very careful with calling putln from this procedure, since
* putln uses the translation tables. If the tables are not setup
* garbage output will appear. This is not harmful, but very
* annoying.
*/
void trInit(MenuHandle whichMenu)
{
short i, numTables;
Handle h;
LinkedListNode *theHead;
nNational = 0;
trTECInit();
Setup_Default_Tables();
transTablesHdl = myNewHandle(0);
UseResFile(TelInfo->ApplicationFile);
numTables = CountResources(USER_TRSL);
if (numTables)
{
Str255 NoneString;
theHead = createSortedList2(USER_TRSL,numTables,NULL); //now we have a sorted linked list of the names
GetIndString(NoneString,MISC_STRINGS,NONE_STRING);
AppendMenu(whichMenu,NoneString);
addListToMenu/*3*/(whichMenu, theHead, 2);
deleteList(&theHead);
for (i = 2; i <= numTables + 1; i++) //start adding things from the second menu item (first is none)
{
gTableCount = CountResources(USER_TRSL);
if (gTableCount) {
transTablesHdl = myNewHandle(512 * gTableCount);
HLockHi(transTablesHdl);
nNational += gTableCount;
BuildTranslateMenu(whichMenu);
for (i = 0; i < gTableCount; i++) {
// start adding things from the second menu item (first is none)
Str255 menuItemName;
GetMenuItemText(whichMenu, i,menuItemName);
h = GetNamedResource(USER_TRSL,menuItemName);
GetMenuItemText(whichMenu, i + 2, menuItemName);
h = GetNamedResource(USER_TRSL, menuItemName);
if (h != NULL && ResError() == noErr) {
if ( GetHandleSize(h) == 512) {
nNational++;
// Append the table's data to the master array of table data
HUnlock(transTablesHdl);
if (mySetHandleSize(transTablesHdl, (nNational * 512))) {
ReleaseResource(h);
break;
}
HLockHi(transTablesHdl);
if ( GetHandleSize(h) == 512 ) {
HLock(h);
BlockMoveData(*h, (*transTablesHdl) + ((nNational - 1) * 512), 512);
BlockMoveData(*h, *transTablesHdl + i * 512, 512);
}
// Release the resource
ReleaseResource(h);
}
}
}
UseResFile(TelInfo->SettingsFile);
}
/* Converts a char from 8-bit National to 8-bit Macintosh */
void trbuf_nat_mac(unsigned char *buf, short len, short table)
{
short i;
unsigned char *p;
BytePtr table_data;
table_data = ReturnTablePtr(table, FALSE);
for (i=0,p=buf; i<len; i++,p++)
{
*p = table_data[(short)*p];
static void trTECInit()
{
#if GENERATINGPOWERPC
CFragConnectionID connID;
#endif
OSStatus theErr = noErr;
OSStatus res = noErr;
TextEncoding outputEncoding;
TextEncoding inputEncoding;
#if GENERATINGPOWERPC
if (GetSharedLibrary("\pTextCommon", kPowerPCCFragArch, kFindCFrag, &connID, NULL, NULL))
return;
if (FindSymbol( connID, "\pCreateTextEncoding", NULL, NULL ) != noErr)
return;
if (GetSharedLibrary("\pTextEncodingConverter", kPowerPCCFragArch, kFindCFrag, &connID, NULL, NULL))
return;
if (FindSymbol( connID, "\pTECCreateConverter", NULL, NULL ) != noErr)
return;
nNational = 3; // 3 hard-coded translations actually
#endif
}
/*
* inittranslation
*/
void inittranslation(WindRec *tw)
{
short national = tw->innational;
tw->fromconverter = NULL;
tw->toconverter = NULL;
tw->innational = 0x7fff; // force converter to load
tw->incharset = -1;
tw->outnational = 0x7fff; // force converter to load
tw->outcharset = -1;
switchintranslation(tw, national, kASCII);
switchouttranslation(tw, national, kASCII);
}
/*
* disposetranslation
*/
void disposetranslation(WindRec *tw)
{
#if GENERATINGPOWERPC
if ( tw->fromconverter ) {
TECDisposeConverter(tw->fromconverter);
tw->fromconverter = NULL;
}
}
unsigned char ftp_iso_mac(unsigned char *ascii)
{
short b;
b = (short) *ascii;
*ascii = FTPinTable[b];
return (*ascii);
}
void trbuf_ftp_mac(unsigned char *buf, short len)
{
short i;
unsigned char ascii;
unsigned char *p;
for (i=0,p=buf; i<len; i++,p++)
{
ascii = *p;
*p = ftp_iso_mac(&ascii);
if ( tw->toconverter ) {
TECDisposeConverter(tw->toconverter);
tw->toconverter = NULL;
}
#endif
}
/*
* switchintranslation
*/
void switchintranslation(WindRec *tw, short national, short charset)
{
#if GENERATINGPOWERPC
short table;
OSStatus res;
TextEncoding outputEncoding;
TextEncoding inputEncoding;
if (gVSemlogging)
return;
table = GetTranslationIndex(national);
//VSprintf("switchintranslation : %d, %d\n", table, charset);
if ( tw->innational != national ) {
switch ( table ) {
case kTRJIS:
// kTextEncodingJIS_X0208_90 ?
// kTextEncodingJIS_X0212_90 ?
// kTextEncodingJIS_C6226_78 ?
inputEncoding = kTextEncodingISO_2022_JP;
outputEncoding = kTextEncodingMacJapanese;
break;
case kTREUC_JP:
inputEncoding = kTextEncodingEUC_JP;
outputEncoding = kTextEncodingMacJapanese;
break;
case kTShiftJIS:
inputEncoding = kTextEncodingShiftJIS;
outputEncoding = kTextEncodingMacJapanese;
break;
/*
case JISX0212:
inputEncoding = kTextEncodingJIS_X0212_90;
outputEncoding = kTextEncodingMacJapanese;
break;
*/
default:
inputEncoding = 0;
break;
}
if ( tw->fromconverter ) {
TECDisposeConverter(tw->fromconverter);
tw->fromconverter = NULL;
}
VSIw->trincount = 0;
VSIw->trinx = 0;
VSIw->trintag = 0;
if ( inputEncoding ) {
outputEncoding = CreateTextEncoding(outputEncoding, kTextEncodingDefaultVariant, kTextEncodingDefaultFormat);
res = TECCreateConverter(&tw->fromconverter, inputEncoding, outputEncoding);
}
tw->innational = national;
tw->incharset = -1;
}
switch ( table ) {
case kTRJIS:
if ( tw->incharset != charset ) {
tw->incharset = charset;
if ( tw->fromconverter ) {
short srclen;
short dstlen;
unsigned char buf[4];
char *cname = NULL;
dstlen = 4;
res = TECFlushText(tw->fromconverter, buf, dstlen, &dstlen);
switch (charset) {
case kASCII:
cname = "kASCII";
buf[0] = 0x1b;
buf[1] = '(';
buf[2] = 'B';
break;
case kJISX0201_1976:
cname = "kJISX0201_1976";
buf[0] = 0x1b;
buf[1] = '(';
buf[2] = 'J';
break;
case kJISX0208_1978:
cname = "kJISX0208_1978";
buf[0] = 0x1b;
buf[1] = '$';
buf[2] = '@';
break;
case kJISX0208_1983:
cname = "kJISX0208_1983";
buf[0] = 0x1b;
buf[1] = '$';
buf[2] = 'B';
break;
case kJISX0201_1976Kana: // [Not Std ISO-2022-JP]
cname = "kJISX0201_1976Kana";
buf[0] = 0x1b;
buf[1] = '(';
buf[2] = 'I';
break;
case kJISX0212_1990: // [Not Std ISO-2022-JP]
cname = "kJISX0212_1990";
buf[0] = 0x1b;
buf[1] = '$';
buf[2] = 'D';
break;
default:
return;
}
srclen = 3;
dstlen = 4;
res = TECConvertText(tw->fromconverter, buf, srclen, &srclen, buf, dstlen, &dstlen);
if ( res && res != kTECPartialCharErr ) {
VSprintf("TECConvertText switch %s failed : %d\n", cname, res);
}
}
}
break;
}
#else
if (gVSemlogging)
return;
tw->innational = national;
tw->incharset = charset;
#endif
}
/*
* switchouttranslation
*/
void switchouttranslation(WindRec *tw, short national, short charset)
{
#if GENERATINGPOWERPC
short table;
OSStatus res;
TextEncoding outputEncoding;
TextEncoding inputEncoding;
if (gVSemlogging)
return;
table = GetTranslationIndex(national);
//VSprintf("switchouttranslation : %d, %d\n", table, charset);
if ( tw->outnational != national ) {
switch ( table ) {
case kTRJIS:
// kTextEncodingJIS_X0208_90 ?
// kTextEncodingJIS_X0212_90 ?
// kTextEncodingJIS_C6226_78 ?
inputEncoding = kTextEncodingMacJapanese;
outputEncoding = kTextEncodingISO_2022_JP;
break;
case kTREUC_JP:
inputEncoding = kTextEncodingMacJapanese;
outputEncoding = kTextEncodingEUC_JP;
break;
case kTShiftJIS:
inputEncoding = kTextEncodingMacJapanese;
outputEncoding = kTextEncodingShiftJIS;
break;
/*
case JISX0212:
inputEncoding = kTextEncodingMacJapanese;
outputEncoding = kTextEncodingJIS_X0212_90;
break;
*/
default:
inputEncoding = 0;
break;
}
if ( tw->toconverter ) {
TECDisposeConverter(tw->toconverter);
tw->toconverter = NULL;
}
if ( inputEncoding ) {
tw->troutcount = 0;
inputEncoding = CreateTextEncoding(inputEncoding, kTextEncodingDefaultVariant, kTextEncodingDefaultFormat);
res = TECCreateConverter(&tw->toconverter, inputEncoding, outputEncoding);
}
tw->outnational = national;
tw->outcharset = charset;
}
#else
if (gVSemlogging)
return;
tw->outnational = national;
tw->outcharset = charset;
#endif
}
/* flush input translation */
int trflush_nat_mac(WindRec *tw)
{
OSStatus res = 0;
#if GENERATINGPOWERPC
short table;
char buf[32];
ByteCount len;
short charset;
//tw->trincount = 0;
//tw->trinx = 0;
//tw->trintag = 0;
table = GetTranslationIndex(tw->innational);
if ( table < 0 ) {
if ( tw->fromconverter ) {
len = sizeof(buf);
res = TECFlushText(tw->fromconverter, buf, len, &len);
charset = tw->incharset;
tw->incharset = -1;
switchintranslation(tw, tw->innational, charset);
}
}
#endif
return res;
}
/* flush output translation */
int trflush_mac_nat(WindRec *tw)
{
OSStatus res = 0;
#if GENERATINGPOWERPC
short table;
char buf[32];
ByteCount len;
short charset;
tw->troutcount = 0;
table = GetTranslationIndex(tw->outnational);
if ( table < 0 ) {
if ( tw->toconverter ) {
len = sizeof(buf);
res = TECFlushText(tw->toconverter, buf, len, &len);
charset = tw->outcharset;
tw->outcharset = -1;
switchintranslation(tw, tw->outnational, charset);
}
}
#endif
return res;
}
/* Converts a char from 8-bit Macintosh to 8-bit National */
unsigned char mac_nat(unsigned char *ascii, short table)
/* Converts a buffer from 8/16-bit National to 8/16-bit Macintosh */
/* WARNING: ouptut size can be twice as big as input */
int trbuf_nat_mac(WindRec *tw, unsigned char *buf, long *len, unsigned char *out, long *outlen)
{
short b;
BytePtr table_data = ReturnTablePtr(table, TRUE);
b = (short) *ascii;
*ascii = table_data[b];
return (*ascii);
OSStatus res = 0;
short table;
long i = *len;
table = GetTranslationIndex(tw->innational);
if ( table >= 0 ) {
BytePtr table_data = ReturnTablePtr(table, FALSE);
if ( table_data ) {
while (i--)
*out++ = table_data[*buf++];
} else {
memcpy(out, buf, *len);
}
*outlen = *len;
#if GENERATINGPOWERPC
} else {
switch ( table ) {
case kTRJIS:
switch (tw->incharset) {
case kASCII:
case kJISX0201_1976:
case kJISX0208_1978:
case kJISX0208_1983:
case kJISX0212_1990:
if ( tw->fromconverter ) {
res = TECConvertText(tw->fromconverter, buf, *len, len, out, *outlen, outlen);
} else {
memcpy(out, buf, *len);
*outlen = *len;
}
break;
case kJISX0201_1976Kana:
// single byte
// FIXME
memcpy(out, buf, *len);
*outlen = *len;
break;
default:
memcpy(out, buf, *len);
*outlen = *len;
break;
}
break;
case kTREUC_JP:
case kTShiftJIS:
case JISX0212:
if ( tw->fromconverter ) {
res = TECConvertText(tw->fromconverter, buf, *len, len, out, *outlen, outlen);
} else {
memcpy(out, buf, *len);
*outlen = *len;
}
break;
default:
memcpy(out, buf, *len);
*outlen = *len;
break;
}
#endif
}
return res;
}
unsigned char ftp_mac_iso(unsigned char *ascii)
/* Converts a buffer from 8/16-bit Macintosh to 8/16-bit National */
/* WARNING: ouptut size can be twice as big as input */
int trbuf_mac_nat(WindRec *tw, unsigned char *buf, long *len, unsigned char *out, long *outlen)
{
short b;
b = (short) *ascii;
*ascii = FTPoutTable[b];
return (*ascii);
OSStatus res = 0;
short table;
short i = *len;
table = GetTranslationIndex(tw->outnational);
if ( table >= 0 ) {
BytePtr table_data = ReturnTablePtr(table, TRUE);
if ( table_data ) {
while (i--)
*out++ = table_data[*buf++];
} else {
memcpy(out, buf, *len);
}
*outlen = *len;
#if GENERATINGPOWERPC
} else {
switch ( table ) {
case kTRJIS:
case kTREUC_JP:
case kTShiftJIS:
case JISX0212:
if ( tw->toconverter ) {
res = TECConvertText(tw->toconverter, buf, *len, len, out, *outlen, outlen);
} else {
memcpy(out, buf, *len);
*outlen = *len;
}
break;
default:
memcpy(out, buf, *len);
*outlen = *len;
break;
}
#endif
}
return res;
}
void trbuf_mac_nat(unsigned char *buf, short len, short table)
/* Converts a handle from 8/16-bit National to 8/16-bit Macintosh */
Handle htrbuf_nat_mac(WindRec *tw, Handle hin)
{
short i;
unsigned char ascii;
unsigned char *p;
for (i=0,p=buf; i<len; i++,p++)
{
ascii = *p;
*p = mac_nat(&ascii, table);
long len = GetHandleSize(hin);
long outlen = len * 2;
Handle hout = NewHandle(outlen);
if (hout) {
HLock(hin);
HLock(hout);
trbuf_nat_mac(tw, (unsigned char *)*hin, &len, *hout, &outlen);
DisposeHandle(hin);
HUnlock(hout);
SetHandleSize(hout, outlen);
return hout;
} else {
/* failed ... */
return hin;
}
}
void trbuf_mac_ftp(unsigned char *buf, short len)
/* Converts a handle from 8/16-bit Macintosh to 8/16-bit National */
Handle htrbuf_mac_nat(WindRec *tw, Handle hin)
{
short i;
unsigned char ascii;
unsigned char *p;
for (i=0,p=buf; i<len; i++,p++)
{
ascii = *p;
*p = ftp_mac_iso(&ascii);
long len = GetHandleSize(hin);
long outlen = len * 2;
Handle hout = NewHandle(outlen);
if (hout) {
HLock(hin);
HLock(hout);
trbuf_mac_nat(tw, (unsigned char *)*hin, &len, *hout, &outlen);
DisposeHandle(hin);
HUnlock(hout);
SetHandleSize(hout, outlen);
return hout;
} else {
/* failed ... */
return hin;
}
}
}
unsigned char ftp_iso_mac(unsigned char *ascii)
{
if ( FTPinTable ) {
*ascii = FTPinTable[*ascii];
}
return *ascii;
}
unsigned char ftp_mac_iso(unsigned char *ascii)
{
if ( FTPoutTable ) {
*ascii = FTPoutTable[*ascii];
}
return *ascii;
}
void trbuf_ftp_mac(unsigned char *buf, short len)
{
if ( FTPinTable )
while (len--)
*buf++ = FTPinTable[*buf];
}
void trbuf_mac_ftp(unsigned char *buf, short len)
{
if ( FTPoutTable )
while (len--)
*buf++ = FTPoutTable[*buf];
}

View File

@ -1,13 +1,34 @@
short transBuffer(short oldtable, short newtable);
BytePtr GetTranslationResource(short id);
BytePtr ReturnTablePtr(short table, Boolean out);
void Setup_Default_Tables(void);
void trInit(MenuHandle whichMenu);
unsigned char ftp_iso_mac(unsigned char *ascii);
void trbuf_nat_mac(unsigned char *buf, short len, short table);
void trbuf_ftp_mac(unsigned char *buf, short len);
unsigned char mac_nat(unsigned char *ascii, short table);
unsigned char ftp_mac_iso(unsigned char *ascii);
void trbuf_mac_nat(unsigned char *buf, short len, short table);
void trbuf_mac_ftp(unsigned char *buf, short len);
void trInit(MenuHandle whichMenu);
void BuildTranslateMenu(MenuHandle whichMenu);
short GetTranslationIndex(short id);
short transBuffer(short oldtable, short newtable);
BytePtr GetTranslationResource(short id);
BytePtr ReturnTablePtr(short table, Boolean out);
void Setup_Default_Tables(void);
void inittranslation(WindRec *tw);
void disposetranslation(WindRec *tw);
void switchintranslation(WindRec *tw, short national, short charset);
void switchouttranslation(WindRec *tw, short national, short charset);
int trflush_nat_mac(WindRec *tw);
int trflush_mac_nat(WindRec *tw);
int trbuf_nat_mac(WindRec *tw, unsigned char *buf, long *len, unsigned char *out, long *outlen);
int trbuf_mac_nat(WindRec *tw, unsigned char *buf, long *len, unsigned char *out, long *outlen);
Handle htrbuf_nat_mac(WindRec *tw, Handle hin);
Handle htrbuf_mac_nat(WindRec *tw, Handle hin);
unsigned char ftp_mac_iso(unsigned char *ascii);
unsigned char ftp_iso_mac(unsigned char *ascii);
void trbuf_mac_ftp(unsigned char *buf, short len);
void trbuf_ftp_mac(unsigned char *buf, short len);

File diff suppressed because it is too large Load Diff

View File

@ -41,6 +41,8 @@ extern WindRec *ssh2_window();
extern void setctxprompt(const char *prompt);
extern char *getctxprompt();
extern pthread_key_t ssh2threadkey;
extern TelInfoRec *TelInfo;
extern Boolean gAEavail;
@ -390,7 +392,7 @@ static void GetLabelFromPrompt(const char *prompt, StringPtr host, StringPtr use
memcpy( host, p, *p + 1 );
p = wind->sshdata.login;
memcpy( user, p, *p + 1 );
} else {
} else if (pthread_getspecific(ssh2threadkey)) {
/* use key label as both host name and user name */
int l = strlen(prompt);
*host = 4 + l;
@ -398,6 +400,13 @@ static void GetLabelFromPrompt(const char *prompt, StringPtr host, StringPtr use
memcpy(host + 5, prompt, l);
*user = l;
memcpy(user + 1, prompt, l);
} else {
int l = strlen(prompt);
*host = 6 + l;
memcpy(host + 1, "Macro ", 6);
memcpy(host + 7, prompt, l);
*user = l;
memcpy(user + 1, prompt, l);
}
}
@ -460,10 +469,14 @@ static void AddPassToKeychain(const char *prompt, StringPtr password)
*password, password + 1, &theItem);
if (theStatus == noErr) {
unsigned char *theDescriptionText;
if (strstr(prompt, "assword for"))
theDescriptionText = "\pMacSSH password";
else
theDescriptionText = "\pMacSSH passphrase";
if (pthread_getspecific(ssh2threadkey)) {
if (strstr(prompt, "assword for"))
theDescriptionText = "\pMacSSH password";
else
theDescriptionText = "\pMacSSH passphrase";
} else {
theDescriptionText = "\pMacSSH macro password";
}
theAttribute.tag = kDescriptionKCItemAttr;
theAttribute.length = *theDescriptionText;
theAttribute.data = theDescriptionText + 1;
@ -510,11 +523,14 @@ Boolean SSH2PasswordDialog(const char *prompt, StringPtr password)
Boolean addKey = false;
ModalFilterUPP internalBufferFilterUPP;
ConstStringPtr keyPrompt = "\pEnter passphrase for private key ";
ConstStringPtr macroPrompt = "\pEnter password for macro ";
WindRec *wind;
#if GENERATINGCFM
if ( strcmp(prompt, getctxprompt()) && GetPassFromKeychain(prompt, password) ) {
setctxprompt(prompt);
if ( (!pthread_getspecific(ssh2threadkey) || strcmp(prompt, getctxprompt()))
&& GetPassFromKeychain(prompt, password) ) {
if (pthread_getspecific(ssh2threadkey))
setctxprompt(prompt);
return true;
}
#endif
@ -536,10 +552,14 @@ Boolean SSH2PasswordDialog(const char *prompt, StringPtr password)
if ( wind && strstr(prompt, "assword for") ) {
pprompt[0] = strlen(prompt);
memcpy(pprompt + 1, prompt, pprompt[0]);
} else {
} else if (pthread_getspecific(ssh2threadkey)) {
memcpy(pprompt, keyPrompt, keyPrompt[0] + 1);
memcpy(pprompt + pprompt[0] + 1, prompt, strlen(prompt));
pprompt[0] += strlen(prompt);
} else {
memcpy(pprompt, macroPrompt, macroPrompt[0] + 1);
memcpy(pprompt + pprompt[0] + 1, prompt, strlen(prompt));
pprompt[0] += strlen(prompt);
}
GetDialogItem(dlog, 5, &itemType, &itemHandle, &itemRect);
SetDialogItemText(itemHandle, pprompt);

View File

@ -404,7 +404,7 @@ int WriteCharsToTTY(int id, void *ctx, char *buffer, int n)
written = n;
}
/*
syslog( 0, "write\n");
syslog( 0, "from ssh\n");
dumpln(0, 0, buffer, written);
*/
return written;
@ -456,7 +456,7 @@ int ReadCharsFromTTY(int id, void *ctx, char *buffer, int n)
buffer[0] = EOF;
}
/*
syslog( 0, "read\n");
syslog( 0, "to ssh\n");
dumpln(0, 0, buffer, len);
*/
return len;

View File

@ -269,7 +269,15 @@ short drawc(short vw, short c) /* character to draw */
if ((c < 32) || (c > 137))
return(0); // Is this return value correct?
c -= 32;
pstroke = (VGwin[vw]->TEKtype) ? VGTEKfont[c] : VGfont[c];
/* bounds checking to avoid crash... */
//pstroke = (VGwin[vw]->TEKtype) ? VGTEKfont[c] : VGfont[c];
if (VGwin[vw]->TEKtype) {
pstroke = (c < (sizeof(VGTEKfont) / sizeof(VGTEKfont[0]))) ? VGTEKfont[c] : "";
} else {
pstroke = (c < (sizeof(VGfont) / sizeof(VGfont[0]))) ? VGfont[c] : "";
}
while (*pstroke)
{
strokex = x;
@ -383,6 +391,10 @@ short VGnewwin
short vw = 0;
short theScrn;
theScrn = findbyVS(theVS);
if (theScrn < 0)
return(-1);
while ((vw < MAXVG) && (VGwin[vw] != nil)) vw++;
if (vw == MAXVG)
return(-1);
@ -403,7 +415,6 @@ short VGnewwin
VGwin[vw]->RGdevice = device;
VGwin[vw]->RGnum = (*RG[device].newwin)();
theScrn = findbyVS(theVS);
VGwin[vw]->TEKtype = screens[theScrn].tektype; // 0 = 4014, 1 = 4105
if (VGwin[vw]->RGnum < 0)
@ -518,6 +529,7 @@ void VGdumpstore(short vw, short (*func )(short))
*/
void VGdraw(short vw, char c) /* the latest input char */
{
short sn;
char cmd;
char value;
char goagain; /* true means go thru the function a second time */
@ -528,10 +540,14 @@ void VGdraw(short vw, char c) /* the latest input char */
if (VGcheck(vw)) {
return;
}
}
vp = VGwin[vw]; /* BYU */
sn = findbyVS(vp->theVS);
if (sn < 0)
return;
temp[0] = c;
temp[1] = (char) 0;
@ -808,7 +824,7 @@ void VGdraw(short vw, char c) /* the latest input char */
state[vw] = DONE;
break;
case 12: /* form feed = clrscr */
if (screens[findbyVS(vp->theVS)].tekclear) {
if (sn >= 0 && screens[sn].tekclear) {
VGpage(vw);
VGclrstor(vw);
}

Binary file not shown.

Binary file not shown.