Get rid of draw_eraseMiniWindow: just inval what's under it; make use

of CELL_ISCURSOR consistent: when focus not dived all elements have it
set (or only perimeter for board, settable at compile time); get rid
of draw_drawCursor since CELL_ISCURSOR is all that's needed;
This commit is contained in:
ehouse 2007-01-19 08:20:11 +00:00
parent 3a0b5af472
commit c5fe2a7589
4 changed files with 87 additions and 98 deletions

View file

@ -76,7 +76,7 @@ static XP_Bool getCellRect( BoardCtxt* board, XP_U16 col, XP_U16 row,
static XP_Bool coordToCell( BoardCtxt* board, XP_U16 x, XP_U16 y, static XP_Bool coordToCell( BoardCtxt* board, XP_U16 x, XP_U16 y,
XP_U16* colP, XP_U16* rowP ); XP_U16* colP, XP_U16* rowP );
static XP_Bool drawCell( BoardCtxt* board, XP_U16 col, XP_U16 row, static XP_Bool drawCell( BoardCtxt* board, XP_U16 col, XP_U16 row,
XP_Bool skipBlanks, XP_Bool cellFocused ); XP_Bool skipBlanks );
static void figureBoardRect( BoardCtxt* board ); static void figureBoardRect( BoardCtxt* board );
static void drawBoard( BoardCtxt* board ); static void drawBoard( BoardCtxt* board );
@ -501,14 +501,9 @@ invalSelTradeWindow( BoardCtxt* board )
static void static void
hideMiniWindow( BoardCtxt* board, XP_Bool destroy, MiniWindowType winType ) hideMiniWindow( BoardCtxt* board, XP_Bool destroy, MiniWindowType winType )
{ {
XP_Bool invalCovers;
MiniWindowStuff* stuff = &board->miniWindowStuff[winType]; MiniWindowStuff* stuff = &board->miniWindowStuff[winType];
draw_eraseMiniWindow( board->draw, &stuff->rect, board_invalRect( board, &stuff->rect );
destroy, &stuff->closure, &invalCovers );
if ( invalCovers ) {
board_invalRect( board, &stuff->rect );
}
if ( destroy ) { if ( destroy ) {
stuff->text = (XP_UCHAR*)NULL; stuff->text = (XP_UCHAR*)NULL;
@ -884,6 +879,25 @@ board_invalAllTiles( BoardCtxt* board )
board->needsDrawing = XP_TRUE; board->needsDrawing = XP_TRUE;
} /* board_invalAllTiles */ } /* board_invalAllTiles */
#ifdef KEYBOARD_NAV
#ifdef PERIMETER_FOCUS
static void
board_invalPerimeter( BoardCtxt* board )
{
XP_U16 lastRow = model_numRows( board->model ) - 1;
XP_U16 firstAndLast = (1 << lastRow) | 1;
/* top and bottom rows */
board->redrawFlags[lastRow] = ~0;
board->redrawFlags[0] = ~0;
while ( --lastRow > 0 ) {
board->redrawFlags[lastRow] |= firstAndLast;
}
}
#endif
#endif
void void
board_invalAll( BoardCtxt* board ) board_invalAll( BoardCtxt* board )
{ {
@ -1049,6 +1063,34 @@ board_draw( BoardCtxt* board )
return !board->needsDrawing; return !board->needsDrawing;
} /* board_draw */ } /* board_draw */
#ifdef KEYBOARD_NAV
static XP_Bool
cellFocused( const BoardCtxt* board, XP_U16 col, XP_U16 row )
{
XP_Bool focussed = XP_FALSE;
if ( board->focussed == OBJ_BOARD ) {
if ( board->focusHasDived ) {
if ( (col == board->bdCursor[board->selPlayer].col)
&& (row == board->bdCursor[board->selPlayer].row) ) {
focussed = XP_TRUE;
}
} else {
#ifdef PERIMETER_FOCUS
focussed = (col == 0) || (row == 0);
if ( !focussed ) {
XP_U16 lastRow = model_numRows( board->model ) - 1;
focussed = (col == lastRow) || (row == lastRow);
}
#else
focussed = XP_TRUE;
#endif
}
}
return focussed;
} /* cellFocused */
#endif
static void static void
drawBoard( BoardCtxt* board ) drawBoard( BoardCtxt* board )
{ {
@ -1064,17 +1106,6 @@ drawBoard( BoardCtxt* board )
ModelCtxt* model = board->model; ModelCtxt* model = board->model;
BlankQueue bq; BlankQueue bq;
XP_Rect arrowRect; XP_Rect arrowRect;
#ifdef KEYBOARD_NAV
XP_Bool someCellFocused =
(board->focussed == OBJ_BOARD) && board->focusHasDived;
BdCursorLoc cursorLoc;
if ( someCellFocused ) {
cursorLoc = board->bdCursor[board->selPlayer];
}
#else
# define someCellFocused XP_FALSE
#endif
scrollIfCan( board ); /* this must happen before we count blanks scrollIfCan( board ); /* this must happen before we count blanks
since it invalidates squares */ since it invalidates squares */
@ -1094,8 +1125,7 @@ drawBoard( BoardCtxt* board )
lastCol = model_numCols( model ); lastCol = model_numCols( model );
for ( colMask = 1<<(lastCol-1); lastCol--; colMask >>= 1 ) { for ( colMask = 1<<(lastCol-1); lastCol--; colMask >>= 1 ) {
if ( (rowFlags & colMask) != 0 ) { if ( (rowFlags & colMask) != 0 ) {
if ( !drawCell( board, lastCol, row, XP_TRUE, if ( !drawCell( board, lastCol, row, XP_TRUE )) {
someCellFocused )) {
failedBits |= colMask; failedBits |= colMask;
allDrawn = XP_FALSE; allDrawn = XP_FALSE;
} }
@ -1107,8 +1137,7 @@ drawBoard( BoardCtxt* board )
/* draw the blanks we skipped before */ /* draw the blanks we skipped before */
for ( i = 0; i < bq.nBlanks; ++i ) { for ( i = 0; i < bq.nBlanks; ++i ) {
if ( !drawCell( board, bq.col[i], bq.row[i], XP_FALSE, if ( !drawCell( board, bq.col[i], bq.row[i], XP_FALSE ) ) {
someCellFocused ) ) {
allDrawn = XP_FALSE; allDrawn = XP_FALSE;
} }
} }
@ -1129,10 +1158,8 @@ drawBoard( BoardCtxt* board )
col, row ); col, row );
hintAtts = figureHintAtts( board, col, row ); hintAtts = figureHintAtts( board, col, row );
#ifdef KEYBOARD_NAV #ifdef KEYBOARD_NAV
if ( someCellFocused ) { if ( cellFocused( board, col, row ) ) {
if ( cursorLoc.col == col && cursorLoc.row == row ) { flags |= CELL_ISCURSOR;
flags |= CELL_ISCURSOR;
}
} }
#endif #endif
draw_drawBoardArrow( board->draw, &arrowRect, bonus, draw_drawBoardArrow( board->draw, &arrowRect, bonus,
@ -1141,15 +1168,6 @@ drawBoard( BoardCtxt* board )
} }
} }
#ifdef KEYBOARD_NAV
if ( someCellFocused ) {
XP_Rect crect;
if ( getCellRect( board, cursorLoc.col, cursorLoc.row, &crect ) ){
draw_drawCursor( board->draw, OBJ_BOARD, &crect );
}
}
#endif
drawTradeWindowIf( board ); drawTradeWindowIf( board );
draw_objFinished( board->draw, OBJ_BOARD, &board->boardBounds, draw_objFinished( board->draw, OBJ_BOARD, &board->boardBounds,
@ -1582,8 +1600,7 @@ board_requestHint( BoardCtxt* board,
} /* board_requestHint */ } /* board_requestHint */
static XP_Bool static XP_Bool
drawCell( BoardCtxt* board, XP_U16 col, XP_U16 row, XP_Bool skipBlanks, drawCell( BoardCtxt* board, XP_U16 col, XP_U16 row, XP_Bool skipBlanks )
XP_Bool XP_UNUSED_KEYBOARD_NAV(cellFocused) )
{ {
XP_Rect cellRect; XP_Rect cellRect;
Tile tile; Tile tile;
@ -1656,9 +1673,7 @@ drawCell( BoardCtxt* board, XP_U16 col, XP_U16 row, XP_Bool skipBlanks,
flags |= CELL_ISBLANK; flags |= CELL_ISBLANK;
} }
#ifdef KEYBOARD_NAV #ifdef KEYBOARD_NAV
if ( cellFocused if ( cellFocused( board, col, row ) ) {
&& (col == board->bdCursor[selPlayer].col)
&& (row == board->bdCursor[selPlayer].row) ) {
flags |= CELL_ISCURSOR; flags |= CELL_ISCURSOR;
} }
#endif #endif
@ -2624,30 +2639,6 @@ handleFocusKeyUp( BoardCtxt* board, XP_Key key, XP_Bool preflightOnly,
return redraw; return redraw;
} /* handleFocusKeyUp */ } /* handleFocusKeyUp */
XP_Bool
board_handleKeyDown( BoardCtxt* board, XP_Key key, XP_Bool* pHandled )
{
XP_Bool draw = XP_FALSE;
XP_U16 x, y;
*pHandled = XP_FALSE;
if ( key == XP_RETURN_KEY ) {
if ( focusToCoords( board, &x, &y ) ) {
draw = handleLikeDown( board, board->focussed, x, y );
*pHandled = draw;
}
} else if ( board->focussed != OBJ_NONE ) {
if ( board->focusHasDived && (key == XP_RAISEFOCUS_KEY) ) {
*pHandled = XP_TRUE;
} else {
draw = handleFocusKeyUp( board, key, XP_TRUE, pHandled ) || draw;
}
}
return draw;
}
XP_Bool XP_Bool
board_handleKeyRepeat( BoardCtxt* board, XP_Key key, XP_Bool* handled ) board_handleKeyRepeat( BoardCtxt* board, XP_Key key, XP_Bool* handled )
{ {
@ -2666,6 +2657,31 @@ board_handleKeyRepeat( BoardCtxt* board, XP_Key key, XP_Bool* handled )
#endif /* KEYBOARD_NAV */ #endif /* KEYBOARD_NAV */
#ifdef KEY_SUPPORT #ifdef KEY_SUPPORT
XP_Bool
board_handleKeyDown( BoardCtxt* board, XP_Key key, XP_Bool* pHandled )
{
XP_Bool draw = XP_FALSE;
#ifdef KEYBOARD_NAV
XP_U16 x, y;
*pHandled = XP_FALSE;
if ( key == XP_RETURN_KEY ) {
if ( focusToCoords( board, &x, &y ) ) {
draw = handleLikeDown( board, board->focussed, x, y );
*pHandled = draw;
}
} else if ( board->focussed != OBJ_NONE ) {
if ( board->focusHasDived && (key == XP_RAISEFOCUS_KEY) ) {
*pHandled = XP_TRUE;
} else {
draw = handleFocusKeyUp( board, key, XP_TRUE, pHandled ) || draw;
}
}
#endif
return draw;
} /* board_handleKeyDown */
XP_Bool XP_Bool
board_handleKeyUp( BoardCtxt* board, XP_Key key, XP_Bool* pHandled ) board_handleKeyUp( BoardCtxt* board, XP_Key key, XP_Bool* pHandled )
{ {
@ -2746,11 +2762,9 @@ board_handleKey( BoardCtxt* board, XP_Key key, XP_Bool* handled )
*handled = handled1 || handled2; *handled = handled1 || handled2;
return draw; return draw;
} }
#endif /* KEY_SUPPORT */
#endif
#ifdef KEYBOARD_NAV #ifdef KEYBOARD_NAV
static XP_Bool static XP_Bool
invalFocusOwner( BoardCtxt* board ) invalFocusOwner( BoardCtxt* board )
{ {
@ -2765,7 +2779,11 @@ invalFocusOwner( BoardCtxt* board )
BdCursorLoc loc = board->bdCursor[selPlayer]; BdCursorLoc loc = board->bdCursor[selPlayer];
invalCell( board, loc.col, loc.row ); invalCell( board, loc.col, loc.row );
} else { } else {
#ifdef PERIMETER_FOCUS
board_invalPerimeter( board );
#else
board_invalAllTiles( board ); board_invalAllTiles( board );
#endif
} }
break; break;
case OBJ_TRAY: case OBJ_TRAY:

View file

@ -1,6 +1,6 @@
/* -*-mode: C; fill-column: 78; c-basic-offset: 4; -*- */ /* -*-mode: C; fill-column: 78; c-basic-offset: 4; -*- */
/* /*
* Copyright 1997 - 2002 by Eric House (xwords@eehouse.org). All rights reserved. * Copyright 1997 - 2007 by Eric House (xwords@eehouse.org). All rights reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
@ -175,20 +175,12 @@ typedef struct DrawCtxVTable {
XWBonusType bonus, XP_Bool vert, XWBonusType bonus, XP_Bool vert,
HintAtts hintAtts, HintAtts hintAtts,
CellFlags flags); CellFlags flags);
#ifdef KEY_SUPPORT
void DRAW_VTABLE_NAME(drawCursor) ( DrawCtx* dctx, BoardObjectType typ,
const XP_Rect* rect );
#endif
XP_UCHAR* DRAW_VTABLE_NAME(getMiniWText) ( DrawCtx* dctx, XP_UCHAR* DRAW_VTABLE_NAME(getMiniWText) ( DrawCtx* dctx,
XWMiniTextType textHint ); XWMiniTextType textHint );
void DRAW_VTABLE_NAME(measureMiniWText) ( DrawCtx* dctx, const XP_UCHAR* textP, void DRAW_VTABLE_NAME(measureMiniWText) ( DrawCtx* dctx, const XP_UCHAR* textP,
XP_U16* width, XP_U16* height ); XP_U16* width, XP_U16* height );
void DRAW_VTABLE_NAME(drawMiniWindow)( DrawCtx* dctx, const XP_UCHAR* text, void DRAW_VTABLE_NAME(drawMiniWindow)( DrawCtx* dctx, const XP_UCHAR* text,
const XP_Rect* rect, void** closure ); const XP_Rect* rect, void** closure );
void DRAW_VTABLE_NAME(eraseMiniWindow)( DrawCtx* dctx, const XP_Rect* rect,
XP_Bool lastTime, void** closure,
XP_Bool* invalUnder );
#ifndef DRAW_LINK_DIRECT #ifndef DRAW_LINK_DIRECT
} DrawCtxVTable; /* */ } DrawCtxVTable; /* */
#endif #endif
@ -266,19 +258,12 @@ struct DrawCtx {
#define draw_clearRect( dc, rect ) CALL_DRAW_NAME1(clearRect,(dc),(rect)) #define draw_clearRect( dc, rect ) CALL_DRAW_NAME1(clearRect,(dc),(rect))
#define draw_drawBoardArrow( dc, r, b, v, h, f ) \ #define draw_drawBoardArrow( dc, r, b, v, h, f ) \
CALL_DRAW_NAME5(drawBoardArrow,(dc),(r),(b), (v), (h), (f)) CALL_DRAW_NAME5(drawBoardArrow,(dc),(r),(b), (v), (h), (f))
#ifdef KEY_SUPPORT
# define draw_drawCursor( dc, t, r ) CALL_DRAW_NAME2(drawCursor,(dc),(t),(r))
#else
# define draw_drawCursor( dc, t, r )
#endif
#define draw_getMiniWText( dc, b ) CALL_DRAW_NAME1(getMiniWText, (dc),(b) ) #define draw_getMiniWText( dc, b ) CALL_DRAW_NAME1(getMiniWText, (dc),(b) )
#define draw_measureMiniWText( dc, t, wp, hp) \ #define draw_measureMiniWText( dc, t, wp, hp) \
CALL_DRAW_NAME3(measureMiniWText, (dc),(t), (wp), (hp) ) CALL_DRAW_NAME3(measureMiniWText, (dc),(t), (wp), (hp) )
#define draw_drawMiniWindow( dc, t, r, c ) \ #define draw_drawMiniWindow( dc, t, r, c ) \
CALL_DRAW_NAME3(drawMiniWindow, (dc), (t), (r), (c) ) CALL_DRAW_NAME3(drawMiniWindow, (dc), (t), (r), (c) )
#define draw_eraseMiniWindow(dc, r, l, c, b) \
CALL_DRAW_NAME4(eraseMiniWindow, (dc), (r), (l), (c), (b) )
#ifdef DRAW_WITH_PRIMITIVES #ifdef DRAW_WITH_PRIMITIVES
# define draw_setClip( dc, rn, ro ) CALL_DRAW_NAME2(setClip, (dc), (rn), (ro)) # define draw_setClip( dc, rn, ro ) CALL_DRAW_NAME2(setClip, (dc), (rn), (ro))

View file

@ -182,12 +182,6 @@ drawScoreBoard( BoardCtxt* board )
*adjustPt += *adjustDim; *adjustPt += *adjustDim;
} }
#ifdef KEYBOARD_NAV
if ( !!cursorRectP ) {
draw_drawCursor( board->draw, OBJ_SCORE, cursorRectP );
}
#endif
draw_objFinished( board->draw, OBJ_SCORE, &board->scoreBdBounds, draw_objFinished( board->draw, OBJ_SCORE, &board->scoreBdBounds,
dfsFor( board, OBJ_SCORE ) ); dfsFor( board, OBJ_SCORE ) );
} }

View file

@ -203,15 +203,7 @@ drawTray( BoardCtxt* board )
} }
drawPendingScore( board, drawPendingScore( board,
(cursorBits & (1<<(MAX_TRAY_TILES-1))) != 0 ); (cursorBits & (1<<(MAX_TRAY_TILES-1))) != 0);
#ifdef KEYBOARD_NAV
if ( (cursorBits != 0) && (cursorBits != ALLTILES) ) {
figureTrayTileRect( board, indexForBits(cursorBits),
&tileRect );
draw_drawCursor( board->draw, OBJ_TRAY, &tileRect );
}
#endif
} }
draw_objFinished( board->draw, OBJ_TRAY, &board->trayBounds, draw_objFinished( board->draw, OBJ_TRAY, &board->trayBounds,