a_window W5Open( void ) { a_window wnd; wnd = WndCreate( "Just some more text", &W5Info, 0, NULL ); WndSetRepaint( wnd ); WndScrollAbs( wnd, 0 ); WndScrollAbs( wnd, NUM_ROWS ); WndScrollAbs( wnd, NUM_ROWS / 2 ); return( wnd ); }
static void DoWndDirtyScreenPiece( a_window wnd, wnd_row row, wnd_piece piece, wnd_colidx colidx, wnd_colidx end_colidx ) { int i; int same_row; /* check if any piece contains this one */ same_row = -1; for( i = 0; i < wnd->dirtyrects; ++i ) { if( wnd->dirty[i].row != row ) continue; same_row = i; if( wnd->dirty[i].piece == WND_NO_PIECE || piece == WND_NO_PIECE ) { wnd->dirty[i].piece = WND_NO_PIECE; return; } if( wnd->dirty[i].piece != piece ) continue; if( wnd->dirty[i].colidx == WND_NO_COLIDX || colidx == WND_NO_COLIDX ) { wnd->dirty[i].colidx = WND_NO_COLIDX; return; } if( wnd->dirty[i].colidx > colidx ) wnd->dirty[i].colidx = colidx; if( wnd->dirty[i].end_colidx < end_colidx ) wnd->dirty[i].end_colidx = end_colidx; return; } if( wnd->dirtyrects >= WndMaxDirtyRects ) { if( same_row != -1 ) { wnd->dirty[same_row].piece = WND_NO_PIECE; } else { WndSetRepaint( wnd ); } return; } wnd->dirty[wnd->dirtyrects].row = row; wnd->dirty[wnd->dirtyrects].piece = piece; wnd->dirty[wnd->dirtyrects].colidx = colidx; wnd->dirty[wnd->dirtyrects].end_colidx = end_colidx; wnd->dirtyrects++; }
void IONewAddr( a_window wnd, address *addr, int type ) { IOAddNewAddr( wnd, addr, type ); IOMenuItem( wnd, MENU_IO_READ, WndIO( wnd )->num_rows - 1, PIECE_VALUE ); WndSetRepaint( wnd ); }
OVL_EXTERN void IORefresh( a_window wnd ) { WndNoSelect( wnd ); WndSetRepaint( wnd ); }
OVL_EXTERN void IOMenuItem( a_window wnd, gui_ctl_id id, wnd_row row, wnd_piece piece ) { io_window *io = WndIO( wnd ); address addr; bool ok; item_mach item; io_location *curr; mad_radix old_radix; /* unused parameters */ (void)piece; if( row < io->num_rows && row >= 0 ) { curr = &io->list[row]; } else { curr = NULL; } switch( id ) { case MENU_INITIALIZE: if( curr == NULL ) { WndMenuGrayAll( wnd ); } else { WndMenuEnableAll( wnd ); } WndMenuEnable( wnd, MENU_IO_NEW_ADDRESS, true ); break; case MENU_IO_DELETE: io->num_rows--; memcpy( &io->list[row], &io->list[row + 1], ( io->num_rows - row ) * sizeof( io_location ) ); WndNoSelect( wnd ); WndSetRepaint( wnd ); break; case MENU_IO_NEW_ADDRESS: addr = NilAddr; if( !DlgGivenAddr( LIT_DUI( New_Port_Addr ), &addr ) ) return; WndRowDirty( wnd, io->num_rows ); IOAddNewAddr( wnd, &addr, MENU_IO_FIRST_TYPE ); WndScrollBottom( wnd ); break; case MENU_IO_MODIFY: if( row >= io->num_rows || row < 0 ) break; if( piece == PIECE_VALUE ) { old_radix = NewCurrRadix( IOData.info[curr->type].piece_radix ); item.ud = curr->value_known ? curr->value.ud : 0; ok = DlgMadTypeExpr( TxtBuff, &item, IOData.info[curr->type].mth ); if( ok ) { curr->value = item; curr->value_known = true; } NewCurrRadix( old_radix ); } else { addr = curr->addr; if( !DlgGivenAddr( LIT_DUI( New_Port_Addr ), &addr ) ) return; curr->addr = addr; curr->value_known = false; } WndRowDirty( wnd, row ); break; case MENU_IO_READ: curr->value_known = true; if( ItemGetMAD( &curr->addr, &curr->value, IT_IO, IOData.info[curr->type].mth ) == IT_NIL ) { curr->value_known = false; } WndPieceDirty( wnd, row, PIECE_VALUE ); break; case MENU_IO_WRITE: if( curr->value_known ) { ItemPutMAD( &curr->addr, &curr->value, IT_IO, IOData.info[curr->type].mth ); } break; default: curr->type = PIECE_TYPE( id ); WndZapped( wnd ); break; } }
void WndSetTitleSize( a_window wnd, int size ) { wnd->title_size = size; WndSetRepaint( wnd ); }
static void W8Refresh( a_window wnd ) { WndSetRepaint( wnd ); }
void WndPaintDirty( a_window wnd ) { int i; wnd_line_piece line; wnd_line_piece next_piece_line; gui_rect rect; wnd_rect *dirty; 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 ) { WndSetRepaint( wnd ); } if( WndSwitchOn( wnd, WSW_REPAINT ) ) { if( wnd->hscroll_pending != -1 ) { GUIInitHScroll( wnd->gui, wnd->hscroll_pending ); } WndSetRepaint( 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( WndSwitchOn( wnd, WSW_REPAINT ) ) { WndClrSwitches( 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 ) { dirty = &wnd->dirty[i]; if( dirty->row < 0 ) continue; if( dirty->row >= wnd->rows ) continue; if( dirty->piece == WND_NO_PIECE ) { if( !WndGetLine( wnd, dirty->row, 0, &line ) ) continue; GUIWndDirtyRow( wnd->gui, dirty->row ); } else { if( !WndGetLine( wnd, dirty->row, dirty->piece, &line ) ) continue; if( line.bitmap ) { GUIGetHotSpotSize( line.text[0], &size ); rect.x = line.indent; rect.y = dirty->row * wnd->max_char.y; rect.width = line.length; rect.height = size.y; } else if( dirty->colidx != WND_NO_COLIDX ) { if( line.length == 0 ) line.text = " "; rect.x = line.indent; rect.x += GUIGetExtentX(wnd->gui, line.text, dirty->colidx); rect.y = dirty->row * wnd->max_char.y; rect.width = GUIGetExtentX( wnd->gui, line.text + dirty->colidx, dirty->end_colidx - dirty->colidx + GUICharLen( UCHAR_VALUE( line.text[dirty->colidx] ) ) ); 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, dirty->row ); } else { rect.x = line.indent; if( WndGetLine( wnd, dirty->row, dirty->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 = dirty->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 ); } }