Make miniwindow stuff compile-time optional. The goal's to use native

features where they look better or are easier to manage, e.g. Toasts
and dialogs on Android.
This commit is contained in:
Eric House 2011-08-29 20:36:01 -07:00
parent 3b719f54de
commit c01981bc8f
11 changed files with 162 additions and 35 deletions

View file

@ -402,6 +402,7 @@ and_draw_dictChanged( DrawCtx* dctx, XP_S16 playerNum,
}
}
#ifdef XWFEATURE_MINIWIN
static const XP_UCHAR*
and_draw_getMiniWText( DrawCtx* dctx, XWMiniTextType textHint )
{
@ -448,6 +449,7 @@ and_draw_drawMiniWindow( DrawCtx* dctx, const XP_UCHAR* text,
(*env)->DeleteLocalRef( env, jstr );
}
#endif
static XP_Bool
draw_doNothing( DrawCtx* dctx, ... )
@ -496,9 +498,11 @@ makeDraw( MPFORMAL JNIEnv** envp, jobject jdraw )
SET_PROC(objFinished);
SET_PROC(dictChanged);
#ifdef XWFEATURE_MINIWIN
SET_PROC(getMiniWText);
SET_PROC(measureMiniWText);
SET_PROC(drawMiniWindow);
#endif
#undef SET_PROC
return (DrawCtx*)draw;

View file

@ -95,7 +95,11 @@ static void setArrowFor( BoardCtxt* board, XP_U16 player, XP_U16 col,
XP_U16 row );
static XP_Bool setArrowVisible( BoardCtxt* board, XP_Bool visible );
#ifdef XWFEATURE_MINIWIN
static void invalTradeWindow( BoardCtxt* board, XP_S16 turn, XP_Bool redraw );
#else
# define invalTradeWindow(b,t,r)
#endif
static XP_Bool invalCellsWithTiles( BoardCtxt* board );
static void setTimerIf( BoardCtxt* board );
@ -678,6 +682,7 @@ invalCursorCell( BoardCtxt* board )
} /* invalCursorCell */
#endif
#ifdef XWFEATURE_MINIWIN
static void
invalTradeWindow( BoardCtxt* board, XP_S16 turn, XP_Bool redraw )
{
@ -712,6 +717,7 @@ hideMiniWindow( BoardCtxt* board, XP_Bool destroy, MiniWindowType winType )
}
} /* hideMiniWindow */
#endif
#endif
static XP_Bool
warnBadWords( XP_UCHAR* word, void* closure )
@ -904,6 +910,7 @@ board_resetEngine( BoardCtxt* board )
server_resetEngine( board->server, board->selPlayer );
} /* board_resetEngine */
#ifdef XWFEATURE_MINIWIN
/* Find a rectangle either centered on the board or pinned to the point at
* which the mouse went down.
*/
@ -929,6 +936,7 @@ positionMiniWRect( BoardCtxt* board, XP_Rect* rect, XP_Bool center )
}
forceRectToBoard( board, rect );
} /*positionMiniWRect */
#endif
static XP_Bool
timerFiredForPen( BoardCtxt* board )
@ -954,7 +962,11 @@ timerFiredForPen( BoardCtxt* board )
bonus = util_getSquareBonus( board->util, board->model,
col, row );
if ( bonus != BONUS_NONE ) {
#ifdef XWFEATURE_MINIWIN
text = draw_getMiniWText( board->draw, (XWMiniTextType)bonus );
#else
util_bonusSquareHeld( board->util, bonus );
#endif
}
}
board->penTimerFired = XP_TRUE;
@ -984,14 +996,18 @@ timerFiredForPen( BoardCtxt* board )
XP_ASSERT( XP_STRLEN(buf) + explLen < sizeof(buf) );
XP_STRCAT( buf, scoreExpl );
}
#ifdef XWFEATURE_MINIWIN
text = buf;
#else
util_playerScoreHeld( board->util, buf );
#endif
}
board->penTimerFired = XP_TRUE;
}
if ( !!text ) {
#ifdef XWFEATURE_MINIWIN
MiniWindowStuff* stuff = &board->miniWindowStuff[MINIWINDOW_VALHINT];
makeMiniWindowForText( board, text, MINIWINDOW_VALHINT );
XP_ASSERT( stuff->text == text );
@ -1002,6 +1018,7 @@ timerFiredForPen( BoardCtxt* board )
dragDropEnd( board, board->penDownX, board->penDownY, &dragged );
XP_ASSERT( !dragged );
}
#endif
}
return draw;
} /* timerFiredForPen */
@ -1123,7 +1140,9 @@ board_invalAllTiles( BoardCtxt* board )
while ( lastRow-- ) {
board->redrawFlags[lastRow] = ~0;
}
#ifdef XWFEATURE_MINIWIN
board->tradingMiniWindowInvalid = XP_TRUE;
#endif
board->needsDrawing = XP_TRUE;
} /* board_invalAllTiles */
@ -1967,6 +1986,7 @@ invalCell( BoardCtxt* board, XP_U16 col, XP_U16 row )
XP_ASSERT( col < MAX_ROWS );
XP_ASSERT( row < MAX_ROWS );
#ifdef XWFEATURE_MINIWIN
/* if the trade window is up and this cell intersects it, set up to draw
it again */
if ( (board->trayVisState != TRAY_HIDDEN) && TRADE_IN_PROGRESS(board) ) {
@ -1978,6 +1998,7 @@ invalCell( BoardCtxt* board, XP_U16 col, XP_U16 row )
}
}
}
#endif
board->needsDrawing = XP_TRUE;
} /* invalCell */
@ -2030,6 +2051,7 @@ moveTileToArrowLoc( BoardCtxt* board, XP_U8 index )
} /* moveTileToArrowLoc */
#endif
#ifdef XWFEATURE_MINIWIN
void
makeMiniWindowForText( BoardCtxt* board, const XP_UCHAR* text,
MiniWindowType winType )
@ -2044,6 +2066,7 @@ makeMiniWindowForText( BoardCtxt* board, const XP_UCHAR* text,
stuff->rect = rect;
stuff->text = text;
} /* makeMiniWindowForText */
#endif
XP_Bool
board_beginTrade( BoardCtxt* board )
@ -2059,7 +2082,11 @@ board_beginTrade( BoardCtxt* board )
} else if ( server_countTilesInPool(board->server) < MIN_TRADE_TILES){
util_userError( board->util, ERR_TOO_FEW_TILES_LEFT_TO_TRADE );
} else {
#ifdef XWFEATURE_MINIWIN
board->tradingMiniWindowInvalid = XP_TRUE;
#else
util_setInTrade( board->util, board->selPlayer, XP_TRUE );
#endif
board->needsDrawing = XP_TRUE;
board->selInfo->tradeInProgress = XP_TRUE;
setArrowVisible( board, XP_FALSE );
@ -2077,6 +2104,9 @@ board_endTrade( BoardCtxt* board )
PerTurnInfo* pti = board->selInfo;
invalSelTradeWindow( board );
pti->tradeInProgress = XP_FALSE;
#ifndef XWFEATURE_MINIWIN
util_setInTrade( board->util, board->selPlayer, XP_FALSE );
#endif
pti->traySelBits = NO_TILES;
}
return result;
@ -2084,12 +2114,16 @@ board_endTrade( BoardCtxt* board )
#if defined POINTER_SUPPORT || defined KEYBOARD_NAV
# ifdef XWFEATURE_MINIWIN
static XP_Bool
ptOnTradeWindow( BoardCtxt* board, XP_U16 x, XP_U16 y )
{
XP_Rect* windowR = &board->miniWindowStuff[MINIWINDOW_TRADING].rect;
return rectContainsPt( windowR, x, y );
} /* ptOnTradeWindow */
# else
# define ptOnTradeWindow(b,x,y) XP_FALSE
# endif
#ifdef XWFEATURE_SEARCHLIMIT
@ -2455,6 +2489,9 @@ exitTradeMode( BoardCtxt* board )
PerTurnInfo* pti = board->selInfo;
invalSelTradeWindow( board );
pti->tradeInProgress = XP_FALSE;
#ifndef XWFEATURE_MINIWIN
util_setInTrade( board->util, board->selPlayer, XP_FALSE );
#endif
board_invalTrayTiles( board, pti->traySelBits );
pti->traySelBits = 0x00;
return XP_TRUE;
@ -2493,9 +2530,11 @@ handlePenUpInternal( BoardCtxt* board, XP_U16 xx, XP_U16 yy, XP_Bool isPen )
if ( dragged ) {
/* do nothing further */
} else if ( board->penTimerFired ) {
#ifdef XWFEATURE_MINIWIN
if ( valHintMiniWindowActive( board ) ) {
hideMiniWindow( board, XP_TRUE, MINIWINDOW_VALHINT );
}
#endif
draw = XP_TRUE; /* might have cancelled a drag */
/* Need to clean up if there's been any dragging happening */
board->penTimerFired = XP_FALSE;

View file

@ -76,7 +76,11 @@ static void scrollIfCan( BoardCtxt* board );
#ifdef KEYBOARD_NAV
static XP_Bool cellFocused( const BoardCtxt* board, XP_U16 col, XP_U16 row );
#endif
#ifdef XWFEATURE_MINIWIN
static void drawTradeWindowIf( BoardCtxt* board );
#else
# define drawTradeWindowIf( board )
#endif
#ifdef XWFEATURE_SEARCHLIMIT
@ -221,6 +225,7 @@ rectContainsRect( XP_Rect* rect1, XP_Rect* rect2 )
&& rect1->left + rect1->width >= rect2->left + rect2->width );
} /* rectContainsRect */
#ifdef XWFEATURE_MINIWIN
static void
makeMiniWindowForTrade( BoardCtxt* board )
{
@ -230,6 +235,7 @@ makeMiniWindowForTrade( BoardCtxt* board )
makeMiniWindowForText( board, text, MINIWINDOW_TRADING );
} /* makeMiniWindowForTrade */
#endif
#ifdef XWFEATURE_CROSSHAIRS
static CellFlags
@ -591,6 +597,7 @@ scrollIfCan( BoardCtxt* board )
}
} /* scrollIfCan */
#ifdef XWFEATURE_MINIWIN
static void
drawTradeWindowIf( BoardCtxt* board )
{
@ -607,6 +614,7 @@ drawTradeWindowIf( BoardCtxt* board )
board->tradingMiniWindowInvalid = XP_FALSE;
}
} /* drawTradeWindowIf */
#endif
XP_Bool
board_draw( BoardCtxt* board )

