diff --git a/xwords4/android/XWords4/AndroidManifest.xml b/xwords4/android/XWords4/AndroidManifest.xml
index 5d80151b6..9b3d4b194 100644
--- a/xwords4/android/XWords4/AndroidManifest.xml
+++ b/xwords4/android/XWords4/AndroidManifest.xml
@@ -84,6 +84,11 @@
>
+
+
diff --git a/xwords4/android/XWords4/jni/andutils.c b/xwords4/android/XWords4/jni/andutils.c
index 4bb47f3e6..b530efc83 100644
--- a/xwords4/android/XWords4/jni/andutils.c
+++ b/xwords4/android/XWords4/jni/andutils.c
@@ -291,16 +291,15 @@ makeStringArray( JNIEnv *env, int siz, const XP_UCHAR** vals )
}
jstring
-streamToJString( MPFORMAL JNIEnv *env, XWStreamCtxt* stream )
+streamToJString( JNIEnv *env, XWStreamCtxt* stream )
{
int len = stream_getSize( stream );
- XP_UCHAR* buf = XP_MALLOC( mpool, 1 + len );
+ XP_UCHAR buf[1 + len];
stream_getBytes( stream, buf, len );
buf[len] = '\0';
jstring jstr = (*env)->NewStringUTF( env, buf );
- XP_FREE( mpool, buf );
return jstr;
}
diff --git a/xwords4/android/XWords4/jni/andutils.h b/xwords4/android/XWords4/jni/andutils.h
index 6742aa22c..20215b8d6 100644
--- a/xwords4/android/XWords4/jni/andutils.h
+++ b/xwords4/android/XWords4/jni/andutils.h
@@ -56,7 +56,7 @@ void setBoolArray( JNIEnv* env, jbooleanArray jarr, int count,
const jboolean* vals );
jobjectArray makeStringArray( JNIEnv *env, int size, const XP_UCHAR** vals );
-jstring streamToJString( MPFORMAL JNIEnv* env, XWStreamCtxt* stream );
+jstring streamToJString( JNIEnv* env, XWStreamCtxt* stream );
/* Note: jmethodID can be cached. Should not look up more than once. */
jmethodID getMethodID( JNIEnv* env, jobject obj, const char* proc,
diff --git a/xwords4/android/XWords4/jni/utilwrapper.c b/xwords4/android/XWords4/jni/utilwrapper.c
index c46455081..7b5937d6d 100644
--- a/xwords4/android/XWords4/jni/utilwrapper.c
+++ b/xwords4/android/XWords4/jni/utilwrapper.c
@@ -126,7 +126,7 @@ and_util_userQuery( XW_UtilCtxt* uc, UtilQueryID id, XWStreamCtxt* stream )
jstring jstr = NULL;
if ( NULL != stream ) {
- jstr = streamToJString( MPPARM(util->util.mpool) env, stream );
+ jstr = streamToJString( env, stream );
}
result = (*env)->CallBooleanMethod( env, util->jutil, mid, id, jstr );
if ( NULL != jstr ) {
@@ -251,8 +251,8 @@ and_util_informMove( XW_UtilCtxt* uc, XWStreamCtxt* expl, XWStreamCtxt* words )
{
if ( !!words ) {
UTIL_CBK_HEADER( "informMove", "(Ljava/lang/String;Ljava/lang/String;)V" );
- jstring jexpl = streamToJString( MPPARM(util->util.mpool) env, expl );
- jstring jwords = streamToJString( MPPARM(util->util.mpool) env, words );
+ jstring jexpl = streamToJString( env, expl );
+ jstring jwords = streamToJString( env, words );
(*env)->CallVoidMethod( env, util->jutil, mid, jexpl, jwords );
(*env)->DeleteLocalRef( env, jexpl );
(*env)->DeleteLocalRef( env, jwords );
@@ -454,8 +454,7 @@ and_util_cellSquareHeld( XW_UtilCtxt* uc, XWStreamCtxt* words )
{
if ( NULL != words ) {
UTIL_CBK_HEADER( "cellSquareHeld", "(Ljava/lang/String;)V" );
- jstring jwords =
- streamToJString( MPPARM(util->util.mpool) env, words );
+ jstring jwords = streamToJString( env, words );
(*env)->CallVoidMethod( env, util->jutil, mid, jwords );
(*env)->DeleteLocalRef( env, jwords );
UTIL_CBK_TAIL();
diff --git a/xwords4/android/XWords4/jni/xwjni.c b/xwords4/android/XWords4/jni/xwjni.c
index 023dda3fd..c5016a734 100644
--- a/xwords4/android/XWords4/jni/xwjni.c
+++ b/xwords4/android/XWords4/jni/xwjni.c
@@ -871,7 +871,7 @@ Java_org_eehouse_android_xw4_jni_XwJNI_board_1formatRemainingTiles
XWStreamCtxt* stream = mem_stream_make( MPPARM(mpool) globals->vtMgr,
NULL, 0, NULL );
board_formatRemainingTiles( state->game.board, stream );
- result = streamToJString( MPPARM(mpool) env, stream );
+ result = streamToJString( env, stream );
stream_destroy( stream );
(*env)->DeleteLocalRef( env, result );
@@ -887,7 +887,7 @@ Java_org_eehouse_android_xw4_jni_XwJNI_server_1formatDictCounts
XWJNI_START_GLOBALS();
XWStreamCtxt* stream = and_empty_stream( MPPARM(mpool) globals );
server_formatDictCounts( state->game.server, stream, nCols );
- result = streamToJString( MPPARM(mpool) env, stream );
+ result = streamToJString( env, stream );
stream_destroy( stream );
(*env)->DeleteLocalRef( env, result );
XWJNI_END();
@@ -914,7 +914,7 @@ Java_org_eehouse_android_xw4_jni_XwJNI_model_1writeGameHistory
XWStreamCtxt* stream = and_empty_stream( MPPARM(mpool) globals );
model_writeGameHistory( state->game.model, stream, state->game.server,
gameOver );
- result = streamToJString( MPPARM(mpool) env, stream );
+ result = streamToJString( env, stream );
(*env)->DeleteLocalRef( env, result );
stream_destroy( stream );
XWJNI_END();
@@ -960,7 +960,7 @@ Java_org_eehouse_android_xw4_jni_XwJNI_server_1writeFinalScores
XWJNI_START_GLOBALS();
XWStreamCtxt* stream = and_empty_stream( MPPARM(mpool) globals );
server_writeFinalScores( state->game.server, stream );
- result = streamToJString( MPPARM(mpool) env, stream );
+ result = streamToJString( env, stream );
(*env)->DeleteLocalRef( env, result );
stream_destroy( stream );
XWJNI_END();
diff --git a/xwords4/android/XWords4/res/layout/lookup.xml b/xwords4/android/XWords4/res/layout/lookup.xml
index 33773e1fd..c3ae2eb36 100644
--- a/xwords4/android/XWords4/res/layout/lookup.xml
+++ b/xwords4/android/XWords4/res/layout/lookup.xml
@@ -1,13 +1,18 @@
-
+
-
+
+
-
+
diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java
index e8bf63893..ec446f283 100644
--- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java
+++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/DlgDelegate.java
@@ -45,8 +45,7 @@ public class DlgDelegate {
public static final int CONFIRM_THEN = 4;
public static final int TEXT_OR_HTML_THEN = 5;
public static final int DLG_DICTGONE = 6;
- public static final int DLG_LOOKUP = 7;
- public static final int DIALOG_LAST = DLG_LOOKUP;
+ public static final int DIALOG_LAST = DLG_DICTGONE;
public static final int SMS_BTN = AlertDialog.BUTTON_POSITIVE;
public static final int EMAIL_BTN = AlertDialog.BUTTON_NEGATIVE;
@@ -77,9 +76,6 @@ public class DlgDelegate {
private Activity m_activity;
private DlgClickNotify m_clickCallback;
private String m_dictName = null;
- private String[] m_words = null;
- private int m_wordsLang = -1;
- private boolean m_forceList = false;
private ProgressDialog m_progress;
private Handler m_handler;
@@ -95,9 +91,6 @@ public class DlgDelegate {
m_cbckID = bundle.getInt( CALLBACK );
m_posButton = bundle.getInt( POSBUTTON );
m_prefsKey = bundle.getInt( PREFSKEY );
- m_words = bundle.getStringArray( WORDS );
- m_wordsLang = bundle.getInt( LANG );
- m_forceList = bundle.getBoolean( FORCELIST );
}
}
@@ -107,9 +100,6 @@ public class DlgDelegate {
outState.putInt( CALLBACK, m_cbckID );
outState.putInt( POSBUTTON, m_posButton );
outState.putInt( PREFSKEY, m_prefsKey );
- outState.putStringArray( WORDS, m_words );
- outState.putInt( LANG, m_wordsLang );
- outState.putBoolean( FORCELIST, m_forceList );
}
public Dialog onCreateDialog( int id )
@@ -134,15 +124,6 @@ public class DlgDelegate {
case DLG_DICTGONE:
dialog = createDictGoneDialog();
break;
- case DLG_LOOKUP:
- LookupView view = (LookupView)Utils.inflate( m_activity,
- R.layout.lookup );
- dialog = new AlertDialog.Builder( m_activity )
- .setView( view )
- .create();
- view.setDialog( dialog, DLG_LOOKUP );
- view.setWords( m_words, m_wordsLang, m_forceList );
- break;
}
return dialog;
}
@@ -259,11 +240,11 @@ public class DlgDelegate {
public void launchLookup( String[] words, int lang, boolean forceList )
{
- Assert.assertTrue( null != words && 0 < words.length );
- m_words = words;
- m_wordsLang = lang;
- m_forceList = forceList;
- m_activity.showDialog( DLG_LOOKUP );
+ Intent intent = new Intent( m_activity, LookupActivity.class );
+ intent.putExtra( LookupActivity.WORDS, words );
+ intent.putExtra( LookupActivity.LANG, lang );
+
+ m_activity.startActivity( intent );
}
public void startProgress( int id )
diff --git a/xwords4/android/XWords4/src/org/eehouse/android/xw4/LookupView.java b/xwords4/android/XWords4/src/org/eehouse/android/xw4/LookupActivity.java
similarity index 71%
rename from xwords4/android/XWords4/src/org/eehouse/android/xw4/LookupView.java
rename to xwords4/android/XWords4/src/org/eehouse/android/xw4/LookupActivity.java
index 1a1c37d75..ef5dd113c 100644
--- a/xwords4/android/XWords4/src/org/eehouse/android/xw4/LookupView.java
+++ b/xwords4/android/XWords4/src/org/eehouse/android/xw4/LookupActivity.java
@@ -20,9 +20,7 @@
package org.eehouse.android.xw4;
-import android.app.Dialog;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
@@ -32,19 +30,21 @@ import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.ListView;
import android.widget.TextView;
-import android.app.AlertDialog;
import java.util.ArrayList;
-import android.util.AttributeSet;
import junit.framework.Assert;
-public class LookupView extends LinearLayout
+public class LookupActivity extends XWListActivity
implements View.OnClickListener,
- AdapterView.OnItemClickListener,
- DialogInterface.OnDismissListener {
+ AdapterView.OnItemClickListener {
+
+ public static final String WORDS = "WORDS";
+ public static final String LANG = "LANG";
+ public static final String FORCELIST = "FORCELIST";
+ private static final String STATE = "STATE";
+ private static final String WORDINDEX = "WORDINDEX";
+ private static final String URLINDEX = "URLINDEX";
private static final int STATE_DONE = 0;
private static final int STATE_WORDS = 1;
@@ -55,55 +55,66 @@ public class LookupView extends LinearLayout
private static String[] s_lookupNames;
private static String[] s_lookupUrls;
private static ArrayAdapter s_urlsAdapter;
- private static final int LIST_LAYOUT = // android.R.layout.simple_list_item_1;
- android.R.layout.select_dialog_item;
- //R.layout.select_dialog_item;
+ private static final int LIST_LAYOUT = android.R.layout.simple_list_item_1;
+ // android.R.layout.select_dialog_item;
private static int s_lang = -1;
private String[] m_words;
private boolean m_forceList;
- private static int m_lang;
private int m_wordIndex = 0;
private int m_urlIndex = 0;
private int m_state;
private ArrayAdapter m_wordsAdapter;
private Button m_doneButton;
- private Dialog m_dialog;
- private Context m_context;
- private int m_dlgId;
- private ListView m_list;
+ private TextView m_summary;
- public LookupView( Context cx, AttributeSet as ) {
- super( cx, as );
- m_context = cx;
- }
-
- public void setWords( String[] words, int lang, boolean forceList )
+ @Override
+ protected void onCreate( Bundle savedInstanceState )
{
- m_words = words;
- m_forceList = forceList;
- setLang( lang );
+ super.onCreate( savedInstanceState );
+ requestWindowFeature( Window.FEATURE_NO_TITLE );
+ setContentView( R.layout.lookup );
+
+ Intent intent = getIntent();
+ m_words = intent.getStringArrayExtra( WORDS );
+ setLang( intent.getIntExtra( LANG, -1 ) );
+ m_forceList = intent.getBooleanExtra( FORCELIST, false );
m_state = STATE_DONE;
adjustState( 1 );
- m_wordsAdapter = new ArrayAdapter( m_context, LIST_LAYOUT,
+ m_wordsAdapter = new ArrayAdapter( this, LIST_LAYOUT,
m_words );
- m_list = (ListView)findViewById( R.id.lookup_list );
- m_list.setOnItemClickListener( this );
+ getListView().setOnItemClickListener( this );
m_doneButton = (Button)findViewById( R.id.button_done );
m_doneButton.setOnClickListener( this );
+ m_summary = (TextView)findViewById( R.id.summary );
+
switchState();
}
- public void setDialog( Dialog dialog, int id )
+ @Override
+ protected void onSaveInstanceState( Bundle outState )
{
- m_dialog = dialog;
- m_dlgId = id;
- m_dialog.setOnDismissListener( this );
+ super.onSaveInstanceState( outState );
+ outState.putInt( STATE, m_state );
+ outState.putInt( WORDINDEX, m_wordIndex );
+ outState.putInt( URLINDEX, m_urlIndex );
+ }
+
+ private void getBundledData( Bundle bundle )
+ {
+ if ( null == bundle ) {
+ m_state = STATE_DONE;
+ adjustState( 1 );
+ } else {
+ m_state = bundle.getInt( STATE );
+ m_wordIndex = bundle.getInt( WORDINDEX );
+ m_urlIndex = bundle.getInt( URLINDEX );
+ }
}
/* View.OnClickListener -- just the Done button */
@@ -126,12 +137,6 @@ public class LookupView extends LinearLayout
switchState( 1 );
}
- /* DialogInterface.OnDismissListener interface */
- public void onDismiss( DialogInterface di )
- {
- m_dialog.getOwnerActivity().removeDialog( m_dlgId );
- }
-
private void adjustState( int incr )
{
m_state += incr;
@@ -160,17 +165,17 @@ public class LookupView extends LinearLayout
{
switch( m_state ) {
case STATE_DONE:
- m_dialog.dismiss();
+ finish();
break;
case STATE_WORDS:
- m_list.setAdapter( m_wordsAdapter );
+ getListView().setAdapter( m_wordsAdapter );
setSummary( R.string.title_lookup );
m_doneButton.setText( R.string.button_done );
break;
case STATE_URLS:
- m_list.setAdapter( s_urlsAdapter );
+ getListView().setAdapter( s_urlsAdapter );
setSummary( m_words[m_wordIndex] );
- String txt = Utils.format( m_context, R.string.button_donef,
+ String txt = Utils.format( this, R.string.button_donef,
m_words[m_wordIndex] );
m_doneButton.setText( txt );
break;
@@ -182,7 +187,7 @@ public class LookupView extends LinearLayout
Assert.fail();
break;
}
- } // adjustState
+ } // switchState
private void lookupWord( String word, String fmt )
{
@@ -196,14 +201,14 @@ public class LookupView extends LinearLayout
intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
try {
- m_context.startActivity( intent );
+ startActivity( intent );
} catch ( android.content.ActivityNotFoundException anfe ) {
DbgUtils.logf( "%s", anfe.toString() );
}
}
} // lookupWord
- public void setLang( int lang )
+ private void setLang( int lang )
{
if ( null == s_langCodes ) {
s_langCodes = getResources().getStringArray( R.array.language_codes );
@@ -223,20 +228,20 @@ public class LookupView extends LinearLayout
}
s_lookupNames = tmpNames.toArray( new String[tmpNames.size()] );
s_lookupUrls = tmpUrls.toArray( new String[tmpUrls.size()] );
- s_urlsAdapter = new ArrayAdapter( m_context, LIST_LAYOUT,
+ s_urlsAdapter = new ArrayAdapter( this, LIST_LAYOUT,
s_lookupNames );
s_lang = lang;
- } // initLookup
+ }
}
private void setSummary( int id )
{
- m_dialog.setTitle( m_context.getString( id ) );
+ m_summary.setText( getString( id ) );
}
private void setSummary( String word )
{
- String title = Utils.format( m_context, R.string.pick_url_titlef, word );
- m_dialog.setTitle( title );
+ String title = Utils.format( this, R.string.pick_url_titlef, word );
+ m_summary.setText( title );
}
}
diff --git a/xwords4/common/board.c b/xwords4/common/board.c
index 5e88833bc..9cc9ea2be 100644
--- a/xwords4/common/board.c
+++ b/xwords4/common/board.c
@@ -288,7 +288,7 @@ board_makeFromStream( MPFORMAL XWStreamCtxt* stream, ModelCtxt* model,
} /* board_makeFromStream */
void
-board_writeToStream( BoardCtxt* board, XWStreamCtxt* stream )
+board_writeToStream( const BoardCtxt* board, XWStreamCtxt* stream )
{
XP_U16 nPlayers, ii;
XP_U16 nColsNBits;
@@ -319,8 +319,8 @@ board_writeToStream( BoardCtxt* board, XWStreamCtxt* stream )
nPlayers = board->gi->nPlayers;
for ( ii = 0; ii < nPlayers; ++ii ) {
- PerTurnInfo* pti = &board->pti[ii];
- BoardArrow* arrow = &pti->boardArrow;
+ const PerTurnInfo* pti = &board->pti[ii];
+ const BoardArrow* arrow = &pti->boardArrow;
stream_putBits( stream, nColsNBits, arrow->col );
stream_putBits( stream, nColsNBits, arrow->row );
stream_putBits( stream, 1, arrow->vert );
diff --git a/xwords4/common/board.h b/xwords4/common/board.h
index 2f37e7416..10de9e0a1 100644
--- a/xwords4/common/board.h
+++ b/xwords4/common/board.h
@@ -67,7 +67,7 @@ BoardCtxt* board_makeFromStream( MPFORMAL XWStreamCtxt* stream,
void board_destroy( BoardCtxt* board );
-void board_writeToStream( BoardCtxt* board, XWStreamCtxt* stream );
+void board_writeToStream( const BoardCtxt* board, XWStreamCtxt* stream );
void board_setPos( BoardCtxt* board, XP_U16 left, XP_U16 top,
XP_U16 width, XP_U16 height, XP_U16 maxCellSize,
diff --git a/xwords4/common/dbgutil.c b/xwords4/common/dbgutil.c
index 5ee32c935..78a3bb016 100644
--- a/xwords4/common/dbgutil.c
+++ b/xwords4/common/dbgutil.c
@@ -1,6 +1,7 @@
-/* -*-mode: C; fill-column: 78; c-basic-offset: 4; -*- */
+/* -*- compile-command: "cd ../linux && make -j3 MEMDEBUG=TRUE"; -*- */
/*
- * Copyright 2006 by Eric House (xwords@eehouse.org). All rights reserved.
+ * Copyright 2006-2012 by Eric House (xwords@eehouse.org). All rights
+ * reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -73,3 +74,22 @@ BoardObjectType_2str( BoardObjectType obj )
#endif /* ENABLE_LOGGING */
+#ifdef DEBUG
+void
+dbg_logstream( XWStreamCtxt* stream, const char* func, int line )
+{
+ if ( !!stream ) {
+ XWStreamPos pos = stream_getPos( stream, POS_READ );
+ XP_U16 len = stream_getSize( stream );
+ XP_UCHAR buf[len+1];
+ stream_getBytes( stream, buf, len );
+ buf[len] = '\0';
+ XP_LOGF( "stream %p at pos %lx from line %d of func %s: \"%s\"", stream,
+ pos, line, func, buf );
+ (void)stream_setPos( stream, POS_READ, pos );
+ } else {
+ XP_LOGF( "stream from line %d of func %s is null",
+ line, func );
+ }
+}
+#endif
diff --git a/xwords4/common/dbgutil.h b/xwords4/common/dbgutil.h
index fae2486bd..99e815d98 100644
--- a/xwords4/common/dbgutil.h
+++ b/xwords4/common/dbgutil.h
@@ -26,4 +26,12 @@ const char* XP_Key_2str( XP_Key key );
const char* DrawFocusState_2str( DrawFocusState dfs );
const char* BoardObjectType_2str( BoardObjectType dfs );
+# ifdef DEBUG
+void dbg_logstream( XWStreamCtxt* stream, const char* func, int line );
+# define XP_LOGSTREAM( s ) \
+ dbg_logstream( s, __func__, __LINE__ )
+# else
+# define XP_LOGSTREAM( s )
+# endif
+
#endif
diff --git a/xwords4/common/memstream.c b/xwords4/common/memstream.c
index 569a04395..52f310874 100644
--- a/xwords4/common/memstream.c
+++ b/xwords4/common/memstream.c
@@ -292,8 +292,8 @@ mem_stream_putBits( XWStreamCtxt* p_sctx, XP_U16 nBits, XP_U32 data
} /* mem_stream_putBits */
static void
-mem_stream_copyFromStream( XWStreamCtxt* p_sctx, XWStreamCtxt* src,
- XP_U16 nBytes )
+mem_stream_getFromStream( XWStreamCtxt* p_sctx, XWStreamCtxt* src,
+ XP_U16 nBytes )
{
while ( nBytes > 0 ) {
XP_U8 buf[256];
@@ -305,7 +305,7 @@ mem_stream_copyFromStream( XWStreamCtxt* p_sctx, XWStreamCtxt* src,
stream_putBytes( p_sctx, buf, len );
nBytes -= len;
}
-} /* mem_stream_copyFromStream */
+} /* mem_stream_getFromStream */
static void
mem_stream_open( XWStreamCtxt* p_sctx )
@@ -333,7 +333,7 @@ mem_stream_close( XWStreamCtxt* p_sctx )
static XP_U16
mem_stream_getSize( const XWStreamCtxt* p_sctx )
{
- MemStreamCtxt* stream = (MemStreamCtxt*)p_sctx;
+ const MemStreamCtxt* stream = (const MemStreamCtxt*)p_sctx;
XP_U16 size = stream->nBytesWritten - stream->curReadPos;
return size;
} /* mem_stream_getSize */
@@ -341,14 +341,14 @@ mem_stream_getSize( const XWStreamCtxt* p_sctx )
static const XP_U8*
mem_stream_getPtr( const XWStreamCtxt* p_sctx )
{
- MemStreamCtxt* stream = (MemStreamCtxt*)p_sctx;
+ const MemStreamCtxt* stream = (const MemStreamCtxt*)p_sctx;
return stream->buf;
} /* mem_stream_getPtr */
static XP_PlayerAddr
-mem_stream_getAddress( XWStreamCtxt* p_sctx )
+mem_stream_getAddress( const XWStreamCtxt* p_sctx )
{
- MemStreamCtxt* stream = (MemStreamCtxt*)p_sctx;
+ const MemStreamCtxt* stream = (const MemStreamCtxt*)p_sctx;
return stream->channelNo;
} /* mem_stream_getAddress */
@@ -357,7 +357,7 @@ mem_stream_setAddress( XWStreamCtxt* p_sctx, XP_PlayerAddr channelNo )
{
MemStreamCtxt* stream = (MemStreamCtxt*)p_sctx;
stream->channelNo = channelNo;
-} /* mem_stream_getAddress */
+} /* mem_stream_setAddress */
static void
mem_stream_setVersion( XWStreamCtxt* p_sctx, XP_U16 vers )
@@ -367,9 +367,9 @@ mem_stream_setVersion( XWStreamCtxt* p_sctx, XP_U16 vers )
} /* mem_stream_setVersion */
static XP_U16
-mem_stream_getVersion( XWStreamCtxt* p_sctx )
+mem_stream_getVersion( const XWStreamCtxt* p_sctx )
{
- MemStreamCtxt* stream = (MemStreamCtxt*)p_sctx;
+ const MemStreamCtxt* stream = (const MemStreamCtxt*)p_sctx;
return stream->version;
} /* mem_stream_getVersion */
@@ -381,10 +381,10 @@ mem_stream_setOnCloseProc( XWStreamCtxt* p_sctx, MemStreamCloseCallback proc )
}
static XWStreamPos
-mem_stream_getPos( XWStreamCtxt* p_sctx, PosWhich which )
+mem_stream_getPos( const XWStreamCtxt* p_sctx, PosWhich which )
{
XWStreamPos result;
- MemStreamCtxt* stream = (MemStreamCtxt*)p_sctx;
+ const MemStreamCtxt* stream = (const MemStreamCtxt*)p_sctx;
if ( which == POS_WRITE ) {
result = (stream->curWritePos << 3) | stream->nWriteBits;
@@ -396,8 +396,9 @@ mem_stream_getPos( XWStreamCtxt* p_sctx, PosWhich which )
} /* mem_stream_getPos */
static XWStreamPos
-mem_stream_setPos( XWStreamCtxt* p_sctx, XWStreamPos newpos, PosWhich which )
+mem_stream_setPos( XWStreamCtxt* p_sctx, PosWhich which, XWStreamPos newpos )
{
+ XP_ASSERT( END_OF_STREAM != newpos ); /* not handling this yet */
MemStreamCtxt* stream = (MemStreamCtxt*)p_sctx;
XWStreamPos oldPos = mem_stream_getPos( p_sctx, which );
@@ -448,7 +449,7 @@ make_vtable( MemStreamCtxt* stream )
SET_VTABLE_ENTRY( vtable, stream_putU32, mem );
SET_VTABLE_ENTRY( vtable, stream_putBits, mem );
- SET_VTABLE_ENTRY( vtable, stream_copyFromStream, mem );
+ SET_VTABLE_ENTRY( vtable, stream_getFromStream, mem );
SET_VTABLE_ENTRY( vtable, stream_setPos, mem );
SET_VTABLE_ENTRY( vtable, stream_getPos, mem );
diff --git a/xwords4/common/model.c b/xwords4/common/model.c
index 0f5042584..cad333134 100644
--- a/xwords4/common/model.c
+++ b/xwords4/common/model.c
@@ -74,7 +74,7 @@ static void setPendingCounts( ModelCtxt* model, XP_S16 turn );
static void loadPlayerCtxt( const ModelCtxt* model, XWStreamCtxt* stream,
XP_U16 version, PlayerCtxt* pc );
static void writePlayerCtxt( const ModelCtxt* model, XWStreamCtxt* stream,
- PlayerCtxt* pc );
+ const PlayerCtxt* pc );
static XP_U16 model_getRecentPassCount( ModelCtxt* model );
static XP_Bool recordWord( const XP_UCHAR* word, XP_Bool isLegal,
#ifdef XWFEATURE_BOARDWORDS
@@ -179,7 +179,7 @@ model_makeFromStream( MPFORMAL XWStreamCtxt* stream, DictionaryCtxt* dict,
} /* model_makeFromStream */
void
-model_writeToStream( ModelCtxt* model, XWStreamCtxt* stream )
+model_writeToStream( const ModelCtxt* model, XWStreamCtxt* stream )
{
XP_U16 ii;
#ifdef STREAM_VERS_BIGBOARD
@@ -2376,10 +2376,11 @@ loadPlayerCtxt( const ModelCtxt* model, XWStreamCtxt* stream, XP_U16 version,
} /* loadPlayerCtxt */
static void
-writePlayerCtxt( const ModelCtxt* model, XWStreamCtxt* stream, PlayerCtxt* pc )
+writePlayerCtxt( const ModelCtxt* model, XWStreamCtxt* stream,
+ const PlayerCtxt* pc )
{
XP_U16 nTiles;
- PendingTile* pt;
+ const PendingTile* pt;
XP_U16 nColsNBits;
#ifdef STREAM_VERS_BIGBOARD
nColsNBits = 16 <= model_numCols( model ) ? NUMCOLS_NBITS_5
diff --git a/xwords4/common/model.h b/xwords4/common/model.h
index 798de209c..9f02f2c77 100644
--- a/xwords4/common/model.h
+++ b/xwords4/common/model.h
@@ -106,7 +106,7 @@ ModelCtxt* model_makeFromStream( MPFORMAL XWStreamCtxt* stream,
DictionaryCtxt* dict, const PlayerDicts* dicts,
XW_UtilCtxt* util );
-void model_writeToStream( ModelCtxt* model, XWStreamCtxt* stream );
+void model_writeToStream( const ModelCtxt* model, XWStreamCtxt* stream );
#ifdef TEXT_MODEL
void model_writeToTextStream( const ModelCtxt* model, XWStreamCtxt* stream );
diff --git a/xwords4/common/movestak.c b/xwords4/common/movestak.c
index c7333cb25..51b999f37 100644
--- a/xwords4/common/movestak.c
+++ b/xwords4/common/movestak.c
@@ -100,7 +100,7 @@ stack_loadFromStream( StackCtxt* stack, XWStreamCtxt* stream )
NULL, 0,
(MemStreamCloseCallback)NULL );
- stream_copyFromStream( stack->data, stream, nBytes );
+ stream_getFromStream( stack->data, stream, nBytes );
} else {
XP_ASSERT( stack->nEntries == 0 );
XP_ASSERT( stack->top == 0 );
@@ -115,7 +115,7 @@ stack_writeToStream( const StackCtxt* stack, XWStreamCtxt* stream )
XWStreamPos oldPos = START_OF_STREAM;
if ( !!data ) {
- oldPos = stream_setPos( data, START_OF_STREAM, POS_READ );
+ oldPos = stream_setPos( data, POS_READ, START_OF_STREAM );
nBytes = stream_getSize( data );
} else {
nBytes = 0;
@@ -128,13 +128,9 @@ stack_writeToStream( const StackCtxt* stack, XWStreamCtxt* stream )
stream_putU16( stream, stack->nEntries );
stream_putU32( stream, stack->top );
- stream_setPos( data, START_OF_STREAM, POS_READ );
- stream_copyFromStream( stream, data, nBytes );
- }
-
- if ( !!data ) {
+ stream_getFromStream( stream, data, nBytes );
/* in case it'll be used further */
- (void)stream_setPos( data, oldPos, POS_READ );
+ (void)stream_setPos( data, POS_READ, oldPos );
}
} /* stack_writeToStream */
@@ -167,7 +163,7 @@ pushEntry( StackCtxt* stack, const StackEntry* entry )
stack->data = stream;
}
- oldLoc = stream_setPos( stream, stack->top, POS_WRITE );
+ oldLoc = stream_setPos( stream, POS_WRITE, stack->top );
stream_putBits( stream, 2, entry->moveType );
stream_putBits( stream, 2, entry->playerNum );
@@ -211,7 +207,7 @@ pushEntry( StackCtxt* stack, const StackEntry* entry )
++stack->nEntries;
stack->highWaterMark = stack->nEntries;
- stack->top = stream_setPos( stream, oldLoc, POS_WRITE );
+ stack->top = stream_setPos( stream, POS_WRITE, oldLoc );
} /* pushEntry */
static void
@@ -280,7 +276,7 @@ stack_addMove( StackCtxt* stack, XP_U16 turn, const MoveInfo* moveInfo,
} /* stack_addMove */
void
-stack_addPhony( StackCtxt* stack, XP_U16 turn, MoveInfo* moveInfo )
+stack_addPhony( StackCtxt* stack, XP_U16 turn, const MoveInfo* moveInfo )
{
StackEntry move;
@@ -327,7 +323,7 @@ setCacheReadyFor( StackCtxt* stack, XP_U16 n )
StackEntry dummy;
XP_U16 i;
- stream_setPos( stack->data, START_OF_STREAM, POS_READ );
+ stream_setPos( stack->data, POS_READ, START_OF_STREAM );
for ( i = 0; i < n; ++i ) {
readEntry( stack, &dummy );
}
@@ -339,34 +335,34 @@ setCacheReadyFor( StackCtxt* stack, XP_U16 n )
} /* setCacheReadyFor */
XP_U16
-stack_getNEntries( StackCtxt* stack )
+stack_getNEntries( const StackCtxt* stack )
{
return stack->nEntries;
} /* stack_getNEntries */
XP_Bool
-stack_getNthEntry( StackCtxt* stack, XP_U16 n, StackEntry* entry )
+stack_getNthEntry( StackCtxt* stack, XP_U16 nn, StackEntry* entry )
{
XP_Bool found;
- if ( n >= stack->nEntries ) {
+ if ( nn >= stack->nEntries ) {
found = XP_FALSE;
- } else if ( stack->cacheNext != n ) {
+ } else if ( stack->cacheNext != nn ) {
XP_ASSERT( !!stack->data );
- found = setCacheReadyFor( stack, n );
- XP_ASSERT( stack->cacheNext == n );
+ found = setCacheReadyFor( stack, nn );
+ XP_ASSERT( stack->cacheNext == nn );
} else {
found = XP_TRUE;
}
if ( found ) {
- XWStreamPos oldPos = stream_setPos( stack->data, stack->cachedPos,
- POS_READ );
+ XWStreamPos oldPos = stream_setPos( stack->data, POS_READ,
+ stack->cachedPos );
readEntry( stack, entry );
- entry->moveNum = (XP_U8)n;
+ entry->moveNum = (XP_U8)nn;
- stack->cachedPos = stream_setPos( stack->data, oldPos, POS_READ );
+ stack->cachedPos = stream_setPos( stack->data, POS_READ, oldPos );
++stack->cacheNext;
}
diff --git a/xwords4/common/movestak.h b/xwords4/common/movestak.h
index c696cfd5e..6048c5d41 100644
--- a/xwords4/common/movestak.h
+++ b/xwords4/common/movestak.h
@@ -77,14 +77,14 @@ StackCtxt* stack_copy( const StackCtxt* stack );
void stack_addMove( StackCtxt* stack, XP_U16 turn, const MoveInfo* moveInfo,
const TrayTileSet* newTiles );
-void stack_addPhony( StackCtxt* stack, XP_U16 turn, MoveInfo* moveInfo );
+void stack_addPhony( StackCtxt* stack, XP_U16 turn, const MoveInfo* moveInfo );
void stack_addTrade( StackCtxt* stack, XP_U16 turn,
const TrayTileSet* oldTiles,
const TrayTileSet* newTiles );
void stack_addAssign( StackCtxt* stack, XP_U16 turn,
const TrayTileSet* tiles );
-XP_U16 stack_getNEntries( StackCtxt* stack );
+XP_U16 stack_getNEntries( const StackCtxt* stack );
XP_Bool stack_getNthEntry( StackCtxt* stack, XP_U16 n, StackEntry* entry );
diff --git a/xwords4/common/server.c b/xwords4/common/server.c
index 21301a966..c2c04f175 100644
--- a/xwords4/common/server.c
+++ b/xwords4/common/server.c
@@ -305,7 +305,7 @@ getNV( XWStreamCtxt* stream, ServerNonvolatiles* nv, XP_U16 nPlayers )
} /* getNV */
static void
-putNV( XWStreamCtxt* stream, ServerNonvolatiles* nv, XP_U16 nPlayers )
+putNV( XWStreamCtxt* stream, const ServerNonvolatiles* nv, XP_U16 nPlayers )
{
XP_U16 ii;
@@ -339,7 +339,7 @@ readStreamIf( ServerCtxt* server, XWStreamCtxt* in )
XP_U16 len = stream_getU16( in );
if ( 0 < len ) {
result = mkServerStream( server );
- stream_copyFromStream( result, in, len );
+ stream_getFromStream( result, in, len );
}
return result;
}
@@ -350,7 +350,9 @@ writeStreamIf( XWStreamCtxt* dest, XWStreamCtxt* src )
XP_U16 len = !!src ? stream_getSize( src ) : 0;
stream_putU16( dest, len );
if ( 0 < len ) {
- stream_copyFromStream( dest, src, len );
+ XWStreamPos pos = stream_getPos( src, POS_READ );
+ stream_getFromStream( dest, src, len );
+ (void)stream_setPos( src, POS_READ, pos );
}
}
@@ -402,7 +404,7 @@ server_makeFromStream( MPFORMAL XWStreamCtxt* stream, ModelCtxt* model,
} /* server_makeFromStream */
void
-server_writeToStream( ServerCtxt* server, XWStreamCtxt* stream )
+server_writeToStream( const ServerCtxt* server, XWStreamCtxt* stream )
{
XP_U16 i;
XP_U16 nPlayers = server->vol.gi->nPlayers;
@@ -415,7 +417,7 @@ server_writeToStream( ServerCtxt* server, XWStreamCtxt* stream )
}
for ( i = 0; i < nPlayers; ++i ) {
- ServerPlayer* player = &server->players[i];
+ const ServerPlayer* player = &server->players[i];
stream_putU8( stream, player->deviceIndex );
@@ -433,7 +435,6 @@ server_writeToStream( ServerCtxt* server, XWStreamCtxt* stream )
writeStreamIf( stream, server->nv.prevMoveStream );
writeStreamIf( stream, server->nv.prevWordsStream );
-
} /* server_writeToStream */
static void
diff --git a/xwords4/common/server.h b/xwords4/common/server.h
index 5851a5933..4a90a1379 100644
--- a/xwords4/common/server.h
+++ b/xwords4/common/server.h
@@ -62,7 +62,7 @@ ServerCtxt* server_makeFromStream( MPFORMAL XWStreamCtxt* stream,
ModelCtxt* model, CommsCtxt* comms,
XW_UtilCtxt* util, XP_U16 nPlayers );
-void server_writeToStream( ServerCtxt* server, XWStreamCtxt* stream );
+void server_writeToStream( const ServerCtxt* server, XWStreamCtxt* stream );
void server_reset( ServerCtxt* server, CommsCtxt* comms );
void server_destroy( ServerCtxt* server );
diff --git a/xwords4/common/xwstream.h b/xwords4/common/xwstream.h
index 32a72f8f5..e3652fe80 100644
--- a/xwords4/common/xwstream.h
+++ b/xwords4/common/xwstream.h
@@ -26,8 +26,8 @@
#define START_OF_STREAM 0
#define END_OF_STREAM -1
-
typedef XP_U32 XWStreamPos; /* low 3 bits are bit offset; rest byte offset */
+
enum { POS_READ, POS_WRITE };
typedef XP_U8 PosWhich;
@@ -58,12 +58,12 @@ typedef struct StreamCtxVTable {
void (*m_stream_putBits)( XWStreamCtxt* dctx, XP_U16 nBits, XP_U32 bits
DBG_LINE_FILE_FORMAL );
- void (*m_stream_copyFromStream)( XWStreamCtxt* dctx, XWStreamCtxt* src,
+ void (*m_stream_getFromStream)( XWStreamCtxt* dctx, XWStreamCtxt* src,
XP_U16 nBytes );
- XWStreamPos (*m_stream_getPos)( XWStreamCtxt* dctx, PosWhich which );
- XWStreamPos (*m_stream_setPos)( XWStreamCtxt* dctx, XWStreamPos newpos,
- PosWhich which );
+ XWStreamPos (*m_stream_getPos)( const XWStreamCtxt* dctx, PosWhich which );
+ XWStreamPos (*m_stream_setPos)( XWStreamCtxt* dctx, PosWhich which,
+ XWStreamPos newpos );
void (*m_stream_open)( XWStreamCtxt* dctx );
void (*m_stream_close)( XWStreamCtxt* dctx );
@@ -75,11 +75,11 @@ typedef struct StreamCtxVTable {
/* void (*m_stream_makeReturnAddr)( XWStreamCtxt* dctx, XP_PlayerAddr* addr, */
/* XP_U16* addrLen ); */
- XP_PlayerAddr (*m_stream_getAddress)( XWStreamCtxt* dctx );
+ XP_PlayerAddr (*m_stream_getAddress)( const XWStreamCtxt* dctx );
void (*m_stream_setAddress)( XWStreamCtxt* dctx, XP_PlayerAddr channelNo );
void (*m_stream_setVersion)( XWStreamCtxt* dctx, XP_U16 vers );
- XP_U16 (*m_stream_getVersion)( XWStreamCtxt* dctx );
+ XP_U16 (*m_stream_getVersion)( const XWStreamCtxt* dctx );
void (*m_stream_setOnCloseProc)( XWStreamCtxt* dctx,
MemStreamCloseCallback proc );
@@ -127,8 +127,8 @@ struct XWStreamCtxt {
#define stream_putBits(sc, n, b) \
(sc)->vtable->m_stream_putBits((sc), (n), (b) DBG_LINE_FILE_PARM )
-#define stream_copyFromStream( sc, src, nb ) \
- (sc)->vtable->m_stream_copyFromStream((sc), (src), (nb))
+#define stream_getFromStream( sc, src, nb ) \
+ (sc)->vtable->m_stream_getFromStream((sc), (src), (nb))
#define stream_getPos(sc, w) \
(sc)->vtable->m_stream_getPos((sc), (w))
diff --git a/xwords4/linux/Makefile b/xwords4/linux/Makefile
index 30e748606..bd4c82804 100644
--- a/xwords4/linux/Makefile
+++ b/xwords4/linux/Makefile
@@ -182,7 +182,11 @@ OBJ = \
$(PLATFORM)/linuxutl.o \
$(CURSES_OBJS) $(GTK_OBJS) $(MAIN_OBJS)
-LIBS = -lm -lmcheck -luuid $(GPROFFLAG)
+LIBS = -lm -luuid $(GPROFFLAG)
+# Turn this off for now. I apparently have a memory problem, but it
+# doesn't make the app unusable for testing while crash on boot does.
+# LIBS += -lmcheck
+
ifdef BLUETOOTH
LIBS += -lbluetooth
endif
diff --git a/xwords4/linux/gtkmain.c b/xwords4/linux/gtkmain.c
index db775bf57..06b330a1e 100644
--- a/xwords4/linux/gtkmain.c
+++ b/xwords4/linux/gtkmain.c
@@ -1896,6 +1896,7 @@ makeVerticalBar( GtkAppGlobals* globals, GtkWidget* XP_UNUSED(window) )
gtk_box_pack_start( GTK_BOX(vbox), button, FALSE, TRUE, 0 );
button = makeShowButtonFromBitmap( globals, "../done.xpm", "-",
G_CALLBACK(handle_zoomout_button) );
+ globals->zoomout_button = button;
gtk_box_pack_start( GTK_BOX(vbox), button, FALSE, TRUE, 0 );
#ifdef XWFEATURE_CHAT
button = makeShowButtonFromBitmap( globals, "", "chat",