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'; }
extern void WndRowDirtyImmed( a_window *wnd, wnd_row row ) { int screen_row; screen_row = WndScreenRow( wnd, row ); if( screen_row > 0 && screen_row < wnd->rows ) { WndKillCacheEntries( wnd, row, WND_NO_PIECE ); GUIWndDirtyRow( wnd->gui, screen_row ); } }
void StatusLines( int msg0, const char *message1 ) /************************************************/ { if( StatusWnd != NULL ) { if( message1 != NULL ) { if( strcmp( message1, StatusLine1 ) != 0 ) { strcpy( StatusLine1, message1 ); GUIWndDirtyRow( StatusWnd, LINE1_ROW ); } } if( msg0 != STAT_SAME ) { if( msg0 != MsgLine0 ) { MsgLine0 = msg0; GUIWndDirty( StatusWnd ); } } } }
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 ); } }