mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-30 08:34:16 +01:00
Use new top-level focus drawing model, and new API indicating whether
key handled.
This commit is contained in:
parent
abca6a4092
commit
cac0fd94d7
3 changed files with 103 additions and 54 deletions
|
@ -220,11 +220,11 @@ curses_draw_score_pendingScore( DrawCtx* p_dctx, const XP_Rect* rect,
|
||||||
} /* curses_draw_score_pendingScore */
|
} /* curses_draw_score_pendingScore */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
curses_draw_objFinished( DrawCtx* p_dctx, BoardObjectType XP_UNUSED(typ),
|
curses_draw_objFinished( DrawCtx* p_dctx, BoardObjectType typ,
|
||||||
const XP_Rect* rect, DrawFocusState dfs )
|
const XP_Rect* rect, DrawFocusState dfs )
|
||||||
{
|
{
|
||||||
CursesDrawCtx* dctx = (CursesDrawCtx*)p_dctx;
|
CursesDrawCtx* dctx = (CursesDrawCtx*)p_dctx;
|
||||||
if ( dfs == DFS_TOP ) {
|
if ( dfs == DFS_TOP && typ == OBJ_BOARD ) {
|
||||||
cursesHiliteRect( dctx->boardWin, rect );
|
cursesHiliteRect( dctx->boardWin, rect );
|
||||||
}
|
}
|
||||||
wrefresh( dctx->boardWin );
|
wrefresh( dctx->boardWin );
|
||||||
|
@ -245,6 +245,10 @@ curses_draw_score_drawPlayer( DrawCtx* p_dctx, const XP_Rect* rInner,
|
||||||
/* print the name and turn/remoteness indicator */
|
/* print the name and turn/remoteness indicator */
|
||||||
formatScoreText( buf, dsi );
|
formatScoreText( buf, dsi );
|
||||||
mvwprintw( dctx->boardWin, y, rOuter->left, buf );
|
mvwprintw( dctx->boardWin, y, rOuter->left, buf );
|
||||||
|
|
||||||
|
if ( (dsi->flags&CELL_ISCURSOR) != 0 ) {
|
||||||
|
cursesHiliteRect( dctx->boardWin, rOuter );
|
||||||
|
}
|
||||||
} /* curses_draw_score_drawPlayer */
|
} /* curses_draw_score_drawPlayer */
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
|
@ -335,14 +339,21 @@ curses_draw_drawTile( DrawCtx* p_dctx, const XP_Rect* rect,
|
||||||
mvwaddnstr( dctx->boardWin, rect->top+rect->height-1,
|
mvwaddnstr( dctx->boardWin, rect->top+rect->height-1,
|
||||||
rect->left, "*-*", 3 );
|
rect->left, "*-*", 3 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( (flags&CELL_ISCURSOR) != 0 ) {
|
||||||
|
cursesHiliteRect( dctx->boardWin, rect );
|
||||||
|
}
|
||||||
} /* curses_draw_drawTile */
|
} /* curses_draw_drawTile */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
curses_draw_drawTileBack( DrawCtx* p_dctx, const XP_Rect* rect,
|
curses_draw_drawTileBack( DrawCtx* p_dctx, const XP_Rect* rect,
|
||||||
CellFlags XP_UNUSED(flags) )
|
CellFlags flags )
|
||||||
{
|
{
|
||||||
CursesDrawCtx* dctx = (CursesDrawCtx*)p_dctx;
|
CursesDrawCtx* dctx = (CursesDrawCtx*)p_dctx;
|
||||||
curses_stringInTile( dctx, rect, "?", "?" );
|
curses_stringInTile( dctx, rect, "?", "?" );
|
||||||
|
if ( (flags&CELL_ISCURSOR) != 0 ) {
|
||||||
|
cursesHiliteRect( dctx->boardWin, rect );
|
||||||
|
}
|
||||||
} /* curses_draw_drawTileBack */
|
} /* curses_draw_drawTileBack */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -374,11 +385,13 @@ curses_draw_drawBoardArrow( DrawCtx* p_dctx, const XP_Rect* rect,
|
||||||
} /* curses_draw_drawBoardArrow */
|
} /* curses_draw_drawBoardArrow */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
curses_draw_drawCursor( DrawCtx* p_dctx, BoardObjectType XP_UNUSED(typ),
|
curses_draw_drawCursor( DrawCtx* p_dctx, BoardObjectType typ,
|
||||||
const XP_Rect* rect )
|
const XP_Rect* rect )
|
||||||
{
|
{
|
||||||
CursesDrawCtx* dctx = (CursesDrawCtx*)p_dctx;
|
CursesDrawCtx* dctx = (CursesDrawCtx*)p_dctx;
|
||||||
|
if ( typ == OBJ_BOARD ) {
|
||||||
cursesHiliteRect( dctx->boardWin, rect );
|
cursesHiliteRect( dctx->boardWin, rect );
|
||||||
|
}
|
||||||
} /* curses_draw_drawBoardCursor */
|
} /* curses_draw_drawBoardCursor */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -228,30 +228,6 @@ curses_util_engineProgressCallback( XW_UtilCtxt* XP_UNUSED(uc) )
|
||||||
return XP_TRUE;
|
return XP_TRUE;
|
||||||
} /* curses_util_engineProgressCallback */
|
} /* curses_util_engineProgressCallback */
|
||||||
|
|
||||||
static void
|
|
||||||
curses_util_notifyFocusChange( XW_UtilCtxt* uc, BoardObjectType cur,
|
|
||||||
XP_Key key, BoardObjectType* nextP )
|
|
||||||
{
|
|
||||||
BoardObjectType nxt;
|
|
||||||
CursesAppGlobals* globals;
|
|
||||||
|
|
||||||
XP_LOGF( "%s(%s)", __FUNCTION__, BoardObjectType_2str(cur) );
|
|
||||||
XP_Bool forward = key == XP_CURSOR_KEY_DOWN
|
|
||||||
|| key == XP_CURSOR_KEY_RIGHT;
|
|
||||||
switch( cur ) {
|
|
||||||
case OBJ_SCORE: nxt = forward? OBJ_TRAY : OBJ_BOARD; break;
|
|
||||||
case OBJ_BOARD: nxt = forward? OBJ_SCORE : OBJ_TRAY; break;
|
|
||||||
case OBJ_TRAY: nxt = forward? OBJ_BOARD : OBJ_SCORE; break;
|
|
||||||
case OBJ_NONE: nxt = OBJ_BOARD;
|
|
||||||
}
|
|
||||||
|
|
||||||
globals = (CursesAppGlobals*)uc->closure;
|
|
||||||
changeMenuForFocus( globals, nxt );
|
|
||||||
|
|
||||||
*nextP = nxt;
|
|
||||||
XP_LOGF( "%s()=>%s", __FUNCTION__, BoardObjectType_2str(*nextP) );
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef XWFEATURE_RELAY
|
#ifdef XWFEATURE_RELAY
|
||||||
static void
|
static void
|
||||||
curses_util_setTimer( XW_UtilCtxt* uc, XWTimerReason why, XP_U16 when,
|
curses_util_setTimer( XW_UtilCtxt* uc, XWTimerReason why, XP_U16 when,
|
||||||
|
@ -360,18 +336,20 @@ checkAssignFocus( BoardCtxt* board )
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
handleSpace( CursesAppGlobals* globals )
|
handleSpace( CursesAppGlobals* globals )
|
||||||
{
|
{
|
||||||
|
XP_Bool handled;
|
||||||
checkAssignFocus( globals->cGlobals.game.board );
|
checkAssignFocus( globals->cGlobals.game.board );
|
||||||
|
|
||||||
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
||||||
XP_RAISEFOCUS_KEY );
|
XP_RAISEFOCUS_KEY, &handled );
|
||||||
return XP_TRUE;
|
return XP_TRUE;
|
||||||
} /* handleSpace */
|
} /* handleSpace */
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
handleRet( CursesAppGlobals* globals )
|
handleRet( CursesAppGlobals* globals )
|
||||||
{
|
{
|
||||||
|
XP_Bool handled;
|
||||||
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
||||||
XP_RETURN_KEY );
|
XP_RETURN_KEY, &handled );
|
||||||
return XP_TRUE;
|
return XP_TRUE;
|
||||||
} /* handleRet */
|
} /* handleRet */
|
||||||
|
|
||||||
|
@ -433,8 +411,9 @@ handleToggleValues( CursesAppGlobals* globals )
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
handleBackspace( CursesAppGlobals* globals )
|
handleBackspace( CursesAppGlobals* globals )
|
||||||
{
|
{
|
||||||
|
XP_Bool handled;
|
||||||
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
||||||
XP_CURSOR_KEY_DEL );
|
XP_CURSOR_KEY_DEL, &handled );
|
||||||
return XP_TRUE;
|
return XP_TRUE;
|
||||||
} /* handleBackspace */
|
} /* handleBackspace */
|
||||||
|
|
||||||
|
@ -478,40 +457,87 @@ MenuList sharedMenuList[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef KEYBOARD_NAV
|
#ifdef KEYBOARD_NAV
|
||||||
|
static XP_Bool
|
||||||
|
shiftFocus( CursesAppGlobals* globals, XP_Key key )
|
||||||
|
{
|
||||||
|
BoardCtxt* board = globals->cGlobals.game.board;
|
||||||
|
BoardObjectType typ = board_getFocusOwner( board );
|
||||||
|
BoardObjectType nxt;
|
||||||
|
XP_Bool forward = key == XP_CURSOR_KEY_DOWN || key == XP_CURSOR_KEY_RIGHT;
|
||||||
|
XP_Bool handled;
|
||||||
|
|
||||||
|
switch( typ ) {
|
||||||
|
case OBJ_NONE:
|
||||||
|
XP_ASSERT( 0 ); /* not in curses anyway */
|
||||||
|
break;
|
||||||
|
case OBJ_SCORE:
|
||||||
|
if ( forward ) {
|
||||||
|
nxt = OBJ_TRAY;
|
||||||
|
} else {
|
||||||
|
nxt = OBJ_BOARD;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OBJ_BOARD:
|
||||||
|
if ( forward ) {
|
||||||
|
nxt = OBJ_SCORE;
|
||||||
|
} else {
|
||||||
|
nxt = OBJ_TRAY;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OBJ_TRAY:
|
||||||
|
if ( forward ) {
|
||||||
|
nxt = OBJ_BOARD;
|
||||||
|
} else {
|
||||||
|
nxt = OBJ_SCORE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
handled = board_focusChanged( board, nxt, XP_TRUE );
|
||||||
|
if ( handled ) {
|
||||||
|
changeMenuForFocus( globals, nxt );
|
||||||
|
}
|
||||||
|
return handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
static XP_Bool
|
||||||
|
handleFocusKey( CursesAppGlobals* globals, XP_Key key )
|
||||||
|
{
|
||||||
|
XP_Bool handled;
|
||||||
|
XP_Bool draw;
|
||||||
|
|
||||||
|
checkAssignFocus( globals->cGlobals.game.board );
|
||||||
|
|
||||||
|
draw = board_handleKey( globals->cGlobals.game.board, key, &handled );
|
||||||
|
if ( !handled ) {
|
||||||
|
draw = shiftFocus( globals, key ) || draw;
|
||||||
|
}
|
||||||
|
|
||||||
|
globals->doDraw = draw || globals->doDraw;
|
||||||
|
return XP_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
handleLeft( CursesAppGlobals* globals )
|
handleLeft( CursesAppGlobals* globals )
|
||||||
{
|
{
|
||||||
checkAssignFocus( globals->cGlobals.game.board );
|
return handleFocusKey( globals, XP_CURSOR_KEY_LEFT );
|
||||||
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
|
||||||
XP_CURSOR_KEY_LEFT );
|
|
||||||
return XP_TRUE;
|
|
||||||
} /* handleLeft */
|
} /* handleLeft */
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
handleRight( CursesAppGlobals* globals )
|
handleRight( CursesAppGlobals* globals )
|
||||||
{
|
{
|
||||||
checkAssignFocus( globals->cGlobals.game.board );
|
return handleFocusKey( globals, XP_CURSOR_KEY_RIGHT );
|
||||||
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
|
||||||
XP_CURSOR_KEY_RIGHT );
|
|
||||||
return XP_TRUE;
|
|
||||||
} /* handleRight */
|
} /* handleRight */
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
handleUp( CursesAppGlobals* globals )
|
handleUp( CursesAppGlobals* globals )
|
||||||
{
|
{
|
||||||
checkAssignFocus( globals->cGlobals.game.board );
|
return handleFocusKey( globals, XP_CURSOR_KEY_UP );
|
||||||
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
|
||||||
XP_CURSOR_KEY_UP );
|
|
||||||
return XP_TRUE;
|
|
||||||
} /* handleUp */
|
} /* handleUp */
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
handleDown( CursesAppGlobals* globals )
|
handleDown( CursesAppGlobals* globals )
|
||||||
{
|
{
|
||||||
checkAssignFocus( globals->cGlobals.game.board );
|
return handleFocusKey( globals, XP_CURSOR_KEY_DOWN );
|
||||||
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
|
||||||
XP_CURSOR_KEY_DOWN );
|
|
||||||
return XP_TRUE;
|
|
||||||
} /* handleDown */
|
} /* handleDown */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -944,10 +970,6 @@ setupCursesUtilCallbacks( CursesAppGlobals* globals, XW_UtilCtxt* util )
|
||||||
util->vtable->m_util_engineProgressCallback =
|
util->vtable->m_util_engineProgressCallback =
|
||||||
curses_util_engineProgressCallback;
|
curses_util_engineProgressCallback;
|
||||||
|
|
||||||
#ifdef KEYBOARD_NAV
|
|
||||||
util->vtable->m_util_notifyFocusChange = curses_util_notifyFocusChange;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XWFEATURE_RELAY
|
#ifdef XWFEATURE_RELAY
|
||||||
util->vtable->m_util_setTimer = curses_util_setTimer;
|
util->vtable->m_util_setTimer = curses_util_setTimer;
|
||||||
#endif
|
#endif
|
||||||
|
@ -985,7 +1007,8 @@ passKeyToBoard( CursesAppGlobals* globals, char ch )
|
||||||
XP_Bool handled = ch >= 'a' && ch <= 'z';
|
XP_Bool handled = ch >= 'a' && ch <= 'z';
|
||||||
if ( handled ) {
|
if ( handled ) {
|
||||||
ch += 'A' - 'a';
|
ch += 'A' - 'a';
|
||||||
globals->doDraw = board_handleKey( globals->cGlobals.game.board, ch );
|
globals->doDraw = board_handleKey( globals->cGlobals.game.board,
|
||||||
|
ch, NULL );
|
||||||
}
|
}
|
||||||
return handled;
|
return handled;
|
||||||
} /* passKeyToBoard */
|
} /* passKeyToBoard */
|
||||||
|
|
|
@ -158,6 +158,7 @@ key_release_event( GtkWidget* XP_UNUSED(widget), GdkEventKey* event,
|
||||||
GtkAppGlobals* globals )
|
GtkAppGlobals* globals )
|
||||||
{
|
{
|
||||||
XP_Key xpkey = XP_KEY_NONE;
|
XP_Key xpkey = XP_KEY_NONE;
|
||||||
|
XP_Bool movesCursor = XP_FALSE;
|
||||||
guint keyval = event->keyval;
|
guint keyval = event->keyval;
|
||||||
|
|
||||||
XP_LOGF( "got key 0x%x", keyval );
|
XP_LOGF( "got key 0x%x", keyval );
|
||||||
|
@ -166,15 +167,19 @@ key_release_event( GtkWidget* XP_UNUSED(widget), GdkEventKey* event,
|
||||||
|
|
||||||
case GDK_Left:
|
case GDK_Left:
|
||||||
xpkey = XP_CURSOR_KEY_LEFT;
|
xpkey = XP_CURSOR_KEY_LEFT;
|
||||||
|
movesCursor = XP_TRUE;
|
||||||
break;
|
break;
|
||||||
case GDK_Right:
|
case GDK_Right:
|
||||||
xpkey = XP_CURSOR_KEY_RIGHT;
|
xpkey = XP_CURSOR_KEY_RIGHT;
|
||||||
|
movesCursor = XP_TRUE;
|
||||||
break;
|
break;
|
||||||
case GDK_Up:
|
case GDK_Up:
|
||||||
xpkey = XP_CURSOR_KEY_UP;
|
xpkey = XP_CURSOR_KEY_UP;
|
||||||
|
movesCursor = XP_TRUE;
|
||||||
break;
|
break;
|
||||||
case GDK_Down:
|
case GDK_Down:
|
||||||
xpkey = XP_CURSOR_KEY_DOWN;
|
xpkey = XP_CURSOR_KEY_DOWN;
|
||||||
|
movesCursor = XP_TRUE;
|
||||||
break;
|
break;
|
||||||
case GDK_BackSpace:
|
case GDK_BackSpace:
|
||||||
XP_LOGF( "... it's a DEL" );
|
XP_LOGF( "... it's a DEL" );
|
||||||
|
@ -190,7 +195,15 @@ key_release_event( GtkWidget* XP_UNUSED(widget), GdkEventKey* event,
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( xpkey != XP_KEY_NONE ) {
|
if ( xpkey != XP_KEY_NONE ) {
|
||||||
if ( board_handleKey( globals->cGlobals.game.board, xpkey ) ) {
|
XP_Bool handled;
|
||||||
|
XP_Bool draw;
|
||||||
|
draw = board_handleKey( globals->cGlobals.game.board, xpkey, &handled );
|
||||||
|
|
||||||
|
if ( movesCursor || !handled ) {
|
||||||
|
XP_LOGF( "need to handle focus shift" );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( draw ) {
|
||||||
board_draw( globals->cGlobals.game.board );
|
board_draw( globals->cGlobals.game.board );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue