/* * PositionToNewThumbPosition - set new position in file based on thumb */ vi_rc PositionToNewThumbPosition( wind *w, int win_y ) { int height; vi_rc rc; linenum lne, clne; if( win_y == w->vert_scroll_pos ) { return( ERR_NO_ERR ); } win_y -= THUMB_START; if( win_y < 0 ) { return( ERR_NO_ERR ); } height = w->y2 - w->y1 - THUMB_START * 2; if( win_y > height ) { return( ERR_NO_ERR ); } if( height <= 0 ) { return( ERR_NO_ERR ); } lne = CurrentFile->fcbs.tail->end_line; clne = (win_y * lne) / height; if( clne == 0L ) { clne = 1L; } DisplayMouse( FALSE ); rc = GoToLineNoRelCurs( clne ); DisplayMouse( TRUE ); return( rc ); } /* PositionToNewThumbPosition */
/**************************************************************************** REMARKS: Main program entry point ****************************************************************************/ int main(void) { event_t evt; ibool done = false; PM_HWND hwndConsole; hwndConsole = PM_openConsole(0,0,0,0,0,true); EVT_init(&moveMouse); EVT_setMouseRange(1024,768); CalibrateJoy(); do { EVT_pollJoystick(); if (EVT_getNext(&evt,EVT_EVERYEVT)) { switch (evt.what) { case EVT_KEYDOWN: DisplayKey("EVT_KEYDOWN ", &evt); if (EVT_scanCode(evt.message) == KB_esc) done = true; break; case EVT_KEYREPEAT: DisplayKey("EVT_KEYREPEAT", &evt); break; case EVT_KEYUP: DisplayKey("EVT_KEYUP ", &evt); break; case EVT_MOUSEDOWN: DisplayMouse("EVT_MOUSEDOWN", &evt); break; case EVT_MOUSEAUTO: DisplayMouse("EVT_MOUSEAUTO", &evt); break; case EVT_MOUSEUP: DisplayMouse("EVT_MOUSEUP ", &evt); break; case EVT_MOUSEMOVE: DisplayMouse("EVT_MOUSEMOVE", &evt); break; case EVT_JOYCLICK: DisplayJoy("EVT_JOYCLICK ", &evt); break; case EVT_JOYMOVE: DisplayJoy("EVT_JOYMOVE ", &evt); break; } } } while (!done); EVT_exit(); PM_closeConsole(hwndConsole); return 0; }
/* * getOverrideKey - get next key from the override buffer */ static vi_key getOverrideKey( void ) { int c; bool mouse = FALSE; int mcnt = 0; for( ;; ) { c = overrideKeyBuff[overrideKeyPos]; if( overrideKeyPos == MAX_OVERRIDE_KEY_BUFF - 1 ) { overrideKeyPos = 0; } else { overrideKeyPos++; } if( overrideKeyPos == overrideKeyEnd ) { EditFlags.KeyOverride = FALSE; } if( c == VI_KEY( MOUSEEVENT ) && !mouse ) { mouse = TRUE; mcnt = 0; } else { if( mouse ) { switch( mcnt ) { case 0: LastMouseEvent = c; break; case 1: MouseRow = c; break; case 2: MouseCol = c; break; case 3: MouseStatus = c; mouse = FALSE; c = VI_KEY( MOUSEEVENT ); RedrawMouse( MouseRow, MouseCol ); DisplayMouse( TRUE ); break; } mcnt++; } if( !mouse ) { #ifndef __WIN__ if( c == 3 ) { // ExitWithVerify(); } #endif break; } } } return( c ); } /* getOverrideKey */
/* * getOverrideKey - get next key from the override buffer */ static vi_key getOverrideKey( void ) { vi_key key; bool mouse = false; int mcnt = 0; for( ;; ) { key = overrideKeyBuff[overrideKeyPos]; if( overrideKeyPos == MAX_OVERRIDE_KEY_BUFF - 1 ) { overrideKeyPos = 0; } else { overrideKeyPos++; } if( overrideKeyPos == overrideKeyEnd ) { EditFlags.KeyOverride = false; } if( mouse ) { if( mcnt == 3 ) { MouseStatus = key; mouse = false; key = VI_KEY( MOUSEEVENT ); RedrawMouse( MouseRow, MouseCol ); DisplayMouse( true ); break; } if( mcnt == 0 ) { LastMouseEvent = key; } else if( mcnt == 1 ) { MouseRow = key; } else if( mcnt == 2 ) { MouseCol = key; } mcnt++; } else if( key == VI_KEY( MOUSEEVENT ) ) { mouse = true; mcnt = 0; } else { #ifndef __WIN__ if( key == VI_KEY( CTRL_C ) ) { // ExitWithVerify(); } #endif break; } } return( key ); } /* getOverrideKey */
/* * GetKey - read a key from the keyboard */ vi_key GetKey( bool usemouse ) { bool hit; vi_key key; clearSpin(); for( ;; ) { if( EditFlags.NoCapsLock ) { TurnOffCapsLock(); } LastMouseEvent = GetMouseEvent(); if( LastMouseEvent != VI_MOUSE_NONE ) { RedrawMouse( MouseRow, MouseCol ); DisplayMouse( true ); if( TestMouseEvent( usemouse ) ) { return( VI_KEY( MOUSEEVENT ) ); } } /* * could get set by mouse handler or IDEGetKeys */ if( EditFlags.KeyOverride ) { key = getOverrideKey(); #ifndef __WIN__ if( key == VI_KEY( CTRL_C ) ) { ExitWithVerify(); clearSpin(); continue; } #endif return( key ); } hit = KeyboardHit(); if( !hit ) { DoAutoSave(); #ifdef __IDE__ IDEGetKeys(); #endif #ifdef __QNX__ WaitForProxy(); if( !KeyboardHit() ) { continue; } #endif } #if defined( BUSYWAIT ) else { #endif key = GetKeyboard(); #if defined( __NT__ ) if( key == VI_KEY( MOUSEEVENT ) ) { continue; } #endif DisplayMouse( false ); #ifndef __WIN__ if( EditFlags.EscapedInsertChar ) break; #endif if( key == VI_KEY( NULL ) ) { GetKeyboard(); ExitWithVerify(); clearSpin(); continue; } #ifndef __WIN__ if( key == VI_KEY( CTRL_C ) ) { ExitWithVerify(); clearSpin(); continue; } #endif break; #if defined( BUSYWAIT ) } #endif #if defined( __DOS__ ) DosIdleCall(); #elif defined( __OS2__ ) DosSleep( 1 ); #endif } if( EditFlags.Spinning ) { EditFlags.SpinningOurWheels = true; } return( key ); } /* GetKey */
/* * SelectLineInFile - select a line in a given file */ vi_rc SelectLineInFile( selflinedata *sfd ) { int i, winflag; int leftcol = 0, key2; bool done = FALSE, redraw = TRUE; bool hiflag = FALSE, drawbord = FALSE; int farx, text_lines; linenum pagetop = 1, lln = 1; char tmp[MAX_STR]; hilst *ptr; linenum cln; linenum endline; vi_rc rc; vi_key key; /* * create the window */ cln = sfd->cln; endline = sfd->f->fcbs.tail->end_line; farx = sfd->wi->x2; if( sfd->show_lineno ) { farx++; } if( sfd->hilite != NULL ) { hiflag = TRUE; } rc = NewWindow2( &cWin, sfd->wi ); if( rc != ERR_NO_ERR ) { return( rc ); } if( !sfd->is_menu ) { WindowAuxUpdate( cWin, WIND_INFO_HAS_SCROLL_GADGETS, TRUE ); DrawBorder( cWin ); } oWin = sfd->eiw; isMenu = sfd->is_menu; PushMouseEventHandler( SelectLineMouseHandler ); KillCursor(); text_lines = WindowAuxInfo( cWin, WIND_INFO_TEXT_LINES ); sfd->sl = -1; if( sfd->title != NULL ) { WindowTitle( cWin, sfd->title ); } pagetop = text_lines * (cln / text_lines); if( cln % text_lines != 0 ) { pagetop++; } key = 0; if( LastEvent == VI_KEY( MOUSEEVENT ) ) { DisplayMouse( TRUE ); } /* * now, allow free scrolling and selection */ while( !done ) { if( redraw ) { if( sfd->show_lineno ) { MySprintf(tmp, "%l/%l", cln, endline ); i = sfd->wi->x2 - sfd->wi->x1; WindowBorderData( cWin, tmp, i - strlen( tmp ) ); drawbord = TRUE; } if( hiflag ) { ptr = sfd->hilite; ptr += cln - 1; if( ptr->_char == (char)-1 ) { if( cln > lln ) { cln++; } else if( cln < lln ) { cln--; } } } if( drawbord ) { DrawBorder( cWin ); } displayGenericLines( sfd->f, pagetop, leftcol, cln, &(sfd->wi->hilight), sfd->hilite, sfd->vals, sfd->valoff ); } lln = cln; redraw = TRUE; drawbord = FALSE; mouseLine = -1; rlMenu = FALSE; if( key == VI_KEY( MOUSEEVENT ) ) { DisplayMouse( TRUE ); } key = GetNextEvent( TRUE ); if( hiflag && ((key >= VI_KEY( ALT_A ) && key <= VI_KEY( ALT_Z )) || (key >='a' && key <= 'z') || (key >= 'A' && key <= 'Z') || (key >= '1' && key <= '9')) ) { i = 0; if( key >= VI_KEY( ALT_A ) && key <= VI_KEY( ALT_Z ) ) { key2 = key - VI_KEY( ALT_A ) + 'A'; } else if( key >= 'a' && key <= 'z' ) { key2 = key - 'a' + 'A'; } else { key2 = key; } ptr = sfd->hilite; while( ptr->_char != '\0' ) { if( toupper( ptr->_char ) == key2 ) { cln = i + 1; key = VI_KEY( ENTER ); break; } ++i; ++ptr; } } /* * check if a return-event has been selected */ if( sfd->retevents != NULL ) { i = 0; if( key == VI_KEY( MOUSEEVENT ) ) { if( mouseWin == oWin && LastMouseEvent == MOUSE_PRESS ) { DisplayMouse( FALSE ); sfd->event = sfd->retevents[mouseLine]; key = VI_KEY( ENTER ); } } else { while( sfd->retevents[i] != 0 ) { if( key == sfd->retevents[i] ) { sfd->event = key; key = VI_KEY( ENTER ); break; } i++; } } } /* * process key stroke */ switch( key ) { case VI_KEY( MOUSEEVENT ): DisplayMouse( FALSE ); if( hiflag ) { ptr = sfd->hilite; ptr += mouseLine; if( ptr->_char == (char) -1 ) { break; } } if( rlMenu && sfd->allow_rl != NULL ) { *(sfd->allow_rl) = rlMenuNum; done = TRUE; break; } if( mouseScroll != MS_NONE ) { switch( mouseScroll ) { case MS_UP: goto evil_up; case MS_DOWN: goto evil_down; case MS_PAGEUP: goto evil_pageup; case MS_PAGEDOWN: goto evil_pagedown; case MS_EXPOSEDOWN: adjustCLN( &cln, &pagetop, pagetop + text_lines - cln - 1, endline, text_lines ); adjustCLN( &cln, &pagetop, 1, endline, text_lines ); drawbord = TRUE; break; case MS_EXPOSEUP: adjustCLN( &cln, &pagetop, pagetop - cln, endline, text_lines ); adjustCLN( &cln, &pagetop, -1, endline, text_lines ); drawbord = TRUE; break; } break; } switch( LastMouseEvent ) { case MOUSE_DRAG: if( mouseWin != cWin ) { break; } cln = mouseLine + pagetop; break; case MOUSE_RELEASE: if( !sfd->is_menu ) { break; } if( mouseWin == cWin ) { cln = mouseLine + pagetop; if( cln <= endline ) { goto evil_enter; } } break; case MOUSE_DCLICK: if( mouseWin != cWin ) { AddCurrentMouseEvent(); done = TRUE; } else { cln = mouseLine + pagetop; if( cln <= endline ) { goto evil_enter; } } break; case MOUSE_PRESS_R: if( mouseWin != cWin ) { AddCurrentMouseEvent(); done = TRUE; } break; case MOUSE_PRESS: if( mouseWin != cWin ) { AddCurrentMouseEvent(); done = TRUE; } else { cln = mouseLine + pagetop; } break; } break; case VI_KEY( ESC ): done = TRUE; break; evil_enter: case VI_KEY( ENTER ): case ' ': /* * see if we need to do a callback for this */ if( sfd->checkres != NULL ) { line *cline; fcb *cfcb; char data[64]; i = cln - 1; GimmeLinePtr( cln, sfd->f, &cfcb, &cline ); strcpy( data, cline->data ); RemoveLeadingSpaces( data ); winflag = FALSE; strcpy( tmp, sfd->vals[i] ); rc = sfd->checkres( data, tmp, &winflag ); if( winflag ) { if( winflag == 2 ) { winflag = TRUE; } else { winflag = FALSE; } } if( winflag ) { MoveWindowToFront( cWin ); } if( rc == ERR_NO_ERR ) { AddString2( &(sfd->vals[i]), tmp ); redraw = TRUE; } break; /* * no value window, so just return line selected */ } else { if( isMenu && InvokeMenuHook( CurrentMenuNumber, cln ) == -1 ) { break; } sfd->sl = cln; done = TRUE; } break; case VI_KEY( LEFT ): case 'h': if( sfd->allow_rl != NULL ) { *(sfd->allow_rl) = -1; done = TRUE; } break; case VI_KEY( RIGHT ): case 'l': if( sfd->allow_rl != NULL ) { *(sfd->allow_rl) = 1; done = TRUE; } break; evil_up: case VI_KEY( UP ): case 'k': drawbord = adjustCLN( &cln, &pagetop, -1, endline, text_lines ); break; evil_down: case VI_KEY( DOWN ): case 'j': drawbord = adjustCLN( &cln, &pagetop, 1, endline, text_lines ); break; case VI_KEY( CTRL_PAGEUP ): drawbord = adjustCLN( &cln, &pagetop, -cln + 1, endline, text_lines ); break; case VI_KEY( CTRL_PAGEDOWN ): drawbord = adjustCLN( &cln, &pagetop, endline - cln, endline, text_lines ); break; evil_pageup: case VI_KEY( PAGEUP ): case VI_KEY( CTRL_B ): drawbord = adjustCLN( &cln, &pagetop, -text_lines, endline, text_lines ); break; evil_pagedown: case VI_KEY( PAGEDOWN ): case VI_KEY( CTRL_F ): drawbord = adjustCLN( &cln, &pagetop, text_lines, endline, text_lines ); break; case VI_KEY( HOME ): drawbord = TRUE; cln = 1; pagetop = 1; break; case VI_KEY( END ): drawbord = TRUE; cln = endline; pagetop = endline - text_lines + 1; if( pagetop < 1 ) { pagetop = 1; } break; default: redraw = FALSE; break; } } PopMouseEventHandler(); CloseAWindow( cWin ); RestoreCursor(); SetWindowCursor(); return( rc ); } /* SelectLineInFile */
/* * displayLineInWindowGeneric - takes an ss_block directly */ vi_rc displayLineInWindowGeneric( window_id wn, int c_line_no, char *text, int start_col, ss_block *ss ) { wind *w; char_info *txt; char *over, *tmp, *otmp; char_info _FAR *scr; int addr, start, end, a, spend; int cnt1, cnt2, startc, spl; char_info blank, what; #ifdef __VIO__ unsigned oscr; unsigned tbytes; #endif bool has_mouse, write_eol; unsigned ss_i; // index into text, not ss[ss_i] if( EditFlags.Quiet ) { return( ERR_NO_ERR ); } w = Windows[wn]; write_eol = FALSE; if( EditFlags.RealTabs ) { a = strlen( text ); otmp = tmp = StaticAlloc(); ExpandTabsInABuffer( text, a, tmp, MaxLinem1 + 2 ); } else { tmp = text; } tmp += start_col; a = strlen( tmp ); /* * find dimensions of line */ if( w->has_border ) { if( c_line_no < 1 || c_line_no > w->height - 2 ) { if( EditFlags.RealTabs ) { StaticFree( otmp ); } return( ERR_WIND_NO_SUCH_LINE ); } start = 1; spl = c_line_no; spend = end = w->width - 1; if( a < end - 1 ) { end = a + 1; } else if( a >= end ) { write_eol = TRUE; } } else { if( c_line_no < 1 || c_line_no > w->height ) { if( EditFlags.RealTabs ) { StaticFree( otmp ); } return( ERR_WIND_NO_SUCH_LINE ); } start = 0; spl = c_line_no - 1; spend = end = w->width; if( a < end ) { end = a; } else if( a > end ) { write_eol = TRUE; } } startc = start; cnt1 = end - start; cnt2 = spend - end; c_line_no--; w = AccessWindow( wn ); /* * initialize */ addr = startc + spl * w->width; txt = (char_info *) &(w->text[sizeof( char_info ) * addr]); scr = (char_info _FAR *) &Scrn[(w->x1 + startc + (spl + w->y1) * WindMaxWidth) * sizeof(char_info)]; #ifdef __VIO__ oscr = (unsigned) ((char *) scr - Scrn); tbytes = cnt1 + cnt2; #endif ss_i = 0; what.attr = MAKE_ATTR( w, SEType[ss->type].foreground, SEType[ss->type].background ); blank.ch = ' '; has_mouse = DisplayMouse( FALSE ); /* * display line */ if( w->overcnt[spl] ) { over = &(w->overlap[addr]); while( cnt1-- != 0 ) { what.ch = (*tmp); WRITE_SCREEN_DATA( *txt, what ); if( *over++ == NO_CHAR ) { WRITE_SCREEN( *scr, what ); } tmp++; scr++; txt++; if( ++ss_i > ss->end ) { ss++; what.attr = MAKE_ATTR( w, SEType[ss->type].foreground, SEType[ss->type].background ); } } if( write_eol && *(over - 1) == NO_CHAR ) { WriteLongLineMarker( wn, &( SEType[SE_EOFTEXT] ), txt - 1, scr - 1, *(tmp - 1) ); } else { blank.attr = MAKE_ATTR( w, SEType[ss->type].foreground, SEType[ss->type].background ); while( cnt2-- != 0 ) { WRITE_SCREEN_DATA( *txt, blank ); if( *over++ == NO_CHAR ) { WRITE_SCREEN( *scr, blank ); } scr++; txt++; } } } else { while( cnt1-- != 0 ) { what.ch = (*tmp); WRITE_SCREEN_DATA( *txt, what ); WRITE_SCREEN( *scr, what ); scr++; txt++; tmp++; if( ++ss_i > ss->end ) { ss++; what.attr = MAKE_ATTR( w, SEType[ss->type].foreground, SEType[ss->type].background ); } } if( write_eol ) { WriteLongLineMarker( wn, &( SEType[SE_EOFTEXT] ), txt - 1, scr - 1, *(tmp - 1) ); } else { blank.attr = MAKE_ATTR( w, SEType[ss->type].foreground, SEType[ss->type].background ); while( cnt2-- != 0 ) { WRITE_SCREEN_DATA( *txt, blank ); WRITE_SCREEN( *scr, blank ); txt++; scr++; } } } #ifdef __VIO__ MyVioShowBuf( oscr, tbytes ); #endif if( EditFlags.RealTabs ) { StaticFree( otmp ); } ReleaseWindow( w ); DisplayMouse( has_mouse ); return( ERR_NO_ERR ); } /* displayLineInWindowGeneric */
/* * SetCharInWindowWithColor - do just that, using given colors */ vi_rc SetCharInWindowWithColor( window_id wn, int line, int col, char text, type_style *style ) { wind *w; char *over; int attr, addr, start, spl; char_info tmp; char_info *txt; char_info _FAR *scr; bool has_mouse; if( EditFlags.Quiet ) { return( ERR_NO_ERR ); } w = Windows[wn]; /* * find dimensions of line */ if( w->has_border ) { if( line < 1 || line > w->height - 2 ) { return( ERR_WIND_NO_SUCH_LINE ); } start = 1; spl = line; } else { if( line < 1 || line > w->height ) { return( ERR_WIND_NO_SUCH_LINE ); } start = 0; spl = line - 1; } if( col < 1 || col > w->width ) { return( ERR_WIND_NO_SUCH_COLUMN ); } line--; col--; /* * initialize */ w = AccessWindow( wn ); addr = col + start + spl * w->width; txt = (char_info *) &(w->text[sizeof( char_info ) * addr]); scr = (char_info _FAR *) &Scrn[(w->x1 + start + col + (spl + w->y1) * WindMaxWidth) * sizeof( char_info )]; attr = MAKE_ATTR( w, style->foreground, style->background ); /* * display char */ has_mouse = DisplayMouse( FALSE ); over = &(w->overlap[addr]); tmp.attr = attr; tmp.ch = text; WRITE_SCREEN_DATA( *txt, tmp ); if( *over == NO_CHAR ) { WRITE_SCREEN( *scr, tmp ); } #ifdef __VIO__ MyVioShowBuf( (unsigned)((char *) scr - Scrn), 1 ); #endif ReleaseWindow( w ); DisplayMouse( has_mouse ); return( ERR_NO_ERR ); } /* SetCharInWindowWithColor */
vi_rc DCUpdate( void ) { vi_rc rc; int i, nlines; fcb *fcb; line *line; dc dc; bool firstLine, firstTilde; linenum line_no; int displayOffset; char *displayText; #ifdef __WIN__ HDC hdc_wnd; #ifdef BITBLT_BUFFER_DISPLAY HDC hdc_mem; HBITMAP hbitmap; type_style *ws; #endif #else bool hasMouse; unsigned int hdc_wnd = 0; #endif if( EditFlags.Quiet || CurrentInfo == NULL ) { return( ERR_NO_ERR ); } #ifdef __WIN__ MyHideCaret( CurrentWindow ); hdc_wnd = GetDC( CurrentWindow ); #ifdef BITBLT_BUFFER_DISPLAY hdc_mem = CreateCompatibleDC( hdc_wnd ); ws = &(SEType[SE_WHITESPACE]); hbitmap = CreateCompatibleBitmap( hdc_wnd, WindowAuxInfo( CurrentWindow, WIND_INFO_WIDTH ), FontHeight( ws->font ) ); SelectObject( hdc_mem, hbitmap ); SelectObject( hdc_mem, ColorBrush( ws->background ) ); #endif #else hasMouse = DisplayMouse( false ); #endif rc = CGimmeLinePtr( LeftTopPos.line, &fcb, &line ); if( rc != ERR_NO_ERR ) { return( rc ); } nlines = CurrentInfo->dc_size; dc = CurrentInfo->dc; firstLine = true; firstTilde = true; for( i = 0, line_no = LeftTopPos.line; i < nlines; i++, line_no++ ) { if( dc->display ) { if( line ) { if( firstLine ) { if( dc->valid ) { // major speedup SSInitLanguageFlagsGivenValues( &(dc->flags) ); } else { SSInitLanguageFlags( line_no ); } firstLine = false; } displayText = line->data; if( line->u.ld.nolinedata ) { if( WorkLine->len >= 0 ) { displayText = WorkLine->data; } else { displayText = "*** ERR NULL DATA ***"; } } displayOffset = VirtualLineLen( displayText ); if( displayOffset > LeftTopPos.column ) { displayOffset = LeftTopPos.column; } } else { if( EditFlags.DrawTildes ) { displayText = "~"; } else { displayText = ""; if( firstTilde ) { displayText = EditVars.FileEndString; firstTilde = false; } } displayOffset = 0; } #ifdef BITBLT_BUFFER_DISPLAY DisplayLineInWindowWithSyntaxStyle( CurrentWindow, i + 1, line, line_no, displayText, displayOffset, hdc_wnd, hdc_mem ); #else DisplayLineInWindowWithSyntaxStyle( CurrentWindow, i + 1, line, line_no, displayText, displayOffset, hdc_wnd ); #endif dc->display = false; } else { // just in case displaying 2+ blocks in one update firstLine = true; } if( line ) { rc = CGimmeNextLinePtr( &fcb, &line ); } if( rc != ERR_NO_ERR && rc != ERR_NO_MORE_LINES ) { return( rc ); } dc++; } #ifdef __WIN__ #ifdef BITBLT_BUFFER_DISPLAY DeleteDC( hdc_mem ); DeleteObject( hbitmap ); #endif ReleaseDC( CurrentWindow, hdc_wnd ); MyShowCaret( CurrentWindow ); #else DisplayMouse( hasMouse ); #endif return( ERR_NO_ERR ); }