extern void WndSelPopPiece( a_window *wnd, bool paint_immed ) { wnd_row row; wnd_coord *start; wnd_coord *end; int piece; int buff_size; char *ptr; int first; int len; wnd_line_piece line; _Clr( wnd, WSW_SELECTING ); _Clr( wnd, WSW_SELECTING_WITH_KEYBOARD ); WndSelEnds( wnd, &start, &end ); if( _Isnt( wnd, WSW_SUBWORD_SELECT ) || ( start->row == end->row && start->piece == end->piece && start->col == end->col ) ) { WndGetLine( wnd, start->row, start->piece, &line ); GoBackward( wnd, start, &line ); WndGetLine( wnd, end->row, end->piece, &line ); GoForward( wnd, end, &line ); if( end->row != start->row ) { GUIWndDirtyRow( wnd->gui, end->row ); GUIWndDirtyRow( wnd->gui, start->row ); } else if( paint_immed ) { GUIWndDirtyRow( wnd->gui, start->row ); } else { WndDirtyScreenRange( wnd, start, end->col ); } } buff_size = 0; for( row = start->row; row <= end->row; ++row ) { for( piece = 0; ; ++piece ) { if( !WndGetLine( wnd, row, piece, &line ) ) break; if( WndSelected( wnd, &line, row, piece, &first, &len ) ) { buff_size += len + 1; } } } WndFree( wnd->popitem ); wnd->popitem = WndMustAlloc( buff_size+2 ); ptr = wnd->popitem; for( row = start->row; row <= end->row; ++row ) { for( piece = 0; ; ++piece ) { if( !WndGetLine( wnd, row, piece, &line ) ) break; if( WndSelected( wnd, &line, row, piece, &first, &len ) ) { if( ptr != wnd->popitem ) *ptr++ = ' '; memcpy( ptr, line.text+first, len ); ptr += len; } } } *ptr = '\0'; }
static void WndPaintRows( a_window *wnd, wnd_row start_row, int num ) { wnd_row row; wnd_row row_to_get; int piece; wnd_line_piece line; wnd_row notify_row; int notify_piece; wnd_attr piece0_attr; wnd_attr prev_attr; bool had_cache; had_cache = WndSetCache( wnd, FALSE ); WndBegPaint( wnd, start_row, num ); notify_row = WND_NO_ROW; for( row = start_row; row < start_row + num; ++row ) { for( piece = 0; ; ++piece ) { if( row < wnd->title_size ) { row_to_get = row - wnd->top; } else { row_to_get = row; } if( !WndGetLine( wnd, row_to_get, piece, &line ) ) break; if( line.tabstop && wnd->current.row == row && wnd->current.piece == piece ) { notify_row = row; notify_piece = piece; if( _Is( wnd, WSW_HIGHLIGHT_CURRENT ) ) { line.attr = WndMapTabAttr( line.attr ); } } if( piece == 0 ) { piece0_attr = line.attr; } else if( line.use_piece0_attr ) { line.attr = piece0_attr; } if( line.use_prev_attr ) { line.attr = prev_attr; } prev_attr = line.attr; WndDrawTheLine( wnd, &line, row ); if( !line.bitmap ) { WndDrawSelect( wnd, &line, row, piece ); WndDrawCursor( wnd, &line, row, piece ); } } } WndEndPaint( wnd, start_row, num ); WndSetCache( wnd, had_cache ); if( wnd->max_indent != 0 ) { GUISetHScrollRange( wnd->gui, wnd->max_indent ); } if( notify_row != WND_NO_ROW ) { WndNotify( wnd, notify_row, notify_piece ); } }
static bool WndCursorRightCheck( a_window *wnd ) { wnd_line_piece line; int col; bool got; got = WndGetLine( wnd, wnd->current.row, wnd->current.piece, &line ); if( _Isnt( wnd, WSW_CHAR_CURSOR ) || !WndHasCurrent( wnd ) || !got || wnd->current.col + 1 >= line.length ) { return( WndTabRight( wnd, false ) ); } else { WndDirtyCurrChar( wnd ); col = wnd->current.col; wnd->current.col += GUICharLen( line.text[wnd->current.col] ); WndSetCurrCol( wnd ); WndCurrVisible( wnd ); WndDirtyCurrChar( wnd ); return( col != wnd->current.col ); } }
static bool WndCursorLeftCheck( a_window *wnd ) { int col; wnd_line_piece line; if( _Isnt( wnd, WSW_CHAR_CURSOR )|| !WndHasCurrent( wnd ) || wnd->current.col == 0 ) { if( !WndTabLeft( wnd, false ) ) return( false ); wnd->current.col = WND_MAX_COL; WndSetCurrCol( wnd ); WndCurrVisible( wnd ); WndDirtyCurrChar( wnd ); return( true ); } else { WndGetLine( wnd, wnd->current.row, wnd->current.piece, &line ); WndDirtyCurrChar( wnd ); col = wnd->current.col; wnd->current.col = WndPrevCharCol( line.text, wnd->current.col ); WndSetCurrCol( wnd ); WndCurrVisible( wnd ); WndDirtyCurrChar( wnd ); return( col != wnd->current.col ); } }
void WndPaintDirt( a_window *wnd ) { int i; wnd_line_piece line; wnd_line_piece next_piece_line; gui_rect rect; wnd_dirt *dirt; gui_coord size; gui_coord half_char; a_window *next; // a_window *last; // last = NULL; for( wnd = WndNext( NULL ); wnd != NULL; wnd = next ) { next = WndNext( wnd ); if( wnd->vscroll_pending != 0 ) { if( wnd->hscroll_pending != -1 ) { _Set( wnd, WSW_REPAINT ); } if( _Is( wnd, WSW_REPAINT ) ) { if( wnd->hscroll_pending != -1 ) { GUIInitHScroll( wnd->gui, wnd->hscroll_pending ); } WndRepaint( wnd ); wnd->hscroll_pending = -1; wnd->vscroll_pending = 0; } else { for( i = 0; i < wnd->title_size; ++i ) { GUIDrawTextExtent( wnd->gui, " ", 1, i, 0, GUI_BACKGROUND, GUI_NO_COLUMN ); } GUIDoVScrollClip( wnd->gui, wnd->vscroll_pending, wnd->title_size, wnd->rows - 1 ); wnd->vscroll_pending = 0; } } if( _Is( wnd, WSW_REPAINT ) ) { _Clr( wnd, WSW_REPAINT ); WndKillCacheLines( wnd ); WndCheckCurrentValid( wnd ); GUIWndDirty( wnd->gui ); if( wnd->max_indent != 0 && wnd->width >= wnd->max_indent ) { GUISetHScroll( wnd->gui, 0 ); wnd->hscroll_pending = -1; GUISetHScrollRange( wnd->gui, wnd->max_indent ); } next = wnd; } else { for( i = 0; i < wnd->dirtyrects; ++i ) { dirt = &wnd->dirty[i]; if( dirt->row < 0 ) continue; if( dirt->row >= wnd->rows ) continue; if( dirt->piece == WND_NO_PIECE ) { if( !WndGetLine( wnd, dirt->row, 0, &line ) ) continue; GUIWndDirtyRow( wnd->gui, dirt->row ); } else { if( !WndGetLine( wnd, dirt->row, dirt->piece, &line ) ) continue; if( line.bitmap ) { GUIGetHotSpotSize( line.text[0], &size ); rect.x = line.indent; rect.y = dirt->row * wnd->max_char.y; rect.width = line.length; rect.height = size.y; } else if( dirt->col != WND_NO_COL ) { if( line.length == 0 ) line.text = " "; rect.x = line.indent; rect.x += GUIGetExtentX(wnd->gui, line.text, dirt->col); rect.y = dirt->row * wnd->max_char.y; rect.width = GUIGetExtentX( wnd->gui, line.text+dirt->col, dirt->end_col-dirt->col+GUICharLen( line.text[dirt->col] ) ); rect.height = wnd->max_char.y; } else if( line.extent == WND_MAX_EXTEND || line.master_tabstop ) { rect.width = 0; rect.height = 0; GUIWndDirtyRow( wnd->gui, dirt->row ); } else { rect.x = line.indent; if( WndGetLine( wnd, dirt->row, dirt->piece+1, &next_piece_line ) ) { if( next_piece_line.indent < line.indent ) { rect.width = WND_APPROX_SIZE; } else { rect.width = next_piece_line.indent - line.indent; } } else { rect.width = WND_APPROX_SIZE; } rect.y = dirt->row * wnd->max_char.y; rect.height = wnd->max_char.y; } /* begin kludge for Kerning problem */ if( rect.width != 0 || rect.height != 0 ) { half_char.x = WndAvgCharX( wnd ) / 2; half_char.y = 0; GUITruncToPixel( &half_char ); if( rect.x < half_char.x ) { rect.width += half_char.x + rect.x; rect.x = 0; } else { rect.x -= half_char.x; rect.width += half_char.x + half_char.x; } GUIWndDirtyRect( wnd->gui, &rect ); } } } } if( wnd->hscroll_pending != -1 ) { GUISetHScroll( wnd->gui, wnd->hscroll_pending ); wnd->hscroll_pending = -1; } wnd->dirtyrects = 0; WndSetThumb( wnd ); } }
bool WndGetLineAbs( a_window *wnd, int row, int piece, wnd_line_piece *line ) { return( WndGetLine( wnd, WndScreenRow( wnd, row ), piece, line ) ); }