on keyDown, look at what keyUp will do and, if nothing, don't handle

the event.  This lets focus transfer work as before there was keyDown.
This commit is contained in:
ehouse 2007-01-12 03:28:20 +00:00
parent e6ba8c872c
commit f329966a8a
5 changed files with 75 additions and 44 deletions

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 - 2006 by Eric House (xwords@eehouse.org). All rights * Copyright 1997 - 2007 by Eric House (xwords@eehouse.org). All rights
* reserved. * reserved.
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
@ -123,7 +123,7 @@ static XP_Bool moveKeyTileToBoard( BoardCtxt* board, XP_Key cursorKey,
#ifdef KEYBOARD_NAV #ifdef KEYBOARD_NAV
static XP_Bool board_moveCursor( BoardCtxt* board, XP_Key cursorKey, static XP_Bool board_moveCursor( BoardCtxt* board, XP_Key cursorKey,
XP_Bool* up ); XP_Bool preflightOnly, XP_Bool* up );
static XP_Bool invalFocusOwner( BoardCtxt* board ); static XP_Bool invalFocusOwner( BoardCtxt* board );
#endif #endif
#ifdef XWFEATURE_SEARCHLIMIT #ifdef XWFEATURE_SEARCHLIMIT
@ -2584,7 +2584,45 @@ focusToCoords( BoardCtxt* board, XP_U16* xp, XP_U16* yp )
} }
return result; return result;
} } /* focusToCoords */
/* The focus keys are special because they can cause focus to leave one object
* and move to another (which the platform needs to be involved with). On
* palm, that only works if the keyDown handler claims not to have handled the
* event. So we must preflight, determining if the keyUp handler will handle
* the event should it get to it. If it wouldn't, then the platform wants a
* chance not to generate a keyUp event at all.
*/
static XP_Bool
handleFocusKeyUp( BoardCtxt* board, XP_Key key, XP_Bool preflightOnly,
XP_Bool* pHandled )
{
XP_Bool redraw = XP_FALSE;
if ( board->focusHasDived ) {
XP_Bool up = XP_FALSE;
if ( board->focussed == OBJ_BOARD ) {
redraw = board_moveCursor( board, flipKey( key, board->isFlipped ),
preflightOnly, &up );
} else if ( board->focussed == OBJ_SCORE ) {
redraw = moveScoreCursor( board, key, preflightOnly, &up );
} else if ( board->focussed == OBJ_TRAY ) {
redraw = tray_moveCursor( board, key, preflightOnly, &up );
}
if ( up ) {
if ( !preflightOnly ) {
invalFocusOwner( board );
board->focusHasDived = XP_FALSE;
invalFocusOwner( board );
}
} else {
*pHandled = redraw;
}
} else {
/* Do nothing. We don't handle transition among top-level
focussed objects. Platform must. */
}
return redraw;
} /* handleFocusKeyUp */
XP_Bool XP_Bool
board_handleKeyDown( BoardCtxt* board, XP_Key key, XP_Bool* pHandled ) board_handleKeyDown( BoardCtxt* board, XP_Key key, XP_Bool* pHandled )
@ -2592,14 +2630,17 @@ board_handleKeyDown( BoardCtxt* board, XP_Key key, XP_Bool* pHandled )
XP_Bool draw = XP_FALSE; XP_Bool draw = XP_FALSE;
XP_U16 x, y; XP_U16 x, y;
*pHandled = XP_FALSE;
if ( key == XP_RETURN_KEY ) { if ( key == XP_RETURN_KEY ) {
if ( focusToCoords( board, &x, &y ) ) { if ( focusToCoords( board, &x, &y ) ) {
draw = handleLikeDown( board, board->focussed, x, y ); draw = handleLikeDown( board, board->focussed, x, y );
*pHandled = draw;
} }
} else if ( board->focussed != OBJ_NONE ) {
draw = handleFocusKeyUp( board, key, XP_TRUE, pHandled ) || draw;
} }
*pHandled = (board->focussed != OBJ_NONE) && board->focusHasDived;
return draw; return draw;
} }
@ -2636,28 +2677,7 @@ board_handleKeyUp( BoardCtxt* board, XP_Key key, XP_Bool* pHandled )
case XP_CURSOR_KEY_ALTLEFT: case XP_CURSOR_KEY_ALTLEFT:
case XP_CURSOR_KEY_RIGHT: case XP_CURSOR_KEY_RIGHT:
case XP_CURSOR_KEY_ALTRIGHT: case XP_CURSOR_KEY_ALTRIGHT:
if ( board->focusHasDived ) { redraw = handleFocusKeyUp( board, key, XP_FALSE, &handled );
XP_Bool up = XP_FALSE;
if ( board->focussed == OBJ_BOARD ) {
redraw = board_moveCursor( board,
flipKey( key, board->isFlipped ),
&up );
} else if ( board->focussed == OBJ_SCORE ) {
redraw = moveScoreCursor( board, key, &up );
} else if ( board->focussed == OBJ_TRAY ) {
redraw = tray_moveCursor( board, key, &up );
}
if ( up ) {
invalFocusOwner( board );
board->focusHasDived = XP_FALSE;
invalFocusOwner( board );
} else {
handled = redraw;//XP_TRUE;
}
} else {
/* Do nothing. We don't handle transition among top-level
focussed objects. Platform must. */
}
break; break;
#endif #endif
@ -2932,7 +2952,8 @@ stripAlt( XP_Key key, XP_Bool* wasAlt )
} /* stripAlt */ } /* stripAlt */
static XP_Bool static XP_Bool
board_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* up ) board_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool preflightOnly,
XP_Bool* up )
{ {
BdCursorLoc loc = board->bdCursor[board->selPlayer]; BdCursorLoc loc = board->bdCursor[board->selPlayer];
XP_U16 col = loc.col; XP_U16 col = loc.col;
@ -2944,7 +2965,7 @@ board_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* up )
changed = figureNextLoc( board, cursorKey, XP_FALSE, altSet, changed = figureNextLoc( board, cursorKey, XP_FALSE, altSet,
&col, &row, up ); &col, &row, up );
if ( changed ) { if ( changed && !preflightOnly ) {
invalCell( board, loc.col, loc.row ); invalCell( board, loc.col, loc.row );
invalCell( board, col, row ); invalCell( board, col, row );
loc.col = col; loc.col = col;

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 - 2000 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
@ -201,7 +201,8 @@ void board_selectPlayer( BoardCtxt* board, XP_U16 newPlayer );
#ifdef KEYBOARD_NAV #ifdef KEYBOARD_NAV
XP_Key flipKey( XP_Key key, XP_Bool flip ); XP_Key flipKey( XP_Key key, XP_Bool flip );
XP_Bool tray_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* up ); XP_Bool tray_moveCursor( BoardCtxt* board, XP_Key cursorKey,
XP_Bool preflightOnly, XP_Bool* up );
XP_Bool tray_keyAction( BoardCtxt* board ); XP_Bool tray_keyAction( BoardCtxt* board );
DrawFocusState dfsFor( BoardCtxt* board, BoardObjectType obj ); DrawFocusState dfsFor( BoardCtxt* board, BoardObjectType obj );
void shiftFocusUp( BoardCtxt* board, XP_Key key ); void shiftFocusUp( BoardCtxt* board, XP_Key key );

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 - 2006 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
@ -281,7 +281,8 @@ handlePenUpScore( BoardCtxt* board, XP_U16 x, XP_U16 y )
#ifdef KEYBOARD_NAV #ifdef KEYBOARD_NAV
XP_Bool XP_Bool
moveScoreCursor( BoardCtxt* board, XP_Key key, XP_Bool* pUp ) moveScoreCursor( BoardCtxt* board, XP_Key key, XP_Bool preflightOnly,
XP_Bool* pUp )
{ {
XP_Bool result = XP_TRUE; XP_Bool result = XP_TRUE;
XP_U16 nPlayers = board->gi->nPlayers; XP_U16 nPlayers = board->gi->nPlayers;
@ -309,7 +310,7 @@ moveScoreCursor( BoardCtxt* board, XP_Key key, XP_Bool* pUp )
} }
if ( !up && ((scoreCursorLoc < 0) || (scoreCursorLoc >= nPlayers)) ) { if ( !up && ((scoreCursorLoc < 0) || (scoreCursorLoc >= nPlayers)) ) {
up = XP_TRUE; up = XP_TRUE;
} else { } else if ( !preflightOnly ) {
board->scoreCursorLoc = scoreCursorLoc; board->scoreCursorLoc = scoreCursorLoc;
board->scoreBoardInvalid = XP_TRUE; board->scoreBoardInvalid = XP_TRUE;
} }

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 - 2006 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
@ -31,7 +31,8 @@ XP_Bool handlePenUpScore( BoardCtxt* board, XP_U16 x, XP_U16 y );
#endif #endif
#ifdef KEYBOARD_NAV #ifdef KEYBOARD_NAV
XP_Bool moveScoreCursor( BoardCtxt* board, XP_Key key, XP_Bool* up ); XP_Bool moveScoreCursor( BoardCtxt* board, XP_Key key, XP_Bool preflightOnly,
XP_Bool* up );
#endif #endif
#endif #endif

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 - 2006 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
@ -638,12 +638,14 @@ board_juggleTray( BoardCtxt* board )
#ifdef KEYBOARD_NAV #ifdef KEYBOARD_NAV
XP_Bool XP_Bool
tray_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* pUp ) tray_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool preflightOnly,
XP_Bool* pUp )
{ {
XP_Bool draw = XP_FALSE; XP_Bool draw = XP_FALSE;
XP_Bool up = XP_FALSE; XP_Bool up = XP_FALSE;
XP_U16 selPlayer = board->selPlayer; XP_U16 selPlayer = board->selPlayer;
XP_S16 pos; XP_S16 pos;
TileBit what = 0;
switch ( cursorKey ) { switch ( cursorKey ) {
case XP_CURSOR_KEY_UP: case XP_CURSOR_KEY_UP:
@ -657,12 +659,12 @@ tray_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* pUp )
etc. */ etc. */
case XP_CURSOR_KEY_ALTRIGHT: case XP_CURSOR_KEY_ALTRIGHT:
case XP_CURSOR_KEY_ALTLEFT: case XP_CURSOR_KEY_ALTLEFT:
draw = board_moveDivider( board, cursorKey == XP_CURSOR_KEY_ALTRIGHT ); draw = preflightOnly
|| board_moveDivider( board, cursorKey == XP_CURSOR_KEY_ALTRIGHT );
break; break;
case XP_CURSOR_KEY_RIGHT: case XP_CURSOR_KEY_RIGHT:
case XP_CURSOR_KEY_LEFT: case XP_CURSOR_KEY_LEFT:
board_invalTrayTiles( board, 1 << board->trayCursorLoc[selPlayer] ); what = what | (1 << board->trayCursorLoc[selPlayer]);
pos = board->trayCursorLoc[selPlayer]; pos = board->trayCursorLoc[selPlayer];
/* Loop in order to skip all empty tile slots but one */ /* Loop in order to skip all empty tile slots but one */
for ( ; ; ) { for ( ; ; ) {
@ -680,12 +682,17 @@ tray_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* pUp )
continue; continue;
} }
} }
board->trayCursorLoc[selPlayer] = pos; if ( !preflightOnly ) {
board_invalTrayTiles( board, 1 << pos ); board->trayCursorLoc[selPlayer] = pos;
what = what | (1 << pos);
}
} }
break; break;
} }
board_invalTrayTiles( board, 1 << board->trayCursorLoc[selPlayer] ); if ( !preflightOnly ) {
what = what | (1 << board->trayCursorLoc[selPlayer]);
board_invalTrayTiles( board, what );
}
draw = XP_TRUE; draw = XP_TRUE;
break; break;
default: default: