mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2024-12-30 10:26:58 +01:00
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:
parent
e6ba8c872c
commit
f329966a8a
5 changed files with 75 additions and 44 deletions
|
@ -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;
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue