mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-16 15:41:16 +01:00
add new game_changeDict() and enough gtk code to test it.
This commit is contained in:
parent
521d7042be
commit
c69dbda36f
10 changed files with 229 additions and 6 deletions
|
@ -44,6 +44,9 @@ assertUtilOK( XW_UtilCtxt* util )
|
||||||
# define assertUtilOK(u)
|
# define assertUtilOK(u)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void gi_setDict( MPFORMAL CurGameInfo* gi, const DictionaryCtxt* dict );
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
checkServerRole( CurGameInfo* gi, XP_U16* nPlayersHere, XP_U16* nPlayersTotal )
|
checkServerRole( CurGameInfo* gi, XP_U16* nPlayersHere, XP_U16* nPlayersTotal )
|
||||||
{
|
{
|
||||||
|
@ -183,6 +186,15 @@ game_reset( MPFORMAL XWGame* game, CurGameInfo* gi,
|
||||||
board_prefsChanged( game->board, cp );
|
board_prefsChanged( game->board, cp );
|
||||||
} /* game_reset */
|
} /* game_reset */
|
||||||
|
|
||||||
|
void
|
||||||
|
game_changeDict( MPFORMAL XWGame* game, CurGameInfo* gi, DictionaryCtxt* dict )
|
||||||
|
{
|
||||||
|
model_destroyDicts( game->model );
|
||||||
|
model_setDictionary( game->model, dict );
|
||||||
|
gi_setDict( MPPARM(mpool) gi, dict );
|
||||||
|
server_resetEngines( game->server );
|
||||||
|
}
|
||||||
|
|
||||||
XP_Bool
|
XP_Bool
|
||||||
game_makeFromStream( MPFORMAL XWStreamCtxt* stream, XWGame* game,
|
game_makeFromStream( MPFORMAL XWStreamCtxt* stream, XWGame* game,
|
||||||
CurGameInfo* gi, DictionaryCtxt* dict,
|
CurGameInfo* gi, DictionaryCtxt* dict,
|
||||||
|
@ -196,7 +208,7 @@ game_makeFromStream( MPFORMAL XWStreamCtxt* stream, XWGame* game,
|
||||||
XP_Bool hasComms;
|
XP_Bool hasComms;
|
||||||
#endif
|
#endif
|
||||||
strVersion = stream_getU8( stream );
|
strVersion = stream_getU8( stream );
|
||||||
XP_DEBUGF( "%s: strVersion = 0x%x", __func__, (XP_U16)strVersion );
|
XP_DEBUGF( "%s: strVersion = 0x%x", __func__, (XP_U16)strVersion );
|
||||||
|
|
||||||
if ( strVersion > CUR_STREAM_VERS ) {
|
if ( strVersion > CUR_STREAM_VERS ) {
|
||||||
XP_LOGF( "%s: aborting; stream version too new!", __func__ );
|
XP_LOGF( "%s: aborting; stream version too new!", __func__ );
|
||||||
|
@ -560,6 +572,18 @@ gi_writeToStream( XWStreamCtxt* stream, const CurGameInfo* gi )
|
||||||
}
|
}
|
||||||
} /* gi_writeToStream */
|
} /* gi_writeToStream */
|
||||||
|
|
||||||
|
static void
|
||||||
|
gi_setDict( MPFORMAL CurGameInfo* gi, const DictionaryCtxt* dict )
|
||||||
|
{
|
||||||
|
XP_U16 ii;
|
||||||
|
const XP_UCHAR* name = dict_getName( dict );
|
||||||
|
replaceStringIfDifferent( mpool, &gi->dictName, name );
|
||||||
|
for ( ii = 0; ii < gi->nPlayers; ++ii ) {
|
||||||
|
const LocalPlayer* pl = &gi->players[ii];
|
||||||
|
XP_FREEP( mpool, &pl->dictName );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
XP_Bool
|
XP_Bool
|
||||||
player_hasPasswd( LocalPlayer* player )
|
player_hasPasswd( LocalPlayer* player )
|
||||||
{
|
{
|
||||||
|
|
|
@ -95,6 +95,8 @@ void game_makeNewGame( MPFORMAL XWGame* game, CurGameInfo* gi,
|
||||||
);
|
);
|
||||||
void game_reset( MPFORMAL XWGame* game, CurGameInfo* gi, XW_UtilCtxt* util,
|
void game_reset( MPFORMAL XWGame* game, CurGameInfo* gi, XW_UtilCtxt* util,
|
||||||
CommonPrefs* cp, const TransportProcs* procs );
|
CommonPrefs* cp, const TransportProcs* procs );
|
||||||
|
void game_changeDict( MPFORMAL XWGame* game, CurGameInfo* gi,
|
||||||
|
DictionaryCtxt* dict );
|
||||||
|
|
||||||
XP_Bool game_makeFromStream( MPFORMAL XWStreamCtxt* stream, XWGame* game,
|
XP_Bool game_makeFromStream( MPFORMAL XWStreamCtxt* stream, XWGame* game,
|
||||||
CurGameInfo* gi, DictionaryCtxt* dict,
|
CurGameInfo* gi, DictionaryCtxt* dict,
|
||||||
|
|
|
@ -1581,6 +1581,15 @@ server_getEngineFor( ServerCtxt* server, XP_U16 playerNum )
|
||||||
return engine;
|
return engine;
|
||||||
} /* server_getEngineFor */
|
} /* server_getEngineFor */
|
||||||
|
|
||||||
|
void
|
||||||
|
server_resetEngines( ServerCtxt* server )
|
||||||
|
{
|
||||||
|
XP_U16 nPlayers = server->vol.gi->nPlayers;
|
||||||
|
while ( 0 < nPlayers-- ) {
|
||||||
|
server_resetEngine( server, nPlayers );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
server_resetEngine( ServerCtxt* server, XP_U16 playerNum )
|
server_resetEngine( ServerCtxt* server, XP_U16 playerNum )
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,6 +83,7 @@ void server_setGameOverListener( ServerCtxt* server, GameOverListener gol,
|
||||||
|
|
||||||
EngineCtxt* server_getEngineFor( ServerCtxt* server, XP_U16 playerNum );
|
EngineCtxt* server_getEngineFor( ServerCtxt* server, XP_U16 playerNum );
|
||||||
void server_resetEngine( ServerCtxt* server, XP_U16 playerNum );
|
void server_resetEngine( ServerCtxt* server, XP_U16 playerNum );
|
||||||
|
void server_resetEngines( ServerCtxt* server );
|
||||||
|
|
||||||
XP_U16 server_secondsUsedBy( ServerCtxt* server, XP_U16 playerNum );
|
XP_U16 server_secondsUsedBy( ServerCtxt* server, XP_U16 playerNum );
|
||||||
|
|
||||||
|
|
|
@ -173,6 +173,7 @@ GTK_OBJS = \
|
||||||
$(BUILD_PLAT_DIR)/gtkconnsdlg.o \
|
$(BUILD_PLAT_DIR)/gtkconnsdlg.o \
|
||||||
$(BUILD_PLAT_DIR)/gtkutils.o \
|
$(BUILD_PLAT_DIR)/gtkutils.o \
|
||||||
$(BUILD_PLAT_DIR)/gtkntilesask.o \
|
$(BUILD_PLAT_DIR)/gtkntilesask.o \
|
||||||
|
$(BUILD_PLAT_DIR)/gtkaskdict.o \
|
||||||
$(BUILD_PLAT_DIR)/gtkchat.o
|
$(BUILD_PLAT_DIR)/gtkchat.o
|
||||||
endif
|
endif
|
||||||
ifdef DO_CURSES
|
ifdef DO_CURSES
|
||||||
|
|
116
xwords4/linux/gtkaskdict.c
Normal file
116
xwords4/linux/gtkaskdict.c
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
/* -*- compile-command: "make -j3 MEMDEBUG=TRUE"; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2000-2009 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
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
#ifdef PLATFORM_GTK
|
||||||
|
|
||||||
|
#include "gtkaskdict.h"
|
||||||
|
|
||||||
|
// adapted from code at: http://zetcode.com/tutorials/gtktutorial/gtktreeview/
|
||||||
|
|
||||||
|
// This thing really needs a cancel button
|
||||||
|
|
||||||
|
enum { LIST_ITEM, N_ITEMS };
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_list( GtkWidget* list )
|
||||||
|
{
|
||||||
|
GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
|
||||||
|
GtkTreeViewColumn* column =
|
||||||
|
gtk_tree_view_column_new_with_attributes( "Dict files", renderer,
|
||||||
|
"text", LIST_ITEM, NULL );
|
||||||
|
gtk_tree_view_append_column( GTK_TREE_VIEW(list), column );
|
||||||
|
GtkListStore* store = gtk_list_store_new( N_ITEMS, G_TYPE_STRING );
|
||||||
|
gtk_tree_view_set_model( GTK_TREE_VIEW(list), GTK_TREE_MODEL(store) );
|
||||||
|
g_object_unref( store );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_to_list( GtkWidget *list, const gchar *str )
|
||||||
|
{
|
||||||
|
GtkListStore *store =
|
||||||
|
GTK_LIST_STORE( gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
|
||||||
|
GtkTreeIter iter;
|
||||||
|
gtk_list_store_append( store, &iter );
|
||||||
|
gtk_list_store_set( store, &iter, LIST_ITEM, str, -1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_changed( GtkWidget *widget, gpointer buf )
|
||||||
|
{
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
if ( gtk_tree_selection_get_selected( GTK_TREE_SELECTION(widget),
|
||||||
|
&model, &iter ) ) {
|
||||||
|
gchar* value;
|
||||||
|
gtk_tree_model_get( model, &iter, LIST_ITEM, &value, -1 );
|
||||||
|
strcat( buf, value );
|
||||||
|
g_free( value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_clicked( GtkWidget* XP_UNUSED(widget), void* XP_UNUSED(closure) )
|
||||||
|
{
|
||||||
|
gtk_main_quit();
|
||||||
|
} /* on_clicked */
|
||||||
|
|
||||||
|
gchar*
|
||||||
|
gtkaskdict( GSList* dicts, gchar* buf, gint buflen )
|
||||||
|
{
|
||||||
|
gchar* result = NULL;
|
||||||
|
buf[0] = '\0';
|
||||||
|
XP_USE(buflen);
|
||||||
|
|
||||||
|
GtkWidget* dialog = gtk_dialog_new();
|
||||||
|
gtk_window_set_modal( GTK_WINDOW( dialog ), TRUE );
|
||||||
|
GtkWidget* list = gtk_tree_view_new();
|
||||||
|
gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->vbox), list, TRUE, TRUE, 5);
|
||||||
|
|
||||||
|
init_list( list );
|
||||||
|
|
||||||
|
/* GtkTreeSelection* selection = */
|
||||||
|
g_signal_connect( gtk_tree_view_get_selection( GTK_TREE_VIEW(list) ),
|
||||||
|
"changed", G_CALLBACK(on_changed), buf );
|
||||||
|
|
||||||
|
GSList* iter;
|
||||||
|
for ( iter = dicts; !!iter; iter = iter->next ) {
|
||||||
|
add_to_list( list, (gchar*)iter->data );
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkWidget* button = gtk_button_new_with_label( "Ok" );
|
||||||
|
g_signal_connect( GTK_OBJECT(button), "clicked",
|
||||||
|
G_CALLBACK(on_clicked), NULL );
|
||||||
|
gtk_box_pack_start( GTK_BOX(GTK_DIALOG(dialog)->vbox), button,
|
||||||
|
FALSE, TRUE, 0 );
|
||||||
|
// gtk_widget_show( button );
|
||||||
|
|
||||||
|
gtk_widget_show_all( dialog );
|
||||||
|
gtk_main();
|
||||||
|
gtk_widget_destroy( dialog );
|
||||||
|
|
||||||
|
if ( '\0' != buf[0] ) {
|
||||||
|
XP_ASSERT( buflen > XP_STRLEN(buf) );
|
||||||
|
result = buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_RETURNF( "%s", result );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* PLATFORM_GTK */
|
31
xwords4/linux/gtkaskdict.h
Normal file
31
xwords4/linux/gtkaskdict.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/* -*-mode: C; fill-column: 78; c-basic-offset: 4; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 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
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef PLATFORM_GTK
|
||||||
|
|
||||||
|
#ifndef _GTKASKDICT_H_
|
||||||
|
#define _GTKASKDICT_H_
|
||||||
|
|
||||||
|
#include "gtkmain.h"
|
||||||
|
|
||||||
|
gchar* gtkaskdict( GSList* dicts, gchar* buf, gint buflen );
|
||||||
|
|
||||||
|
#endif /* _GTKLETTERASK_H_ */
|
||||||
|
#endif /* PLATFORM_GTK */
|
|
@ -58,6 +58,7 @@
|
||||||
#include "gtkletterask.h"
|
#include "gtkletterask.h"
|
||||||
#include "gtkpasswdask.h"
|
#include "gtkpasswdask.h"
|
||||||
#include "gtkntilesask.h"
|
#include "gtkntilesask.h"
|
||||||
|
#include "gtkaskdict.h"
|
||||||
/* #include "undo.h" */
|
/* #include "undo.h" */
|
||||||
#include "gtkdraw.h"
|
#include "gtkdraw.h"
|
||||||
#include "memstream.h"
|
#include "memstream.h"
|
||||||
|
@ -861,10 +862,21 @@ save_game( GtkWidget* XP_UNUSED(widget), GtkAppGlobals* XP_UNUSED(globals) )
|
||||||
} /* save_game */
|
} /* save_game */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
load_dictionary( GtkWidget* XP_UNUSED(widget),
|
change_dictionary( GtkWidget* XP_UNUSED(widget), GtkAppGlobals* globals )
|
||||||
GtkAppGlobals* XP_UNUSED(globals) )
|
|
||||||
{
|
{
|
||||||
} /* load_dictionary */
|
LaunchParams* params = globals->cGlobals.params;
|
||||||
|
GSList* dicts = listDicts( params );
|
||||||
|
gchar buf[265];
|
||||||
|
gchar* name = gtkaskdict( dicts, buf, VSIZE(buf) );
|
||||||
|
if ( !!name ) {
|
||||||
|
DictionaryCtxt* dict =
|
||||||
|
linux_dictionary_make( MPPARM(params->util->mpool) params, name,
|
||||||
|
params->useMmap );
|
||||||
|
game_changeDict( MPPARM(params->util->mpool) &globals->cGlobals.game,
|
||||||
|
¶ms->gi, dict );
|
||||||
|
}
|
||||||
|
g_slist_free( dicts );
|
||||||
|
} /* change_dictionary */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_undo( GtkWidget* XP_UNUSED(widget), GtkAppGlobals* XP_UNUSED(globals) )
|
handle_undo( GtkWidget* XP_UNUSED(widget), GtkAppGlobals* XP_UNUSED(globals) )
|
||||||
|
@ -1009,8 +1021,8 @@ makeMenus( GtkAppGlobals* globals, int XP_UNUSED(argc),
|
||||||
(void)createAddItem( fileMenu, "Save game",
|
(void)createAddItem( fileMenu, "Save game",
|
||||||
GTK_SIGNAL_FUNC(save_game), globals );
|
GTK_SIGNAL_FUNC(save_game), globals );
|
||||||
|
|
||||||
(void)createAddItem( fileMenu, "Load dictionary",
|
(void)createAddItem( fileMenu, "Change dictionary",
|
||||||
GTK_SIGNAL_FUNC(load_dictionary), globals );
|
GTK_SIGNAL_FUNC(change_dictionary), globals );
|
||||||
|
|
||||||
(void)createAddItem( fileMenu, "Cancel trade",
|
(void)createAddItem( fileMenu, "Cancel trade",
|
||||||
GTK_SIGNAL_FUNC(handle_trade_cancel), globals );
|
GTK_SIGNAL_FUNC(handle_trade_cancel), globals );
|
||||||
|
|
|
@ -1462,6 +1462,32 @@ getDictPath( const LaunchParams *params, const char* name,
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GSList*
|
||||||
|
listDicts( const LaunchParams *params )
|
||||||
|
{
|
||||||
|
GSList* result = NULL;
|
||||||
|
GSList* iter = params->dictDirs;
|
||||||
|
while ( !!iter ) {
|
||||||
|
const gchar *path = iter->data;
|
||||||
|
GDir* dir = g_dir_open( path, 0, NULL );
|
||||||
|
if ( !!dir ) {
|
||||||
|
for ( ; ; ) {
|
||||||
|
const gchar* name = g_dir_read_name( dir );
|
||||||
|
if ( !name ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ( g_str_has_suffix( name, ".xwd" ) ) {
|
||||||
|
gint len = strlen(name) - 4;
|
||||||
|
result = g_slist_prepend( result, g_strndup( name, len ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_dir_close( dir );
|
||||||
|
}
|
||||||
|
iter = iter->next;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main( int argc, char** argv )
|
main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
|
|
|
@ -68,6 +68,7 @@ XWStreamCtxt* streamFromDB( CommonGlobals* cGlobals, void* closure );
|
||||||
void writeToFile( XWStreamCtxt* stream, void* closure );
|
void writeToFile( XWStreamCtxt* stream, void* closure );
|
||||||
XP_Bool getDictPath( const LaunchParams *params, const char* name,
|
XP_Bool getDictPath( const LaunchParams *params, const char* name,
|
||||||
char* result, int resultLen );
|
char* result, int resultLen );
|
||||||
|
GSList* listDicts( const LaunchParams *params );
|
||||||
void saveGame( CommonGlobals* cGlobals );
|
void saveGame( CommonGlobals* cGlobals );
|
||||||
|
|
||||||
int blocking_read( int fd, unsigned char* buf, int len );
|
int blocking_read( int fd, unsigned char* buf, int len );
|
||||||
|
|
Loading…
Reference in a new issue