View file

@ -89,6 +89,7 @@ typedef struct _BdCursorLoc {
} BdCursorLoc;
#endif
#ifdef XWFEATURE_MINIWIN
/* We only need two of these, one for the value hint and the other for the
trading window. There's never more than of the former since it lives only
as long as the pen is down. There are, in theory, as many trading windows
@ -101,6 +102,7 @@ typedef struct _MiniWindowStuff {
enum { MINIWINDOW_VALHINT, MINIWINDOW_TRADING };
typedef XP_U16 MiniWindowType; /* one of the two above */
#endif
typedef struct _PerTurnInfo {
#ifdef KEYBOARD_NAV
@ -213,8 +215,10 @@ struct BoardCtxt {
XP_Bool scoreBoardInvalid;
DragState dragState;
#ifdef XWFEATURE_MINIWIN
MiniWindowStuff miniWindowStuff[2];
XP_Bool tradingMiniWindowInvalid;
#endif
TileBit trayInvalBits;
#ifdef KEYBOARD_NAV
@ -230,9 +234,10 @@ struct BoardCtxt {
};
#define CURSOR_LOC_REM 0
#define valHintMiniWindowActive( board ) \
#ifdef XWFEATURE_MINIWIN
# define valHintMiniWindowActive( board ) \
((XP_Bool)((board)->miniWindowStuff[MINIWINDOW_VALHINT].text != NULL))
#endif
#define MY_TURN(b) ((b)->selPlayer == server_getCurrentTurn( (b)->server ))
#define TRADE_IN_PROGRESS(b) ((b)->selInfo->tradeInProgress==XP_TRUE)
@ -274,21 +279,27 @@ void invalRow( BoardCtxt* board, XP_U16 row );
void invalTrayTilesAbove( BoardCtxt* board, XP_U16 tileIndex );
void invalTrayTilesBetween( BoardCtxt* board, XP_U16 tileIndex1,
XP_U16 tileIndex2 );
#ifdef XWFEATURE_MINIWIN
void makeMiniWindowForText( BoardCtxt* board, const XP_UCHAR* text,
MiniWindowType winType );
void hideMiniWindow( BoardCtxt* board, XP_Bool destroy,
MiniWindowType winType );
void invalSelTradeWindow( BoardCtxt* board );
#else
# define invalSelTradeWindow(b)
#endif
XP_Bool getCellRect( const BoardCtxt* board, XP_U16 col, XP_U16 row,
XP_Rect* rect);
void getDragCellRect( BoardCtxt* board, XP_U16 col, XP_U16 row,
XP_Rect* rectP );
void invalSelTradeWindow( BoardCtxt* board );
void invalCellsUnderRect( BoardCtxt* board, const XP_Rect* rect );
#ifdef XWFEATURE_SEARCHLIMIT
void invalCurHintRect( BoardCtxt* board, XP_U16 player );
#endif
void hideMiniWindow( BoardCtxt* board, XP_Bool destroy,
MiniWindowType winType );
void moveTileInTray( BoardCtxt* board, XP_U16 moveTo, XP_U16 moveFrom );
XP_Bool handleTrayDuringTrade( BoardCtxt* board, XP_S16 index );

View file

@ -217,6 +217,10 @@ typedef struct _PlayerDicts {
#define LOG_RETURN_VOID() LOG_RETURNF("%s","void")
#define XP_LOGLOC() XP_LOGF( "%s(), line %d", __func__, __LINE__ )
#ifndef XP_USE
# define XP_USE(v) v=v
#endif
#ifndef XP_UNUSED
# if defined __GNUC__
# define XP_UNUSED(x) UNUSED__ ## x __attribute__((unused))

View file

@ -566,9 +566,11 @@ dragDropContinueImpl( BoardCtxt* board, XP_U16 xx, XP_U16 yy,
/* This is the first time we've moved!!! Kill any future timers,
and if there's a window up kill it.*/
board->penTimerFired = XP_FALSE;
#ifdef XWFEATURE_MINIWIN
if ( valHintMiniWindowActive( board ) ) {
hideMiniWindow( board, XP_TRUE, MINIWINDOW_VALHINT );
}
#endif
ds->didMove = XP_TRUE;
}
}

View file

@ -197,12 +197,14 @@ typedef struct DrawCtxVTable {
XWBonusType bonus, XP_Bool vert,
HintAtts hintAtts,
CellFlags flags);
#ifdef XWFEATURE_MINIWIN
const XP_UCHAR* DRAW_VTABLE_NAME(getMiniWText) ( DrawCtx* dctx,
XWMiniTextType textHint );
void DRAW_VTABLE_NAME(measureMiniWText) ( DrawCtx* dctx, const XP_UCHAR* textP,
XP_U16* width, XP_U16* height );
void DRAW_VTABLE_NAME(drawMiniWindow)( DrawCtx* dctx, const XP_UCHAR* text,
const XP_Rect* rect, void** closure );
#endif
#ifndef DRAW_LINK_DIRECT
} DrawCtxVTable; /* */
#endif
@ -291,11 +293,13 @@ struct DrawCtx {
#define draw_drawBoardArrow( dc, r, b, v, h, f ) \
CALL_DRAW_NAME5(drawBoardArrow,(dc),(r),(b), (v), (h), (f))
#define draw_getMiniWText( dc, b ) CALL_DRAW_NAME1(getMiniWText, (dc),(b) )
#define draw_measureMiniWText( dc, t, wp, hp) \
#ifdef XWFEATURE_MINIWIN
# define draw_getMiniWText( dc, b ) CALL_DRAW_NAME1(getMiniWText, (dc),(b) )
# define draw_measureMiniWText( dc, t, wp, hp) \
CALL_DRAW_NAME3(measureMiniWText, (dc),(t), (wp), (hp) )
#define draw_drawMiniWindow( dc, t, r, c ) \
# define draw_drawMiniWindow( dc, t, r, c ) \
CALL_DRAW_NAME3(drawMiniWindow, (dc), (t), (r), (c) )
#endif
#ifdef DRAW_WITH_PRIMITIVES
# define draw_setClip( dc, rn, ro ) CALL_DRAW_NAME2(setClip, (dc), (rn), (ro))

View file

@ -1,4 +1,4 @@
/* -*-mode: C; fill-column: 78; c-basic-offset: 4; -*- */
/* -*-mode: C; fill-column: 78; c-basic-offset: 4; -*- */
/*
* Copyright 1997 - 2010 by Eric House (xwords@eehouse.org). All rights
* reserved.
@ -158,6 +158,12 @@ typedef struct UtilVtable {
void (*m_util_remSelected)(XW_UtilCtxt* uc);
#ifndef XWFEATURE_MINIWIN
void (*m_util_setInTrade)( XW_UtilCtxt* uc, XP_U16 turn, XP_Bool entering );
void (*m_util_bonusSquareHeld)( XW_UtilCtxt* uc, XWBonusType bonus );
void (*m_util_playerScoreHeld)( XW_UtilCtxt* uc, const XP_UCHAR* txt );
#endif
#ifndef XWFEATURE_STANDALONE_ONLY
void (*m_util_addrChange)( XW_UtilCtxt* uc, const CommsAddrRec* oldAddr,
const CommsAddrRec* newAddr );
@ -258,6 +264,15 @@ struct XW_UtilCtxt {
#define util_remSelected( uc ) \
(uc)->vtable->m_util_remSelected((uc))
#ifndef XWFEATURE_MINIWIN
# define util_setInTrade( uc, t, e ) \
(uc)->vtable->m_util_setInTrade( (uc), (t), (e) )
# define util_bonusSquareHeld( uc, b ) \
(uc)->vtable->m_util_bonusSquareHeld( (uc), (b) )
# define util_playerScoreHeld( uc, txt ) \
(uc)->vtable->m_util_playerScoreHeld( (uc), (txt) )
#endif
#ifndef XWFEATURE_STANDALONE_ONLY
# define util_addrChange( uc, addro, addrn ) \
(uc)->vtable->m_util_addrChange((uc), (addro), (addrn))

View file

@ -39,20 +39,6 @@ typedef struct CursesDrawCtx {
static void curses_draw_clearRect( DrawCtx* p_dctx, const XP_Rect* rectP );
static void getTops( const XP_Rect* rect, int* toptop, int* topbot );
static void
drawRect( WINDOW* win, const XP_Rect* rect, char vert, char hor )
{
wmove( win, rect->top-1, rect->left );
whline( win, hor, rect->width );
wmove( win, rect->top+rect->height, rect->left );
whline( win, hor, rect->width );
wmove( win, rect->top, rect->left-1 );
wvline( win, vert, rect->height );
wmove( win, rect->top, rect->left+rect->width );
wvline( win, vert, rect->height );
} /* drawRect */
static void
eraseRect( CursesDrawCtx* dctx, const XP_Rect* rect )
{
@ -484,6 +470,7 @@ curses_draw_clearRect( DrawCtx* p_dctx, const XP_Rect* rectP )
eraseRect( dctx, &rect );
} /* curses_draw_clearRect */
#ifdef XWFEATURE_MINIWIN
static const XP_UCHAR*
curses_draw_getMiniWText( DrawCtx* XP_UNUSED(p_dctx),
XWMiniTextType XP_UNUSED(textHint) )
@ -499,6 +486,20 @@ curses_draw_measureMiniWText( DrawCtx* XP_UNUSED(p_dctx), const XP_UCHAR* str,
*heightP = 3;
} /* curses_draw_measureMiniWText */
static void
drawRect( WINDOW* win, const XP_Rect* rect, char vert, char hor )
{
wmove( win, rect->top-1, rect->left );
whline( win, hor, rect->width );
wmove( win, rect->top+rect->height, rect->left );
whline( win, hor, rect->width );
wmove( win, rect->top, rect->left-1 );
wvline( win, vert, rect->height );
wmove( win, rect->top, rect->left+rect->width );
wvline( win, vert, rect->height );
} /* drawRect */
static void
curses_draw_drawMiniWindow( DrawCtx* p_dctx, const XP_UCHAR* text,
const XP_Rect* rect, void** XP_UNUSED(closure) )
@ -519,6 +520,7 @@ curses_draw_drawMiniWindow( DrawCtx* p_dctx, const XP_UCHAR* text,
mvwprintw( dctx->boardWin, smallerR.top, smallerR.left, text,
strlen(text) );
} /* curses_draw_drawMiniWindow */
#endif
#if 0
static void
@ -568,9 +570,11 @@ cursesDrawCtxtMake( WINDOW* boardWin )
SET_VTABLE_ENTRY( dctx->vtable, draw_clearRect, curses );
#ifdef XWFEATURE_MINIWIN
SET_VTABLE_ENTRY( dctx->vtable, draw_drawMiniWindow, curses );
SET_VTABLE_ENTRY( dctx->vtable, draw_getMiniWText, curses );
SET_VTABLE_ENTRY( dctx->vtable, draw_measureMiniWText, curses );
#endif
dctx->boardWin = boardWin;

View file

@ -127,14 +127,6 @@ gtkEraseRect( const GtkDrawCtx* dctx, const XP_Rect* rect )
rect->width, rect->height );
} /* gtkEraseRect */
static void
frameRect( GtkDrawCtx* dctx, const XP_Rect* rect )
{
draw_rectangle( dctx, DRAW_WHAT(dctx), dctx->drawGC,
FALSE, rect->left, rect->top,
rect->width, rect->height );
} /* frameRect */
#ifdef DRAW_WITH_PRIMITIVES
static void
@ -1149,9 +1141,18 @@ gtk_draw_drawTimer( DrawCtx* p_dctx, const XP_Rect* rInner,
&dctx->playerColors[playerNum], NULL );
} /* gtk_draw_drawTimer */
#define MINI_LINE_HT 12
#define MINI_V_PADDING 6
#define MINI_H_PADDING 8
#ifdef XWFEATURE_MINIWIN
# define MINI_LINE_HT 12
# define MINI_V_PADDING 6
# define MINI_H_PADDING 8
static void
frameRect( GtkDrawCtx* dctx, const XP_Rect* rect )
{
draw_rectangle( dctx, DRAW_WHAT(dctx), dctx->drawGC,
FALSE, rect->left, rect->top,
rect->width, rect->height );
} /* frameRect */
static const XP_UCHAR*
gtk_draw_getMiniWText( DrawCtx* XP_UNUSED(p_dctx), XWMiniTextType textHint )
@ -1221,6 +1222,7 @@ gtk_draw_drawMiniWindow( DrawCtx* p_dctx, const XP_UCHAR* text,
&localR, XP_GTK_JUST_CENTER,
&dctx->black, NULL );
} /* gtk_draw_drawMiniWindow */
#endif
#define SET_GDK_COLOR( c, r, g, b ) { \
c.red = (r); \
@ -1301,9 +1303,11 @@ gtkDrawCtxtMake( GtkWidget* drawing_area, GtkAppGlobals* globals )
SET_VTABLE_ENTRY( dctx->vtable, draw_drawTimer, gtk );
#ifdef XWFEATURE_MINIWIN
SET_VTABLE_ENTRY( dctx->vtable, draw_getMiniWText, gtk );
SET_VTABLE_ENTRY( dctx->vtable, draw_measureMiniWText, gtk );
SET_VTABLE_ENTRY( dctx->vtable, draw_drawMiniWindow, gtk );
#endif
SET_VTABLE_ENTRY( dctx->vtable, draw_destroyCtxt, gtk );
SET_VTABLE_ENTRY( dctx->vtable, draw_dictChanged, gtk );

