diff options
author | Russ Allbery <rra@debian.org> | 2012-01-27 13:49:47 -0800 |
---|---|---|
committer | Russ Allbery <rra@debian.org> | 2012-01-27 13:49:47 -0800 |
commit | e1a65d98e1b8c3beb93cb0f7388f94153bcb235b (patch) | |
tree | 1e1a0e8bea4f7bc128ab0dfb983c87bacfc0e267 /gtkgame.c | |
parent | 2dc6c06022f278f944c8b502fbe8ced1c73811e4 (diff) |
Imported Upstream version 0.90+20120127
Diffstat (limited to 'gtkgame.c')
-rw-r--r-- | gtkgame.c | 2847 |
1 files changed, 1571 insertions, 1276 deletions
@@ -1,4 +1,3 @@ - /* * gtkgame.c * @@ -17,10 +16,12 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: gtkgame.c,v 1.813 2009/11/30 18:56:21 c_anthon Exp $ + * $Id: gtkgame.c,v 1.853 2012/01/08 22:44:05 plm Exp $ */ #include "config.h" +#include "gtklocdefs.h" +#include "gtkuidefs.h" #include <glib.h> #include <ctype.h> @@ -31,6 +32,8 @@ #include <stdlib.h> #include <string.h> #include <errno.h> +#include <locale.h> + #if HAVE_UNISTD_H #include <unistd.h> #endif @@ -61,7 +64,6 @@ #include "matchequity.h" #include "openurl.h" #include "positionid.h" -#include "record.h" #include "sound.h" #include "gtkoptions.h" #include "gtktoolbar.h" @@ -85,6 +87,15 @@ /* Offset action to avoid predefined values */ #define MENU_OFFSET 50 + +#if (USE_GTKUIMANAGER) +static void TogglePanel ( guint iType, guint iActionID, GtkToggleAction *action, + GtkToggleAction *alt, gpointer user_data ); + +static void ToolbarStyle ( guint iType, guint iActionID, GtkRadioAction *action, + GtkRadioAction *alt, gpointer user_data ); +#endif + char *newLang; /* Hack this for now to stop re-entering - should be fixed when menu switched to actions */ @@ -136,7 +147,6 @@ typedef enum _gnubgcommand { CMD_PREV_ROLL, CMD_PREV_ROLLED, CMD_QUIT, - CMD_RECORD_SHOW, CMD_REJECT, CMD_RELATIONAL_ADD_MATCH, CMD_ROLL, @@ -163,9 +173,213 @@ typedef enum _gnubgcommand { CMD_SHOW_VERSION, CMD_SHOW_WARRANTY, CMD_SWAP_PLAYERS, - NUM_CMDS + NUM_CMDS, + TOGGLE_GAMELIST, + TOGGLE_ANALYSIS, + TOGGLE_COMMENTARY, + TOGGLE_MESSAGE, + TOGGLE_THEORY, + TOGGLE_COMMAND, + VIEW_TOOLBAR_ICONSONLY, + VIEW_TOOLBAR_TEXTONLY, + VIEW_TOOLBAR_BOTH } gnubgcommand; +/* TRUE if gnubg is automatically setting the state of a menu item. */ +static int fAutoCommand; + +#if (USE_GTKUIMANAGER) +static void ExecToggleActionCommand_internal ( guint iWidgetType, guint iCommand, gchar *szCommand, + gpointer *widget, gpointer *widgetalt, gpointer user_data ) { + + char sz[ 80 ]; + + if( fAutoCommand ) + return; + + sprintf( sz, "%s %s", szCommand, + gtk_toggle_action_get_active (GTK_TOGGLE_ACTION(widget)) ? "on" : "off" ); + UserCommand( sz ); + + return; +} + +static void ExecRadioActionCommand_internal ( guint iWidgetType, guint iCommand, gchar *szCommand, + gpointer *widget, gpointer *widgetalt, gpointer user_data ) { + + char sz[ 80 ]; + gint actionID; + + if( fAutoCommand ) + return; + + actionID = gtk_radio_action_get_current_value ( GTK_RADIO_ACTION ( widget ) ); + switch( actionID ) { + + case CMD_SET_TURN_0: + case CMD_SET_TURN_1: + sprintf( sz, "set turn %s", ap[ actionID - iCommand ].szName ); + UserCommand( sz ); + break; + } + + return; +} + +static void ExecActionCommand_internal ( guint iWidgetType, guint iCommand, gchar *szCommand, + gpointer *widget, gpointer *widgetalt, gpointer user_data ) { + + char sz[ 80 ]; + + if( fAutoCommand ) + return; + + switch( iCommand ) { + case CMD_SET_APPEARANCE: + BoardPreferences( pwBoard ); + return; + + case CMD_SET_TURN_0: + case CMD_SET_TURN_1: + sprintf( sz, "set turn %s", + ap[ iCommand - CMD_SET_TURN_0 ].szName ); + UserCommand( sz ); + return; + + + default: + UserCommand( szCommand ); + } +} + +#define CREATE_CMD_ACTION_CALLBACK(CMDID, szCommand) \ + static void CMDID##_action_cb ( GtkAction *action, gpointer user_data ) \ + { \ + ExecActionCommand_internal ( 0, CMDID, szCommand, (gpointer)action, NULL, user_data ); \ + return; \ + } ; + +#define CREATE_CMD_TOGGLE_CALLBACK(CMDID, szCommand) \ + static void CMDID##_toggle_cb ( GtkToggleAction *action, gpointer user_data ) \ + { \ + ExecToggleActionCommand_internal ( 1, CMDID, szCommand, (gpointer)action, NULL, user_data ); \ + return; \ + } ; + +#define CREATE_CMD_RADIO_CALLBACK(CMDID, szCommand) \ + static void CMDID##_radio_cb ( GtkRadioAction *action, GtkRadioAction *current, gpointer user_data ) \ + { \ + ExecRadioActionCommand_internal ( 2, CMDID, szCommand, (gpointer)action, (gpointer)current, user_data ); \ + return; \ + } ; + +#define CREATE_GENERIC_ACTION_CALLBACK(ACTIONID, callbackfunc) \ + static void ACTIONID##_action_g_cb ( GtkAction *action, gpointer user_data ) \ + { \ + callbackfunc ( 0, ACTIONID, action, NULL, user_data ); \ + return; \ + } ; + +#define CREATE_GENERIC_TOGGLE_CALLBACK(ACTIONID, callbackfunc) \ + static void ACTIONID##_toggle_g_cb ( GtkToggleAction *action, gpointer user_data ) \ + { \ + callbackfunc ( 1, ACTIONID, action, NULL, user_data ); \ + return; \ + } ; + +#define CREATE_GENERIC_RADIO_CALLBACK(ACTIONID, callbackfunc) \ + static void ACTIONID##_radio_g_cb ( GtkRadioAction *action, GtkRadioAction *current, gpointer user_data ) \ + { \ + callbackfunc ( 2, ACTIONID, action, current, user_data ); \ + return; \ + } ; + + +#define CMD_ACTION_CALLBACK_FROMID(CMDID) (GCallback)CMDID##_action_cb +#define CMD_TOGGLE_CALLBACK_FROMID(CMDID) (GCallback)CMDID##_toggle_cb +#define CMD_RADIO_CALLBACK_FROMID(CMDID) (GCallback)CMDID##_radio_cb +#define GENERIC_ACTION_CALLBACK_FROMID(ACTIONID) (GCallback)ACTIONID##_action_g_cb +#define GENERIC_TOGGLE_CALLBACK_FROMID(ACTIONID) (GCallback)ACTIONID##_toggle_g_cb +#define GENERIC_RADIO_CALLBACK_FROMID(ACTIONID) (GCallback)ACTIONID##_radio_g_cb + +/* Create callback functions for all the commands. These do no need to be in any particular order */ +CREATE_CMD_ACTION_CALLBACK ( CMD_ACCEPT, "accept" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_CLEAR_MOVE, "analyse clear move" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_CLEAR_GAME, "analyse clear game" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_CLEAR_MATCH, "analyse clear match" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_MOVE, "analyse move" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_GAME, "analyse game" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_MATCH, "analyse match" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_ROLLOUT_CUBE, "analyse rollout cube" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_ROLLOUT_MOVE, "analyse rollout move" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_ROLLOUT_GAME, "analyse rollout game" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ANALYSE_ROLLOUT_MATCH, "analyse rollout match" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_CLEAR_TURN, "clear turn" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_CMARK_CUBE_CLEAR, "cmark cube clear" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_CMARK_CUBE_SHOW, "cmark cube show" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_CMARK_MOVE_CLEAR, "cmark move clear" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_CMARK_MOVE_SHOW, "cmark move show" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_CMARK_GAME_CLEAR, "cmark game clear" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_CMARK_GAME_SHOW, "cmark game show" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_CMARK_MATCH_CLEAR, "cmark match clear" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_CMARK_MATCH_SHOW, "cmark match show" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_END_GAME, "end game" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_DECLINE, "decline" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_DOUBLE, "double" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_EVAL, "eval" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_HELP, "help" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_HINT, "hint" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_LIST_GAME, "list game" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_NEXT, "next" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_NEXT_GAME, "next game" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_NEXT_MARKED, "next marked" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_NEXT_CMARKED, "next cmarked" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_NEXT_ROLL, "next roll" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_NEXT_ROLLED, "next rolled" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_PLAY, "play" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_PREV, "previous" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_PREV_GAME, "previous game" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_PREV_MARKED, "previous marked" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_PREV_CMARKED, "previous cmarked" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_PREV_ROLL, "previous roll" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_PREV_ROLLED, "previous rolled" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_QUIT, "quit" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_REJECT, "reject" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_RELATIONAL_ADD_MATCH, "relational add match" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ROLL, "roll" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_ROLLOUT, "rollout" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SAVE_SETTINGS, "save settings" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SET_ANNOTATION_ON, "set annotation on" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SET_APPEARANCE, NULL ); /* set appearance */ +CREATE_CMD_ACTION_CALLBACK ( CMD_SET_MESSAGE_ON, "set message on" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SET_TURN_0, NULL ); /* set turn 0 */ +CREATE_CMD_ACTION_CALLBACK ( CMD_SET_TURN_1, NULL ); /* set turn 1 */ +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_CALIBRATION, "show calibration" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_COPYING, "show copying" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_ENGINE, "show engine" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_EXPORT, "show export" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_MARKETWINDOW, "show marketwindow" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_MATCHEQUITYTABLE, "show matchequitytable" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_KLEINMAN, "show kleinman" ); /* opens race theory window */ +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_MANUAL_ABOUT, "show manual about" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_MANUAL_WEB, "show manual web" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_ROLLS, "show rolls" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_STATISTICS_MATCH, "show statistics match" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_TEMPERATURE_MAP, "show temperaturemap" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_TEMPERATURE_MAP_CUBE, "show temperaturemap =cube" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_VERSION, "show version" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SHOW_WARRANTY, "show warranty" ); +CREATE_CMD_ACTION_CALLBACK ( CMD_SWAP_PLAYERS, "swap players" ); +CREATE_GENERIC_TOGGLE_CALLBACK ( TOGGLE_GAMELIST, TogglePanel ); +CREATE_GENERIC_TOGGLE_CALLBACK ( TOGGLE_COMMENTARY, TogglePanel ); +CREATE_GENERIC_TOGGLE_CALLBACK ( TOGGLE_MESSAGE, TogglePanel ); +CREATE_GENERIC_TOGGLE_CALLBACK ( TOGGLE_ANALYSIS, TogglePanel ); +CREATE_GENERIC_TOGGLE_CALLBACK ( TOGGLE_THEORY, TogglePanel ); +CREATE_GENERIC_TOGGLE_CALLBACK ( TOGGLE_COMMAND, TogglePanel ); +CREATE_GENERIC_RADIO_CALLBACK ( VIEW_TOOLBAR_ICONSONLY, ToolbarStyle ); +CREATE_CMD_RADIO_CALLBACK ( CMD_SET_TURN_0, NULL ); +#else + static const char *aszCommands[ NUM_CMDS ] = { "accept", "analyse clear move", @@ -208,7 +422,6 @@ static const char *aszCommands[ NUM_CMDS ] = { "previous roll", "previous rolled", "quit", - "record show", "reject", "relational add match", "roll", @@ -236,22 +449,62 @@ static const char *aszCommands[ NUM_CMDS ] = { "show warranty", "swap players", }; -enum { TOGGLE_GAMELIST = NUM_CMDS + 1, TOGGLE_ANALYSIS, TOGGLE_COMMENTARY, TOGGLE_MESSAGE, TOGGLE_THEORY, TOGGLE_COMMAND }; +static void Command( gpointer p, guint iCommand, GtkWidget *widget ) { + + char sz[ 80 ]; + + if( fAutoCommand ) + return; + + /* FIXME this isn't very good -- if UserCommand fails, the setting + won't have been changed, but the widget will automatically have + updated itself. */ + + if( GTK_IS_RADIO_MENU_ITEM( widget ) ) { + if( !gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM( widget ) ) ) + return; + } else if( GTK_IS_CHECK_MENU_ITEM( widget ) ) { + sprintf( sz, "%s %s", aszCommands[ iCommand ], + gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM( widget ) ) ? "on" : "off" ); + UserCommand( sz ); + + return; + } + + switch( iCommand ) { + case CMD_SET_APPEARANCE: + BoardPreferences( pwBoard ); + return; + + case CMD_SET_TURN_0: + case CMD_SET_TURN_1: + sprintf( sz, "set turn %s", + ap[ iCommand - CMD_SET_TURN_0 ].szName ); + UserCommand( sz ); + return; + + + default: + UserCommand( aszCommands[ iCommand ] ); + } +} + +#endif typedef struct _analysiswidget { evalsetup esChequer; - evalsetup esCube; + evalsetup esCube; movefilter aamf[ MAX_FILTER_PLIES ][ MAX_FILTER_PLIES ]; evalsetup esEvalChequer; - evalsetup esEvalCube; + evalsetup esEvalCube; movefilter aaEvalmf[ MAX_FILTER_PLIES ][ MAX_FILTER_PLIES ]; GtkAdjustment *apadjSkill[3], *apadjLuck[4]; GtkWidget *pwMoves, *pwCube, *pwLuck, *pwHintSame, *pwCubeSummary; GtkWidget *apwAnalysePlayers[ 2 ]; - + } analysiswidget; /* A dummy widget that can grab events when others shouldn't see them. */ @@ -275,7 +528,11 @@ GtkAccelGroup *pagMain; #if (GTK_MAJOR_VERSION < 3) && (GTK_MINOR_VERSION < 12) GtkTooltips *ptt; #endif +#if (USE_GTKUIMANAGER) +GtkUIManager *puim = NULL; +#else GtkItemFactory *pif; +#endif guint nNextTurn = 0; /* GTK idle function */ static guint idOutput, idProgress; int fTTY = TRUE; @@ -312,7 +569,7 @@ extern void GTKSuspendInput(void) if (!fX) return; - if (suspendCount == 0) + if (suspendCount == 0 && GDK_IS_WINDOW(pwGrab)) { /* Grab events so that the board window knows this is a re-entrant call, and won't allow commands like roll, move or double. */ grabbedWidget = pwGrab; @@ -339,7 +596,7 @@ extern void GTKResumeInput(void) suspendCount--; if (suspendCount == 0) { - if (GTK_IS_WIDGET(grabbedWidget) && GTK_WIDGET_HAS_GRAB(grabbedWidget)) + if (GTK_IS_WIDGET(grabbedWidget) && gtk_widget_has_grab(grabbedWidget)) { if (g_signal_handler_is_connected (G_OBJECT(grabbedWidget), grabIdSignal)) g_signal_handler_disconnect (G_OBJECT(grabbedWidget), grabIdSignal); @@ -352,10 +609,10 @@ extern void GTKResumeInput(void) GTKAllowStdin(); } -static void StdinReadNotify( gpointer p, gint h, GdkInputCondition cond ) { - +static gboolean StdinReadNotify(GIOChannel *source, GIOCondition cond, gpointer p) { + char sz[ 2048 ], *pch; - + #if HAVE_LIBREADLINE /* Handle "next turn" processing before more input (otherwise we might not even have a readline handler installed!) */ @@ -364,25 +621,25 @@ static void StdinReadNotify( gpointer p, gint h, GdkInputCondition cond ) { rl_callback_read_char(); - return; + return TRUE; #endif while( nNextTurn ) NextTurnNotify( NULL ); - + if (fgets( sz, sizeof( sz ), stdin ) == NULL) { if( !isatty( STDIN_FILENO ) ) exit( EXIT_SUCCESS ); - + PromptForExit(); - return; + return TRUE; } if( ( pch = strchr( sz, '\n' ) ) ) *pch = 0; - - + + fInterrupt = FALSE; HandleCommand( sz, acTop ); @@ -393,29 +650,31 @@ static void StdinReadNotify( gpointer p, gint h, GdkInputCondition cond ) { fNeedPrompt = TRUE; else Prompt(); + + return TRUE; } extern void GTKAllowStdin( void ) { if( !fTTY || !nDisabledCount ) - return; - + return; + if( !--nDisabledCount ) - nStdin = gtk_input_add_full( STDIN_FILENO, GDK_INPUT_READ, - StdinReadNotify, NULL, NULL, NULL ); + nStdin = g_io_add_watch_full ( g_io_channel_unix_new( STDIN_FILENO ), G_PRIORITY_HIGH, + G_IO_IN | G_IO_PRI, StdinReadNotify, NULL, NULL ); } extern void GTKDisallowStdin( void ) { if( !fTTY ) - return; - + return; + nDisabledCount++; - + if( nStdin ) { - gtk_input_remove( nStdin ); - nStdin = 0; + g_source_remove( nStdin ); + nStdin = 0; } } @@ -424,57 +683,15 @@ int fEndDelay; extern void GTKDelay( void ) { GTKSuspendInput(); - + while( !fInterrupt && !fEndDelay ) gtk_main_iteration(); - + fEndDelay = FALSE; - + GTKResumeInput(); } -/* TRUE if gnubg is automatically setting the state of a menu item. */ -static int fAutoCommand; - -static void Command( gpointer p, guint iCommand, GtkWidget *widget ) { - - char sz[ 80 ]; - - if( fAutoCommand ) - return; - - /* FIXME this isn't very good -- if UserCommand fails, the setting - won't have been changed, but the widget will automatically have - updated itself. */ - - if( GTK_IS_RADIO_MENU_ITEM( widget ) ) { - if( !GTK_CHECK_MENU_ITEM( widget )->active ) - return; - } else if( GTK_IS_CHECK_MENU_ITEM( widget ) ) { - sprintf( sz, "%s %s", aszCommands[ iCommand ], - GTK_CHECK_MENU_ITEM( widget )->active ? "on" : "off" ); - UserCommand( sz ); - - return; - } - - switch( iCommand ) { - case CMD_SET_APPEARANCE: - BoardPreferences( pwBoard ); - return; - - case CMD_SET_TURN_0: - case CMD_SET_TURN_1: - sprintf( sz, "set turn %s", - ap[ iCommand - CMD_SET_TURN_0 ].szName ); - UserCommand( sz ); - return; - - - default: - UserCommand( aszCommands[ iCommand ] ); - } -} static void gui_clear_turn(GtkWidget *pw, GtkWidget *dialog) { @@ -547,20 +764,20 @@ extern void GTKSetCube( gpointer p, guint n, GtkWidget *pw ) { if( ms.gs != GAME_PLAYING || ms.fCrawford || !ms.fCubeUse ) return; - + pwDialog = GTKCreateDialog( _("GNU Backgammon - Cube"), DT_INFO, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_CLOSEBUTTON, NULL, NULL ); pwCube = board_cube_widget( BOARD( pwBoard ) ); an[ 0 ] = -1; - + gtk_container_add( GTK_CONTAINER( DialogArea( pwDialog, DA_MAIN ) ), pwCube ); g_object_set_data( G_OBJECT( pwCube ), "user_data", an ); - + g_signal_connect( G_OBJECT( pwCube ), "destroy", G_CALLBACK( DestroySetCube ), pwDialog ); - + GTKRunDialog(pwDialog); if( an[ 0 ] < 0 ) @@ -587,7 +804,7 @@ extern void CommentaryChanged( GtkWidget *pw, GtkTextBuffer *buffer ) { char *pch; GtkTextIter begin, end; - + if( fAutoCommentaryChange ) return; @@ -600,7 +817,7 @@ extern void CommentaryChanged( GtkWidget *pw, GtkTextBuffer *buffer ) { if( pmrAnnotation->sz ) g_free( pmrAnnotation->sz ); - + gtk_text_buffer_get_bounds (buffer, &begin, &end); pch = gtk_text_buffer_get_text(buffer, &begin, &end, FALSE); /* This copy is absolutely disgusting, but is necessary because GTK @@ -638,7 +855,7 @@ ResignAnalysis ( float arResign[ NUM_ROLLOUT_OUTPUTS ], char sz [ 64 ]; - if ( pesResign->et == EVAL_NONE ) + if ( pesResign->et == EVAL_NONE ) return NULL; GetMatchStateCubeInfo ( &ci, &ms ); @@ -651,7 +868,7 @@ ResignAnalysis ( float arResign[ NUM_ROLLOUT_OUTPUTS ], gtk_table_attach ( GTK_TABLE ( pwTable ), pwLabel, 0, 1, 0, 1, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2 ); pwLabel = gtk_label_new ( _("Equity after resignation: ") ); @@ -659,7 +876,7 @@ ResignAnalysis ( float arResign[ NUM_ROLLOUT_OUTPUTS ], gtk_table_attach ( GTK_TABLE ( pwTable ), pwLabel, 0, 1, 1, 2, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2 ); pwLabel = gtk_label_new ( _("Difference: ") ); @@ -667,7 +884,7 @@ ResignAnalysis ( float arResign[ NUM_ROLLOUT_OUTPUTS ], gtk_table_attach ( GTK_TABLE ( pwTable ), pwLabel, 0, 1, 2, 3, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2 ); /* Second column: equities/mwc */ @@ -684,7 +901,7 @@ ResignAnalysis ( float arResign[ NUM_ROLLOUT_OUTPUTS ], gtk_table_attach ( GTK_TABLE ( pwTable ), pwLabel, 1, 2, 0, 1, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2 ); @@ -698,7 +915,7 @@ ResignAnalysis ( float arResign[ NUM_ROLLOUT_OUTPUTS ], gtk_table_attach ( GTK_TABLE ( pwTable ), pwLabel, 1, 2, 1, 2, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2 ); @@ -713,7 +930,7 @@ ResignAnalysis ( float arResign[ NUM_ROLLOUT_OUTPUTS ], gtk_table_attach ( GTK_TABLE ( pwTable ), pwLabel, 1, 2, 2, 3, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, + GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 8, 2 ); @@ -730,7 +947,7 @@ static GtkWidget *luck_label(lucktype lt) GtkWidget *label; gchar *markup; const gchar *skill; - gchar *color[N_LUCKS] = {"red", "orange", "black", "green", "white"}; + gchar *color[N_LUCKS] = {"red", "orange", "black", "green", "white"}; label = gtk_label_new(NULL); skill = aszLuckType[lt] ? gettext(aszLuckType[lt]) : ""; @@ -745,7 +962,7 @@ static GtkWidget *skill_label(skilltype st) GtkWidget *label; gchar *markup; const gchar *skill; - gchar *color[] = {"red", "orange", "yellow", "black"}; + gchar *color[] = {"red", "orange", "yellow", "black"}; label = gtk_label_new(NULL); skill = aszSkillType[st] ? gettext(aszSkillType[st]) : ""; @@ -757,7 +974,7 @@ static GtkWidget *skill_label(skilltype st) extern void SetAnnotation( moverecord *pmr) { - GtkWidget *pwParent = pwAnalysis->parent, *pw = NULL, *pwBox, *pwAlign; + GtkWidget *pwParent = gtk_widget_get_parent( pwAnalysis ), *pw = NULL, *pwBox, *pwAlign; int fMoveOld, fTurnOld; listOLD *pl; char sz[ 64 ]; @@ -783,7 +1000,7 @@ extern void SetAnnotation( moverecord *pmr) { pmrAnnotation = pmr; /* FIXME optimise by ignoring set if pmr is unchanged */ - + if( pwAnalysis ) { gtk_widget_destroy( pwAnalysis ); pwAnalysis = NULL; @@ -794,7 +1011,7 @@ extern void SetAnnotation( moverecord *pmr) { buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(pwCommentary)); gtk_text_buffer_set_text (buffer, "", -1); fAutoCommentaryChange = FALSE; - + if( pmr ) { if( pmr->sz ) { fAutoCommentaryChange = TRUE; @@ -815,7 +1032,7 @@ extern void SetAnnotation( moverecord *pmr) { ms.fMove = ms.fTurn = pmr->fPlayer; - /* + /* * Skill and luck */ @@ -836,9 +1053,9 @@ extern void SetAnnotation( moverecord *pmr) { { char sz[ 64 ], *pch; cubeinfo ci; - + pch = sz + sprintf( sz, _("Rolled %d%d"), pmr->anDice[0], pmr->anDice[1] ); - + if( pmr->rLuck != ERR_VAL ) { if( fOutputMWC && ms.nMatchTo ) { GetMatchStateCubeInfo( &ci, &ms ); @@ -858,10 +1075,10 @@ extern void SetAnnotation( moverecord *pmr) { FormatMove( sz + strlen(_("Moved ")), msBoard(), pmr->n.anMove ); gtk_table_attach_defaults( GTK_TABLE( pwBox ), - gtk_label_new( sz ), + gtk_label_new( sz ), 2, 3, 0, 1 ); - gtk_table_attach_defaults( GTK_TABLE( pwBox ), + gtk_table_attach_defaults( GTK_TABLE( pwBox ), skill_label(pmr->n.stMove), 2, 3, 1, 2 ); @@ -872,8 +1089,8 @@ extern void SetAnnotation( moverecord *pmr) { /* move */ - - if( pmr->ml.cMoves ) + + if( pmr->ml.cMoves ) pwMoveAnalysis = CreateMoveList( pmr, TRUE, FALSE, !IsPanelDocked(WINDOW_ANALYSIS), TRUE); @@ -905,12 +1122,11 @@ extern void SetAnnotation( moverecord *pmr) { gtk_box_pack_start ( GTK_BOX ( pwAnalysis ), pwCubeAnalysis, TRUE, TRUE, 0 ); - - if( !g_list_first( GTK_BOX( pwAnalysis )->children ) ) { + if( !g_list_first( gtk_container_get_children ( GTK_CONTAINER ( GTK_BOX( pwAnalysis ) ) ) ) ) { gtk_widget_destroy( pwAnalysis ); pwAnalysis = NULL; } - + ms.fMove = fMoveOld; ms.fTurn = fTurnOld; break; @@ -922,24 +1138,24 @@ extern void SetAnnotation( moverecord *pmr) { pwAnalysis = gtk_vbox_new( FALSE, 0 ); pwBox = gtk_hbox_new( FALSE, 0 ); - gtk_box_pack_start( GTK_BOX( pwBox ), - gtk_label_new( + gtk_box_pack_start( GTK_BOX( pwBox ), + gtk_label_new( Q_ ( aszDoubleTypes[ dt ] ) ), FALSE, FALSE, 2 ); - gtk_box_pack_start( GTK_BOX( pwBox ), + gtk_box_pack_start( GTK_BOX( pwBox ), skill_label(pmr->stCube), FALSE, FALSE, 2 ); gtk_box_pack_start( GTK_BOX( pwAnalysis ), pwBox, FALSE, FALSE, 0 ); if ( dt == DT_NORMAL || dt == DT_BEAVER ) { - + if ( ( pw = CreateCubeAnalysis( pmr, &ms, TRUE, -1, TRUE ) ) ) gtk_box_pack_start( GTK_BOX( pwAnalysis ), pw, FALSE, FALSE, 0 ); } - else + else gtk_box_pack_start ( GTK_BOX ( pwAnalysis ), gtk_label_new ( _("GNU Backgammon cannot " "analyse neither beavers " @@ -964,7 +1180,7 @@ extern void SetAnnotation( moverecord *pmr) { gtk_box_pack_start( GTK_BOX( pwAnalysis ), pwBox, FALSE, FALSE, 0 ); - if ( tt == TT_NORMAL ) { + if ( tt <= TT_NORMAL ) { if ( ( pw = CreateCubeAnalysis( pmr, &ms, -1, pmr->mt == MOVE_TAKE, TRUE ) ) ) gtk_box_pack_start( GTK_BOX( pwAnalysis ), pw, FALSE, FALSE, 0 ); @@ -977,12 +1193,12 @@ extern void SetAnnotation( moverecord *pmr) { FALSE, FALSE, 0 ); break; - + case MOVE_RESIGN: pwAnalysis = gtk_vbox_new( FALSE, 0 ); /* equities for resign */ - + if( ( pw = ResignAnalysis( pmr->r.arResign, pmr->r.nResigned, &pmr->r.esResign ) ) ) @@ -1014,17 +1230,17 @@ extern void SetAnnotation( moverecord *pmr) { 0 ); gtk_container_add( GTK_CONTAINER( pwAlign ), pwBox ); - + break; - + default: break; } } - + if( !pwAnalysis ) pwAnalysis = gtk_label_new( _("No analysis available.") ); - + if (!IsPanelDocked(WINDOW_ANALYSIS)) gtk_paned_pack1( GTK_PANED( pwParent ), pwAnalysis, TRUE, FALSE ); else @@ -1052,7 +1268,7 @@ extern void GTKSaveSettings( void ) { static gboolean main_delete( GtkWidget *pw ) { getWindowGeometry(WINDOW_MAIN); - + PromptForExit(); return TRUE; @@ -1070,10 +1286,12 @@ static void TextPopped( GtkWidget *pw, guint id, gchar *text, void *p ) { extern int GetPanelSize(void) { - if (!fFullScreen && fX && GTK_WIDGET_REALIZED(pwMain)) + if (!fFullScreen && fX && gtk_widget_get_realized(pwMain)) { int pos = gtk_paned_get_position(GTK_PANED(hpaned)); - return pwMain->allocation.width - pos; + GtkAllocation allocation; + gtk_widget_get_allocation (pwMain, &allocation); + return allocation.width - pos; } else return panelSize; @@ -1082,15 +1300,19 @@ extern int GetPanelSize(void) extern void SetPanelWidth(int size) { panelSize = size; - if( GTK_WIDGET_REALIZED( pwMain ) ) + if( gtk_widget_get_realized( pwMain ) ) { - if (panelSize > pwMain->allocation.width * .8) - panelSize = (int)(pwMain->allocation.width * .8); + GtkAllocation allocation; + gtk_widget_get_allocation (pwMain, &allocation); + if (panelSize > allocation.width * .8) + panelSize = (int)(allocation.width * .8); } } extern void SwapBoardToPanel(int ToPanel, int updateEvents) { /* Show/Hide panel on right of screen */ + GtkAllocation allocation; + gtk_widget_get_allocation (pwMain, &allocation); if (ToPanel) { gtk_widget_reparent(pwEventBox, pwPanelGameBox); @@ -1098,10 +1320,10 @@ extern void SwapBoardToPanel(int ToPanel, int updateEvents) if (updateEvents) ProcessEvents(); gtk_widget_hide(pwGameBox); - gtk_paned_set_position(GTK_PANED(hpaned), pwMain->allocation.width - panelSize); + gtk_paned_set_position(GTK_PANED(hpaned), allocation.width - panelSize); { /* Hack to sort out widget positions - may be removed if works in later version of gtk */ - GtkAllocation temp = pwMain->allocation; + GtkAllocation temp = allocation; temp.height++; gtk_widget_size_allocate(pwMain, &temp); temp.height--; @@ -1119,7 +1341,7 @@ extern void SwapBoardToPanel(int ToPanel, int updateEvents) gtk_widget_show(pwGameBox); if (updateEvents) ProcessEvents(); - if (GTK_WIDGET_VISIBLE(hpaned)) + if (gtk_widget_get_visible(hpaned)) { panelSize = GetPanelSize(); gtk_widget_hide(hpaned); @@ -1134,10 +1356,10 @@ static void MainSize( GtkWidget *pw, GtkRequisition *preq, gpointer p ) { /* Give the main window a size big enough that the board widget gets board_size=4, if it will fit on the screen. */ - + int width; - if( GTK_WIDGET_REALIZED( pw ) ) + if( gtk_widget_get_realized( pw ) ) g_signal_handlers_disconnect_by_func( G_OBJECT( pw ), G_CALLBACK( MainSize ), p ); else if (!SetMainWindowSize()) @@ -1154,21 +1376,31 @@ static void MainSize( GtkWidget *pw, GtkRequisition *preq, gpointer p ) { } +#if !(USE_GTKUIMANAGER) static gchar *GTKTranslate ( const gchar *path, gpointer func_data ) { - return (gchar *) gettext ( (const char *) path ); - } +#endif +#if (USE_GTKUIMANAGER) +static void ToolbarStyle ( guint iType, guint iActionID, GtkRadioAction *action, + GtkRadioAction *alt, gpointer user_data ) +{ + guint actionID = gtk_radio_action_get_current_value ( GTK_RADIO_ACTION ( action ) ); + /* If radio button has been selected set style */ + SetToolbarStyle( actionID - VIEW_TOOLBAR_ICONSONLY); +} +#else static void ToolbarStyle(gpointer callback_data, guint callback_action, GtkWidget *widget) { - if(GTK_CHECK_MENU_ITEM(widget)->active) + if(gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM( widget ) ) ) { /* If radio button has been selected set style */ SetToolbarStyle(callback_action - TOOLBAR_ACTION_OFFSET); } } +#endif GtkClipboard *clipboard = NULL; @@ -1190,6 +1422,14 @@ static void PasteIDs(void) UserCommand(sz); g_free(sz); + strcpy(ap[0].szName,default_names[0]); + strcpy(ap[1].szName,default_names[1]); + +#if USE_GTK + if( fX ) + GTKSet(ap); +#endif /* USE_GTK */ + if (editing) click_edit(); } @@ -1212,6 +1452,13 @@ static void NewClicked(gpointer p, guint n, GtkWidget * pw) GTKNew(); } +static void CopyAsBGbase(gpointer p, guint n, GtkWidget * pw) +{ + + UserCommand("export position backgammonbase2clipboard"); + +} + static void CopyAsGOL(gpointer p, guint n, GtkWidget * pw) { @@ -1239,6 +1486,84 @@ static void CopyIDs(gpointer p, guint n, GtkWidget * pw) gtk_statusbar_push( GTK_STATUSBAR( pwStatus ), idOutput, _("Position and Match IDs copied to the clipboard") ); } +static void CopyMatchID(gpointer p, guint n, GtkWidget * pw) +{ /* Copy the position and match ids to the clipboard */ + char buffer[1024]; + + if( ms.gs == GAME_NONE ) + { + output( _("No game in progress.") ); + outputx(); + return; + } + + sprintf(buffer, "%s %s\n",_("Match ID:"), + MatchIDFromMatchState(&ms)); + + GTKTextToClipboard(buffer); + + gtk_statusbar_push( GTK_STATUSBAR( pwStatus ), idOutput, _("Match ID copied to the clipboard") ); +} + +static void CopyPositionID(gpointer p, guint n, GtkWidget * pw) +{ /* Copy the position and match ids to the clipboard */ + char buffer[1024]; + + if( ms.gs == GAME_NONE ) + { + output( _("No game in progress.") ); + outputx(); + return; + } + + sprintf(buffer, "%s %s\n", _("Position ID:"), + PositionID(msBoard())); + + GTKTextToClipboard(buffer); + + gtk_statusbar_push( GTK_STATUSBAR( pwStatus ), idOutput, _("Position ID copied to the clipboard") ); +} + +#if (USE_GTKUIMANAGER) +static void TogglePanel ( guint iType, guint iActionID, GtkToggleAction *action, + GtkToggleAction *alt, gpointer user_data ) +{ + int f; + gnubgwindow panel = 0; + + f = gtk_toggle_action_get_active (action); + switch (iActionID) { + case TOGGLE_ANALYSIS: + panel = WINDOW_ANALYSIS; + break; + case TOGGLE_COMMENTARY: + panel = WINDOW_ANNOTATION; + break; + case TOGGLE_GAMELIST: + panel = WINDOW_GAME; + break; + case TOGGLE_MESSAGE: + panel = WINDOW_MESSAGE; + break; + case TOGGLE_THEORY: + panel = WINDOW_THEORY; + break; + case TOGGLE_COMMAND: + panel = WINDOW_COMMAND; + break; + default: + g_assert(FALSE); + } + if (f) + PanelShow(panel); + else + PanelHide(panel); + + /* Resize screen */ + SetMainWindowSize(); +} + +#else static void TogglePanel(gpointer p, guint n, GtkWidget * pw) { int f; @@ -1246,7 +1571,7 @@ static void TogglePanel(gpointer p, guint n, GtkWidget * pw) g_assert(GTK_IS_CHECK_MENU_ITEM(pw)); - f = GTK_CHECK_MENU_ITEM(pw)->active; + f = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM( pw ) ); switch (n) { case TOGGLE_ANALYSIS: panel = WINDOW_ANALYSIS; @@ -1277,6 +1602,7 @@ static void TogglePanel(gpointer p, guint n, GtkWidget * pw) /* Resize screen */ SetMainWindowSize(); } +#endif extern void GTKUndo(void) { @@ -1299,17 +1625,25 @@ extern void GTKUndo(void) } #if USE_BOARD3D - extern void SetSwitchModeMenuText(void) { /* Update menu text */ BoardData *bd = BOARD( pwBoard )->board_data; +#if (USE_GTKUIMANAGER) + GtkWidget *pMenuItem = gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/SwitchMode"); +#else GtkWidget *pMenuItem = gtk_item_factory_get_widget_by_action(pif, TOOLBAR_ACTION_OFFSET + MENU_OFFSET); +#endif char *text; if (display_is_2d(bd->rd)) text = _("Switch to 3D view"); else text = _("Switch to 2D view"); +#if (USE_GTKUIMANAGER) + gtk_label_set_text( GTK_LABEL(gtk_bin_get_child(GTK_BIN(pMenuItem )) ), text ); +#else gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(pMenuItem))), text); +#endif gtk_widget_set_sensitive(pMenuItem, gtk_gl_init_success); } @@ -1354,14 +1688,27 @@ SwitchDisplayMode( gpointer p, guint n, GtkWidget *pw ) #endif +#if (USE_GTKUIMANAGER) +static void ToggleShowingIDs ( GtkToggleAction *action, gpointer user_data ) +{ + int newValue = gtk_toggle_action_get_active (action); + char *sz = g_strdup_printf("set gui showids %s", newValue ? "on" : + "off"); + UserCommand(sz); + g_free(sz); + UserCommand("save settings"); +} +#else static void ToggleShowingIDs( gpointer p, guint n, GtkWidget *pw ) { - int newValue = GTK_CHECK_MENU_ITEM( pw )->active; + int newValue = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM( pw ) ); char *sz = g_strdup_printf("set gui showids %s", newValue ? "on" : "off"); UserCommand(sz); g_free(sz); + UserCommand("save settings"); } +#endif int fToolbarShowing = TRUE; @@ -1371,12 +1718,24 @@ extern void ShowToolbar(void) gtk_widget_show(pwToolbar); gtk_widget_show(pwHandle); +#if (USE_GTKUIMANAGER) + gtk_widget_show ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/HideToolBar" )) ); + gtk_widget_hide ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/ShowToolBar" )) ); + gtk_widget_set_sensitive ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/TextOnly" )), TRUE ); + gtk_widget_set_sensitive ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/IconsOnly" )), TRUE ); + gtk_widget_set_sensitive ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/Both" )), TRUE ); +#else gtk_widget_show(gtk_item_factory_get_widget(pif, "/View/Toolbar/Hide Toolbar")); gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Toolbar/Show Toolbar")); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Text only"), TRUE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Icons only"), TRUE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Both"), TRUE); - +#endif fToolbarShowing = TRUE; } @@ -1386,12 +1745,24 @@ extern void HideToolbar(void) gtk_widget_hide(pwToolbar); gtk_widget_hide(pwHandle); +#if (USE_GTKUIMANAGER) + gtk_widget_hide ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/HideToolBar" )) ); + gtk_widget_show ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/ShowToolBar" )) ); + gtk_widget_set_sensitive ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/TextOnly" )), FALSE ); + gtk_widget_set_sensitive ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/IconsOnly" )), FALSE ); + gtk_widget_set_sensitive ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/Both" )), FALSE ); +#else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Toolbar/Hide Toolbar")); gtk_widget_show(gtk_item_factory_get_widget(pif, "/View/Toolbar/Show Toolbar")); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Text only"), FALSE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Icons only"), FALSE); gtk_widget_set_sensitive(gtk_item_factory_get_widget(pif, "/View/Toolbar/Both"), FALSE); - +#endif fToolbarShowing = FALSE; } @@ -1422,8 +1793,13 @@ static void DoFullScreenMode(gpointer p, guint n, GtkWidget * pw) static gulong id; static int changedRP, changedDP; +#if (USE_GTKUIMANAGER) + GtkWidget *pmiRP = gtk_ui_manager_get_widget (puim, "/MainMenu/ViewMenu/RestorePanels" ); + GtkWidget *pmiDP = gtk_ui_manager_get_widget (puim, "/MainMenu/ViewMenu/DockPanels" ); +#else GtkWidget *pmiRP = gtk_item_factory_get_widget(pif, "/View/Restore panels"); GtkWidget *pmiDP = gtk_item_factory_get_widget(pif, "/View/Dock panels"); +#endif #if USE_BOARD3D if (display_is_3d(bd->rd)) @@ -1432,8 +1808,12 @@ static void DoFullScreenMode(gpointer p, guint n, GtkWidget * pw) } #endif - fFullScreen = GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(pif, "/View/Full screen"))->active; - +#if (USE_GTKUIMANAGER) + fFullScreen = gtk_check_menu_item_get_active ( GTK_CHECK_MENU_ITEM ( gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/FullScreen" ) ) ); +#else + fFullScreen = gtk_check_menu_item_get_active( GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget( pif, "/View/Full screen") ) ); +#endif if (fFullScreen) { if (!fullScreenOnStartup) @@ -1443,17 +1823,16 @@ static void DoFullScreenMode(gpointer p, guint n, GtkWidget * pw) bd->rd->fShowGameInfo = FALSE; - if (pmiRP && GTK_WIDGET_VISIBLE(pmiRP) - && GTK_WIDGET_IS_SENSITIVE(pmiRP)) + if (pmiRP && gtk_widget_get_visible(pmiRP) + && gtk_widget_is_sensitive(pmiRP)) changedRP = TRUE; - if (pmiDP && GTK_WIDGET_VISIBLE(pmiDP) - && GTK_WIDGET_IS_SENSITIVE(pmiDP)) + if (pmiDP && gtk_widget_get_visible(pmiDP) + && gtk_widget_is_sensitive(pmiDP)) changedDP = TRUE; - /* Check if window is maximized */ { GdkWindowState state = - gdk_window_get_state(GTK_WIDGET(ptl)->window); + gdk_window_get_state(gtk_widget_get_window( GTK_WIDGET( ptl ) ) ); maximised = ((state & GDK_WINDOW_STATE_MAXIMIZED) == GDK_WINDOW_STATE_MAXIMIZED); @@ -1483,7 +1862,6 @@ static void DoFullScreenMode(gpointer p, guint n, GtkWidget * pw) gtk_window_fullscreen(ptl); gtk_window_set_decorated(ptl, FALSE); - if (pmiRP) gtk_widget_set_sensitive(pmiRP, FALSE); if (pmiDP) @@ -1537,8 +1915,13 @@ static void DoFullScreenMode(gpointer p, guint n, GtkWidget * pw) extern void FullScreenMode(int state) { BoardData *bd = BOARD( pwBoard )->board_data; +#if (USE_GTKUIMANAGER) + GtkWidget *pw = gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/FullScreen" ); +#else GtkWidget *pw = gtk_item_factory_get_widget(pif, "/View/Full screen"); - if (GTK_WIDGET_REALIZED(bd->table)) +#endif + if (gtk_widget_get_realized(bd->table)) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pw), state); } @@ -1577,14 +1960,14 @@ typedef struct _evalwidget { static void EvalGetValues ( evalcontext *pec, evalwidget *pew ) { - pec->nPlies = (int)pew->padjPlies->value; + pec->nPlies = (int)gtk_adjustment_get_value( pew->padjPlies ); pec->fCubeful = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( pew->pwCubeful ) ); pec->fUsePrune = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( pew->pwUsePrune ) ); - pec->rNoise = (float)pew->padjNoise->value; + pec->rNoise = (float)gtk_adjustment_get_value( pew->padjNoise ); pec->fDeterministic = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( pew->pwDeterministic ) ); } @@ -1605,15 +1988,15 @@ static void EvalChanged ( GtkWidget *pw, evalwidget *pew ) { fEval = ! cmp_evalcontext ( &aecSettings[ i ], &ecCurrent ); fMoveFilter = ! aecSettings[ i ].nPlies || - ( ! pew->fMoveFilter || - equal_movefilters ( (movefilter (*)[MAX_FILTER_PLIES]) pew->pmf, + ( ! pew->fMoveFilter || + equal_movefilters ( (movefilter (*)[MAX_FILTER_PLIES]) pew->pmf, aaamfMoveFilterSettings[ aiSettingsMoveFilter[ i ] ] ) ); if ( fEval && fMoveFilter ) { /* current settings equal to a predefined setting */ - gtk_option_menu_set_history ( GTK_OPTION_MENU ( pew->pwOptionMenu ), i ); + gtk_combo_box_set_active(GTK_COMBO_BOX ( pew->pwOptionMenu ), i ); fFound = TRUE; break; @@ -1625,10 +2008,10 @@ static void EvalChanged ( GtkWidget *pw, evalwidget *pew ) { /* user defined setting */ if ( ! fFound ) - gtk_option_menu_set_history ( GTK_OPTION_MENU ( pew->pwOptionMenu ), + gtk_combo_box_set_active( GTK_COMBO_BOX ( pew->pwOptionMenu ), NUM_SETTINGS ); - + if ( pew->fMoveFilter ) gtk_widget_set_sensitive ( GTK_WIDGET ( pew->pwMoveFilter ), ecCurrent.nPlies ); @@ -1638,34 +2021,32 @@ static void EvalChanged ( GtkWidget *pw, evalwidget *pew ) { static void EvalNoiseValueChanged( GtkAdjustment *padj, evalwidget *pew ) { - gtk_widget_set_sensitive( pew->pwDeterministic, padj->value != 0.0f ); + gtk_widget_set_sensitive( pew->pwDeterministic, gtk_adjustment_get_value( padj ) != 0.0f ); EvalChanged ( NULL, pew ); - + } static void EvalPliesValueChanged( GtkAdjustment *padj, evalwidget *pew ) { - gtk_widget_set_sensitive( pew->pwUsePrune, padj->value > 0 ); + gtk_widget_set_sensitive( pew->pwUsePrune, gtk_adjustment_get_value ( padj ) > 0 ); EvalChanged ( NULL, pew ); } -static void SettingsMenuActivate ( GtkWidget *pwItem, - evalwidget *pew ) { - +static void SettingsMenuActivate ( GtkComboBox *box, evalwidget *pew ) { + evalcontext *pec; - int *piSelected; - + int iSelected; - piSelected = g_object_get_data ( G_OBJECT ( pwItem ), "user_data" ); - if ( *piSelected == NUM_SETTINGS ) + iSelected = gtk_combo_box_get_active(box); + if ( iSelected == NUM_SETTINGS ) return; /* user defined */ /* set all widgets to predefined values */ - pec = &aecSettings[ *piSelected ]; - + pec = &aecSettings[ iSelected ]; + gtk_adjustment_set_value ( pew->padjPlies, pec->nPlies ); gtk_adjustment_set_value ( pew->padjNoise, pec->rNoise ); @@ -1677,8 +2058,8 @@ static void SettingsMenuActivate ( GtkWidget *pwItem, pec->fDeterministic ); if ( pew->fMoveFilter ) - MoveFilterSetPredefined ( pew->pwMoveFilter, - aiSettingsMoveFilter[ *piSelected ] ); + MoveFilterSetPredefined ( pew->pwMoveFilter, + aiSettingsMoveFilter[ iSelected ] ); } @@ -1687,7 +2068,7 @@ static void SettingsMenuActivate ( GtkWidget *pwItem, * */ -static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, +static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, int *pfOK, const int fMoveFilter ) { evalwidget *pew; @@ -1696,23 +2077,20 @@ static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, GtkWidget *pwFrame, *pwFrame2; GtkWidget *pw2, *pw3; - GtkWidget *pwMenu; - GtkWidget *pwItem; GtkWidget *pwev; int i; - int *pi; if( pfOK ) *pfOK = FALSE; pwEval = gtk_vbox_new( FALSE, 0 ); gtk_container_set_border_width( GTK_CONTAINER( pwEval ), 8 ); - + pew = malloc( sizeof *pew ); /* - * Frame with prefined settings + * Frame with prefined settings */ pwev = gtk_event_box_new(); @@ -1736,45 +2114,23 @@ static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, "beginner's play to the grandmaster setting " "that will test your patience")); - pwMenu = gtk_menu_new (); - - for ( i = 0; i <= NUM_SETTINGS; i++ ) { - - if ( i < NUM_SETTINGS ) - gtk_menu_append ( GTK_MENU ( pwMenu ), - pwItem = gtk_menu_item_new_with_label ( - Q_ ( aszSettings[ i ] ) ) ); - else - gtk_menu_append ( GTK_MENU ( pwMenu ), - pwItem = gtk_menu_item_new_with_label ( - _("user defined") ) ); - - pi = malloc ( sizeof ( int ) ); - *pi = i; - g_object_set_data_full( G_OBJECT( pwItem ), "user_data", - pi, free ); - - g_signal_connect( G_OBJECT ( pwItem ), "activate", - G_CALLBACK ( SettingsMenuActivate ), - (void *) pew ); - - } - - pew->pwOptionMenu = gtk_option_menu_new (); - gtk_option_menu_set_menu ( GTK_OPTION_MENU ( pew->pwOptionMenu ), pwMenu ); - + pew->pwOptionMenu = gtk_combo_box_text_new(); + for ( i = 0; i < NUM_SETTINGS; i++ ) + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pew->pwOptionMenu), Q_(aszSettings[i])); + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pew->pwOptionMenu), _("user defined")); + g_signal_connect(G_OBJECT(pew->pwOptionMenu), "changed", G_CALLBACK(SettingsMenuActivate), pew); gtk_container_add ( GTK_CONTAINER ( pw2 ), pew->pwOptionMenu ); - + /* - * Frame with user settings + * Frame with user settings */ pwFrame = gtk_frame_new ( _("User defined settings") ); gtk_container_add ( GTK_CONTAINER ( pwEval ), pwFrame ); - + pw2 = gtk_vbox_new ( FALSE, 8 ); gtk_container_set_border_width( GTK_CONTAINER( pw2 ), 8 ); gtk_container_add ( GTK_CONTAINER ( pwFrame ), pw2 ); @@ -1803,9 +2159,9 @@ static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, gtk_label_new( _("Plies:") ) ); gtk_container_add( GTK_CONTAINER( pw ), gtk_spin_button_new( pew->padjPlies, 1, 0 ) ); - + /* Use pruning neural nets */ - + pwFrame2 = gtk_frame_new ( _("Pruning neural nets") ); gtk_container_add ( GTK_CONTAINER ( pw2 ), pwFrame2 ); @@ -1817,7 +2173,7 @@ static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, /* FIXME This needs a tool tip */ /* cubeful */ - + pwFrame2 = gtk_frame_new ( _("Cubeful evaluations") ); gtk_container_add ( GTK_CONTAINER ( pw2 ), pwFrame2 ); @@ -1827,7 +2183,7 @@ static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( pew->pwCubeful ), pec->fCubeful ); - if ( fMoveFilter ) + if ( fMoveFilter ) /* checker play */ gtk_widget_set_tooltip_text(pew->pwCubeful, _("Instruct GNU Backgammon to use cubeful " @@ -1875,7 +2231,7 @@ static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, gtk_label_new( _("Noise:") ) ); gtk_container_add( GTK_CONTAINER( pw ), gtk_spin_button_new( pew->padjNoise, 0.001, 3 ) ); - + gtk_container_add( GTK_CONTAINER( pw3 ), pew->pwDeterministic = gtk_check_button_new_with_label( _("Deterministic noise") ) ); @@ -1892,14 +2248,14 @@ static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, /* move filter */ if ( fMoveFilter ) { - - pew->pwMoveFilter = MoveFilterWidget ( pmf, pfOK, - G_CALLBACK ( EvalChanged ), + + pew->pwMoveFilter = MoveFilterWidget ( pmf, pfOK, + G_CALLBACK( EvalChanged ), pew ); pwev = gtk_event_box_new(); gtk_event_box_set_visible_window(GTK_EVENT_BOX(pwev), FALSE); - gtk_container_add ( GTK_CONTAINER ( pwEval ), pwev ); + gtk_container_add ( GTK_CONTAINER ( pwEval ), pwev ); gtk_container_add ( GTK_CONTAINER ( pwev ), pew->pwMoveFilter ); gtk_widget_set_tooltip_text(pwev, @@ -1920,7 +2276,7 @@ static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, g_signal_connect( G_OBJECT( pew->padjPlies ), "value-changed", G_CALLBACK( EvalPliesValueChanged ), pew ); EvalPliesValueChanged( pew->padjPlies, pew ); - + g_signal_connect( G_OBJECT( pew->padjNoise ), "value-changed", G_CALLBACK( EvalNoiseValueChanged ), pew ); EvalNoiseValueChanged( pew->padjNoise, pew ); @@ -1930,10 +2286,10 @@ static GtkWidget *EvalWidget( evalcontext *pec, movefilter *pmf, g_signal_connect( G_OBJECT( pew->pwCubeful ), "toggled", G_CALLBACK( EvalChanged ), pew ); - + g_signal_connect( G_OBJECT( pew->pwUsePrune ), "toggled", G_CALLBACK( EvalChanged ), pew ); - + g_object_set_data_full( G_OBJECT( pwEval ), "user_data", pew, free ); return pwEval; @@ -1948,7 +2304,7 @@ static void EvalOK( GtkWidget *pw, void *p ) { *pew->pfOK = TRUE; EvalGetValues ( pew->pec, pew ); - + if( pew->pfOK ) gtk_widget_destroy( gtk_widget_get_toplevel( pw ) ); } @@ -1977,12 +2333,12 @@ static void SetEvalCommands( const char *szPrefix, evalcontext *pec, if( pec->rNoise != pecOrig->rNoise ) { gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; - sprintf( sz, "%s noise %s", szPrefix, + sprintf( sz, "%s noise %s", szPrefix, g_ascii_formatd( buf, G_ASCII_DTOSTR_BUF_SIZE, "%.3f", pec->rNoise )); UserCommand( sz ); } - + if( pec->fDeterministic != pecOrig->fDeterministic ) { sprintf( sz, "%s deterministic %s", szPrefix, pec->fDeterministic ? "on" : "off" ); @@ -2020,8 +2376,8 @@ static int EvalDefaultSetting(evalcontext *pec, movefilter *pmf) { fEval = ! cmp_evalcontext ( &aecSettings[ i ], pec ); fMoveFilter = ! aecSettings[ i ].nPlies || - ( !pmf || - equal_movefilters ( (movefilter (*)[MAX_FILTER_PLIES]) pmf, + ( !pmf || + equal_movefilters ( (movefilter (*)[MAX_FILTER_PLIES]) pmf, aaamfMoveFilterSettings[ aiSettingsMoveFilter[ i ] ] ) ); if (fEval && fMoveFilter) @@ -2041,7 +2397,7 @@ static void UpdateSummaryEvalMenuSetting(AnalysisDetails *pAnalDetails ) || (chequerDefault == SETTINGS_SUPREMO && cubeDefault == SETTINGS_WORLDCLASS)) setting = chequerDefault; - gtk_option_menu_set_history ( GTK_OPTION_MENU ( pAnalDetails->pwOptionMenu ), setting ); + gtk_combo_box_set_active(GTK_COMBO_BOX( pAnalDetails->pwOptionMenu ), setting ); } static void ShowDetailedAnalysis(GtkWidget *button, AnalysisDetails *pDetails) @@ -2058,7 +2414,7 @@ static void ShowDetailedAnalysis(GtkWidget *button, AnalysisDetails *pDetails) gtk_box_pack_start (GTK_BOX (hbox), pwFrame, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (pwFrame), 4); - gtk_container_add(GTK_CONTAINER (pwFrame ), + gtk_container_add(GTK_CONTAINER (pwFrame ), pDetails->pwChequer = EvalWidget( pDetails->esChequer, pDetails->mfChequer, NULL, pDetails->mfChequer != NULL )); @@ -2069,7 +2425,7 @@ static void ShowDetailedAnalysis(GtkWidget *button, AnalysisDetails *pDetails) pwvbox = gtk_vbox_new ( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( pwFrame ), pwvbox ); - gtk_box_pack_start ( GTK_BOX ( pwvbox ), + gtk_box_pack_start ( GTK_BOX ( pwvbox ), pDetails->pwCube = EvalWidget( pDetails->esCube, (movefilter*)&pDetails->mfCube[9], NULL, pDetails->mfCube != NULL ), FALSE, FALSE, 0 ); @@ -2081,9 +2437,9 @@ static void ShowDetailedAnalysis(GtkWidget *button, AnalysisDetails *pDetails) UpdateSummaryEvalMenuSetting(pDetails); } -static void SummaryMenuActivate(GtkWidget *pwItem, AnalysisDetails *pAnalDetails) +static void SummaryMenuActivate(GtkComboBox *box, AnalysisDetails *pAnalDetails) { - int selected = *((int*)(g_object_get_data ( G_OBJECT ( pwItem ), "user_data" ))); + int selected = gtk_combo_box_get_active(box); if (selected == NUM_SETTINGS) return; /* user defined */ @@ -2099,9 +2455,8 @@ static void SummaryMenuActivate(GtkWidget *pwItem, AnalysisDetails *pAnalDetails static GtkWidget *AddLevelSettings(GtkWidget *pwFrame, AnalysisDetails *pAnalDetails) { - GtkWidget *vbox, *hbox, *pw2, *pwMenu, *pwItem, *pwDetails, *vboxSpacer; + GtkWidget *vbox, *hbox, *pw2, *pwDetails, *vboxSpacer; int i; - int *pi; vboxSpacer = gtk_vbox_new (FALSE, 0); gtk_container_set_border_width ( GTK_CONTAINER ( vboxSpacer ), 8 ); @@ -2111,7 +2466,7 @@ static GtkWidget *AddLevelSettings(GtkWidget *pwFrame, AnalysisDetails *pAnalDet gtk_container_add ( GTK_CONTAINER ( vboxSpacer ), vbox ); /* - * Frame with prefined settings + * Frame with prefined settings */ pw2 = gtk_vbox_new ( FALSE, 4 ); @@ -2119,34 +2474,12 @@ static GtkWidget *AddLevelSettings(GtkWidget *pwFrame, AnalysisDetails *pAnalDet /* option menu with selection of predefined settings */ - pwMenu = gtk_menu_new (); - - gtk_widget_set_tooltip_text(pwMenu, - _("Select a predefined setting, ranging from " - "beginner's play to the grandmaster setting " - "that will test your patience")); - - for ( i = 0; i <= NUM_SETTINGS; i++ ) { - - if ( i < NUM_SETTINGS ) - gtk_menu_append ( GTK_MENU ( pwMenu ), - pwItem = gtk_menu_item_new_with_label ( - Q_ ( aszSettings[ i ] ) ) ); - else - gtk_menu_append ( GTK_MENU ( pwMenu ), - pwItem = gtk_menu_item_new_with_label ( - _("user defined") ) ); - - pi = malloc ( sizeof ( int ) ); - *pi = i; - g_object_set_data_full( G_OBJECT( pwItem ), "user_data", pi, free ); - - g_signal_connect( G_OBJECT ( pwItem ), "activate", G_CALLBACK ( SummaryMenuActivate ), (void*)pAnalDetails); - } - - pAnalDetails->pwOptionMenu = gtk_option_menu_new (); - gtk_option_menu_set_menu ( GTK_OPTION_MENU ( pAnalDetails->pwOptionMenu ), pwMenu ); + pAnalDetails->pwOptionMenu = gtk_combo_box_text_new(); + for ( i = 0; i < NUM_SETTINGS; i++ ) + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pAnalDetails->pwOptionMenu), Q_(aszSettings[i])); + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(pAnalDetails->pwOptionMenu), _("user defined")); + g_signal_connect(G_OBJECT(pAnalDetails->pwOptionMenu), "changed", G_CALLBACK(SummaryMenuActivate), pAnalDetails); gtk_container_add ( GTK_CONTAINER ( pw2 ), pAnalDetails->pwOptionMenu ); pwDetails = gtk_button_new_with_label( _("Advanced Settings...") ); @@ -2166,26 +2499,26 @@ static GtkWidget *AddLevelSettings(GtkWidget *pwFrame, AnalysisDetails *pAnalDet } #define ADJUSTSKILLUPDATE(button,flag,string) \ - if( paw->apadjSkill[(button)]->value != arSkillLevel[(flag)] ) \ + if( gtk_adjustment_get_value ( paw->apadjSkill[(button)] ) != arSkillLevel[(flag)] ) \ { \ gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; \ sprintf(sz, (string), g_ascii_formatd( buf, G_ASCII_DTOSTR_BUF_SIZE, \ - "%0.3f", (gdouble) paw->apadjSkill[(button)]->value )); \ + "%0.3f", (gdouble) gtk_adjustment_get_value( paw->apadjSkill[(button)] ) ) ); \ UserCommand(sz); \ } #define ADJUSTLUCKUPDATE(button,flag,string) \ - if( paw->apadjLuck[(button)]->value != arLuckLevel[(flag)] ) \ + if( gtk_adjustment_get_value( paw->apadjLuck[(button)] ) != arLuckLevel[(flag)] ) \ { \ gchar buf[G_ASCII_DTOSTR_BUF_SIZE]; \ sprintf(sz, (string), g_ascii_formatd( buf, G_ASCII_DTOSTR_BUF_SIZE, \ - "%0.3f", (gdouble) paw->apadjLuck[(button)]->value )); \ + "%0.3f", (gdouble) gtk_adjustment_get_value( paw->apadjLuck[(button)] ) ) ); \ UserCommand(sz); \ } - + static void AnalysisOK( GtkWidget *pw, analysiswidget *paw ) { - char sz[128]; + char sz[128]; int n; gtk_widget_hide( gtk_widget_get_toplevel( pw ) ); @@ -2232,6 +2565,7 @@ static void AnalysisOK( GtkWidget *pw, analysiswidget *paw ) { SetEvalCommands( "set evaluation cubedecision eval", &paw->esEvalCube.ec, &GetEvalCube()->ec ); } + UserCommand("save settings"); outputresume(); gtk_widget_destroy( gtk_widget_get_toplevel( pw ) ); @@ -2253,8 +2587,8 @@ static void AnalysisSet( analysiswidget *paw) { fAnalyseDice ); for ( i = 0; i < 2; ++i ) - gtk_toggle_button_set_active( - GTK_TOGGLE_BUTTON( paw->apwAnalysePlayers[ i ] ), + gtk_toggle_button_set_active( + GTK_TOGGLE_BUTTON( paw->apwAnalysePlayers[ i ] ), afAnalysePlayers[ i ] ); gtk_adjustment_set_value ( GTK_ADJUSTMENT( paw->apadjSkill[0] ), @@ -2300,7 +2634,7 @@ extern void SetAnalysis(gpointer p, guint n, GtkWidget * pw) N_("Unlucky:"), N_("Very unlucky:") }; int i; AnalysisDetails *pAnalDetailSettings1, *pAnalDetailSettings2; - GtkWidget *pwDialog, *pwPage, *pwFrame, *pwLabel, *pwSpin, *pwTable; + GtkWidget *pwDialog, *pwPage, *pwFrame, *pwLabel, *pwSpin, *pwTable; GtkWidget *hboxTop, *hboxBottom, *vbox1, *vbox2, *hbox; analysiswidget aw; @@ -2348,7 +2682,7 @@ extern void SetAnalysis(gpointer p, guint n, GtkWidget * pw) char *sz = g_strdup_printf( _("Analyse player %s"), ap[ i ].szName ); aw.apwAnalysePlayers[ i ] = gtk_check_button_new_with_label ( sz ); - gtk_box_pack_start (GTK_BOX (vbox2), aw.apwAnalysePlayers[ i ], + gtk_box_pack_start (GTK_BOX (vbox2), aw.apwAnalysePlayers[ i ], FALSE, FALSE, 0); } @@ -2368,12 +2702,12 @@ extern void SetAnalysis(gpointer p, guint n, GtkWidget * pw) gtk_label_set_justify (GTK_LABEL (pwLabel), GTK_JUSTIFY_RIGHT); gtk_misc_set_alignment (GTK_MISC (pwLabel), 0, 0.5); } - + for (i = 0; i < 3; i++){ - aw.apadjSkill[i] = - GTK_ADJUSTMENT( gtk_adjustment_new( 1, 0, 1, 0.01, 10, 0 ) ); + aw.apadjSkill[i] = + GTK_ADJUSTMENT( gtk_adjustment_new( 1, 0, 1, 0.01, 0.05, 0 ) ); - pwSpin = + pwSpin = gtk_spin_button_new (GTK_ADJUSTMENT (aw.apadjSkill[i]), 1, 2); gtk_table_attach (GTK_TABLE (pwTable), pwSpin, 1, 2, i, i+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), @@ -2387,7 +2721,7 @@ extern void SetAnalysis(gpointer p, guint n, GtkWidget * pw) pwTable = gtk_table_new (4, 2, FALSE); gtk_container_add (GTK_CONTAINER (pwFrame), pwTable); - + for (i = 0; i < 4; i++){ pwLabel = gtk_label_new ( gettext ( aszLuckLabel[i] ) ); gtk_table_attach (GTK_TABLE (pwTable), pwLabel, 0, 1, i, i+1, @@ -2396,14 +2730,14 @@ extern void SetAnalysis(gpointer p, guint n, GtkWidget * pw) gtk_label_set_justify (GTK_LABEL (pwLabel), GTK_JUSTIFY_RIGHT); gtk_misc_set_alignment (GTK_MISC (pwLabel), 0, 0.5); } - + for (i = 0; i < 4; i++){ - aw.apadjLuck[i] = - GTK_ADJUSTMENT( gtk_adjustment_new( 1, 0, 1, 0.01, 10, 0 ) ); + aw.apadjLuck[i] = + GTK_ADJUSTMENT( gtk_adjustment_new( 1, 0, 1, 0.01, 0.05, 0 ) ); - pwSpin = + pwSpin = gtk_spin_button_new (GTK_ADJUSTMENT (aw.apadjLuck[i]), 1, 2); - + gtk_table_attach (GTK_TABLE (pwTable), pwSpin, 1, 2, i, i+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); @@ -2460,7 +2794,7 @@ typedef struct _playerswidget { GtkWidget *apwName[ 2 ], *apwRadio[ 2 ][ 3 ], *apwSocket[ 2 ], *apwExternal[ 2 ]; char aszSocket[ 2 ][ 128 ]; evalsetup esChequer[2]; - evalsetup esCube[2]; + evalsetup esCube[2]; AnalysisDetails *pLevelSettings[2]; } playerswidget; @@ -2490,16 +2824,16 @@ static GtkWidget *PlayersPage( playerswidget *ppw, int i, const char *title ) gtk_container_set_border_width( GTK_CONTAINER( pw ), 4 ); gtk_container_add( GTK_CONTAINER( pwVBox ), pw ); gtk_container_add( GTK_CONTAINER( pw ), - gtk_label_new( _("Name:") ) ); + gtk_label_new( _("Default Name:") ) ); gtk_container_add( GTK_CONTAINER( pw ), ppw->apwName[ i ] = gtk_entry_new() ); gtk_entry_set_text( GTK_ENTRY( ppw->apwName[ i ] ), (ppw->ap[ i ].szName) ); - + gtk_container_add( GTK_CONTAINER( pwVBox ), ppw->apwRadio[ i ][ 0 ] = gtk_radio_button_new_with_label( NULL, _("Human") ) ); - + gtk_container_add( GTK_CONTAINER( pwVBox ), ppw->apwRadio[ i ][ 1 ] = gtk_radio_button_new_with_label_from_widget( @@ -2511,7 +2845,7 @@ static GtkWidget *PlayersPage( playerswidget *ppw, int i, const char *title ) ppw->pLevelSettings[i] = CreateEvalSettings(pwVBox, _("GNU Backgammon settings"), &ppw->ap[ i ].esChequer.ec, (movefilter*)ppw->ap[ i ].aamf, &ppw->ap[ i ].esCube.ec, NULL); - + gtk_container_add( GTK_CONTAINER( pwVBox ), ppw->apwRadio[ i ][ 2 ] = gtk_radio_button_new_with_label_from_widget( @@ -2528,7 +2862,7 @@ static GtkWidget *PlayersPage( playerswidget *ppw, int i, const char *title ) if( ap[ i ].szSocket ) gtk_entry_set_text( GTK_ENTRY( ppw->apwSocket[ i ] ), ap[ i ].szSocket ); - + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( ppw->apwRadio[ i ][ ap[ i ].pt ] ), TRUE ); @@ -2536,7 +2870,7 @@ static GtkWidget *PlayersPage( playerswidget *ppw, int i, const char *title ) G_CALLBACK( PlayerTypeToggled ), ppw ); g_signal_connect( G_OBJECT( ppw->apwRadio[ i ][ 2 ] ), "toggled", G_CALLBACK( PlayerTypeToggled ), ppw ); - + return pwFrame; } @@ -2548,7 +2882,7 @@ static void PlayersOK( GtkWidget *pw, playerswidget *pplw ) { for( i = 0; i < 2; i++ ) { strcpyn( pplw->ap[ i ].szName, gtk_entry_get_text( GTK_ENTRY( pplw->apwName[ i ] ) ), MAX_NAME_LEN ); - + for( j = 0; j < 3; j++ ) if( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( pplw->apwRadio[ i ][ j ] ) ) ) { @@ -2596,19 +2930,13 @@ static void SetPlayers(gpointer p, guint n, GtkWidget *pw) { outputpostpone(); - if (!CompareNames(apTemp[0].szName, ap[1].szName) && CompareNames(apTemp[0].szName, apTemp[1].szName)) { /* Trying to swap names - change current name to avoid error */ - sprintf(ap[1].szName, "_%s", apTemp[0].szName); - } + sprintf(sz, "set defaultnames \"%s\" \"%s\"", apTemp[0].szName, apTemp[1].szName); + UserCommand(sz); + for (i = 0; i < 2; i++) { /* NB: this comparison is case-sensitive, and does not use CompareNames(), so that the user can modify the case of names. */ - if (strcmp(ap[i].szName, apTemp[i].szName)) { - sprintf(sz, "set player %d name %s", i, - apTemp[i].szName); - UserCommand(sz); - } - switch (apTemp[i].pt) { case PLAYER_HUMAN: if (ap[i].pt != PLAYER_HUMAN) { @@ -2656,6 +2984,7 @@ static void SetPlayers(gpointer p, guint n, GtkWidget *pw) } } + UserCommand("save settings"); outputresume(); } } @@ -2679,6 +3008,7 @@ static char *aaszLang[][ 3 ] = { { N_("Icelandic"), "is_IS", "flags/iceland.png" }, { N_("Italian"), "it_IT", "flags/italy.png" }, { N_("Japanese"), "ja_JP", "flags/japan.png" }, + { N_("Romanian"), "ro_RO", "flags/romania.png" }, { N_("Russian"), "ru_RU", "flags/russia.png" }, { N_("Spanish"), "es_ES", "flags/spain.png" }, { N_("Turkish"), "tr_TR", "flags/turkey.png" }, @@ -2744,7 +3074,7 @@ static gboolean FlagClicked(GtkWidget *pw, GdkEventButton *event, void* dummy) eb = gtk_bin_get_child(GTK_BIN(frame)); gtk_frame_set_shadow_type(GTK_FRAME(gtk_bin_get_child(GTK_BIN(pw))), GTK_SHADOW_ETCHED_OUT); - gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, &pwMain->style->bg[GTK_STATE_SELECTED]); + gtk_widget_modify_bg(eb, GTK_STATE_NORMAL, >k_widget_get_style( pwMain )->bg[GTK_STATE_SELECTED]); if (SetupLanguage((char *) g_object_get_data(G_OBJECT(curSel), "lang"))) /* Immediately translate this dialog */ @@ -2767,13 +3097,13 @@ static GtkWidget *GetFlagWidget(char *language, char *langCode, const char *flag GError *pix_error = NULL; eb = gtk_event_box_new(); - gtk_widget_modify_bg(eb, GTK_STATE_INSENSITIVE, &pwMain->style->bg[GTK_STATE_NORMAL]); + gtk_widget_modify_bg(eb, GTK_STATE_INSENSITIVE, >k_widget_get_style( pwMain )->bg[GTK_STATE_NORMAL]); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); gtk_container_add( GTK_CONTAINER( eb ), frame ); eb2 = gtk_event_box_new(); - gtk_widget_modify_bg(eb2, GTK_STATE_INSENSITIVE, &pwMain->style->bg[GTK_STATE_NORMAL]); + gtk_widget_modify_bg(eb2, GTK_STATE_INSENSITIVE, >k_widget_get_style( pwMain )->bg[GTK_STATE_NORMAL]); gtk_container_add( GTK_CONTAINER( frame ), eb2 ); vbox = gtk_vbox_new( FALSE, 5 ); @@ -2922,26 +3252,185 @@ static void ReportBug(gpointer p, guint n, GtkWidget * pwEvent) OpenURL("http://savannah.gnu.org/bugs/?func=additem&group=gnubg"); } +#if (USE_GTKUIMANAGER) + +static GtkActionEntry actionEntries[] = { + { "FileMenuAction", NULL, N_("_File") }, + { "FileNewAction", GTK_STOCK_NEW, N_("_New..."), "<control>N", NULL, G_CALLBACK(NewClicked) }, + { "FileOpenAction", GTK_STOCK_OPEN, N_("_Open"), "<control>O", NULL, G_CALLBACK(GTKOpen) }, + { "FileSaveAction", GTK_STOCK_SAVE, N_("_Save"), "<control>S", NULL, G_CALLBACK(GTKSave) }, + { "FileCommandsOpenAction", NULL, N_("Open _Commands..."), NULL, NULL, G_CALLBACK(GTKCommandsOpen) }, + { "FileMatchInfoAction", NULL, N_("Match information..."), NULL, NULL, G_CALLBACK(GTKMatchInfo) }, +#ifdef WIN32 + { "FileExitAction", NULL, N_("E_xit"), "<control>Q", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_QUIT) }, +#else + { "FileExitAction", NULL, N_("_Quit"), "<control>Q", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_QUIT) }, +#endif + + { "EditMenuAction", NULL, N_("_Edit") }, + { "UndoAction", GTK_STOCK_UNDO, N_("_Undo"), "<control>Z", NULL, G_CALLBACK(GTKUndo) }, + { "CopyIDMenuAction", NULL, N_("_Copy ID to Clipboard") }, + { "CopyGNUBGIDAction", NULL, N_("GNUbg ID"), "<control>C", NULL, G_CALLBACK(CopyIDs) }, + { "CopyMatchIDAction", NULL, N_("Match ID"), "<control>M", NULL, G_CALLBACK(CopyMatchID) }, + { "CopyPositionIDAction", NULL, N_("Position ID"), "<control>P", NULL, G_CALLBACK(CopyPositionID) }, + + { "CopyAsMenuAction", NULL, N_("Copy as") }, + { "CopyPosAsAsciiAction", NULL, N_("Position as ASCII"), NULL, NULL, G_CALLBACK(CommandCopy) }, + { "CopyAsGammOnLineAction", NULL, N_("GammOnLine (HTML)"), NULL, NULL, G_CALLBACK(CopyAsGOL) }, + { "CopyAsBackgammonBaseAction", NULL, N_("BackgammonBase.com (URL)"), NULL, NULL, G_CALLBACK(CopyAsBGbase) }, + + { "PasteIDAction", GTK_STOCK_PASTE, N_("_Paste ID"), "<control>V", NULL, G_CALLBACK(PasteIDs) }, + + { "ViewMenuAction", NULL, N_("_View") }, + { "PanelsMenuAction", NULL, N_("_Panels") }, + + { "RestorePanelsAction", NULL, N_("Restore panels"), NULL, NULL, G_CALLBACK(ShowAllPanels) }, + { "HidePanelsAction", NULL, N_("Hide panels"), NULL, NULL, G_CALLBACK(HideAllPanels) }, + + { "ToolBarMenuAction", NULL, N_("_Toolbar") }, + { "HideToolBarAction", NULL, N_("_Hide Toolbar"), NULL, NULL, G_CALLBACK(HideToolbar) }, + { "ShowToolBarAction", NULL, N_("_Show Toolbar"), NULL, NULL, G_CALLBACK(ShowToolbar) }, + +#if USE_BOARD3D + { "SwitchModeAction", NULL, N_("Switch to xD view"), NULL, NULL, G_CALLBACK(SwitchDisplayMode) }, +#endif + + { "GameMenuAction", NULL, N_("_Game") }, + { "RollAction", NULL, N_("_Roll"), "<control>R", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ROLL) }, + { "FinishMoveAction", NULL, N_("_Finish move"), "<control>F", NULL, G_CALLBACK(FinishMove) }, + { "DoubleAction", GNUBG_STOCK_DOUBLE, N_("_Double"), "<control>D", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_DOUBLE) }, + { "ResignAction", GNUBG_STOCK_RESIGN, N_("Re_sign"), NULL, NULL, G_CALLBACK(GTKResign) }, + { "AcceptAction", GNUBG_STOCK_ACCEPT, N_("_Accept"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ACCEPT) }, + { "RejectAction", GNUBG_STOCK_REJECT, N_("Re_ject"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_REJECT) }, + { "PlayComputerTurnAction", NULL, N_("Play computer turn"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_PLAY) }, + { "EndGameAction", GNUBG_STOCK_END_GAME, N_("_End Game"), "<control>G", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_END_GAME) }, + { "SwapPlayersAction", NULL, N_("Swap players"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SWAP_PLAYERS) }, + { "SetCubeAction", NULL, N_("Set cube..."), NULL, NULL, G_CALLBACK(GTKSetCube) }, + { "SetDiceAction", NULL, N_("Set _dice..."), NULL, NULL, G_CALLBACK(GTKSetDice) }, + + { "SetTurnMenuAction", NULL, N_("Set _turn") }, + + { "ClearTurnAction", NULL, N_("Clear turn"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CLEAR_TURN) }, + + { "AnalyseMenuAction", NULL, N_("_Analyse") }, + { "EvaluateAction", NULL, N_("_Evaluate"), "<control>E", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_EVAL) }, + { "HintAction", GNUBG_STOCK_HINT, N_("_Hint"), "<control>H", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_HINT) }, + { "RolloutAction", NULL, N_("_Rollout"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ROLLOUT) }, + { "AnalyseMoveAction", NULL, N_("Analyse move"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_MOVE) }, + { "AnalyseGameAction", NULL, N_("Analyse game"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_GAME) }, + { "AnalyseMatchAction", NULL, N_("Analyse match or session"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_MATCH) }, + + { "ClearAnalysisMenuAction", NULL, N_("Clear analysis") }, + { "ClearAnalysisMoveAction", GTK_STOCK_CLEAR, N_("Move"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_CLEAR_MOVE) }, + { "ClearAnalysisGameAction", GTK_STOCK_CLEAR, N_("_Game"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_CLEAR_GAME) }, + { "ClearAnalysisMatchOrSessionAction", GTK_STOCK_CLEAR, N_("_Match or session"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_CLEAR_MATCH) }, + + { "CMarkMenuAction", NULL, N_("CMark") }, + { "CMarkCubeMenuAction", NULL, N_("Cube") }, + { "CMarkCubeClearAction", NULL, N_("Clear"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_CUBE_CLEAR) }, + { "CMarkCubeShowAction", NULL, N_("Show"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_CUBE_SHOW) }, + { "CMarkMoveMenuAction", NULL, N_("Move") }, + { "CMarkMoveClearAction", NULL, N_("Clear"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_MOVE_CLEAR) }, + { "CMarkMoveShowAction", NULL, N_("Show"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_MOVE_SHOW) }, + { "CMarkGameMenuAction", NULL, N_("Game") }, + { "CMarkGameClearAction", NULL, N_("Clear"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_GAME_CLEAR) }, + { "CMarkGameShowAction", NULL, N_("Show"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_GAME_SHOW) }, + { "CMarkMatchMenuAction", NULL, N_("Match") }, + { "CMarkMatchClearAction", NULL, N_("Clear"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_MATCH_CLEAR) }, + { "CMarkMatchShowAction", NULL, N_("Show"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_CMARK_MATCH_SHOW) }, + + { "RolloutMenuAction", NULL, N_("Rollout") }, + { "RolloutCubeAction", NULL, N_("Cube"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_ROLLOUT_CUBE) }, + { "RolloutMoveAction", NULL, N_("Move"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_ROLLOUT_MOVE) }, + { "RolloutGameAction", NULL, N_("Game"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_ROLLOUT_GAME) }, + { "RolloutMatchAction", NULL, N_("Match"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_ANALYSE_ROLLOUT_MATCH) }, + + { "BatchAnalyseAction", NULL, N_("Batch analyse..."), NULL, NULL, G_CALLBACK (GTKBatchAnalyse) }, + { "MatchOrSessionStatsAction", NULL, N_("Match or session statistics"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_STATISTICS_MATCH) }, + { "AddMatchOrSessionStatsToDBAction", GTK_STOCK_ADD, N_("Add match or session to database"), NULL, NULL, G_CALLBACK (GtkRelationalAddMatch) }, + { "ShowRecordsAction", NULL, N_("Show Records"), NULL, NULL, G_CALLBACK (GtkShowRelational) }, + { "DistributionOfRollsAction", NULL, N_("Distribution of rolls"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_ROLLS) }, + { "TemperatureMapAction", NULL, N_("Temperature Map"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_TEMPERATURE_MAP) }, + { "TemperatureMapCubeAction", NULL, N_("Temperature Map (cube decision)"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_TEMPERATURE_MAP_CUBE) }, + { "RaceTheoryAction", NULL, N_("_Race Theory"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_KLEINMAN) }, + { "MarketWindowAction", NULL, N_("_Market window"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_MARKETWINDOW) }, + { "MatchEquityTableAction", NULL, N_("M_atch equity table"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_MATCHEQUITYTABLE) }, + { "EvaluationSpeedAction", NULL, N_("Evaluation speed"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_CALIBRATION) }, + + { "SettingsMenuAction", NULL, N_("_Settings") }, + { "SettingsAnalysisAction", NULL, N_("_Analysis..."), NULL, NULL, G_CALLBACK (SetAnalysis) }, + { "SettingsBoardAppearanceAction", NULL, N_("_Board Appearance..."), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SET_APPEARANCE) }, + { "SettingsExportAction", NULL, N_("E_xport..."), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_EXPORT) }, + { "SettingsPlayersAction", NULL, N_("_Players..."), NULL, NULL, G_CALLBACK (SetPlayers) }, + { "SettingsRolloutsAction", NULL, N_("_Rollouts..."), NULL, NULL, G_CALLBACK (SetRollouts) }, + { "SettingsOptionsAction", NULL, N_("_Options..."), NULL, NULL, G_CALLBACK (SetOptions) }, + { "SettingsLanguageAction", NULL, N_("_Language..."), NULL, NULL, G_CALLBACK (SetLanguage) }, + + { "GoMenuAction", NULL, N_("G_o") }, + { "GoPreviousMarkedMoveAction", GNUBG_STOCK_GO_PREV_MARKED, N_("Previous marked move"), "<shift><control>Page_Up", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_PREV_MARKED) }, + { "GoPreviousCMarkedMoveAction", GNUBG_STOCK_GO_PREV_CMARKED, N_("Previous cmarked move"), "<shift>Page_Up", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_PREV_CMARKED) }, + { "GoPreviousRollAction", GNUBG_STOCK_GO_PREV, N_("Previous rol_l"), "Page_Up", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_PREV_ROLL) }, + { "GoPreviousGameAction", GNUBG_STOCK_GO_PREV_GAME, N_("Pre_vious game"), "<control>Page_Up", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_PREV_GAME) }, + { "GoNextGameAction", GNUBG_STOCK_GO_NEXT_GAME, N_("Next _game"), "<control>Page_Down", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_NEXT_GAME) }, + { "GoNextRollAction", GNUBG_STOCK_GO_NEXT, N_("Next _roll"), "Page_Down", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_NEXT_ROLL) }, + { "GoNextCMarkedMoveAction", GNUBG_STOCK_GO_NEXT_CMARKED, N_("Next cmarked move"), "<shift>Page_Down", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_NEXT_CMARKED) }, + { "GoNextMarkedMoveAction", GNUBG_STOCK_GO_NEXT_MARKED, N_("Next marked move"), "<shift><control>Page_Down", NULL, CMD_ACTION_CALLBACK_FROMID(CMD_NEXT_MARKED) }, + + { "HelpMenuAction", NULL, N_("_Help") }, + { "HelpCommandsAction", NULL, N_("_Commands"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_HELP) }, + { "HelpManualAllAboutAction", NULL, N_("_Manual (all about)"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_MANUAL_ABOUT) }, + { "HelpManualWebAction", NULL, N_("Manual (_web)"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_MANUAL_WEB) }, + { "HelpAboutGNUBGAction", GTK_STOCK_ABOUT, N_("_About gnubg"), NULL, NULL, CMD_ACTION_CALLBACK_FROMID(CMD_SHOW_VERSION) } +}; + +static GtkToggleActionEntry toggleActionEntries[] = { + { "EditPositionAction", GTK_STOCK_EDIT, N_("_Edit Position"), NULL, NULL, G_CALLBACK(ToggleEdit) }, + + { "PanelGameRecordAction", NULL, N_("_Game record"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_GAMELIST) }, /* TOGGLE */ + { "PanelAnalysisAction", NULL, N_("_Analysis"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_ANALYSIS) }, /* TOGGLE */ + { "PanelCommentaryAction", NULL, N_("_Commentary"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_COMMENTARY) }, /* TOGGLE */ + { "PanelMessageAction", NULL, N_("_Message"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_MESSAGE) }, /* TOGGLE */ + { "PanelTheoryAction", NULL, N_("_Theory"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_THEORY) }, /* TOGGLE */ + { "PanelCommandAction", NULL, N_("Command"), NULL, NULL, GENERIC_TOGGLE_CALLBACK_FROMID(TOGGLE_COMMAND) }, /* TOGGLE */ + + { "DockPanelsAction", NULL, N_("_Dock panels"), NULL, NULL, G_CALLBACK(ToggleDockPanels) }, + { "ShowIDStatusBarAction", NULL, N_("Show _ID in status bar"), NULL, NULL, G_CALLBACK(ToggleShowingIDs) }, /* TOGGLE */ + { "FullScreenAction", NULL, N_("Full screen"), "F11", NULL, G_CALLBACK(DoFullScreenMode) }, /* TOGGLE */ + { "PlayClockwiseAction", NULL, N_("Play _Clockwise"), NULL, NULL, G_CALLBACK(ToggleClockwise) } /* TOGGLE */ +}; + +static GtkRadioActionEntry toolbarRadioActionEntries[] = { + { "TextOnlyToolBarAction", NULL, N_("_Text only"), NULL, NULL, VIEW_TOOLBAR_TEXTONLY }, + { "IconsOnlyToolBarAction", NULL, N_("_Icons only"), NULL, NULL, VIEW_TOOLBAR_ICONSONLY }, + { "BothToolBarAction", NULL, N_("_Both"), NULL, NULL, VIEW_TOOLBAR_BOTH } +}; + +static GtkRadioActionEntry setTurnRadioActionEntries[] = { + { "SetTurnPlayer0Action", NULL, "0", NULL, NULL, CMD_SET_TURN_0 }, + { "SetTurnPlayer1Action", NULL, "1", NULL, NULL, CMD_SET_TURN_1 }, +}; + +#else GtkItemFactoryEntry aife[] = { { N_("/_File"), NULL, NULL, 0, "<Branch>", NULL }, { N_("/_File/_New..."), "<control>N", NewClicked, 0, "<StockItem>", GTK_STOCK_NEW }, - { N_("/_File/_Open..."), "<control>O", GTKOpen, 0, + { N_("/_File/_Open..."), "<control>O", GTKOpen, 0, "<StockItem>", GTK_STOCK_OPEN }, - { N_("/_File/_Save..."), "<control>S", GTKSave, 0, + { N_("/_File/_Save..."), "<control>S", GTKSave, 0, "<StockItem>", GTK_STOCK_SAVE }, { N_("/_File/-"), NULL, NULL, 0, "<Separator>", NULL }, - { N_("/_File/Open _Commands..."), NULL, GTKCommandsOpen, 0, + { N_("/_File/Open _Commands..."), NULL, GTKCommandsOpen, 0, NULL, NULL }, { N_("/_File/-"), NULL, NULL, 0, "<Separator>", NULL }, { N_("/_File/Match information..."), NULL, GTKMatchInfo, 0, NULL, NULL }, { N_("/_File/-"), NULL, NULL, 0, "<Separator>", NULL }, - { + { #ifdef WIN32 N_("/_File/E_xit"), #else @@ -2950,22 +3439,25 @@ GtkItemFactoryEntry aife[] = { "<control>Q", Command, CMD_QUIT, "<StockItem>", GTK_STOCK_QUIT }, { N_("/_Edit"), NULL, NULL, 0, "<Branch>", NULL }, - { N_("/_Edit/_Undo"), "<control>Z", GTKUndo, 0, + { N_("/_Edit/_Undo"), "<control>Z", GTKUndo, 0, "<StockItem>", GTK_STOCK_UNDO }, { N_("/_Edit/-"), NULL, NULL, 0, "<Separator>", NULL }, - { N_("/_Edit/_Copy Position ID"), "<control>C", CopyIDs, 0, - "<StockItem>", GTK_STOCK_COPY - }, + { N_("/_Edit/_Copy ID to Clipboard"), NULL, NULL, 0, "<Branch>", NULL }, + { N_("/_Edit/_Copy ID to Clipboard/GNUbg ID"), "<control>C", CopyIDs, 0, NULL, NULL }, + { N_("/_Edit/_Copy ID to Clipboard/Match ID"), "<control>M", CopyMatchID, 0, NULL, NULL }, + { N_("/_Edit/_Copy ID to Clipboard/Position ID"), "<control>P", CopyPositionID, 0, NULL, NULL }, { N_("/_Edit/Copy as"), NULL, NULL, 0, "<Branch>", NULL }, { N_("/_Edit/Copy as/Position as ASCII"), NULL, CommandCopy, 0, NULL, NULL }, { N_("/_Edit/Copy as/GammOnLine (HTML)"), NULL, CopyAsGOL, 0, NULL, NULL }, + { N_("/_Edit/Copy as/BackgammonBase.com (URL)"), NULL, + CopyAsBGbase, 0, NULL, NULL }, - { N_("/_Edit/_Paste Position ID"), "<control>V", PasteIDs, 0, + { N_("/_Edit/_Paste ID"), "<control>V", PasteIDs, 0, "<StockItem>", GTK_STOCK_PASTE}, { N_("/_Edit/-"), NULL, NULL, 0, "<Separator>", NULL }, @@ -3028,7 +3520,7 @@ GtkItemFactoryEntry aife[] = { { N_("/_Game/Set cube..."), NULL, GTKSetCube, 0, NULL, NULL }, { N_("/_Game/Set _dice..."), NULL, GTKSetDice, 0, NULL, NULL }, { N_("/_Game/Set _turn"), NULL, NULL, 0, "<Branch>", NULL }, - { N_("/_Game/Set turn/0"), + { N_("/_Game/Set turn/0"), NULL, Command, CMD_SET_TURN_0, "<RadioItem>", NULL }, { N_("/_Game/Set turn/1"), NULL, Command, CMD_SET_TURN_1, "/Game/Set turn/0", NULL }, @@ -3039,23 +3531,23 @@ GtkItemFactoryEntry aife[] = { "<StockItem>", GNUBG_STOCK_HINT}, { N_("/_Analyse/_Rollout"), NULL, Command, CMD_ROLLOUT, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "<Separator>", NULL }, - { N_("/_Analyse/Analyse move"), + { N_("/_Analyse/Analyse move"), NULL, Command, CMD_ANALYSE_MOVE, NULL, NULL }, - { N_("/_Analyse/Analyse game"), + { N_("/_Analyse/Analyse game"), NULL, Command, CMD_ANALYSE_GAME, NULL, NULL }, - { N_("/_Analyse/Analyse match or session"), + { N_("/_Analyse/Analyse match or session"), NULL, Command, CMD_ANALYSE_MATCH, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "<Separator>", NULL }, { N_("/_Analyse/Clear analysis"), NULL, NULL, 0, "<Branch>", NULL }, - { N_("/_Analyse/Clear analysis/Move"), - NULL, Command, CMD_ANALYSE_CLEAR_MOVE, + { N_("/_Analyse/Clear analysis/Move"), + NULL, Command, CMD_ANALYSE_CLEAR_MOVE, "<StockItem>", GTK_STOCK_CLEAR }, - { N_("/_Analyse/Clear analysis/_Game"), + { N_("/_Analyse/Clear analysis/_Game"), NULL, Command, CMD_ANALYSE_CLEAR_GAME, "<StockItem>", GTK_STOCK_CLEAR }, - { N_("/_Analyse/Clear analysis/_Match or session"), + { N_("/_Analyse/Clear analysis/_Match or session"), NULL, Command, CMD_ANALYSE_CLEAR_MATCH, "<StockItem>", GTK_STOCK_CLEAR }, @@ -3086,22 +3578,20 @@ GtkItemFactoryEntry aife[] = { { N_("/_Analyse/Match or session statistics"), NULL, Command, CMD_SHOW_STATISTICS_MATCH, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "<Separator>", NULL }, - { N_("/_Analyse/Old Player records"), NULL, Command, - CMD_RECORD_SHOW, NULL, NULL }, { N_("/_Analyse/Add match or session to database"), NULL, GtkRelationalAddMatch, 0, "<StockItem>", GTK_STOCK_ADD}, { N_("/_Analyse/Show Records"), NULL, GtkShowRelational, 0, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "<Separator>", NULL }, - { N_("/_Analyse/Distribution of rolls"), NULL, Command, + { N_("/_Analyse/Distribution of rolls"), NULL, Command, CMD_SHOW_ROLLS, NULL, NULL }, - { N_("/_Analyse/Temperature Map"), NULL, Command, + { N_("/_Analyse/Temperature Map"), NULL, Command, CMD_SHOW_TEMPERATURE_MAP, NULL, NULL }, - { N_("/_Analyse/Temperature Map (cube decision)"), NULL, Command, + { N_("/_Analyse/Temperature Map (cube decision)"), NULL, Command, CMD_SHOW_TEMPERATURE_MAP_CUBE, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "<Separator>", NULL }, - { N_("/_Analyse/_Race Theory"), + { N_("/_Analyse/_Race Theory"), NULL, Command, CMD_SHOW_KLEINMAN, NULL, NULL }, { N_("/_Analyse/-"), NULL, NULL, 0, "<Separator>", NULL }, { N_("/_Analyse/_Market window"), NULL, Command, CMD_SHOW_MARKETWINDOW, @@ -3122,9 +3612,6 @@ GtkItemFactoryEntry aife[] = { { N_("/_Settings/-"), NULL, NULL, 0, "<Separator>", NULL }, { N_("/_Settings/_Options..."), NULL, SetOptions, 0, NULL, NULL }, { N_("/_Settings/_Language..."), NULL, SetLanguage, 0, NULL, NULL }, - { N_("/_Settings/-"), NULL, NULL, 0, "<Separator>", NULL }, - { N_("/_Settings/_Save settings"), - NULL, Command, CMD_SAVE_SETTINGS, NULL, NULL }, { N_("/G_o"), NULL, NULL, 0, "<Branch>", NULL }, { N_("/G_o/Previous marked move"), "<shift><control>Page_Up", Command, CMD_PREV_MARKED, "<StockItem>", GNUBG_STOCK_GO_PREV_MARKED }, { N_("/G_o/Previous cmarked move"), "<shift>Page_Up", Command, CMD_PREV_CMARKED, "<StockItem>", GNUBG_STOCK_GO_PREV_CMARKED }, @@ -3138,15 +3625,16 @@ GtkItemFactoryEntry aife[] = { { N_("/_Help"), NULL, NULL, 0, "<Branch>", NULL }, { N_("/_Help/_Commands"), NULL, Command, CMD_HELP, NULL, NULL }, { N_("/_Help/-"), NULL, NULL, 0, "<Separator>", NULL }, - { N_("/_Help/_Manual (all about)"), NULL, Command, + { N_("/_Help/_Manual (all about)"), NULL, Command, CMD_SHOW_MANUAL_ABOUT, NULL, NULL }, - { N_("/_Help/Manual (_web)"), NULL, Command, + { N_("/_Help/Manual (_web)"), NULL, Command, CMD_SHOW_MANUAL_WEB, NULL, NULL }, { N_("/_Help/-"), NULL, NULL, 0, "<Separator>", NULL }, { N_("/_Help/_About gnubg"), NULL, Command, CMD_SHOW_VERSION, "<StockItem>", GTK_STOCK_ABOUT } }; +#endif extern int automaticTask; @@ -3173,8 +3661,9 @@ static void Stop( GtkWidget *pw, gpointer unused ) static gboolean StopAnyAnimations(void) { - BoardData *bd = BOARD( pwBoard )->board_data; #if USE_BOARD3D + BoardData *bd = BOARD( pwBoard )->board_data; + if (display_is_3d(bd->rd)) { if (Animating3d(bd->bd3d)) @@ -3203,11 +3692,15 @@ static void StopNotButton( GtkWidget *pw, gpointer unused ) static void FileDragDropped(GtkWidget *widget, GdkDragContext * drag_context, gint x, gint y, GtkSelectionData * data, guint info, guint time) { - if (data->length > 0) { + gchar **list; + list = g_uri_list_extract_uris( (gchar *)gtk_selection_data_get_data( data ) ); + + if ( list[0] ){ char *next, *file, *quoted; - char *uri = (char *)data->data; + char *uri = (char *)list[0]; if (StrNCaseCmp("file:", uri, 5) != 0) { outputerrf(_("Only local files supported in dnd")); + g_strfreev( list ); return; } @@ -3215,6 +3708,7 @@ static void FileDragDropped(GtkWidget *widget, GdkDragContext * drag_context, if (!file) { outputerrf(_("Failed to parse uri")); + g_strfreev( list ); return; } @@ -3226,6 +3720,9 @@ static void FileDragDropped(GtkWidget *widget, GdkDragContext * drag_context, g_free(quoted); g_free(file); } + + if ( list ) + g_strfreev( list ); } @@ -3242,7 +3739,11 @@ static gboolean ContextMenu(GtkWidget *widget, GdkEventButton *event, GtkWidget* static void CreateMainWindow(void) { GtkWidget *pwVbox, *pwHbox, *pwHbox2, *pwHandle, *pwPanelHbox, *pwStopButton, *idMenu, *menu_item, *pwFrame; +#ifdef GTK_TARGET_OTHER_APP /* gtk 2.12+ */ GtkTargetEntry fileDrop = {"text/uri-list", GTK_TARGET_OTHER_APP, 1}; +#else + GtkTargetEntry fileDrop = {"text/uri-list", 0, 1}; +#endif pwMain = gtk_window_new( GTK_WINDOW_TOPLEVEL ); gtk_window_maximize(GTK_WINDOW(pwMain)); @@ -3257,6 +3758,39 @@ static void CreateMainWindow(void) gtk_container_add( GTK_CONTAINER( pwMain ), pwVbox = gtk_vbox_new( FALSE, 0 ) ); +#if (USE_GTKUIMANAGER) + GError *error = NULL; + GtkActionGroup *action_group; + + puim = gtk_ui_manager_new (); + + action_group = gtk_action_group_new ("Actions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + gtk_action_group_add_actions (action_group, actionEntries, G_N_ELEMENTS (actionEntries), NULL); + gtk_action_group_add_toggle_actions (action_group, toggleActionEntries, G_N_ELEMENTS (toggleActionEntries), NULL); + gtk_action_group_add_radio_actions (action_group, toolbarRadioActionEntries, G_N_ELEMENTS (toolbarRadioActionEntries), 0, GENERIC_RADIO_CALLBACK_FROMID(VIEW_TOOLBAR_ICONSONLY), NULL ); + gtk_action_group_add_radio_actions (action_group, setTurnRadioActionEntries, G_N_ELEMENTS (setTurnRadioActionEntries), 0, CMD_RADIO_CALLBACK_FROMID(CMD_SET_TURN_0), NULL ); + gtk_ui_manager_insert_action_group (puim, action_group, 0); + + gtk_ui_manager_add_ui_from_string (puim, GNUBG_MAIN_UI, -1, &error); + if (error) { + g_warning ("Cannot load UI: %s", error->message); + g_error_free (error); + error = NULL; + } +#if USE_BOARD3D + gtk_ui_manager_add_ui_from_string (puim, UIADDITIONS3D, -1, &error); + if (error) { + g_warning ("Cannot load UI: %s", error->message); + g_error_free (error); + error = NULL; + } +#endif + /* Bind the accelerators */ + gtk_window_add_accel_group (GTK_WINDOW (pwMain), pagMain = gtk_ui_manager_get_accel_group (puim)); + + +#else pagMain = gtk_accel_group_new(); pif = gtk_item_factory_new( GTK_TYPE_MENU_BAR, "<main>", pagMain ); @@ -3264,25 +3798,28 @@ static void CreateMainWindow(void) gtk_item_factory_create_items( pif, sizeof( aife ) / sizeof( aife[ 0 ] ), aife, NULL ); - if (!records_exist()) - gtk_item_factory_delete_item(pif, "/Analyse/Old Player records"); - - /* Tick default toolbar style */ - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget_by_action(pif, nToolbarStyle + TOOLBAR_ACTION_OFFSET)), TRUE); + /* Tick default toolbar style */ + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget_by_action(pif, nToolbarStyle + TOOLBAR_ACTION_OFFSET)), TRUE); gtk_window_add_accel_group( GTK_WINDOW( pwMain ), pagMain ); - +#endif gtk_box_pack_start( GTK_BOX( pwVbox ), pwHandle = gtk_handle_box_new(), FALSE, FALSE, 0 ); - gtk_container_add( GTK_CONTAINER( pwHandle ), +#if (USE_GTKUIMANAGER) + pwMenuBar = gtk_ui_manager_get_widget (puim, "/MainMenu"); + gtk_container_add( GTK_CONTAINER( pwHandle ), pwMenuBar ); + +#else + gtk_container_add( GTK_CONTAINER( pwHandle ), pwMenuBar = gtk_item_factory_get_widget( pif, "<main>" )); +#endif gtk_box_pack_start( GTK_BOX( pwVbox ), pwHandle = gtk_handle_box_new(), FALSE, TRUE, 0 ); gtk_container_add( GTK_CONTAINER( pwHandle ), pwToolbar = ToolbarNew() ); - + gtk_box_pack_start( GTK_BOX( pwVbox ), pwGameBox = gtk_hbox_new(FALSE, 0), TRUE, TRUE, 0 ); @@ -3302,10 +3839,15 @@ static void CreateMainWindow(void) gtk_paned_pack2(GTK_PANED(hpaned), pwPanelHbox, FALSE, FALSE); gtk_box_pack_start( GTK_BOX( pwPanelHbox ), pwPanelVbox = gtk_vbox_new( FALSE, 1 ), TRUE, TRUE, 0); + /* Do this so that the menu is packed now instead of in the idle loop */ +#if (USE_GTKUIMANAGER) + gtk_ui_manager_ensure_update (puim); +#endif + DockPanels(); /* Status bar */ - + gtk_box_pack_end( GTK_BOX( pwVbox ), pwHbox = gtk_hbox_new( FALSE, 0 ), FALSE, FALSE, 0 ); gtk_box_pack_start( GTK_BOX( pwHbox ), pwStatus = gtk_statusbar_new(), @@ -3314,8 +3856,8 @@ static void CreateMainWindow(void) gtk_statusbar_set_has_resize_grip( GTK_STATUSBAR( pwStatus ), FALSE ); /* It's a bit naughty to access pwStatus->label, but its default alignment is ugly, and GTK gives us no other way to change it. */ - gtk_misc_set_alignment( GTK_MISC( GTK_STATUSBAR( pwStatus )->label ), - 0.0f, 0.5f ); + gtk_misc_set_alignment( GTK_MISC( get_statusbar_label (GTK_STATUSBAR( pwStatus ) ) ), + 0.0f, 0.5f ); idOutput = gtk_statusbar_get_context_id( GTK_STATUSBAR( pwStatus ), "gnubg output" ); idProgress = gtk_statusbar_get_context_id( GTK_STATUSBAR( pwStatus ), @@ -3341,7 +3883,7 @@ static void CreateMainWindow(void) pwHbox2 = gtk_hbox_new( FALSE, 0 ); gtk_container_add(GTK_CONTAINER(pwIDBox), pwHbox2); - gtk_box_pack_start( GTK_BOX( pwHbox2 ), gtk_label_new("Gnubg id:"), FALSE, FALSE, 0 ); + gtk_box_pack_start( GTK_BOX( pwHbox2 ), gtk_label_new("GNUbg ID:"), FALSE, FALSE, 0 ); pwFrame = gtk_frame_new(NULL); gtk_box_pack_start( GTK_BOX( pwHbox2 ), pwFrame, FALSE, FALSE, 0 ); @@ -3419,8 +3961,6 @@ static void gnubg_set_default_icon(void) } extern void InitGTK(int *argc, char ***argv) { -#include "xpm/gnu.xpm" -#include "xpm/question.xpm" char *sz; GtkIconFactory *pif; GdkAtom cb; @@ -3450,19 +3990,11 @@ extern void InitGTK(int *argc, char ***argv) /*add two xpm based icons*/ pif = gtk_icon_factory_new(); gtk_icon_factory_add_default(pif); - gtk_icon_factory_add(pif, GTK_STOCK_DIALOG_GNU, - gtk_icon_set_new_from_pixbuf - (gdk_pixbuf_new_from_xpm_data - ((const char **) gnu_xpm))); - gtk_icon_factory_add(pif, GTK_STOCK_DIALOG_GNU_QUESTION, - gtk_icon_set_new_from_pixbuf - (gdk_pixbuf_new_from_xpm_data - ((const char **) question_xpm))); #if (GTK_MAJOR_VERSION < 3) && (GTK_MINOR_VERSION < 12) ptt = gtk_tooltips_new(); #endif - + gnubg_set_default_icon(); CreateMainWindow(); @@ -3474,9 +4006,10 @@ extern void InitGTK(int *argc, char ***argv) clipboard = gtk_clipboard_get(cb); } + #ifndef WIN32 static gint python_run_file (gpointer file) -{ +{ char *pch; g_assert(file); pch = g_strdup_printf(">import sys;" @@ -3509,11 +4042,12 @@ extern void RunGTK( GtkWidget *pwSplash, char *commands, char *python_script, ch GTKSet( ap ); GTKSet( &ms.fTurn ); GTKSet( &ms.gs ); - + GTKSet( &ms.fJacoby ); + PushSplash ( pwSplash, _("Rendering"), _("Board") ); GTKAllowStdin(); - + if( fTTY ) { #if HAVE_LIBREADLINE fReadingCommand = TRUE; @@ -3530,13 +4064,18 @@ extern void RunGTK( GtkWidget *pwSplash, char *commands, char *python_script, ch GTKSet( &fShowIDs); /* Set the default arrow cursor in the stop window so obvious it can be clicked */ - gdk_window_set_cursor(pwStop->window, gdk_cursor_new(GDK_ARROW)); + gdk_window_set_cursor(gtk_widget_get_window( pwStop ), gdk_cursor_new(GDK_ARROW)); /* Make sure toolbar looks correct */ { int style = nToolbarStyle; nToolbarStyle = 2; /* Default style is fine */ SetToolbarStyle(style); +#if (USE_GTKUIMANAGER) + gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/Both" )), nToolbarStyle ); +#endif + } #if USE_BOARD3D @@ -3560,30 +4099,54 @@ extern void RunGTK( GtkWidget *pwSplash, char *commands, char *python_script, ch if (!ArePanelsDocked()) { gtk_widget_hide(hpaned); +#if (USE_GTKUIMANAGER) + gtk_widget_hide ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/PanelsMenu/Commentary" )) ); + gtk_widget_hide ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/HidePanels" )) ); + gtk_widget_hide ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/RestorePanels" )) ); +#else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Panels/Commentary")); gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Hide panels")); gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Restore panels")); +#endif } - else + else { if (ArePanelsShowing()) { +#if (USE_GTKUIMANAGER) + gtk_widget_hide ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/RestorePanels" )) ); +#else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Restore panels")); +#endif gtk_widget_hide(pwGameBox); } else +#if (USE_GTKUIMANAGER) + gtk_widget_hide ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/HidePanels" )) ); +#else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Hide panels")); +#endif } /* Make sure main window is on top */ - gdk_window_raise(pwMain->window); + gdk_window_raise( gtk_widget_get_window( pwMain ) ); /* force update of board; needed to display board correctly if user has special settings, e.g., clockwise or nackgammon */ ShowBoard(); if (fToolbarShowing) +#if (USE_GTKUIMANAGER) + gtk_widget_hide ( (gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ToolBarMenu/ShowToolBar" )) ); +#else gtk_widget_hide(gtk_item_factory_get_widget(pif, "/View/Toolbar/Show Toolbar")); +#endif if (fFullScreen) { /* Change to full screen (but hide warning) */ @@ -3630,8 +4193,8 @@ extern void RunGTK( GtkWidget *pwSplash, char *commands, char *python_script, ch extern void GtkChangeLanguage(void) { - gtk_set_locale(); - if (pwMain && GTK_WIDGET_REALIZED(pwMain)) + setlocale(LC_ALL, "C"); + if (pwMain && gtk_widget_get_realized(pwMain)) { reasonExited = RE_LANGUAGE_CHANGE; custom_cell_renderer_invalidate_size(); /* Recalulate widget sizes */ @@ -3658,7 +4221,7 @@ extern void OK( GtkWidget *pw, int *pf ) { if( pf ) *pf = TRUE; - + gtk_widget_destroy( gtk_widget_get_toplevel( pw ) ); } @@ -3674,7 +4237,7 @@ static void TutorEnd( GtkWidget *pw, int *pf ) { if( pf ) *pf = TRUE; - + fTutor = FALSE; gtk_widget_destroy( gtk_widget_get_toplevel( pw ) ); } @@ -3705,7 +4268,7 @@ extern int GtkTutor ( char *sz ) *pwButtons, *pwPrompt, *pwHint; pwTutorDialog = GTKCreateDialog( _("GNU Backgammon - Tutor"), - DT_GNUQUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(OK), (void*)&f); + DT_QUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(OK), (void*)&f); pwOK = DialogArea(pwTutorDialog, DA_OK); gtk_button_set_label(GTK_BUTTON(pwOK), _("Play Anyway")); @@ -3727,7 +4290,7 @@ extern int GtkTutor ( char *sz ) gtk_container_add( GTK_CONTAINER( pwButtons ), pwHint ); g_signal_connect( G_OBJECT( pwHint ), "clicked", G_CALLBACK( TutorHint ), (void *) &f ); - + pwPrompt = gtk_label_new( sz ); gtk_misc_set_padding( GTK_MISC( pwPrompt ), 8, 8 ); @@ -3735,24 +4298,24 @@ extern int GtkTutor ( char *sz ) gtk_label_set_line_wrap( GTK_LABEL( pwPrompt ), TRUE ); gtk_container_add( GTK_CONTAINER( DialogArea( pwTutorDialog, DA_MAIN ) ), pwPrompt ); - + gtk_window_set_resizable( GTK_WINDOW( pwTutorDialog ), FALSE); - + /* This dialog should be REALLY modal -- disable "next turn" idle processing and stdin handler, to avoid reentrancy problems. */ - if( nNextTurn ) + if( nNextTurn ) g_source_remove( nNextTurn ); - + GTKRunDialog(pwTutorDialog); - - if( nNextTurn ) + + if( nNextTurn ) nNextTurn = g_idle_add( NextTurnNotify, NULL ); - + /* if tutor mode was disabled, update the checklist */ if ( !fTutor) { GTKSet ( (void *) &fTutor); } - + return f; } @@ -3794,7 +4357,7 @@ extern void GTKOutputErr( const char *sz ) { GtkTextBuffer *buffer; GtkTextIter iter; GTKMessage( (char*)sz, DT_ERROR ); - + if (PanelShowing(WINDOW_MESSAGE)) { buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pwMessageText)); gtk_text_buffer_get_end_iter (buffer, &iter); @@ -3810,9 +4373,9 @@ extern void GTKOutputNew( void ) { the progress bar leaves a message in the status stack. There should be at most one message, so we get rid of it here. */ gtk_statusbar_pop( GTK_STATUSBAR( pwStatus ), idProgress ); - + fFinishedPopping = FALSE; - + do gtk_statusbar_pop( GTK_STATUSBAR( pwStatus ), idOutput ); while( !fFinishedPopping ); @@ -3834,18 +4397,18 @@ button_from_image ( GtkWidget *pwImage ) { } static void UpdatePlayerSettings( newwidget *pnw ) { - - int fManDice = + + int fManDice = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwManualDice)); - int fTM = + int fTM = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwTutorMode)); - int fCPS = + int fCPS = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwCPS)); - int fGH = + int fGH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwGNUvsHuman)); - int fHH = + int fHH = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pnw->pwHumanHuman)); - + if(!fCPS){ if (fGH){ UserCommand("set player 0 gnubg"); @@ -3857,19 +4420,20 @@ static void UpdatePlayerSettings( newwidget *pnw ) { } } - + if((fManDice) && (rngCurrent != RNG_MANUAL)) UserCommand("set rng manual"); - + if((!fManDice) && (rngCurrent == RNG_MANUAL)) UserCommand("set rng mersenne"); - + if((fTM) && (!fTutor)) UserCommand("set tutor mode on"); if((!fTM) && (fTutor)) UserCommand("set tutor mode off"); + UserCommand("save settings"); } static void SettingsPressed( GtkWidget *pw, gpointer data ) @@ -3879,7 +4443,7 @@ static void SettingsPressed( GtkWidget *pw, gpointer data ) } static void ToolButtonPressedMS( GtkWidget *pw, newwidget *pnw ) { - UpdatePlayerSettings( pnw ); + UpdatePlayerSettings( pnw ); gtk_widget_destroy( gtk_widget_get_toplevel( pw ) ); UserCommand("new session"); } @@ -3905,7 +4469,8 @@ extern int edit_new(unsigned int length) ms.fDoubled = 0; ms.fCubeOwner = -1; ms.fCrawford = FALSE; - ms.anScore[0] = ms.anScore[1] = 0; + ms.fJacoby = fJacoby; + ms.anScore[0] = ms.anScore[1] = 0; ms.nCube = 0; ms.gs = GAME_PLAYING; @@ -3928,74 +4493,62 @@ static void edit_new_clicked(GtkWidget * pw, newwidget * pnw) static GtkWidget *NewWidget( newwidget *pnw) { int i, j = 1 ; - char **apXPM[10]; GtkWidget *pwVbox, *pwHbox, *pwLabel, *pwToolbar; - GtkWidget *pwButtons, *pwFrame, *pwVbox2; -#include "xpm/stock_new_all.xpm" -#include "xpm/stock_new_money.xpm" + GtkWidget *pwButtons, *pwFrame, *pwVbox2; + GtkToolItem *pwToolButton; pwVbox = gtk_vbox_new(FALSE, 0); pwToolbar = gtk_toolbar_new (); - gtk_toolbar_set_orientation ( GTK_TOOLBAR ( pwToolbar ), + toolbar_set_orientation ( GTK_TOOLBAR ( pwToolbar ), GTK_ORIENTATION_HORIZONTAL ); gtk_toolbar_set_style ( GTK_TOOLBAR ( pwToolbar ), GTK_TOOLBAR_ICONS ); + gtk_toolbar_set_show_arrow (GTK_TOOLBAR ( pwToolbar ), FALSE); pwFrame = gtk_frame_new(_("Shortcut buttons")); gtk_box_pack_start ( GTK_BOX ( pwVbox ), pwFrame, TRUE, TRUE, 0); gtk_container_add( GTK_CONTAINER( pwFrame ), pwToolbar); gtk_container_set_border_width( GTK_CONTAINER( pwToolbar ), 4); - + /* Edit button */ - pwButtons = gtk_button_new(); - gtk_container_add ( GTK_CONTAINER ( pwButtons ), gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_LARGE_TOOLBAR)); - gtk_widget_show(pwButtons); - gtk_toolbar_append_widget( GTK_TOOLBAR( pwToolbar ), - pwButtons, _("Edit position"), NULL ); - g_signal_connect(pwButtons, "clicked", G_CALLBACK(edit_new_clicked), pnw); + pwToolButton = gtk_tool_button_new_from_stock (GTK_STOCK_EDIT); + gtk_widget_set_tooltip_text(GTK_WIDGET(pwToolButton), _("Edit position")); + gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar), pwToolButton, -1); + g_signal_connect(pwToolButton, "clicked", G_CALLBACK(edit_new_clicked), pnw); - gtk_toolbar_append_space(GTK_TOOLBAR(pwToolbar)); + gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar), gtk_separator_tool_item_new(), -1); - pwButtons = button_from_image( image_from_xpm_d ( stock_new_money_xpm, - pwToolbar ) ); - gtk_toolbar_append_widget( GTK_TOOLBAR( pwToolbar ), - pwButtons, _("Start a new money game session"), NULL ); - g_signal_connect( G_OBJECT( pwButtons ), "clicked", + pwToolButton = gtk_tool_button_new_from_stock (GNUBG_STOCK_NEW0); + gtk_widget_set_tooltip_text(GTK_WIDGET(pwToolButton), _("Start a new money game session")); + gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar), pwToolButton, -1); + g_signal_connect( G_OBJECT( pwToolButton ), "clicked", G_CALLBACK( ToolButtonPressedMS ), pnw ); - gtk_toolbar_append_space(GTK_TOOLBAR(pwToolbar)); - - apXPM[0] = stock_new_xpm; - apXPM[1] = stock_new1_xpm; - apXPM[2] = stock_new3_xpm; - apXPM[3] = stock_new5_xpm; - apXPM[4] = stock_new7_xpm; - apXPM[5] = stock_new9_xpm; - apXPM[6] = stock_new11_xpm; - apXPM[7] = stock_new13_xpm; - apXPM[8] = stock_new15_xpm; - apXPM[9] = stock_new17_xpm; - - for(i = 1; i < 19; i=i+2, j++ ){ + gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar), gtk_separator_tool_item_new(), -1); + + for(i = 1; i < 19; i=i+2, j++ ){ gchar *sz; + gchar stock[50]; int *pi; sz = g_strdup_printf(_("Start a new %d point match"), i); - pwButtons = button_from_image( image_from_xpm_d ( apXPM[j], - pwToolbar ) ); - gtk_toolbar_append_widget( GTK_TOOLBAR( pwToolbar ), - pwButtons, sz, NULL ); + sprintf(stock, "gnubg-stock-new%d", i); + pwToolButton = gtk_tool_button_new_from_stock (stock); + gtk_widget_set_tooltip_text(GTK_WIDGET(pwToolButton), sz); + gtk_toolbar_insert(GTK_TOOLBAR(pwToolbar), pwToolButton, -1); + gtk_tool_item_set_homogeneous(pwToolButton, FALSE); + g_free(sz); - - pi = malloc ( sizeof ( int ) ); - *pi = i; - g_object_set_data_full( G_OBJECT( pwButtons ), "user_data", + + pi = malloc ( sizeof ( int ) ); + *pi = i; + g_object_set_data_full( G_OBJECT( pwToolButton ), "user_data", pi, free ); - g_signal_connect( G_OBJECT( pwButtons ), "clicked", + g_signal_connect( G_OBJECT( pwToolButton ), "clicked", G_CALLBACK( ToolButtonPressed ), pnw ); } - + pwFrame = gtk_frame_new(_("Match settings")); pwHbox = gtk_hbox_new(FALSE, 0); @@ -4010,9 +4563,9 @@ static GtkWidget *NewWidget( newwidget *pnw) gtk_container_add(GTK_CONTAINER(pwVbox), pwFrame); /* Here the simplified player settings starts */ - + pwFrame = gtk_frame_new(_("Player settings")); - + pwHbox = gtk_hbox_new(FALSE, 0); pwVbox2 = gtk_vbox_new(FALSE, 0); @@ -4020,22 +4573,22 @@ static GtkWidget *NewWidget( newwidget *pnw) pnw->pwCPS = gtk_radio_button_new_with_label( NULL, _("Current player settings")); gtk_box_pack_start(GTK_BOX(pwVbox2), pnw->pwCPS, FALSE, FALSE, 0); - + pnw->pwGNUvsHuman = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON(pnw->pwCPS), _("GNU Backgammon vs. Human")); pnw->pwHumanHuman = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON(pnw->pwCPS), _("Human vs. Human")); gtk_box_pack_start(GTK_BOX(pwVbox2), pnw->pwGNUvsHuman, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwVbox2), pnw->pwHumanHuman, FALSE, FALSE, 0); - + pwButtons = gtk_button_new_with_label(_("Modify player settings...")); gtk_container_set_border_width(GTK_CONTAINER(pwButtons), 10); - + gtk_container_add(GTK_CONTAINER(pwVbox2), pwButtons ); g_signal_connect(G_OBJECT(pwButtons), "clicked", G_CALLBACK( SettingsPressed ), NULL ); pwVbox2 = gtk_vbox_new( FALSE, 0); - + gtk_container_add(GTK_CONTAINER(pwHbox), pwVbox2); pnw->pwManualDice = gtk_check_button_new_with_label(_("Manual dice")); @@ -4045,9 +4598,9 @@ static GtkWidget *NewWidget( newwidget *pnw) gtk_box_pack_start(GTK_BOX(pwVbox2), pnw->pwTutorMode, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(pwFrame), pwHbox); gtk_container_add(GTK_CONTAINER(pwVbox), pwFrame); - + return pwVbox; -} +} static void NewOK( GtkWidget *pw, newwidget *pnw ) { @@ -4077,16 +4630,19 @@ extern void GTKNew( void ) { GtkWidget *pwDialog, *pwPage; newwidget nw; + GtkAllocation allocation; pwDialog = GTKCreateDialog( _("GNU Backgammon - New"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK( NewOK ), &nw ); gtk_container_add( GTK_CONTAINER( DialogArea( pwDialog, DA_MAIN ) ), pwPage = NewWidget(&nw)); + gtk_widget_get_allocation (pwToolbar, &allocation); + gtk_widget_set_size_request (pwToolbar, allocation.width, allocation.height); gtk_widget_grab_focus(DialogArea(pwDialog, DA_OK)); NewSet( &nw ); - + GTKRunDialog(pwDialog); } @@ -4109,9 +4665,10 @@ SetMET (GtkWidget * pw, gpointer p) g_free (command); g_free (filename); /* update filename on option page */ - if (p && GTK_WIDGET_VISIBLE (p)) + if (p && gtk_widget_get_visible (p)) gtk_label_set_text (GTK_LABEL (p), (char *) miCurrent.szFileName); } + UserCommand("save settings"); } typedef struct _rolloutpagewidget { @@ -4151,7 +4708,7 @@ typedef struct _rolloutwidget { /*************************************************************************** ***** - ***** Change SGF_ROLLOUT_VER in eval.h if rollout settings change + ***** Change SGF_ROLLOUT_VER in eval.h if rollout settings change ***** such that previous .sgf files won't be able to extend rollouts ***** ***************************************************************************/ @@ -4159,10 +4716,10 @@ static void GetRolloutSettings( GtkWidget *pw, rolloutwidget *prw ) { int p0, p1, i; int fCubeEqChequer, fPlayersAreSame; - prw->rcRollout.nTrials = (int)prw->prwGeneral->padjTrials->value; - prw->rcRollout.nTruncate = (unsigned short)prw->prwGeneral->padjTruncPlies->value; + prw->rcRollout.nTrials = (int)gtk_adjustment_get_value( prw->prwGeneral->padjTrials ); + prw->rcRollout.nTruncate = (unsigned short)gtk_adjustment_get_value( prw->prwGeneral->padjTruncPlies ); - prw->rcRollout.nSeed = (int)prw->prwGeneral->padjSeed->value; + prw->rcRollout.nSeed = (int)gtk_adjustment_get_value( prw->prwGeneral->padjSeed ); prw->rcRollout.fCubeful = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( prw->prwGeneral->pwCubeful ) ); @@ -4185,35 +4742,35 @@ static void GetRolloutSettings( GtkWidget *pw, rolloutwidget *prw ) { prw->rcRollout.fTruncBearoffOS = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( prw->prwGeneral->pwTruncBearoffOS ) ); - if (prw->rcRollout.nTruncate == 0) + if (prw->rcRollout.nTruncate == 0) prw->rcRollout.fDoTruncate = FALSE; prw->rcRollout.fLateEvals = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( prw->prwGeneral->pwDoLate ) ); - prw->rcRollout.nLate = (unsigned short)prw->prwGeneral->padjLatePlies->value; + prw->rcRollout.nLate = (unsigned short)gtk_adjustment_get_value( prw->prwGeneral->padjLatePlies ); - fCubeEqChequer = + fCubeEqChequer = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( prw->prwGeneral->pwCubeEqualChequer ) ); - fPlayersAreSame = + fPlayersAreSame = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( prw->prwGeneral->pwPlayersAreSame ) ); prw->rcRollout.fStopOnSTD = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( prw->prwGeneral->pwDoSTDStop)); prw->rcRollout.nMinimumGames = (unsigned int) gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (prw->prwGeneral->pwMinGames)); - prw->rcRollout.rStdLimit = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (prw->prwGeneral->pwMaxError)); + prw->rcRollout.rStdLimit = gtk_spin_button_get_value (GTK_SPIN_BUTTON (prw->prwGeneral->pwMaxError)); prw->rcRollout.fStopOnJsd = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(prw->prwGeneral->pwJsdDoStop)); prw->rcRollout.nMinimumJsdGames = (unsigned int) gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (prw->prwGeneral->pwJsdMinGames)); - prw->rcRollout.rJsdLimit = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (prw->prwGeneral->pwJsdAdjLimit)); + prw->rcRollout.rJsdLimit = gtk_spin_button_get_value (GTK_SPIN_BUTTON (prw->prwGeneral->pwJsdAdjLimit)); /* if the players are the same, copy player 0 settings to player 1 */ if (fPlayersAreSame) { for (p0 = 0, p1 = 1; p0 < 4; p0 += 2, p1 += 2) { - memcpy (prw->prpwPages[p1]->precCheq, prw->prpwPages[p0]->precCheq, + memcpy (prw->prpwPages[p1]->precCheq, prw->prpwPages[p0]->precCheq, sizeof (evalcontext)); - memcpy (prw->prpwPages[p1]->precCube, prw->prpwPages[p0]->precCube, + memcpy (prw->prpwPages[p1]->precCube, prw->prpwPages[p0]->precCube, sizeof (evalcontext)); memcpy (prw->prpwPages[p1]->pmf, prw->prpwPages[p0]->pmf, @@ -4229,12 +4786,12 @@ static void GetRolloutSettings( GtkWidget *pw, rolloutwidget *prw ) { memcpy (prw->prpwPages[i]->precCube, prw->prpwPages[i]->precCheq, sizeof (evalcontext)); } - + memcpy (prw->prpwTrunc->precCube, prw->prpwTrunc->precCheq, sizeof (evalcontext)); } - if (gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON ( + if (gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON ( prw->prwGeneral->pwTruncEqualPlayer0))) { memcpy (prw->prpwTrunc->precCube, prw->prpwPages[0]->precCheq, sizeof (evalcontext)); @@ -4302,7 +4859,7 @@ static void STDStopToggled( GtkWidget *pw, rolloutwidget *prw) { static void JsdStopToggled( GtkWidget *pw, rolloutwidget *prw) { int do_jsd_stop = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON (prw->prwGeneral->pwJsdDoStop ) ); - + gtk_widget_set_sensitive (GTK_WIDGET (prw->prwGeneral->pwJsdAdjLimit), do_jsd_stop); gtk_widget_set_sensitive (GTK_WIDGET (prw->prwGeneral->pwJsdAdjMinGames), do_jsd_stop); @@ -4328,10 +4885,10 @@ static void TruncEnableToggled( GtkWidget *pw, rolloutwidget *prw) static void TruncEqualPlayer0Toggled( GtkWidget *pw, rolloutwidget *prw) { - int do_trunc = + int do_trunc = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( prw->prwGeneral->pwDoTrunc ) ); - int sameas_p0 = + int sameas_p0 = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( prw->prwGeneral->pwTruncEqualPlayer0)); @@ -4353,10 +4910,10 @@ static void CubeEqCheqToggled( GtkWidget *pw, rolloutwidget *prw) static void CubefulToggled ( GtkWidget *pw, rolloutwidget *prw ) { - int f = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( + int f = gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( prw->prwGeneral->pwCubeful ) ); - - gtk_widget_set_sensitive ( GTK_WIDGET ( + + gtk_widget_set_sensitive ( GTK_WIDGET ( prw->prwGeneral->pwTruncBearoffOS ), ! f ); } @@ -4381,17 +4938,26 @@ static void PlayersSameToggled( GtkWidget *pw, rolloutwidget *prw) static GtkWidget * RolloutPageGeneral (rolloutpagegeneral *prpw, rolloutwidget *prw) { GtkWidget *pwPage, *pw, *pwv; - GtkWidget *pwHBox, *pwVBox; - GtkWidget *pwFrame; + GtkWidget *pwHBox; + GtkWidget *pwTable, *pwFrame; pwPage = gtk_vbox_new( FALSE, 0 ); gtk_container_set_border_width( GTK_CONTAINER( pwPage ), 8 ); + prpw->padjSeed = GTK_ADJUSTMENT( gtk_adjustment_new( + abs( prw->rcRollout.nSeed ), 0, INT_MAX, 1, 1, 0 ) ); + prpw->padjTrials = GTK_ADJUSTMENT(gtk_adjustment_new( prw->rcRollout.nTrials, 1, 1296 * 1296, 36, 36, 0 ) ); pw = gtk_hbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( pwPage), pw ); + + gtk_container_add( GTK_CONTAINER( pw ), + gtk_label_new( _("Seed:") ) ); + gtk_container_add( GTK_CONTAINER( pw ), + gtk_spin_button_new( prpw->padjSeed, 1, 0 ) ); + gtk_container_add( GTK_CONTAINER( pw ), gtk_label_new( _("Trials:") ) ); gtk_container_add( GTK_CONTAINER( pw ), @@ -4403,7 +4969,7 @@ RolloutPageGeneral (rolloutpagegeneral *prpw, rolloutwidget *prw) { pw = gtk_hbox_new( FALSE, 8 ); gtk_container_set_border_width( GTK_CONTAINER( pw ), 8 ); gtk_container_add ( GTK_CONTAINER ( pwFrame ), pw); - + prpw->pwDoTrunc = gtk_check_button_new_with_label ( _( "Truncate Rollouts" ) ); gtk_container_add( GTK_CONTAINER( pw ), prpw->pwDoTrunc ); @@ -4412,14 +4978,14 @@ RolloutPageGeneral (rolloutpagegeneral *prpw, rolloutwidget *prw) { g_signal_connect( G_OBJECT( prpw->pwDoTrunc ), "toggled", G_CALLBACK (TruncEnableToggled), prw); - prpw->pwAdjTruncPlies = pwVBox = gtk_vbox_new( FALSE, 0 ); - gtk_container_add( GTK_CONTAINER( pw ), pwVBox); - gtk_container_add( GTK_CONTAINER( pwVBox ), + prpw->pwAdjTruncPlies = pwHBox = gtk_hbox_new( FALSE, 0 ); + gtk_container_add( GTK_CONTAINER( pw ), pwHBox); + gtk_container_add( GTK_CONTAINER( pwHBox ), gtk_label_new( _("Truncate at ply:" ) ) ); - prpw->padjTruncPlies = GTK_ADJUSTMENT( gtk_adjustment_new( + prpw->padjTruncPlies = GTK_ADJUSTMENT( gtk_adjustment_new( prw->rcRollout.nTruncate, 0, 1000, 1, 1, 0 ) ); - gtk_container_add( GTK_CONTAINER( pwVBox ), gtk_spin_button_new( + gtk_container_add( GTK_CONTAINER( pwHBox ), gtk_spin_button_new( prpw->padjTruncPlies, 1, 0 ) ); @@ -4429,24 +4995,24 @@ RolloutPageGeneral (rolloutpagegeneral *prpw, rolloutwidget *prw) { pw = gtk_hbox_new( FALSE, 8 ); gtk_container_set_border_width( GTK_CONTAINER( pw ), 8 ); gtk_container_add ( GTK_CONTAINER ( pwFrame ), pw); - + prpw->pwDoLate = gtk_check_button_new_with_label ( _( "Enable separate evaluations " ) ); gtk_container_add( GTK_CONTAINER( pw ), prpw->pwDoLate ); - gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( - prw->prwGeneral->pwDoLate ), + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( + prw->prwGeneral->pwDoLate ), prw->rcRollout.fLateEvals); - g_signal_connect( G_OBJECT( prw->prwGeneral->pwDoLate ), + g_signal_connect( G_OBJECT( prw->prwGeneral->pwDoLate ), "toggled", G_CALLBACK (LateEvalToggled), prw); - prpw->pwAdjLatePlies = pwVBox = gtk_vbox_new( FALSE, 0 ); - gtk_container_add( GTK_CONTAINER( pw ), pwVBox); - gtk_container_add( GTK_CONTAINER( pwVBox ), + prpw->pwAdjLatePlies = pwHBox = gtk_hbox_new( FALSE, 0 ); + gtk_container_add( GTK_CONTAINER( pw ), pwHBox); + gtk_container_add( GTK_CONTAINER( pwHBox ), gtk_label_new( _("Change eval after ply:" ) ) ); - prpw->padjLatePlies = GTK_ADJUSTMENT( gtk_adjustment_new( + prpw->padjLatePlies = GTK_ADJUSTMENT( gtk_adjustment_new( prw->rcRollout.nLate, 0, 1000, 1, 1, 0 ) ); - gtk_container_add( GTK_CONTAINER( pwVBox ), gtk_spin_button_new( + gtk_container_add( GTK_CONTAINER( pwHBox ), gtk_spin_button_new( prpw->padjLatePlies, 1, 0 ) ); pwFrame = gtk_frame_new ( _("Stop when result is accurate") ); @@ -4456,27 +5022,27 @@ RolloutPageGeneral (rolloutpagegeneral *prpw, rolloutwidget *prw) { pw = gtk_hbox_new( FALSE, 8 ); gtk_container_set_border_width( GTK_CONTAINER( pw ), 8 ); gtk_container_add ( GTK_CONTAINER ( pwFrame ), pw); - + prpw->pwDoSTDStop = gtk_check_button_new_with_label ( - _( "Stop when STDs are small enough " ) ); + _( "Stop when STD is small enough " ) ); gtk_container_add( GTK_CONTAINER( pw ), prpw->pwDoSTDStop ); - gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( - prw->prwGeneral->pwDoSTDStop ), + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( + prw->prwGeneral->pwDoSTDStop ), prw->rcRollout.fStopOnSTD); - g_signal_connect( G_OBJECT( prw->prwGeneral->pwDoSTDStop ), + g_signal_connect( G_OBJECT( prw->prwGeneral->pwDoSTDStop ), "toggled", G_CALLBACK (STDStopToggled), prw); /* a vbox for the adjusters */ pwv = gtk_vbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( pw ), pwv); - + prpw->pwAdjMinGames = pwHBox = gtk_hbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( pwv ), pwHBox); - gtk_container_add( GTK_CONTAINER( pwHBox ), + gtk_container_add( GTK_CONTAINER( pwHBox ), gtk_label_new( _("Minimum Trials:" ) ) ); - prpw->padjMinGames = GTK_ADJUSTMENT( gtk_adjustment_new( + prpw->padjMinGames = GTK_ADJUSTMENT( gtk_adjustment_new( prw->rcRollout.nMinimumGames, 1, 1296 * 1296, 36, 36, 0 ) ); prpw->pwMinGames = gtk_spin_button_new(prpw->padjMinGames, 1, 0 ) ; @@ -4485,10 +5051,10 @@ RolloutPageGeneral (rolloutpagegeneral *prpw, rolloutwidget *prw) { prpw->pwAdjMaxError = pwHBox = gtk_hbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( pwv ), pwHBox); - gtk_container_add( GTK_CONTAINER( pwHBox ), - gtk_label_new( _("Ratio |Standard Deviation/Value|:" ) ) ); + gtk_container_add( GTK_CONTAINER( pwHBox ), + gtk_label_new( _("Equity Standard Deviation:" ) ) ); - prpw->padjMaxError = GTK_ADJUSTMENT( gtk_adjustment_new( + prpw->padjMaxError = GTK_ADJUSTMENT( gtk_adjustment_new( prw->rcRollout.rStdLimit, 0, 1, .0001, .0001, 0 ) ); prpw->pwMaxError = gtk_spin_button_new(prpw->padjMaxError, .0001, 4 ); @@ -4503,12 +5069,12 @@ RolloutPageGeneral (rolloutpagegeneral *prpw, rolloutwidget *prw) { pw = gtk_hbox_new( FALSE, 8 ); gtk_container_set_border_width( GTK_CONTAINER( pw ), 8 ); gtk_container_add ( GTK_CONTAINER ( pwFrame ), pw); - + /* a vbox for the check boxes */ pwv = gtk_vbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( pw ), pwv); - prpw->pwJsdDoStop = gtk_check_button_new_with_label (_( "Enable Stop on Jsd" ) ); + prpw->pwJsdDoStop = gtk_check_button_new_with_label (_( "Enable Stop on JSD" ) ); gtk_container_add( GTK_CONTAINER( pwv ), prpw->pwJsdDoStop ); gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON ( prw->prwGeneral->pwJsdDoStop ), prw->rcRollout.fStopOnJsd); g_signal_connect( G_OBJECT( prw->prwGeneral->pwJsdDoStop ), "toggled", G_CALLBACK (JsdStopToggled), prw); @@ -4529,25 +5095,16 @@ RolloutPageGeneral (rolloutpagegeneral *prpw, rolloutwidget *prw) { prpw->pwJsdAdjLimit = pwHBox = gtk_hbox_new( FALSE, 0 ); gtk_container_add( GTK_CONTAINER( pwv ), pwHBox); - gtk_container_add( GTK_CONTAINER( pwHBox ), + gtk_container_add( GTK_CONTAINER( pwHBox ), gtk_label_new( _("JSDs from best choice" ) ) ); - prpw->padjJsdLimit = GTK_ADJUSTMENT( gtk_adjustment_new( + prpw->padjJsdLimit = GTK_ADJUSTMENT( gtk_adjustment_new( prw->rcRollout.rJsdLimit, 0, 8, .0001, .0001, 0 ) ); prpw->pwJsdAdjLimit = gtk_spin_button_new(prpw->padjJsdLimit, .0001, 4 ); gtk_container_add( GTK_CONTAINER( pwHBox ), prpw->pwJsdAdjLimit); - - prpw->pwCubeful = gtk_check_button_new_with_label ( _("Cubeful") ); - gtk_container_add ( GTK_CONTAINER (pwPage ), prpw->pwCubeful ); - gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( prpw->pwCubeful ), - prw->rcRollout.fCubeful ); - - g_signal_connect( G_OBJECT( prpw->pwCubeful ), "toggled", - G_CALLBACK( CubefulToggled ), prw ); - pwFrame = gtk_frame_new ( _("Bearoff Truncation") ); gtk_container_add ( GTK_CONTAINER (pwPage ), pwFrame ); prpw->pwTruncBearoffOpts = pw = gtk_vbox_new( FALSE, 8 ); @@ -4565,37 +5122,58 @@ RolloutPageGeneral (rolloutpagegeneral *prpw, rolloutwidget *prw) { _( "Truncate cubeless at one-sided bearoff database" ) ); gtk_container_add( GTK_CONTAINER( pw ), prpw->pwTruncBearoffOS ); - gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON + gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (prpw->pwTruncBearoffOS ), prw->rcRollout.fTruncBearoffOS ); - prpw->pwVarRedn = gtk_check_button_new_with_label ( + + pwTable = gtk_table_new ( 2, 2, TRUE ); + gtk_container_add ( GTK_CONTAINER (pwPage ), pwTable ); + + prpw->pwCubeful = gtk_check_button_new_with_label ( _("Cubeful") ); + gtk_table_attach ( GTK_TABLE ( pwTable ), prpw->pwCubeful, + 0, 1, 0, 1, + GTK_FILL, + GTK_FILL, + 2, 2 ); + + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( prpw->pwCubeful ), + prw->rcRollout.fCubeful ); + + g_signal_connect( G_OBJECT( prpw->pwCubeful ), "toggled", + G_CALLBACK( CubefulToggled ), prw ); + + + prpw->pwVarRedn = gtk_check_button_new_with_label ( _("Variance reduction") ); - gtk_container_add ( GTK_CONTAINER (pwPage ), prpw->pwVarRedn ); + gtk_table_attach ( GTK_TABLE ( pwTable ), prpw->pwVarRedn, + 1, 2, 0, 1, + GTK_FILL, + GTK_FILL, + 2, 2 ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( prpw->pwVarRedn ), prw->rcRollout.fVarRedn ); - prpw->pwRotate = gtk_check_button_new_with_label ( + prpw->pwRotate = gtk_check_button_new_with_label ( _("Use quasi-random dice") ); - gtk_container_add ( GTK_CONTAINER (pwPage ), prpw->pwRotate ); + gtk_table_attach ( GTK_TABLE ( pwTable ), prpw->pwRotate, + 0, 1, 1, 2, + GTK_FILL, + GTK_FILL, + 2, 2 ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( prpw->pwRotate ), prw->rcRollout.fRotate ); - prpw->pwInitial = gtk_check_button_new_with_label ( + prpw->pwInitial = gtk_check_button_new_with_label ( _("Rollout as initial position") ); - gtk_container_add ( GTK_CONTAINER (pwPage ), prpw->pwInitial ); + gtk_table_attach ( GTK_TABLE ( pwTable ), prpw->pwInitial, + 1, 2, 1, 2, + GTK_FILL, + GTK_FILL, + 2, 2 ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( prpw->pwInitial ), prw->rcRollout.fInitial ); - pwHBox = gtk_hbox_new( FALSE, 0 ); - gtk_container_add( GTK_CONTAINER( pwPage ), pwHBox); - gtk_container_add( GTK_CONTAINER( pwHBox ), - gtk_label_new( _("Seed:") ) ); - prpw->padjSeed = GTK_ADJUSTMENT( gtk_adjustment_new( - abs( prw->rcRollout.nSeed ), 0, INT_MAX, 1, 1, 0 ) ); - gtk_container_add( GTK_CONTAINER( pwHBox ), gtk_spin_button_new( - prpw->padjSeed, 1, 0 ) ); - return pwPage; } @@ -4728,7 +5306,7 @@ extern void SetRollouts( gpointer p, guint n, GtkWidget *pwIgnore ) gtk_container_set_border_width( GTK_CONTAINER( rw.RolloutNotebook ), 4 ); - gtk_notebook_append_page( GTK_NOTEBOOK( rw.RolloutNotebook ), + gtk_notebook_append_page( GTK_NOTEBOOK( rw.RolloutNotebook ), RolloutPageGeneral (rw.prwGeneral, &rw), gtk_label_new ( _("General Settings" ) ) ); @@ -4784,7 +5362,7 @@ extern void SetRollouts( gpointer p, guint n, GtkWidget *pwIgnore ) for (i = 0; i < 5; i++) free(rw.analysisDetails[i]); - if( fOK || saveAs ) + if( fOK || saveAs ) { unsigned int fCubeful; outputoff(); @@ -4801,9 +5379,9 @@ extern void SetRollouts( gpointer p, guint n, GtkWidget *pwIgnore ) rw.rcRollout.aecCube[i].fCubeful = fCubeful; rw.rcRollout.aecCubeLate[i].fCubeful = fCubeful; } - rw.rcRollout.aecCubeTrunc.fCubeful = + rw.rcRollout.aecCubeTrunc.fCubeful = rw.rcRollout.aecChequerTrunc.fCubeful = fCubeful; - + } for (i = 0; i < 2; ++i) { @@ -4811,51 +5389,51 @@ extern void SetRollouts( gpointer p, guint n, GtkWidget *pwIgnore ) if (EvalCmp (&rw.rcRollout.aecCube[i], &rcRollout.aecCube[i], 1) ) { sprintf (sz, "set rollout player %d cubedecision", i); - SetEvalCommands( sz, &rw.rcRollout.aecCube[i], + SetEvalCommands( sz, &rw.rcRollout.aecCube[i], &rcRollout.aecCube[ i ] ); } - if (EvalCmp (&rw.rcRollout.aecChequer[i], + if (EvalCmp (&rw.rcRollout.aecChequer[i], &rcRollout.aecChequer[i], 1)) { sprintf (sz, "set rollout player %d chequer", i); - SetEvalCommands( sz, &rw.rcRollout.aecChequer[i], + SetEvalCommands( sz, &rw.rcRollout.aecChequer[i], &rcRollout.aecChequer[ i ] ); } - + sprintf ( sz, "set rollout player %d movefilter", i ); - SetMovefilterCommands ( sz, - rw.rcRollout.aaamfChequer[ i ], + SetMovefilterCommands ( sz, + rw.rcRollout.aaamfChequer[ i ], rcRollout.aaamfChequer[ i ] ); - if (EvalCmp (&rw.rcRollout.aecCubeLate[i], + if (EvalCmp (&rw.rcRollout.aecCubeLate[i], &rcRollout.aecCubeLate[i], 1 ) ) { sprintf (sz, "set rollout late player %d cube", i); - SetEvalCommands( sz, &rw.rcRollout.aecCubeLate[i], + SetEvalCommands( sz, &rw.rcRollout.aecCubeLate[i], &rcRollout.aecCubeLate[ i ] ); } - if (EvalCmp (&rw.rcRollout.aecChequerLate[i], + if (EvalCmp (&rw.rcRollout.aecChequerLate[i], &rcRollout.aecChequerLate[i], 1 ) ) { sprintf (sz, "set rollout late player %d chequer", i); - SetEvalCommands( sz, &rw.rcRollout.aecChequerLate[i], + SetEvalCommands( sz, &rw.rcRollout.aecChequerLate[i], &rcRollout.aecChequerLate[ i ] ); } sprintf ( sz, "set rollout late player %d movefilter", i ); - SetMovefilterCommands ( sz, - rw.rcRollout.aaamfLate[ i ], + SetMovefilterCommands ( sz, + rw.rcRollout.aaamfLate[ i ], rcRollout.aaamfLate[ i ] ); } if (EvalCmp (&rw.rcRollout.aecCubeTrunc, &rcRollout.aecCubeTrunc, 1) ) { - SetEvalCommands( "set rollout truncation cube", + SetEvalCommands( "set rollout truncation cube", &rw.rcRollout.aecCubeTrunc, &rcRollout.aecCubeTrunc ); } - if (EvalCmp (&rw.rcRollout.aecChequerTrunc, + if (EvalCmp (&rw.rcRollout.aecChequerTrunc, &rcRollout.aecChequerTrunc, 1) ) { - SetEvalCommands( "set rollout truncation chequer", - &rw.rcRollout.aecChequerTrunc, + SetEvalCommands( "set rollout truncation chequer", + &rw.rcRollout.aecChequerTrunc, &rcRollout.aecChequerTrunc ); } @@ -4896,7 +5474,7 @@ extern void SetRollouts( gpointer p, guint n, GtkWidget *pwIgnore ) } if( rw.rcRollout.nTruncate != rcRollout.nTruncate ) { - sprintf( sz, "set rollout truncation plies %d", + sprintf( sz, "set rollout truncation plies %d", rw.rcRollout.nTruncate ); UserCommand( sz ); } @@ -4957,13 +5535,13 @@ extern void SetRollouts( gpointer p, guint n, GtkWidget *pwIgnore ) } if( rw.rcRollout.fTruncBearoff2 != rcRollout.fTruncBearoff2 ) { - sprintf( sz, "set rollout bearofftruncation exact %s", + sprintf( sz, "set rollout bearofftruncation exact %s", rw.rcRollout.fTruncBearoff2 ? "on" : "off" ); UserCommand( sz ); } if( rw.rcRollout.fTruncBearoffOS != rcRollout.fTruncBearoffOS ) { - sprintf( sz, "set rollout bearofftruncation onesided %s", + sprintf( sz, "set rollout bearofftruncation onesided %s", rw.rcRollout.fTruncBearoffOS ? "on" : "off" ); UserCommand( sz ); } @@ -4986,15 +5564,16 @@ extern void SetRollouts( gpointer p, guint n, GtkWidget *pwIgnore ) UserCommand( sz ); } + UserCommand("save settings"); outputon(); if (saveAs) gtk_save_rollout_settings(); - else if (fOK) + else if (fOK) break; } if (loadRS) gtk_load_rollout_settings(); - } + } } void @@ -5047,7 +5626,7 @@ static void DestroyHint( gpointer p, GObject *obj ) { if ( pml ) { if ( pml->amMoves ) free ( pml->amMoves ); - + free ( pml ); } @@ -5062,7 +5641,7 @@ HintOK ( GtkWidget *pw, void *unused ) } extern void GTKCubeHint(moverecord *pmr, const matchstate *pms, int did_double, int did_take, int hist ) { - + GtkWidget *pw, *pwHint; if (GetPanelWidget(WINDOW_HINT)) @@ -5078,12 +5657,12 @@ extern void GTKCubeHint(moverecord *pmr, const matchstate *pms, int did_double, pw ); gtk_widget_grab_focus( DialogArea( pwHint, DA_OK ) ); - + setWindowGeometry(WINDOW_HINT); g_object_weak_ref( G_OBJECT( pwHint ), DestroyHint, NULL ); - + gtk_window_set_default_size(GTK_WINDOW(pwHint), 400, 300); - + gtk_widget_show_all( pwHint ); } @@ -5112,7 +5691,7 @@ GTKResignHint( float arOutput[], float rEqBefore, float rEqAfter, char *pch, sz[ 16 ]; /* equity before resignation */ - + gtk_table_attach( GTK_TABLE( pwTable ), pw = gtk_label_new( fMWC ? _("MWC before resignation") : _("Equity before resignation") ), 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 4, 0 ); @@ -5134,7 +5713,7 @@ GTKResignHint( float arOutput[], float rEqBefore, float rEqAfter, fMWC ? _("MWC after resignation") : _("Equity after resignation") ), 0, 1, 1, 2, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 4, 0 ); gtk_misc_set_alignment( GTK_MISC( pw ), 0, 0.5 ); - + if( fMWC ) sprintf( sz, "%6.2f%%", 100.0 * eq2mwc ( - rEqAfter, pci ) ); @@ -5150,23 +5729,28 @@ GTKResignHint( float arOutput[], float rEqBefore, float rEqAfter, pch = _("You should accept the resignation!"); else pch = _("You should reject the resignation!"); - + gtk_table_attach( GTK_TABLE( pwTable ), pw = gtk_label_new( pch ), 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 8 ); gtk_container_set_border_width( GTK_CONTAINER( pwTable ), 8 ); - + gtk_container_add( GTK_CONTAINER( DialogArea( pwDialog, DA_MAIN ) ), pwTable ); GTKRunDialog(pwDialog); } -extern void +extern void GTKHint( moverecord *pmr, int hist) { GtkWidget *pwMoves, *pwHint; + if (!pmr || pmr->ml.cMoves < 1) + { + outputerrf(_("There are no legal moves. Figure it out yourself.")); + return; + } if (GetPanelWidget(WINDOW_HINT)) gtk_widget_destroy(GetPanelWidget(WINDOW_HINT)); @@ -5178,8 +5762,8 @@ GTKHint( moverecord *pmr, int hist) pwHint = GTKCreateDialog( _("GNU Backgammon - Hint"), DT_INFO, NULL, DIALOG_FLAG_NONE, G_CALLBACK( HintOK ), NULL ); SetPanelWidget(WINDOW_HINT, pwHint); - - gtk_container_add( GTK_CONTAINER( DialogArea( pwHint, DA_MAIN ) ), + + gtk_container_add( GTK_CONTAINER( DialogArea( pwHint, DA_MAIN ) ), pwMoves ); setWindowGeometry(WINDOW_HINT); @@ -5193,7 +5777,7 @@ GTKHint( moverecord *pmr, int hist) static void SetMouseCursor(GdkCursorType cursorType) { - if (!GDK_IS_WINDOW(pwMain->window)) + if (!GDK_IS_WINDOW(gtk_widget_get_window( pwMain ) ) ) { g_print("no window\n"); return; @@ -5202,11 +5786,11 @@ static void SetMouseCursor(GdkCursorType cursorType) { GdkCursor *cursor; cursor = gdk_cursor_new(cursorType); - gdk_window_set_cursor(pwMain->window, cursor); + gdk_window_set_cursor( gtk_widget_get_window( pwMain ), cursor); gdk_cursor_unref(cursor); } else - gdk_window_set_cursor(pwMain->window, NULL); + gdk_window_set_cursor( gtk_widget_get_window( pwMain ), NULL ); } extern void GTKProgressStart( const char *sz ) @@ -5264,29 +5848,17 @@ extern void GTKProgressEnd( void ) int colWidth; -static void MoveListIntoView(GtkWidget *pwList, int *row) -{ - if (gtk_clist_row_is_visible(GTK_CLIST(pwList), (*row-1)) != GTK_VISIBILITY_FULL) - { - gtk_clist_moveto(GTK_CLIST(pwList), (*row-1), 0, 0, 0); - gtk_widget_set_size_request(GTK_WIDGET(pwList), colWidth * 2 + 50, -1); - } -} - extern void GTKShowScoreSheet( void ) { GtkWidget *pwDialog, *pwBox; GtkWidget *hbox; - GtkWidget *pwList; + GtkWidget *view; GtkWidget* pwScrolled; - PangoRectangle logical_rect; - PangoLayout *layout; - int width1, width2; - int i; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + GtkListStore *store; int numRows = 0; char title[100]; - char *titles[2]; - char *data[2]; listOLD *pl; sprintf(title, _("Score Sheet - ")); @@ -5301,37 +5873,17 @@ extern void GTKShowScoreSheet( void ) gtk_container_add( GTK_CONTAINER( DialogArea( pwDialog, DA_MAIN ) ), pwBox); - gtk_widget_set_size_request(GTK_WIDGET (pwDialog), -1, 200); gtk_container_set_border_width(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), 4); hbox = gtk_hbox_new (FALSE, 0); gtk_container_add(GTK_CONTAINER(DialogArea(pwDialog, DA_MAIN)), hbox); - titles[0] = ap[0].szName; - titles[1] = ap[1].szName; - - pwList = gtk_clist_new_with_titles( 2, titles ); - GTK_WIDGET_UNSET_FLAGS(pwList, GTK_CAN_FOCUS); - gtk_clist_column_titles_passive( GTK_CLIST( pwList ) ); - - layout = gtk_widget_create_pango_layout(pwList, titles[0]); - pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - g_object_unref (layout); - width1 = logical_rect.width; - - layout = gtk_widget_create_pango_layout(pwList, titles[1]); - pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - g_object_unref (layout); - width2 = logical_rect.width; - - colWidth = MAX(width1, width2); - - data[0] = malloc(10); - data[1] = malloc(10); + store = gtk_list_store_new(2, G_TYPE_INT, G_TYPE_INT); for (pl = lMatch.plNext; pl->p; pl = pl->plNext ) { int score[2]; + GtkTreeIter iter; listOLD *plGame = pl->plNext->p; if (plGame) @@ -5361,35 +5913,30 @@ extern void GTKShowScoreSheet( void ) else score[pmr->g.fWinner] += pmr->g.nPoints; } - sprintf(data[0], "%d", score[0]); - sprintf(data[1], "%d", score[1]); - gtk_clist_append(GTK_CLIST(pwList), data); + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, score[0], 1, score[1], -1); numRows++; } - free(data[0]); - free(data[1]); - - for( i = 0; i < 2; i++ ) - { - gtk_clist_set_column_justification(GTK_CLIST(pwList), i, GTK_JUSTIFY_CENTER); - gtk_clist_set_column_width( GTK_CLIST( pwList ), i, colWidth); - gtk_clist_set_column_resizeable(GTK_CLIST(pwList), i, FALSE); - } - pwScrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(pwScrolled), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(pwScrolled), pwList); + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_widget_set_size_request(GTK_WIDGET(pwList), colWidth * 2 + 20, -1); + view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); + g_object_unref(store); - gtk_box_pack_start(GTK_BOX(hbox), pwScrolled, TRUE, FALSE, 0); + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(ap[0].szName, renderer, "text", 0, NULL); + gtk_tree_view_column_set_min_width(column, 75); + gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); - gtk_clist_select_row(GTK_CLIST(pwList), numRows - 1, 1); + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(ap[1].szName, renderer, "text", 0, NULL); + gtk_tree_view_column_set_min_width(column, 75); + gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); - g_signal_connect(G_OBJECT(pwList), "realize", - G_CALLBACK(MoveListIntoView), &numRows ); + gtk_container_add(GTK_CONTAINER(pwScrolled), view); + gtk_box_pack_start(GTK_BOX(hbox), pwScrolled, TRUE, TRUE, 0); GTKRunDialog(pwDialog); } @@ -5432,37 +5979,37 @@ extern void GTKShowVersion( void ) pwButtonBox = gtk_vbox_new( FALSE, 0 ); gtk_box_pack_start( GTK_BOX(DialogArea(pwDialog, DA_MAIN)), pwButtonBox, FALSE, FALSE, 8 ); - gtk_box_pack_start( GTK_BOX( pwButtonBox ), + gtk_box_pack_start( GTK_BOX( pwButtonBox ), pwButton = gtk_button_new_with_label(_("Credits") ), FALSE, FALSE, 8 ); g_signal_connect( G_OBJECT( pwButton ), "clicked", G_CALLBACK( GTKCommandShowCredits ), pwDialog ); - - gtk_box_pack_start( GTK_BOX( pwButtonBox ), + + gtk_box_pack_start( GTK_BOX( pwButtonBox ), pwButton = gtk_button_new_with_label(_("Build Info") ), FALSE, FALSE, 8 ); g_signal_connect( G_OBJECT( pwButton ), "clicked", G_CALLBACK( GTKShowBuildInfo ), pwDialog ); - - gtk_box_pack_start( GTK_BOX( pwButtonBox ), + + gtk_box_pack_start( GTK_BOX( pwButtonBox ), pwButton = gtk_button_new_with_label(_("Copying conditions") ), FALSE, FALSE, 8 ); g_signal_connect( G_OBJECT( pwButton ), "clicked", G_CALLBACK( GtkShowCopying ), pwDialog ); - - gtk_box_pack_start( GTK_BOX( pwButtonBox ), + + gtk_box_pack_start( GTK_BOX( pwButtonBox ), pwButton = gtk_button_new_with_label(_("Warranty") ), FALSE, FALSE, 8 ); g_signal_connect( G_OBJECT( pwButton ), "clicked", G_CALLBACK( GtkShowWarranty ), NULL ); - gtk_box_pack_start( GTK_BOX( pwButtonBox ), + gtk_box_pack_start( GTK_BOX( pwButtonBox ), pwButton = gtk_button_new_with_label(_("Report Bug") ), FALSE, FALSE, 8 ); g_signal_connect( G_OBJECT( pwButton ), "clicked", G_CALLBACK( ReportBug ), NULL ); - gtk_box_pack_start( GTK_BOX( pwButtonBox ), + gtk_box_pack_start( GTK_BOX( pwButtonBox ), pwButton = gtk_button_new_with_label(_("Evaluation Engine") ), FALSE, FALSE, 8 ); g_signal_connect( G_OBJECT( pwButton ), "clicked", @@ -5505,7 +6052,7 @@ extern void GTKShowBuildInfo(GtkWidget *pw, GtkWidget *pwParent) pwPrompt = gtk_label_new( _(intro_string)); gtk_box_pack_start( GTK_BOX( pwBox ), pwPrompt, FALSE, FALSE, 4 ); gtk_label_set_line_wrap( GTK_LABEL( pwPrompt ), TRUE ); - + GTKRunDialog(pwDialog); } @@ -5521,7 +6068,7 @@ static void AddTitle(GtkWidget* pwBox, char* Title) ps->font_desc = pango_font_description_new(); pango_font_description_set_family_static( ps->font_desc, "serif" ); - pango_font_description_set_size( ps->font_desc, 16 * PANGO_SCALE ); + pango_font_description_set_size( ps->font_desc, 16 * PANGO_SCALE ); gtk_widget_modify_style( pwTitle, ps ); g_object_unref( ps ); @@ -5624,7 +6171,7 @@ extern void GTKCommandShowCredits(GtkWidget * pw, GtkWidget * pwParent) treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); g_object_unref(store); renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(_("Contributers"), renderer, "text", 0, NULL); + column = gtk_tree_view_column_new_with_attributes(_("Contributors"), renderer, "text", 0, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); while (names.plNext->p) @@ -5642,7 +6189,7 @@ extern void GTKCommandShowCredits(GtkWidget * pw, GtkWidget * pwParent) static void GTKHelpAdd( GtkTreeStore *pts, GtkTreeIter *ptiParent, command *pc ) { GtkTreeIter ti; - + for( ; pc->sz; pc++ ) if( pc->szHelp ) { gtk_tree_store_append( pts, &ti, ptiParent ); @@ -5663,7 +6210,7 @@ static void GTKHelpSelect( GtkTreeSelection *pts, gpointer p ) { char szCommand[ 128 ], *pchCommand = szCommand, szUsage[ 128 ], *pchUsage = szUsage, *pLabel; const char *pch; - + if( gtk_tree_selection_get_selected( pts, &ptm, &ti ) ) { ptp = gtk_tree_model_get_path( ptm, &ti ); c = gtk_tree_path_get_depth( ptp ); @@ -5688,8 +6235,8 @@ static void GTKHelpSelect( GtkTreeSelection *pts, gpointer p ) { if( ( pch = apc[ i ]->szUsage ) ) { while( *pch ) *pchUsage++ = *pch++; - *pchUsage++ = ' '; *pchUsage = 0; - } + *pchUsage++ = ' '; *pchUsage = 0; + } } pLabel = g_strdup_printf( _("%s- %s\n\nUsage: %s%s\n"), szCommand, @@ -5698,7 +6245,7 @@ static void GTKHelpSelect( GtkTreeSelection *pts, gpointer p ) { " <subcommand>" : "" ); gtk_label_set_text( GTK_LABEL( pwHelpLabel ), pLabel ); g_free( pLabel ); - + free( apc ); gtk_tree_path_free( ptp ); } else @@ -5717,7 +6264,7 @@ extern void GTKHelp( char *sz ) command *pc, *pcTest, *pcStart; int cch, i, c, *pn; void ( *pf )( char * ); - + if( pw ) { gtk_window_present( GTK_WINDOW( pw ) ); @@ -5728,7 +6275,7 @@ extern void GTKHelp( char *sz ) G_TYPE_POINTER ); GTKHelpAdd( pts, NULL, acTop ); - + pw = GTKCreateDialog(_("Help - command reference"), DT_INFO, NULL, DIALOG_FLAG_NONE, NULL, NULL); g_object_add_weak_pointer( G_OBJECT( pw ), (void*) &pw ); gtk_window_set_title( GTK_WINDOW( pw ), _("Help - command reference") ); @@ -5763,11 +6310,11 @@ extern void GTKHelp( char *sz ) "text", 1, NULL ); g_signal_connect( G_OBJECT( treeSelection ), "changed", G_CALLBACK( GTKHelpSelect ), NULL ); - + gtk_paned_pack2( GTK_PANED( pwPaned ), pwHelpLabel = gtk_label_new( NULL ), FALSE, FALSE ); gtk_label_set_selectable( GTK_LABEL( pwHelpLabel ), TRUE ); - + gtk_widget_show_all( pw ); gtk_tree_model_get_iter_first( GTK_TREE_MODEL( pts ), &ti ); @@ -5811,7 +6358,7 @@ extern void GTKHelp( char *sz ) } else break; } - + ptp = gtk_tree_model_get_path( GTK_TREE_MODEL( pts ), &ti ); pn = gtk_tree_path_get_indices( ptp ); ptpExpand = gtk_tree_path_new(); @@ -5843,7 +6390,7 @@ extern void GTKBearoffProgress( int i ) { static GtkWidget *pwDialog, *pw, *pwAlign; gchar *gsz; - + if( !pwDialog ) { pwDialog = GTKCreateDialog( _("GNU Backgammon"), DT_INFO, NULL, DIALOG_FLAG_MODAL|DIALOG_FLAG_NOTIDY, NULL, NULL ); gtk_window_set_role( GTK_WINDOW( pwDialog ), "progress" ); @@ -5857,7 +6404,7 @@ extern void GTKBearoffProgress( int i ) { TRUE, TRUE, 8 ); gtk_container_add( GTK_CONTAINER( pwAlign ), pw = gtk_progress_bar_new() ); - + gtk_widget_show_all( pwDialog ); } @@ -5883,8 +6430,8 @@ static void enable_menu( GtkWidget *pw, int f ) { GtkMenuItem *pmi = GTK_MENU_ITEM( pw ); - if( pmi->submenu ) - enable_sub_menu( pmi->submenu, f ); + if( gtk_menu_item_get_submenu ( pmi ) ) + enable_sub_menu( gtk_menu_item_get_submenu ( pmi ), f ); else gtk_widget_set_sensitive( pw, f ); } @@ -5892,40 +6439,71 @@ static void enable_menu( GtkWidget *pw, int f ) { static void enable_sub_menu( GtkWidget *pw, int f ) { GtkMenuShell *pms = GTK_MENU_SHELL( pw ); - - g_list_foreach( pms->children, (GFunc) enable_menu, GINT_TO_POINTER(f) ); + g_list_foreach( gtk_container_get_children ( GTK_CONTAINER ( pms ) ), (GFunc) enable_menu, GINT_TO_POINTER(f) ); } /* A global setting has changed; update entry in Settings menu if necessary. */ extern void GTKSet( void *p ) { - + BoardData *bd = BOARD( pwBoard )->board_data; if( p == ap ) { /* Handle the player names. */ - gtk_label_set_text( GTK_LABEL( GTK_BIN( +#if (USE_GTKUIMANAGER) + gtk_label_set_text( GTK_LABEL( gtk_bin_get_child ( GTK_BIN( + gtk_ui_manager_get_widget (puim, "/MainMenu/GameMenu/SetTurnMenu/SetTurnPlayer0" ) + ) ) ), (ap[ 0 ].szName) ); + gtk_label_set_text( GTK_LABEL( gtk_bin_get_child ( GTK_BIN( + gtk_ui_manager_get_widget (puim, "/MainMenu/GameMenu/SetTurnMenu/SetTurnPlayer1" ) + ) ) ), (ap[ 1 ].szName) ); +#else + gtk_label_set_text( GTK_LABEL( gtk_bin_get_child ( GTK_BIN( gtk_item_factory_get_widget_by_action( pif, CMD_SET_TURN_0 ) - )->child ), (ap[ 0 ].szName) ); - gtk_label_set_text( GTK_LABEL( GTK_BIN( + ) ) ), (ap[ 0 ].szName) ); + gtk_label_set_text( GTK_LABEL( gtk_bin_get_child( GTK_BIN( gtk_item_factory_get_widget_by_action( pif, CMD_SET_TURN_1 ) - )->child ), (ap[ 1 ].szName) ); - + ) ) ), (ap[ 1 ].szName) ); +#endif GL_SetNames(); GTKRegenerateGames(); + + } else if( p == &ms.fJacoby ) { + bd->jacoby_flag = ms.fJacoby; + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( bd->jacoby ), + bd->jacoby_flag ); + ShowBoard(); + } else if( p == &ms.fTurn ) { /* Handle the player on roll. */ fAutoCommand = TRUE; - +#if (USE_GTKUIMANAGER) + if( ms.fTurn >= 0 ) { + if (ms.fTurn) + gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( + gtk_ui_manager_get_widget (puim, + "/MainMenu/GameMenu/SetTurnMenu/SetTurnPlayer0" ) ), TRUE ); + else + gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( + gtk_ui_manager_get_widget (puim, + "/MainMenu/GameMenu/SetTurnMenu/SetTurnPlayer1" ) ), TRUE ); + } + enable_menu ( gtk_ui_manager_get_widget (puim, "/MainMenu/GameMenu/Roll" ), + ms.fMove == ms.fTurn && + ap[ ms.fMove ].pt == PLAYER_HUMAN ); + +#else + if( ms.fTurn >= 0 ) gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( gtk_item_factory_get_widget_by_action( pif, CMD_SET_TURN_0 + ms.fTurn ) ), TRUE ); enable_menu ( gtk_item_factory_get_widget ( pif, "/Game/Roll" ), - ms.fMove == ms.fTurn && + ms.fMove == ms.fTurn && ap[ ms.fMove ].pt == PLAYER_HUMAN ); +#endif fAutoCommand = FALSE; } else if( p == &ms.gs ) { /* Handle the game state. */ @@ -5934,14 +6512,120 @@ extern void GTKSet( void *p ) { board_set_playing( BOARD( pwBoard ), plGame != NULL ); ToolbarSetPlaying( pwToolbar, plGame != NULL ); +#if (USE_GTKUIMANAGER) + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/FileMenu/Save" ), plGame != NULL ); + enable_menu( gtk_ui_manager_get_widget (puim, + "/MainMenu/GameMenu" ), ms.gs == GAME_PLAYING ); + enable_menu( gtk_ui_manager_get_widget (puim, + "/MainMenu/GameMenu/Roll" ), + ms.fMove == ms.fTurn && + ap[ ms.fMove ].pt == PLAYER_HUMAN ); + + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/GoMenu/NextRoll" ), plGame != NULL ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/GoMenu/PreviousRoll" ), plGame != NULL ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/GoMenu/NextMarkedMove" ), plGame != NULL ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/GoMenu/PreviousMarkedMove" ), plGame != NULL ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/GoMenu/NextGame" ), plGame != NULL ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/GoMenu/PreviousGame" ), plGame != NULL ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/GoMenu/NextCMarkedMove" ), plGame != NULL ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/GoMenu/PreviousCMarkedMove" ), plGame != NULL ); + + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/FileMenu/MatchInfo" ), !ListEmpty( &lMatch ) ); + enable_menu( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu" ), ms.gs == GAME_PLAYING ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/BatchAnalyse" ), TRUE ); + + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/AnalyseMove" ), + plLastMove && plLastMove->plNext && plLastMove->plNext->p ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/AnalyseGame" ), plGame != NULL ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/AnalyseMatch" ), !ListEmpty( &lMatch ) ); + + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/ClearAnalysisMenu/Move" ), + plLastMove && plLastMove->plNext && plLastMove->plNext->p ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/ClearAnalysisMenu/Game" ), plGame != NULL ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/ClearAnalysisMenu/MatchOrSession" ), + !ListEmpty( &lMatch ) ); + + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/MatchOrSessionStats" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/MatchEquityTable" ), TRUE ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/EvaluationSpeed" ), TRUE ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/GameMenu/SwapPlayers" ), + !ListEmpty ( &lMatch ) ); + + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/CMarkMenu/CMarkCubeMenu/Clear" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/CMarkMenu/CMarkCubeMenu/Show" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/CMarkMenu/CMarkMoveMenu/Clear" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/CMarkMenu/CMarkMoveMenu/Show" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/CMarkMenu/CMarkGameMenu/Clear" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/CMarkMenu/CMarkGameMenu/Show" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/CMarkMenu/CMarkMatchMenu/Clear" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/CMarkMenu/CMarkMatchMenu/Show" ), + !ListEmpty ( &lMatch ) ); + + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/RolloutMenu/Cube" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/RolloutMenu/Move" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/RolloutMenu/Game" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/RolloutMenu/Match" ), + !ListEmpty ( &lMatch ) ); + + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/AddMatchOrSessionStatsToDB" ), + !ListEmpty ( &lMatch ) ); + gtk_widget_set_sensitive( gtk_ui_manager_get_widget (puim, + "/MainMenu/AnalyseMenu/ShowRecords" ), TRUE ); +#else gtk_widget_set_sensitive( gtk_item_factory_get_widget( pif, "/File/Save..." ), plGame != NULL ); - + enable_sub_menu( gtk_item_factory_get_widget( pif, "/Game" ), ms.gs == GAME_PLAYING ); enable_menu ( gtk_item_factory_get_widget ( pif, "/Game/Roll" ), - ms.fMove == ms.fTurn && + ms.fMove == ms.fTurn && ap[ ms.fMove ].pt == PLAYER_HUMAN ); gtk_widget_set_sensitive( gtk_item_factory_get_widget_by_action( @@ -5959,7 +6643,7 @@ extern void GTKSet( void *p ) { gtk_widget_set_sensitive( gtk_item_factory_get_widget( pif, "/File/Match information..." ), !ListEmpty( &lMatch ) ); - + enable_sub_menu( gtk_item_factory_get_widget( pif, "/Analyse" ), ms.gs == GAME_PLAYING ); @@ -5967,7 +6651,7 @@ extern void GTKSet( void *p ) { "/Analyse/Batch analyse..." ), TRUE ); gtk_widget_set_sensitive( gtk_item_factory_get_widget_by_action( - pif, CMD_ANALYSE_MOVE ), + pif, CMD_ANALYSE_MOVE ), plLastMove && plLastMove->plNext && plLastMove->plNext->p ); gtk_widget_set_sensitive( gtk_item_factory_get_widget_by_action( pif, CMD_ANALYSE_GAME ), plGame != NULL ); @@ -5975,7 +6659,7 @@ extern void GTKSet( void *p ) { pif, CMD_ANALYSE_MATCH ), !ListEmpty( &lMatch ) ); gtk_widget_set_sensitive( gtk_item_factory_get_widget_by_action( - pif, CMD_ANALYSE_CLEAR_MOVE ), + pif, CMD_ANALYSE_CLEAR_MOVE ), plLastMove && plLastMove->plNext && plLastMove->plNext->p ); gtk_widget_set_sensitive( gtk_item_factory_get_widget_by_action( pif, CMD_ANALYSE_CLEAR_GAME ), plGame != NULL ); @@ -6014,20 +6698,25 @@ extern void GTKSet( void *p ) { gtk_widget_set_sensitive( gtk_item_factory_get_widget_by_action( pif, CMD_ANALYSE_ROLLOUT_MATCH), !ListEmpty(&lMatch)); - gtk_widget_set_sensitive( + gtk_widget_set_sensitive( gtk_item_factory_get_widget( pif, - "/Analyse/Add match or session to database" ), + "/Analyse/Add match or session to database" ), !ListEmpty( &lMatch ) ); - gtk_widget_set_sensitive( + gtk_widget_set_sensitive( gtk_item_factory_get_widget( pif, - "/Analyse/Show Records" ), + "/Analyse/Show Records" ), TRUE ); - +#endif fAutoCommand = FALSE; - } else if( p == &ms.fCrawford ) + } else if( p == &ms.fCrawford ) { + bd->crawford_game = ms.fCrawford; + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( bd->crawford ), + ms.fCrawford ); ShowBoard(); /* this is overkill, but it works */ - else if (IsPanelShowVar(WINDOW_ANNOTATION, p)) { + } else if( p == &ms.nCube ) { + ShowBoard(); /* this is overkill, but it works */ + } else if (IsPanelShowVar(WINDOW_ANNOTATION, p)) { if (PanelShowing(WINDOW_ANNOTATION)) ShowHidePanel(WINDOW_ANNOTATION); } else if (IsPanelShowVar(WINDOW_GAME, p)) { @@ -6041,7 +6730,7 @@ extern void GTKSet( void *p ) { } else if (IsPanelShowVar(WINDOW_COMMAND, p)) { ShowHidePanel(WINDOW_COMMAND); } else if( p == &bd->rd->fDiceArea ) { - if( GTK_WIDGET_REALIZED( pwBoard ) ) + if( gtk_widget_get_realized( pwBoard ) ) { #if USE_BOARD3D /* If in 3d mode may need to update sizes */ @@ -6049,11 +6738,11 @@ extern void GTKSet( void *p ) { SetupViewingVolume3d(bd, bd->bd3d, bd->rd); else #endif - { - if( GTK_WIDGET_REALIZED( pwBoard ) ) { - if( GTK_WIDGET_VISIBLE( bd->dice_area ) && !bd->rd->fDiceArea ) + { + if( gtk_widget_get_realized( pwBoard ) ) { + if( gtk_widget_get_visible( bd->dice_area ) && !bd->rd->fDiceArea ) gtk_widget_hide( bd->dice_area ); - else if( ! GTK_WIDGET_VISIBLE( bd->dice_area ) && bd->rd->fDiceArea ) + else if( ! gtk_widget_get_visible( bd->dice_area ) && bd->rd->fDiceArea ) gtk_widget_show_all( bd->dice_area ); } }} @@ -6061,7 +6750,13 @@ extern void GTKSet( void *p ) { else if( p == &fShowIDs ) { inCallback = TRUE; +#if (USE_GTKUIMANAGER) + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM( gtk_ui_manager_get_widget (puim, + "/MainMenu/ViewMenu/ShowIDStatusBar" ) ), fShowIDs ); + +#else gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(pif, "/View/Show ID in status bar" )), fShowIDs); +#endif inCallback = FALSE; if (!fShowIDs) @@ -6087,40 +6782,34 @@ extern void GTKSet( void *p ) { #define FORMATGS_ALL -1 #define NUM_STAT_TYPES 4 char *aszStatHeading [ NUM_STAT_TYPES ] = { - N_("Chequer Play Statistics:"), + N_("Chequer Play Statistics:"), N_("Cube Statistics:"), N_("Luck Statistics:"), N_("Overall Statistics:")}; -static GtkWidget* statLists[NUM_STAT_TYPES], *pwList; -static int numStatGames, curStatGame; -static GtkWidget* statPom; +static GtkWidget* statViews[NUM_STAT_TYPES], *statView; +static int numStatGames; GtkWidget *pwStatDialog; int fGUIUseStatsPanel = TRUE; GtkWidget *pswList; GtkWidget *pwNotebook; -static void AddList(char* pStr, GtkCList* pList, const char* pTitle) +static void AddList(char *pStr, GtkWidget *view, const char *pTitle) { - int i; gchar *sz; + GtkTreeIter iter; + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(view)); - sprintf ( strchr ( pStr, 0 ), "%s\n", pTitle); - - for (i = 0; i < pList->rows; i++ ) - { - sprintf ( strchr ( pStr, 0 ), "%-37s ", - ( gtk_clist_get_text ( pList, i, 0, &sz ) ) ? - sz : "" ); - - sprintf ( strchr ( pStr, 0 ), "%-20s ", - ( gtk_clist_get_text ( pList, i, 1, &sz ) ) ? - sz : "" ); - - sprintf ( strchr ( pStr, 0 ), "%-20s\n", - ( gtk_clist_get_text ( pList, i, 2, &sz ) ) ? - sz : "" ); - } - sprintf ( strchr ( pStr, 0 ), "\n"); + sprintf(strchr(pStr, 0), "%s\n", pTitle); + if (gtk_tree_model_get_iter_first(model, &iter)) + do { + gtk_tree_model_get(model, &iter, 0, &sz, -1); + sprintf(strchr(pStr, 0), "%-37s ", sz ? sz : ""); + gtk_tree_model_get(model, &iter, 1, &sz, -1); + sprintf(strchr(pStr, 0), "%-20s ", sz ? sz : ""); + gtk_tree_model_get(model, &iter, 2, &sz, -1); + sprintf(strchr(pStr, 0), "%-20s\n", sz ? sz : ""); + } while (gtk_tree_model_iter_next(model, &iter)); + sprintf(strchr(pStr, 0), "\n"); } static void CopyData(GtkWidget *pwNotebook, int page) @@ -6130,13 +6819,13 @@ static void CopyData(GtkWidget *pwNotebook, int page) sprintf(szOutput, "%-37s %-20s %-20s\n", "", ap[ 0 ].szName, ap[ 1 ].szName); if (page == FORMATGS_CHEQUER || page == FORMATGS_ALL) - AddList(szOutput, GTK_CLIST(statLists[FORMATGS_CHEQUER]), aszStatHeading[FORMATGS_CHEQUER]); + AddList(szOutput, statViews[FORMATGS_CHEQUER], aszStatHeading[FORMATGS_CHEQUER]); if (page == FORMATGS_LUCK || page == FORMATGS_ALL) - AddList(szOutput, GTK_CLIST(statLists[FORMATGS_LUCK]), aszStatHeading[FORMATGS_LUCK]); + AddList(szOutput, statViews[FORMATGS_LUCK], aszStatHeading[FORMATGS_LUCK]); if (page == FORMATGS_CUBE || page == FORMATGS_ALL) - AddList(szOutput, GTK_CLIST(statLists[FORMATGS_CUBE]), aszStatHeading[FORMATGS_CUBE]); + AddList(szOutput, statViews[FORMATGS_CUBE], aszStatHeading[FORMATGS_CUBE]); if (page == FORMATGS_OVERALL || page == FORMATGS_ALL) - AddList(szOutput, GTK_CLIST(statLists[FORMATGS_OVERALL]), aszStatHeading[FORMATGS_OVERALL]); + AddList(szOutput, statViews[FORMATGS_OVERALL], aszStatHeading[FORMATGS_OVERALL]); TextToClipboard(szOutput); } @@ -6166,49 +6855,55 @@ static void CopyAll( GtkWidget *pwWidget, GtkWidget *pwNotebook ) } static void FillStats(const statcontext *psc, const matchstate *pms, - const enum _formatgs gs, GtkWidget* statList ) -{ - - GList *list = formatGS( psc, pms->nMatchTo, gs ); - GList *pl; - - for ( pl = g_list_first( list ); pl; pl = g_list_next( pl ) ) { - - char **aasz = pl->data; - - gtk_clist_append( GTK_CLIST( statList ), aasz ); - - } - - freeGS( list ); - + const enum _formatgs gs, GtkWidget *statView) +{ + + GList *list = formatGS(psc, pms->nMatchTo, gs); + GList *pl; + GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(statView))); + + for (pl = g_list_first(list); pl; pl = g_list_next(pl)) { + GtkTreeIter iter; + char **aasz = pl->data; + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, aasz[0], 1, aasz[1], 2, aasz[2], -1); + } + freeGS(list); } static void SetStats(const statcontext *psc) { - char *aszLine[] = { NULL, NULL, NULL }; + char *aszLine[] = { NULL, NULL, NULL }; int i; + GtkListStore *store; + GtkTreeIter iter; - for ( i = 0; i < NUM_STAT_TYPES; ++i ) - gtk_clist_clear(GTK_CLIST(statLists[i])); - - for ( i = 0; i < NUM_STAT_TYPES; ++i ) - FillStats( psc, &ms, i, statLists[ i ] ); - - gtk_clist_clear(GTK_CLIST(pwList)); + for (i = 0; i < NUM_STAT_TYPES; ++i) + { + store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model(GTK_TREE_VIEW(statViews[i]), GTK_TREE_MODEL(store)); + FillStats(psc, &ms, i, statViews[i]); + g_object_unref(store); + } + store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model(GTK_TREE_VIEW(statView), GTK_TREE_MODEL(store)); + g_object_unref(store); aszLine[0] = aszStatHeading[FORMATGS_CHEQUER]; - gtk_clist_append( GTK_CLIST( pwList ), aszLine ); - FillStats( psc, &ms, FORMATGS_CHEQUER, pwList ); - FillStats( psc, &ms, FORMATGS_LUCK, pwList ); - + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, aszLine[0], -1); + FillStats(psc, &ms, FORMATGS_CHEQUER, statView); + FillStats(psc, &ms, FORMATGS_LUCK, statView); + aszLine[0] = aszStatHeading[FORMATGS_CUBE]; - gtk_clist_append( GTK_CLIST( pwList ), aszLine ); - FillStats( psc, &ms, FORMATGS_CUBE, pwList ); - + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, aszLine[0], -1); + FillStats(psc, &ms, FORMATGS_CUBE, statView); + aszLine[0] = aszStatHeading[FORMATGS_OVERALL]; - gtk_clist_append( GTK_CLIST( pwList ), aszLine ); - FillStats( psc, &ms, FORMATGS_OVERALL, pwList ); + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, 0, aszLine[0], -1); + FillStats(psc, &ms, FORMATGS_OVERALL, statView); } static const statcontext *GetStatContext(int game) @@ -6230,18 +6925,12 @@ static const statcontext *GetStatContext(int game) } } -static void StatsSelectGame(GtkWidget *pw, int i) +static void StatsSelectGame(GtkWidget *box, int i) { - curStatGame = i; - - gtk_option_menu_set_history( GTK_OPTION_MENU( statPom ), curStatGame ); - - if (!curStatGame) - { + int curStatGame = gtk_combo_box_get_active(GTK_COMBO_BOX(box)); + if (!curStatGame) { gtk_window_set_title(GTK_WINDOW(pwStatDialog), _("Statistics for all games")); - } - else - { + } else { char sz[100]; strcpy(sz, _("Statistics for game ")); sprintf(sz + strlen(sz), "%d", curStatGame); @@ -6250,136 +6939,62 @@ static void StatsSelectGame(GtkWidget *pw, int i) SetStats(GetStatContext(curStatGame)); } -static void StatsAllGames( GtkWidget *pw, char *szCommand ) -{ - if (curStatGame != 0) - StatsSelectGame(pw, 0); -} - -static void StatsFirstGame( GtkWidget *pw, char *szCommand ) -{ - if (curStatGame != 1) - StatsSelectGame(pw, 1); -} - -static void StatsLastGame( GtkWidget *pw, char *szCommand ) +static void StatsPreviousGame( GtkWidget *button, GtkWidget *combo ) { - if (curStatGame != numStatGames) - StatsSelectGame(pw, numStatGames); + int i = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); + if (i > 0) + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i -1 ); } -static void StatsPreviousGame( GtkWidget *pw, char *szCommand ) +static void StatsNextGame( GtkWidget *button, GtkWidget *combo) { - if (curStatGame > 1) - StatsSelectGame(pw, curStatGame - 1); + int i = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); + if (i < numStatGames) + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), gtk_combo_box_get_active(GTK_COMBO_BOX(combo))+1); } -static void StatsNextGame( GtkWidget *pw, char *szCommand ) +static GtkWidget *AddNavigation(GtkWidget *pvbox) { - if (curStatGame < numStatGames) - StatsSelectGame(pw, curStatGame + 1); -} - -extern GtkWidget *StatsPixmapButton(GdkColormap *pcmap, char **xpm, - void (*fn)(GtkWidget*, char*)) -{ - GdkPixmap *ppm; - GdkBitmap *pbm; - GtkWidget *pw, *pwButton; - - ppm = gdk_pixmap_colormap_create_from_xpm_d( NULL, pcmap, &pbm, NULL, - xpm ); - pw = gtk_pixmap_new( ppm, pbm ); - pwButton = gtk_button_new(); - gtk_container_add( GTK_CONTAINER( pwButton ), pw ); - - g_signal_connect( G_OBJECT( pwButton ), "clicked", - G_CALLBACK( fn ), 0 ); - - return pwButton; -} + GtkWidget *phbox, *pw, *box; + char sz[128]; + int anFinalScore[2]; + listOLD *pl; -static void AddNavigation(GtkWidget* pvbox) -{ - GtkWidget *phbox, *pm, *pw; - GdkColormap *pcmap; - char sz[128]; - listOLD *pl; + box = gtk_combo_box_text_new(); -#include "xpm/prevgame.xpm" -#include "xpm/prevmove.xpm" -#include "xpm/nextmove.xpm" -#include "xpm/nextgame.xpm" -#include "xpm/allgames.xpm" - - pcmap = gtk_widget_get_colormap( pwMain ); - - phbox = gtk_hbox_new( FALSE, 0 ), - gtk_box_pack_start( GTK_BOX( pvbox ), phbox, FALSE, FALSE, 4 ); - - gtk_box_pack_start( GTK_BOX( phbox ), - pw = StatsPixmapButton(pcmap, allgames_xpm, StatsAllGames), - FALSE, FALSE, 4 ); - gtk_widget_set_tooltip_text(pw, _("Show all games")); - gtk_box_pack_start( GTK_BOX( phbox ), - pw = StatsPixmapButton(pcmap, prevgame_xpm, StatsFirstGame), - FALSE, FALSE, 4 ); - gtk_widget_set_tooltip_text(pw, _("Move to first game")); - gtk_box_pack_start( GTK_BOX( phbox ), - pw = StatsPixmapButton(pcmap, prevmove_xpm, StatsPreviousGame), - FALSE, FALSE, 0 ); + if (getFinalScore(anFinalScore)) + sprintf(sz, _("All games: %s %d, %s %d"), ap[0].szName, + anFinalScore[0], ap[1].szName, anFinalScore[1]); + else + sprintf(sz, _("All games: %s, %s"), ap[0].szName, ap[1].szName); + phbox = gtk_hbox_new(FALSE, 0), gtk_box_pack_start(GTK_BOX(pvbox), phbox, FALSE, FALSE, 4); + pw = button_from_image(gtk_image_new_from_stock + (GNUBG_STOCK_GO_PREV_GAME, GTK_ICON_SIZE_LARGE_TOOLBAR)); + g_signal_connect(G_OBJECT(pw), "clicked", G_CALLBACK(StatsPreviousGame), box); + gtk_box_pack_start(GTK_BOX(phbox), pw, FALSE, FALSE, 0); gtk_widget_set_tooltip_text(pw, _("Move back to the previous game")); - gtk_box_pack_start( GTK_BOX( phbox ), - pw = StatsPixmapButton(pcmap, nextmove_xpm, StatsNextGame), - FALSE, FALSE, 4 ); - gtk_widget_set_tooltip_text(pw, _("Move ahead to the next game")); - gtk_box_pack_start( GTK_BOX( phbox ), - pw = StatsPixmapButton(pcmap, nextgame_xpm, StatsLastGame), - FALSE, FALSE, 0 ); - gtk_widget_set_tooltip_text(pw, _("Move ahead to last game")); - pm = gtk_menu_new(); - - { - int anFinalScore[ 2 ]; - - if ( getFinalScore( anFinalScore ) ) - sprintf( sz, _("All games: %s %d, %s %d"), ap[ 0 ].szName, - anFinalScore[ 0 ], ap[ 1 ].szName, anFinalScore[ 1 ] ); - else - sprintf( sz, _("All games: %s, %s"), ap[ 0 ].szName, - ap[ 1 ].szName ); - } - - pw = gtk_menu_item_new_with_label(sz); - gtk_menu_append(GTK_MENU(pm), pw); - g_signal_connect( G_OBJECT( pw ), "activate", - G_CALLBACK(StatsSelectGame), 0); + pw = button_from_image(gtk_image_new_from_stock + (GNUBG_STOCK_GO_NEXT_GAME, GTK_ICON_SIZE_LARGE_TOOLBAR)); + g_signal_connect(G_OBJECT(pw), "clicked", G_CALLBACK(StatsNextGame), box); + gtk_box_pack_start(GTK_BOX(phbox), pw, FALSE, FALSE, 4); + gtk_widget_set_tooltip_text(pw, _("Move ahead to the next game")); + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(box), sz); numStatGames = 0; - curStatGame = 0; - for (pl = lMatch.plNext; pl->p; pl = pl->plNext ) - { + for (pl = lMatch.plNext; pl->p; pl = pl->plNext) { listOLD *plGame = pl->p; moverecord *pmr = plGame->plNext->p; numStatGames++; - sprintf(sz, _("Game %d: %s %d, %s %d"), pmr->g.i + 1, ap[ 0 ].szName, - pmr->g.anScore[ 0 ], ap[ 1 ].szName, pmr->g.anScore[ 1 ] ); - pw = gtk_menu_item_new_with_label(sz); - - g_signal_connect( G_OBJECT( pw ), "activate", - G_CALLBACK(StatsSelectGame), GINT_TO_POINTER(numStatGames)); - - gtk_widget_show( pw ); - gtk_menu_append( GTK_MENU( pm ), pw ); + sprintf(sz, _("Game %d: %s %d, %s %d"), pmr->g.i + 1, ap[0].szName, + pmr->g.anScore[0], ap[1].szName, pmr->g.anScore[1]); + gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(box), sz); } + g_signal_connect(G_OBJECT(box), "changed", G_CALLBACK(StatsSelectGame), NULL); + gtk_box_pack_start(GTK_BOX(phbox), box, TRUE, TRUE, 4); - gtk_widget_show_all( pm ); - gtk_option_menu_set_menu( GTK_OPTION_MENU( statPom = gtk_option_menu_new() ), pm ); - gtk_option_menu_set_history( GTK_OPTION_MENU( statPom ), 0 ); - - gtk_box_pack_start( GTK_BOX( phbox ), statPom, TRUE, TRUE, 4 ); + return box; } static void toggle_fGUIUseStatsPanel(GtkWidget *widget, GtkWidget *pw) @@ -6398,87 +7013,86 @@ static void toggle_fGUIUseStatsPanel(GtkWidget *widget, GtkWidget *pw) } } -static gint -compare_func( gconstpointer a, gconstpointer b ) { +static void StatcontextCopy(GtkWidget *pw, GtkTreeView *view) +{ + static char szOutput[4096]; + GtkTreeSelection *selection; + GtkTreeModel *model; + GList *row; + GList *rows; - gint i = GPOINTER_TO_INT( a ); - gint j = GPOINTER_TO_INT( b ); + selection = gtk_tree_view_get_selection(view); - if ( i < j ) - return -1; - else if ( i == j ) - return 0; - else - return 1; + if (gtk_tree_selection_count_selected_rows(selection) < 1) + return; -} + sprintf(szOutput, "%-37s %-20s %-20s\n", "", ap[0].szName, ap[1].szName); -static void StatcontextCopy(GtkWidget *pw, GtkWidget *pwList) -{ - GList *pl; - GList *plCopy; - int i; - static char szOutput[ 4096 ]; - char *pc; - gchar *sz; - - sprintf ( szOutput, - "%-37s %-20s %-20s\n", - "", ap[ 0 ].szName, ap[ 1 ].szName ); - - /* copy list (note that the integers in the list are NOT copied) */ - plCopy = g_list_copy( GTK_CLIST ( pwList )->selection ); - - /* sort list; otherwise the lines are returned in whatever order the - user clicked the lines (bug #4160) */ - plCopy = g_list_sort( plCopy, compare_func ); - - for ( pl = plCopy; pl; pl = pl->next ) { - - i = GPOINTER_TO_INT( pl->data ); - - sprintf ( pc = strchr ( szOutput, 0 ), "%-37s ", - ( gtk_clist_get_text ( GTK_CLIST ( pwList ), i, 0, &sz ) ) ? - sz : "" ); - - sprintf ( pc = strchr ( szOutput, 0 ), "%-20s ", - ( gtk_clist_get_text ( GTK_CLIST ( pwList ), i, 1, &sz ) ) ? - sz : "" ); - - sprintf ( pc = strchr ( szOutput, 0 ), "%-20s\n", - ( gtk_clist_get_text ( GTK_CLIST ( pwList ), i, 2, &sz ) ) ? - sz : "" ); - - } + rows = gtk_tree_selection_get_selected_rows(selection, &model); + + for (row = rows ; row; row = row->next) { + GtkTreeIter iter; + gchar *sz; + GtkTreePath *path = row->data; + gchar *pc; + gtk_tree_model_get_iter(model, &iter, path); + + gtk_tree_model_get(model, &iter, 0, &sz, -1); + sprintf(pc = strchr(szOutput, 0), "%-37s ", sz ? sz : ""); + g_free(sz); + + gtk_tree_model_get(model, &iter, 1, &sz, -1); + sprintf(pc = strchr(szOutput, 0), "%-20s ", sz ? sz : ""); + g_free(sz); + + gtk_tree_model_get(model, &iter, 2, &sz, -1); + sprintf(pc = strchr(szOutput, 0), "%-20s\n", sz ? sz : ""); + g_free(sz); - /* garbage collect */ - g_list_free(plCopy); - - GTKTextToClipboard(szOutput); + gtk_tree_path_free(path); + } + g_list_free(rows); + GTKTextToClipboard(szOutput); } static GtkWidget *CreateList(void) { int i; - static char *aszEmpty[] = { NULL, NULL, NULL }; - GtkWidget *pwList = gtk_clist_new_with_titles( 3, aszEmpty ); - - for( i = 0; i < 3; i++ ) { - gtk_clist_set_column_auto_resize( GTK_CLIST( pwList ), i, TRUE ); - gtk_clist_set_column_justification( GTK_CLIST( pwList ), - i, GTK_JUSTIFY_RIGHT ); + GtkWidget *view; + GtkWidget *copyMenu; + GtkWidget *menu_item; + + view = gtk_tree_view_new(); + + for (i=0; i < 3; i++) { + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + renderer = gtk_cell_renderer_text_new(); + g_object_set(renderer, "xalign", 1.0, NULL); + column = gtk_tree_view_column_new_with_attributes("", renderer, "text", i, NULL); + gtk_tree_view_column_set_alignment (column, 0.97); + gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); } + gtk_tree_view_column_set_title (gtk_tree_view_get_column (GTK_TREE_VIEW(view), 1), ap[0].szName); + gtk_tree_view_column_set_title (gtk_tree_view_get_column (GTK_TREE_VIEW(view), 2), ap[1].szName); + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), GTK_SELECTION_MULTIPLE); + /* list view (selections) */ + copyMenu = gtk_menu_new (); + + menu_item = gtk_menu_item_new_with_label ("Copy selection"); + gtk_menu_shell_append (GTK_MENU_SHELL (copyMenu), menu_item); + gtk_widget_show (menu_item); + g_signal_connect( G_OBJECT( menu_item ), "activate", G_CALLBACK( StatcontextCopy ), view ); - gtk_clist_column_titles_passive( GTK_CLIST( pwList ) ); - - gtk_clist_set_column_title( GTK_CLIST( pwList ), 1, (ap[0].szName)); - gtk_clist_set_column_title( GTK_CLIST( pwList ), 2, (ap[1].szName)); + menu_item = gtk_menu_item_new_with_label ("Copy all"); + gtk_menu_shell_append (GTK_MENU_SHELL (copyMenu), menu_item); + gtk_widget_show (menu_item); + g_signal_connect( G_OBJECT( menu_item ), "activate", G_CALLBACK( CopyAll ), pwNotebook ); - gtk_clist_set_selection_mode( GTK_CLIST( pwList ), - GTK_SELECTION_EXTENDED ); + g_signal_connect( G_OBJECT( view ), "button-press-event", G_CALLBACK( ContextMenu ), copyMenu ); - return pwList; + return view; } static void stat_dialog_map(GtkWidget *window, GtkWidget *pwUsePanels) @@ -6489,6 +7103,7 @@ static void stat_dialog_map(GtkWidget *window, GtkWidget *pwUsePanels) extern void GTKDumpStatcontext( int game ) { GtkWidget *copyMenu, *menu_item, *pvbox, *pwUsePanels; + GtkWidget *navi_combo; #if USE_BOARD3D int i; GtkWidget *pw; @@ -6501,35 +7116,31 @@ extern void GTKDumpStatcontext( int game ) gtk_notebook_set_scrollable( GTK_NOTEBOOK( pwNotebook ), TRUE ); gtk_notebook_popup_disable( GTK_NOTEBOOK( pwNotebook ) ); -/* Not sure if this is a good idea... - gtk_widget_set_tooltip_text(pwNotebook, _("Right click to copy statistics")); -*/ - pvbox = gtk_vbox_new( FALSE, 0 ), gtk_box_pack_start( GTK_BOX( pvbox ), pwNotebook, TRUE, TRUE, 0); - gtk_notebook_append_page( GTK_NOTEBOOK( pwNotebook ), statLists[FORMATGS_OVERALL] = CreateList(), + gtk_notebook_append_page( GTK_NOTEBOOK( pwNotebook ), statViews[FORMATGS_OVERALL] = CreateList(), gtk_label_new(_("Overall"))); - gtk_notebook_append_page( GTK_NOTEBOOK( pwNotebook ), statLists[FORMATGS_CHEQUER] = CreateList(), + gtk_notebook_append_page( GTK_NOTEBOOK( pwNotebook ), statViews[FORMATGS_CHEQUER] = CreateList(), gtk_label_new(_("Chequer play"))); - gtk_notebook_append_page( GTK_NOTEBOOK( pwNotebook ), statLists[FORMATGS_CUBE] = CreateList(), + gtk_notebook_append_page( GTK_NOTEBOOK( pwNotebook ), statViews[FORMATGS_CUBE] = CreateList(), gtk_label_new(_("Cube decisions"))); - gtk_notebook_append_page( GTK_NOTEBOOK( pwNotebook ), statLists[FORMATGS_LUCK] = CreateList(), + gtk_notebook_append_page( GTK_NOTEBOOK( pwNotebook ), statViews[FORMATGS_LUCK] = CreateList(), gtk_label_new(_("Luck"))); - pwList = CreateList(); + statView = CreateList(); pswList = gtk_scrolled_window_new( NULL, NULL ); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( pswList ), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC ); - gtk_container_add( GTK_CONTAINER( pswList ), pwList ); + gtk_container_add( GTK_CONTAINER( pswList ), statView ); gtk_box_pack_start (GTK_BOX (pvbox), pswList, TRUE, TRUE, 0); - AddNavigation(pvbox); + navi_combo = AddNavigation(pvbox); gtk_container_add( GTK_CONTAINER( DialogArea( pwStatDialog, DA_MAIN ) ), pvbox ); #if USE_BOARD3D @@ -6567,14 +7178,14 @@ extern void GTKDumpStatcontext( int game ) menu_item = gtk_menu_item_new_with_label ("Copy selection"); gtk_menu_shell_append (GTK_MENU_SHELL (copyMenu), menu_item); gtk_widget_show (menu_item); - g_signal_connect( G_OBJECT( menu_item ), "activate", G_CALLBACK( StatcontextCopy ), pwList ); + g_signal_connect( G_OBJECT( menu_item ), "activate", G_CALLBACK( StatcontextCopy ), statView ); menu_item = gtk_menu_item_new_with_label ("Copy all"); gtk_menu_shell_append (GTK_MENU_SHELL (copyMenu), menu_item); gtk_widget_show (menu_item); g_signal_connect( G_OBJECT( menu_item ), "activate", G_CALLBACK( CopyAll ), pwNotebook ); - g_signal_connect( G_OBJECT( pwList ), "button-press-event", G_CALLBACK( ContextMenu ), copyMenu ); + g_signal_connect( G_OBJECT( statView ), "button-press-event", G_CALLBACK( ContextMenu ), copyMenu ); /* dialog size */ if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( pwUsePanels ) ) ) @@ -6600,7 +7211,7 @@ extern void GTKDumpStatcontext( int game ) g_signal_connect( G_OBJECT( pwNotebook ), "button-press-event", G_CALLBACK( ContextMenu ), copyMenu ); - StatsSelectGame(0, game); + gtk_combo_box_set_active(GTK_COMBO_BOX(navi_combo), game); g_signal_connect(pwStatDialog, "map", G_CALLBACK(stat_dialog_map), pwUsePanels); @@ -6618,331 +7229,18 @@ GTKGetMove ( int anMove[ 8 ] ) { if ( !bd->valid_move ) return 0; - + memcpy ( anMove, bd->valid_move->anMove, 8 * sizeof ( int ) ); return 1; } -typedef struct _recordwindowinfo { - GtkWidget *pwList, *pwTable, *apwStats[ 22 ]; - int nRow; -} recordwindowinfo; - -static void RecordSelect( GtkCList *pw, gint nRow, gint nCol, - GdkEventButton *pev, recordwindowinfo *prwi ) { - char *pch; - int i; - - for( i = 0; i < 22; i++ ) { - gtk_clist_get_text( pw, nRow, i, &pch ); - gtk_label_set_text( GTK_LABEL( prwi->apwStats[ i ] ), pch ); - } - - prwi->nRow = nRow; -} - -static void RecordUnselect( GtkCList *pw, gint nRow, gint nCol, - GdkEventButton *pev, recordwindowinfo *prwi ) { - int i; - - for( i = 0; i < 22; i++ ) - gtk_label_set_text( GTK_LABEL( prwi->apwStats[ i ] ), NULL ); -} - -static void RecordEraseAll( GtkWidget *pw, recordwindowinfo *prwi ) { - - FILE *pf; - char *sz = g_build_filename (szHomeDirectory, "gnubgpr", NULL); - - UserCommand( "record eraseall" ); - - /* FIXME this is a horrible hack to determine whether the records were - really erased */ - - if( ( pf = g_fopen( sz, "r" ) ) ) { - fclose( pf ); - g_free( sz ); - return; - } - g_free(sz); - - gtk_clist_clear( GTK_CLIST( prwi->pwList ) ); -} - -static gint RecordRowCompare( GtkCList *pcl, GtkCListRow *p0, - GtkCListRow *p1 ) { - - return StrCaseCmp( GTK_CELL_TEXT( p0->cell[ pcl->sort_column ] )->text, - GTK_CELL_TEXT( p1->cell[ pcl->sort_column ] )->text ); -} - -/* 0: name [visible] - 1: chequer (20) - 2: cube (20) - 3: combined (20) - 4: chequer (100) - 5: cube (100) - 6: combined (100) - 7: chequer (500) - 8: cube (500) - 9: combined (500) - 10: chequer (total) [visible] - 11: cube (total) [visible] - 12: combined (total) [visible] - 13: luck (20) - 14: luck (100) - 15: luck (500) - 16: luck (total) [visible] - 17: games [visible] - 18: chequer rating - 19: cube rating - 20: combined rating - 21: luck rating */ - -extern void GTKRecordShow( FILE *pfIn, char *szFile, char *szPlayer ) { - - GtkWidget *pw = NULL, *pwList = NULL, *pwScrolled, *pwHbox, *pwVbox, - *pwEraseAll; - static int ay[ 22 ] = { 0, 3, 5, 7, 3, 5, 7, 3, 5, 7, 3, 5, 7, 9, 9, 9, 9, - 1, 4, 6, 8, 10 }; - static int ax[ 22 ] = { 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 1, 2, 3, 4, - 1, 1, 1, 1, 1 }; - static int axEnd[ 22 ] = { 5, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 2, 3, 4, - 5, 5, 5, 5, 5, 5 }; - char *asz[ 22 ]; - char sz[ 16 ]; - int i, f = FALSE; - playerrecord pr; - recordwindowinfo rwi; - - while( !RecordReadItem( pfIn, szFile, &pr ) ) { - if( !f ) { - f = TRUE; - pw = GTKCreateDialog( _("GNU Backgammon - Player records"), DT_INFO, - NULL, DIALOG_FLAG_MODAL, NULL, NULL ); - - for( i = 0; i < 22; i++ ) - asz[ i ] = ""; - - rwi.pwList = pwList = gtk_clist_new_with_titles( 22, asz ); - gtk_clist_set_compare_func( - GTK_CLIST( pwList ), (GtkCListCompareFunc) RecordRowCompare ); - - for( i = 0; i < 22; i++ ) { - gtk_clist_set_column_auto_resize( GTK_CLIST( pwList ), i, - TRUE ); - gtk_clist_set_column_justification( GTK_CLIST( pwList ), i, - i ? GTK_JUSTIFY_RIGHT : - GTK_JUSTIFY_LEFT ); - gtk_clist_set_column_visibility( GTK_CLIST( pwList ), i, - FALSE ); - } - - gtk_clist_set_column_title( GTK_CLIST( pwList ), 0, _("Name") ); - gtk_clist_set_column_visibility( GTK_CLIST( pwList ), 0, TRUE ); - gtk_clist_set_column_title( GTK_CLIST( pwList ), 10, - _("Chequer") ); - gtk_clist_set_column_visibility( GTK_CLIST( pwList ), 10, TRUE ); - gtk_clist_set_column_title( GTK_CLIST( pwList ), 11, _("Cube") ); - gtk_clist_set_column_visibility( GTK_CLIST( pwList ), 11, TRUE ); - gtk_clist_set_column_title( GTK_CLIST( pwList ), 12, - _("Overall") ); - gtk_clist_set_column_visibility( GTK_CLIST( pwList ), 12, TRUE ); - gtk_clist_set_column_title( GTK_CLIST( pwList ), 16, _("Luck") ); - gtk_clist_set_column_visibility( GTK_CLIST( pwList ), 16, TRUE ); - gtk_clist_set_column_title( GTK_CLIST( pwList ), 17, _("Games") ); - gtk_clist_set_column_visibility( GTK_CLIST( pwList ), 17, TRUE ); - - gtk_clist_column_titles_passive( GTK_CLIST( pwList ) ); - g_signal_connect( G_OBJECT( pwList ), "select-row", - G_CALLBACK( RecordSelect ), &rwi ); - g_signal_connect( G_OBJECT( pwList ), "unselect-row", - G_CALLBACK( RecordUnselect ), &rwi ); - pwScrolled = gtk_scrolled_window_new( NULL, NULL ); - pwHbox = gtk_hbox_new( FALSE, 0 ); - pwVbox = gtk_vbox_new( FALSE, 0 ); - gtk_container_add( GTK_CONTAINER( DialogArea( pw, DA_MAIN ) ), - pwHbox ); - gtk_container_add( GTK_CONTAINER( pwHbox ), pwScrolled ); - gtk_container_add( GTK_CONTAINER( pwScrolled ), pwList ); - gtk_container_add( GTK_CONTAINER( pwHbox ), pwVbox ); - rwi.pwTable = gtk_table_new( 11, 5, TRUE ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("Name:") ), 0, 1, - 0, 1 ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("Games:") ), 0, 1, - 1, 2 ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("Chequer:") ), 0, 1, - 3, 5 ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("Cube:") ), 0, 1, - 5, 7 ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("Overall:") ), 0, 1, - 7, 9 ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("Luck:") ), 0, 1, - 9, 11 ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("20") ), 1, 2, - 2, 3 ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("100") ), 2, 3, - 2, 3 ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("500") ), 3, 4, - 2, 3 ); - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - gtk_label_new( _("Total") ), 4, 5, - 2, 3 ); - for( i = 0; i < 22; i++ ) - gtk_table_attach_defaults( GTK_TABLE( rwi.pwTable ), - rwi.apwStats[ i ] = - gtk_label_new( NULL ), - ax[ i ], axEnd[ i ], - ay[ i ], ay[ i ] + 1 ); - gtk_container_add( GTK_CONTAINER( pwVbox ), rwi.pwTable ); - pwEraseAll = gtk_button_new_with_label( _("Erase All" ) ); - g_signal_connect( G_OBJECT( pwEraseAll ), "clicked", - G_CALLBACK( RecordEraseAll ), &rwi ); - gtk_box_pack_start( GTK_BOX( pwVbox ), pwEraseAll, FALSE, FALSE, - 0 ); - } - - i = gtk_clist_append( GTK_CLIST( pwList ), asz ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 0, pr.szName ); - - if( pr.cGames >= 20 ) - sprintf( sz, "%.4f", -pr.arErrorChequerplay[ EXPAVG_20 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 1, sz ); - - if( pr.cGames >= 20 ) - sprintf( sz, "%.4f", -pr.arErrorCube[ EXPAVG_20 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 2, sz ); - - if( pr.cGames >= 20 ) - sprintf( sz, "%.4f", -pr.arErrorCombined[ EXPAVG_20 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 3, sz ); - - if( pr.cGames >= 100 ) - sprintf( sz, "%.4f", -pr.arErrorChequerplay[ EXPAVG_100 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 4, sz ); - - if( pr.cGames >= 100 ) - sprintf( sz, "%.4f", -pr.arErrorCube[ EXPAVG_100 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 5, sz ); - - if( pr.cGames >= 100 ) - sprintf( sz, "%.4f", -pr.arErrorCombined[ EXPAVG_100 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 6, sz ); - - if( pr.cGames >= 500 ) - sprintf( sz, "%.4f", -pr.arErrorChequerplay[ EXPAVG_500 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 7, sz ); - - if( pr.cGames >= 500 ) - sprintf( sz, "%.4f", -pr.arErrorCube[ EXPAVG_500 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 8, sz ); - - if( pr.cGames >= 500 ) - sprintf( sz, "%.4f", -pr.arErrorCombined[ EXPAVG_500 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 9, sz ); - - sprintf( sz, "%.4f", -pr.arErrorChequerplay[ EXPAVG_TOTAL ] ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 10, sz ); - - sprintf( sz, "%.4f", -pr.arErrorCube[ EXPAVG_TOTAL ] ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 11, sz ); - - sprintf( sz, "%.4f", -pr.arErrorCombined[ EXPAVG_TOTAL ] ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 12, sz ); - - if( pr.cGames >= 20 ) - sprintf( sz, "%.4f", pr.arLuck[ EXPAVG_20 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 13, sz ); - - if( pr.cGames >= 100 ) - sprintf( sz, "%.4f", pr.arLuck[ EXPAVG_100 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 14, sz ); - - if( pr.cGames >= 500 ) - sprintf( sz, "%.4f", pr.arLuck[ EXPAVG_500 ] ); - else - strcpy( sz, _("n/a") ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 15, sz ); - - sprintf( sz, "%.4f", pr.arLuck[ EXPAVG_TOTAL ] ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 16, sz ); - - sprintf( sz, "%d", pr.cGames ); - gtk_clist_set_text( GTK_CLIST( pwList ), i, 17, sz ); - - gtk_clist_set_text( GTK_CLIST( pwList ), i, 18, - Q_ ( aszRating[ GetRating( (float)pr.arErrorChequerplay[ - EXPAVG_TOTAL ] ) ] ) ); - - gtk_clist_set_text( GTK_CLIST( pwList ), i, 19, - Q_ ( aszRating[ GetRating( (float)pr.arErrorCube[ - EXPAVG_TOTAL ] ) ] ) ); - - gtk_clist_set_text( GTK_CLIST( pwList ), i, 20, - Q_ ( aszRating[ GetRating( (float)pr.arErrorCombined[ - EXPAVG_TOTAL ] ) ] ) ); - - gtk_clist_set_text( GTK_CLIST( pwList ), i, 21, - Q_(aszLuckRating[ getLuckRating( (float)pr.arLuck[EXPAVG_TOTAL ] / 20 ) ]) ); - - if( !CompareNames( pr.szName, szPlayer ) ) - gtk_clist_select_row( GTK_CLIST( pwList ), i, 0 ); - } - - if( ferror( pfIn ) ) - outputerr( szFile ); - else if( !f ) - outputl( _("No player records found.") ); - - fclose( pfIn ); - - if( f ) { - gtk_clist_sort( GTK_CLIST( pwList ) ); - - gtk_window_set_default_size( GTK_WINDOW( pw ), 600, 400 ); - - GTKRunDialog(pw); - } -} - static void UpdateMatchinfo( const char *pch, const char *szParam, char **ppch ) { - char *szCommand; + char *szCommand; const char *pchOld = *ppch ? *ppch : ""; - + if( !strcmp( pch, pchOld ) ) /* no change */ return; @@ -6962,14 +7260,14 @@ static void MatchInfoOK( GtkWidget *pw, int *pf ) GtkTextIter begin, end; unsigned int nYear, nMonth, nDay; char *pch; - + outputpostpone(); UpdateMatchinfo( gtk_entry_get_text( GTK_ENTRY( apwRating[ 0 ] ) ), "rating 0", &mi.pchRating[ 0 ] ); UpdateMatchinfo( gtk_entry_get_text( GTK_ENTRY( apwRating[ 1 ] ) ), "rating 1", &mi.pchRating[ 1 ] ); - + gtk_calendar_get_date( GTK_CALENDAR( pwDate ), &nYear, &nMonth, &nDay ); nMonth++; @@ -6982,7 +7280,7 @@ static void MatchInfoOK( GtkWidget *pw, int *pf ) nDay ); UserCommand( sz ); } - + UpdateMatchinfo( gtk_entry_get_text( GTK_ENTRY( pwEvent ) ), "event", &mi.pchEvent ); UpdateMatchinfo( gtk_entry_get_text( GTK_ENTRY( pwRound ) ), @@ -7016,7 +7314,7 @@ extern void GTKMatchInfo( void ) int fOK = FALSE; GtkWidget *pwDialog, *pwTable, *pwComment; char sz[ 128 ]; - + pwDialog = GTKCreateDialog( _("GNU Backgammon - Match information"), DT_QUESTION, NULL, DIALOG_FLAG_MODAL, G_CALLBACK(MatchInfoOK), &fOK ), @@ -7045,13 +7343,13 @@ extern void GTKMatchInfo( void ) gtk_entry_set_text( GTK_ENTRY( apwRating[ 0 ] ), mi.pchRating[ 0 ] ); gtk_table_attach_defaults( GTK_TABLE( pwTable ), apwRating[ 0 ], 1, 2, 0, 1 ); - + apwRating[ 1 ] = gtk_entry_new(); if( mi.pchRating[ 1 ] ) gtk_entry_set_text( GTK_ENTRY( apwRating[ 1 ] ), mi.pchRating[ 1 ] ); gtk_table_attach_defaults( GTK_TABLE( pwTable ), apwRating[ 1 ], 1, 2, 1, 2 ); - + pwDate = gtk_calendar_new(); if( mi.nYear ) { gtk_calendar_select_month( GTK_CALENDAR( pwDate ), mi.nMonth - 1, @@ -7065,22 +7363,22 @@ extern void GTKMatchInfo( void ) if( mi.pchEvent ) gtk_entry_set_text( GTK_ENTRY( pwEvent ), mi.pchEvent ); gtk_table_attach_defaults( GTK_TABLE( pwTable ), pwEvent, 1, 2, 3, 4 ); - + pwRound = gtk_entry_new(); if( mi.pchRound ) gtk_entry_set_text( GTK_ENTRY( pwRound ), mi.pchRound ); gtk_table_attach_defaults( GTK_TABLE( pwTable ), pwRound, 1, 2, 4, 5 ); - + pwPlace = gtk_entry_new(); if( mi.pchPlace ) gtk_entry_set_text( GTK_ENTRY( pwPlace ), mi.pchPlace ); gtk_table_attach_defaults( GTK_TABLE( pwTable ), pwPlace, 1, 2, 5, 6 ); - + pwAnnotator = gtk_entry_new(); if( mi.pchAnnotator ) gtk_entry_set_text( GTK_ENTRY( pwAnnotator ), mi.pchAnnotator ); gtk_table_attach_defaults( GTK_TABLE( pwTable ), pwAnnotator, 1, 2, 6, 7 ); - + pwComment = gtk_text_view_new() ; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(pwComment)); if( mi.pchComment ) { @@ -7099,15 +7397,16 @@ static void CalibrationOK( GtkWidget *pw, GtkWidget *ppw ) { char sz[ 128 ]; GtkAdjustment *padj = gtk_spin_button_get_adjustment( GTK_SPIN_BUTTON( ppw ) ); - - if( GTK_WIDGET_IS_SENSITIVE( ppw ) ) { - if( padj->value != rEvalsPerSec ) { - sprintf( sz, "set calibration %.0f", padj->value ); + + if( gtk_widget_is_sensitive( ppw ) ) { + if( gtk_adjustment_get_value( padj ) != rEvalsPerSec ) { + sprintf( sz, "set calibration %.0f", gtk_adjustment_get_value( padj ) ); UserCommand( sz ); } } else if( rEvalsPerSec > 0 ) UserCommand( "set calibration" ); - + + UserCommand("save settings"); gtk_widget_destroy( gtk_widget_get_toplevel( pw ) ); } @@ -7123,7 +7422,7 @@ static void CalibrationGo( GtkWidget *pw, GtkWidget *apw[ 2 ] ) UserCommand( "calibrate" ); fInterrupt = FALSE; - + if( rEvalsPerSec > 0 ) { gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( apw[ 0 ] ), TRUE ); gtk_adjustment_set_value( gtk_spin_button_get_adjustment( @@ -7137,7 +7436,7 @@ extern void GTKShowCalibration( void ) GtkAdjustment *padj; GtkWidget *pwDialog, *pwvbox, *pwhbox, *pwenable, *pwspin, *pwbutton, *apw[ 2 ]; - + padj = GTK_ADJUSTMENT( gtk_adjustment_new( rEvalsPerSec > 0 ? rEvalsPerSec : 10000, 2, G_MAXFLOAT, 100, @@ -7156,10 +7455,10 @@ extern void GTKShowCalibration( void ) _("Speed recorded:") ) ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( pwenable ), rEvalsPerSec > 0 ); - + gtk_container_add( GTK_CONTAINER( pwhbox ), pwspin ); gtk_widget_set_sensitive( pwspin, rEvalsPerSec > 0 ); - + gtk_container_add( GTK_CONTAINER( pwhbox ), gtk_label_new( _("static evaluations/second") ) ); @@ -7173,7 +7472,7 @@ extern void GTKShowCalibration( void ) g_signal_connect( G_OBJECT( pwenable ), "toggled", G_CALLBACK( CalibrationEnable ), pwspin ); - + GTKRunDialog(pwDialog); } @@ -7187,7 +7486,7 @@ static gboolean CalibrationCancel( GtkObject *po, gpointer p ) { extern void *GTKCalibrationStart( void ) { GtkWidget *pwDialog, *pwhbox, *pwResult; - + pwDialog = GTKCreateDialog( _("GNU Backgammon - Calibration"), DT_INFO, NULL, DIALOG_FLAG_MODAL | DIALOG_FLAG_NOTIDY, G_CALLBACK( CalibrationCancel ), NULL ); gtk_container_add( GTK_CONTAINER( DialogArea( pwDialog, DA_MAIN ) ), @@ -7199,19 +7498,19 @@ extern void *GTKCalibrationStart( void ) { pwResult = gtk_label_new( _(" (n/a) ") ) ); gtk_container_add( GTK_CONTAINER( pwhbox ), gtk_label_new( _("static evaluations/second") ) ); - + pwOldGrab = pwGrab; pwGrab = pwDialog; - + g_signal_connect( G_OBJECT( pwDialog ), "delete_event", G_CALLBACK( CalibrationCancel ), NULL ); - + gtk_widget_show_all( pwDialog ); ProcessEvents(); - gtk_widget_ref( pwResult ); - + g_object_unref( pwResult ); + return pwResult; } @@ -7221,14 +7520,14 @@ extern void GTKCalibrationUpdate( void *context, float rEvalsPerSec ) { sprintf( sz, "%.0f", rEvalsPerSec ); gtk_label_set_text( GTK_LABEL( context ), sz ); - + ProcessEvents(); } extern void GTKCalibrationEnd( void *context ) { - gtk_widget_unref( GTK_WIDGET( context ) ); - + g_object_unref( GTK_WIDGET( context ) ); + gtk_widget_destroy( gtk_widget_get_toplevel( GTK_WIDGET( context ) ) ); pwGrab = pwOldGrab; @@ -7240,27 +7539,23 @@ static void CallbackResign(GtkWidget *pw, gpointer data) const char *asz[3]= { "normal", "gammon", "backgammon" }; char sz[20]; + ms.anDice[0] = ms.anDice[1] = 0; sprintf(sz, "resign %s", asz[i]); gtk_widget_destroy( gtk_widget_get_toplevel( pw ) ); UserCommand(sz); return; } - + extern void GTKResign(gpointer p, guint n, GtkWidget * pw) { GtkWidget *pwDialog, *pwVbox, *pwHbox, *pwButtons; int i; - char **apXPM[3]; const char *asz[3] = { N_("Resign normal"), N_("Resign gammon"), N_("Resign backgammon") }; - -#include "xpm/resigns.xpm" - apXPM[0] = resign_n_xpm; - apXPM[1] = resign_g_xpm; - apXPM[2] = resign_bg_xpm; + const char *resign_stocks[3] = {GNUBG_STOCK_RESIGNSN, GNUBG_STOCK_RESIGNSG, GNUBG_STOCK_RESIGNSB}; if (ap[ !ms.fTurn ].pt != PLAYER_HUMAN && check_resigns(NULL) != -1 && GTKShowWarning(WARN_RESIGN, NULL)) @@ -7279,7 +7574,7 @@ extern void GTKResign(gpointer p, guint n, GtkWidget * pw) pwButtons = gtk_button_new(); pwHbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(pwButtons), pwHbox); - gtk_box_pack_start(GTK_BOX(pwHbox), image_from_xpm_d(apXPM[i], pwButtons), FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(pwHbox), gtk_image_new_from_stock(resign_stocks[i], GTK_ICON_SIZE_LARGE_TOOLBAR), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(pwHbox), gtk_label_new(_(asz[i])), TRUE, TRUE, 10); gtk_container_add(GTK_CONTAINER(pwVbox), pwButtons); g_signal_connect(G_OBJECT(pwButtons), "clicked", G_CALLBACK(CallbackResign), GINT_TO_POINTER(i)); |