mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-02-05 20:45:49 +01:00
When "dived" focus reaches and crosses border of object, return as if
not handled. This causes the platform to handle the key event itself, typically by moving the focus to the next top-level object.
This commit is contained in:
parent
56f64f6f46
commit
74ccc0ed34
5 changed files with 82 additions and 45 deletions
|
@ -2495,12 +2495,20 @@ flipKey( XP_Key key, XP_Bool flip ) {
|
||||||
switch( key ) {
|
switch( key ) {
|
||||||
case XP_CURSOR_KEY_DOWN:
|
case XP_CURSOR_KEY_DOWN:
|
||||||
result = XP_CURSOR_KEY_RIGHT; break;
|
result = XP_CURSOR_KEY_RIGHT; break;
|
||||||
|
case XP_CURSOR_KEY_ALTDOWN:
|
||||||
|
result = XP_CURSOR_KEY_ALTRIGHT; break;
|
||||||
case XP_CURSOR_KEY_UP:
|
case XP_CURSOR_KEY_UP:
|
||||||
result = XP_CURSOR_KEY_LEFT; break;
|
result = XP_CURSOR_KEY_LEFT; break;
|
||||||
|
case XP_CURSOR_KEY_ALTUP:
|
||||||
|
result = XP_CURSOR_KEY_ALTLEFT; break;
|
||||||
case XP_CURSOR_KEY_LEFT:
|
case XP_CURSOR_KEY_LEFT:
|
||||||
result = XP_CURSOR_KEY_UP; break;
|
result = XP_CURSOR_KEY_UP; break;
|
||||||
|
case XP_CURSOR_KEY_ALTLEFT:
|
||||||
|
result = XP_CURSOR_KEY_ALTUP; break;
|
||||||
case XP_CURSOR_KEY_RIGHT:
|
case XP_CURSOR_KEY_RIGHT:
|
||||||
result = XP_CURSOR_KEY_DOWN; break;
|
result = XP_CURSOR_KEY_DOWN; break;
|
||||||
|
case XP_CURSOR_KEY_ALTRIGHT:
|
||||||
|
result = XP_CURSOR_KEY_ALTDOWN; break;
|
||||||
default:
|
default:
|
||||||
XP_ASSERT(0);
|
XP_ASSERT(0);
|
||||||
}
|
}
|
||||||
|
@ -2520,9 +2528,13 @@ board_handleKey( BoardCtxt* board, XP_Key key, XP_Bool* pHandled )
|
||||||
switch( key ) {
|
switch( key ) {
|
||||||
#ifdef KEYBOARD_NAV
|
#ifdef KEYBOARD_NAV
|
||||||
case XP_CURSOR_KEY_DOWN:
|
case XP_CURSOR_KEY_DOWN:
|
||||||
|
case XP_CURSOR_KEY_ALTDOWN:
|
||||||
case XP_CURSOR_KEY_UP:
|
case XP_CURSOR_KEY_UP:
|
||||||
|
case XP_CURSOR_KEY_ALTUP:
|
||||||
case XP_CURSOR_KEY_LEFT:
|
case XP_CURSOR_KEY_LEFT:
|
||||||
|
case XP_CURSOR_KEY_ALTLEFT:
|
||||||
case XP_CURSOR_KEY_RIGHT:
|
case XP_CURSOR_KEY_RIGHT:
|
||||||
|
case XP_CURSOR_KEY_ALTRIGHT:
|
||||||
if ( board->focusHasDived ) {
|
if ( board->focusHasDived ) {
|
||||||
XP_Bool up = XP_FALSE;
|
XP_Bool up = XP_FALSE;
|
||||||
if ( board->focussed == OBJ_BOARD ) {
|
if ( board->focussed == OBJ_BOARD ) {
|
||||||
|
@ -2539,7 +2551,7 @@ board_handleKey( BoardCtxt* board, XP_Key key, XP_Bool* pHandled )
|
||||||
board->focusHasDived = XP_FALSE;
|
board->focusHasDived = XP_FALSE;
|
||||||
invalFocusOwner( board );
|
invalFocusOwner( board );
|
||||||
} else {
|
} else {
|
||||||
handled = XP_TRUE;
|
handled = redraw;//XP_TRUE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Do nothing. We don't handle transition among top-level
|
/* Do nothing. We don't handle transition among top-level
|
||||||
|
|
|
@ -36,11 +36,16 @@ extern "C" {
|
||||||
typedef enum {
|
typedef enum {
|
||||||
/* keep these three together: for the cursor */
|
/* keep these three together: for the cursor */
|
||||||
XP_KEY_NONE,
|
XP_KEY_NONE,
|
||||||
XP_CURSOR_KEY_DOWN,
|
|
||||||
XP_CURSOR_KEY_RIGHT,
|
|
||||||
|
|
||||||
|
XP_CURSOR_KEY_DOWN,
|
||||||
|
XP_CURSOR_KEY_ALTDOWN,
|
||||||
|
XP_CURSOR_KEY_RIGHT,
|
||||||
|
XP_CURSOR_KEY_ALTRIGHT,
|
||||||
XP_CURSOR_KEY_UP,
|
XP_CURSOR_KEY_UP,
|
||||||
|
XP_CURSOR_KEY_ALTUP,
|
||||||
XP_CURSOR_KEY_LEFT,
|
XP_CURSOR_KEY_LEFT,
|
||||||
|
XP_CURSOR_KEY_ALTLEFT,
|
||||||
|
|
||||||
XP_CURSOR_KEY_DEL,
|
XP_CURSOR_KEY_DEL,
|
||||||
XP_RAISEFOCUS_KEY,
|
XP_RAISEFOCUS_KEY,
|
||||||
XP_RETURN_KEY,
|
XP_RETURN_KEY,
|
||||||
|
|
|
@ -638,23 +638,26 @@ board_juggleTray( BoardCtxt* board )
|
||||||
|
|
||||||
#ifdef KEYBOARD_NAV
|
#ifdef KEYBOARD_NAV
|
||||||
XP_Bool
|
XP_Bool
|
||||||
tray_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* up )
|
tray_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* pUp )
|
||||||
{
|
{
|
||||||
XP_Bool result;
|
XP_Bool draw = XP_FALSE;
|
||||||
|
XP_Bool up = XP_FALSE;
|
||||||
XP_U16 selPlayer = board->selPlayer;
|
XP_U16 selPlayer = board->selPlayer;
|
||||||
XP_S16 pos;
|
XP_S16 pos;
|
||||||
|
|
||||||
switch ( cursorKey ) {
|
switch ( cursorKey ) {
|
||||||
case XP_CURSOR_KEY_UP:
|
case XP_CURSOR_KEY_UP:
|
||||||
case XP_CURSOR_KEY_DOWN:
|
case XP_CURSOR_KEY_DOWN:
|
||||||
*up = XP_TRUE;
|
up = XP_TRUE;
|
||||||
|
break;
|
||||||
/* moving the divider needs to be hard to do accidentally since it
|
/* moving the divider needs to be hard to do accidentally since it
|
||||||
confuses users when juggle and hint stop working. But all things
|
confuses users when juggle and hint stop working. But all things
|
||||||
must be possible via keyboard on devices that don't have
|
must be possible via keyboard on devices that don't have
|
||||||
touchscreens. Probably need a new keytype XP_CURSOR_KEY_ALTDOWN
|
touchscreens. Probably need a new keytype XP_CURSOR_KEY_ALTDOWN
|
||||||
etc. */
|
etc. */
|
||||||
/* result = board_moveDivider( board, XP_FALSE ); */
|
case XP_CURSOR_KEY_ALTRIGHT:
|
||||||
/* result = board_moveDivider( board, XP_TRUE ); */
|
case XP_CURSOR_KEY_ALTLEFT:
|
||||||
|
draw = 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:
|
||||||
|
@ -665,7 +668,7 @@ tray_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* up )
|
||||||
for ( ; ; ) {
|
for ( ; ; ) {
|
||||||
pos += (cursorKey == XP_CURSOR_KEY_RIGHT ? 1 : -1);
|
pos += (cursorKey == XP_CURSOR_KEY_RIGHT ? 1 : -1);
|
||||||
if ( pos < 0 || pos >= MAX_TRAY_TILES ) {
|
if ( pos < 0 || pos >= MAX_TRAY_TILES ) {
|
||||||
*up = XP_TRUE;
|
up = XP_TRUE;
|
||||||
} else {
|
} else {
|
||||||
/* Revisit this when able to never draw the cursor in a place
|
/* Revisit this when able to never draw the cursor in a place
|
||||||
this won't allow it, e.g. when the tiles move after a
|
this won't allow it, e.g. when the tiles move after a
|
||||||
|
@ -683,14 +686,15 @@ tray_moveCursor( BoardCtxt* board, XP_Key cursorKey, XP_Bool* up )
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
board_invalTrayTiles( board, 1 << board->trayCursorLoc[selPlayer] );
|
board_invalTrayTiles( board, 1 << board->trayCursorLoc[selPlayer] );
|
||||||
result = XP_TRUE;
|
draw = XP_TRUE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
XP_ASSERT(0);
|
draw = XP_FALSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
*pUp = up;
|
||||||
|
return draw;
|
||||||
} /* tray_moveCursor */
|
} /* tray_moveCursor */
|
||||||
|
|
||||||
XP_Bool
|
XP_Bool
|
||||||
|
|
|
@ -67,6 +67,7 @@ static XP_Bool handleLeft( CursesAppGlobals* globals );
|
||||||
static XP_Bool handleRight( CursesAppGlobals* globals );
|
static XP_Bool handleRight( CursesAppGlobals* globals );
|
||||||
static XP_Bool handleUp( CursesAppGlobals* globals );
|
static XP_Bool handleUp( CursesAppGlobals* globals );
|
||||||
static XP_Bool handleDown( CursesAppGlobals* globals );
|
static XP_Bool handleDown( CursesAppGlobals* globals );
|
||||||
|
static XP_Bool handleFocusKey( CursesAppGlobals* globals, XP_Key key );
|
||||||
|
|
||||||
|
|
||||||
#ifdef MEM_DEBUG
|
#ifdef MEM_DEBUG
|
||||||
|
@ -394,6 +395,19 @@ handleHide( CursesAppGlobals* globals )
|
||||||
return XP_TRUE;
|
return XP_TRUE;
|
||||||
} /* handleJuggle */
|
} /* handleJuggle */
|
||||||
|
|
||||||
|
static XP_Bool
|
||||||
|
handleAltLeft( CursesAppGlobals* globals )
|
||||||
|
{
|
||||||
|
return handleFocusKey( globals, XP_CURSOR_KEY_ALTLEFT );
|
||||||
|
}
|
||||||
|
|
||||||
|
static XP_Bool
|
||||||
|
handleAltRight( CursesAppGlobals* globals )
|
||||||
|
{
|
||||||
|
return handleFocusKey( globals, XP_CURSOR_KEY_ALTRIGHT );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
handleFlip( CursesAppGlobals* globals )
|
handleFlip( CursesAppGlobals* globals )
|
||||||
{
|
{
|
||||||
|
@ -461,41 +475,39 @@ static XP_Bool
|
||||||
shiftFocus( CursesAppGlobals* globals, XP_Key key )
|
shiftFocus( CursesAppGlobals* globals, XP_Key key )
|
||||||
{
|
{
|
||||||
BoardCtxt* board = globals->cGlobals.game.board;
|
BoardCtxt* board = globals->cGlobals.game.board;
|
||||||
BoardObjectType typ = board_getFocusOwner( board );
|
XP_Bool handled = XP_FALSE;
|
||||||
BoardObjectType nxt;
|
|
||||||
XP_Bool forward = key == XP_CURSOR_KEY_DOWN || key == XP_CURSOR_KEY_RIGHT;
|
|
||||||
XP_Bool handled;
|
|
||||||
|
|
||||||
switch( typ ) {
|
do { /* allow break */
|
||||||
|
XP_Bool forward;
|
||||||
|
BoardObjectType nxt;
|
||||||
|
|
||||||
|
if ( key == XP_CURSOR_KEY_DOWN || key == XP_CURSOR_KEY_RIGHT ) {
|
||||||
|
forward = XP_TRUE;
|
||||||
|
} else if ( key == XP_CURSOR_KEY_UP || key == XP_CURSOR_KEY_LEFT ) {
|
||||||
|
forward = XP_FALSE;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( board_getFocusOwner( board ) ) {
|
||||||
case OBJ_NONE:
|
case OBJ_NONE:
|
||||||
XP_ASSERT( 0 ); /* not in curses anyway */
|
XP_ASSERT( 0 ); /* not in curses anyway */
|
||||||
break;
|
break;
|
||||||
case OBJ_SCORE:
|
case OBJ_SCORE:
|
||||||
if ( forward ) {
|
nxt = forward ? OBJ_TRAY : OBJ_BOARD;
|
||||||
nxt = OBJ_TRAY;
|
|
||||||
} else {
|
|
||||||
nxt = OBJ_BOARD;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case OBJ_BOARD:
|
case OBJ_BOARD:
|
||||||
if ( forward ) {
|
nxt = forward ? OBJ_SCORE : OBJ_TRAY;
|
||||||
nxt = OBJ_SCORE;
|
|
||||||
} else {
|
|
||||||
nxt = OBJ_TRAY;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case OBJ_TRAY:
|
case OBJ_TRAY:
|
||||||
if ( forward ) {
|
nxt = forward ? OBJ_BOARD : OBJ_SCORE;
|
||||||
nxt = OBJ_BOARD;
|
|
||||||
} else {
|
|
||||||
nxt = OBJ_SCORE;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
handled = board_focusChanged( board, nxt, XP_TRUE );
|
handled = board_focusChanged( board, nxt, XP_TRUE );
|
||||||
if ( handled ) {
|
if ( handled ) {
|
||||||
changeMenuForFocus( globals, nxt );
|
changeMenuForFocus( globals, nxt );
|
||||||
}
|
}
|
||||||
|
} while ( 0 );
|
||||||
return handled;
|
return handled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -554,6 +566,8 @@ MenuList scoreMenuList[] = {
|
||||||
MenuList trayMenuList[] = {
|
MenuList trayMenuList[] = {
|
||||||
{ handleJuggle, "Juggle", "G", 'G' },
|
{ handleJuggle, "Juggle", "G", 'G' },
|
||||||
{ handleHide, "[un]hIde", "I", 'I' },
|
{ handleHide, "[un]hIde", "I", 'I' },
|
||||||
|
{ handleAltLeft, "Divider left", "{", '{' },
|
||||||
|
{ handleAltRight, "Divider right", "}", '}' },
|
||||||
|
|
||||||
{ NULL, NULL, NULL, '\0'}
|
{ NULL, NULL, NULL, '\0'}
|
||||||
};
|
};
|
||||||
|
@ -754,6 +768,7 @@ blocking_gotEvent( CursesAppGlobals* globals, int* ch )
|
||||||
/* stdin first */
|
/* stdin first */
|
||||||
if ( (globals->fdArray[FD_STDIN].revents & POLLIN) != 0 ) {
|
if ( (globals->fdArray[FD_STDIN].revents & POLLIN) != 0 ) {
|
||||||
int evtCh = fgetc(stdin);
|
int evtCh = fgetc(stdin);
|
||||||
|
XP_LOGF( "%s: got key: %x", __FUNCTION__, evtCh );
|
||||||
*ch = evtCh;
|
*ch = evtCh;
|
||||||
result = XP_TRUE;
|
result = XP_TRUE;
|
||||||
--numEvents;
|
--numEvents;
|
||||||
|
|
|
@ -2521,6 +2521,7 @@ mainViewHandleEvent( EventPtr event )
|
||||||
case keyDownEvent: {
|
case keyDownEvent: {
|
||||||
XP_Key xpkey = XP_KEY_NONE;
|
XP_Key xpkey = XP_KEY_NONE;
|
||||||
Int16 ch = event->data.keyDown.chr;
|
Int16 ch = event->data.keyDown.chr;
|
||||||
|
XP_Bool altOn = (event->data.keyDown.modifiers & shiftKeyMask) != 0;
|
||||||
|
|
||||||
switch ( ch ) {
|
switch ( ch ) {
|
||||||
case pageUpChr:
|
case pageUpChr:
|
||||||
|
@ -2538,10 +2539,10 @@ mainViewHandleEvent( EventPtr event )
|
||||||
xpkey = XP_RETURN_KEY;
|
xpkey = XP_RETURN_KEY;
|
||||||
break;
|
break;
|
||||||
case vchrRockerLeft:
|
case vchrRockerLeft:
|
||||||
xpkey = XP_CURSOR_KEY_LEFT;
|
xpkey = altOn ? XP_CURSOR_KEY_ALTLEFT : XP_CURSOR_KEY_LEFT;
|
||||||
break;
|
break;
|
||||||
case vchrRockerRight:
|
case vchrRockerRight:
|
||||||
xpkey = XP_CURSOR_KEY_RIGHT;
|
xpkey = altOn ? XP_CURSOR_KEY_ALTRIGHT : XP_CURSOR_KEY_RIGHT;
|
||||||
break;
|
break;
|
||||||
case vchrRockerUp:
|
case vchrRockerUp:
|
||||||
xpkey = XP_CURSOR_KEY_UP;
|
xpkey = XP_CURSOR_KEY_UP;
|
||||||
|
|
Loading…
Add table
Reference in a new issue