View file

@ -1682,6 +1682,32 @@ gtk_util_getTraySearchLimits( XW_UtilCtxt* XP_UNUSED(uc),
}
#endif
#ifndef XWFEATURE_MINIWIN
static void
gtk_util_setInTrade( XW_UtilCtxt* uc, XP_U16 turn, XP_Bool entering )
{
XP_LOGF( "%s(turn=%d; entering=%d)", __func__, turn, entering );
XP_USE( uc );
XP_USE( turn );
XP_USE( entering );
}
static void
gtk_util_bonusSquareHeld( XW_UtilCtxt* uc, XWBonusType bonus )
{
LOG_FUNC();
XP_USE( uc );
XP_USE( bonus );
}
static void
gtk_util_playerScoreHeld( XW_UtilCtxt* uc, const XP_UCHAR* txt )
{
LOG_FUNC();
XP_USE( uc );
XP_USE( txt );
}
#endif
static void
gtk_util_userError( XW_UtilCtxt* uc, UtilErrID id )
@ -1901,6 +1927,12 @@ setupGtkUtilCallbacks( GtkAppGlobals* globals, XW_UtilCtxt* util )
util->vtable->m_util_getTraySearchLimits = gtk_util_getTraySearchLimits;
#endif
#ifndef XWFEATURE_MINIWIN
util->vtable->m_util_setInTrade = gtk_util_setInTrade;
util->vtable->m_util_bonusSquareHeld = gtk_util_bonusSquareHeld;
util->vtable->m_util_playerScoreHeld = gtk_util_playerScoreHeld;
#endif
util->closure = globals;
} /* setupGtkUtilCallbacks */