From 7d34860cf0955724dd4e144b13e6cfb796cb7a5e Mon Sep 17 00:00:00 2001 From: chombier <> Date: Mon, 30 Apr 2001 09:36:00 +0000 Subject: [PATCH] added double size support --- macssh/source/Screens/rsinterf.c | 26 +-- macssh/source/Screens/rsmac.c | 268 ++++++++++++++++--------- macssh/source/Screens/rsmac.proto.h | 15 +- macssh/source/Screens/vsdata.h | 5 + macssh/source/Screens/vsinterf.c | 179 +++++++++++++---- macssh/source/Screens/vsinterf.proto.h | 1 + macssh/source/Screens/vsintern.c | 136 +++++++++---- macssh/source/Screens/vsintern.proto.h | 2 +- macssh/source/Screens/vskeys.h | 12 +- macssh/source/parse/parse.c | 10 +- macssh/source/parse/vsem.c | 89 +++++--- 11 files changed, 516 insertions(+), 227 deletions(-) diff --git a/macssh/source/Screens/rsinterf.c b/macssh/source/Screens/rsinterf.c index 9b619db..60ed55c 100755 --- a/macssh/source/Screens/rsinterf.c +++ b/macssh/source/Screens/rsinterf.c @@ -119,7 +119,7 @@ void RSselect( short w, Point pt, EventRecord theEvent) } else if (theEvent.modifiers & cmdKey) { // a command click means we should look for a url - if ((RSlocal[w].selected)&(PointInSelection(curr, w))) //we have a selection already + if ( RSTextSelected(w) && PointInSelection(curr, w) ) //we have a selection already HandleURL(w); else { // we need to find the url around this pnt @@ -134,6 +134,7 @@ void RSselect( short w, Point pt, EventRecord theEvent) 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 */ @@ -152,7 +153,6 @@ void RSselect( short w, Point pt, EventRecord theEvent) { /* start new selection */ curr = RSlocal[w].anchor = RSlocal[w].last = normalize(pt, w,TRUE); - RSlocal[w].selected = 1; } while (StillDown()) @@ -168,9 +168,8 @@ void RSselect( short w, Point pt, EventRecord theEvent) } /* while */ } - - if (EqualPt(RSlocal[w].anchor, RSlocal[w].last)) RSlocal[w].selected = 0; - else RSlocal[w].selected = 1; + RSlocal[w].selected = !EqualPt(RSlocal[w].anchor, RSlocal[w].last); + SetMenusForSelection((short)RSlocal[w].selected); } /* RSselect */ @@ -185,8 +184,8 @@ void RSselect( short w, Point pt, EventRecord theEvent) RSinvText(w, RSlocal[ w].anchor, RSlocal[w].last, &noConst); } } - Boolean PointInSelection(Point curr, short w) - { +Boolean PointInSelection(Point curr, short w) +{ long beg_offset, end_offset, current_offset; short columns; columns = VSgetcols(w); @@ -199,8 +198,9 @@ void RSselect( short w, Point pt, EventRecord theEvent) return TRUE; else return FALSE; - } - void RSzoom +} + +void RSzoom ( GrafPtr window, /* window to zoom */ short code, /* inZoomIn or inZoomOut */ @@ -1440,13 +1440,7 @@ static void HandleDoubleClick(short w, short modifiers) } if (leftLoc.h != rightLoc.h) { /* we selected something */ -#if 0 - RSlocal[w].anchor = leftLoc; /* new left bound */ - RSlocal[w].last = rightLoc; /* and a matching new right bound */ - RSlocal[w].selected = 1; /* give me credit for the selection I just made */ - RSinvText(w, RSlocal[w].anchor, /* time to show it off */ - RSlocal[w].last, &noConst); -#endif + HiliteThis(w, leftLoc, rightLoc); if (modifiers & cmdKey) // Possible URL selection diff --git a/macssh/source/Screens/rsmac.c b/macssh/source/Screens/rsmac.c index b6ed2bd..e8ed920 100755 --- a/macssh/source/Screens/rsmac.c +++ b/macssh/source/Screens/rsmac.c @@ -37,7 +37,7 @@ * Macintosh only Routines: * NI RSregnconv( *) - Convert region to rect coords * NI RSsetwind(w) - Set the port and vars to window w - * NI RSsetattr(a) - Set font/text style to a + * NI RSsetattr(la, a) - Set font/text style to a * NI RSsetConst(w) * ML RSattach(w,wind) - Attach the RS (w) to window wind * ML RSdetach(w) - Ready window for go-away @@ -133,6 +133,7 @@ Boolean gHasSetWindowContentColor = 0; #endif short RSw=-1; /* last window used */ +short RSla=0; /* last line attrib used */ VSAttrib RSa=0; /* last attrib used */ extern long RScolors[]; @@ -204,6 +205,7 @@ short RSsetwind RScurrent = RSlocal + w; RSw = w; RSa = -1; /* attributes will need setting */ + RSla = 0; SetPort(RScurrent->window); return(1); } @@ -265,24 +267,42 @@ void 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; + if ( RSlocal[w].skip || RSlocal[w].cursorstate ) return; RSsetwind(w); - RScurrent->cursor.left = x * RScurrent->fwidth; + xw = RScurrent->fwidth; + if ((la & 3)) { + // 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; switch (RScurrent->cursType) { case UNDERSCORECURSOR: RScurrent->cursor.top += RScurrent->fheight; - RScurrent->cursor.right = RScurrent->cursor.left + RScurrent->fwidth; + RScurrent->cursor.right = RScurrent->cursor.left + xw; RScurrent->cursor.bottom = RScurrent->cursor.top + 1; break; case VERTICALCURSOR: @@ -295,23 +315,23 @@ void RScurson RScurrent->cursor.bottom = RScurrent->cursor.top; break; case LOWER_THIRDCURSOR: - RScurrent->cursor.right = RScurrent->cursor.left + RScurrent->fwidth; + RScurrent->cursor.right = RScurrent->cursor.left + xw; RScurrent->cursor.bottom = RScurrent->cursor.top + RScurrent->fheight; RScurrent->cursor.top += 2 * RScurrent->fheight / 3; break; case LOWER_HALFCURSOR: - RScurrent->cursor.right = RScurrent->cursor.left + RScurrent->fwidth; + RScurrent->cursor.right = RScurrent->cursor.left + xw; RScurrent->cursor.bottom = RScurrent->cursor.top + RScurrent->fheight; RScurrent->cursor.top += RScurrent->fheight / 2; break; case TWO_THIRDSCURSOR: - RScurrent->cursor.right = RScurrent->cursor.left + RScurrent->fwidth; + RScurrent->cursor.right = RScurrent->cursor.left + xw; RScurrent->cursor.bottom = RScurrent->cursor.top + RScurrent->fheight; RScurrent->cursor.top += RScurrent->fheight / 3; break; case BLOCKCURSOR: default: - RScurrent->cursor.right = RScurrent->cursor.left + RScurrent->fwidth; + RScurrent->cursor.right = RScurrent->cursor.left + xw; RScurrent->cursor.bottom = RScurrent->cursor.top + RScurrent->fheight; break; } @@ -334,24 +354,38 @@ void RScurson } /* RScurson */ -void RSsetattr(VSAttrib a) +void RSsetattr(short la, VSAttrib a) { - short fg, bg, tempFontID; // RAB BetterTelnet 1.0fc4 + short fg; + short bg; + short tempFontID; + short size; short face; static GrafPtr lastPort; - if (RSa!=-1 && RSa==a && qd.thePort==lastPort) return; + if ( RSa != -1 && RSla == la && RSa == a && qd.thePort == lastPort ) + return; lastPort = qd.thePort; + RSla = la; RSa = a; - if (VSisgrph(a)) { + size = ((la & 3)) ? 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); + TextFont( gNCSAFontID ); } else { - RSTextFont(RScurrent->fnum,RScurrent->fsiz,VSisbold(a) && RScurrent->allowBold); /* BYU - use user-selected text font */ + 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(RScurrent->fsiz); + TextSize(size); face = VSisundl(a) ? underline : 0; if ( VSisbold(a) && RScurrent->allowBold && RScurrent->realbold ) { @@ -454,15 +488,15 @@ short tempFontID; // RAB BetterTelnet 1.0fc4 #define LMSetHiliteMode(HiliteModeValue) ((* (unsigned char *) 0x0938) = (HiliteModeValue)) #endif -void DoHiliteMode(void) /* BYU LSC */ +void DoHiliteMode(void) /* enables use of highlighting in place of simple color inversion for next QuickDraw operation. */ - { - +{ LMSetHiliteMode(LMGetHiliteMode() & 0x7F); // char *p = (char *) 0x938; /* pointer to HiliteMode low-memory global */ // *p = *p & 0x7f; /* clear the HiliteBit */ - } /* HiliteMode */ +} /* DoHiliteMode */ + void RSinvText ( @@ -479,28 +513,29 @@ void RSinvText RSsetwind(w); /* normalize coordinates with respect to visible area of virtual screen */ + curr.v -= RScurrent->topline; curr.h -= RScurrent->leftmarg; last.v -= RScurrent->topline; last.h -= RScurrent->leftmarg; - /* normalize colors */ - RSsetattr(0); - //VSIGetLineStart( w, RScurrent->anchor.v)[RScurrent->anchor.h] + if ( !RSlocal[w].selected ) { + /* FIXME: we should use the background color of every char */ + /* normalize colors */ + RSsetattr(0, 0); + //RSsetattr(VSIGetLineStart( w, RScurrent->anchor.v)->attr[RScurrent->anchor.h]); + } - if (curr.v == last.v) - { + if (curr.v == last.v) { /* highlighted text all on one line */ - if (curr.h < last.h) /* get bounds the right way round */ - { + if (curr.h < last.h) { ub = curr; lb = last; - } - else - { + } else { ub = last; lb = curr; - } /* if */ + } /* if */ + MYSETRECT /* set up rectangle bounding area to be highlighted */ ( temp, @@ -512,10 +547,10 @@ void RSinvText SectRect(&temp, constrain, &temp2); /* clip to constraint rectangle */ DoHiliteMode(); /* BYU LSC */ InvertRect(&temp2); - } - else - { - /* highlighting across more than one line */ + + } else { + + /* highlighting across more than one line */ if (curr.v < last.v) ub = curr; else @@ -547,8 +582,8 @@ void RSinvText DoHiliteMode(); /* BYU LSC */ InvertRect(&temp2); - if (lb.v - ub.v > 1) /* highlight extends across more than two lines */ - { + if (lb.v - ub.v > 1) { + /* highlight extends across more than two lines */ /* highlight complete in-between lines */ MYSETRECT ( @@ -562,12 +597,12 @@ void RSinvText DoHiliteMode(); /* BYU LSC */ InvertRect(&temp2); - } /* if */ - } /* if */ + } /* if */ + } /* if */ - RSsetattr(VSIw->attrib); + RSsetattr(VSIw->lattrib, VSIw->attrib); - } /* RSinvText */ +} /* RSinvText */ /* @@ -579,6 +614,7 @@ void RSdraw short w, /* window number */ short x, /* starting column */ short y, /* line on which to draw */ + short la, /* line attribute */ VSAttrib a, /* text attributes */ short len, /* length of text to draw */ char *ptr /* pointer to text */ @@ -588,6 +624,7 @@ void RSdraw within the current selection, it will be highlighted. */ { Rect rect; + short xw; short ys; RgnHandle oldClip; @@ -595,17 +632,24 @@ void RSdraw return; RSsetwind(w); + xw = RScurrent->fwidth; + if ((la & 3)) { + // double width + xw <<= 1; + } + ys = y * RScurrent->fheight; + MYSETRECT /* set up rectangle bounding text being drawn */ ( rect, - x * RScurrent->fwidth, + x * xw, ys, - (x + len) * RScurrent->fwidth, + (x + len) * xw, ys + RScurrent->fheight ); - RSsetattr(a); + RSsetattr(la, a); if (rect.left <= 0) /* little buffer strip on left */ rect.left = CHO; @@ -623,7 +667,12 @@ void RSdraw if (rect.bottom >= RScurrent->height) rect.bottom = RScurrent->height; - MoveTo(x * RScurrent->fwidth, ys + RScurrent->fascent); + if ((la & 1)) { + // Upper part + ys += RScurrent->fheight; + } + + MoveTo(rect.left, ys + RScurrent->fascent); oldClip = NewRgn(); GetClip(oldClip); @@ -634,22 +683,15 @@ void RSdraw SetClip(oldClip); DisposeRgn(oldClip); -/* - if ( rect.bottom < RScurrent->height || !VSisundl(a) ) { - DrawText(ptr, 0, len); - } else { - ++rect.right; - TETextBox(ptr, len, &rect, teJustLeft); - --rect.right; - } -*/ - if (RScurrent->selected) { + /* highlight any part of selection covering the newly-inserted text */ RSinvText(w, RScurrent->anchor, RScurrent->last, &rect); } + ValidRect(&rect); - } /* RSdraw */ +} /* RSdraw */ + /* * ScrollRectInRgn @@ -693,9 +735,9 @@ void RSdefaultattr(short w) short screenIndex; if ( screens[findbyVS(w)].vtemulation < 2 ) - RSsetattr(0); + RSsetattr(VSIw->lattrib, 0); else - RSsetattr(VSIw->attrib); + RSsetattr(VSIw->lattrib, VSIw->attrib); } /* @@ -711,11 +753,20 @@ void RSdelcols specified number of columns to the left, blanking out the newly-revealed area. */ { + short xw; Rect rect; if (RSlocal[w].skip) return; RSsetwind(w); + + xw = RScurrent->fwidth; +/* + if ((la & 3)) { + // double width + xw <<= 1; + } +*/ MYSETRECT /* bounds of entire text area, for scrolling */ ( rect, @@ -725,11 +776,11 @@ void RSdelcols RScurrent->height ); - ScrollRectInRgn(RScurrent->window, &rect, - (n * RScurrent->fwidth), 0); + ScrollRectInRgn(RScurrent->window, &rect, - (n * xw), 0); if ( RScurrent->selected ) { /* bounds of newly-revealed area */ - rect.left = RScurrent->width - (n * RScurrent->fwidth); + rect.left = RScurrent->width - (n * xw); /* highlight any newly-revealed part of the current selection */ RSinvText(w, RScurrent->anchor, RScurrent->last, &rect); } @@ -743,6 +794,7 @@ void RSdelcols void RSdelchars ( short w, /* affected window */ + short la, /* line attributes */ short x, /* column to delete from */ short y, /* line on which to do deletion */ short n /* number of characters to delete */ @@ -751,28 +803,35 @@ void RSdelchars position to the right, moving the remainder of the line to the left. */ { + short xw; Rect rect; if (RSlocal[w].skip) return; RSsetwind(w); -// RSsetattr(0); /* avoid funny pen modes */ +// RSsetattr(VSIw->lattrib, 0); /* avoid funny pen modes */ RSdefaultattr(w); + xw = RScurrent->fwidth; + if ((la & 3)) { + // double width + xw <<= 1; + } + MYSETRECT /* bounds of area from starting column to end of line */ ( rect, - x * RScurrent->fwidth, + x * xw, y * RScurrent->fheight, RScurrent->width, (y + 1) * RScurrent->fheight ); - if ((x + n) * RScurrent->fwidth > RScurrent->width) { + if ((x + n) * xw > RScurrent->width) { /* deleting to end of line */ EraseRect(&rect); } else { /* scroll remainder of line to the left */ - ScrollRectInRgn(RScurrent->window, &rect, - (n * RScurrent->fwidth), 0); + ScrollRectInRgn(RScurrent->window, &rect, - (n * xw), 0); if ( RScurrent->selected ) { HLock((Handle) RSuRgn); RSinvText(w, RScurrent->anchor, RScurrent->last, &((*RSuRgn)->rgnBBox)); @@ -780,22 +839,22 @@ void RSdelchars if ( RScurrent->anchor.v <= y && y <= RScurrent->last.v ) { if ( x <= RScurrent->anchor.h ) { // deselect left part - rect.left = (RScurrent->anchor.h + 1 - n) * RScurrent->fwidth; - rect.right = (RScurrent->anchor.h + 1) * RScurrent->fwidth; + rect.left = (RScurrent->anchor.h + 1 - n) * xw; + rect.right = (RScurrent->anchor.h + 1) * xw; DoHiliteMode(); InvertRect(&rect); } if ( x <= RScurrent->last.h ) { // select right part - rect.left = (RScurrent->last.h + 1 - n) * RScurrent->fwidth; - rect.right = (RScurrent->last.h + 1) * RScurrent->fwidth; + rect.left = (RScurrent->last.h + 1 - n) * xw; + rect.right = (RScurrent->last.h + 1) * xw; DoHiliteMode(); InvertRect(&rect); } } } } - RSsetattr(VSIw->attrib); /* restore mode for text drawing */ + RSsetattr(VSIw->lattrib, VSIw->attrib); /* restore mode for text drawing */ } /* RSdelchars */ void RSdellines @@ -822,7 +881,7 @@ void RSdellines RSsetwind(w); RSsetConst(w); -// RSsetattr(0); /* avoid funny pen modes */ +// RSsetattr(VSIw->lattrib, 0); /* avoid funny pen modes */ RSdefaultattr(w); if (scrolled) @@ -850,7 +909,7 @@ void RSdellines ScrollRectInRgn(RScurrent->window, &rect, 0, -RScurrent->fheight * n); - RSsetattr(VSIw->attrib); /* restore mode for text drawing */ + RSsetattr(VSIw->lattrib, VSIw->attrib); /* restore mode for text drawing */ } /* RSdellines */ void RSerase @@ -870,7 +929,7 @@ void RSerase return; RSsetwind(w); -// RSsetattr(0); /* avoid funny pen modes */ +// RSsetattr(VSIw->lattrib, 0); /* avoid funny pen modes */ RSdefaultattr(w); MYSETRECT @@ -893,7 +952,7 @@ void RSerase /* highlight any part of the selection within the cleared area */ RSinvText(w, RScurrent->anchor, RScurrent->last, &rect); - RSsetattr(VSIw->attrib); /* restore mode for text drawing */ + RSsetattr(VSIw->lattrib, VSIw->attrib); /* restore mode for text drawing */ } /* RSerase */ @@ -914,7 +973,7 @@ void RSinslines return; RSsetwind(w); RSsetConst(w); -// RSsetattr(0); /* avoid funny pen modes */ +// RSsetattr(VSIw->lattrib, 0); /* avoid funny pen modes */ RSdefaultattr(w); if (RScurrent->selected && (scrolled < 0)) @@ -934,7 +993,7 @@ void RSinslines ScrollRectInRgn(RScurrent->window, &rect, 0, RScurrent->fheight * n); - RSsetattr(VSIw->attrib); /* restore mode for text drawing */ + RSsetattr(VSIw->lattrib, VSIw->attrib); /* restore mode for text drawing */ } /* RSinslines */ void RSinscols @@ -952,6 +1011,14 @@ void RSinscols if (RSlocal[w].skip) return; RSsetwind(w); + +/* + if ((VSIw->lattrib & 3)) { + // double width + xw <<= 1; + } +*/ + MYSETRECT /* bounds of entire text area */ ( rect, @@ -975,6 +1042,7 @@ void RSinsstring short w, /* affected window */ short x, /* starting column at which to insert */ short y, /* line on which to insert */ + short la, /* line attribute */ VSAttrib a, /* attributes for inserted text */ short len, /* length of inserted text */ char *ptr /* pointer to inserted text */ @@ -983,33 +1051,54 @@ void RSinsstring the rest of the line to the right. Highlights any part of the newly- inserted text lying within the current selection. */ { + short xw; + short ys; Rect rect; RgnHandle oldClip; if (RSlocal[w].skip) return; RSsetwind(w); + + xw = RScurrent->fwidth; + if ((la & 3)) { + // double width + xw <<= 1; + } + + ys = y * RScurrent->fheight; + MYSETRECT /* bounds of part of line from specified position to end of line */ ( rect, - x * RScurrent->fwidth, - y * RScurrent->fheight, + x * xw, + ys, RScurrent->width, (y + 1) * RScurrent->fheight ); /* scroll remainder of line to the right */ - ScrollRectInRgn(RScurrent->window, &rect, len * RScurrent->fwidth, 0); + ScrollRectInRgn(RScurrent->window, &rect, len * xw, 0); + + RSsetattr(la, a); /* bounds area to contain inserted string */ - rect.right = (x + len) * RScurrent->fwidth; + rect.right = (x + len) * xw; + + if (rect.left <= 0) /* little buffer strip on left */ + rect.left = CHO; + EraseRect(&rect); /* erase area to appropriate background */ - MoveTo - ( - rect.left, - rect.top + RScurrent->fascent - ); - RSsetattr(a); + + if (rect.left <= 0) + rect.left = 0; + + if ((la & 1)) { + // Upper part + ys += RScurrent->fheight; + } + + MoveTo( rect.left, ys + RScurrent->fascent ); oldClip = NewRgn(); GetClip(oldClip); @@ -1020,20 +1109,13 @@ void RSinsstring SetClip(oldClip); DisposeRgn(oldClip); -/* - if ( rect.bottom < RScurrent->height || !VSisundl(a) ) { - DrawText(ptr, 0, len); - } else { - ++rect.right; - TETextBox(ptr, len, &rect, teJustLeft); - --rect.right; - } -*/ - if (RScurrent->selected) + if (RScurrent->selected) { /* highlight any part of selection covering the newly-inserted text */ RSinvText(w, RScurrent->anchor, RScurrent->last, &rect); + } ValidRect(&rect); + } /* RSinsstring */ diff --git a/macssh/source/Screens/rsmac.proto.h b/macssh/source/Screens/rsmac.proto.h index a84cb58..701f3fe 100755 --- a/macssh/source/Screens/rsmac.proto.h +++ b/macssh/source/Screens/rsmac.proto.h @@ -8,31 +8,26 @@ void RSsetConst(short w); short RSsetwind(short w); void RSbell(short w); void RScursoff(short w); -void RScurson(short w, short x, short y); -void RSsetattr(VSAttrib a); +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, VSAttrib a, short len, char *ptr); +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 x, short y, 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); void RSerase(short w, short x1, short y1, short x2, short y2); void RSinslines(short w, short t, short b, short n, short scrolled); void RSinscols(short w, short n); -void RSinsstring(short w, short x, short y, VSAttrib a, short len, char *ptr); +void RSinsstring(short w, short x, short y, short la, VSAttrib a, short len, char *ptr); void RSmargininfo(short w, short total, short current); void RSbufinfo(short w, short total, short current, short bottom); -void RSattach(short w, GrafPtr wind); -void RSdetach(short w); short RSfindscroll(ControlHandle control, short *n); void RSregnconv(RgnHandle regn, short *x1, short *y1, short *x2, short *y2, short fh, short fw); -short RSupdprint(WindowPeek wind); Point normalize(Point in_long, short w, Boolean autoScroll); void RSsortAnchors(short w); void RSsetsize(short w, short v, short h, short screenIndex); -void RSdrawsep(short w, short y1, short draw); void RSbackground(short w, short value); void RScheckmaxwind(Rect *origRect, short origW, short origH, short *endW, short *endH); void RSTextFont(short myfnum, short myfsiz, short myface); -Boolean SelectURLAroundPoint(Point current); diff --git a/macssh/source/Screens/vsdata.h b/macssh/source/Screens/vsdata.h index 3dfb91d..1ae65e9 100755 --- a/macssh/source/Screens/vsdata.h +++ b/macssh/source/Screens/vsdata.h @@ -32,6 +32,8 @@ typedef struct VSline struct VSline /* doubly-linked list of lines */ *next, /* Pointer to next line */ *prev; /* Pointer to previous line */ + short + lattr; /* line attributes */ char // Text for the line -- may be part of a block *text; /* of memory containing more than one line */ VSAttrib @@ -47,6 +49,8 @@ typedef struct VSattrline //CCP 2.7 ANSI needs shorts /* doubly-linked list of lines */ *next, /* Pointer to next line */ *prev; /* Pointer to previous line */ + short + lattr; /* line attributes */ VSAttrib // macblue, now use 16 bit attribute; 8 for normal, 8 for ansi color *text; /* of memory containing more than one line */ char @@ -76,6 +80,7 @@ struct VSscrn { forcesave, /* NCSA 2.5: always force lines to be saved off top */ possibleForce, //we have receive a "move to 0,0"; if next is EEOl, forcesave ESscroll; /* Scroll screen when ES received */ + short lattrib; /* current lineattributes */ VSAttrib attrib; /* current character writing attributes */ short x,y; /* current cursor positon */ short Px,Py; /* saved cursor position and writing attributes */ diff --git a/macssh/source/Screens/vsinterf.c b/macssh/source/Screens/vsinterf.c index 1ea7b3d..0e5077b 100755 --- a/macssh/source/Screens/vsinterf.c +++ b/macssh/source/Screens/vsinterf.c @@ -77,10 +77,11 @@ unsigned short VSIkpnums[] = // RAB BetterTelnet 2.0b5 - macro numbers 70, 72, 73, 50, 51, 52, 53 }; */ unsigned short VSIkpnums[] = // RAB BetterTelnet 2.0b5 - macro numbers - { 24, 25, 26, 22, 27, 28, 0, 40, 0, 42, 0, 43, 0, 29, 0, 41, - 0, 44, 58, 56, 54, 59, 23, 57, 21, 55, 20, 27, 0, 0, 0, 0, - 0, 90, 91, 93, 92, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 81, - 80, 82, 83, 50, 51, 52, 53 }; + { 24, 25, 26, 22, 27, 28, 0, 40, 0, 42, 0, + 43, 0, 29, 0, 41, 0, 44, 58, 56, 54, 59, + 23, 57, 21, 55, 20, 27, 0, 0, 0, 0, 0, + 90, 91, 93, 92, 70, 71, 72, 73, 74, 75, 76, + 77, 78, 79, 81, 80, 82, 83, 50, 51, 52, 53 }; extern TelInfoRec *TelInfo; extern WindRec *screens; @@ -274,10 +275,13 @@ void VSIclrbuf register VSAttrib *ta; for (i = 0; i <= VSIw->lines; i++) { - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { + VSIw->attrst[i]->lattr = 0; ta = &VSIw->attrst[i]->text[0]; - else + } else { + VSIw->linest[i]->lattr = 0; ta = &VSIw->linest[i]->attr[0]; + } tx = &VSIw->linest[i]->text[0]; for (j = 0; j <= VSIw->allwidth; j++) { @@ -528,10 +532,13 @@ void VSrealloc(short w) } savedTextPtr = savedTextBlock; for (i = 0; i <= VSIw->lines; i++) { - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { + savedTextPtr->lattr = VSIw->attrst[i]->lattr; BlockMoveData(VSIw->attrst[i]->text, savedTextPtr->attr, (VSIw->allwidth + 1) * sizeof(VSAttrib)); - else + } 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; } @@ -625,7 +632,7 @@ short VSredraw ty2 = y2; tn = -1; // so we include more than 1 line - if (VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)!=0) return 0; // test clip region +// if (VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)!=0) return 0; // test clip region if (VSIcursorenabled()) VSIcuroff(w); // temporarily hide cursor @@ -654,18 +661,30 @@ short VSredraw pt = ypt->text + VSIw->Rleft; pa = ypt->attr + VSIw->Rleft; + // if double size, we must shift width + if (ypt->lattr & 3) { + tx1 >>= 1; + tx2 >>= 1; + } + lastx = tx1; lasta = pa[tx1]; for(x=tx1+1; x<=tx2; x++) { if (pa[x]!=lasta) { - RSdraw(w, lastx, y, lasta, x-lastx, pt + lastx); + RSdraw(w, lastx, y, ypt->lattr, lasta, x-lastx, pt + lastx); lastx = x; lasta = pa[x]; } } if (lastx<=tx2) - RSdraw(w, lastx, y, lasta, tx2-lastx+1, pt + lastx); + 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; + } + ypt = ypt->next; } } @@ -682,7 +701,7 @@ short VSredraw tn = -1; if (!VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)) { - + ypt = VSIw->linest[VSIw->Rtop+ty1]; for (y=ty1; y<=ty2; y++) { @@ -694,18 +713,30 @@ short VSredraw pt = ypt->text + VSIw->Rleft; pa = ypt->attr + VSIw->Rleft; + // if double size, we must shift width + if (ypt->lattr & 3) { + tx1 >>= 1; + tx2 >>= 1; + } + lastx = tx1; lasta = pa[tx1]; for(x=tx1+1; x<=tx2; x++) { if (pa[x]!=lasta) { - RSdraw(w, lastx, y, lasta, x-lastx, pt + lastx); + RSdraw(w, lastx, y, ypt->lattr, lasta, x-lastx, pt + lastx); lastx = x; lasta = pa[x]; } } if (lastx<=tx2) - RSdraw(w, lastx, y, lasta, tx2-lastx+1, pt + lastx); + 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; + } + ypt = ypt->next; } } @@ -754,7 +785,7 @@ short VSOredraw ty2 = y2; tn = -1; // so we include more than 1 line - if (VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)!=0) return 0; // test clip region +// if (VSIclip(&tx1, &ty1, &tx2, &ty2, &tn, &offset)!=0) return 0; // test clip region if (VSIcursorenabled()) VSIcuroff(w); // temporarily hide cursor @@ -776,7 +807,21 @@ short VSOredraw ypt = ypt->next; // Get pointer to top line we need for (y=ty1; y<=ty2; y++) { - RSdraw(w, tx1, y, 0, tn, ypt->text + VSIw->Rleft +tx1); + + // if double size, we must shift width + if (ypt->lattr & 3) { + tx1 >>= 1; + tx2 >>= 1; + } + + 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; + } + ypt = ypt->next; } } @@ -806,18 +851,31 @@ short VSOredraw pt = ypt->text + VSIw->Rleft; pa = ypa->text + VSIw->Rleft; + // if double size, we must shift width + if (ypa->lattr & 3) { + tx1 >>= 1; + tx2 >>= 1; + } + lastx = tx1; lasta = pa[tx1]; + for(x=tx1+1; x<=tx2; x++) { if (pa[x]!=lasta) { - RSdraw(w, lastx, y, lasta, x-lastx, pt + lastx); + RSdraw(w, lastx, y, ypa->lattr, lasta, x-lastx, pt + lastx); lastx = x; lasta = pa[x]; } } if (lastx<=tx2) - RSdraw(w, lastx, y, lasta, tx2-lastx+1, pt + lastx); + RSdraw(w, lastx, y, ypa->lattr, lasta, tx2-lastx+1, pt + lastx); + // if double size, we must shift width + if (ypa->lattr & 3) { + tx1 <<= 1; + tx2 <<= 1; + } + ypt = ypt->next; ypa = ypa->next; } @@ -1069,7 +1127,8 @@ void VSpossend if (VSIcursorenabled()) VSIcurson(w, VSIw->x, VSIw->y, 1); /* Force Move */ } /* if */ - } /* VSpossend */ +} /* VSpossend */ + char VSkbsend ( @@ -1123,8 +1182,9 @@ char VSkbsend return 0; // RAB BetterTelnet 2.0b5 - rest is for special keys } - /* Keypad (Not Application Mode): 0-9 , - . Enter */ // was (k < VSF1) - if ((k > VSLT) && (k < VSKE) && (!VSIw->DECPAM)) { // 2.0b5 - handle VSKE below + /* Keypad (Not Application Mode): 0-9 , - . Enter */ // was (k < VSPF1) + + if ((k > VSLT) && (k < VSKC) && (!VSIw->DECPAM)) { // 2.0b5 - handle VSKE below RSsendstring(w, &VSIkpxlate[0][k - VSUP], 1); if (echo) VSwrite(w, &VSIkpxlate[0][k - VSUP], 1); @@ -1153,7 +1213,7 @@ char VSkbsend else // BYU 2.4.13 vskptr[1] = 91; // BYU 2.4.13 } // BYU 2.4.13 - else if (k < VSF1) // BYU 2.4.12 + else if (k < VSPF1) // BYU 2.4.12 vskptr = VSkbkn; // BYU 2.4.12 else // BYU 2.4.12 vskptr = VSkbfn; // BYU 2.4.12 @@ -1485,6 +1545,25 @@ void VSbeepcontrol VSIw->ignoreBeeps = beep; } + +/* + * VSenableblink + */ + +void VSenableblink + ( + short w, + Boolean enableBlink + ) +{ + if (VSvalids(w) != 0) return; + + VSIw->realBlink = enableBlink; + VSPulseOne(w, 0, 0, VSIw->maxwidth, VSIw->lines); +} + + + short VSgetrgn ( short w, @@ -1994,6 +2073,8 @@ 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; for (j = 0; j <= VSIw->allwidth; j++) @@ -2051,16 +2132,12 @@ short VSPulseOne(short w, short x1, short y1,short x2, short y2); void VSPulseAll(void) { - short i; + short i; - for ( i=0; i < VSmax; i++ ) + for ( i = 0; i < VSmax; i++ ) { if ( VSscreens[i].stat == 1 && VSscreens[i].loc->realBlink ) - VSPulseOne(i, 0, 0, - VSscreens[i].loc->maxwidth, VSscreens[i].loc->lines); -/* - VSscreens[i].loc->Rright - VSscreens[i].loc->Rleft, - VSscreens[i].loc->Rbottom - VSscreens[i].loc->Rtop); -*/ + VSPulseOne(i, 0, 0, VSscreens[i].loc->maxwidth, VSscreens[i].loc->lines); + } } short VSPulseOne @@ -2126,6 +2203,12 @@ short VSPulseOne pt = ypt->text + VSIw->Rleft; pa = ypt->attr + VSIw->Rleft; + // if double size, we must shift width + if (ypt->lattr & 3) { + tx1 >>= 1; + tx2 >>= 1; + } + lastx = tx1; lasta = pa[tx1]; for( x = tx1+1; x <= tx2; x++ ) { @@ -2136,7 +2219,7 @@ short VSPulseOne cursOff = 1; VSIcuroff(w); } - RSdraw(w, lastx, y, 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; @@ -2153,15 +2236,26 @@ short VSPulseOne cursOff = 1; VSIcuroff(w); } - RSdraw(w, lastx, y, 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; VSIcurson(w, VSIw->x, VSIw->y, 0); } } + + // if double size, we must shift width + if (ypt->lattr & 3) { + tx1 <<= 1; + tx2 <<= 1; + } + ypt = ypt->next; } + + /* back to default window colors */ + RSsetattr( 0, 0 ); + return 0; } @@ -2234,6 +2328,12 @@ short VSOPulseOne pt = ypt->text + VSIw->Rleft; pa = ypa->text + VSIw->Rleft; + // if double size, we must shift width + if (ypa->lattr & 3) { + tx1 >>= 1; + tx2 >>= 1; + } + lastx = tx1; lasta = pa[tx1]; for( x = tx1+1; x <= tx2; x++ ) { @@ -2244,7 +2344,7 @@ short VSOPulseOne cursOff = 1; VSIcuroff(w); } - RSdraw(w, lastx, y, lasta, x-lastx, pt + lastx); + RSdraw(w, lastx, y, ypa->lattr, lasta, x-lastx, pt + lastx); if ( cursOff ) { // restore cursor at original position cursOff = 0; @@ -2261,17 +2361,28 @@ short VSOPulseOne cursOff = 1; VSIcuroff(w); } - RSdraw(w, lastx, y, lasta, tx2-lastx+1, pt + lastx); + RSdraw(w, lastx, y, ypa->lattr, lasta, tx2-lastx+1, pt + lastx); if ( cursOff ) { // restore cursor at original position cursOff = 0; VSIcurson(w, VSIw->x, VSIw->y, 0); } } + + // if double size, we must shift width + if (ypa->lattr & 3) { + tx1 <<= 1; + tx2 <<= 1; + } + ypt = ypt->next; ypa = ypa->next; } } } + + /* back to default window colors */ + RSsetattr( 0, 0 ); + return 0; } diff --git a/macssh/source/Screens/vsinterf.proto.h b/macssh/source/Screens/vsinterf.proto.h index a7bd77d..9d06b33 100755 --- a/macssh/source/Screens/vsinterf.proto.h +++ b/macssh/source/Screens/vsinterf.proto.h @@ -33,6 +33,7 @@ short VSscrolforward(short w, short n); short VSsetrgn(short w, short x1, short y1, short x2, short y2); 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 VSmaxwidth(short w); diff --git a/macssh/source/Screens/vsintern.c b/macssh/source/Screens/vsintern.c index 9d21077..10cb2f9 100755 --- a/macssh/source/Screens/vsintern.c +++ b/macssh/source/Screens/vsintern.c @@ -167,36 +167,41 @@ void VSIcurson y2, n = 1, offset; + short lattr; if (!VSIw->DECCM) return; // Bri 970610 if (VSIw->disableCursor) return; // RAB BetterTelnet 2.0b4 - if (!VSIclip(&x, &y, &x2, &y2, &n, &offset)) - /* cursor already lies within visible region */ - RScurson(w, x, y); /* just make it visible */ - else if (ForceMove) - { + if (VSIw->oldScrollback) { + lattr = VSIw->attrst[y]->lattr; + } else { + lattr = VSIw->linest[y]->lattr; + } + + if (!VSIclip(&x, &y, &x2, &y2, &n, &offset)) { + /* cursor already lies within visible region */ + RScurson(w, lattr, x, y); /* just make it visible */ + } else if (ForceMove) { /* scroll to make cursor visible */ x2 = VSIw->Rbottom - VSIw->Rtop; - if (x2 >= VSIw->lines) - /* visible region is big enough to show entire screen-- + if (x2 >= VSIw->lines) { + /* visible region is big enough to show entire screen-- make sure I don't scroll off the bottom of the screen. This call will also do any appropriate scrolling and redisplaying of the cursor. */ VSsetrgn(VSIwn, VSIw->Rleft, VSIw->lines - x2, VSIw->Rright, VSIw->lines); - else - { - /* x & y have been normalized relative to left & top + } else { + /* x & y have been normalized relative to left & top of current visible region. Just call the appropriate scroll routine, which will also redisplay the cursor. */ if (y > 0) VSscrolforward(VSIwn, y); else VSscrolback(VSIwn, -y); - } /* if */ - } /* if */ - } /* VSIcurson */ + } /* if */ + } /* if */ +} /* VSIcurson */ void VSIcuroff ( @@ -305,6 +310,7 @@ VSlinePtr VSInewlines // Loop through the elements, initializing each one. for(i = 0; i < nlines; i++) { + linePtr->lattr = 0; linePtr->mem = 0; linePtr->text = textPtr; linePtr->attr = attrPtr; @@ -373,6 +379,7 @@ VSlinePtr VSOnewlines for (i = 1; i < nlines; i++) { t += (VSIw->allwidth + 1)* elementSize; /* inc to next text space for a line */ + t2[i].lattr = 0; t2[i].mem = 0; /* don't DisposePtr any of these */ t2[i].text = t; t2[i].prev = t2 + i - 1; /* point back one */ @@ -622,10 +629,13 @@ void VSIelo if (s < 0) s = VSIw->y; - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { + VSIw->attrst[s]->lattr = 0; ta = &VSIw->attrst[s]->text[0]; - else + } else { + VSIw->linest[s]->lattr = 0; ta = &VSIw->linest[s]->attr[0]; + } tt = &VSIw->linest[s]->text[0]; for (i = 0; i <= VSIw->allwidth; i++) { @@ -808,6 +818,7 @@ void VSIdellines for (i = 0; i < n; i++) { + itt->lattr = 0; ta = itt->attr; tt = itt->text; for (j = 0; j <= VSIw->allwidth; j++) @@ -890,6 +901,8 @@ void VSOdellines for (i = 0; i < n; i++) { ta = ((VSattrlinePtr)ita)->text; + ita->lattr = 0; + itt->lattr = 0; tt = itt->text; for (j = 0; j <= VSIw->allwidth; j++) { @@ -1048,6 +1061,8 @@ void VSOinslines { tt = itt->text; ta = ita->text; + itt->lattr = 0; + ita->lattr = 0; for (j = 0; j <= VSIw->allwidth; j++) { *tt++ = ' '; @@ -1297,6 +1312,8 @@ 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; for (i = 0; i <= VSIw->allwidth; i++) @@ -1369,7 +1386,10 @@ void VSIindex } else if (VSIw->y < VSIw->lines) /* BYU - added "if ... " */ VSIw->y++; - } /* VSIindex */ + + VSIw->lattrib = 0; + +} /* VSIindex */ void VSIwrapnow(short *xp, short *yp) /* checks current cursor position for VSIw to see if @@ -1377,7 +1397,14 @@ void VSIwrapnow(short *xp, short *yp) Returns correct cursor position in either case in *xp and *yp. */ { - if (VSIw->x > VSIw->maxwidth) + short mw = VSIw->maxwidth; + + if ((VSIw->lattrib & 3)) { + mw >>= 1; + if ( !(VSIw->maxwidth & 1) ) + mw -= 1; + } + if (VSIw->x > mw) { VSIw->x = 0; VSIindex(); @@ -1421,10 +1448,13 @@ void VSIeeol } savedTextPtr = savedTextBlock; for (i = 0; i <= VSIw->lines; i++) { - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { + savedTextPtr->lattr = VSIw->attrst[i]->lattr; BlockMoveData(VSIw->attrst[i]->text, savedTextPtr->attr, (VSIw->allwidth + 1) * sizeof(VSAttrib)); - else + } 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; } @@ -1437,10 +1467,13 @@ void VSIeeol } savedTextPtr = savedTextBlock; for (i = 0; i <= VSIw->lines; i++) { - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { + VSIw->attrst[i]->lattr = savedTextPtr->lattr; BlockMoveData(savedTextPtr->attr, VSIw->attrst[i]->text, (VSIw->allwidth + 1) * sizeof(VSAttrib)); - else + } 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; } DisposePtr((Ptr) savedTextBlock); // VSIfreelinelist adds un-needed overhead here @@ -1449,9 +1482,13 @@ void VSIeeol VSIwrapnow(&x1, &y1); y2 = y1; /* clear out screen line */ - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { + VSIw->attrst[y1]->lattr = 0; ta = &VSIw->attrst[y1]->text[x1]; - else ta = &VSIw->linest[y1]->attr[x1]; + } else { + VSIw->linest[y1]->lattr = 0; + ta = &VSIw->linest[y1]->attr[x1]; + } tt = &VSIw->linest[y1]->text[x1]; for (i = VSIw->allwidth - x1 + 1; i > 0; i--) { @@ -1483,15 +1520,21 @@ void VSIdelchars *temp; VSAttrib *tempa; + short + lattr; VSIwrapnow(&x1, &y1); y2 = y1; if (x > VSIw->maxwidth) x = VSIw->maxwidth; - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { tempa = VSIw->attrst[y1]->text; - else tempa = VSIw->linest[y1]->attr; + 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++) { @@ -1507,7 +1550,7 @@ void VSIdelchars } /* update display */ if (!VSIclip(&x1, &y1, &x2, &y2, &n, &offset)) - RSdelchars(VSIwn, x1, y1, x); + RSdelchars(VSIwn, lattr, x1, y1, x); } /* VSIdelchars */ void VSIfreelinelist @@ -1592,10 +1635,13 @@ void VSIebol VSIwrapnow(&x2, &y1); y2 = y1; /* clear from beginning of line to cursor */ - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { + //VSIw->attrst[y1]->lattr = 0; ta = &VSIw->attrst[y1]->text[0]; - else + } else { + //VSIw->attrst[y1]->lattr = 0; ta = &VSIw->linest[y1]->attr[0]; + } tt = &VSIw->linest[y1]->text[0]; for (i = 0; i <= x2; i++) { @@ -1625,9 +1671,13 @@ void VSIel x1 = 0; } /* clear out line */ - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { + //VSIw->attrst[s]->lattr = 0; ta = &VSIw->attrst[s]->text[0]; - else ta = &VSIw->linest[s]->attr[0]; + } else { + //VSIw->linest[s]->lattr = 0; + ta = &VSIw->linest[s]->attr[0]; + } tt = &VSIw->linest[s]->text[0]; for(i = 0; i <= VSIw->allwidth; i++) { @@ -1721,10 +1771,17 @@ void VSIrange /* constrains cursor position to valid range (somewhere on the screen). */ { short wrap = (VSIw->DECAWM) ? 1 : 0; + short mw = VSIw->maxwidth; + + if ((VSIw->lattrib & 3)) { + mw >>= 1; + if ( !(VSIw->maxwidth & 1) ) + mw -= 1; + } if (VSIw->x < 0) VSIw->x = 0; - if (VSIw->x > VSIw->maxwidth + wrap) - VSIw->x = VSIw->maxwidth + wrap; + if (VSIw->x > mw + wrap) + VSIw->x = mw + wrap; if (VSIw->y < 0) VSIw->y = 0; if (VSIw->y > VSIw->lines) @@ -1744,8 +1801,15 @@ void VTsendpos( void ) short x = VSIw->x, y = VSIw->y; + short mw = VSIw->maxwidth; - if (x > VSIw->maxwidth) { + if ((VSIw->lattrib & 3)) { + mw >>= 1; + if ( !(VSIw->maxwidth & 1) ) + mw -= 1; + } + + if (x > mw) { /* autowrap pending */ x = 0; y++; @@ -1844,6 +1908,7 @@ void VTalign VSIes(); /* erase the screen */ for (j = 0; j < VSIw->lines; j++) { + VSIw->linest[j]->lattr = 0; tt = &VSIw->linest[j]->text[0]; for (i = 0; i <= VSIw->maxwidth; i++) *tt++ = 'E'; @@ -1992,7 +2057,7 @@ void VSIinsstring (VSIw->x - len). */ { RSinsstring(VSIwn, VSIw->x - len, VSIw->y, - VSIw->attrib, len, start); + VSIw->lattrib, VSIw->attrib, len, start); } /* VSIinsstring */ void VSIsave @@ -2029,6 +2094,7 @@ void VSIdraw short VSIwn, /* window number */ short x, /* starting column */ short y, /* line on which to draw */ + short la, VSAttrib a, /* text attributes */ short len, /* length of text to draw */ char *c /* pointer to text */ @@ -2041,7 +2107,7 @@ void VSIdraw short x2, y2, offset; if (!VSIclip(&x, &y, &x2, &y2, &len, &offset)) - RSdraw(VSIwn, x, y, a, len, (char *) (c + offset)); /* BYU LSC */ + RSdraw(VSIwn, x, y, la, a, len, (char *) (c + offset)); /* BYU LSC */ } /* VSIdraw */ short VSIgetblinkflag(void) diff --git a/macssh/source/Screens/vsintern.proto.h b/macssh/source/Screens/vsintern.proto.h index b27db34..64f0f9b 100755 --- a/macssh/source/Screens/vsintern.proto.h +++ b/macssh/source/Screens/vsintern.proto.h @@ -54,7 +54,7 @@ void VSIinschar(short x); void VSIinsstring(short len, char *start); void VSIsave(void); void VSIrestore(void); -void VSIdraw(short VSIwn, short x, short y, VSAttrib a, short len, char *c); +void VSIdraw(short VSIwn, short x, short y, short la, VSAttrib a, short len, char *c); void VSIflush(void); void VSIcursdisable(); void VSIcursenable(); diff --git a/macssh/source/Screens/vskeys.h b/macssh/source/Screens/vskeys.h index e363751..a72040d 100755 --- a/macssh/source/Screens/vskeys.h +++ b/macssh/source/Screens/vskeys.h @@ -68,10 +68,10 @@ #define VSKP 145 /* Keypad . */ #define VSKE 146 /* Keypad Enter */ -#define VSF1 147 /* Function 1 */ /* Mac Keypad Clear */ -#define VSF2 148 /* Function 2 */ /* Mac Keypad = */ -#define VSF3 149 /* Function 3 */ /* Mac Keypad / */ -#define VSF4 150 /* Function 4 */ /* Mac Keypad * */ +#define VSPF1 147 /* Function 1 */ /* Mac Keypad Clear */ +#define VSPF2 148 /* Function 2 */ /* Mac Keypad = */ +#define VSPF3 149 /* Function 3 */ /* Mac Keypad / */ +#define VSPF4 150 /* Function 4 */ /* Mac Keypad * */ #ifdef VSMASTER @@ -94,8 +94,8 @@ extern unsigned char *VSIkplen; /* BYU 2.4.12 */ * Definition of attribute bits in the Virtual Screen * * 0 - Bold - * 1 - faint (used internally for 2nd ansi foreground color) - * 2 - italic (used internally for 2nd ansi background color) + * 1 - faint + * 2 - italic * 3 - Underline * 4 - slowly Blinking * 5 - rapidly Blinking diff --git a/macssh/source/parse/parse.c b/macssh/source/parse/parse.c index 6d410ea..833c75b 100755 --- a/macssh/source/parse/parse.c +++ b/macssh/source/parse/parse.c @@ -45,6 +45,10 @@ static char munger[255]; extern short scrn; extern WindRec *screens; +extern Boolean authOK; // true if authentication driver available +extern Boolean encryptOK; // true if des encryption routines available + + #include "parse.proto.h" static char *getcname(struct WindRec *tw); @@ -787,7 +791,7 @@ static void telnet_do(struct WindRec *tw, short option) case N_AUTHENTICATION: /* do auth */ if (!tw->myopts[OPT_AUTHENTICATION-MHOPTS_BASE]) { - if (tw->authenticate) { + if (tw->authenticate && authOK) { (tw->myopts)[OPT_AUTHENTICATION-MHOPTS_BASE] = 1; send_will(tw->port, N_AUTHENTICATION); } @@ -799,7 +803,7 @@ static void telnet_do(struct WindRec *tw, short option) case N_ENCRYPT: /* do encrypt */ if (!tw->myopts[OPT_ENCRYPT-MHOPTS_BASE]) { - if (tw->encrypt) { + if (tw->encrypt && encryptOK && tw->authenticate && authOK) { (tw->myopts)[OPT_ENCRYPT-MHOPTS_BASE] = 1; send_will(tw->port, N_ENCRYPT); } else { @@ -903,7 +907,7 @@ static void telnet_will(struct WindRec *tw, short option) case N_ENCRYPT: /* will encrypt */ if (!tw->hisopts[OPT_ENCRYPT-MHOPTS_BASE]) { - if (tw->encrypt) { + if (tw->encrypt && encryptOK && tw->authenticate && authOK) { (tw->hisopts)[OPT_ENCRYPT-MHOPTS_BASE] = 1; send_do(tw->port, N_ENCRYPT); } else { diff --git a/macssh/source/parse/vsem.c b/macssh/source/parse/vsem.c index fa3ec7e..46a648f 100755 --- a/macssh/source/parse/vsem.c +++ b/macssh/source/parse/vsem.c @@ -162,7 +162,7 @@ void VSprOFF(void) PrRecHandle = PrintSetupRecord(); GetWTitle ((GrafPtr) RSgetwindow(VSIwn),Title); - SetCursor(theCursors[normcurs]); + setLastCursor(theCursors[normcurs]); if (PrJobDialog(PrRecHandle)) { /* Cancel the print if FALSE */ if ((sts=PrError()) != noErr){ @@ -293,6 +293,7 @@ void VSem short savedY; unsigned char savedChar; long val; + short mw; escflg = VSIw->escflg; @@ -314,8 +315,16 @@ void VSem #endif screen = &screens[findbyVS(VSIwn)]; + while (ctr > 0) { + mw = VSIw->maxwidth; + if ((VSIw->lattrib & 3)) { + mw >>= 1; + if ( !(VSIw->maxwidth & 1) ) + mw -= 1; + } + if (VSIw->prredirect) /* PR - printer redirection? */ VSpr(&c,&ctr); /* PR -if yes, call VSpr */ /* PR - when we return from VSpr there may (ctr!=0) É */ @@ -423,27 +432,30 @@ void VSem //loop around, printing lines of text one at a time start = &VSIw->linest[VSIw->y]->text[VSIw->x]; /* start of area needing redrawing */ current = start; /* where to put next char */ - if (VSIw->oldScrollback) + if (VSIw->oldScrollback) { acurrent = &VSIw->attrst[VSIw->y]->text[VSIw->x]; - else + } else { acurrent = &VSIw->linest[VSIw->y]->attr[VSIw->x]; /* where to put corresponding attribute byte */ + } + attrib = VSIw->attrib; /* current writing attribute */ insert = VSIw->IRM; /* insert mode (boolean) */ offend = 0; /* wrapped to next line (boolean) */ extra = 0; /* overwriting last character of line */ sx = VSIw->x; /* starting column of area needing redrawing */ - if (VSIw->x > VSIw->maxwidth) { + if (VSIw->x > mw) { if (VSIw->DECAWM) { // wrap to next line VSIw->x = 0; VSIindex(); } else //stay at right margin - VSIw->x = VSIw->maxwidth; + VSIw->x = mw; current = start = &VSIw->linest[VSIw->y]->text[VSIw->x]; if (VSIw->oldScrollback) acurrent = &VSIw->attrst[VSIw->y]->text[VSIw->x]; - else acurrent = &VSIw->linest[VSIw->y]->attr[VSIw->x]; + else + acurrent = &VSIw->linest[VSIw->y]->attr[VSIw->x]; sx = VSIw->x; } /* if */ @@ -460,7 +472,7 @@ void VSem *acurrent = attrib; c++; ctr--; - if (VSIw->x < VSIw->maxwidth) { + if (VSIw->x < mw) { //advance the cursor position acurrent++; current++; @@ -473,7 +485,7 @@ void VSem offend = 1; // terminate inner loop } else { //stay at right margin - VSIw->x = VSIw->maxwidth; + VSIw->x = mw; extra = 1; // cursor position doesn't advance } } @@ -482,12 +494,12 @@ void VSem //now update the screen to show what we've done extra += VSIw->x - sx; if (insert) { - RSinsstring(VSIwn, VSIw->x - extra, VSIw->y,VSIw->attrib, extra, start); + RSinsstring(VSIwn, VSIw->x - extra, VSIw->y, VSIw->lattrib, VSIw->attrib, extra, start); } else { short x2,y2,offset, sxCopy=sx,yCopy = VSIw->y, extraCopy = extra; - - if (!VSIclip(&sxCopy, &yCopy, &x2, &y2, &extraCopy, &offset)) - RSdraw(VSIwn, sxCopy,yCopy, VSIw->attrib,extraCopy,(char *) (start + offset)); + if (!VSIclip(&sxCopy, &yCopy, &x2, &y2, &extraCopy, &offset)) { + RSdraw(VSIwn, sxCopy,yCopy, VSIw->lattrib, VSIw->attrib,extraCopy,(char *) (start + offset)); + } } if (!captured) VScapture((unsigned char *) start, extra); @@ -566,6 +578,7 @@ void VSem } /* while */ while ( escflg == 2 && ctr > 0 ) { + /* "control sequence" processing */ switch (*c) { case 0x08: @@ -666,22 +679,22 @@ void VSem case 'C': /* cursor right */ sx = VSIw->parms[0]; if (sx < 1) sx = 1; - if (VSIw->DECAWM && VSIw->x >= VSIw->maxwidth) { + if (VSIw->DECAWM && VSIw->x >= mw) { // autowrap if (VSIw->y >= VSIw->lines) goto ShortCut; VSIw->y++; - VSIw->x = (VSIw->x > VSIw->maxwidth) ? 0 : -1; + VSIw->x = (VSIw->x > mw) ? 0 : -1; } VSIw->x += sx; VSIrange(); - if (VSIw->x > VSIw->maxwidth) - VSIw->x = VSIw->maxwidth; + if (VSIw->x > mw) + VSIw->x = mw; goto ShortCut; /* BYU 2.4.12 */ case 'd': /* Y cursor position ? */ VSIw->y = VSIw->parms[0] - 1; - if (VSIw->DECAWM && VSIw->x > VSIw->maxwidth) + if (VSIw->DECAWM && VSIw->x > mw) VSIw->x = 0; if (VSIw->y < 0) VSIw->y = 0; @@ -697,14 +710,14 @@ void VSem if (VSIw->y <= 0) goto ShortCut; VSIw->y--; - VSIw->x = VSIw->maxwidth + 1; + VSIw->x = mw + 1; } VSIw->x -= sx; VSIrange(); goto ShortCut; /* BYU 2.4.12 */ case 'G': /* X cursor position ? */ - if (VSIw->DECAWM && VSIw->x > VSIw->maxwidth) { + if (VSIw->DECAWM && VSIw->x > mw) { // autowrap if (VSIw->y >= VSIw->lines) goto ShortCut; @@ -713,8 +726,8 @@ void VSem VSIw->x = VSIw->parms[0] - 1; if (VSIw->x < 0) VSIw->x = 0; - if (VSIw->x > VSIw->maxwidth) - VSIw->x = VSIw->maxwidth; + if (VSIw->x > mw) + VSIw->x = mw; goto ShortCut; case 'f': @@ -730,8 +743,8 @@ void VSem we are past screen edge. This causes "resize" to break */ if (VSIw->x < 0) /* JMB 2.6 */ VSIw->x = 0; /* JMB 2.6 */ - if (VSIw->x > VSIw->maxwidth) /* JMB 2.6 */ - VSIw->x = VSIw->maxwidth; /* JMB 2.6 */ + if (VSIw->x > mw) /* JMB 2.6 */ + VSIw->x = mw; /* JMB 2.6 */ if (VSIw->y < 0) /* JMB 2.6 */ VSIw->y = 0; /* JMB 2.6 */ if (VSIw->y > VSIw->lines) /* JMB 2.6 */ @@ -1027,6 +1040,7 @@ VSvalids(sx); while ( escflg == 3 && ctr > 0 ) { /* "#" handling */ + short lattrib = -1; switch (*c) { case 0x08: VSIw->x--; @@ -1034,19 +1048,36 @@ VSvalids(sx); VSIw->x = 0; break; case '3': /* Double Height Line (DECDHL) Top Half */ - goto ShortCut; + /* applies to the whole line */ + lattrib = 1; + break; case '4': /* Double Height Line (DECDHL) Bottom Half */ - goto ShortCut; + /* applies to the whole line */ + lattrib = 2; + break; case '5': /* Single-Width Line (DECSWL) */ - goto ShortCut; + lattrib = 0; + break; case '6': /* Double-Width Line (DECDWL) */ - goto ShortCut; + lattrib = 4; + break; case '8': /* alignment display */ VTalign(); - goto ShortCut; /* BYU 2.4.12 */ + goto ShortCut; default: - goto ShortCut; /* BYU 2.4.12 */ + goto ShortCut; } /* switch */ + if ( lattrib != -1 ) { + VSIw->lattrib = lattrib; + if (VSIw->oldScrollback) { + VSIw->attrst[VSIw->y]->lattr = lattrib; + } else { + VSIw->linest[VSIw->y]->lattr = lattrib; + } + /* refresh line with new width */ + VSredrawLine(VSIwn); + goto ShortCut; + } c++; ctr--; } /* while */