mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-16 15:41:16 +01:00
add ability to scroll the board by dragging it. add new method
util_altKeyDown to allow user to choose between scrolling board and dragging the hint rect when both are possible. add adjustYOffset; make it and board_setYOffset more tolerant of out-of-bounds inputs and use that to simplify calling code.
This commit is contained in:
parent
fd4cc02c13
commit
ff254fcef4
11 changed files with 160 additions and 52 deletions
|
@ -417,17 +417,38 @@ board_prefsChanged( BoardCtxt* board, CommonPrefs* cp )
|
||||||
return showArrowChanged || hideValChanged;
|
return showArrowChanged || hideValChanged;
|
||||||
} /* board_prefsChanged */
|
} /* board_prefsChanged */
|
||||||
|
|
||||||
|
XP_Bool
|
||||||
|
adjustYOffset( BoardCtxt* board, XP_S16 moveBy )
|
||||||
|
{
|
||||||
|
XP_U16 nVisible = board->lastVisibleRow - board->yOffset + 1;
|
||||||
|
XP_U16 nRows = model_numRows(board->model);
|
||||||
|
XP_S16 newOffset = board->yOffset - moveBy;
|
||||||
|
|
||||||
|
if ( newOffset < 0 ) {
|
||||||
|
newOffset = 0;
|
||||||
|
} else if ( newOffset + nVisible > nRows ) {
|
||||||
|
newOffset = nRows - nVisible;
|
||||||
|
}
|
||||||
|
|
||||||
|
return board_setYOffset( board, newOffset );
|
||||||
|
} /* adjustYOffset */
|
||||||
|
|
||||||
XP_Bool
|
XP_Bool
|
||||||
board_setYOffset( BoardCtxt* board, XP_U16 offset )
|
board_setYOffset( BoardCtxt* board, XP_U16 offset )
|
||||||
{
|
{
|
||||||
XP_U16 oldOffset = board->yOffset;
|
XP_U16 oldOffset = board->yOffset;
|
||||||
XP_Bool result = oldOffset != offset;
|
XP_Bool result = oldOffset != offset;
|
||||||
|
|
||||||
|
if ( result ) {
|
||||||
|
XP_U16 nVisible = board->lastVisibleRow - board->yOffset + 1;
|
||||||
|
XP_U16 nRows = model_numRows(board->model);
|
||||||
|
|
||||||
|
result = offset <= nRows - nVisible;
|
||||||
if ( result ) {
|
if ( result ) {
|
||||||
/* check if scrolling makes sense for this board in its current
|
/* check if scrolling makes sense for this board in its current
|
||||||
state. */
|
state. */
|
||||||
XP_U16 visibleHeight = board->boardBounds.height;
|
XP_U16 visibleHeight = board->boardBounds.height;
|
||||||
XP_U16 fullHeight = model_numRows(board->model) * board->boardVScale;
|
XP_U16 fullHeight = nRows * board->boardVScale;
|
||||||
result = visibleHeight < fullHeight;
|
result = visibleHeight < fullHeight;
|
||||||
|
|
||||||
if ( result ) {
|
if ( result ) {
|
||||||
|
@ -439,6 +460,7 @@ board_setYOffset( BoardCtxt* board, XP_U16 offset )
|
||||||
board->needsDrawing = XP_TRUE;
|
board->needsDrawing = XP_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
} /* board_setYOffset */
|
} /* board_setYOffset */
|
||||||
|
@ -1031,17 +1053,17 @@ checkScrollCell( BoardCtxt* board, XP_U16 col, XP_U16 row )
|
||||||
if ( board->boardObscuresTray && board->trayVisState != TRAY_HIDDEN ) {
|
if ( board->boardObscuresTray && board->trayVisState != TRAY_HIDDEN ) {
|
||||||
/* call getCellRect until the cell's on the board. */
|
/* call getCellRect until the cell's on the board. */
|
||||||
while ( !getCellRect( board, col, row, &rect ) ) {
|
while ( !getCellRect( board, col, row, &rect ) ) {
|
||||||
XP_U16 oldOffset = board_getYOffset( board );
|
XP_S16 moveBy;
|
||||||
if ( rect.top < board->boardBounds.top ) {
|
if ( rect.top < board->boardBounds.top ) {
|
||||||
--oldOffset;
|
moveBy = 1;
|
||||||
} else if ( rect.top + rect.height >
|
} else if ( rect.top + rect.height >
|
||||||
board->boardBounds.top + board->boardBounds.height ) {
|
board->boardBounds.top + board->boardBounds.height ) {
|
||||||
++oldOffset;
|
moveBy = -1;
|
||||||
} else {
|
} else {
|
||||||
XP_ASSERT( 0 );
|
XP_ASSERT( 0 );
|
||||||
}
|
}
|
||||||
board_setYOffset( board, oldOffset );
|
moved = adjustYOffset( board, moveBy );
|
||||||
moved = XP_TRUE;
|
XP_ASSERT( moved );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return moved;
|
return moved;
|
||||||
|
@ -2148,7 +2170,6 @@ static XP_Bool
|
||||||
handlePenDownOnBoard( BoardCtxt* board, XP_U16 xx, XP_U16 yy )
|
handlePenDownOnBoard( BoardCtxt* board, XP_U16 xx, XP_U16 yy )
|
||||||
{
|
{
|
||||||
XP_Bool result = XP_FALSE;
|
XP_Bool result = XP_FALSE;
|
||||||
XP_U16 col, row;
|
|
||||||
/* Start a timer no matter what. After it fires we'll decide whether it's
|
/* Start a timer no matter what. After it fires we'll decide whether it's
|
||||||
appropriate to handle it. No. That's too expensive */
|
appropriate to handle it. No. That's too expensive */
|
||||||
if ( TRADE_IN_PROGRESS(board) && ptOnTradeWindow( board, xx, yy ) ) {
|
if ( TRADE_IN_PROGRESS(board) && ptOnTradeWindow( board, xx, yy ) ) {
|
||||||
|
@ -2159,9 +2180,7 @@ handlePenDownOnBoard( BoardCtxt* board, XP_U16 xx, XP_U16 yy )
|
||||||
/* As a first cut, you start a hint-region drag unless the cell is
|
/* As a first cut, you start a hint-region drag unless the cell is
|
||||||
occupied by a non-committed cell. */
|
occupied by a non-committed cell. */
|
||||||
|
|
||||||
coordToCell( board, xx, yy, &col, &row );
|
if ( !board->tradeInProgress[board->selPlayer] ) {
|
||||||
if ( (board->trayVisState == TRAY_REVEALED)
|
|
||||||
&& !board->tradeInProgress[board->selPlayer] ) {
|
|
||||||
result = dragDropStart( board, OBJ_BOARD, xx, yy );
|
result = dragDropStart( board, OBJ_BOARD, xx, yy );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ typedef enum {
|
||||||
#ifdef XWFEATURE_SEARCHLIMIT
|
#ifdef XWFEATURE_SEARCHLIMIT
|
||||||
,DT_HINTRGN
|
,DT_HINTRGN
|
||||||
#endif
|
#endif
|
||||||
|
,DT_BOARD
|
||||||
} DragType;
|
} DragType;
|
||||||
|
|
||||||
|
|
||||||
|
@ -244,6 +245,7 @@ XP_Bool dividerMoved( BoardCtxt* board, XP_U8 newLoc );
|
||||||
|
|
||||||
XP_Bool checkScrollCell( BoardCtxt* board, XP_U16 col, XP_U16 row );
|
XP_Bool checkScrollCell( BoardCtxt* board, XP_U16 col, XP_U16 row );
|
||||||
XP_Bool onBorderCanScroll( const BoardCtxt* board, XP_U16 row, XP_S16* change );
|
XP_Bool onBorderCanScroll( const BoardCtxt* board, XP_U16 row, XP_S16* change );
|
||||||
|
XP_Bool adjustYOffset( BoardCtxt* board, XP_S16 moveBy );
|
||||||
|
|
||||||
#ifdef KEYBOARD_NAV
|
#ifdef KEYBOARD_NAV
|
||||||
XP_Bool tray_moveCursor( BoardCtxt* board, XP_Key cursorKey,
|
XP_Bool tray_moveCursor( BoardCtxt* board, XP_Key cursorKey,
|
||||||
|
|
|
@ -25,6 +25,9 @@ extern "C" {
|
||||||
#include "dragdrpp.h"
|
#include "dragdrpp.h"
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
|
|
||||||
|
/* How many squares must scroll gesture take in to be recognized. */
|
||||||
|
#define SCROLL_DRAG_THRESHHOLD 3
|
||||||
|
|
||||||
static XP_Bool dragDropContinueImpl( BoardCtxt* board, XP_U16 xx, XP_U16 yy,
|
static XP_Bool dragDropContinueImpl( BoardCtxt* board, XP_U16 xx, XP_U16 yy,
|
||||||
BoardObjectType* onWhichP );
|
BoardObjectType* onWhichP );
|
||||||
static void invalDragObjRange( BoardCtxt* board, const DragObjInfo* from,
|
static void invalDragObjRange( BoardCtxt* board, const DragObjInfo* from,
|
||||||
|
@ -54,12 +57,14 @@ ddStartBoard( BoardCtxt* board, XP_U16 xx, XP_U16 yy )
|
||||||
{
|
{
|
||||||
DragState* ds = &board->dragState;
|
DragState* ds = &board->dragState;
|
||||||
XP_Bool found;
|
XP_Bool found;
|
||||||
|
XP_Bool trayVisible;
|
||||||
XP_U16 col, row;
|
XP_U16 col, row;
|
||||||
|
|
||||||
found = coordToCell( board, xx, yy, &col, &row );
|
found = coordToCell( board, xx, yy, &col, &row );
|
||||||
XP_ASSERT( found );
|
XP_ASSERT( found );
|
||||||
|
|
||||||
if ( holdsPendingTile( board, col, row ) ) {
|
trayVisible = board->trayVisState == TRAY_REVEALED;
|
||||||
|
if ( trayVisible && holdsPendingTile( board, col, row ) ) {
|
||||||
XP_U16 modelc, modelr;
|
XP_U16 modelc, modelr;
|
||||||
XP_Bool ignore;
|
XP_Bool ignore;
|
||||||
|
|
||||||
|
@ -70,10 +75,26 @@ ddStartBoard( BoardCtxt* board, XP_U16 xx, XP_U16 yy )
|
||||||
board->selPlayer, &ds->tile, &ds->isBlank,
|
board->selPlayer, &ds->tile, &ds->isBlank,
|
||||||
&ignore, &ignore );
|
&ignore, &ignore );
|
||||||
XP_ASSERT( found );
|
XP_ASSERT( found );
|
||||||
|
} else {
|
||||||
|
/* If we're not dragging a tile, we can either drag the board (scroll)
|
||||||
|
or work on hint regions. Sometimes scrolling isn't possible.
|
||||||
|
Sometimes hint dragging is disabled. But if both are possible,
|
||||||
|
then the alt key determines it. I figure scrolling will be more
|
||||||
|
common than hint dragging when both are possible, but you can turn
|
||||||
|
hint dragging off, so if it's on that's probably what you want. */
|
||||||
|
XP_Bool canScroll = board->lastVisibleRow < model_numRows(board->model);
|
||||||
|
if ( 0 ) {
|
||||||
#ifdef XWFEATURE_SEARCHLIMIT
|
#ifdef XWFEATURE_SEARCHLIMIT
|
||||||
} else if ( board->gi->allowHintRect ) {
|
} else if ( board->gi->allowHintRect && trayVisible ) {
|
||||||
|
if ( !util_altKeyDown(board->util) ) {
|
||||||
ds->dtype = DT_HINTRGN;
|
ds->dtype = DT_HINTRGN;
|
||||||
|
} else if ( canScroll ) {
|
||||||
|
ds->dtype = DT_BOARD;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
} else if ( canScroll ) {
|
||||||
|
ds->dtype = DT_BOARD;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ds->start.u.board.col = col;
|
ds->start.u.board.col = col;
|
||||||
ds->start.u.board.row = row;
|
ds->start.u.board.row = row;
|
||||||
|
@ -379,13 +400,18 @@ dragDropContinueImpl( BoardCtxt* board, XP_U16 xx, XP_U16 yy,
|
||||||
}
|
}
|
||||||
*onWhichP = newInfo.obj;
|
*onWhichP = newInfo.obj;
|
||||||
|
|
||||||
|
if ( newInfo.obj == OBJ_BOARD ) {
|
||||||
|
(void)coordToCell( board, xx, yy, &newInfo.u.board.col,
|
||||||
|
&newInfo.u.board.row );
|
||||||
|
}
|
||||||
|
|
||||||
if ( ds->dtype == DT_DIVIDER ) {
|
if ( ds->dtype == DT_DIVIDER ) {
|
||||||
if ( OBJ_TRAY == newInfo.obj ) {
|
if ( OBJ_TRAY == newInfo.obj ) {
|
||||||
XP_U16 newloc;
|
XP_U16 newloc;
|
||||||
XP_U16 scale = board->trayScaleH;
|
XP_U16 scale = board->trayScaleH;
|
||||||
xx -= board->trayBounds.left;
|
xx -= board->trayBounds.left;
|
||||||
newloc = xx / scale;
|
newloc = xx / scale;
|
||||||
if ( (xx % scale) > (scale/2)) {
|
if ( (xx % scale) > ((scale+board->dividerWidth)/2)) {
|
||||||
++newloc;
|
++newloc;
|
||||||
}
|
}
|
||||||
moving = dividerMoved( board, newloc );
|
moving = dividerMoved( board, newloc );
|
||||||
|
@ -394,10 +420,14 @@ dragDropContinueImpl( BoardCtxt* board, XP_U16 xx, XP_U16 yy,
|
||||||
} else if ( ds->dtype == DT_HINTRGN && newInfo.obj != OBJ_BOARD ) {
|
} else if ( ds->dtype == DT_HINTRGN && newInfo.obj != OBJ_BOARD ) {
|
||||||
/* do nothing */
|
/* do nothing */
|
||||||
#endif
|
#endif
|
||||||
|
} else if ( ds->dtype == DT_BOARD ) {
|
||||||
|
if ( newInfo.obj == OBJ_BOARD ) {
|
||||||
|
XP_S16 diff = newInfo.u.board.row - ds->cur.u.board.row;
|
||||||
|
diff /= SCROLL_DRAG_THRESHHOLD;
|
||||||
|
moving = adjustYOffset( board, diff );
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if ( newInfo.obj == OBJ_BOARD ) {
|
if ( newInfo.obj == OBJ_BOARD ) {
|
||||||
(void)coordToCell( board, xx, yy, &newInfo.u.board.col,
|
|
||||||
&newInfo.u.board.row );
|
|
||||||
moving = (newInfo.u.board.col != ds->cur.u.board.col)
|
moving = (newInfo.u.board.col != ds->cur.u.board.col)
|
||||||
|| (newInfo.u.board.row != ds->cur.u.board.row)
|
|| (newInfo.u.board.row != ds->cur.u.board.row)
|
||||||
|| (OBJ_TRAY == ds->cur.obj);
|
|| (OBJ_TRAY == ds->cur.obj);
|
||||||
|
@ -509,7 +539,7 @@ startScrollTimerIf( BoardCtxt* board )
|
||||||
{
|
{
|
||||||
DragState* ds = &board->dragState;
|
DragState* ds = &board->dragState;
|
||||||
|
|
||||||
if ( ds->cur.obj == OBJ_BOARD ) {
|
if ( (ds->dtype == DT_TILE) && (ds->cur.obj == OBJ_BOARD) ) {
|
||||||
XP_S16 ignore;
|
XP_S16 ignore;
|
||||||
if ( onBorderCanScroll( board, ds->cur.u.board.row, &ignore ) ) {
|
if ( onBorderCanScroll( board, ds->cur.u.board.row, &ignore ) ) {
|
||||||
util_setTimer( board->util, TIMER_PENDOWN, 0,
|
util_setTimer( board->util, TIMER_PENDOWN, 0,
|
||||||
|
|
|
@ -138,6 +138,8 @@ typedef struct UtilVtable {
|
||||||
|
|
||||||
void (*m_util_requestTime)( XW_UtilCtxt* uc );
|
void (*m_util_requestTime)( XW_UtilCtxt* uc );
|
||||||
|
|
||||||
|
XP_Bool (*m_util_altKeyDown)( XW_UtilCtxt* uc );
|
||||||
|
|
||||||
XP_U32 (*m_util_getCurSeconds)( XW_UtilCtxt* uc );
|
XP_U32 (*m_util_getCurSeconds)( XW_UtilCtxt* uc );
|
||||||
|
|
||||||
DictionaryCtxt* (*m_util_makeEmptyDict)( XW_UtilCtxt* uc );
|
DictionaryCtxt* (*m_util_makeEmptyDict)( XW_UtilCtxt* uc );
|
||||||
|
@ -222,6 +224,9 @@ struct XW_UtilCtxt {
|
||||||
#define util_requestTime( uc ) \
|
#define util_requestTime( uc ) \
|
||||||
(uc)->vtable->m_util_requestTime((uc))
|
(uc)->vtable->m_util_requestTime((uc))
|
||||||
|
|
||||||
|
#define util_altKeyDown( uc ) \
|
||||||
|
(uc)->vtable->m_util_altKeyDown((uc))
|
||||||
|
|
||||||
#define util_getCurSeconds(uc) \
|
#define util_getCurSeconds(uc) \
|
||||||
(uc)->vtable->m_util_getCurSeconds((uc))
|
(uc)->vtable->m_util_getCurSeconds((uc))
|
||||||
|
|
||||||
|
|
|
@ -102,12 +102,21 @@ rememberClient( GtkAppGlobals* globals, guint key, int sock,
|
||||||
} /* rememberClient */
|
} /* rememberClient */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtkSetAltState( GtkAppGlobals* globals, guint state )
|
||||||
|
{
|
||||||
|
globals->altKeyDown
|
||||||
|
= (state & (GDK_MOD1_MASK|GDK_SHIFT_MASK|GDK_CONTROL_MASK)) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
button_press_event( GtkWidget* XP_UNUSED(widget), GdkEventButton *event,
|
button_press_event( GtkWidget* XP_UNUSED(widget), GdkEventButton *event,
|
||||||
GtkAppGlobals* globals )
|
GtkAppGlobals* globals )
|
||||||
{
|
{
|
||||||
XP_Bool redraw, handled;
|
XP_Bool redraw, handled;
|
||||||
|
|
||||||
|
gtkSetAltState( globals, event->state );
|
||||||
|
|
||||||
if ( !globals->mouseDown ) {
|
if ( !globals->mouseDown ) {
|
||||||
globals->mouseDown = XP_TRUE;
|
globals->mouseDown = XP_TRUE;
|
||||||
redraw = board_handlePenDown( globals->cGlobals.game.board,
|
redraw = board_handlePenDown( globals->cGlobals.game.board,
|
||||||
|
@ -125,6 +134,8 @@ motion_notify_event( GtkWidget* XP_UNUSED(widget), GdkEventMotion *event,
|
||||||
{
|
{
|
||||||
XP_Bool handled;
|
XP_Bool handled;
|
||||||
|
|
||||||
|
gtkSetAltState( globals, event->state );
|
||||||
|
|
||||||
if ( globals->mouseDown ) {
|
if ( globals->mouseDown ) {
|
||||||
handled = board_handlePenMove( globals->cGlobals.game.board, event->x,
|
handled = board_handlePenMove( globals->cGlobals.game.board, event->x,
|
||||||
event->y );
|
event->y );
|
||||||
|
@ -144,6 +155,8 @@ button_release_event( GtkWidget* XP_UNUSED(widget), GdkEventMotion *event,
|
||||||
{
|
{
|
||||||
XP_Bool redraw;
|
XP_Bool redraw;
|
||||||
|
|
||||||
|
gtkSetAltState( globals, event->state );
|
||||||
|
|
||||||
if ( globals->mouseDown ) {
|
if ( globals->mouseDown ) {
|
||||||
redraw = board_handlePenUp( globals->cGlobals.game.board,
|
redraw = board_handlePenUp( globals->cGlobals.game.board,
|
||||||
event->x,
|
event->x,
|
||||||
|
@ -214,6 +227,8 @@ key_press_event( GtkWidget* XP_UNUSED(widget), GdkEventKey* event,
|
||||||
XP_Bool movesCursor;
|
XP_Bool movesCursor;
|
||||||
XP_Key xpkey = evtToXPKey( event, &movesCursor );
|
XP_Key xpkey = evtToXPKey( event, &movesCursor );
|
||||||
|
|
||||||
|
gtkSetAltState( globals, event->state );
|
||||||
|
|
||||||
if ( xpkey != XP_KEY_NONE ) {
|
if ( xpkey != XP_KEY_NONE ) {
|
||||||
XP_Bool draw = globals->keyDown ?
|
XP_Bool draw = globals->keyDown ?
|
||||||
board_handleKeyRepeat( globals->cGlobals.game.board, xpkey,
|
board_handleKeyRepeat( globals->cGlobals.game.board, xpkey,
|
||||||
|
@ -237,6 +252,8 @@ key_release_event( GtkWidget* XP_UNUSED(widget), GdkEventKey* event,
|
||||||
XP_Bool movesCursor;
|
XP_Bool movesCursor;
|
||||||
XP_Key xpkey = evtToXPKey( event, &movesCursor );
|
XP_Key xpkey = evtToXPKey( event, &movesCursor );
|
||||||
|
|
||||||
|
gtkSetAltState( globals, event->state );
|
||||||
|
|
||||||
if ( xpkey != XP_KEY_NONE ) {
|
if ( xpkey != XP_KEY_NONE ) {
|
||||||
XP_Bool draw;
|
XP_Bool draw;
|
||||||
draw = board_handleKeyUp( globals->cGlobals.game.board, xpkey,
|
draw = board_handleKeyUp( globals->cGlobals.game.board, xpkey,
|
||||||
|
@ -379,7 +396,7 @@ createOrLoadObjects( GtkAppGlobals* globals )
|
||||||
|
|
||||||
/* params->gi.phoniesAction = PHONIES_DISALLOW; */
|
/* params->gi.phoniesAction = PHONIES_DISALLOW; */
|
||||||
#ifdef XWFEATURE_SEARCHLIMIT
|
#ifdef XWFEATURE_SEARCHLIMIT
|
||||||
params->gi.allowHintRect = XP_TRUE;
|
params->gi.allowHintRect = params->allowHintRect;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef XWFEATURE_STANDALONE_ONLY
|
#ifndef XWFEATURE_STANDALONE_ONLY
|
||||||
|
@ -969,16 +986,14 @@ handle_done_button( GtkWidget* XP_UNUSED(widget), GtkAppGlobals* globals )
|
||||||
static void
|
static void
|
||||||
scroll_value_changed( GtkAdjustment *adj, GtkAppGlobals* globals )
|
scroll_value_changed( GtkAdjustment *adj, GtkAppGlobals* globals )
|
||||||
{
|
{
|
||||||
XP_U16 curYOffset, newValue;
|
XP_U16 newValue;
|
||||||
gfloat newValueF = adj->value;
|
gfloat newValueF = adj->value;
|
||||||
|
|
||||||
XP_ASSERT( newValueF >= 0.0
|
XP_ASSERT( newValueF >= 0.0
|
||||||
&& newValueF <= globals->cGlobals.params->nHidden );
|
&& newValueF <= globals->cGlobals.params->nHidden );
|
||||||
curYOffset = board_getYOffset( globals->cGlobals.game.board );
|
|
||||||
newValue = (XP_U16)newValueF;
|
newValue = (XP_U16)newValueF;
|
||||||
|
|
||||||
if ( newValue != curYOffset ) {
|
if ( board_setYOffset( globals->cGlobals.game.board, newValue ) ) {
|
||||||
board_setYOffset( globals->cGlobals.game.board, newValue );
|
|
||||||
board_draw( globals->cGlobals.game.board );
|
board_draw( globals->cGlobals.game.board );
|
||||||
}
|
}
|
||||||
} /* scroll_value_changed */
|
} /* scroll_value_changed */
|
||||||
|
@ -1185,6 +1200,13 @@ gtk_util_hiliteCell( XW_UtilCtxt* uc, XP_U16 col, XP_U16 row )
|
||||||
#endif
|
#endif
|
||||||
} /* gtk_util_hiliteCell */
|
} /* gtk_util_hiliteCell */
|
||||||
|
|
||||||
|
static XP_Bool
|
||||||
|
gtk_util_altKeyDown( XW_UtilCtxt* uc )
|
||||||
|
{
|
||||||
|
GtkAppGlobals* globals = (GtkAppGlobals*)uc->closure;
|
||||||
|
return globals->altKeyDown;
|
||||||
|
}
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
gtk_util_engineProgressCallback( XW_UtilCtxt* XP_UNUSED(uc) )
|
gtk_util_engineProgressCallback( XW_UtilCtxt* XP_UNUSED(uc) )
|
||||||
{
|
{
|
||||||
|
@ -1578,6 +1600,7 @@ setupGtkUtilCallbacks( GtkAppGlobals* globals, XW_UtilCtxt* util )
|
||||||
util->vtable->m_util_yOffsetChange = gtk_util_yOffsetChange;
|
util->vtable->m_util_yOffsetChange = gtk_util_yOffsetChange;
|
||||||
util->vtable->m_util_notifyGameOver = gtk_util_notifyGameOver;
|
util->vtable->m_util_notifyGameOver = gtk_util_notifyGameOver;
|
||||||
util->vtable->m_util_hiliteCell = gtk_util_hiliteCell;
|
util->vtable->m_util_hiliteCell = gtk_util_hiliteCell;
|
||||||
|
util->vtable->m_util_altKeyDown = gtk_util_altKeyDown;
|
||||||
util->vtable->m_util_engineProgressCallback =
|
util->vtable->m_util_engineProgressCallback =
|
||||||
gtk_util_engineProgressCallback;
|
gtk_util_engineProgressCallback;
|
||||||
util->vtable->m_util_setTimer = gtk_util_setTimer;
|
util->vtable->m_util_setTimer = gtk_util_setTimer;
|
||||||
|
|
|
@ -94,6 +94,7 @@ typedef struct GtkAppGlobals {
|
||||||
XP_Bool gridOn;
|
XP_Bool gridOn;
|
||||||
XP_Bool dropIncommingMsgs;
|
XP_Bool dropIncommingMsgs;
|
||||||
XP_Bool mouseDown;
|
XP_Bool mouseDown;
|
||||||
|
XP_Bool altKeyDown;
|
||||||
#ifdef KEYBOARD_NAV
|
#ifdef KEYBOARD_NAV
|
||||||
XP_Bool keyDown;
|
XP_Bool keyDown;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -241,6 +241,9 @@ usage( char* appName, char* msg )
|
||||||
#if defined PLATFORM_GTK
|
#if defined PLATFORM_GTK
|
||||||
"\t [-k] # ask for parameters via \"new games\" dlg\n"
|
"\t [-k] # ask for parameters via \"new games\" dlg\n"
|
||||||
"\t [-h numRowsHidded] \n"
|
"\t [-h numRowsHidded] \n"
|
||||||
|
# ifdef XWFEATURE_SEARCHLIMIT
|
||||||
|
"\t [-I] # don't support hint rect dragging\n"
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
"\t [-f file] # use this file to save/load game\n"
|
"\t [-f file] # use this file to save/load game\n"
|
||||||
"\t [-q] # quit when game over (useful for robot-only)\n"
|
"\t [-q] # quit when game over (useful for robot-only)\n"
|
||||||
|
@ -866,6 +869,9 @@ main( int argc, char** argv )
|
||||||
mainParams.gi.robotSmartness = SMART_ROBOT;
|
mainParams.gi.robotSmartness = SMART_ROBOT;
|
||||||
mainParams.noHeartbeat = XP_FALSE;
|
mainParams.noHeartbeat = XP_FALSE;
|
||||||
mainParams.nHidden = 0;
|
mainParams.nHidden = 0;
|
||||||
|
#ifdef XWFEATURE_SEARCHLIMIT
|
||||||
|
mainParams.allowHintRect = XP_TRUE;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* serverName = mainParams.info.clientInfo.serverName = "localhost"; */
|
/* serverName = mainParams.info.clientInfo.serverName = "localhost"; */
|
||||||
|
|
||||||
|
@ -886,7 +892,7 @@ main( int argc, char** argv )
|
||||||
"gu"
|
"gu"
|
||||||
#endif
|
#endif
|
||||||
#if defined PLATFORM_GTK
|
#if defined PLATFORM_GTK
|
||||||
"h:"
|
"h:I"
|
||||||
#endif
|
#endif
|
||||||
"kKf:l:n:Nsd:e:r:b:qw:Sit:Umvc"
|
"kKf:l:n:Nsd:e:r:b:qw:Sit:Umvc"
|
||||||
#ifdef XWFEATURE_RELAY
|
#ifdef XWFEATURE_RELAY
|
||||||
|
@ -936,6 +942,11 @@ main( int argc, char** argv )
|
||||||
case 'i':
|
case 'i':
|
||||||
mainParams.printHistory = 1;
|
mainParams.printHistory = 1;
|
||||||
break;
|
break;
|
||||||
|
#ifdef XWFEATURE_SEARCHLIMIT
|
||||||
|
case 'I':
|
||||||
|
mainParams.allowHintRect = XP_FALSE;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case 'K':
|
case 'K':
|
||||||
mainParams.skipWarnings = 1;
|
mainParams.skipWarnings = 1;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -61,6 +61,9 @@ typedef struct LaunchParams {
|
||||||
XP_Bool skipWarnings;
|
XP_Bool skipWarnings;
|
||||||
XP_Bool showRobotScores;
|
XP_Bool showRobotScores;
|
||||||
XP_Bool noHeartbeat;
|
XP_Bool noHeartbeat;
|
||||||
|
#ifdef XWFEATURE_SEARCHLIMIT
|
||||||
|
XP_Bool allowHintRect;
|
||||||
|
#endif
|
||||||
|
|
||||||
DeviceRole serverRole;
|
DeviceRole serverRole;
|
||||||
|
|
||||||
|
|
|
@ -122,6 +122,7 @@ static XP_Bool palm_util_hiliteCell( XW_UtilCtxt* uc, XP_U16 col,
|
||||||
static XP_Bool palm_util_engineProgressCallback( XW_UtilCtxt* uc );
|
static XP_Bool palm_util_engineProgressCallback( XW_UtilCtxt* uc );
|
||||||
static void palm_util_setTimer( XW_UtilCtxt* uc, XWTimerReason why, XP_U16 when,
|
static void palm_util_setTimer( XW_UtilCtxt* uc, XWTimerReason why, XP_U16 when,
|
||||||
XWTimerProc proc, void* closure );
|
XWTimerProc proc, void* closure );
|
||||||
|
static XP_Bool palm_util_altKeyDown( XW_UtilCtxt* uc );
|
||||||
static XP_U32 palm_util_getCurSeconds( XW_UtilCtxt* uc );
|
static XP_U32 palm_util_getCurSeconds( XW_UtilCtxt* uc );
|
||||||
static void palm_util_requestTime( XW_UtilCtxt* uc );
|
static void palm_util_requestTime( XW_UtilCtxt* uc );
|
||||||
static DictionaryCtxt* palm_util_makeEmptyDict( XW_UtilCtxt* uc );
|
static DictionaryCtxt* palm_util_makeEmptyDict( XW_UtilCtxt* uc );
|
||||||
|
@ -648,6 +649,7 @@ initUtilFuncs( PalmAppGlobals* globals )
|
||||||
vtable->m_util_engineProgressCallback = palm_util_engineProgressCallback;
|
vtable->m_util_engineProgressCallback = palm_util_engineProgressCallback;
|
||||||
vtable->m_util_setTimer = palm_util_setTimer;
|
vtable->m_util_setTimer = palm_util_setTimer;
|
||||||
vtable->m_util_requestTime = palm_util_requestTime;
|
vtable->m_util_requestTime = palm_util_requestTime;
|
||||||
|
vtable->m_util_altKeyDown = palm_util_altKeyDown;
|
||||||
vtable->m_util_getCurSeconds = palm_util_getCurSeconds;
|
vtable->m_util_getCurSeconds = palm_util_getCurSeconds;
|
||||||
vtable->m_util_makeEmptyDict = palm_util_makeEmptyDict;
|
vtable->m_util_makeEmptyDict = palm_util_makeEmptyDict;
|
||||||
#ifndef XWFEATURE_STANDALONE_ONLY
|
#ifndef XWFEATURE_STANDALONE_ONLY
|
||||||
|
@ -1965,12 +1967,8 @@ scrollBoard( PalmAppGlobals* globals, Int16 newValue, Boolean fromBar )
|
||||||
XP_U16 curYOffset;
|
XP_U16 curYOffset;
|
||||||
|
|
||||||
XP_ASSERT( !!globals->game.board );
|
XP_ASSERT( !!globals->game.board );
|
||||||
curYOffset = board_getYOffset( globals->game.board );
|
|
||||||
|
|
||||||
result = curYOffset != newValue;
|
|
||||||
if ( result ) {
|
|
||||||
result = board_setYOffset( globals->game.board, newValue );
|
result = board_setYOffset( globals->game.board, newValue );
|
||||||
}
|
|
||||||
|
|
||||||
if ( !fromBar ) {
|
if ( !fromBar ) {
|
||||||
updateScrollbar( globals, newValue );
|
updateScrollbar( globals, newValue );
|
||||||
|
@ -3882,6 +3880,13 @@ palm_util_setTimer( XW_UtilCtxt* uc, XWTimerReason why,
|
||||||
postEmptyEvent( noopEvent );
|
postEmptyEvent( noopEvent );
|
||||||
} /* palm_util_setTimer */
|
} /* palm_util_setTimer */
|
||||||
|
|
||||||
|
static XP_Bool
|
||||||
|
palm_util_altKeyDown( XW_UtilCtxt* XP_UNUSED(uc) )
|
||||||
|
{
|
||||||
|
XP_LOGF( "%s unimplemented", __func__ );
|
||||||
|
return XP_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
palm_util_requestTime( XW_UtilCtxt* uc )
|
palm_util_requestTime( XW_UtilCtxt* uc )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* -*- fill-column: 77; c-basic-offset: 4; compile-command: "make TARGET_OS=wince DEBUG=TRUE" -*- */
|
/* -*- fill-column: 77; c-basic-offset: 4; compile-command: "make TARGET_OS=wince DEBUG=TRUE" -*- */
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2007 by Eric House (xwords@eehouse.org). All rights reserved.
|
* Copyright 2002-2008 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
|
||||||
|
@ -111,6 +111,7 @@ static XP_Bool ce_util_hiliteCell( XW_UtilCtxt* uc, XP_U16 col,
|
||||||
static XP_Bool ce_util_engineProgressCallback( XW_UtilCtxt* uc );
|
static XP_Bool ce_util_engineProgressCallback( XW_UtilCtxt* uc );
|
||||||
static void ce_util_setTimer( XW_UtilCtxt* uc, XWTimerReason why, XP_U16 when,
|
static void ce_util_setTimer( XW_UtilCtxt* uc, XWTimerReason why, XP_U16 when,
|
||||||
XWTimerProc proc, void* closure);
|
XWTimerProc proc, void* closure);
|
||||||
|
static XP_Bool ce_util_altKeyDown( XW_UtilCtxt* uc );
|
||||||
static void ce_util_requestTime( XW_UtilCtxt* uc );
|
static void ce_util_requestTime( XW_UtilCtxt* uc );
|
||||||
static XP_U32 ce_util_getCurSeconds( XW_UtilCtxt* uc );
|
static XP_U32 ce_util_getCurSeconds( XW_UtilCtxt* uc );
|
||||||
static DictionaryCtxt* ce_util_makeEmptyDict( XW_UtilCtxt* uc );
|
static DictionaryCtxt* ce_util_makeEmptyDict( XW_UtilCtxt* uc );
|
||||||
|
@ -335,6 +336,7 @@ ceInitUtilFuncs( CEAppGlobals* globals )
|
||||||
vtable->m_util_hiliteCell = ce_util_hiliteCell;
|
vtable->m_util_hiliteCell = ce_util_hiliteCell;
|
||||||
vtable->m_util_engineProgressCallback = ce_util_engineProgressCallback;
|
vtable->m_util_engineProgressCallback = ce_util_engineProgressCallback;
|
||||||
vtable->m_util_setTimer = ce_util_setTimer;
|
vtable->m_util_setTimer = ce_util_setTimer;
|
||||||
|
vtable->m_util_altKeyDown = ce_util_altKeyDown;
|
||||||
vtable->m_util_requestTime = ce_util_requestTime;
|
vtable->m_util_requestTime = ce_util_requestTime;
|
||||||
vtable->m_util_getCurSeconds = ce_util_getCurSeconds;
|
vtable->m_util_getCurSeconds = ce_util_getCurSeconds;
|
||||||
vtable->m_util_makeEmptyDict = ce_util_makeEmptyDict;
|
vtable->m_util_makeEmptyDict = ce_util_makeEmptyDict;
|
||||||
|
@ -563,15 +565,14 @@ figureBoardParms( CEAppGlobals* globals, XP_U16 nRows, CEBoardParms* bparms )
|
||||||
bparms->horiz = horiz;
|
bparms->horiz = horiz;
|
||||||
|
|
||||||
#ifdef CEFEATURE_CANSCROLL
|
#ifdef CEFEATURE_CANSCROLL
|
||||||
globals->nHiddenRows = nRows - nVisibleRows;
|
|
||||||
bparms->needsScroller = nVisibleRows < nRows;
|
bparms->needsScroller = nVisibleRows < nRows;
|
||||||
if ( bparms->needsScroller && !IS_SMARTPHONE(globals) ) {
|
if ( bparms->needsScroller && !IS_SMARTPHONE(globals) ) {
|
||||||
XP_U16 boardRight = boardLeft + (nRows * hScale);
|
XP_U16 boardRight = boardLeft + (nRows * hScale);
|
||||||
showScroller( globals, globals->nHiddenRows,
|
showScroller( globals, nRows - nVisibleRows,
|
||||||
boardRight, boardTop,
|
boardRight, boardTop,
|
||||||
scrollWidth, boardHt );
|
scrollWidth, boardHt );
|
||||||
XP_LOGF( "NEEDING SCROLLBAR!!!!" );
|
XP_LOGF( "NEEDING SCROLLBAR!!!!" );
|
||||||
XP_LOGF( "%d rows hidden", globals->nHiddenRows );
|
XP_LOGF( "%d rows hidden", nRows - nVisibleRows );
|
||||||
} else {
|
} else {
|
||||||
hideScroller( globals );
|
hideScroller( globals );
|
||||||
}
|
}
|
||||||
|
@ -1343,12 +1344,17 @@ handleJuggleCmd( CEAppGlobals* globals )
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
handleHidetrayCmd( CEAppGlobals* globals )
|
handleHidetrayCmd( CEAppGlobals* globals )
|
||||||
{
|
{
|
||||||
|
XP_Bool result;
|
||||||
XW_TrayVisState curState = board_getTrayVisState( globals->game.board );
|
XW_TrayVisState curState = board_getTrayVisState( globals->game.board );
|
||||||
|
|
||||||
if ( curState == TRAY_REVEALED ) {
|
if ( curState == TRAY_REVEALED ) {
|
||||||
return board_hideTray( globals->game.board );
|
result = board_hideTray( globals->game.board );
|
||||||
} else {
|
} else {
|
||||||
return board_showTray( globals->game.board );
|
result = board_showTray( globals->game.board );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ceSetLeftSoftkey( globals, ID_MOVE_HIDETRAY );
|
||||||
|
return result;
|
||||||
} /* handleHidetrayCmd */
|
} /* handleHidetrayCmd */
|
||||||
|
|
||||||
static XP_Bool
|
static XP_Bool
|
||||||
|
@ -1774,11 +1780,9 @@ handleScroll( CEAppGlobals* globals, XP_S16 pos, /* only valid for THUMB* */
|
||||||
/* do nothing */
|
/* do nothing */
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( newOffset >= 0 && newOffset <= globals->nHiddenRows ) {
|
|
||||||
result = curYOffset != newOffset
|
result = curYOffset != newOffset
|
||||||
&& board_setYOffset( globals->game.board, newOffset );
|
&& board_setYOffset( globals->game.board, newOffset );
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
} /* handleScroll */
|
} /* handleScroll */
|
||||||
#endif
|
#endif
|
||||||
|
@ -2821,7 +2825,6 @@ ce_util_trayHiddenChange( XW_UtilCtxt* uc, XW_TrayVisState XP_UNUSED(newState),
|
||||||
if ( !!globals->scrollHandle ) {
|
if ( !!globals->scrollHandle ) {
|
||||||
nHiddenRows = model_numRows( globals->game.model ) - nVisibleRows;
|
nHiddenRows = model_numRows( globals->game.model ) - nVisibleRows;
|
||||||
updateScrollInfo( globals->scrollHandle, nHiddenRows );
|
updateScrollInfo( globals->scrollHandle, nHiddenRows );
|
||||||
globals->nHiddenRows = nHiddenRows;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2907,6 +2910,13 @@ ce_util_setTimer( XW_UtilCtxt* uc, XWTimerReason why,
|
||||||
globals->timerIDs[why] = timerID;
|
globals->timerIDs[why] = timerID;
|
||||||
} /* ce_util_setTimer */
|
} /* ce_util_setTimer */
|
||||||
|
|
||||||
|
static XP_Bool
|
||||||
|
ce_util_altKeyDown( XW_UtilCtxt* XP_UNUSED(uc) )
|
||||||
|
{
|
||||||
|
return GetKeyState(VK_LSHIFT) < 0
|
||||||
|
|| GetKeyState(VK_RSHIFT) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ce_util_requestTime( XW_UtilCtxt* uc )
|
ce_util_requestTime( XW_UtilCtxt* uc )
|
||||||
{
|
{
|
||||||
|
|
|
@ -129,7 +129,6 @@ typedef struct CEAppGlobals {
|
||||||
XP_U16 flags; /* bits defined below */
|
XP_U16 flags; /* bits defined below */
|
||||||
|
|
||||||
#ifdef CEFEATURE_CANSCROLL
|
#ifdef CEFEATURE_CANSCROLL
|
||||||
XP_U16 nHiddenRows;
|
|
||||||
HWND scrollHandle;
|
HWND scrollHandle;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue